1 ; Check VMX 128-bit integer operations
3 ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
4 ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -mattr=-vsx < %s | FileCheck %s
6 define <1 x i128> @test_add(<1 x i128> %x, <1 x i128> %y) nounwind {
7 %result = add <1 x i128> %x, %y
9 ; CHECK-LABEL: @test_add
10 ; CHECK: vadduqm 2, 2, 3
13 define <1 x i128> @increment_by_one(<1 x i128> %x) nounwind {
14 %result = add <1 x i128> %x, <i128 1>
15 ret <1 x i128> %result
16 ; CHECK-LABEL: @increment_by_one
17 ; CHECK: vadduqm 2, 2, 3
20 define <1 x i128> @increment_by_val(<1 x i128> %x, i128 %val) nounwind {
21 %tmpvec = insertelement <1 x i128> <i128 0>, i128 %val, i32 0
22 %tmpvec2 = insertelement <1 x i128> %tmpvec, i128 %val, i32 1
23 %result = add <1 x i128> %x, %tmpvec2
24 ret <1 x i128> %result
25 ; CHECK-LABEL: @increment_by_val
26 ; CHECK: vadduqm 2, 2, 3
29 define <1 x i128> @test_sub(<1 x i128> %x, <1 x i128> %y) nounwind {
30 %result = sub <1 x i128> %x, %y
31 ret <1 x i128> %result
32 ; CHECK-LABEL: @test_sub
33 ; CHECK: vsubuqm 2, 2, 3
36 define <1 x i128> @decrement_by_one(<1 x i128> %x) nounwind {
37 %result = sub <1 x i128> %x, <i128 1>
38 ret <1 x i128> %result
39 ; CHECK-LABEL: @decrement_by_one
40 ; CHECK: vsubuqm 2, 2, 3
43 define <1 x i128> @decrement_by_val(<1 x i128> %x, i128 %val) nounwind {
44 %tmpvec = insertelement <1 x i128> <i128 0>, i128 %val, i32 0
45 %tmpvec2 = insertelement <1 x i128> %tmpvec, i128 %val, i32 1
46 %result = sub <1 x i128> %x, %tmpvec2
47 ret <1 x i128> %result
48 ; CHECK-LABEL: @decrement_by_val
49 ; CHECK: vsubuqm 2, 2, 3
52 declare <1 x i128> @llvm.ppc.altivec.vaddeuqm(<1 x i128> %x,
54 <1 x i128> %z) nounwind readnone
55 declare <1 x i128> @llvm.ppc.altivec.vaddcuq(<1 x i128> %x,
56 <1 x i128> %y) nounwind readnone
57 declare <1 x i128> @llvm.ppc.altivec.vaddecuq(<1 x i128> %x,
59 <1 x i128> %z) nounwind readnone
60 declare <1 x i128> @llvm.ppc.altivec.vsubeuqm(<1 x i128> %x,
62 <1 x i128> %z) nounwind readnone
63 declare <1 x i128> @llvm.ppc.altivec.vsubcuq(<1 x i128> %x,
64 <1 x i128> %y) nounwind readnone
65 declare <1 x i128> @llvm.ppc.altivec.vsubecuq(<1 x i128> %x,
67 <1 x i128> %z) nounwind readnone
69 define <1 x i128> @test_vaddeuqm(<1 x i128> %x,
71 <1 x i128> %z) nounwind {
72 %tmp = tail call <1 x i128> @llvm.ppc.altivec.vaddeuqm(<1 x i128> %x,
76 ; CHECK-LABEL: @test_vaddeuqm
77 ; CHECK: vaddeuqm 2, 2, 3, 4
80 define <1 x i128> @test_vaddcuq(<1 x i128> %x,
81 <1 x i128> %y) nounwind {
82 %tmp = tail call <1 x i128> @llvm.ppc.altivec.vaddcuq(<1 x i128> %x,
85 ; CHECK-LABEL: @test_vaddcuq
86 ; CHECK: vaddcuq 2, 2, 3
89 define <1 x i128> @test_vaddecuq(<1 x i128> %x,
91 <1 x i128> %z) nounwind {
92 %tmp = tail call <1 x i128> @llvm.ppc.altivec.vaddecuq(<1 x i128> %x,
96 ; CHECK-LABEL: @test_vaddecuq
97 ; CHECK: vaddecuq 2, 2, 3, 4
100 define <1 x i128> @test_vsubeuqm(<1 x i128> %x,
102 <1 x i128> %z) nounwind {
103 %tmp = tail call <1 x i128> @llvm.ppc.altivec.vsubeuqm(<1 x i128> %x,
107 ; CHECK-LABEL: test_vsubeuqm
108 ; CHECK: vsubeuqm 2, 2, 3, 4
111 define <1 x i128> @test_vsubcuq(<1 x i128> %x,
112 <1 x i128> %y) nounwind {
113 %tmp = tail call <1 x i128> @llvm.ppc.altivec.vsubcuq(<1 x i128> %x,
116 ; CHECK-LABEL: test_vsubcuq
117 ; CHECK: vsubcuq 2, 2, 3
120 define <1 x i128> @test_vsubecuq(<1 x i128> %x,
122 <1 x i128> %z) nounwind {
123 %tmp = tail call <1 x i128> @llvm.ppc.altivec.vsubecuq(<1 x i128> %x,
127 ; CHECK-LABEL: test_vsubecuq
128 ; CHECK: vsubecuq 2, 2, 3, 4