xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/vaddsplat.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -mcpu=pwr7 <%s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test optimizations of build_vector for 6-bit immediates.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
6*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu"
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker%v4i32 = type <4 x i32>
9*9880d681SAndroid Build Coastguard Worker%v8i16 = type <8 x i16>
10*9880d681SAndroid Build Coastguard Worker%v16i8 = type <16 x i8>
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine void @test_v4i32_pos_even(%v4i32* %P, %v4i32* %S) {
13*9880d681SAndroid Build Coastguard Worker       %p = load %v4i32, %v4i32* %P
14*9880d681SAndroid Build Coastguard Worker       %r = add %v4i32 %p, < i32 18, i32 18, i32 18, i32 18 >
15*9880d681SAndroid Build Coastguard Worker       store %v4i32 %r, %v4i32* %S
16*9880d681SAndroid Build Coastguard Worker       ret void
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v4i32_pos_even:
20*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG1:[0-9]+]], 9
21*9880d681SAndroid Build Coastguard Worker; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG1]]
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine void @test_v4i32_neg_even(%v4i32* %P, %v4i32* %S) {
24*9880d681SAndroid Build Coastguard Worker       %p = load %v4i32, %v4i32* %P
25*9880d681SAndroid Build Coastguard Worker       %r = add %v4i32 %p, < i32 -28, i32 -28, i32 -28, i32 -28 >
26*9880d681SAndroid Build Coastguard Worker       store %v4i32 %r, %v4i32* %S
27*9880d681SAndroid Build Coastguard Worker       ret void
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v4i32_neg_even:
31*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG1:[0-9]+]], -14
32*9880d681SAndroid Build Coastguard Worker; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG1]]
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdefine void @test_v8i16_pos_even(%v8i16* %P, %v8i16* %S) {
35*9880d681SAndroid Build Coastguard Worker       %p = load %v8i16, %v8i16* %P
36*9880d681SAndroid Build Coastguard Worker       %r = add %v8i16 %p, < i16 30, i16 30, i16 30, i16 30, i16 30, i16 30, i16 30, i16 30 >
37*9880d681SAndroid Build Coastguard Worker       store %v8i16 %r, %v8i16* %S
38*9880d681SAndroid Build Coastguard Worker       ret void
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v8i16_pos_even:
42*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG1:[0-9]+]], 15
43*9880d681SAndroid Build Coastguard Worker; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG1]]
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine void @test_v8i16_neg_even(%v8i16* %P, %v8i16* %S) {
46*9880d681SAndroid Build Coastguard Worker       %p = load %v8i16, %v8i16* %P
47*9880d681SAndroid Build Coastguard Worker       %r = add %v8i16 %p, < i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32 >
48*9880d681SAndroid Build Coastguard Worker       store %v8i16 %r, %v8i16* %S
49*9880d681SAndroid Build Coastguard Worker       ret void
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v8i16_neg_even:
53*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG1:[0-9]+]], -16
54*9880d681SAndroid Build Coastguard Worker; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG1]]
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine void @test_v16i8_pos_even(%v16i8* %P, %v16i8* %S) {
57*9880d681SAndroid Build Coastguard Worker       %p = load %v16i8, %v16i8* %P
58*9880d681SAndroid Build Coastguard Worker       %r = add %v16i8 %p, < i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16 >
59*9880d681SAndroid Build Coastguard Worker       store %v16i8 %r, %v16i8* %S
60*9880d681SAndroid Build Coastguard Worker       ret void
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v16i8_pos_even:
64*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG1:[0-9]+]], 8
65*9880d681SAndroid Build Coastguard Worker; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG1]]
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine void @test_v16i8_neg_even(%v16i8* %P, %v16i8* %S) {
68*9880d681SAndroid Build Coastguard Worker       %p = load %v16i8, %v16i8* %P
69*9880d681SAndroid Build Coastguard Worker       %r = add %v16i8 %p, < i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18 >
70*9880d681SAndroid Build Coastguard Worker       store %v16i8 %r, %v16i8* %S
71*9880d681SAndroid Build Coastguard Worker       ret void
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v16i8_neg_even:
75*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG1:[0-9]+]], -9
76*9880d681SAndroid Build Coastguard Worker; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG1]]
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine void @test_v4i32_pos_odd(%v4i32* %P, %v4i32* %S) {
79*9880d681SAndroid Build Coastguard Worker       %p = load %v4i32, %v4i32* %P
80*9880d681SAndroid Build Coastguard Worker       %r = add %v4i32 %p, < i32 27, i32 27, i32 27, i32 27 >
81*9880d681SAndroid Build Coastguard Worker       store %v4i32 %r, %v4i32* %S
82*9880d681SAndroid Build Coastguard Worker       ret void
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v4i32_pos_odd:
86*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG2:[0-9]+]], -16
87*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG1:[0-9]+]], 11
88*9880d681SAndroid Build Coastguard Worker; CHECK: vsubuwm {{[0-9]+}}, [[REG1]], [[REG2]]
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine void @test_v4i32_neg_odd(%v4i32* %P, %v4i32* %S) {
91*9880d681SAndroid Build Coastguard Worker       %p = load %v4i32, %v4i32* %P
92*9880d681SAndroid Build Coastguard Worker       %r = add %v4i32 %p, < i32 -27, i32 -27, i32 -27, i32 -27 >
93*9880d681SAndroid Build Coastguard Worker       store %v4i32 %r, %v4i32* %S
94*9880d681SAndroid Build Coastguard Worker       ret void
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v4i32_neg_odd:
98*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG2:[0-9]+]], -16
99*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG1:[0-9]+]], -11
100*9880d681SAndroid Build Coastguard Worker; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG2]]
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerdefine void @test_v8i16_pos_odd(%v8i16* %P, %v8i16* %S) {
103*9880d681SAndroid Build Coastguard Worker       %p = load %v8i16, %v8i16* %P
104*9880d681SAndroid Build Coastguard Worker       %r = add %v8i16 %p, < i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31 >
105*9880d681SAndroid Build Coastguard Worker       store %v8i16 %r, %v8i16* %S
106*9880d681SAndroid Build Coastguard Worker       ret void
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v8i16_pos_odd:
110*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG2:[0-9]+]], -16
111*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG1:[0-9]+]], 15
112*9880d681SAndroid Build Coastguard Worker; CHECK: vsubuhm {{[0-9]+}}, [[REG1]], [[REG2]]
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine void @test_v8i16_neg_odd(%v8i16* %P, %v8i16* %S) {
115*9880d681SAndroid Build Coastguard Worker       %p = load %v8i16, %v8i16* %P
116*9880d681SAndroid Build Coastguard Worker       %r = add %v8i16 %p, < i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31 >
117*9880d681SAndroid Build Coastguard Worker       store %v8i16 %r, %v8i16* %S
118*9880d681SAndroid Build Coastguard Worker       ret void
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v8i16_neg_odd:
122*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG2:[0-9]+]], -16
123*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG1:[0-9]+]], -15
124*9880d681SAndroid Build Coastguard Worker; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG2]]
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine void @test_v16i8_pos_odd(%v16i8* %P, %v16i8* %S) {
127*9880d681SAndroid Build Coastguard Worker       %p = load %v16i8, %v16i8* %P
128*9880d681SAndroid Build Coastguard Worker       %r = add %v16i8 %p, < i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17 >
129*9880d681SAndroid Build Coastguard Worker       store %v16i8 %r, %v16i8* %S
130*9880d681SAndroid Build Coastguard Worker       ret void
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v16i8_pos_odd:
134*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG2:[0-9]+]], -16
135*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG1:[0-9]+]], 1
136*9880d681SAndroid Build Coastguard Worker; CHECK: vsububm {{[0-9]+}}, [[REG1]], [[REG2]]
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine void @test_v16i8_neg_odd(%v16i8* %P, %v16i8* %S) {
139*9880d681SAndroid Build Coastguard Worker       %p = load %v16i8, %v16i8* %P
140*9880d681SAndroid Build Coastguard Worker       %r = add %v16i8 %p, < i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17 >
141*9880d681SAndroid Build Coastguard Worker       store %v16i8 %r, %v16i8* %S
142*9880d681SAndroid Build Coastguard Worker       ret void
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v16i8_neg_odd:
146*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG2:[0-9]+]], -16
147*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG1:[0-9]+]], -1
148*9880d681SAndroid Build Coastguard Worker; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG2]]
149*9880d681SAndroid Build Coastguard Worker
150