1 ; Test 32-bit additions of constants to memory.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5 ; Check additions of 1.
6 define void @f1(i32 *%ptr) {
11 %add = add i32 %val, 127
12 store i32 %add, i32 *%ptr
16 ; Check the high end of the constant range.
17 define void @f2(i32 *%ptr) {
19 ; CHECK: asi 0(%r2), 127
22 %add = add i32 %val, 127
23 store i32 %add, i32 *%ptr
27 ; Check the next constant up, which must use an addition and a store.
28 ; Both L/AHI and LHI/A would be OK.
29 define void @f3(i32 *%ptr) {
32 ; CHECK: st %r0, 0(%r2)
35 %add = add i32 %val, 128
36 store i32 %add, i32 *%ptr
40 ; Check the low end of the constant range.
41 define void @f4(i32 *%ptr) {
43 ; CHECK: asi 0(%r2), -128
46 %add = add i32 %val, -128
47 store i32 %add, i32 *%ptr
51 ; Check the next value down, with the same comment as f3.
52 define void @f5(i32 *%ptr) {
55 ; CHECK: st %r0, 0(%r2)
58 %add = add i32 %val, -129
59 store i32 %add, i32 *%ptr
63 ; Check the high end of the aligned ASI range.
64 define void @f6(i32 *%base) {
66 ; CHECK: asi 524284(%r2), 1
68 %ptr = getelementptr i32 *%base, i64 131071
70 %add = add i32 %val, 1
71 store i32 %add, i32 *%ptr
75 ; Check the next word up, which must use separate address logic.
76 ; Other sequences besides this one would be OK.
77 define void @f7(i32 *%base) {
79 ; CHECK: agfi %r2, 524288
80 ; CHECK: asi 0(%r2), 1
82 %ptr = getelementptr i32 *%base, i64 131072
84 %add = add i32 %val, 1
85 store i32 %add, i32 *%ptr
89 ; Check the low end of the ASI range.
90 define void @f8(i32 *%base) {
92 ; CHECK: asi -524288(%r2), 1
94 %ptr = getelementptr i32 *%base, i64 -131072
96 %add = add i32 %val, 1
97 store i32 %add, i32 *%ptr
101 ; Check the next word down, which must use separate address logic.
102 ; Other sequences besides this one would be OK.
103 define void @f9(i32 *%base) {
105 ; CHECK: agfi %r2, -524292
106 ; CHECK: asi 0(%r2), 1
108 %ptr = getelementptr i32 *%base, i64 -131073
109 %val = load i32 *%ptr
110 %add = add i32 %val, 1
111 store i32 %add, i32 *%ptr
115 ; Check that ASI does not allow indices.
116 define void @f10(i64 %base, i64 %index) {
118 ; CHECK: agr %r2, %r3
119 ; CHECK: asi 4(%r2), 1
121 %add1 = add i64 %base, %index
122 %add2 = add i64 %add1, 4
123 %ptr = inttoptr i64 %add2 to i32 *
124 %val = load i32 *%ptr
125 %add = add i32 %val, 1
126 store i32 %add, i32 *%ptr