xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/fast-isel-load-store.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; FIXME: FastISel currently returns false if it hits code that uses VSX
2*9880d681SAndroid Build Coastguard Worker; registers and with -fast-isel-abort=1 turned on the test case will then fail.
3*9880d681SAndroid Build Coastguard Worker; When fastisel better supports VSX fix up this test case.
4*9880d681SAndroid Build Coastguard Worker;
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel -fast-isel-abort=1 -mattr=-vsx -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s --check-prefix=ELF64
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; This test verifies that load/store instructions are properly generated,
8*9880d681SAndroid Build Coastguard Worker; and that they pass MI verification.
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker@a = global i8 1, align 1
11*9880d681SAndroid Build Coastguard Worker@b = global i16 2, align 2
12*9880d681SAndroid Build Coastguard Worker@c = global i32 4, align 4
13*9880d681SAndroid Build Coastguard Worker@d = global i64 8, align 8
14*9880d681SAndroid Build Coastguard Worker@e = global float 1.25, align 4
15*9880d681SAndroid Build Coastguard Worker@f = global double 3.5, align 8
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker%struct.s = type<{ i8, i32 }>
18*9880d681SAndroid Build Coastguard Worker%struct.t = type<{ i8, i64 }>
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker@g = global %struct.s <{ i8 1, i32 2 }>, align 1
21*9880d681SAndroid Build Coastguard Worker@h = global %struct.t <{ i8 1, i64 2 }>, align 1
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker@i = common global [8192 x i64] zeroinitializer, align 8
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; load
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine i8 @t1() nounwind {
28*9880d681SAndroid Build Coastguard Worker; ELF64: t1
29*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* @a, align 1
30*9880d681SAndroid Build Coastguard Worker; ELF64: lbz
31*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i8 %1, 1
32*9880d681SAndroid Build Coastguard Worker; ELF64: addi
33*9880d681SAndroid Build Coastguard Worker  ret i8 %2
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdefine i16 @t2() nounwind {
37*9880d681SAndroid Build Coastguard Worker; ELF64: t2
38*9880d681SAndroid Build Coastguard Worker  %1 = load i16, i16* @b, align 2
39*9880d681SAndroid Build Coastguard Worker; ELF64: lhz
40*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i16 %1, 1
41*9880d681SAndroid Build Coastguard Worker; ELF64: addi
42*9880d681SAndroid Build Coastguard Worker  ret i16 %2
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine i32 @t3() nounwind {
46*9880d681SAndroid Build Coastguard Worker; ELF64: t3
47*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @c, align 4
48*9880d681SAndroid Build Coastguard Worker; ELF64: lwz
49*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i32 %1, 1
50*9880d681SAndroid Build Coastguard Worker; ELF64: addi
51*9880d681SAndroid Build Coastguard Worker  ret i32 %2
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i64 @t4() nounwind {
55*9880d681SAndroid Build Coastguard Worker; ELF64: t4
56*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* @d, align 4
57*9880d681SAndroid Build Coastguard Worker; ELF64: ld
58*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %1, 1
59*9880d681SAndroid Build Coastguard Worker; ELF64: addi
60*9880d681SAndroid Build Coastguard Worker  ret i64 %2
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine float @t5() nounwind {
64*9880d681SAndroid Build Coastguard Worker; ELF64: t5
65*9880d681SAndroid Build Coastguard Worker  %1 = load float, float* @e, align 4
66*9880d681SAndroid Build Coastguard Worker; ELF64: lfs
67*9880d681SAndroid Build Coastguard Worker  %2 = fadd float %1, 1.0
68*9880d681SAndroid Build Coastguard Worker; ELF64: fadds
69*9880d681SAndroid Build Coastguard Worker  ret float %2
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine double @t6() nounwind {
73*9880d681SAndroid Build Coastguard Worker; ELF64: t6
74*9880d681SAndroid Build Coastguard Worker  %1 = load double, double* @f, align 8
75*9880d681SAndroid Build Coastguard Worker; ELF64: lfd
76*9880d681SAndroid Build Coastguard Worker  %2 = fadd double %1, 1.0
77*9880d681SAndroid Build Coastguard Worker; ELF64: fadd
78*9880d681SAndroid Build Coastguard Worker  ret double %2
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; store
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine void @t7(i8 %v) nounwind {
84*9880d681SAndroid Build Coastguard Worker; ELF64: t7
85*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i8 %v, 1
86*9880d681SAndroid Build Coastguard Worker  store i8 %1, i8* @a, align 1
87*9880d681SAndroid Build Coastguard Worker; ELF64: addis
88*9880d681SAndroid Build Coastguard Worker; ELF64: addi
89*9880d681SAndroid Build Coastguard Worker; ELF64: addi
90*9880d681SAndroid Build Coastguard Worker; ELF64: stb
91*9880d681SAndroid Build Coastguard Worker  ret void
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine void @t8(i16 %v) nounwind {
95*9880d681SAndroid Build Coastguard Worker; ELF64: t8
96*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i16 %v, 1
97*9880d681SAndroid Build Coastguard Worker  store i16 %1, i16* @b, align 2
98*9880d681SAndroid Build Coastguard Worker; ELF64: addis
99*9880d681SAndroid Build Coastguard Worker; ELF64: addi
100*9880d681SAndroid Build Coastguard Worker; ELF64: addi
101*9880d681SAndroid Build Coastguard Worker; ELF64: sth
102*9880d681SAndroid Build Coastguard Worker  ret void
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine void @t9(i32 %v) nounwind {
106*9880d681SAndroid Build Coastguard Worker; ELF64: t9
107*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i32 %v, 1
108*9880d681SAndroid Build Coastguard Worker  store i32 %1, i32* @c, align 4
109*9880d681SAndroid Build Coastguard Worker; ELF64: addis
110*9880d681SAndroid Build Coastguard Worker; ELF64: addi
111*9880d681SAndroid Build Coastguard Worker; ELF64: addi
112*9880d681SAndroid Build Coastguard Worker; ELF64: stw
113*9880d681SAndroid Build Coastguard Worker  ret void
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerdefine void @t10(i64 %v) nounwind {
117*9880d681SAndroid Build Coastguard Worker; ELF64: t10
118*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %v, 1
119*9880d681SAndroid Build Coastguard Worker  store i64 %1, i64* @d, align 4
120*9880d681SAndroid Build Coastguard Worker; ELF64: addis
121*9880d681SAndroid Build Coastguard Worker; ELF64: addi
122*9880d681SAndroid Build Coastguard Worker; ELF64: addi
123*9880d681SAndroid Build Coastguard Worker; ELF64: std
124*9880d681SAndroid Build Coastguard Worker  ret void
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdefine void @t11(float %v) nounwind {
128*9880d681SAndroid Build Coastguard Worker; ELF64: t11
129*9880d681SAndroid Build Coastguard Worker  %1 = fadd float %v, 1.0
130*9880d681SAndroid Build Coastguard Worker  store float %1, float* @e, align 4
131*9880d681SAndroid Build Coastguard Worker; ELF64: fadds
132*9880d681SAndroid Build Coastguard Worker; ELF64: stfs
133*9880d681SAndroid Build Coastguard Worker  ret void
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdefine void @t12(double %v) nounwind {
137*9880d681SAndroid Build Coastguard Worker; ELF64: t12
138*9880d681SAndroid Build Coastguard Worker  %1 = fadd double %v, 1.0
139*9880d681SAndroid Build Coastguard Worker  store double %1, double* @f, align 8
140*9880d681SAndroid Build Coastguard Worker; ELF64: fadd
141*9880d681SAndroid Build Coastguard Worker; ELF64: stfd
142*9880d681SAndroid Build Coastguard Worker  ret void
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker;; lwa requires an offset divisible by 4, so we need lwax here.
146*9880d681SAndroid Build Coastguard Workerdefine i64 @t13() nounwind {
147*9880d681SAndroid Build Coastguard Worker; ELF64: t13
148*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* getelementptr inbounds (%struct.s, %struct.s* @g, i32 0, i32 1), align 1
149*9880d681SAndroid Build Coastguard Worker  %2 = sext i32 %1 to i64
150*9880d681SAndroid Build Coastguard Worker; ELF64: li
151*9880d681SAndroid Build Coastguard Worker; ELF64: lwax
152*9880d681SAndroid Build Coastguard Worker  %3 = add nsw i64 %2, 1
153*9880d681SAndroid Build Coastguard Worker; ELF64: addi
154*9880d681SAndroid Build Coastguard Worker  ret i64 %3
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker;; ld requires an offset divisible by 4, so we need ldx here.
158*9880d681SAndroid Build Coastguard Workerdefine i64 @t14() nounwind {
159*9880d681SAndroid Build Coastguard Worker; ELF64: t14
160*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* getelementptr inbounds (%struct.t, %struct.t* @h, i32 0, i32 1), align 1
161*9880d681SAndroid Build Coastguard Worker; ELF64: li
162*9880d681SAndroid Build Coastguard Worker; ELF64: ldx
163*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %1, 1
164*9880d681SAndroid Build Coastguard Worker; ELF64: addi
165*9880d681SAndroid Build Coastguard Worker  ret i64 %2
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker;; std requires an offset divisible by 4, so we need stdx here.
169*9880d681SAndroid Build Coastguard Workerdefine void @t15(i64 %v) nounwind {
170*9880d681SAndroid Build Coastguard Worker; ELF64: t15
171*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %v, 1
172*9880d681SAndroid Build Coastguard Worker  store i64 %1, i64* getelementptr inbounds (%struct.t, %struct.t* @h, i32 0, i32 1), align 1
173*9880d681SAndroid Build Coastguard Worker; ELF64: addis
174*9880d681SAndroid Build Coastguard Worker; ELF64: addi
175*9880d681SAndroid Build Coastguard Worker; ELF64: addi
176*9880d681SAndroid Build Coastguard Worker; ELF64: li
177*9880d681SAndroid Build Coastguard Worker; ELF64: stdx
178*9880d681SAndroid Build Coastguard Worker  ret void
179*9880d681SAndroid Build Coastguard Worker}
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Worker;; ld requires an offset that fits in 16 bits, so we need ldx here.
182*9880d681SAndroid Build Coastguard Workerdefine i64 @t16() nounwind {
183*9880d681SAndroid Build Coastguard Worker; ELF64: t16
184*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* getelementptr inbounds ([8192 x i64], [8192 x i64]* @i, i32 0, i64 5000), align 8
185*9880d681SAndroid Build Coastguard Worker; ELF64: lis
186*9880d681SAndroid Build Coastguard Worker; ELF64: ori
187*9880d681SAndroid Build Coastguard Worker; ELF64: ldx
188*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %1, 1
189*9880d681SAndroid Build Coastguard Worker; ELF64: addi
190*9880d681SAndroid Build Coastguard Worker  ret i64 %2
191*9880d681SAndroid Build Coastguard Worker}
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker;; std requires an offset that fits in 16 bits, so we need stdx here.
194*9880d681SAndroid Build Coastguard Workerdefine void @t17(i64 %v) nounwind {
195*9880d681SAndroid Build Coastguard Worker; ELF64: t17
196*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %v, 1
197*9880d681SAndroid Build Coastguard Worker  store i64 %1, i64* getelementptr inbounds ([8192 x i64], [8192 x i64]* @i, i32 0, i64 5000), align 8
198*9880d681SAndroid Build Coastguard Worker; ELF64: addis
199*9880d681SAndroid Build Coastguard Worker; ELF64: ld
200*9880d681SAndroid Build Coastguard Worker; ELF64: addi
201*9880d681SAndroid Build Coastguard Worker; ELF64: lis
202*9880d681SAndroid Build Coastguard Worker; ELF64: ori
203*9880d681SAndroid Build Coastguard Worker; ELF64: stdx
204*9880d681SAndroid Build Coastguard Worker  ret void
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207