brintos

brintos / llvm-project-archived public Read only

0
0
Text · 42.2 KiB · 1706f17 Raw
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