196 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s -check-prefix=WIN643; RUN: llc < %s -mtriple=x86_64-mingw32 | FileCheck %s -check-prefix=WIN644 5define i64 @double_to_i128(double %d) nounwind {6; WIN64-LABEL: double_to_i128:7; WIN64: # %bb.0:8; WIN64-NEXT: subq $40, %rsp9; WIN64-NEXT: callq __fixdfti10; WIN64-NEXT: movq %xmm0, %rax11; WIN64-NEXT: addq $40, %rsp12; WIN64-NEXT: retq13 %1 = fptosi double %d to i12814 %2 = trunc i128 %1 to i6415 ret i64 %216}17 18define i64 @double_to_ui128(double %d) nounwind {19; WIN64-LABEL: double_to_ui128:20; WIN64: # %bb.0:21; WIN64-NEXT: subq $40, %rsp22; WIN64-NEXT: callq __fixunsdfti23; WIN64-NEXT: movq %xmm0, %rax24; WIN64-NEXT: addq $40, %rsp25; WIN64-NEXT: retq26 %1 = fptoui double %d to i12827 %2 = trunc i128 %1 to i6428 ret i64 %229}30 31define i64 @float_to_i128(float %d) nounwind {32; WIN64-LABEL: float_to_i128:33; WIN64: # %bb.0:34; WIN64-NEXT: subq $40, %rsp35; WIN64-NEXT: callq __fixsfti36; WIN64-NEXT: movq %xmm0, %rax37; WIN64-NEXT: addq $40, %rsp38; WIN64-NEXT: retq39 %1 = fptosi float %d to i12840 %2 = trunc i128 %1 to i6441 ret i64 %242}43 44define i64 @float_to_ui128(float %d) nounwind {45; WIN64-LABEL: float_to_ui128:46; WIN64: # %bb.0:47; WIN64-NEXT: subq $40, %rsp48; WIN64-NEXT: callq __fixunssfti49; WIN64-NEXT: movq %xmm0, %rax50; WIN64-NEXT: addq $40, %rsp51; WIN64-NEXT: retq52 %1 = fptoui float %d to i12853 %2 = trunc i128 %1 to i6454 ret i64 %255}56 57define i64 @longdouble_to_i128(ptr nocapture readonly %0) nounwind {58; WIN64-LABEL: longdouble_to_i128:59; WIN64: # %bb.0:60; WIN64-NEXT: subq $56, %rsp61; WIN64-NEXT: fldt (%rcx)62; WIN64-NEXT: fstpt {{[0-9]+}}(%rsp)63; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx64; WIN64-NEXT: callq __fixxfti65; WIN64-NEXT: movq %xmm0, %rax66; WIN64-NEXT: addq $56, %rsp67; WIN64-NEXT: retq68 %2 = load x86_fp80, ptr %0, align 1669 %3 = fptosi x86_fp80 %2 to i12870 %4 = trunc i128 %3 to i6471 ret i64 %472}73 74define i64 @longdouble_to_ui128(ptr nocapture readonly %0) nounwind {75; WIN64-LABEL: longdouble_to_ui128:76; WIN64: # %bb.0:77; WIN64-NEXT: subq $56, %rsp78; WIN64-NEXT: fldt (%rcx)79; WIN64-NEXT: fstpt {{[0-9]+}}(%rsp)80; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx81; WIN64-NEXT: callq __fixunsxfti82; WIN64-NEXT: movq %xmm0, %rax83; WIN64-NEXT: addq $56, %rsp84; WIN64-NEXT: retq85 %2 = load x86_fp80, ptr %0, align 1686 %3 = fptoui x86_fp80 %2 to i12887 %4 = trunc i128 %3 to i6488 ret i64 %489}90 91define double @i128_to_double(ptr nocapture readonly %0) nounwind {92; WIN64-LABEL: i128_to_double:93; WIN64: # %bb.0:94; WIN64-NEXT: subq $56, %rsp95; WIN64-NEXT: movaps (%rcx), %xmm096; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)97; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx98; WIN64-NEXT: callq __floattidf99; WIN64-NEXT: addq $56, %rsp100; WIN64-NEXT: retq101 %2 = load i128, ptr %0, align 16102 %3 = sitofp i128 %2 to double103 ret double %3104}105 106define double @ui128_to_double(ptr nocapture readonly %0) nounwind {107; WIN64-LABEL: ui128_to_double:108; WIN64: # %bb.0:109; WIN64-NEXT: subq $56, %rsp110; WIN64-NEXT: movaps (%rcx), %xmm0111; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)112; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx113; WIN64-NEXT: callq __floatuntidf114; WIN64-NEXT: addq $56, %rsp115; WIN64-NEXT: retq116 %2 = load i128, ptr %0, align 16117 %3 = uitofp i128 %2 to double118 ret double %3119}120 121define float @i128_to_float(ptr nocapture readonly %0) nounwind {122; WIN64-LABEL: i128_to_float:123; WIN64: # %bb.0:124; WIN64-NEXT: subq $56, %rsp125; WIN64-NEXT: movaps (%rcx), %xmm0126; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)127; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx128; WIN64-NEXT: callq __floattisf129; WIN64-NEXT: addq $56, %rsp130; WIN64-NEXT: retq131 %2 = load i128, ptr %0, align 16132 %3 = sitofp i128 %2 to float133 ret float %3134}135 136define float @ui128_to_float(ptr nocapture readonly %0) nounwind {137; WIN64-LABEL: ui128_to_float:138; WIN64: # %bb.0:139; WIN64-NEXT: subq $56, %rsp140; WIN64-NEXT: movaps (%rcx), %xmm0141; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)142; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx143; WIN64-NEXT: callq __floatuntisf144; WIN64-NEXT: addq $56, %rsp145; WIN64-NEXT: retq146 %2 = load i128, ptr %0, align 16147 %3 = uitofp i128 %2 to float148 ret float %3149}150 151define void @i128_to_longdouble(ptr noalias nocapture sret(x86_fp80) align 16 %agg.result, ptr nocapture readonly %0) nounwind {152; WIN64-LABEL: i128_to_longdouble:153; WIN64: # %bb.0:154; WIN64-NEXT: pushq %rsi155; WIN64-NEXT: subq $64, %rsp156; WIN64-NEXT: movq %rcx, %rsi157; WIN64-NEXT: movaps (%rdx), %xmm0158; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)159; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx160; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx161; WIN64-NEXT: callq __floattixf162; WIN64-NEXT: fldt {{[0-9]+}}(%rsp)163; WIN64-NEXT: fstpt (%rsi)164; WIN64-NEXT: movq %rsi, %rax165; WIN64-NEXT: addq $64, %rsp166; WIN64-NEXT: popq %rsi167; WIN64-NEXT: retq168 %2 = load i128, ptr %0, align 16169 %3 = sitofp i128 %2 to x86_fp80170 store x86_fp80 %3, ptr %agg.result, align 16171 ret void172}173 174define void @ui128_to_longdouble(ptr noalias nocapture sret(x86_fp80) align 16 %agg.result, ptr nocapture readonly %0) nounwind {175; WIN64-LABEL: ui128_to_longdouble:176; WIN64: # %bb.0:177; WIN64-NEXT: pushq %rsi178; WIN64-NEXT: subq $64, %rsp179; WIN64-NEXT: movq %rcx, %rsi180; WIN64-NEXT: movaps (%rdx), %xmm0181; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)182; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx183; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx184; WIN64-NEXT: callq __floatuntixf185; WIN64-NEXT: fldt {{[0-9]+}}(%rsp)186; WIN64-NEXT: fstpt (%rsi)187; WIN64-NEXT: movq %rsi, %rax188; WIN64-NEXT: addq $64, %rsp189; WIN64-NEXT: popq %rsi190; WIN64-NEXT: retq191 %2 = load i128, ptr %0, align 16192 %3 = uitofp i128 %2 to x86_fp80193 store x86_fp80 %3, ptr %agg.result, align 16194 ret void195}196