blob: 2db13eb0ba83964c7927aeaead3798394e0afad9 [file] [log] [blame]
Ben Shi1e9d0812020-07-07 18:54:22 -07001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3; RUN: | FileCheck -check-prefix=RV32I %s
4; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5; RUN: | FileCheck -check-prefix=RV64I %s
6
7; These test how the immediate in an addition is materialized.
8
9define i32 @add_positive_low_bound_reject(i32 %a) nounwind {
10; RV32I-LABEL: add_positive_low_bound_reject:
11; RV32I: # %bb.0:
12; RV32I-NEXT: addi a0, a0, 2047
13; RV32I-NEXT: ret
14;
15; RV64I-LABEL: add_positive_low_bound_reject:
16; RV64I: # %bb.0:
17; RV64I-NEXT: addi a0, a0, 2047
18; RV64I-NEXT: ret
19 %1 = add i32 %a, 2047
20 ret i32 %1
21}
22
23define i32 @add_positive_low_bound_accept(i32 %a) nounwind {
24; RV32I-LABEL: add_positive_low_bound_accept:
25; RV32I: # %bb.0:
26; RV32I-NEXT: addi a0, a0, 1024
27; RV32I-NEXT: addi a0, a0, 1024
28; RV32I-NEXT: ret
29;
30; RV64I-LABEL: add_positive_low_bound_accept:
31; RV64I: # %bb.0:
32; RV64I-NEXT: addi a0, a0, 1024
33; RV64I-NEXT: addi a0, a0, 1024
34; RV64I-NEXT: ret
35 %1 = add i32 %a, 2048
36 ret i32 %1
37}
38
39define i32 @add_positive_high_bound_accept(i32 %a) nounwind {
40; RV32I-LABEL: add_positive_high_bound_accept:
41; RV32I: # %bb.0:
42; RV32I-NEXT: addi a0, a0, 2047
43; RV32I-NEXT: addi a0, a0, 2047
44; RV32I-NEXT: ret
45;
46; RV64I-LABEL: add_positive_high_bound_accept:
47; RV64I: # %bb.0:
48; RV64I-NEXT: addi a0, a0, 2047
49; RV64I-NEXT: addi a0, a0, 2047
50; RV64I-NEXT: ret
51 %1 = add i32 %a, 4094
52 ret i32 %1
53}
54
55define i32 @add_positive_high_bound_reject(i32 %a) nounwind {
56; RV32I-LABEL: add_positive_high_bound_reject:
57; RV32I: # %bb.0:
58; RV32I-NEXT: lui a1, 1
59; RV32I-NEXT: addi a1, a1, -1
60; RV32I-NEXT: add a0, a0, a1
61; RV32I-NEXT: ret
62;
63; RV64I-LABEL: add_positive_high_bound_reject:
64; RV64I: # %bb.0:
65; RV64I-NEXT: lui a1, 1
66; RV64I-NEXT: addiw a1, a1, -1
67; RV64I-NEXT: add a0, a0, a1
68; RV64I-NEXT: ret
69 %1 = add i32 %a, 4095
70 ret i32 %1
71}
72
73define i32 @add_negative_high_bound_reject(i32 %a) nounwind {
74; RV32I-LABEL: add_negative_high_bound_reject:
75; RV32I: # %bb.0:
76; RV32I-NEXT: addi a0, a0, -2048
77; RV32I-NEXT: ret
78;
79; RV64I-LABEL: add_negative_high_bound_reject:
80; RV64I: # %bb.0:
81; RV64I-NEXT: addi a0, a0, -2048
82; RV64I-NEXT: ret
83 %1 = add i32 %a, -2048
84 ret i32 %1
85}
86
87define i32 @add_negative_high_bound_accept(i32 %a) nounwind {
88; RV32I-LABEL: add_negative_high_bound_accept:
89; RV32I: # %bb.0:
90; RV32I-NEXT: addi a0, a0, -1025
91; RV32I-NEXT: addi a0, a0, -1024
92; RV32I-NEXT: ret
93;
94; RV64I-LABEL: add_negative_high_bound_accept:
95; RV64I: # %bb.0:
96; RV64I-NEXT: addi a0, a0, -1025
97; RV64I-NEXT: addi a0, a0, -1024
98; RV64I-NEXT: ret
99 %1 = add i32 %a, -2049
100 ret i32 %1
101}
102
103define i32 @add_negative_low_bound_accept(i32 %a) nounwind {
104; RV32I-LABEL: add_negative_low_bound_accept:
105; RV32I: # %bb.0:
106; RV32I-NEXT: addi a0, a0, -2048
107; RV32I-NEXT: addi a0, a0, -2048
108; RV32I-NEXT: ret
109;
110; RV64I-LABEL: add_negative_low_bound_accept:
111; RV64I: # %bb.0:
112; RV64I-NEXT: addi a0, a0, -2048
113; RV64I-NEXT: addi a0, a0, -2048
114; RV64I-NEXT: ret
115 %1 = add i32 %a, -4096
116 ret i32 %1
117}
118
119define i32 @add_negative_low_bound_reject(i32 %a) nounwind {
120; RV32I-LABEL: add_negative_low_bound_reject:
121; RV32I: # %bb.0:
122; RV32I-NEXT: lui a1, 1048575
123; RV32I-NEXT: addi a1, a1, -1
124; RV32I-NEXT: add a0, a0, a1
125; RV32I-NEXT: ret
126;
127; RV64I-LABEL: add_negative_low_bound_reject:
128; RV64I: # %bb.0:
129; RV64I-NEXT: lui a1, 1048575
130; RV64I-NEXT: addiw a1, a1, -1
131; RV64I-NEXT: add a0, a0, a1
132; RV64I-NEXT: ret
133 %1 = add i32 %a, -4097
134 ret i32 %1
135}
136
137define i32 @add32_accept(i32 %a) nounwind {
138; RV32I-LABEL: add32_accept:
139; RV32I: # %bb.0:
140; RV32I-NEXT: addi a0, a0, 1500
141; RV32I-NEXT: addi a0, a0, 1499
142; RV32I-NEXT: ret
143;
144; RV64I-LABEL: add32_accept:
145; RV64I: # %bb.0:
146; RV64I-NEXT: addi a0, a0, 1500
147; RV64I-NEXT: addi a0, a0, 1499
148; RV64I-NEXT: ret
149 %1 = add i32 %a, 2999
150 ret i32 %1
151}
152
153define i64 @add64_accept(i64 %a) nounwind {
154; RV32I-LABEL: add64_accept:
155; RV32I: # %bb.0:
156; RV32I-NEXT: addi a2, a0, 1500
157; RV32I-NEXT: addi a2, a2, 1499
158; RV32I-NEXT: sltu a0, a2, a0
159; RV32I-NEXT: add a1, a1, a0
160; RV32I-NEXT: mv a0, a2
161; RV32I-NEXT: ret
162;
163; RV64I-LABEL: add64_accept:
164; RV64I: # %bb.0:
165; RV64I-NEXT: addi a0, a0, 1500
166; RV64I-NEXT: addi a0, a0, 1499
167; RV64I-NEXT: ret
168 %1 = add i64 %a, 2999
169 ret i64 %1
170}
171
172@ga = global i32 0, align 4
173@gb = global i32 0, align 4
174define void @add32_reject() nounwind {
175; RV32I-LABEL: add32_reject:
176; RV32I: # %bb.0:
177; RV32I-NEXT: lui a0, %hi(ga)
178; RV32I-NEXT: lw a1, %lo(ga)(a0)
179; RV32I-NEXT: lui a2, %hi(gb)
180; RV32I-NEXT: lw a3, %lo(gb)(a2)
181; RV32I-NEXT: lui a4, 1
182; RV32I-NEXT: addi a4, a4, -1096
183; RV32I-NEXT: add a1, a1, a4
184; RV32I-NEXT: add a3, a3, a4
185; RV32I-NEXT: sw a1, %lo(ga)(a0)
186; RV32I-NEXT: sw a3, %lo(gb)(a2)
187; RV32I-NEXT: ret
188;
189; RV64I-LABEL: add32_reject:
190; RV64I: # %bb.0:
191; RV64I-NEXT: lui a0, %hi(ga)
192; RV64I-NEXT: lw a1, %lo(ga)(a0)
193; RV64I-NEXT: lui a2, %hi(gb)
194; RV64I-NEXT: lw a3, %lo(gb)(a2)
195; RV64I-NEXT: lui a4, 1
196; RV64I-NEXT: addiw a4, a4, -1096
197; RV64I-NEXT: add a1, a1, a4
198; RV64I-NEXT: add a3, a3, a4
199; RV64I-NEXT: sw a1, %lo(ga)(a0)
200; RV64I-NEXT: sw a3, %lo(gb)(a2)
201; RV64I-NEXT: ret
202 %1 = load i32, i32* @ga, align 4
203 %2 = load i32, i32* @gb, align 4
204 %3 = add i32 %1, 3000
205 %4 = add i32 %2, 3000
206 store i32 %3, i32* @ga, align 4
207 store i32 %4, i32* @gb, align 4
208 ret void
209}