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