brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · 37e0621 Raw
141 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-macosx -mattr=+sse2 -mcpu=nehalem | FileCheck %s3 4; rdar: 125588385; PR142216; There is a mismatch between the intrinsic and the actual instruction.7; The actual instruction has a partial update of dest, while the intrinsic8; passes through the upper FP values. Here, we make sure the source and9; destination of each scalar unary op are the same.10 11define void @rsqrtss(<4 x float> %a) nounwind uwtable ssp {12; CHECK-LABEL: rsqrtss:13; CHECK:       ## %bb.0:14; CHECK-NEXT:    rsqrtss %xmm0, %xmm015; CHECK-NEXT:    cvtss2sd %xmm0, %xmm216; CHECK-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]17; CHECK-NEXT:    cvtss2sd %xmm0, %xmm118; CHECK-NEXT:    movaps %xmm2, %xmm019; CHECK-NEXT:    jmp _callee ## TAILCALL20  %t0 = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %a) nounwind21  %a.addr.0.extract = extractelement <4 x float> %t0, i32 022  %conv = fpext float %a.addr.0.extract to double23  %a.addr.4.extract = extractelement <4 x float> %t0, i32 124  %conv3 = fpext float %a.addr.4.extract to double25  tail call void @callee(double %conv, double %conv3) nounwind26  ret void27}28declare void @callee(double, double)29declare <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float>) nounwind readnone30 31define void @rcpss(<4 x float> %a) nounwind uwtable ssp {32; CHECK-LABEL: rcpss:33; CHECK:       ## %bb.0:34; CHECK-NEXT:    rcpss %xmm0, %xmm035; CHECK-NEXT:    cvtss2sd %xmm0, %xmm236; CHECK-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]37; CHECK-NEXT:    cvtss2sd %xmm0, %xmm138; CHECK-NEXT:    movaps %xmm2, %xmm039; CHECK-NEXT:    jmp _callee ## TAILCALL40  %t0 = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %a) nounwind41  %a.addr.0.extract = extractelement <4 x float> %t0, i32 042  %conv = fpext float %a.addr.0.extract to double43  %a.addr.4.extract = extractelement <4 x float> %t0, i32 144  %conv3 = fpext float %a.addr.4.extract to double45  tail call void @callee(double %conv, double %conv3) nounwind46  ret void47}48declare <4 x float> @llvm.x86.sse.rcp.ss(<4 x float>) nounwind readnone49 50define void @sqrtss(<4 x float> %a) nounwind uwtable ssp {51; CHECK-LABEL: sqrtss:52; CHECK:       ## %bb.0:53; CHECK-NEXT:    sqrtss %xmm0, %xmm154; CHECK-NEXT:    cvtss2sd %xmm1, %xmm255; CHECK-NEXT:    movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]56; CHECK-NEXT:    xorps %xmm1, %xmm157; CHECK-NEXT:    cvtss2sd %xmm0, %xmm158; CHECK-NEXT:    movaps %xmm2, %xmm059; CHECK-NEXT:    jmp _callee ## TAILCALL60  %t0 = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %a) nounwind61  %a.addr.0.extract = extractelement <4 x float> %t0, i32 062  %conv = fpext float %a.addr.0.extract to double63  %a.addr.4.extract = extractelement <4 x float> %t0, i32 164  %conv3 = fpext float %a.addr.4.extract to double65  tail call void @callee(double %conv, double %conv3) nounwind66  ret void67}68declare <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float>) nounwind readnone69 70define void @sqrtsd(<2 x double> %a) nounwind uwtable ssp {71; CHECK-LABEL: sqrtsd:72; CHECK:       ## %bb.0:73; CHECK-NEXT:    sqrtsd %xmm0, %xmm174; CHECK-NEXT:    cvtsd2ss %xmm1, %xmm275; CHECK-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1,1]76; CHECK-NEXT:    xorps %xmm1, %xmm177; CHECK-NEXT:    cvtsd2ss %xmm0, %xmm178; CHECK-NEXT:    movaps %xmm2, %xmm079; CHECK-NEXT:    jmp _callee2 ## TAILCALL80  %t0 = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %a) nounwind81  %a0 = extractelement <2 x double> %t0, i32 082  %conv = fptrunc double %a0 to float83  %a1 = extractelement <2 x double> %t0, i32 184  %conv3 = fptrunc double %a1 to float85  tail call void @callee2(float %conv, float %conv3) nounwind86  ret void87}88 89declare void @callee2(float, float)90declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone91 92define <2 x double> @load_fold_cvtss2sd_int(ptr%a) {93; CHECK-LABEL: load_fold_cvtss2sd_int:94; CHECK:       ## %bb.0:95; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero96; CHECK-NEXT:    cvtss2sd %xmm0, %xmm097; CHECK-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero98; CHECK-NEXT:    retq99  %ld = load <4 x float>, ptr%a100  %x = call <2 x double> @llvm.x86.sse2.cvtss2sd(<2 x double> <double 0x0, double 0x0>, <4 x float> %ld)101  ret <2 x double> %x102}103 104define <2 x double> @load_fold_cvtss2sd_int_optsize(ptr%a) optsize {105; CHECK-LABEL: load_fold_cvtss2sd_int_optsize:106; CHECK:       ## %bb.0:107; CHECK-NEXT:    cvtss2sd (%rdi), %xmm0108; CHECK-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero109; CHECK-NEXT:    retq110  %ld = load <4 x float>, ptr%a111  %x = call <2 x double> @llvm.x86.sse2.cvtss2sd(<2 x double> <double 0x0, double 0x0>, <4 x float> %ld)112  ret <2 x double> %x113}114 115define <2 x double> @load_fold_cvtss2sd_int_minsize(ptr%a) minsize {116; CHECK-LABEL: load_fold_cvtss2sd_int_minsize:117; CHECK:       ## %bb.0:118; CHECK-NEXT:    cvtss2sd (%rdi), %xmm0119; CHECK-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero120; CHECK-NEXT:    retq121  %ld = load <4 x float>, ptr%a122  %x = call <2 x double> @llvm.x86.sse2.cvtss2sd(<2 x double> <double 0x0, double 0x0>, <4 x float> %ld)123  ret <2 x double> %x124}125 126declare <2 x double> @llvm.x86.sse2.cvtss2sd(<2 x double>, <4 x float>) nounwind readnone127 128define float @PR22206(<4 x float> %a) {129; CHECK-LABEL: PR22206:130; CHECK:       ## %bb.0:131; CHECK-NEXT:    sqrtss %xmm0, %xmm1132; CHECK-NEXT:    addss %xmm1, %xmm0133; CHECK-NEXT:    retq134  %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %a) nounwind135  %new = extractelement <4 x float> %res, i32 0136  %orig = extractelement <4 x float> %a, i32 0137  %add = fadd float %new, %orig138  ret float %add139}140 141