5
5
; RUN: | FileCheck %s --check-prefixes=CHECK,RV64
6
6
7
7
define i32 @and0xabcdefff (i32 %x ) {
8
- ; RV32-LABEL: and0xabcdefff:
9
- ; RV32: # %bb.0:
10
- ; RV32-NEXT: lui a1, 703711
11
- ; RV32-NEXT: addi a1, a1, -1
12
- ; RV32-NEXT: and a0, a0, a1
13
- ; RV32-NEXT: ret
14
- ;
15
- ; RV64-LABEL: and0xabcdefff:
16
- ; RV64: # %bb.0:
17
- ; RV64-NEXT: lui a1, 703711
18
- ; RV64-NEXT: addiw a1, a1, -1
19
- ; RV64-NEXT: and a0, a0, a1
20
- ; RV64-NEXT: ret
8
+ ; CHECK-LABEL: and0xabcdefff:
9
+ ; CHECK: # %bb.0:
10
+ ; CHECK-NEXT: lui a1, 344865
11
+ ; CHECK-NEXT: andn a0, a0, a1
12
+ ; CHECK-NEXT: ret
21
13
%and = and i32 %x , -1412567041
22
14
ret i32 %and
23
15
}
24
16
25
17
define i32 @orlow13 (i32 %x ) {
26
- ; RV32-LABEL: orlow13:
27
- ; RV32: # %bb.0:
28
- ; RV32-NEXT: lui a1, 2
29
- ; RV32-NEXT: addi a1, a1, -1
30
- ; RV32-NEXT: or a0, a0, a1
31
- ; RV32-NEXT: ret
32
- ;
33
- ; RV64-LABEL: orlow13:
34
- ; RV64: # %bb.0:
35
- ; RV64-NEXT: lui a1, 2
36
- ; RV64-NEXT: addiw a1, a1, -1
37
- ; RV64-NEXT: or a0, a0, a1
38
- ; RV64-NEXT: ret
18
+ ; CHECK-LABEL: orlow13:
19
+ ; CHECK: # %bb.0:
20
+ ; CHECK-NEXT: lui a1, 1048574
21
+ ; CHECK-NEXT: orn a0, a0, a1
22
+ ; CHECK-NEXT: ret
39
23
%or = or i32 %x , 8191
40
24
ret i32 %or
41
25
}
42
26
43
27
define i64 @orlow24 (i64 %x ) {
44
28
; RV32-LABEL: orlow24:
45
29
; RV32: # %bb.0:
46
- ; RV32-NEXT: lui a2, 4096
47
- ; RV32-NEXT: addi a2, a2, -1
48
- ; RV32-NEXT: or a0, a0, a2
30
+ ; RV32-NEXT: lui a2, 1044480
31
+ ; RV32-NEXT: orn a0, a0, a2
49
32
; RV32-NEXT: ret
50
33
;
51
34
; RV64-LABEL: orlow24:
52
35
; RV64: # %bb.0:
53
- ; RV64-NEXT: lui a1, 4096
54
- ; RV64-NEXT: addiw a1, a1, -1
55
- ; RV64-NEXT: or a0, a0, a1
36
+ ; RV64-NEXT: lui a1, 1044480
37
+ ; RV64-NEXT: orn a0, a0, a1
56
38
; RV64-NEXT: ret
57
39
%or = or i64 %x , 16777215
58
40
ret i64 %or
59
41
}
60
42
61
43
define i32 @xorlow16 (i32 %x ) {
62
- ; RV32-LABEL: xorlow16:
63
- ; RV32: # %bb.0:
64
- ; RV32-NEXT: lui a1, 16
65
- ; RV32-NEXT: addi a1, a1, -1
66
- ; RV32-NEXT: xor a0, a0, a1
67
- ; RV32-NEXT: ret
68
- ;
69
- ; RV64-LABEL: xorlow16:
70
- ; RV64: # %bb.0:
71
- ; RV64-NEXT: lui a1, 16
72
- ; RV64-NEXT: addiw a1, a1, -1
73
- ; RV64-NEXT: xor a0, a0, a1
74
- ; RV64-NEXT: ret
44
+ ; CHECK-LABEL: xorlow16:
45
+ ; CHECK: # %bb.0:
46
+ ; CHECK-NEXT: lui a1, 1048560
47
+ ; CHECK-NEXT: xnor a0, a0, a1
48
+ ; CHECK-NEXT: ret
75
49
%xor = xor i32 %x , 65535
76
50
ret i32 %xor
77
51
}
78
52
79
53
define i32 @xorlow31 (i32 %x ) {
80
- ; RV32-LABEL: xorlow31:
81
- ; RV32: # %bb.0:
82
- ; RV32-NEXT: lui a1, 524288
83
- ; RV32-NEXT: addi a1, a1, -1
84
- ; RV32-NEXT: xor a0, a0, a1
85
- ; RV32-NEXT: ret
86
- ;
87
- ; RV64-LABEL: xorlow31:
88
- ; RV64: # %bb.0:
89
- ; RV64-NEXT: lui a1, 524288
90
- ; RV64-NEXT: addiw a1, a1, -1
91
- ; RV64-NEXT: xor a0, a0, a1
92
- ; RV64-NEXT: ret
54
+ ; CHECK-LABEL: xorlow31:
55
+ ; CHECK: # %bb.0:
56
+ ; CHECK-NEXT: lui a1, 524288
57
+ ; CHECK-NEXT: xnor a0, a0, a1
58
+ ; CHECK-NEXT: ret
93
59
%xor = xor i32 %x , 2147483647
94
60
ret i32 %xor
95
61
}
96
62
97
63
define i32 @oraddlow16 (i32 %x ) {
98
64
; RV32-LABEL: oraddlow16:
99
65
; RV32: # %bb.0:
66
+ ; RV32-NEXT: lui a1, 1048560
67
+ ; RV32-NEXT: orn a0, a0, a1
100
68
; RV32-NEXT: lui a1, 16
101
69
; RV32-NEXT: addi a1, a1, -1
102
- ; RV32-NEXT: or a0, a0, a1
103
70
; RV32-NEXT: add a0, a0, a1
104
71
; RV32-NEXT: ret
105
72
;
106
73
; RV64-LABEL: oraddlow16:
107
74
; RV64: # %bb.0:
75
+ ; RV64-NEXT: lui a1, 1048560
76
+ ; RV64-NEXT: orn a0, a0, a1
108
77
; RV64-NEXT: lui a1, 16
109
78
; RV64-NEXT: addi a1, a1, -1
110
- ; RV64-NEXT: or a0, a0, a1
111
79
; RV64-NEXT: addw a0, a0, a1
112
80
; RV64-NEXT: ret
113
81
%or = or i32 %x , 65535
@@ -121,15 +89,17 @@ define i32 @addorlow16(i32 %x) {
121
89
; RV32-NEXT: lui a1, 16
122
90
; RV32-NEXT: addi a1, a1, -1
123
91
; RV32-NEXT: add a0, a0, a1
124
- ; RV32-NEXT: or a0, a0, a1
92
+ ; RV32-NEXT: lui a1, 1048560
93
+ ; RV32-NEXT: orn a0, a0, a1
125
94
; RV32-NEXT: ret
126
95
;
127
96
; RV64-LABEL: addorlow16:
128
97
; RV64: # %bb.0:
129
98
; RV64-NEXT: lui a1, 16
130
- ; RV64-NEXT: addiw a1, a1, -1
99
+ ; RV64-NEXT: addi a1, a1, -1
131
100
; RV64-NEXT: addw a0, a0, a1
132
- ; RV64-NEXT: or a0, a0, a1
101
+ ; RV64-NEXT: lui a1, 1048560
102
+ ; RV64-NEXT: orn a0, a0, a1
133
103
; RV64-NEXT: ret
134
104
%add = add nsw i32 %x , 65535
135
105
%or = or i32 %add , 65535
@@ -160,8 +130,7 @@ define void @orarray100(ptr %a) {
160
130
; RV32: # %bb.0: # %entry
161
131
; RV32-NEXT: li a1, 0
162
132
; RV32-NEXT: li a2, 0
163
- ; RV32-NEXT: lui a3, 16
164
- ; RV32-NEXT: addi a3, a3, -1
133
+ ; RV32-NEXT: lui a3, 1048560
165
134
; RV32-NEXT: .LBB8_1: # %for.body
166
135
; RV32-NEXT: # =>This Inner Loop Header: Depth=1
167
136
; RV32-NEXT: slli a4, a1, 2
@@ -171,7 +140,7 @@ define void @orarray100(ptr %a) {
171
140
; RV32-NEXT: seqz a6, a1
172
141
; RV32-NEXT: add a2, a2, a6
173
142
; RV32-NEXT: xori a6, a1, 100
174
- ; RV32-NEXT: or a5, a5, a3
143
+ ; RV32-NEXT: orn a5, a5, a3
175
144
; RV32-NEXT: or a6, a6, a2
176
145
; RV32-NEXT: sw a5, 0(a4)
177
146
; RV32-NEXT: bnez a6, .LBB8_1
@@ -181,12 +150,11 @@ define void @orarray100(ptr %a) {
181
150
; RV64-LABEL: orarray100:
182
151
; RV64: # %bb.0: # %entry
183
152
; RV64-NEXT: addi a1, a0, 400
184
- ; RV64-NEXT: lui a2, 16
185
- ; RV64-NEXT: addi a2, a2, -1
153
+ ; RV64-NEXT: lui a2, 1048560
186
154
; RV64-NEXT: .LBB8_1: # %for.body
187
155
; RV64-NEXT: # =>This Inner Loop Header: Depth=1
188
156
; RV64-NEXT: lw a3, 0(a0)
189
- ; RV64-NEXT: or a3, a3, a2
157
+ ; RV64-NEXT: orn a3, a3, a2
190
158
; RV64-NEXT: sw a3, 0(a0)
191
159
; RV64-NEXT: addi a0, a0, 4
192
160
; RV64-NEXT: bne a0, a1, .LBB8_1
@@ -212,17 +180,16 @@ for.body:
212
180
define void @orarray3 (ptr %a ) {
213
181
; CHECK-LABEL: orarray3:
214
182
; CHECK: # %bb.0:
215
- ; CHECK-NEXT: lui a1, 16
216
- ; CHECK-NEXT: lw a2, 0(a0)
217
- ; CHECK-NEXT: lw a3, 4(a0)
218
- ; CHECK-NEXT: lw a4, 8(a0)
219
- ; CHECK-NEXT: addi a1, a1, -1
220
- ; CHECK-NEXT: or a2, a2, a1
221
- ; CHECK-NEXT: or a3, a3, a1
222
- ; CHECK-NEXT: or a1, a4, a1
223
- ; CHECK-NEXT: sw a2, 0(a0)
224
- ; CHECK-NEXT: sw a3, 4(a0)
225
- ; CHECK-NEXT: sw a1, 8(a0)
183
+ ; CHECK-NEXT: lw a1, 0(a0)
184
+ ; CHECK-NEXT: lw a2, 4(a0)
185
+ ; CHECK-NEXT: lw a3, 8(a0)
186
+ ; CHECK-NEXT: lui a4, 1048560
187
+ ; CHECK-NEXT: orn a1, a1, a4
188
+ ; CHECK-NEXT: orn a2, a2, a4
189
+ ; CHECK-NEXT: orn a3, a3, a4
190
+ ; CHECK-NEXT: sw a1, 0(a0)
191
+ ; CHECK-NEXT: sw a2, 4(a0)
192
+ ; CHECK-NEXT: sw a3, 8(a0)
226
193
; CHECK-NEXT: ret
227
194
%1 = load i32 , ptr %a , align 4
228
195
%or = or i32 %1 , 65535
@@ -273,37 +240,21 @@ define i32 @compl(i32 %x) {
273
240
}
274
241
275
242
define i32 @orlow12 (i32 %x ) {
276
- ; RV32-LABEL: orlow12:
277
- ; RV32: # %bb.0:
278
- ; RV32-NEXT: lui a1, 1
279
- ; RV32-NEXT: addi a1, a1, -1
280
- ; RV32-NEXT: or a0, a0, a1
281
- ; RV32-NEXT: ret
282
- ;
283
- ; RV64-LABEL: orlow12:
284
- ; RV64: # %bb.0:
285
- ; RV64-NEXT: lui a1, 1
286
- ; RV64-NEXT: addiw a1, a1, -1
287
- ; RV64-NEXT: or a0, a0, a1
288
- ; RV64-NEXT: ret
243
+ ; CHECK-LABEL: orlow12:
244
+ ; CHECK: # %bb.0:
245
+ ; CHECK-NEXT: lui a1, 1048575
246
+ ; CHECK-NEXT: orn a0, a0, a1
247
+ ; CHECK-NEXT: ret
289
248
%or = or i32 %x , 4095
290
249
ret i32 %or
291
250
}
292
251
293
252
define i32 @xorlow12 (i32 %x ) {
294
- ; RV32-LABEL: xorlow12:
295
- ; RV32: # %bb.0:
296
- ; RV32-NEXT: lui a1, 1
297
- ; RV32-NEXT: addi a1, a1, -1
298
- ; RV32-NEXT: xor a0, a0, a1
299
- ; RV32-NEXT: ret
300
- ;
301
- ; RV64-LABEL: xorlow12:
302
- ; RV64: # %bb.0:
303
- ; RV64-NEXT: lui a1, 1
304
- ; RV64-NEXT: addiw a1, a1, -1
305
- ; RV64-NEXT: xor a0, a0, a1
306
- ; RV64-NEXT: ret
253
+ ; CHECK-LABEL: xorlow12:
254
+ ; CHECK: # %bb.0:
255
+ ; CHECK-NEXT: lui a1, 1048575
256
+ ; CHECK-NEXT: xnor a0, a0, a1
257
+ ; CHECK-NEXT: ret
307
258
%xor = xor i32 %x , 4095
308
259
ret i32 %xor
309
260
}
0 commit comments