1406 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=avx2,fma | FileCheck %s --check-prefixes=CHECK,X643; RUN: llc < %s -mtriple=i686-- -mattr=avx2,fma | FileCheck %s --check-prefixes=CHECK,X864 5define float @fneg_v4f32(<4 x float> %x) nounwind {6; X64-LABEL: fneg_v4f32:7; X64: # %bb.0:8; X64-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]9; X64-NEXT: vxorps %xmm1, %xmm0, %xmm010; X64-NEXT: retq11;12; X86-LABEL: fneg_v4f32:13; X86: # %bb.0:14; X86-NEXT: pushl %eax15; X86-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]16; X86-NEXT: vxorps %xmm1, %xmm0, %xmm017; X86-NEXT: vmovss %xmm0, (%esp)18; X86-NEXT: flds (%esp)19; X86-NEXT: popl %eax20; X86-NEXT: retl21 %v = fneg <4 x float> %x22 %r = extractelement <4 x float> %v, i32 023 ret float %r24}25 26define double @fneg_v4f64(<4 x double> %x) nounwind {27; X64-LABEL: fneg_v4f64:28; X64: # %bb.0:29; X64-NEXT: vmovddup {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0]30; X64-NEXT: # xmm1 = mem[0,0]31; X64-NEXT: vxorps %xmm1, %xmm0, %xmm032; X64-NEXT: vzeroupper33; X64-NEXT: retq34;35; X86-LABEL: fneg_v4f64:36; X86: # %bb.0:37; X86-NEXT: pushl %ebp38; X86-NEXT: movl %esp, %ebp39; X86-NEXT: andl $-8, %esp40; X86-NEXT: subl $8, %esp41; X86-NEXT: vmovddup {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0]42; X86-NEXT: # xmm1 = mem[0,0]43; X86-NEXT: vxorps %xmm1, %xmm0, %xmm044; X86-NEXT: vmovlps %xmm0, (%esp)45; X86-NEXT: fldl (%esp)46; X86-NEXT: movl %ebp, %esp47; X86-NEXT: popl %ebp48; X86-NEXT: vzeroupper49; X86-NEXT: retl50 %v = fneg <4 x double> %x51 %r = extractelement <4 x double> %v, i32 052 ret double %r53}54 55define float @fadd_v4f32(<4 x float> %x, <4 x float> %y) nounwind {56; X64-LABEL: fadd_v4f32:57; X64: # %bb.0:58; X64-NEXT: vaddss %xmm1, %xmm0, %xmm059; X64-NEXT: retq60;61; X86-LABEL: fadd_v4f32:62; X86: # %bb.0:63; X86-NEXT: pushl %eax64; X86-NEXT: vaddss %xmm1, %xmm0, %xmm065; X86-NEXT: vmovss %xmm0, (%esp)66; X86-NEXT: flds (%esp)67; X86-NEXT: popl %eax68; X86-NEXT: retl69 %v = fadd <4 x float> %x, %y70 %r = extractelement <4 x float> %v, i32 071 ret float %r72}73 74define double @fadd_v4f64(<4 x double> %x, <4 x double> %y) nounwind {75; X64-LABEL: fadd_v4f64:76; X64: # %bb.0:77; X64-NEXT: vaddsd %xmm1, %xmm0, %xmm078; X64-NEXT: vzeroupper79; X64-NEXT: retq80;81; X86-LABEL: fadd_v4f64:82; X86: # %bb.0:83; X86-NEXT: pushl %ebp84; X86-NEXT: movl %esp, %ebp85; X86-NEXT: andl $-8, %esp86; X86-NEXT: subl $8, %esp87; X86-NEXT: vaddsd %xmm1, %xmm0, %xmm088; X86-NEXT: vmovsd %xmm0, (%esp)89; X86-NEXT: fldl (%esp)90; X86-NEXT: movl %ebp, %esp91; X86-NEXT: popl %ebp92; X86-NEXT: vzeroupper93; X86-NEXT: retl94 %v = fadd <4 x double> %x, %y95 %r = extractelement <4 x double> %v, i32 096 ret double %r97}98 99define float @fsub_v4f32(<4 x float> %x, <4 x float> %y) nounwind {100; X64-LABEL: fsub_v4f32:101; X64: # %bb.0:102; X64-NEXT: vsubss %xmm1, %xmm0, %xmm0103; X64-NEXT: retq104;105; X86-LABEL: fsub_v4f32:106; X86: # %bb.0:107; X86-NEXT: pushl %eax108; X86-NEXT: vsubss %xmm1, %xmm0, %xmm0109; X86-NEXT: vmovss %xmm0, (%esp)110; X86-NEXT: flds (%esp)111; X86-NEXT: popl %eax112; X86-NEXT: retl113 %v = fsub <4 x float> %x, %y114 %r = extractelement <4 x float> %v, i32 0115 ret float %r116}117 118define double @fsub_v4f64(<4 x double> %x, <4 x double> %y) nounwind {119; X64-LABEL: fsub_v4f64:120; X64: # %bb.0:121; X64-NEXT: vsubsd %xmm1, %xmm0, %xmm0122; X64-NEXT: vzeroupper123; X64-NEXT: retq124;125; X86-LABEL: fsub_v4f64:126; X86: # %bb.0:127; X86-NEXT: pushl %ebp128; X86-NEXT: movl %esp, %ebp129; X86-NEXT: andl $-8, %esp130; X86-NEXT: subl $8, %esp131; X86-NEXT: vsubsd %xmm1, %xmm0, %xmm0132; X86-NEXT: vmovsd %xmm0, (%esp)133; X86-NEXT: fldl (%esp)134; X86-NEXT: movl %ebp, %esp135; X86-NEXT: popl %ebp136; X86-NEXT: vzeroupper137; X86-NEXT: retl138 %v = fsub <4 x double> %x, %y139 %r = extractelement <4 x double> %v, i32 0140 ret double %r141}142 143define float @fmul_v4f32(<4 x float> %x, <4 x float> %y) nounwind {144; X64-LABEL: fmul_v4f32:145; X64: # %bb.0:146; X64-NEXT: vmulss %xmm1, %xmm0, %xmm0147; X64-NEXT: retq148;149; X86-LABEL: fmul_v4f32:150; X86: # %bb.0:151; X86-NEXT: pushl %eax152; X86-NEXT: vmulss %xmm1, %xmm0, %xmm0153; X86-NEXT: vmovss %xmm0, (%esp)154; X86-NEXT: flds (%esp)155; X86-NEXT: popl %eax156; X86-NEXT: retl157 %v = fmul <4 x float> %x, %y158 %r = extractelement <4 x float> %v, i32 0159 ret float %r160}161 162define double @fmul_v4f64(<4 x double> %x, <4 x double> %y) nounwind {163; X64-LABEL: fmul_v4f64:164; X64: # %bb.0:165; X64-NEXT: vmulsd %xmm1, %xmm0, %xmm0166; X64-NEXT: vzeroupper167; X64-NEXT: retq168;169; X86-LABEL: fmul_v4f64:170; X86: # %bb.0:171; X86-NEXT: pushl %ebp172; X86-NEXT: movl %esp, %ebp173; X86-NEXT: andl $-8, %esp174; X86-NEXT: subl $8, %esp175; X86-NEXT: vmulsd %xmm1, %xmm0, %xmm0176; X86-NEXT: vmovsd %xmm0, (%esp)177; X86-NEXT: fldl (%esp)178; X86-NEXT: movl %ebp, %esp179; X86-NEXT: popl %ebp180; X86-NEXT: vzeroupper181; X86-NEXT: retl182 %v = fmul <4 x double> %x, %y183 %r = extractelement <4 x double> %v, i32 0184 ret double %r185}186 187define float @fdiv_v4f32(<4 x float> %x, <4 x float> %y) nounwind {188; X64-LABEL: fdiv_v4f32:189; X64: # %bb.0:190; X64-NEXT: vdivss %xmm1, %xmm0, %xmm0191; X64-NEXT: retq192;193; X86-LABEL: fdiv_v4f32:194; X86: # %bb.0:195; X86-NEXT: pushl %eax196; X86-NEXT: vdivss %xmm1, %xmm0, %xmm0197; X86-NEXT: vmovss %xmm0, (%esp)198; X86-NEXT: flds (%esp)199; X86-NEXT: popl %eax200; X86-NEXT: retl201 %v = fdiv <4 x float> %x, %y202 %r = extractelement <4 x float> %v, i32 0203 ret float %r204}205 206define double @fdiv_v4f64(<4 x double> %x, <4 x double> %y) nounwind {207; X64-LABEL: fdiv_v4f64:208; X64: # %bb.0:209; X64-NEXT: vdivsd %xmm1, %xmm0, %xmm0210; X64-NEXT: vzeroupper211; X64-NEXT: retq212;213; X86-LABEL: fdiv_v4f64:214; X86: # %bb.0:215; X86-NEXT: pushl %ebp216; X86-NEXT: movl %esp, %ebp217; X86-NEXT: andl $-8, %esp218; X86-NEXT: subl $8, %esp219; X86-NEXT: vdivsd %xmm1, %xmm0, %xmm0220; X86-NEXT: vmovsd %xmm0, (%esp)221; X86-NEXT: fldl (%esp)222; X86-NEXT: movl %ebp, %esp223; X86-NEXT: popl %ebp224; X86-NEXT: vzeroupper225; X86-NEXT: retl226 %v = fdiv <4 x double> %x, %y227 %r = extractelement <4 x double> %v, i32 0228 ret double %r229}230 231define float @frem_v4f32(<4 x float> %x, <4 x float> %y) nounwind {232; X64-LABEL: frem_v4f32:233; X64: # %bb.0:234; X64-NEXT: jmp fmodf@PLT # TAILCALL235;236; X86-LABEL: frem_v4f32:237; X86: # %bb.0:238; X86-NEXT: subl $8, %esp239; X86-NEXT: vmovss %xmm1, {{[0-9]+}}(%esp)240; X86-NEXT: vmovss %xmm0, (%esp)241; X86-NEXT: calll fmodf242; X86-NEXT: addl $8, %esp243; X86-NEXT: retl244 %v = frem <4 x float> %x, %y245 %r = extractelement <4 x float> %v, i32 0246 ret float %r247}248 249define double @frem_v4f64(<4 x double> %x, <4 x double> %y) nounwind {250; X64-LABEL: frem_v4f64:251; X64: # %bb.0:252; X64-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0253; X64-NEXT: # kill: def $xmm1 killed $xmm1 killed $ymm1254; X64-NEXT: vzeroupper255; X64-NEXT: jmp fmod@PLT # TAILCALL256;257; X86-LABEL: frem_v4f64:258; X86: # %bb.0:259; X86-NEXT: subl $16, %esp260; X86-NEXT: vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]261; X86-NEXT: vmovups %xmm0, (%esp)262; X86-NEXT: vzeroupper263; X86-NEXT: calll fmod264; X86-NEXT: addl $16, %esp265; X86-NEXT: retl266 %v = frem <4 x double> %x, %y267 %r = extractelement <4 x double> %v, i32 0268 ret double %r269}270 271define i1 @fcmp_v4f32(<4 x float> %x, <4 x float> %y) nounwind {272; CHECK-LABEL: fcmp_v4f32:273; CHECK: # %bb.0:274; CHECK-NEXT: vucomiss %xmm1, %xmm0275; CHECK-NEXT: seta %al276; CHECK-NEXT: ret{{[l|q]}}277 %v = fcmp ogt <4 x float> %x, %y278 %r = extractelement <4 x i1> %v, i32 0279 ret i1 %r280}281 282define i1 @fcmp_v4f64(<4 x double> %x, <4 x double> %y) nounwind {283; CHECK-LABEL: fcmp_v4f64:284; CHECK: # %bb.0:285; CHECK-NEXT: vucomisd %xmm0, %xmm1286; CHECK-NEXT: setb %al287; CHECK-NEXT: vzeroupper288; CHECK-NEXT: ret{{[l|q]}}289 %v = fcmp ugt <4 x double> %x, %y290 %r = extractelement <4 x i1> %v, i32 0291 ret i1 %r292}293 294; If we do the fcmp transform late, make sure we have the right types.295; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13700296 297define void @extsetcc(<4 x float> %x) {298; X64-LABEL: extsetcc:299; X64: # %bb.0:300; X64-NEXT: vxorps %xmm1, %xmm1, %xmm1301; X64-NEXT: vucomiss %xmm1, %xmm0302; X64-NEXT: setb (%rax)303; X64-NEXT: retq304;305; X86-LABEL: extsetcc:306; X86: # %bb.0:307; X86-NEXT: vxorps %xmm1, %xmm1, %xmm1308; X86-NEXT: vucomiss %xmm1, %xmm0309; X86-NEXT: setb (%eax)310; X86-NEXT: retl311 %cmp = fcmp ult <4 x float> %x, zeroinitializer312 %sext = sext <4 x i1> %cmp to <4 x i32>313 %e = extractelement <4 x i1> %cmp, i1 0314 store i1 %e, ptr undef315 ret void316}317 318; This used to crash by creating a setcc with an i64 condition on a 32-bit target.319define <3 x double> @extvselectsetcc_crash(<2 x double> %x) {320; X64-LABEL: extvselectsetcc_crash:321; X64: # %bb.0:322; X64-NEXT: vcmpeqsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1323; X64-NEXT: vmovsd {{.*#+}} xmm2 = [1.0E+0,0.0E+0]324; X64-NEXT: vandpd %xmm2, %xmm1, %xmm1325; X64-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0326; X64-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,3,3]327; X64-NEXT: retq328;329; X86-LABEL: extvselectsetcc_crash:330; X86: # %bb.0:331; X86-NEXT: vcmpeqsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1332; X86-NEXT: vmovsd {{.*#+}} xmm2 = [1.0E+0,0.0E+0]333; X86-NEXT: vandpd %xmm2, %xmm1, %xmm1334; X86-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0335; X86-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,3,3]336; X86-NEXT: retl337 %cmp = fcmp oeq <2 x double> %x, <double 5.0, double 5.0>338 %s = select <2 x i1> %cmp, <2 x double> <double 1.0, double undef>, <2 x double> <double 0.0, double undef>339 %r = shufflevector <2 x double> %s, <2 x double> %x, <3 x i32> <i32 0, i32 2, i32 3>340 ret <3 x double> %r341}342 343define float @select_fcmp_v4f32(<4 x float> %x, <4 x float> %y, <4 x float> %z, <4 x float> %w) nounwind {344; X64-LABEL: select_fcmp_v4f32:345; X64: # %bb.0:346; X64-NEXT: vcmpneq_oqss %xmm1, %xmm0, %xmm0347; X64-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0348; X64-NEXT: retq349;350; X86-LABEL: select_fcmp_v4f32:351; X86: # %bb.0:352; X86-NEXT: pushl %ebp353; X86-NEXT: movl %esp, %ebp354; X86-NEXT: andl $-16, %esp355; X86-NEXT: subl $16, %esp356; X86-NEXT: vmovaps 8(%ebp), %xmm3357; X86-NEXT: vcmpneq_oqss %xmm1, %xmm0, %xmm0358; X86-NEXT: vblendvps %xmm0, %xmm2, %xmm3, %xmm0359; X86-NEXT: vmovss %xmm0, {{[0-9]+}}(%esp)360; X86-NEXT: flds {{[0-9]+}}(%esp)361; X86-NEXT: movl %ebp, %esp362; X86-NEXT: popl %ebp363; X86-NEXT: retl364 %c = fcmp one <4 x float> %x, %y365 %s = select <4 x i1> %c, <4 x float> %z, <4 x float> %w366 %r = extractelement <4 x float> %s, i32 0367 ret float %r368}369 370define double @select_fcmp_v4f64(<4 x double> %x, <4 x double> %y, <4 x double> %z, <4 x double> %w) nounwind {371; X64-LABEL: select_fcmp_v4f64:372; X64: # %bb.0:373; X64-NEXT: vcmpnltsd %xmm0, %xmm1, %xmm0374; X64-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0375; X64-NEXT: vzeroupper376; X64-NEXT: retq377;378; X86-LABEL: select_fcmp_v4f64:379; X86: # %bb.0:380; X86-NEXT: pushl %ebp381; X86-NEXT: movl %esp, %ebp382; X86-NEXT: andl $-32, %esp383; X86-NEXT: subl $32, %esp384; X86-NEXT: vcmpnltsd %xmm0, %xmm1, %xmm0385; X86-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero386; X86-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0387; X86-NEXT: vmovlpd %xmm0, {{[0-9]+}}(%esp)388; X86-NEXT: fldl {{[0-9]+}}(%esp)389; X86-NEXT: movl %ebp, %esp390; X86-NEXT: popl %ebp391; X86-NEXT: vzeroupper392; X86-NEXT: retl393 %c = fcmp ule <4 x double> %x, %y394 %s = select <4 x i1> %c, <4 x double> %z, <4 x double> %w395 %r = extractelement <4 x double> %s, i32 0396 ret double %r397}398 399define float @fsqrt_v4f32(<4 x float> %x) nounwind {400; X64-LABEL: fsqrt_v4f32:401; X64: # %bb.0:402; X64-NEXT: vsqrtss %xmm0, %xmm0, %xmm0403; X64-NEXT: retq404;405; X86-LABEL: fsqrt_v4f32:406; X86: # %bb.0:407; X86-NEXT: pushl %eax408; X86-NEXT: vsqrtss %xmm0, %xmm0, %xmm0409; X86-NEXT: vmovss %xmm0, (%esp)410; X86-NEXT: flds (%esp)411; X86-NEXT: popl %eax412; X86-NEXT: retl413 %v = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %x)414 %r = extractelement <4 x float> %v, i32 0415 ret float %r416}417 418define double @fsqrt_v4f64(<4 x double> %x) nounwind {419; X64-LABEL: fsqrt_v4f64:420; X64: # %bb.0:421; X64-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0422; X64-NEXT: vzeroupper423; X64-NEXT: retq424;425; X86-LABEL: fsqrt_v4f64:426; X86: # %bb.0:427; X86-NEXT: pushl %ebp428; X86-NEXT: movl %esp, %ebp429; X86-NEXT: andl $-8, %esp430; X86-NEXT: subl $8, %esp431; X86-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0432; X86-NEXT: vmovsd %xmm0, (%esp)433; X86-NEXT: fldl (%esp)434; X86-NEXT: movl %ebp, %esp435; X86-NEXT: popl %ebp436; X86-NEXT: vzeroupper437; X86-NEXT: retl438 %v = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %x)439 %r = extractelement <4 x double> %v, i32 0440 ret double %r441}442 443define float @fsin_v4f32(<4 x float> %x) nounwind {444; X64-LABEL: fsin_v4f32:445; X64: # %bb.0:446; X64-NEXT: jmp sinf@PLT # TAILCALL447;448; X86-LABEL: fsin_v4f32:449; X86: # %bb.0:450; X86-NEXT: pushl %eax451; X86-NEXT: vmovss %xmm0, (%esp)452; X86-NEXT: calll sinf453; X86-NEXT: popl %eax454; X86-NEXT: retl455 %v = call <4 x float> @llvm.sin.v4f32(<4 x float> %x)456 %r = extractelement <4 x float> %v, i32 0457 ret float %r458}459 460define double @fsin_v4f64(<4 x double> %x) nounwind {461; X64-LABEL: fsin_v4f64:462; X64: # %bb.0:463; X64-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0464; X64-NEXT: vzeroupper465; X64-NEXT: jmp sin@PLT # TAILCALL466;467; X86-LABEL: fsin_v4f64:468; X86: # %bb.0:469; X86-NEXT: subl $8, %esp470; X86-NEXT: vmovlps %xmm0, (%esp)471; X86-NEXT: vzeroupper472; X86-NEXT: calll sin473; X86-NEXT: addl $8, %esp474; X86-NEXT: retl475 %v = call <4 x double> @llvm.sin.v4f64(<4 x double> %x)476 %r = extractelement <4 x double> %v, i32 0477 ret double %r478}479 480define float @fma_v4f32(<4 x float> %x, <4 x float> %y, <4 x float> %z) nounwind {481; X64-LABEL: fma_v4f32:482; X64: # %bb.0:483; X64-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2484; X64-NEXT: retq485;486; X86-LABEL: fma_v4f32:487; X86: # %bb.0:488; X86-NEXT: pushl %eax489; X86-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2490; X86-NEXT: vmovss %xmm0, (%esp)491; X86-NEXT: flds (%esp)492; X86-NEXT: popl %eax493; X86-NEXT: retl494 %v = call <4 x float> @llvm.fma.v4f32(<4 x float> %x, <4 x float> %y, <4 x float> %z)495 %r = extractelement <4 x float> %v, i32 0496 ret float %r497}498 499define double @fma_v4f64(<4 x double> %x, <4 x double> %y, <4 x double> %z) nounwind {500; X64-LABEL: fma_v4f64:501; X64: # %bb.0:502; X64-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2503; X64-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0504; X64-NEXT: vzeroupper505; X64-NEXT: retq506;507; X86-LABEL: fma_v4f64:508; X86: # %bb.0:509; X86-NEXT: pushl %ebp510; X86-NEXT: movl %esp, %ebp511; X86-NEXT: andl $-8, %esp512; X86-NEXT: subl $8, %esp513; X86-NEXT: vfmadd213sd {{.*#+}} xmm1 = (xmm0 * xmm1) + xmm2514; X86-NEXT: vmovsd %xmm1, (%esp)515; X86-NEXT: fldl (%esp)516; X86-NEXT: movl %ebp, %esp517; X86-NEXT: popl %ebp518; X86-NEXT: vzeroupper519; X86-NEXT: retl520 %v = call <4 x double> @llvm.fma.v4f64(<4 x double> %x, <4 x double> %y, <4 x double> %z)521 %r = extractelement <4 x double> %v, i32 0522 ret double %r523}524 525define float @fabs_v4f32(<4 x float> %x) nounwind {526; X64-LABEL: fabs_v4f32:527; X64: # %bb.0:528; X64-NEXT: vbroadcastss {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN]529; X64-NEXT: vandps %xmm1, %xmm0, %xmm0530; X64-NEXT: retq531;532; X86-LABEL: fabs_v4f32:533; X86: # %bb.0:534; X86-NEXT: pushl %eax535; X86-NEXT: vbroadcastss {{.*#+}} xmm1 = [NaN,NaN,NaN,NaN]536; X86-NEXT: vandps %xmm1, %xmm0, %xmm0537; X86-NEXT: vmovss %xmm0, (%esp)538; X86-NEXT: flds (%esp)539; X86-NEXT: popl %eax540; X86-NEXT: retl541 %v = call <4 x float> @llvm.fabs.v4f32(<4 x float> %x)542 %r = extractelement <4 x float> %v, i32 0543 ret float %r544}545 546define double @fabs_v4f64(<4 x double> %x) nounwind {547; X64-LABEL: fabs_v4f64:548; X64: # %bb.0:549; X64-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0550; X64-NEXT: vzeroupper551; X64-NEXT: retq552;553; X86-LABEL: fabs_v4f64:554; X86: # %bb.0:555; X86-NEXT: pushl %ebp556; X86-NEXT: movl %esp, %ebp557; X86-NEXT: andl $-8, %esp558; X86-NEXT: subl $8, %esp559; X86-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0560; X86-NEXT: vmovlps %xmm0, (%esp)561; X86-NEXT: fldl (%esp)562; X86-NEXT: movl %ebp, %esp563; X86-NEXT: popl %ebp564; X86-NEXT: vzeroupper565; X86-NEXT: retl566 %v = call <4 x double> @llvm.fabs.v4f64(<4 x double> %x)567 %r = extractelement <4 x double> %v, i32 0568 ret double %r569}570 571define float @fmaxnum_v4f32(<4 x float> %x, <4 x float> %y) nounwind {572; X64-LABEL: fmaxnum_v4f32:573; X64: # %bb.0:574; X64-NEXT: vmaxss %xmm0, %xmm1, %xmm2575; X64-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0576; X64-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0577; X64-NEXT: retq578;579; X86-LABEL: fmaxnum_v4f32:580; X86: # %bb.0:581; X86-NEXT: pushl %eax582; X86-NEXT: vmaxss %xmm0, %xmm1, %xmm2583; X86-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0584; X86-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0585; X86-NEXT: vmovss %xmm0, (%esp)586; X86-NEXT: flds (%esp)587; X86-NEXT: popl %eax588; X86-NEXT: retl589 %v = call <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float> %y)590 %r = extractelement <4 x float> %v, i32 0591 ret float %r592}593 594define double @fmaxnum_v4f64(<4 x double> %x, <4 x double> %y) nounwind {595; X64-LABEL: fmaxnum_v4f64:596; X64: # %bb.0:597; X64-NEXT: vmaxsd %xmm0, %xmm1, %xmm2598; X64-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0599; X64-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0600; X64-NEXT: vzeroupper601; X64-NEXT: retq602;603; X86-LABEL: fmaxnum_v4f64:604; X86: # %bb.0:605; X86-NEXT: pushl %ebp606; X86-NEXT: movl %esp, %ebp607; X86-NEXT: andl $-8, %esp608; X86-NEXT: subl $8, %esp609; X86-NEXT: vmaxsd %xmm0, %xmm1, %xmm2610; X86-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0611; X86-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0612; X86-NEXT: vmovlpd %xmm0, (%esp)613; X86-NEXT: fldl (%esp)614; X86-NEXT: movl %ebp, %esp615; X86-NEXT: popl %ebp616; X86-NEXT: vzeroupper617; X86-NEXT: retl618 %v = call <4 x double> @llvm.maxnum.v4f64(<4 x double> %x, <4 x double> %y)619 %r = extractelement <4 x double> %v, i32 0620 ret double %r621}622 623define float @fminnum_v4f32(<4 x float> %x, <4 x float> %y) nounwind {624; X64-LABEL: fminnum_v4f32:625; X64: # %bb.0:626; X64-NEXT: vminss %xmm0, %xmm1, %xmm2627; X64-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0628; X64-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0629; X64-NEXT: retq630;631; X86-LABEL: fminnum_v4f32:632; X86: # %bb.0:633; X86-NEXT: pushl %eax634; X86-NEXT: vminss %xmm0, %xmm1, %xmm2635; X86-NEXT: vcmpunordss %xmm0, %xmm0, %xmm0636; X86-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0637; X86-NEXT: vmovss %xmm0, (%esp)638; X86-NEXT: flds (%esp)639; X86-NEXT: popl %eax640; X86-NEXT: retl641 %v = call <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float> %y)642 %r = extractelement <4 x float> %v, i32 0643 ret float %r644}645 646define double @fminnum_v4f64(<4 x double> %x, <4 x double> %y) nounwind {647; X64-LABEL: fminnum_v4f64:648; X64: # %bb.0:649; X64-NEXT: vminsd %xmm0, %xmm1, %xmm2650; X64-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0651; X64-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0652; X64-NEXT: vzeroupper653; X64-NEXT: retq654;655; X86-LABEL: fminnum_v4f64:656; X86: # %bb.0:657; X86-NEXT: pushl %ebp658; X86-NEXT: movl %esp, %ebp659; X86-NEXT: andl $-8, %esp660; X86-NEXT: subl $8, %esp661; X86-NEXT: vminsd %xmm0, %xmm1, %xmm2662; X86-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm0663; X86-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0664; X86-NEXT: vmovlpd %xmm0, (%esp)665; X86-NEXT: fldl (%esp)666; X86-NEXT: movl %ebp, %esp667; X86-NEXT: popl %ebp668; X86-NEXT: vzeroupper669; X86-NEXT: retl670 %v = call <4 x double> @llvm.minnum.v4f64(<4 x double> %x, <4 x double> %y)671 %r = extractelement <4 x double> %v, i32 0672 ret double %r673}674 675define float @fmaximum_v4f32(<4 x float> %x, <4 x float> %y) nounwind {676; X64-LABEL: fmaximum_v4f32:677; X64: # %bb.0:678; X64-NEXT: vmovd %xmm0, %eax679; X64-NEXT: testl %eax, %eax680; X64-NEXT: js .LBB30_1681; X64-NEXT: # %bb.2:682; X64-NEXT: vmovdqa %xmm0, %xmm2683; X64-NEXT: jmp .LBB30_3684; X64-NEXT: .LBB30_1:685; X64-NEXT: vmovdqa %xmm1, %xmm2686; X64-NEXT: vmovdqa %xmm0, %xmm1687; X64-NEXT: .LBB30_3:688; X64-NEXT: vmaxss %xmm2, %xmm1, %xmm0689; X64-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2690; X64-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0691; X64-NEXT: retq692;693; X86-LABEL: fmaximum_v4f32:694; X86: # %bb.0:695; X86-NEXT: vmovd %xmm0, %eax696; X86-NEXT: testl %eax, %eax697; X86-NEXT: js .LBB30_1698; X86-NEXT: # %bb.2:699; X86-NEXT: vmovdqa %xmm0, %xmm2700; X86-NEXT: jmp .LBB30_3701; X86-NEXT: .LBB30_1:702; X86-NEXT: vmovdqa %xmm1, %xmm2703; X86-NEXT: vmovdqa %xmm0, %xmm1704; X86-NEXT: .LBB30_3:705; X86-NEXT: pushl %eax706; X86-NEXT: vmaxss %xmm2, %xmm1, %xmm0707; X86-NEXT: vcmpunordss %xmm1, %xmm1, %xmm2708; X86-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0709; X86-NEXT: vmovss %xmm0, (%esp)710; X86-NEXT: flds (%esp)711; X86-NEXT: popl %eax712; X86-NEXT: retl713 %v = call <4 x float> @llvm.maximum.v4f32(<4 x float> %x, <4 x float> %y)714 %r = extractelement <4 x float> %v, i32 0715 ret float %r716}717 718define double @fmaximum_v4f64(<4 x double> %x, <4 x double> %y) nounwind {719; X64-LABEL: fmaximum_v4f64:720; X64: # %bb.0:721; X64-NEXT: vmovq %xmm0, %rax722; X64-NEXT: testq %rax, %rax723; X64-NEXT: js .LBB31_1724; X64-NEXT: # %bb.2:725; X64-NEXT: vmovdqa %xmm0, %xmm2726; X64-NEXT: jmp .LBB31_3727; X64-NEXT: .LBB31_1:728; X64-NEXT: vmovdqa %xmm1, %xmm2729; X64-NEXT: vmovdqa %xmm0, %xmm1730; X64-NEXT: .LBB31_3:731; X64-NEXT: vmaxsd %xmm2, %xmm1, %xmm0732; X64-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2733; X64-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0734; X64-NEXT: vzeroupper735; X64-NEXT: retq736;737; X86-LABEL: fmaximum_v4f64:738; X86: # %bb.0:739; X86-NEXT: vextractps $1, %xmm0, %eax740; X86-NEXT: testl %eax, %eax741; X86-NEXT: js .LBB31_1742; X86-NEXT: # %bb.2:743; X86-NEXT: vmovapd %xmm0, %xmm2744; X86-NEXT: jmp .LBB31_3745; X86-NEXT: .LBB31_1:746; X86-NEXT: vmovapd %xmm1, %xmm2747; X86-NEXT: vmovapd %xmm0, %xmm1748; X86-NEXT: .LBB31_3:749; X86-NEXT: pushl %ebp750; X86-NEXT: movl %esp, %ebp751; X86-NEXT: andl $-8, %esp752; X86-NEXT: subl $8, %esp753; X86-NEXT: vmaxsd %xmm2, %xmm1, %xmm0754; X86-NEXT: vcmpunordsd %xmm1, %xmm1, %xmm2755; X86-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0756; X86-NEXT: vmovlpd %xmm0, (%esp)757; X86-NEXT: fldl (%esp)758; X86-NEXT: movl %ebp, %esp759; X86-NEXT: popl %ebp760; X86-NEXT: vzeroupper761; X86-NEXT: retl762 %v = call <4 x double> @llvm.maximum.v4f64(<4 x double> %x, <4 x double> %y)763 %r = extractelement <4 x double> %v, i32 0764 ret double %r765}766 767define float @fminimum_v4f32(<4 x float> %x, <4 x float> %y) nounwind {768; X64-LABEL: fminimum_v4f32:769; X64: # %bb.0:770; X64-NEXT: vmovd %xmm0, %eax771; X64-NEXT: testl %eax, %eax772; X64-NEXT: js .LBB32_1773; X64-NEXT: # %bb.2:774; X64-NEXT: vmovdqa %xmm1, %xmm2775; X64-NEXT: jmp .LBB32_3776; X64-NEXT: .LBB32_1:777; X64-NEXT: vmovdqa %xmm0, %xmm2778; X64-NEXT: vmovdqa %xmm1, %xmm0779; X64-NEXT: .LBB32_3:780; X64-NEXT: vminss %xmm2, %xmm0, %xmm1781; X64-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2782; X64-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0783; X64-NEXT: retq784;785; X86-LABEL: fminimum_v4f32:786; X86: # %bb.0:787; X86-NEXT: vmovd %xmm0, %eax788; X86-NEXT: testl %eax, %eax789; X86-NEXT: js .LBB32_1790; X86-NEXT: # %bb.2:791; X86-NEXT: vmovdqa %xmm1, %xmm2792; X86-NEXT: jmp .LBB32_3793; X86-NEXT: .LBB32_1:794; X86-NEXT: vmovdqa %xmm0, %xmm2795; X86-NEXT: vmovdqa %xmm1, %xmm0796; X86-NEXT: .LBB32_3:797; X86-NEXT: pushl %eax798; X86-NEXT: vminss %xmm2, %xmm0, %xmm1799; X86-NEXT: vcmpunordss %xmm0, %xmm0, %xmm2800; X86-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0801; X86-NEXT: vmovss %xmm0, (%esp)802; X86-NEXT: flds (%esp)803; X86-NEXT: popl %eax804; X86-NEXT: retl805 %v = call <4 x float> @llvm.minimum.v4f32(<4 x float> %x, <4 x float> %y)806 %r = extractelement <4 x float> %v, i32 0807 ret float %r808}809 810define double @fminimum_v4f64(<4 x double> %x, <4 x double> %y) nounwind {811; X64-LABEL: fminimum_v4f64:812; X64: # %bb.0:813; X64-NEXT: vmovq %xmm0, %rax814; X64-NEXT: testq %rax, %rax815; X64-NEXT: js .LBB33_1816; X64-NEXT: # %bb.2:817; X64-NEXT: vmovdqa %xmm1, %xmm2818; X64-NEXT: jmp .LBB33_3819; X64-NEXT: .LBB33_1:820; X64-NEXT: vmovdqa %xmm0, %xmm2821; X64-NEXT: vmovdqa %xmm1, %xmm0822; X64-NEXT: .LBB33_3:823; X64-NEXT: vminsd %xmm2, %xmm0, %xmm1824; X64-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm2825; X64-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0826; X64-NEXT: vzeroupper827; X64-NEXT: retq828;829; X86-LABEL: fminimum_v4f64:830; X86: # %bb.0:831; X86-NEXT: vextractps $1, %xmm0, %eax832; X86-NEXT: testl %eax, %eax833; X86-NEXT: js .LBB33_1834; X86-NEXT: # %bb.2:835; X86-NEXT: vmovapd %xmm1, %xmm2836; X86-NEXT: jmp .LBB33_3837; X86-NEXT: .LBB33_1:838; X86-NEXT: vmovapd %xmm0, %xmm2839; X86-NEXT: vmovapd %xmm1, %xmm0840; X86-NEXT: .LBB33_3:841; X86-NEXT: pushl %ebp842; X86-NEXT: movl %esp, %ebp843; X86-NEXT: andl $-8, %esp844; X86-NEXT: subl $8, %esp845; X86-NEXT: vminsd %xmm2, %xmm0, %xmm1846; X86-NEXT: vcmpunordsd %xmm0, %xmm0, %xmm2847; X86-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0848; X86-NEXT: vmovlpd %xmm0, (%esp)849; X86-NEXT: fldl (%esp)850; X86-NEXT: movl %ebp, %esp851; X86-NEXT: popl %ebp852; X86-NEXT: vzeroupper853; X86-NEXT: retl854 %v = call <4 x double> @llvm.minimum.v4f64(<4 x double> %x, <4 x double> %y)855 %r = extractelement <4 x double> %v, i32 0856 ret double %r857}858 859define float @maxps_v4f32(<4 x float> %x, <4 x float> %y) nounwind {860; X64-LABEL: maxps_v4f32:861; X64: # %bb.0:862; X64-NEXT: vmaxss %xmm1, %xmm0, %xmm0863; X64-NEXT: retq864;865; X86-LABEL: maxps_v4f32:866; X86: # %bb.0:867; X86-NEXT: pushl %eax868; X86-NEXT: vmaxss %xmm1, %xmm0, %xmm0869; X86-NEXT: vmovss %xmm0, (%esp)870; X86-NEXT: flds (%esp)871; X86-NEXT: popl %eax872; X86-NEXT: retl873 %cmp = fcmp ogt <4 x float> %x, %y874 %v = select <4 x i1> %cmp, <4 x float> %x, <4 x float> %y875 %r = extractelement <4 x float> %v, i32 0876 ret float %r877}878 879define double @maxpd_v4f64(<4 x double> %x, <4 x double> %y) nounwind {880; X64-LABEL: maxpd_v4f64:881; X64: # %bb.0:882; X64-NEXT: vmaxsd %xmm1, %xmm0, %xmm0883; X64-NEXT: vzeroupper884; X64-NEXT: retq885;886; X86-LABEL: maxpd_v4f64:887; X86: # %bb.0:888; X86-NEXT: pushl %ebp889; X86-NEXT: movl %esp, %ebp890; X86-NEXT: andl $-8, %esp891; X86-NEXT: subl $8, %esp892; X86-NEXT: vmaxsd %xmm1, %xmm0, %xmm0893; X86-NEXT: vmovsd %xmm0, (%esp)894; X86-NEXT: fldl (%esp)895; X86-NEXT: movl %ebp, %esp896; X86-NEXT: popl %ebp897; X86-NEXT: vzeroupper898; X86-NEXT: retl899 %cmp = fcmp ogt <4 x double> %x, %y900 %v = select <4 x i1> %cmp, <4 x double> %x, <4 x double> %y901 %r = extractelement <4 x double> %v, i32 0902 ret double %r903}904 905define float @minps_v4f32(<4 x float> %x, <4 x float> %y) nounwind {906; X64-LABEL: minps_v4f32:907; X64: # %bb.0:908; X64-NEXT: vminss %xmm1, %xmm0, %xmm0909; X64-NEXT: retq910;911; X86-LABEL: minps_v4f32:912; X86: # %bb.0:913; X86-NEXT: pushl %eax914; X86-NEXT: vminss %xmm1, %xmm0, %xmm0915; X86-NEXT: vmovss %xmm0, (%esp)916; X86-NEXT: flds (%esp)917; X86-NEXT: popl %eax918; X86-NEXT: retl919 %cmp = fcmp olt <4 x float> %x, %y920 %v = select <4 x i1> %cmp, <4 x float> %x, <4 x float> %y921 %r = extractelement <4 x float> %v, i32 0922 ret float %r923}924 925define double @minpd_v4f64(<4 x double> %x, <4 x double> %y) nounwind {926; X64-LABEL: minpd_v4f64:927; X64: # %bb.0:928; X64-NEXT: vminsd %xmm1, %xmm0, %xmm0929; X64-NEXT: vzeroupper930; X64-NEXT: retq931;932; X86-LABEL: minpd_v4f64:933; X86: # %bb.0:934; X86-NEXT: pushl %ebp935; X86-NEXT: movl %esp, %ebp936; X86-NEXT: andl $-8, %esp937; X86-NEXT: subl $8, %esp938; X86-NEXT: vminsd %xmm1, %xmm0, %xmm0939; X86-NEXT: vmovsd %xmm0, (%esp)940; X86-NEXT: fldl (%esp)941; X86-NEXT: movl %ebp, %esp942; X86-NEXT: popl %ebp943; X86-NEXT: vzeroupper944; X86-NEXT: retl945 %cmp = fcmp olt <4 x double> %x, %y946 %v = select <4 x i1> %cmp, <4 x double> %x, <4 x double> %y947 %r = extractelement <4 x double> %v, i32 0948 ret double %r949}950 951define float @copysign_v4f32(<4 x float> %x, <4 x float> %y) nounwind {952; X64-LABEL: copysign_v4f32:953; X64: # %bb.0:954; X64-NEXT: vbroadcastss {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]955; X64-NEXT: vandps %xmm2, %xmm1, %xmm1956; X64-NEXT: vbroadcastss {{.*#+}} xmm2 = [NaN,NaN,NaN,NaN]957; X64-NEXT: vandps %xmm2, %xmm0, %xmm0958; X64-NEXT: vorps %xmm1, %xmm0, %xmm0959; X64-NEXT: retq960;961; X86-LABEL: copysign_v4f32:962; X86: # %bb.0:963; X86-NEXT: pushl %eax964; X86-NEXT: vbroadcastss {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]965; X86-NEXT: vandps %xmm2, %xmm1, %xmm1966; X86-NEXT: vbroadcastss {{.*#+}} xmm2 = [NaN,NaN,NaN,NaN]967; X86-NEXT: vandps %xmm2, %xmm0, %xmm0968; X86-NEXT: vorps %xmm1, %xmm0, %xmm0969; X86-NEXT: vmovss %xmm0, (%esp)970; X86-NEXT: flds (%esp)971; X86-NEXT: popl %eax972; X86-NEXT: retl973 %v = call <4 x float> @llvm.copysign.v4f32(<4 x float> %x, <4 x float> %y)974 %r = extractelement <4 x float> %v, i32 0975 ret float %r976}977 978define double @copysign_v4f64(<4 x double> %x, <4 x double> %y) nounwind {979; X64-LABEL: copysign_v4f64:980; X64: # %bb.0:981; X64-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1982; X64-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0983; X64-NEXT: vorps %xmm1, %xmm0, %xmm0984; X64-NEXT: vzeroupper985; X64-NEXT: retq986;987; X86-LABEL: copysign_v4f64:988; X86: # %bb.0:989; X86-NEXT: pushl %ebp990; X86-NEXT: movl %esp, %ebp991; X86-NEXT: andl $-8, %esp992; X86-NEXT: subl $8, %esp993; X86-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1994; X86-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0995; X86-NEXT: vorps %xmm1, %xmm0, %xmm0996; X86-NEXT: vmovlps %xmm0, (%esp)997; X86-NEXT: fldl (%esp)998; X86-NEXT: movl %ebp, %esp999; X86-NEXT: popl %ebp1000; X86-NEXT: vzeroupper1001; X86-NEXT: retl1002 %v = call <4 x double> @llvm.copysign.v4f64(<4 x double> %x, <4 x double> %y)1003 %r = extractelement <4 x double> %v, i32 01004 ret double %r1005}1006 1007define float @floor_v4f32(<4 x float> %x) nounwind {1008; X64-LABEL: floor_v4f32:1009; X64: # %bb.0:1010; X64-NEXT: vroundss $9, %xmm0, %xmm0, %xmm01011; X64-NEXT: retq1012;1013; X86-LABEL: floor_v4f32:1014; X86: # %bb.0:1015; X86-NEXT: pushl %eax1016; X86-NEXT: vroundss $9, %xmm0, %xmm0, %xmm01017; X86-NEXT: vmovss %xmm0, (%esp)1018; X86-NEXT: flds (%esp)1019; X86-NEXT: popl %eax1020; X86-NEXT: retl1021 %v = call <4 x float> @llvm.floor.v4f32(<4 x float> %x)1022 %r = extractelement <4 x float> %v, i32 01023 ret float %r1024}1025 1026define double @floor_v4f64(<4 x double> %x) nounwind {1027; X64-LABEL: floor_v4f64:1028; X64: # %bb.0:1029; X64-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm01030; X64-NEXT: vzeroupper1031; X64-NEXT: retq1032;1033; X86-LABEL: floor_v4f64:1034; X86: # %bb.0:1035; X86-NEXT: pushl %ebp1036; X86-NEXT: movl %esp, %ebp1037; X86-NEXT: andl $-8, %esp1038; X86-NEXT: subl $8, %esp1039; X86-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm01040; X86-NEXT: vmovsd %xmm0, (%esp)1041; X86-NEXT: fldl (%esp)1042; X86-NEXT: movl %ebp, %esp1043; X86-NEXT: popl %ebp1044; X86-NEXT: vzeroupper1045; X86-NEXT: retl1046 %v = call <4 x double> @llvm.floor.v4f64(<4 x double> %x)1047 %r = extractelement <4 x double> %v, i32 01048 ret double %r1049}1050 1051define float @ceil_v4f32(<4 x float> %x) nounwind {1052; X64-LABEL: ceil_v4f32:1053; X64: # %bb.0:1054; X64-NEXT: vroundss $10, %xmm0, %xmm0, %xmm01055; X64-NEXT: retq1056;1057; X86-LABEL: ceil_v4f32:1058; X86: # %bb.0:1059; X86-NEXT: pushl %eax1060; X86-NEXT: vroundss $10, %xmm0, %xmm0, %xmm01061; X86-NEXT: vmovss %xmm0, (%esp)1062; X86-NEXT: flds (%esp)1063; X86-NEXT: popl %eax1064; X86-NEXT: retl1065 %v = call <4 x float> @llvm.ceil.v4f32(<4 x float> %x)1066 %r = extractelement <4 x float> %v, i32 01067 ret float %r1068}1069 1070define double @ceil_v4f64(<4 x double> %x) nounwind {1071; X64-LABEL: ceil_v4f64:1072; X64: # %bb.0:1073; X64-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm01074; X64-NEXT: vzeroupper1075; X64-NEXT: retq1076;1077; X86-LABEL: ceil_v4f64:1078; X86: # %bb.0:1079; X86-NEXT: pushl %ebp1080; X86-NEXT: movl %esp, %ebp1081; X86-NEXT: andl $-8, %esp1082; X86-NEXT: subl $8, %esp1083; X86-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm01084; X86-NEXT: vmovsd %xmm0, (%esp)1085; X86-NEXT: fldl (%esp)1086; X86-NEXT: movl %ebp, %esp1087; X86-NEXT: popl %ebp1088; X86-NEXT: vzeroupper1089; X86-NEXT: retl1090 %v = call <4 x double> @llvm.ceil.v4f64(<4 x double> %x)1091 %r = extractelement <4 x double> %v, i32 01092 ret double %r1093}1094 1095define float @trunc_v4f32(<4 x float> %x) nounwind {1096; X64-LABEL: trunc_v4f32:1097; X64: # %bb.0:1098; X64-NEXT: vroundss $11, %xmm0, %xmm0, %xmm01099; X64-NEXT: retq1100;1101; X86-LABEL: trunc_v4f32:1102; X86: # %bb.0:1103; X86-NEXT: pushl %eax1104; X86-NEXT: vroundss $11, %xmm0, %xmm0, %xmm01105; X86-NEXT: vmovss %xmm0, (%esp)1106; X86-NEXT: flds (%esp)1107; X86-NEXT: popl %eax1108; X86-NEXT: retl1109 %v = call <4 x float> @llvm.trunc.v4f32(<4 x float> %x)1110 %r = extractelement <4 x float> %v, i32 01111 ret float %r1112}1113 1114define double @trunc_v4f64(<4 x double> %x) nounwind {1115; X64-LABEL: trunc_v4f64:1116; X64: # %bb.0:1117; X64-NEXT: vroundsd $11, %xmm0, %xmm0, %xmm01118; X64-NEXT: vzeroupper1119; X64-NEXT: retq1120;1121; X86-LABEL: trunc_v4f64:1122; X86: # %bb.0:1123; X86-NEXT: pushl %ebp1124; X86-NEXT: movl %esp, %ebp1125; X86-NEXT: andl $-8, %esp1126; X86-NEXT: subl $8, %esp1127; X86-NEXT: vroundsd $11, %xmm0, %xmm0, %xmm01128; X86-NEXT: vmovsd %xmm0, (%esp)1129; X86-NEXT: fldl (%esp)1130; X86-NEXT: movl %ebp, %esp1131; X86-NEXT: popl %ebp1132; X86-NEXT: vzeroupper1133; X86-NEXT: retl1134 %v = call <4 x double> @llvm.trunc.v4f64(<4 x double> %x)1135 %r = extractelement <4 x double> %v, i32 01136 ret double %r1137}1138 1139define float @rint_v4f32(<4 x float> %x) nounwind {1140; X64-LABEL: rint_v4f32:1141; X64: # %bb.0:1142; X64-NEXT: vroundss $4, %xmm0, %xmm0, %xmm01143; X64-NEXT: retq1144;1145; X86-LABEL: rint_v4f32:1146; X86: # %bb.0:1147; X86-NEXT: pushl %eax1148; X86-NEXT: vroundss $4, %xmm0, %xmm0, %xmm01149; X86-NEXT: vmovss %xmm0, (%esp)1150; X86-NEXT: flds (%esp)1151; X86-NEXT: popl %eax1152; X86-NEXT: retl1153 %v = call <4 x float> @llvm.rint.v4f32(<4 x float> %x)1154 %r = extractelement <4 x float> %v, i32 01155 ret float %r1156}1157 1158define double @rint_v4f64(<4 x double> %x) nounwind {1159; X64-LABEL: rint_v4f64:1160; X64: # %bb.0:1161; X64-NEXT: vroundsd $4, %xmm0, %xmm0, %xmm01162; X64-NEXT: vzeroupper1163; X64-NEXT: retq1164;1165; X86-LABEL: rint_v4f64:1166; X86: # %bb.0:1167; X86-NEXT: pushl %ebp1168; X86-NEXT: movl %esp, %ebp1169; X86-NEXT: andl $-8, %esp1170; X86-NEXT: subl $8, %esp1171; X86-NEXT: vroundsd $4, %xmm0, %xmm0, %xmm01172; X86-NEXT: vmovsd %xmm0, (%esp)1173; X86-NEXT: fldl (%esp)1174; X86-NEXT: movl %ebp, %esp1175; X86-NEXT: popl %ebp1176; X86-NEXT: vzeroupper1177; X86-NEXT: retl1178 %v = call <4 x double> @llvm.rint.v4f64(<4 x double> %x)1179 %r = extractelement <4 x double> %v, i32 01180 ret double %r1181}1182 1183define float @nearbyint_v4f32(<4 x float> %x) nounwind {1184; X64-LABEL: nearbyint_v4f32:1185; X64: # %bb.0:1186; X64-NEXT: vroundss $12, %xmm0, %xmm0, %xmm01187; X64-NEXT: retq1188;1189; X86-LABEL: nearbyint_v4f32:1190; X86: # %bb.0:1191; X86-NEXT: pushl %eax1192; X86-NEXT: vroundss $12, %xmm0, %xmm0, %xmm01193; X86-NEXT: vmovss %xmm0, (%esp)1194; X86-NEXT: flds (%esp)1195; X86-NEXT: popl %eax1196; X86-NEXT: retl1197 %v = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %x)1198 %r = extractelement <4 x float> %v, i32 01199 ret float %r1200}1201 1202define double @nearbyint_v4f64(<4 x double> %x) nounwind {1203; X64-LABEL: nearbyint_v4f64:1204; X64: # %bb.0:1205; X64-NEXT: vroundsd $12, %xmm0, %xmm0, %xmm01206; X64-NEXT: vzeroupper1207; X64-NEXT: retq1208;1209; X86-LABEL: nearbyint_v4f64:1210; X86: # %bb.0:1211; X86-NEXT: pushl %ebp1212; X86-NEXT: movl %esp, %ebp1213; X86-NEXT: andl $-8, %esp1214; X86-NEXT: subl $8, %esp1215; X86-NEXT: vroundsd $12, %xmm0, %xmm0, %xmm01216; X86-NEXT: vmovsd %xmm0, (%esp)1217; X86-NEXT: fldl (%esp)1218; X86-NEXT: movl %ebp, %esp1219; X86-NEXT: popl %ebp1220; X86-NEXT: vzeroupper1221; X86-NEXT: retl1222 %v = call <4 x double> @llvm.nearbyint.v4f64(<4 x double> %x)1223 %r = extractelement <4 x double> %v, i32 01224 ret double %r1225}1226 1227define float @round_v4f32(<4 x float> %x) nounwind {1228; X64-LABEL: round_v4f32:1229; X64: # %bb.0:1230; X64-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1231; X64-NEXT: vandps %xmm1, %xmm0, %xmm11232; X64-NEXT: vbroadcastss {{.*#+}} xmm2 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]1233; X64-NEXT: vorps %xmm2, %xmm1, %xmm11234; X64-NEXT: vaddss %xmm1, %xmm0, %xmm01235; X64-NEXT: vroundss $11, %xmm0, %xmm0, %xmm01236; X64-NEXT: retq1237;1238; X86-LABEL: round_v4f32:1239; X86: # %bb.0:1240; X86-NEXT: pushl %eax1241; X86-NEXT: vbroadcastss {{.*#+}} xmm1 = [-0.0E+0,-0.0E+0,-0.0E+0,-0.0E+0]1242; X86-NEXT: vandps %xmm1, %xmm0, %xmm11243; X86-NEXT: vbroadcastss {{.*#+}} xmm2 = [4.9999997E-1,4.9999997E-1,4.9999997E-1,4.9999997E-1]1244; X86-NEXT: vorps %xmm2, %xmm1, %xmm11245; X86-NEXT: vaddss %xmm1, %xmm0, %xmm01246; X86-NEXT: vroundss $11, %xmm0, %xmm0, %xmm01247; X86-NEXT: vmovss %xmm0, (%esp)1248; X86-NEXT: flds (%esp)1249; X86-NEXT: popl %eax1250; X86-NEXT: retl1251 %v = call <4 x float> @llvm.round.v4f32(<4 x float> %x)1252 %r = extractelement <4 x float> %v, i32 01253 ret float %r1254}1255 1256define double @round_v4f64(<4 x double> %x) nounwind {1257; X64-LABEL: round_v4f64:1258; X64: # %bb.0:1259; X64-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11260; X64-NEXT: vmovddup {{.*#+}} xmm2 = [4.9999999999999994E-1,4.9999999999999994E-1]1261; X64-NEXT: # xmm2 = mem[0,0]1262; X64-NEXT: vorpd %xmm2, %xmm1, %xmm11263; X64-NEXT: vaddsd %xmm1, %xmm0, %xmm01264; X64-NEXT: vroundsd $11, %xmm0, %xmm0, %xmm01265; X64-NEXT: vzeroupper1266; X64-NEXT: retq1267;1268; X86-LABEL: round_v4f64:1269; X86: # %bb.0:1270; X86-NEXT: pushl %ebp1271; X86-NEXT: movl %esp, %ebp1272; X86-NEXT: andl $-8, %esp1273; X86-NEXT: subl $8, %esp1274; X86-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm11275; X86-NEXT: vmovddup {{.*#+}} xmm2 = [4.9999999999999994E-1,4.9999999999999994E-1]1276; X86-NEXT: # xmm2 = mem[0,0]1277; X86-NEXT: vorpd %xmm2, %xmm1, %xmm11278; X86-NEXT: vaddsd %xmm1, %xmm0, %xmm01279; X86-NEXT: vroundsd $11, %xmm0, %xmm0, %xmm01280; X86-NEXT: vmovsd %xmm0, (%esp)1281; X86-NEXT: fldl (%esp)1282; X86-NEXT: movl %ebp, %esp1283; X86-NEXT: popl %ebp1284; X86-NEXT: vzeroupper1285; X86-NEXT: retl1286 %v = call <4 x double> @llvm.round.v4f64(<4 x double> %x)1287 %r = extractelement <4 x double> %v, i32 01288 ret double %r1289}1290 1291define float @rcp_v4f32(<4 x float> %x) nounwind {1292; X64-LABEL: rcp_v4f32:1293; X64: # %bb.0:1294; X64-NEXT: vrcpss %xmm0, %xmm0, %xmm01295; X64-NEXT: retq1296;1297; X86-LABEL: rcp_v4f32:1298; X86: # %bb.0:1299; X86-NEXT: pushl %eax1300; X86-NEXT: vrcpss %xmm0, %xmm0, %xmm01301; X86-NEXT: vmovss %xmm0, (%esp)1302; X86-NEXT: flds (%esp)1303; X86-NEXT: popl %eax1304; X86-NEXT: retl1305 %v = call <4 x float> @llvm.x86.sse.rcp.ps(<4 x float> %x)1306 %r = extractelement <4 x float> %v, i32 01307 ret float %r1308}1309 1310define float @rcp_v8f32(<8 x float> %x) nounwind {1311; X64-LABEL: rcp_v8f32:1312; X64: # %bb.0:1313; X64-NEXT: vrcpss %xmm0, %xmm0, %xmm01314; X64-NEXT: vzeroupper1315; X64-NEXT: retq1316;1317; X86-LABEL: rcp_v8f32:1318; X86: # %bb.0:1319; X86-NEXT: pushl %eax1320; X86-NEXT: vrcpss %xmm0, %xmm0, %xmm01321; X86-NEXT: vmovss %xmm0, (%esp)1322; X86-NEXT: flds (%esp)1323; X86-NEXT: popl %eax1324; X86-NEXT: vzeroupper1325; X86-NEXT: retl1326 %v = call <8 x float> @llvm.x86.avx.rcp.ps.256(<8 x float> %x)1327 %r = extractelement <8 x float> %v, i32 01328 ret float %r1329}1330 1331define float @rsqrt_v4f32(<4 x float> %x) nounwind {1332; X64-LABEL: rsqrt_v4f32:1333; X64: # %bb.0:1334; X64-NEXT: vrsqrtss %xmm0, %xmm0, %xmm01335; X64-NEXT: retq1336;1337; X86-LABEL: rsqrt_v4f32:1338; X86: # %bb.0:1339; X86-NEXT: pushl %eax1340; X86-NEXT: vrsqrtss %xmm0, %xmm0, %xmm01341; X86-NEXT: vmovss %xmm0, (%esp)1342; X86-NEXT: flds (%esp)1343; X86-NEXT: popl %eax1344; X86-NEXT: retl1345 %v = call <4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float> %x)1346 %r = extractelement <4 x float> %v, i32 01347 ret float %r1348}1349 1350define float @rsqrt_v8f32(<8 x float> %x) nounwind {1351; X64-LABEL: rsqrt_v8f32:1352; X64: # %bb.0:1353; X64-NEXT: vrsqrtss %xmm0, %xmm0, %xmm01354; X64-NEXT: vzeroupper1355; X64-NEXT: retq1356;1357; X86-LABEL: rsqrt_v8f32:1358; X86: # %bb.0:1359; X86-NEXT: pushl %eax1360; X86-NEXT: vrsqrtss %xmm0, %xmm0, %xmm01361; X86-NEXT: vmovss %xmm0, (%esp)1362; X86-NEXT: flds (%esp)1363; X86-NEXT: popl %eax1364; X86-NEXT: vzeroupper1365; X86-NEXT: retl1366 %v = call <8 x float> @llvm.x86.avx.rsqrt.ps.256(<8 x float> %x)1367 %r = extractelement <8 x float> %v, i32 01368 ret float %r1369}1370 1371declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)1372declare <4 x double> @llvm.sqrt.v4f64(<4 x double>)1373declare <4 x float> @llvm.sin.v4f32(<4 x float>)1374declare <4 x double> @llvm.sin.v4f64(<4 x double>)1375declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>)1376declare <4 x double> @llvm.fma.v4f64(<4 x double>, <4 x double>, <4 x double>)1377declare <4 x float> @llvm.fabs.v4f32(<4 x float>)1378declare <4 x double> @llvm.fabs.v4f64(<4 x double>)1379declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)1380declare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>)1381declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)1382declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>)1383declare <4 x float> @llvm.maximum.v4f32(<4 x float>, <4 x float>)1384declare <4 x double> @llvm.maximum.v4f64(<4 x double>, <4 x double>)1385declare <4 x float> @llvm.minimum.v4f32(<4 x float>, <4 x float>)1386declare <4 x double> @llvm.minimum.v4f64(<4 x double>, <4 x double>)1387declare <4 x float> @llvm.copysign.v4f32(<4 x float>, <4 x float>)1388declare <4 x double> @llvm.copysign.v4f64(<4 x double>, <4 x double>)1389declare <4 x float> @llvm.floor.v4f32(<4 x float>)1390declare <4 x double> @llvm.floor.v4f64(<4 x double>)1391declare <4 x float> @llvm.ceil.v4f32(<4 x float>)1392declare <4 x double> @llvm.ceil.v4f64(<4 x double>)1393declare <4 x float> @llvm.trunc.v4f32(<4 x float>)1394declare <4 x double> @llvm.trunc.v4f64(<4 x double>)1395declare <4 x float> @llvm.rint.v4f32(<4 x float>)1396declare <4 x double> @llvm.rint.v4f64(<4 x double>)1397declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>)1398declare <4 x double> @llvm.nearbyint.v4f64(<4 x double>)1399declare <4 x float> @llvm.round.v4f32(<4 x float>)1400declare <4 x double> @llvm.round.v4f64(<4 x double>)1401 1402declare <4 x float> @llvm.x86.sse.rcp.ps(<4 x float>)1403declare <8 x float> @llvm.x86.avx.rcp.ps.256(<8 x float>)1404declare <4 x float> @llvm.x86.sse.rsqrt.ps(<4 x float>)1405declare <8 x float> @llvm.x86.avx.rsqrt.ps.256(<8 x float>)1406