xref: /llvm-project/llvm/test/CodeGen/SystemZ/lxa-03.ll (revision 8424bf207efd89eacf2fe893b67be98d535e1db6)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; Test use of LOAD INDEXED ADDRESS word instructions.
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=arch15 | FileCheck %s
5
6; LXAF with base and index.
7define dso_local ptr @f0(ptr %ptr, i32 %idx) {
8; CHECK-LABEL: f0:
9; CHECK:       # %bb.0:
10; CHECK-NEXT:    lxaf %r2, 0(%r3,%r2)
11; CHECK-NEXT:    br %r14
12  %idxprom = sext i32 %idx to i64
13  %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom
14  ret ptr %arrayidx
15}
16
17; LXAF with base and index (implied extension).
18define dso_local ptr @f1(ptr %ptr, i32 signext %idx) {
19; CHECK-LABEL: f1:
20; CHECK:       # %bb.0:
21; CHECK-NEXT:    lxaf %r2, 0(%r3,%r2)
22; CHECK-NEXT:    br %r14
23  %idxprom = sext i32 %idx to i64
24  %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom
25  ret ptr %arrayidx
26}
27
28; LXAF with base and index and max displacement.
29define dso_local ptr @f2(ptr %ptr, i32 %idx) {
30; CHECK-LABEL: f2:
31; CHECK:       # %bb.0:
32; CHECK-NEXT:    lxaf %r2, 524287(%r3,%r2)
33; CHECK-NEXT:    br %r14
34  %idxoff = add i32 %idx, 524287
35  %idxprom = sext i32 %idxoff to i64
36  %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom
37  ret ptr %arrayidx
38}
39
40; LXAF with base and index and min displacement.
41define dso_local ptr @f3(ptr %ptr, i32 %idx) {
42; CHECK-LABEL: f3:
43; CHECK:       # %bb.0:
44; CHECK-NEXT:    lxaf %r2, -524288(%r3,%r2)
45; CHECK-NEXT:    br %r14
46  %idxoff = add i32 %idx, -524288
47  %idxprom = sext i32 %idxoff to i64
48  %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom
49  ret ptr %arrayidx
50}
51
52; LXAF with base and index and max displacement overflow.
53define dso_local ptr @f4(ptr %ptr, i32 %idx) {
54; CHECK-LABEL: f4:
55; CHECK:       # %bb.0:
56; CHECK-NEXT:    afi %r3, 524288
57; CHECK-NEXT:    lxaf %r2, 0(%r3,%r2)
58; CHECK-NEXT:    br %r14
59  %idxoff = add i32 %idx, 524288
60  %idxprom = sext i32 %idxoff to i64
61  %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom
62  ret ptr %arrayidx
63}
64
65; LXAF with base and index and min displacement overflow.
66define dso_local ptr @f5(ptr %ptr, i32 %idx) {
67; CHECK-LABEL: f5:
68; CHECK:       # %bb.0:
69; CHECK-NEXT:    afi %r3, -524289
70; CHECK-NEXT:    lxaf %r2, 0(%r3,%r2)
71; CHECK-NEXT:    br %r14
72  %idxoff = add i32 %idx, -524289
73  %idxprom = sext i32 %idxoff to i64
74  %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom
75  ret ptr %arrayidx
76}
77
78; LXAF with index.
79define dso_local i64 @f6(i32 %idx) {
80; CHECK-LABEL: f6:
81; CHECK:       # %bb.0:
82; CHECK-NEXT:    lxaf %r2, 0(%r2,0)
83; CHECK-NEXT:    br %r14
84  %idxprom = sext i32 %idx to i64
85  %idxshift = shl i64 %idxprom, 2
86  ret i64 %idxshift
87}
88
89; LXAF with index and displacement.
90define dso_local i64 @f7(i32 %idx) {
91; CHECK-LABEL: f7:
92; CHECK:       # %bb.0:
93; CHECK-NEXT:    lxaf %r2, 1(%r2,0)
94; CHECK-NEXT:    br %r14
95  %idxoff = add i32 %idx, 1
96  %idxprom = sext i32 %idxoff to i64
97  %idxshift = shl i64 %idxprom, 2
98  ret i64 %idxshift
99}
100
101