1003 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --default-march x86_64-unknown-linux-gnu --version 52; RUN: llc -mtriple=i686-- < %s | FileCheck %s -check-prefixes=X873; RUN: llc -mattr=+sse2 -mtriple=i686-- < %s | FileCheck %s -check-prefixes=X86-SSE4; RUN: llc -mattr=+avx -mtriple=i686-- < %s | FileCheck %s -check-prefixes=X86-AVX5; RUN: llc -mattr=+sse2 -mtriple=x86_64 < %s | FileCheck %s -check-prefixes=SSE6; RUN: llc -mattr=+avx -mtriple=x86_64 < %s | FileCheck %s -check-prefixes=AVX,AVX17; RUN: llc -mattr=+avx2 -mtriple=x86_64 < %s | FileCheck %s -check-prefixes=AVX,AVX28; RUN: llc -mattr=+avx512f -mtriple=x86_64 < %s | FileCheck %s -check-prefixes=AVX,AVX512F9 10define float @canon_fp32_varargsf32(float %a) {11; X87-LABEL: canon_fp32_varargsf32:12; X87: # %bb.0:13; X87-NEXT: fld114; X87-NEXT: fmuls {{[0-9]+}}(%esp)15; X87-NEXT: retl16;17; X86-SSE-LABEL: canon_fp32_varargsf32:18; X86-SSE: # %bb.0:19; X86-SSE-NEXT: pushl %eax20; X86-SSE-NEXT: .cfi_def_cfa_offset 821; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero22; X86-SSE-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm023; X86-SSE-NEXT: movss %xmm0, (%esp)24; X86-SSE-NEXT: flds (%esp)25; X86-SSE-NEXT: popl %eax26; X86-SSE-NEXT: .cfi_def_cfa_offset 427; X86-SSE-NEXT: retl28;29; X86-AVX-LABEL: canon_fp32_varargsf32:30; X86-AVX: # %bb.0:31; X86-AVX-NEXT: pushl %eax32; X86-AVX-NEXT: .cfi_def_cfa_offset 833; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero34; X86-AVX-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm035; X86-AVX-NEXT: vmovss %xmm0, (%esp)36; X86-AVX-NEXT: flds (%esp)37; X86-AVX-NEXT: popl %eax38; X86-AVX-NEXT: .cfi_def_cfa_offset 439; X86-AVX-NEXT: retl40;41; SSE-LABEL: canon_fp32_varargsf32:42; SSE: # %bb.0:43; SSE-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm044; SSE-NEXT: retq45;46; AVX-LABEL: canon_fp32_varargsf32:47; AVX: # %bb.0:48; AVX-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm049; AVX-NEXT: retq50 %canonicalized = call float @llvm.canonicalize.f32(float %a)51 ret float %canonicalized52}53 54define x86_fp80 @canon_fp32_varargsf80(x86_fp80 %a) {55; X87-LABEL: canon_fp32_varargsf80:56; X87: # %bb.0:57; X87-NEXT: fldt {{[0-9]+}}(%esp)58; X87-NEXT: fld159; X87-NEXT: fmulp %st, %st(1)60; X87-NEXT: retl61;62; X86-SSE-LABEL: canon_fp32_varargsf80:63; X86-SSE: # %bb.0:64; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp)65; X86-SSE-NEXT: fld166; X86-SSE-NEXT: fmulp %st, %st(1)67; X86-SSE-NEXT: retl68;69; X86-AVX-LABEL: canon_fp32_varargsf80:70; X86-AVX: # %bb.0:71; X86-AVX-NEXT: fldt {{[0-9]+}}(%esp)72; X86-AVX-NEXT: fld173; X86-AVX-NEXT: fmulp %st, %st(1)74; X86-AVX-NEXT: retl75;76; SSE-LABEL: canon_fp32_varargsf80:77; SSE: # %bb.0:78; SSE-NEXT: fldt {{[0-9]+}}(%rsp)79; SSE-NEXT: fld180; SSE-NEXT: fmulp %st, %st(1)81; SSE-NEXT: retq82;83; AVX-LABEL: canon_fp32_varargsf80:84; AVX: # %bb.0:85; AVX-NEXT: fldt {{[0-9]+}}(%rsp)86; AVX-NEXT: fld187; AVX-NEXT: fmulp %st, %st(1)88; AVX-NEXT: retq89 %canonicalized = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 %a)90 ret x86_fp80 %canonicalized91}92 93define x86_fp80 @complex_canonicalize_fmul_x86_fp80(x86_fp80 %a, x86_fp80 %b) {94; X87-LABEL: complex_canonicalize_fmul_x86_fp80:95; X87: # %bb.0: # %entry96; X87-NEXT: fldt {{[0-9]+}}(%esp)97; X87-NEXT: fldt {{[0-9]+}}(%esp)98; X87-NEXT: fsub %st(1), %st99; X87-NEXT: fld %st(0)100; X87-NEXT: fadd %st(2), %st101; X87-NEXT: fsubp %st, %st(1)102; X87-NEXT: fld1103; X87-NEXT: fmulp %st, %st(1)104; X87-NEXT: fsubp %st, %st(1)105; X87-NEXT: retl106;107; X86-SSE-LABEL: complex_canonicalize_fmul_x86_fp80:108; X86-SSE: # %bb.0: # %entry109; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp)110; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp)111; X86-SSE-NEXT: fsub %st(1), %st112; X86-SSE-NEXT: fld %st(0)113; X86-SSE-NEXT: fadd %st(2), %st114; X86-SSE-NEXT: fsubp %st, %st(1)115; X86-SSE-NEXT: fld1116; X86-SSE-NEXT: fmulp %st, %st(1)117; X86-SSE-NEXT: fsubp %st, %st(1)118; X86-SSE-NEXT: retl119;120; X86-AVX-LABEL: complex_canonicalize_fmul_x86_fp80:121; X86-AVX: # %bb.0: # %entry122; X86-AVX-NEXT: fldt {{[0-9]+}}(%esp)123; X86-AVX-NEXT: fldt {{[0-9]+}}(%esp)124; X86-AVX-NEXT: fsub %st(1), %st125; X86-AVX-NEXT: fld %st(0)126; X86-AVX-NEXT: fadd %st(2), %st127; X86-AVX-NEXT: fsubp %st, %st(1)128; X86-AVX-NEXT: fld1129; X86-AVX-NEXT: fmulp %st, %st(1)130; X86-AVX-NEXT: fsubp %st, %st(1)131; X86-AVX-NEXT: retl132;133; SSE-LABEL: complex_canonicalize_fmul_x86_fp80:134; SSE: # %bb.0: # %entry135; SSE-NEXT: fldt {{[0-9]+}}(%rsp)136; SSE-NEXT: fldt {{[0-9]+}}(%rsp)137; SSE-NEXT: fsub %st(1), %st138; SSE-NEXT: fld %st(0)139; SSE-NEXT: fadd %st(2), %st140; SSE-NEXT: fsubp %st, %st(1)141; SSE-NEXT: fld1142; SSE-NEXT: fmulp %st, %st(1)143; SSE-NEXT: fsubp %st, %st(1)144; SSE-NEXT: retq145;146; AVX-LABEL: complex_canonicalize_fmul_x86_fp80:147; AVX: # %bb.0: # %entry148; AVX-NEXT: fldt {{[0-9]+}}(%rsp)149; AVX-NEXT: fldt {{[0-9]+}}(%rsp)150; AVX-NEXT: fsub %st(1), %st151; AVX-NEXT: fld %st(0)152; AVX-NEXT: fadd %st(2), %st153; AVX-NEXT: fsubp %st, %st(1)154; AVX-NEXT: fld1155; AVX-NEXT: fmulp %st, %st(1)156; AVX-NEXT: fsubp %st, %st(1)157; AVX-NEXT: retq158entry:159 %mul1 = fsub x86_fp80 %a, %b160 %add = fadd x86_fp80 %mul1, %b161 %mul2 = fsub x86_fp80 %add, %mul1162 %canonicalized = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 %mul2)163 %result = fsub x86_fp80 %canonicalized, %b164 ret x86_fp80 %result165}166 167define double @canonicalize_fp64(double %a, double %b) unnamed_addr #0 {168; X87-LABEL: canonicalize_fp64:169; X87: # %bb.0: # %start170; X87-NEXT: fldl {{[0-9]+}}(%esp)171; X87-NEXT: fldl {{[0-9]+}}(%esp)172; X87-NEXT: fucom %st(1)173; X87-NEXT: fnstsw %ax174; X87-NEXT: # kill: def $ah killed $ah killed $ax175; X87-NEXT: sahf176; X87-NEXT: fxch %st(1)177; X87-NEXT: fucom %st(0)178; X87-NEXT: fnstsw %ax179; X87-NEXT: fld %st(1)180; X87-NEXT: ja .LBB3_2181; X87-NEXT: # %bb.1: # %start182; X87-NEXT: fstp %st(0)183; X87-NEXT: fldz184; X87-NEXT: fxch %st(1)185; X87-NEXT: .LBB3_2: # %start186; X87-NEXT: fstp %st(1)187; X87-NEXT: # kill: def $ah killed $ah killed $ax188; X87-NEXT: sahf189; X87-NEXT: jp .LBB3_4190; X87-NEXT: # %bb.3: # %start191; X87-NEXT: fstp %st(1)192; X87-NEXT: fldz193; X87-NEXT: .LBB3_4: # %start194; X87-NEXT: fstp %st(0)195; X87-NEXT: fld1196; X87-NEXT: fmulp %st, %st(1)197; X87-NEXT: retl198;199; X86-SSE-LABEL: canonicalize_fp64:200; X86-SSE: # %bb.0: # %start201; X86-SSE-NEXT: pushl %ebp202; X86-SSE-NEXT: .cfi_def_cfa_offset 8203; X86-SSE-NEXT: .cfi_offset %ebp, -8204; X86-SSE-NEXT: movl %esp, %ebp205; X86-SSE-NEXT: .cfi_def_cfa_register %ebp206; X86-SSE-NEXT: andl $-8, %esp207; X86-SSE-NEXT: subl $8, %esp208; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero209; X86-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero210; X86-SSE-NEXT: movapd %xmm0, %xmm2211; X86-SSE-NEXT: cmpunordsd %xmm0, %xmm2212; X86-SSE-NEXT: movapd %xmm2, %xmm3213; X86-SSE-NEXT: andpd %xmm1, %xmm3214; X86-SSE-NEXT: maxsd %xmm0, %xmm1215; X86-SSE-NEXT: andnpd %xmm1, %xmm2216; X86-SSE-NEXT: orpd %xmm3, %xmm2217; X86-SSE-NEXT: mulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2218; X86-SSE-NEXT: movsd %xmm2, (%esp)219; X86-SSE-NEXT: fldl (%esp)220; X86-SSE-NEXT: movl %ebp, %esp221; X86-SSE-NEXT: popl %ebp222; X86-SSE-NEXT: .cfi_def_cfa %esp, 4223; X86-SSE-NEXT: retl224;225; X86-AVX-LABEL: canonicalize_fp64:226; X86-AVX: # %bb.0: # %start227; X86-AVX-NEXT: pushl %ebp228; X86-AVX-NEXT: .cfi_def_cfa_offset 8229; X86-AVX-NEXT: .cfi_offset %ebp, -8230; X86-AVX-NEXT: movl %esp, %ebp231; X86-AVX-NEXT: .cfi_def_cfa_register %ebp232; X86-AVX-NEXT: andl $-8, %esp233; X86-AVX-NEXT: subl $8, %esp234; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero235; X86-AVX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero236; X86-AVX-NEXT: vmaxsd %xmm0, %xmm1, %xmm2237; X86-AVX-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0238; X86-AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0239; X86-AVX-NEXT: vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0240; X86-AVX-NEXT: vmovsd %xmm0, (%esp)241; X86-AVX-NEXT: fldl (%esp)242; X86-AVX-NEXT: movl %ebp, %esp243; X86-AVX-NEXT: popl %ebp244; X86-AVX-NEXT: .cfi_def_cfa %esp, 4245; X86-AVX-NEXT: retl246;247; SSE-LABEL: canonicalize_fp64:248; SSE: # %bb.0: # %start249; SSE-NEXT: movapd %xmm0, %xmm2250; SSE-NEXT: cmpunordsd %xmm0, %xmm2251; SSE-NEXT: movapd %xmm2, %xmm3252; SSE-NEXT: andpd %xmm1, %xmm3253; SSE-NEXT: maxsd %xmm0, %xmm1254; SSE-NEXT: andnpd %xmm1, %xmm2255; SSE-NEXT: orpd %xmm3, %xmm2256; SSE-NEXT: mulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2257; SSE-NEXT: movapd %xmm2, %xmm0258; SSE-NEXT: retq259;260; AVX1-LABEL: canonicalize_fp64:261; AVX1: # %bb.0: # %start262; AVX1-NEXT: vmaxsd %xmm0, %xmm1, %xmm2263; AVX1-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0264; AVX1-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0265; AVX1-NEXT: vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0266; AVX1-NEXT: retq267;268; AVX2-LABEL: canonicalize_fp64:269; AVX2: # %bb.0: # %start270; AVX2-NEXT: vmaxsd %xmm0, %xmm1, %xmm2271; AVX2-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0272; AVX2-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0273; AVX2-NEXT: vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0274; AVX2-NEXT: retq275;276; AVX512F-LABEL: canonicalize_fp64:277; AVX512F: # %bb.0: # %start278; AVX512F-NEXT: vmaxsd %xmm0, %xmm1, %xmm2279; AVX512F-NEXT: vcmpunordsd %xmm0, %xmm0, %k1280; AVX512F-NEXT: vmovsd %xmm1, %xmm2, %xmm2 {%k1}281; AVX512F-NEXT: vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0282; AVX512F-NEXT: retq283start:284 %c = fcmp olt double %a, %b285 %d = fcmp uno double %a, 0.000000e+00286 %or.cond.i.i = or i1 %d, %c287 %e = select i1 %or.cond.i.i, double %b, double %a288 %f = tail call double @llvm.canonicalize.f64(double %e) #2289 ret double %f290}291 292define float @canonicalize_fp32(float %aa, float %bb) unnamed_addr #0 {293; X87-LABEL: canonicalize_fp32:294; X87: # %bb.0: # %start295; X87-NEXT: flds {{[0-9]+}}(%esp)296; X87-NEXT: flds {{[0-9]+}}(%esp)297; X87-NEXT: fucom %st(1)298; X87-NEXT: fnstsw %ax299; X87-NEXT: # kill: def $ah killed $ah killed $ax300; X87-NEXT: sahf301; X87-NEXT: fxch %st(1)302; X87-NEXT: fucom %st(0)303; X87-NEXT: fnstsw %ax304; X87-NEXT: fld %st(1)305; X87-NEXT: ja .LBB4_2306; X87-NEXT: # %bb.1: # %start307; X87-NEXT: fstp %st(0)308; X87-NEXT: fldz309; X87-NEXT: fxch %st(1)310; X87-NEXT: .LBB4_2: # %start311; X87-NEXT: fstp %st(1)312; X87-NEXT: # kill: def $ah killed $ah killed $ax313; X87-NEXT: sahf314; X87-NEXT: jp .LBB4_4315; X87-NEXT: # %bb.3: # %start316; X87-NEXT: fstp %st(1)317; X87-NEXT: fldz318; X87-NEXT: .LBB4_4: # %start319; X87-NEXT: fstp %st(0)320; X87-NEXT: fld1321; X87-NEXT: fmulp %st, %st(1)322; X87-NEXT: retl323;324; X86-SSE-LABEL: canonicalize_fp32:325; X86-SSE: # %bb.0: # %start326; X86-SSE-NEXT: pushl %eax327; X86-SSE-NEXT: .cfi_def_cfa_offset 8328; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero329; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero330; X86-SSE-NEXT: movaps %xmm0, %xmm2331; X86-SSE-NEXT: cmpunordss %xmm0, %xmm2332; X86-SSE-NEXT: movaps %xmm2, %xmm3333; X86-SSE-NEXT: andps %xmm1, %xmm3334; X86-SSE-NEXT: maxss %xmm0, %xmm1335; X86-SSE-NEXT: andnps %xmm1, %xmm2336; X86-SSE-NEXT: orps %xmm3, %xmm2337; X86-SSE-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2338; X86-SSE-NEXT: movss %xmm2, (%esp)339; X86-SSE-NEXT: flds (%esp)340; X86-SSE-NEXT: popl %eax341; X86-SSE-NEXT: .cfi_def_cfa_offset 4342; X86-SSE-NEXT: retl343;344; X86-AVX-LABEL: canonicalize_fp32:345; X86-AVX: # %bb.0: # %start346; X86-AVX-NEXT: pushl %eax347; X86-AVX-NEXT: .cfi_def_cfa_offset 8348; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero349; X86-AVX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero350; X86-AVX-NEXT: vmaxss %xmm0, %xmm1, %xmm2351; X86-AVX-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0352; X86-AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0353; X86-AVX-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0354; X86-AVX-NEXT: vmovss %xmm0, (%esp)355; X86-AVX-NEXT: flds (%esp)356; X86-AVX-NEXT: popl %eax357; X86-AVX-NEXT: .cfi_def_cfa_offset 4358; X86-AVX-NEXT: retl359;360; SSE-LABEL: canonicalize_fp32:361; SSE: # %bb.0: # %start362; SSE-NEXT: movaps %xmm0, %xmm2363; SSE-NEXT: cmpunordss %xmm0, %xmm2364; SSE-NEXT: movaps %xmm2, %xmm3365; SSE-NEXT: andps %xmm1, %xmm3366; SSE-NEXT: maxss %xmm0, %xmm1367; SSE-NEXT: andnps %xmm1, %xmm2368; SSE-NEXT: orps %xmm3, %xmm2369; SSE-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2370; SSE-NEXT: movaps %xmm2, %xmm0371; SSE-NEXT: retq372;373; AVX1-LABEL: canonicalize_fp32:374; AVX1: # %bb.0: # %start375; AVX1-NEXT: vmaxss %xmm0, %xmm1, %xmm2376; AVX1-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0377; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0378; AVX1-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0379; AVX1-NEXT: retq380;381; AVX2-LABEL: canonicalize_fp32:382; AVX2: # %bb.0: # %start383; AVX2-NEXT: vmaxss %xmm0, %xmm1, %xmm2384; AVX2-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0385; AVX2-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0386; AVX2-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0387; AVX2-NEXT: retq388;389; AVX512F-LABEL: canonicalize_fp32:390; AVX512F: # %bb.0: # %start391; AVX512F-NEXT: vmaxss %xmm0, %xmm1, %xmm2392; AVX512F-NEXT: vcmpunordss %xmm0, %xmm0, %k1393; AVX512F-NEXT: vmovss %xmm1, %xmm2, %xmm2 {%k1}394; AVX512F-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0395; AVX512F-NEXT: retq396start:397 %cc = fcmp olt float %aa, %bb398 %dd = fcmp uno float %aa, 0.000000e+00399 %or.cond.i.i.x = or i1 %dd, %cc400 %ee = select i1 %or.cond.i.i.x, float %bb, float %aa401 %ff = tail call float @llvm.canonicalize.f32(float %ee) #2402 ret float %ff403}404 405define void @v_test_canonicalize_var_f32(float addrspace(1)* %out) #1 {406; X87-LABEL: v_test_canonicalize_var_f32:407; X87: # %bb.0:408; X87-NEXT: movl {{[0-9]+}}(%esp), %eax409; X87-NEXT: fld1410; X87-NEXT: fmuls (%eax)411; X87-NEXT: fstps (%eax)412; X87-NEXT: retl413;414; X86-SSE-LABEL: v_test_canonicalize_var_f32:415; X86-SSE: # %bb.0:416; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax417; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero418; X86-SSE-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0419; X86-SSE-NEXT: movss %xmm0, (%eax)420; X86-SSE-NEXT: retl421;422; X86-AVX-LABEL: v_test_canonicalize_var_f32:423; X86-AVX: # %bb.0:424; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax425; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero426; X86-AVX-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0427; X86-AVX-NEXT: vmovss %xmm0, (%eax)428; X86-AVX-NEXT: retl429;430; SSE-LABEL: v_test_canonicalize_var_f32:431; SSE: # %bb.0:432; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero433; SSE-NEXT: mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0434; SSE-NEXT: movss %xmm0, (%rdi)435; SSE-NEXT: retq436;437; AVX-LABEL: v_test_canonicalize_var_f32:438; AVX: # %bb.0:439; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero440; AVX-NEXT: vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0441; AVX-NEXT: vmovss %xmm0, (%rdi)442; AVX-NEXT: retq443 %val = load float, float addrspace(1)* %out444 %canonicalized = call float @llvm.canonicalize.f32(float %val)445 store float %canonicalized, float addrspace(1)* %out446 ret void447}448 449define void @v_test_canonicalize_x86_fp80(x86_fp80 addrspace(1)* %out) #1 {450; X87-LABEL: v_test_canonicalize_x86_fp80:451; X87: # %bb.0:452; X87-NEXT: movl {{[0-9]+}}(%esp), %eax453; X87-NEXT: fldt (%eax)454; X87-NEXT: fld1455; X87-NEXT: fmulp %st, %st(1)456; X87-NEXT: fstpt (%eax)457; X87-NEXT: retl458;459; X86-SSE-LABEL: v_test_canonicalize_x86_fp80:460; X86-SSE: # %bb.0:461; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax462; X86-SSE-NEXT: fldt (%eax)463; X86-SSE-NEXT: fld1464; X86-SSE-NEXT: fmulp %st, %st(1)465; X86-SSE-NEXT: fstpt (%eax)466; X86-SSE-NEXT: retl467;468; X86-AVX-LABEL: v_test_canonicalize_x86_fp80:469; X86-AVX: # %bb.0:470; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax471; X86-AVX-NEXT: fldt (%eax)472; X86-AVX-NEXT: fld1473; X86-AVX-NEXT: fmulp %st, %st(1)474; X86-AVX-NEXT: fstpt (%eax)475; X86-AVX-NEXT: retl476;477; SSE-LABEL: v_test_canonicalize_x86_fp80:478; SSE: # %bb.0:479; SSE-NEXT: fldt (%rdi)480; SSE-NEXT: fld1481; SSE-NEXT: fmulp %st, %st(1)482; SSE-NEXT: fstpt (%rdi)483; SSE-NEXT: retq484;485; AVX-LABEL: v_test_canonicalize_x86_fp80:486; AVX: # %bb.0:487; AVX-NEXT: fldt (%rdi)488; AVX-NEXT: fld1489; AVX-NEXT: fmulp %st, %st(1)490; AVX-NEXT: fstpt (%rdi)491; AVX-NEXT: retq492 %val = load x86_fp80, x86_fp80 addrspace(1)* %out493 %canonicalized = call x86_fp80 @llvm.canonicalize.f80(x86_fp80 %val)494 store x86_fp80 %canonicalized, x86_fp80 addrspace(1)* %out495 ret void496}497 498define void @v_test_canonicalize_var_f64(double addrspace(1)* %out) #1 {499; X87-LABEL: v_test_canonicalize_var_f64:500; X87: # %bb.0:501; X87-NEXT: movl {{[0-9]+}}(%esp), %eax502; X87-NEXT: fld1503; X87-NEXT: fmull (%eax)504; X87-NEXT: fstpl (%eax)505; X87-NEXT: retl506;507; X86-SSE-LABEL: v_test_canonicalize_var_f64:508; X86-SSE: # %bb.0:509; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax510; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero511; X86-SSE-NEXT: mulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0512; X86-SSE-NEXT: movsd %xmm0, (%eax)513; X86-SSE-NEXT: retl514;515; X86-AVX-LABEL: v_test_canonicalize_var_f64:516; X86-AVX: # %bb.0:517; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax518; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero519; X86-AVX-NEXT: vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0520; X86-AVX-NEXT: vmovsd %xmm0, (%eax)521; X86-AVX-NEXT: retl522;523; SSE-LABEL: v_test_canonicalize_var_f64:524; SSE: # %bb.0:525; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero526; SSE-NEXT: mulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0527; SSE-NEXT: movsd %xmm0, (%rdi)528; SSE-NEXT: retq529;530; AVX-LABEL: v_test_canonicalize_var_f64:531; AVX: # %bb.0:532; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero533; AVX-NEXT: vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0534; AVX-NEXT: vmovsd %xmm0, (%rdi)535; AVX-NEXT: retq536 %val = load double, double addrspace(1)* %out537 %canonicalized = call double @llvm.canonicalize.f64(double %val)538 store double %canonicalized, double addrspace(1)* %out539 ret void540}541 542define void @canonicalize_undef(double addrspace(1)* %out) {543; X87-LABEL: canonicalize_undef:544; X87: # %bb.0:545; X87-NEXT: movl {{[0-9]+}}(%esp), %eax546; X87-NEXT: movl $2146959360, 4(%eax) # imm = 0x7FF80000547; X87-NEXT: movl $0, (%eax)548; X87-NEXT: retl549;550; X86-SSE-LABEL: canonicalize_undef:551; X86-SSE: # %bb.0:552; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax553; X86-SSE-NEXT: movl $2146959360, 4(%eax) # imm = 0x7FF80000554; X86-SSE-NEXT: movl $0, (%eax)555; X86-SSE-NEXT: retl556;557; X86-AVX-LABEL: canonicalize_undef:558; X86-AVX: # %bb.0:559; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax560; X86-AVX-NEXT: movl $2146959360, 4(%eax) # imm = 0x7FF80000561; X86-AVX-NEXT: movl $0, (%eax)562; X86-AVX-NEXT: retl563;564; SSE-LABEL: canonicalize_undef:565; SSE: # %bb.0:566; SSE-NEXT: movabsq $9221120237041090560, %rax # imm = 0x7FF8000000000000567; SSE-NEXT: movq %rax, (%rdi)568; SSE-NEXT: retq569;570; AVX-LABEL: canonicalize_undef:571; AVX: # %bb.0:572; AVX-NEXT: movabsq $9221120237041090560, %rax # imm = 0x7FF8000000000000573; AVX-NEXT: movq %rax, (%rdi)574; AVX-NEXT: retq575 %canonicalized = call double @llvm.canonicalize.f64(double undef)576 store double %canonicalized, double addrspace(1)* %out577 ret void578}579 580define <4 x float> @canon_fp32_varargsv4f32(<4 x float> %a) {581; X87-LABEL: canon_fp32_varargsv4f32:582; X87: # %bb.0:583; X87-NEXT: movl {{[0-9]+}}(%esp), %eax584; X87-NEXT: fld1585; X87-NEXT: fld %st(0)586; X87-NEXT: fmuls {{[0-9]+}}(%esp)587; X87-NEXT: fld %st(1)588; X87-NEXT: fmuls {{[0-9]+}}(%esp)589; X87-NEXT: fld %st(2)590; X87-NEXT: fmuls {{[0-9]+}}(%esp)591; X87-NEXT: fxch %st(3)592; X87-NEXT: fmuls {{[0-9]+}}(%esp)593; X87-NEXT: fstps 12(%eax)594; X87-NEXT: fxch %st(2)595; X87-NEXT: fstps 8(%eax)596; X87-NEXT: fxch %st(1)597; X87-NEXT: fstps 4(%eax)598; X87-NEXT: fstps (%eax)599; X87-NEXT: retl $4600;601; X86-SSE-LABEL: canon_fp32_varargsv4f32:602; X86-SSE: # %bb.0:603; X86-SSE-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0604; X86-SSE-NEXT: retl605;606; X86-AVX-LABEL: canon_fp32_varargsv4f32:607; X86-AVX: # %bb.0:608; X86-AVX-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0609; X86-AVX-NEXT: retl610;611; SSE-LABEL: canon_fp32_varargsv4f32:612; SSE: # %bb.0:613; SSE-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0614; SSE-NEXT: retq615;616; AVX1-LABEL: canon_fp32_varargsv4f32:617; AVX1: # %bb.0:618; AVX1-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0619; AVX1-NEXT: retq620;621; AVX2-LABEL: canon_fp32_varargsv4f32:622; AVX2: # %bb.0:623; AVX2-NEXT: vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]624; AVX2-NEXT: vmulps %xmm1, %xmm0, %xmm0625; AVX2-NEXT: retq626;627; AVX512F-LABEL: canon_fp32_varargsv4f32:628; AVX512F: # %bb.0:629; AVX512F-NEXT: vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]630; AVX512F-NEXT: vmulps %xmm1, %xmm0, %xmm0631; AVX512F-NEXT: retq632 %canonicalized = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %a)633 ret <4 x float> %canonicalized634}635 636define <4 x double> @canon_fp64_varargsv4f64(<4 x double> %a) {637; X87-LABEL: canon_fp64_varargsv4f64:638; X87: # %bb.0:639; X87-NEXT: movl {{[0-9]+}}(%esp), %eax640; X87-NEXT: fld1641; X87-NEXT: fld %st(0)642; X87-NEXT: fmull {{[0-9]+}}(%esp)643; X87-NEXT: fld %st(1)644; X87-NEXT: fmull {{[0-9]+}}(%esp)645; X87-NEXT: fld %st(2)646; X87-NEXT: fmull {{[0-9]+}}(%esp)647; X87-NEXT: fxch %st(3)648; X87-NEXT: fmull {{[0-9]+}}(%esp)649; X87-NEXT: fstpl 24(%eax)650; X87-NEXT: fxch %st(2)651; X87-NEXT: fstpl 16(%eax)652; X87-NEXT: fxch %st(1)653; X87-NEXT: fstpl 8(%eax)654; X87-NEXT: fstpl (%eax)655; X87-NEXT: retl $4656;657; X86-SSE-LABEL: canon_fp64_varargsv4f64:658; X86-SSE: # %bb.0:659; X86-SSE-NEXT: movapd {{.*#+}} xmm2 = [1.0E+0,1.0E+0]660; X86-SSE-NEXT: mulpd %xmm2, %xmm0661; X86-SSE-NEXT: mulpd %xmm2, %xmm1662; X86-SSE-NEXT: retl663;664; X86-AVX-LABEL: canon_fp64_varargsv4f64:665; X86-AVX: # %bb.0:666; X86-AVX-NEXT: vmulpd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0667; X86-AVX-NEXT: retl668;669; SSE-LABEL: canon_fp64_varargsv4f64:670; SSE: # %bb.0:671; SSE-NEXT: movapd {{.*#+}} xmm2 = [1.0E+0,1.0E+0]672; SSE-NEXT: mulpd %xmm2, %xmm0673; SSE-NEXT: mulpd %xmm2, %xmm1674; SSE-NEXT: retq675;676; AVX1-LABEL: canon_fp64_varargsv4f64:677; AVX1: # %bb.0:678; AVX1-NEXT: vmulpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0679; AVX1-NEXT: retq680;681; AVX2-LABEL: canon_fp64_varargsv4f64:682; AVX2: # %bb.0:683; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]684; AVX2-NEXT: vmulpd %ymm1, %ymm0, %ymm0685; AVX2-NEXT: retq686;687; AVX512F-LABEL: canon_fp64_varargsv4f64:688; AVX512F: # %bb.0:689; AVX512F-NEXT: vbroadcastsd {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]690; AVX512F-NEXT: vmulpd %ymm1, %ymm0, %ymm0691; AVX512F-NEXT: retq692 %canonicalized = call <4 x double> @llvm.canonicalize.v4f32(<4 x double> %a)693 ret <4 x double> %canonicalized694}695 696define <2 x x86_fp80> @canon_fp80_varargsv2fp80(<2 x x86_fp80> %a) {697; X87-LABEL: canon_fp80_varargsv2fp80:698; X87: # %bb.0:699; X87-NEXT: fldt {{[0-9]+}}(%esp)700; X87-NEXT: fldt {{[0-9]+}}(%esp)701; X87-NEXT: fld1702; X87-NEXT: fmul %st, %st(1)703; X87-NEXT: fmulp %st, %st(2)704; X87-NEXT: fxch %st(1)705; X87-NEXT: retl706;707; X86-SSE-LABEL: canon_fp80_varargsv2fp80:708; X86-SSE: # %bb.0:709; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp)710; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp)711; X86-SSE-NEXT: fld1712; X86-SSE-NEXT: fmul %st, %st(1)713; X86-SSE-NEXT: fmulp %st, %st(2)714; X86-SSE-NEXT: fxch %st(1)715; X86-SSE-NEXT: retl716;717; X86-AVX-LABEL: canon_fp80_varargsv2fp80:718; X86-AVX: # %bb.0:719; X86-AVX-NEXT: fldt {{[0-9]+}}(%esp)720; X86-AVX-NEXT: fldt {{[0-9]+}}(%esp)721; X86-AVX-NEXT: fld1722; X86-AVX-NEXT: fmul %st, %st(1)723; X86-AVX-NEXT: fmulp %st, %st(2)724; X86-AVX-NEXT: fxch %st(1)725; X86-AVX-NEXT: retl726;727; SSE-LABEL: canon_fp80_varargsv2fp80:728; SSE: # %bb.0:729; SSE-NEXT: fldt {{[0-9]+}}(%rsp)730; SSE-NEXT: fldt {{[0-9]+}}(%rsp)731; SSE-NEXT: fld1732; SSE-NEXT: fmul %st, %st(1)733; SSE-NEXT: fmulp %st, %st(2)734; SSE-NEXT: fxch %st(1)735; SSE-NEXT: retq736;737; AVX-LABEL: canon_fp80_varargsv2fp80:738; AVX: # %bb.0:739; AVX-NEXT: fldt {{[0-9]+}}(%rsp)740; AVX-NEXT: fldt {{[0-9]+}}(%rsp)741; AVX-NEXT: fld1742; AVX-NEXT: fmul %st, %st(1)743; AVX-NEXT: fmulp %st, %st(2)744; AVX-NEXT: fxch %st(1)745; AVX-NEXT: retq746 %canonicalized = call <2 x x86_fp80> @llvm.canonicalize.v2f80(<2 x x86_fp80> %a)747 ret <2 x x86_fp80> %canonicalized748}749 750define void @vec_canonicalize_var_v4f32(<4 x float> addrspace(1)* %out) #1 {751; X87-LABEL: vec_canonicalize_var_v4f32:752; X87: # %bb.0:753; X87-NEXT: movl {{[0-9]+}}(%esp), %eax754; X87-NEXT: fld1755; X87-NEXT: fld %st(0)756; X87-NEXT: fmuls (%eax)757; X87-NEXT: fld %st(1)758; X87-NEXT: fmuls 4(%eax)759; X87-NEXT: fld %st(2)760; X87-NEXT: fmuls 8(%eax)761; X87-NEXT: fxch %st(3)762; X87-NEXT: fmuls 12(%eax)763; X87-NEXT: fstps 12(%eax)764; X87-NEXT: fxch %st(2)765; X87-NEXT: fstps 8(%eax)766; X87-NEXT: fxch %st(1)767; X87-NEXT: fstps 4(%eax)768; X87-NEXT: fstps (%eax)769; X87-NEXT: retl770;771; X86-SSE-LABEL: vec_canonicalize_var_v4f32:772; X86-SSE: # %bb.0:773; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax774; X86-SSE-NEXT: movaps (%eax), %xmm0775; X86-SSE-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0776; X86-SSE-NEXT: movaps %xmm0, (%eax)777; X86-SSE-NEXT: retl778;779; X86-AVX-LABEL: vec_canonicalize_var_v4f32:780; X86-AVX: # %bb.0:781; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax782; X86-AVX-NEXT: vmovaps (%eax), %xmm0783; X86-AVX-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0784; X86-AVX-NEXT: vmovaps %xmm0, (%eax)785; X86-AVX-NEXT: retl786;787; SSE-LABEL: vec_canonicalize_var_v4f32:788; SSE: # %bb.0:789; SSE-NEXT: movaps (%rdi), %xmm0790; SSE-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0791; SSE-NEXT: movaps %xmm0, (%rdi)792; SSE-NEXT: retq793;794; AVX1-LABEL: vec_canonicalize_var_v4f32:795; AVX1: # %bb.0:796; AVX1-NEXT: vmovaps (%rdi), %xmm0797; AVX1-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0798; AVX1-NEXT: vmovaps %xmm0, (%rdi)799; AVX1-NEXT: retq800;801; AVX2-LABEL: vec_canonicalize_var_v4f32:802; AVX2: # %bb.0:803; AVX2-NEXT: vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]804; AVX2-NEXT: vmulps (%rdi), %xmm0, %xmm0805; AVX2-NEXT: vmovaps %xmm0, (%rdi)806; AVX2-NEXT: retq807;808; AVX512F-LABEL: vec_canonicalize_var_v4f32:809; AVX512F: # %bb.0:810; AVX512F-NEXT: vbroadcastss {{.*#+}} xmm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]811; AVX512F-NEXT: vmulps (%rdi), %xmm0, %xmm0812; AVX512F-NEXT: vmovaps %xmm0, (%rdi)813; AVX512F-NEXT: retq814 %val = load <4 x float>, <4 x float> addrspace(1)* %out815 %canonicalized = call <4 x float> @llvm.canonicalize.v4f32(<4 x float> %val)816 store <4 x float> %canonicalized, <4 x float> addrspace(1)* %out817 ret void818}819 820define void @vec_canonicalize_var_v4f64(<4 x double> addrspace(1)* %out) #1 {821; X87-LABEL: vec_canonicalize_var_v4f64:822; X87: # %bb.0:823; X87-NEXT: movl {{[0-9]+}}(%esp), %eax824; X87-NEXT: fld1825; X87-NEXT: fld %st(0)826; X87-NEXT: fmull (%eax)827; X87-NEXT: fld %st(1)828; X87-NEXT: fmull 8(%eax)829; X87-NEXT: fld %st(2)830; X87-NEXT: fmull 16(%eax)831; X87-NEXT: fxch %st(3)832; X87-NEXT: fmull 24(%eax)833; X87-NEXT: fstpl 24(%eax)834; X87-NEXT: fxch %st(2)835; X87-NEXT: fstpl 16(%eax)836; X87-NEXT: fxch %st(1)837; X87-NEXT: fstpl 8(%eax)838; X87-NEXT: fstpl (%eax)839; X87-NEXT: retl840;841; X86-SSE-LABEL: vec_canonicalize_var_v4f64:842; X86-SSE: # %bb.0:843; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax844; X86-SSE-NEXT: movapd {{.*#+}} xmm0 = [1.0E+0,1.0E+0]845; X86-SSE-NEXT: movapd 16(%eax), %xmm1846; X86-SSE-NEXT: mulpd %xmm0, %xmm1847; X86-SSE-NEXT: mulpd (%eax), %xmm0848; X86-SSE-NEXT: movapd %xmm0, (%eax)849; X86-SSE-NEXT: movapd %xmm1, 16(%eax)850; X86-SSE-NEXT: retl851;852; X86-AVX-LABEL: vec_canonicalize_var_v4f64:853; X86-AVX: # %bb.0:854; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax855; X86-AVX-NEXT: vmovapd (%eax), %ymm0856; X86-AVX-NEXT: vmulpd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0857; X86-AVX-NEXT: vmovapd %ymm0, (%eax)858; X86-AVX-NEXT: vzeroupper859; X86-AVX-NEXT: retl860;861; SSE-LABEL: vec_canonicalize_var_v4f64:862; SSE: # %bb.0:863; SSE-NEXT: movapd {{.*#+}} xmm0 = [1.0E+0,1.0E+0]864; SSE-NEXT: movapd 16(%rdi), %xmm1865; SSE-NEXT: mulpd %xmm0, %xmm1866; SSE-NEXT: mulpd (%rdi), %xmm0867; SSE-NEXT: movapd %xmm0, (%rdi)868; SSE-NEXT: movapd %xmm1, 16(%rdi)869; SSE-NEXT: retq870;871; AVX1-LABEL: vec_canonicalize_var_v4f64:872; AVX1: # %bb.0:873; AVX1-NEXT: vmovapd (%rdi), %ymm0874; AVX1-NEXT: vmulpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0875; AVX1-NEXT: vmovapd %ymm0, (%rdi)876; AVX1-NEXT: vzeroupper877; AVX1-NEXT: retq878;879; AVX2-LABEL: vec_canonicalize_var_v4f64:880; AVX2: # %bb.0:881; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]882; AVX2-NEXT: vmulpd (%rdi), %ymm0, %ymm0883; AVX2-NEXT: vmovapd %ymm0, (%rdi)884; AVX2-NEXT: vzeroupper885; AVX2-NEXT: retq886;887; AVX512F-LABEL: vec_canonicalize_var_v4f64:888; AVX512F: # %bb.0:889; AVX512F-NEXT: vbroadcastsd {{.*#+}} ymm0 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]890; AVX512F-NEXT: vmulpd (%rdi), %ymm0, %ymm0891; AVX512F-NEXT: vmovapd %ymm0, (%rdi)892; AVX512F-NEXT: vzeroupper893; AVX512F-NEXT: retq894 %val = load <4 x double>, <4 x double> addrspace(1)* %out895 %canonicalized = call <4 x double> @llvm.canonicalize.v4f32(<4 x double> %val)896 store <4 x double> %canonicalized, <4 x double> addrspace(1)* %out897 ret void898}899 900define void @vec_canonicalize_x86_fp80(<4 x x86_fp80> addrspace(1)* %out) #1 {901; X87-LABEL: vec_canonicalize_x86_fp80:902; X87: # %bb.0:903; X87-NEXT: movl {{[0-9]+}}(%esp), %eax904; X87-NEXT: fldt 30(%eax)905; X87-NEXT: fldt 20(%eax)906; X87-NEXT: fldt 10(%eax)907; X87-NEXT: fldt (%eax)908; X87-NEXT: fld1909; X87-NEXT: fmul %st, %st(1)910; X87-NEXT: fmul %st, %st(2)911; X87-NEXT: fmul %st, %st(3)912; X87-NEXT: fmulp %st, %st(4)913; X87-NEXT: fxch %st(3)914; X87-NEXT: fstpt 30(%eax)915; X87-NEXT: fxch %st(1)916; X87-NEXT: fstpt 20(%eax)917; X87-NEXT: fstpt 10(%eax)918; X87-NEXT: fstpt (%eax)919; X87-NEXT: retl920;921; X86-SSE-LABEL: vec_canonicalize_x86_fp80:922; X86-SSE: # %bb.0:923; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax924; X86-SSE-NEXT: fldt 30(%eax)925; X86-SSE-NEXT: fldt 20(%eax)926; X86-SSE-NEXT: fldt 10(%eax)927; X86-SSE-NEXT: fldt (%eax)928; X86-SSE-NEXT: fld1929; X86-SSE-NEXT: fmul %st, %st(1)930; X86-SSE-NEXT: fmul %st, %st(2)931; X86-SSE-NEXT: fmul %st, %st(3)932; X86-SSE-NEXT: fmulp %st, %st(4)933; X86-SSE-NEXT: fxch %st(3)934; X86-SSE-NEXT: fstpt 30(%eax)935; X86-SSE-NEXT: fxch %st(1)936; X86-SSE-NEXT: fstpt 20(%eax)937; X86-SSE-NEXT: fstpt 10(%eax)938; X86-SSE-NEXT: fstpt (%eax)939; X86-SSE-NEXT: retl940;941; X86-AVX-LABEL: vec_canonicalize_x86_fp80:942; X86-AVX: # %bb.0:943; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax944; X86-AVX-NEXT: fldt 30(%eax)945; X86-AVX-NEXT: fldt 20(%eax)946; X86-AVX-NEXT: fldt 10(%eax)947; X86-AVX-NEXT: fldt (%eax)948; X86-AVX-NEXT: fld1949; X86-AVX-NEXT: fmul %st, %st(1)950; X86-AVX-NEXT: fmul %st, %st(2)951; X86-AVX-NEXT: fmul %st, %st(3)952; X86-AVX-NEXT: fmulp %st, %st(4)953; X86-AVX-NEXT: fxch %st(3)954; X86-AVX-NEXT: fstpt 30(%eax)955; X86-AVX-NEXT: fxch %st(1)956; X86-AVX-NEXT: fstpt 20(%eax)957; X86-AVX-NEXT: fstpt 10(%eax)958; X86-AVX-NEXT: fstpt (%eax)959; X86-AVX-NEXT: retl960;961; SSE-LABEL: vec_canonicalize_x86_fp80:962; SSE: # %bb.0:963; SSE-NEXT: fldt 30(%rdi)964; SSE-NEXT: fldt 20(%rdi)965; SSE-NEXT: fldt 10(%rdi)966; SSE-NEXT: fldt (%rdi)967; SSE-NEXT: fld1968; SSE-NEXT: fmul %st, %st(1)969; SSE-NEXT: fmul %st, %st(2)970; SSE-NEXT: fmul %st, %st(3)971; SSE-NEXT: fmulp %st, %st(4)972; SSE-NEXT: fxch %st(3)973; SSE-NEXT: fstpt 30(%rdi)974; SSE-NEXT: fxch %st(1)975; SSE-NEXT: fstpt 20(%rdi)976; SSE-NEXT: fstpt 10(%rdi)977; SSE-NEXT: fstpt (%rdi)978; SSE-NEXT: retq979;980; AVX-LABEL: vec_canonicalize_x86_fp80:981; AVX: # %bb.0:982; AVX-NEXT: fldt 30(%rdi)983; AVX-NEXT: fldt 20(%rdi)984; AVX-NEXT: fldt 10(%rdi)985; AVX-NEXT: fldt (%rdi)986; AVX-NEXT: fld1987; AVX-NEXT: fmul %st, %st(1)988; AVX-NEXT: fmul %st, %st(2)989; AVX-NEXT: fmul %st, %st(3)990; AVX-NEXT: fmulp %st, %st(4)991; AVX-NEXT: fxch %st(3)992; AVX-NEXT: fstpt 30(%rdi)993; AVX-NEXT: fxch %st(1)994; AVX-NEXT: fstpt 20(%rdi)995; AVX-NEXT: fstpt 10(%rdi)996; AVX-NEXT: fstpt (%rdi)997; AVX-NEXT: retq998 %val = load <4 x x86_fp80>, <4 x x86_fp80> addrspace(1)* %out999 %canonicalized = call <4 x x86_fp80> @llvm.canonicalize.f80(<4 x x86_fp80> %val)1000 store <4 x x86_fp80> %canonicalized, <4 x x86_fp80> addrspace(1)* %out1001 ret void1002}1003