1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-darwin -mattr=+mmx,+sse2 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i64 @t0(x86_mmx* %p) { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t0: 5*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddq %mm0, %mm0 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %mm0, %rax 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 10*9880d681SAndroid Build Coastguard Worker %t = load x86_mmx, x86_mmx* %p 11*9880d681SAndroid Build Coastguard Worker %u = tail call x86_mmx @llvm.x86.mmx.padd.q(x86_mmx %t, x86_mmx %t) 12*9880d681SAndroid Build Coastguard Worker %s = bitcast x86_mmx %u to i64 13*9880d681SAndroid Build Coastguard Worker ret i64 %s 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine i64 @t1(x86_mmx* %p) { 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1: 18*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddd %mm0, %mm0 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %mm0, %rax 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 23*9880d681SAndroid Build Coastguard Worker %t = load x86_mmx, x86_mmx* %p 24*9880d681SAndroid Build Coastguard Worker %u = tail call x86_mmx @llvm.x86.mmx.padd.d(x86_mmx %t, x86_mmx %t) 25*9880d681SAndroid Build Coastguard Worker %s = bitcast x86_mmx %u to i64 26*9880d681SAndroid Build Coastguard Worker ret i64 %s 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i64 @t2(x86_mmx* %p) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2: 31*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddw %mm0, %mm0 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %mm0, %rax 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 36*9880d681SAndroid Build Coastguard Worker %t = load x86_mmx, x86_mmx* %p 37*9880d681SAndroid Build Coastguard Worker %u = tail call x86_mmx @llvm.x86.mmx.padd.w(x86_mmx %t, x86_mmx %t) 38*9880d681SAndroid Build Coastguard Worker %s = bitcast x86_mmx %u to i64 39*9880d681SAndroid Build Coastguard Worker ret i64 %s 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine i64 @t3(x86_mmx* %p) { 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3: 44*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddb %mm0, %mm0 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %mm0, %rax 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 49*9880d681SAndroid Build Coastguard Worker %t = load x86_mmx, x86_mmx* %p 50*9880d681SAndroid Build Coastguard Worker %u = tail call x86_mmx @llvm.x86.mmx.padd.b(x86_mmx %t, x86_mmx %t) 51*9880d681SAndroid Build Coastguard Worker %s = bitcast x86_mmx %u to i64 52*9880d681SAndroid Build Coastguard Worker ret i64 %s 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker@R = external global x86_mmx 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine void @t4(<1 x i64> %A, <1 x i64> %B) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4: 59*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: ## %entry 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd 62*9880d681SAndroid Build Coastguard Worker; CHECK: retq 63*9880d681SAndroid Build Coastguard Workerentry: 64*9880d681SAndroid Build Coastguard Worker %tmp2 = bitcast <1 x i64> %A to x86_mmx 65*9880d681SAndroid Build Coastguard Worker %tmp3 = bitcast <1 x i64> %B to x86_mmx 66*9880d681SAndroid Build Coastguard Worker %tmp7 = tail call x86_mmx @llvm.x86.mmx.paddus.w(x86_mmx %tmp2, x86_mmx %tmp3) 67*9880d681SAndroid Build Coastguard Worker store x86_mmx %tmp7, x86_mmx* @R 68*9880d681SAndroid Build Coastguard Worker tail call void @llvm.x86.mmx.emms() 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i64 @t5(i32 %a, i32 %b) nounwind readnone { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5: 74*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %xmm1, %rax 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 80*9880d681SAndroid Build Coastguard Worker %v0 = insertelement <2 x i32> undef, i32 %a, i32 0 81*9880d681SAndroid Build Coastguard Worker %v1 = insertelement <2 x i32> %v0, i32 %b, i32 1 82*9880d681SAndroid Build Coastguard Worker %conv = bitcast <2 x i32> %v1 to i64 83*9880d681SAndroid Build Coastguard Worker ret i64 %conv 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerdeclare x86_mmx @llvm.x86.mmx.pslli.q(x86_mmx, i32) 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @t6(i64 %t) { 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t6: 90*9880d681SAndroid Build Coastguard Worker; CHECK: ## BB#0: 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psllq $48, %mm0 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movd %mm0, %rax 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 95*9880d681SAndroid Build Coastguard Worker %t1 = insertelement <1 x i64> undef, i64 %t, i32 0 96*9880d681SAndroid Build Coastguard Worker %t0 = bitcast <1 x i64> %t1 to x86_mmx 97*9880d681SAndroid Build Coastguard Worker %t2 = tail call x86_mmx @llvm.x86.mmx.pslli.q(x86_mmx %t0, i32 48) 98*9880d681SAndroid Build Coastguard Worker %t3 = bitcast x86_mmx %t2 to <1 x i64> 99*9880d681SAndroid Build Coastguard Worker ret <1 x i64> %t3 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdeclare x86_mmx @llvm.x86.mmx.paddus.w(x86_mmx, x86_mmx) 103*9880d681SAndroid Build Coastguard Workerdeclare x86_mmx @llvm.x86.mmx.padd.b(x86_mmx, x86_mmx) 104*9880d681SAndroid Build Coastguard Workerdeclare x86_mmx @llvm.x86.mmx.padd.w(x86_mmx, x86_mmx) 105*9880d681SAndroid Build Coastguard Workerdeclare x86_mmx @llvm.x86.mmx.padd.d(x86_mmx, x86_mmx) 106*9880d681SAndroid Build Coastguard Workerdeclare x86_mmx @llvm.x86.mmx.padd.q(x86_mmx, x86_mmx) 107*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.x86.mmx.emms() 108*9880d681SAndroid Build Coastguard Worker 109