xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/int-move-09.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test 64-bit GPR accesses to a PC-relative location.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker@gsrc16 = global i16 1
6*9880d681SAndroid Build Coastguard Worker@gsrc32 = global i32 1
7*9880d681SAndroid Build Coastguard Worker@gsrc64 = global i64 1
8*9880d681SAndroid Build Coastguard Worker@gdst16 = global i16 2
9*9880d681SAndroid Build Coastguard Worker@gdst32 = global i32 2
10*9880d681SAndroid Build Coastguard Worker@gdst64 = global i64 2
11*9880d681SAndroid Build Coastguard Worker@gsrc16u = global i16 1, align 1, section "foo"
12*9880d681SAndroid Build Coastguard Worker@gsrc32u = global i32 1, align 2, section "foo"
13*9880d681SAndroid Build Coastguard Worker@gsrc64u = global i64 1, align 4, section "foo"
14*9880d681SAndroid Build Coastguard Worker@gdst16u = global i16 2, align 1, section "foo"
15*9880d681SAndroid Build Coastguard Worker@gdst32u = global i32 2, align 2, section "foo"
16*9880d681SAndroid Build Coastguard Worker@gdst64u = global i64 2, align 4, section "foo"
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker; Check sign-extending loads from i16.
19*9880d681SAndroid Build Coastguard Workerdefine i64 @f1() {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
21*9880d681SAndroid Build Coastguard Worker; CHECK: lghrl %r2, gsrc16
22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
23*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *@gsrc16
24*9880d681SAndroid Build Coastguard Worker  %ext = sext i16 %val to i64
25*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; Check zero-extending loads from i16.
29*9880d681SAndroid Build Coastguard Workerdefine i64 @f2() {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
31*9880d681SAndroid Build Coastguard Worker; CHECK: llghrl %r2, gsrc16
32*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
33*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *@gsrc16
34*9880d681SAndroid Build Coastguard Worker  %ext = zext i16 %val to i64
35*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; Check sign-extending loads from i32.
39*9880d681SAndroid Build Coastguard Workerdefine i64 @f3() {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
41*9880d681SAndroid Build Coastguard Worker; CHECK: lgfrl %r2, gsrc32
42*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
43*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *@gsrc32
44*9880d681SAndroid Build Coastguard Worker  %ext = sext i32 %val to i64
45*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; Check zero-extending loads from i32.
49*9880d681SAndroid Build Coastguard Workerdefine i64 @f4() {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
51*9880d681SAndroid Build Coastguard Worker; CHECK: llgfrl %r2, gsrc32
52*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
53*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *@gsrc32
54*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %val to i64
55*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; Check truncating 16-bit stores.
59*9880d681SAndroid Build Coastguard Workerdefine void @f5(i64 %val) {
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
61*9880d681SAndroid Build Coastguard Worker; CHECK: sthrl %r2, gdst16
62*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
63*9880d681SAndroid Build Coastguard Worker  %half = trunc i64 %val to i16
64*9880d681SAndroid Build Coastguard Worker  store i16 %half, i16 *@gdst16
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; Check truncating 32-bit stores.
69*9880d681SAndroid Build Coastguard Workerdefine void @f6(i64 %val) {
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
71*9880d681SAndroid Build Coastguard Worker; CHECK: strl %r2, gdst32
72*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
73*9880d681SAndroid Build Coastguard Worker  %word = trunc i64 %val to i32
74*9880d681SAndroid Build Coastguard Worker  store i32 %word, i32 *@gdst32
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; Check plain loads and stores.
79*9880d681SAndroid Build Coastguard Workerdefine void @f7() {
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
81*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl %r0, gsrc64
82*9880d681SAndroid Build Coastguard Worker; CHECK: stgrl %r0, gdst64
83*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
84*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *@gsrc64
85*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *@gdst64
86*9880d681SAndroid Build Coastguard Worker  ret void
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; Repeat f1 with an unaligned variable.
90*9880d681SAndroid Build Coastguard Workerdefine i64 @f8() {
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
92*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-5]]], gsrc16u@GOT
93*9880d681SAndroid Build Coastguard Worker; CHECK: lgh %r2, 0([[REG]])
94*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
95*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *@gsrc16u, align 1
96*9880d681SAndroid Build Coastguard Worker  %ext = sext i16 %val to i64
97*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; Repeat f2 with an unaligned variable.
101*9880d681SAndroid Build Coastguard Workerdefine i64 @f9() {
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
103*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-5]]], gsrc16u@GOT
104*9880d681SAndroid Build Coastguard Worker; CHECK: llgh %r2, 0([[REG]])
105*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
106*9880d681SAndroid Build Coastguard Worker  %val = load i16 , i16 *@gsrc16u, align 1
107*9880d681SAndroid Build Coastguard Worker  %ext = zext i16 %val to i64
108*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Repeat f3 with an unaligned variable.
112*9880d681SAndroid Build Coastguard Workerdefine i64 @f10() {
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
114*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gsrc32u
115*9880d681SAndroid Build Coastguard Worker; CHECK: lgf %r2, 0([[REG]])
116*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
117*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *@gsrc32u, align 2
118*9880d681SAndroid Build Coastguard Worker  %ext = sext i32 %val to i64
119*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; Repeat f4 with an unaligned variable.
123*9880d681SAndroid Build Coastguard Workerdefine i64 @f11() {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
125*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gsrc32u
126*9880d681SAndroid Build Coastguard Worker; CHECK: llgf %r2, 0([[REG]])
127*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
128*9880d681SAndroid Build Coastguard Worker  %val = load i32 , i32 *@gsrc32u, align 2
129*9880d681SAndroid Build Coastguard Worker  %ext = zext i32 %val to i64
130*9880d681SAndroid Build Coastguard Worker  ret i64 %ext
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; Repeat f5 with an unaligned variable.
134*9880d681SAndroid Build Coastguard Workerdefine void @f12(i64 %val) {
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
136*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-5]]], gdst16u@GOT
137*9880d681SAndroid Build Coastguard Worker; CHECK: sth %r2, 0([[REG]])
138*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
139*9880d681SAndroid Build Coastguard Worker  %half = trunc i64 %val to i16
140*9880d681SAndroid Build Coastguard Worker  store i16 %half, i16 *@gdst16u, align 1
141*9880d681SAndroid Build Coastguard Worker  ret void
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; Repeat f6 with an unaligned variable.
145*9880d681SAndroid Build Coastguard Workerdefine void @f13(i64 %val) {
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
147*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gdst32u
148*9880d681SAndroid Build Coastguard Worker; CHECK: st %r2, 0([[REG]])
149*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
150*9880d681SAndroid Build Coastguard Worker  %word = trunc i64 %val to i32
151*9880d681SAndroid Build Coastguard Worker  store i32 %word, i32 *@gdst32u, align 2
152*9880d681SAndroid Build Coastguard Worker  ret void
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker; Repeat f7 with unaligned variables.
156*9880d681SAndroid Build Coastguard Workerdefine void @f14() {
157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
158*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gsrc64u
159*9880d681SAndroid Build Coastguard Worker; CHECK: lg [[VAL:%r[0-5]]], 0([[REG]])
160*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gdst64u
161*9880d681SAndroid Build Coastguard Worker; CHECK: stg [[VAL]], 0([[REG]])
162*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
163*9880d681SAndroid Build Coastguard Worker  %val = load i64 , i64 *@gsrc64u, align 4
164*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64 *@gdst64u, align 4
165*9880d681SAndroid Build Coastguard Worker  ret void
166*9880d681SAndroid Build Coastguard Worker}
167