@@ -82,6 +82,8 @@ define i24 @load_i24(ptr %p) {
82
82
ret i24 %res
83
83
}
84
84
85
+ ; FIXME: In the RV64IZBKB case, the second packh isn't selected because the
86
+ ; upper byte is an anyext load in the SDag.
85
87
define i32 @load_i32 (ptr %p ) {
86
88
; SLOWBASE-LABEL: load_i32:
87
89
; SLOWBASE: # %bb.0:
@@ -97,18 +99,29 @@ define i32 @load_i32(ptr %p) {
97
99
; SLOWBASE-NEXT: or a0, a0, a1
98
100
; SLOWBASE-NEXT: ret
99
101
;
100
- ; SLOWZBKB-LABEL: load_i32:
101
- ; SLOWZBKB: # %bb.0:
102
- ; SLOWZBKB-NEXT: lbu a1, 1(a0)
103
- ; SLOWZBKB-NEXT: lbu a2, 0(a0)
104
- ; SLOWZBKB-NEXT: lbu a3, 2(a0)
105
- ; SLOWZBKB-NEXT: lbu a0, 3(a0)
106
- ; SLOWZBKB-NEXT: packh a1, a2, a1
107
- ; SLOWZBKB-NEXT: slli a3, a3, 16
108
- ; SLOWZBKB-NEXT: slli a0, a0, 24
109
- ; SLOWZBKB-NEXT: or a0, a0, a3
110
- ; SLOWZBKB-NEXT: or a0, a0, a1
111
- ; SLOWZBKB-NEXT: ret
102
+ ; RV32IZBKB-LABEL: load_i32:
103
+ ; RV32IZBKB: # %bb.0:
104
+ ; RV32IZBKB-NEXT: lbu a1, 3(a0)
105
+ ; RV32IZBKB-NEXT: lbu a2, 2(a0)
106
+ ; RV32IZBKB-NEXT: lbu a3, 1(a0)
107
+ ; RV32IZBKB-NEXT: lbu a0, 0(a0)
108
+ ; RV32IZBKB-NEXT: packh a1, a2, a1
109
+ ; RV32IZBKB-NEXT: packh a0, a0, a3
110
+ ; RV32IZBKB-NEXT: pack a0, a0, a1
111
+ ; RV32IZBKB-NEXT: ret
112
+ ;
113
+ ; RV64IZBKB-LABEL: load_i32:
114
+ ; RV64IZBKB: # %bb.0:
115
+ ; RV64IZBKB-NEXT: lbu a1, 1(a0)
116
+ ; RV64IZBKB-NEXT: lbu a2, 0(a0)
117
+ ; RV64IZBKB-NEXT: lbu a3, 2(a0)
118
+ ; RV64IZBKB-NEXT: lbu a0, 3(a0)
119
+ ; RV64IZBKB-NEXT: packh a1, a2, a1
120
+ ; RV64IZBKB-NEXT: slli a3, a3, 16
121
+ ; RV64IZBKB-NEXT: slli a0, a0, 24
122
+ ; RV64IZBKB-NEXT: or a0, a0, a3
123
+ ; RV64IZBKB-NEXT: or a0, a0, a1
124
+ ; RV64IZBKB-NEXT: ret
112
125
;
113
126
; FAST-LABEL: load_i32:
114
127
; FAST: # %bb.0:
@@ -172,45 +185,39 @@ define i64 @load_i64(ptr %p) {
172
185
;
173
186
; RV32IZBKB-LABEL: load_i64:
174
187
; RV32IZBKB: # %bb.0:
175
- ; RV32IZBKB-NEXT: lbu a1, 1(a0)
176
- ; RV32IZBKB-NEXT: lbu a2, 0(a0)
177
- ; RV32IZBKB-NEXT: lbu a3, 2(a0)
178
- ; RV32IZBKB-NEXT: lbu a4, 3(a0)
188
+ ; RV32IZBKB-NEXT: lbu a1, 3(a0)
189
+ ; RV32IZBKB-NEXT: lbu a2, 2(a0)
179
190
; RV32IZBKB-NEXT: packh a1, a2, a1
180
- ; RV32IZBKB-NEXT: slli a3, a3, 16
181
- ; RV32IZBKB-NEXT: slli a4, a4, 24
182
- ; RV32IZBKB-NEXT: or a3, a4, a3
183
- ; RV32IZBKB-NEXT: lbu a2, 5(a0)
184
- ; RV32IZBKB-NEXT: lbu a4, 4(a0)
191
+ ; RV32IZBKB-NEXT: lbu a2, 1(a0)
192
+ ; RV32IZBKB-NEXT: lbu a3, 0(a0)
193
+ ; RV32IZBKB-NEXT: lbu a4, 7(a0)
185
194
; RV32IZBKB-NEXT: lbu a5, 6(a0)
186
- ; RV32IZBKB-NEXT: lbu a6, 7 (a0)
187
- ; RV32IZBKB-NEXT: or a0, a3, a1
188
- ; RV32IZBKB-NEXT: packh a1, a4 , a2
189
- ; RV32IZBKB-NEXT: slli a5, a5, 16
190
- ; RV32IZBKB-NEXT: slli a6, a6, 24
191
- ; RV32IZBKB-NEXT: or a2, a6, a5
192
- ; RV32IZBKB-NEXT: or a1, a2, a1
195
+ ; RV32IZBKB-NEXT: lbu a6, 5 (a0)
196
+ ; RV32IZBKB-NEXT: lbu a7, 4(a0)
197
+ ; RV32IZBKB-NEXT: packh a0, a3 , a2
198
+ ; RV32IZBKB-NEXT: pack a0, a0, a1
199
+ ; RV32IZBKB-NEXT: packh a1, a5, a4
200
+ ; RV32IZBKB-NEXT: packh a2, a7, a6
201
+ ; RV32IZBKB-NEXT: pack a1, a2, a1
193
202
; RV32IZBKB-NEXT: ret
194
203
;
195
204
; RV64IZBKB-LABEL: load_i64:
196
205
; RV64IZBKB: # %bb.0:
197
206
; RV64IZBKB-NEXT: lbu a1, 5(a0)
198
207
; RV64IZBKB-NEXT: lbu a2, 4(a0)
199
- ; RV64IZBKB-NEXT: lbu a3, 6 (a0)
200
- ; RV64IZBKB-NEXT: lbu a4, 7 (a0)
208
+ ; RV64IZBKB-NEXT: lbu a3, 7 (a0)
209
+ ; RV64IZBKB-NEXT: lbu a4, 6 (a0)
201
210
; RV64IZBKB-NEXT: packh a1, a2, a1
202
- ; RV64IZBKB-NEXT: slli a3, a3, 16
203
- ; RV64IZBKB-NEXT: slli a4, a4, 24
204
- ; RV64IZBKB-NEXT: or a3, a4, a3
205
- ; RV64IZBKB-NEXT: lbu a2, 1(a0)
211
+ ; RV64IZBKB-NEXT: packh a2, a4, a3
212
+ ; RV64IZBKB-NEXT: lbu a3, 1(a0)
206
213
; RV64IZBKB-NEXT: lbu a4, 0(a0)
207
- ; RV64IZBKB-NEXT: lbu a5, 2 (a0)
208
- ; RV64IZBKB-NEXT: lbu a0, 3 (a0)
209
- ; RV64IZBKB-NEXT: or a1, a3, a1
210
- ; RV64IZBKB-NEXT: packh a2, a4, a2
211
- ; RV64IZBKB-NEXT: slli a5, a5, 16
212
- ; RV64IZBKB-NEXT: slli a0, a0, 24
213
- ; RV64IZBKB-NEXT: or a0, a0, a5
214
+ ; RV64IZBKB-NEXT: lbu a5, 3 (a0)
215
+ ; RV64IZBKB-NEXT: lbu a0, 2 (a0)
216
+ ; RV64IZBKB-NEXT: slli a2, a2, 16
217
+ ; RV64IZBKB-NEXT: or a1, a2, a1
218
+ ; RV64IZBKB-NEXT: packh a2, a4, a3
219
+ ; RV64IZBKB-NEXT: packh a0, a0, a5
220
+ ; RV64IZBKB-NEXT: slli a0, a0, 16
214
221
; RV64IZBKB-NEXT: or a0, a0, a2
215
222
; RV64IZBKB-NEXT: pack a0, a0, a1
216
223
; RV64IZBKB-NEXT: ret
@@ -574,3 +581,5 @@ define void @store_large_constant(ptr %x) {
574
581
store i64 18364758544493064720 , ptr %x , align 1
575
582
ret void
576
583
}
584
+ ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
585
+ ; SLOWZBKB: {{.*}}
0 commit comments