1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -fast-isel -mtriple=i386-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefix=ALL --check-prefix=X32 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefix=ALL --check-prefix=X64 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/sse3-builtins.c 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_mm_addsub_pd(<2 x double> %a0, <2 x double> %a1) { 8*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_addsub_pd: 9*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 10*9880d681SAndroid Build Coastguard Worker; X32-NEXT: addsubpd %xmm1, %xmm0 11*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 12*9880d681SAndroid Build Coastguard Worker; 13*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_addsub_pd: 14*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 15*9880d681SAndroid Build Coastguard Worker; X64-NEXT: addsubpd %xmm1, %xmm0 16*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 17*9880d681SAndroid Build Coastguard Worker %res = call <2 x double> @llvm.x86.sse3.addsub.pd(<2 x double> %a0, <2 x double> %a1) 18*9880d681SAndroid Build Coastguard Worker ret <2 x double> %res 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.sse3.addsub.pd(<2 x double>, <2 x double>) nounwind readnone 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_mm_addsub_ps(<4 x float> %a0, <4 x float> %a1) { 23*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_addsub_ps: 24*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 25*9880d681SAndroid Build Coastguard Worker; X32-NEXT: addsubps %xmm1, %xmm0 26*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 27*9880d681SAndroid Build Coastguard Worker; 28*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_addsub_ps: 29*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 30*9880d681SAndroid Build Coastguard Worker; X64-NEXT: addsubps %xmm1, %xmm0 31*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 32*9880d681SAndroid Build Coastguard Worker %res = call <4 x float> @llvm.x86.sse3.addsub.ps(<4 x float> %a0, <4 x float> %a1) 33*9880d681SAndroid Build Coastguard Worker ret <4 x float> %res 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.sse3.addsub.ps(<4 x float>, <4 x float>) nounwind readnone 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_mm_hadd_pd(<2 x double> %a0, <2 x double> %a1) { 38*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_hadd_pd: 39*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 40*9880d681SAndroid Build Coastguard Worker; X32-NEXT: haddpd %xmm1, %xmm0 41*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 42*9880d681SAndroid Build Coastguard Worker; 43*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_hadd_pd: 44*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 45*9880d681SAndroid Build Coastguard Worker; X64-NEXT: haddpd %xmm1, %xmm0 46*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 47*9880d681SAndroid Build Coastguard Worker %res = call <2 x double> @llvm.x86.sse3.hadd.pd(<2 x double> %a0, <2 x double> %a1) 48*9880d681SAndroid Build Coastguard Worker ret <2 x double> %res 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.sse3.hadd.pd(<2 x double>, <2 x double>) nounwind readnone 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_mm_hadd_ps(<4 x float> %a0, <4 x float> %a1) { 53*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_hadd_ps: 54*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 55*9880d681SAndroid Build Coastguard Worker; X32-NEXT: haddps %xmm1, %xmm0 56*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 57*9880d681SAndroid Build Coastguard Worker; 58*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_hadd_ps: 59*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 60*9880d681SAndroid Build Coastguard Worker; X64-NEXT: haddps %xmm1, %xmm0 61*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 62*9880d681SAndroid Build Coastguard Worker %res = call <4 x float> @llvm.x86.sse3.hadd.ps(<4 x float> %a0, <4 x float> %a1) 63*9880d681SAndroid Build Coastguard Worker ret <4 x float> %res 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.sse3.hadd.ps(<4 x float>, <4 x float>) nounwind readnone 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_mm_hsub_pd(<2 x double> %a0, <2 x double> %a1) { 68*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_hsub_pd: 69*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 70*9880d681SAndroid Build Coastguard Worker; X32-NEXT: hsubpd %xmm1, %xmm0 71*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 72*9880d681SAndroid Build Coastguard Worker; 73*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_hsub_pd: 74*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 75*9880d681SAndroid Build Coastguard Worker; X64-NEXT: hsubpd %xmm1, %xmm0 76*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 77*9880d681SAndroid Build Coastguard Worker %res = call <2 x double> @llvm.x86.sse3.hsub.pd(<2 x double> %a0, <2 x double> %a1) 78*9880d681SAndroid Build Coastguard Worker ret <2 x double> %res 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.sse3.hsub.pd(<2 x double>, <2 x double>) nounwind readnone 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_mm_hsub_ps(<4 x float> %a0, <4 x float> %a1) { 83*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_hsub_ps: 84*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 85*9880d681SAndroid Build Coastguard Worker; X32-NEXT: hsubps %xmm1, %xmm0 86*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 87*9880d681SAndroid Build Coastguard Worker; 88*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_hsub_ps: 89*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 90*9880d681SAndroid Build Coastguard Worker; X64-NEXT: hsubps %xmm1, %xmm0 91*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 92*9880d681SAndroid Build Coastguard Worker %res = call <4 x float> @llvm.x86.sse3.hsub.ps(<4 x float> %a0, <4 x float> %a1) 93*9880d681SAndroid Build Coastguard Worker ret <4 x float> %res 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.sse3.hsub.ps(<4 x float>, <4 x float>) nounwind readnone 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_mm_lddqu_si128(<2 x i64>* %a0) { 98*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_lddqu_si128: 99*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 100*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 101*9880d681SAndroid Build Coastguard Worker; X32-NEXT: lddqu (%eax), %xmm0 102*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 103*9880d681SAndroid Build Coastguard Worker; 104*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_lddqu_si128: 105*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 106*9880d681SAndroid Build Coastguard Worker; X64-NEXT: lddqu (%rdi), %xmm0 107*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 108*9880d681SAndroid Build Coastguard Worker %bc = bitcast <2 x i64>* %a0 to i8* 109*9880d681SAndroid Build Coastguard Worker %call = call <16 x i8> @llvm.x86.sse3.ldu.dq(i8* %bc) 110*9880d681SAndroid Build Coastguard Worker %res = bitcast <16 x i8> %call to <2 x i64> 111*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %res 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Workerdeclare <16 x i8> @llvm.x86.sse3.ldu.dq(i8*) nounwind readonly 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_mm_loaddup_pd(double* %a0) { 116*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_loaddup_pd: 117*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 118*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 119*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movddup {{.*#+}} xmm0 = mem[0,0] 120*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 121*9880d681SAndroid Build Coastguard Worker; 122*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_loaddup_pd: 123*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 124*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movddup {{.*#+}} xmm0 = mem[0,0] 125*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 126*9880d681SAndroid Build Coastguard Worker %ld = load double, double* %a0 127*9880d681SAndroid Build Coastguard Worker %res0 = insertelement <2 x double> undef, double %ld, i32 0 128*9880d681SAndroid Build Coastguard Worker %res1 = insertelement <2 x double> %res0, double %ld, i32 1 129*9880d681SAndroid Build Coastguard Worker ret <2 x double> %res1 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_mm_movedup_pd(<2 x double> %a0) { 133*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_movedup_pd: 134*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 135*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 136*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 137*9880d681SAndroid Build Coastguard Worker; 138*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_movedup_pd: 139*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 140*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 141*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 142*9880d681SAndroid Build Coastguard Worker %res = shufflevector <2 x double> %a0, <2 x double> %a0, <2 x i32> zeroinitializer 143*9880d681SAndroid Build Coastguard Worker ret <2 x double> %res 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_mm_movehdup_ps(<4 x float> %a0) { 147*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_movehdup_ps: 148*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 149*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 150*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 151*9880d681SAndroid Build Coastguard Worker; 152*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_movehdup_ps: 153*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 154*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 155*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 156*9880d681SAndroid Build Coastguard Worker %res = shufflevector <4 x float> %a0, <4 x float> %a0, <4 x i32> <i32 1, i32 1, i32 3, i32 3> 157*9880d681SAndroid Build Coastguard Worker ret <4 x float> %res 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_mm_moveldup_ps(<4 x float> %a0) { 161*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test_mm_moveldup_ps: 162*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 163*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2] 164*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 165*9880d681SAndroid Build Coastguard Worker; 166*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test_mm_moveldup_ps: 167*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 168*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movsldup {{.*#+}} xmm0 = xmm0[0,0,2,2] 169*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 170*9880d681SAndroid Build Coastguard Worker %res = shufflevector <4 x float> %a0, <4 x float> %a0, <4 x i32> <i32 0, i32 0, i32 2, i32 2> 171*9880d681SAndroid Build Coastguard Worker ret <4 x float> %res 172*9880d681SAndroid Build Coastguard Worker} 173