@@ -186,23 +186,68 @@ define void @lshr_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
186
186
; ALL-NEXT: ldr q1, [x0]
187
187
; ALL-NEXT: stp x9, x8, [sp, #16]
188
188
; ALL-NEXT: mov x8, sp
189
- ; ALL-NEXT: and x9, x10, #0x1f
189
+ ; ALL-NEXT: and x9, x10, #0x18
190
190
; ALL-NEXT: str q1, [sp]
191
191
; ALL-NEXT: add x8, x8, x9
192
+ ; ALL-NEXT: lsl x9, x10, #3
192
193
; ALL-NEXT: stp q0, q0, [sp, #32]
194
+ ; ALL-NEXT: ldp x11, x10, [x8, #16]
195
+ ; ALL-NEXT: mvn w13, w9
196
+ ; ALL-NEXT: ldp x8, x12, [x8]
197
+ ; ALL-NEXT: and x9, x9, #0x38
198
+ ; ALL-NEXT: lsl x14, x10, #1
199
+ ; ALL-NEXT: lsl x15, x11, #1
200
+ ; ALL-NEXT: lsr x11, x11, x9
201
+ ; ALL-NEXT: lsl x16, x12, #1
202
+ ; ALL-NEXT: lsr x10, x10, x9
203
+ ; ALL-NEXT: lsr x12, x12, x9
204
+ ; ALL-NEXT: lsl x14, x14, x13
205
+ ; ALL-NEXT: lsr x8, x8, x9
206
+ ; ALL-NEXT: lsl x9, x16, x13
207
+ ; ALL-NEXT: lsl x13, x15, x13
208
+ ; ALL-NEXT: orr x11, x14, x11
209
+ ; ALL-NEXT: orr x8, x9, x8
210
+ ; ALL-NEXT: orr x9, x12, x13
211
+ ; ALL-NEXT: stp x11, x10, [x2, #16]
212
+ ; ALL-NEXT: stp x8, x9, [x2]
213
+ ; ALL-NEXT: add sp, sp, #64
214
+ ; ALL-NEXT: ret
215
+ %src = load i256 , ptr %src.ptr , align 1
216
+ %byteOff = load i256 , ptr %byteOff.ptr , align 1
217
+ %bitOff = shl i256 %byteOff , 3
218
+ %res = lshr i256 %src , %bitOff
219
+ store i256 %res , ptr %dst , align 1
220
+ ret void
221
+ }
222
+
223
+ define void @lshr_32bytes_dwordOff (ptr %src.ptr , ptr %dwordOff.ptr , ptr %dst ) nounwind {
224
+ ; ALL-LABEL: lshr_32bytes_dwordOff:
225
+ ; ALL: // %bb.0:
226
+ ; ALL-NEXT: sub sp, sp, #64
227
+ ; ALL-NEXT: ldp x9, x8, [x0, #16]
228
+ ; ALL-NEXT: movi v0.2d, #0000000000000000
229
+ ; ALL-NEXT: ldr x10, [x1]
230
+ ; ALL-NEXT: ldr q1, [x0]
231
+ ; ALL-NEXT: stp x9, x8, [sp, #16]
232
+ ; ALL-NEXT: ubfiz x8, x10, #3, #2
233
+ ; ALL-NEXT: mov x9, sp
234
+ ; ALL-NEXT: str q1, [sp]
235
+ ; ALL-NEXT: stp q0, q0, [sp, #32]
236
+ ; ALL-NEXT: add x8, x9, x8
193
237
; ALL-NEXT: ldp x10, x9, [x8, #16]
194
238
; ALL-NEXT: ldr q0, [x8]
195
239
; ALL-NEXT: str q0, [x2]
196
240
; ALL-NEXT: stp x10, x9, [x2, #16]
197
241
; ALL-NEXT: add sp, sp, #64
198
242
; ALL-NEXT: ret
199
243
%src = load i256 , ptr %src.ptr , align 1
200
- %byteOff = load i256 , ptr %byteOff .ptr , align 1
201
- %bitOff = shl i256 %byteOff , 3
244
+ %dwordOff = load i256 , ptr %dwordOff .ptr , align 1
245
+ %bitOff = shl i256 %dwordOff , 6
202
246
%res = lshr i256 %src , %bitOff
203
247
store i256 %res , ptr %dst , align 1
204
248
ret void
205
249
}
250
+
206
251
define void @shl_32bytes (ptr %src.ptr , ptr %byteOff.ptr , ptr %dst ) nounwind {
207
252
; ALL-LABEL: shl_32bytes:
208
253
; ALL: // %bb.0:
@@ -213,48 +258,139 @@ define void @shl_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {
213
258
; ALL-NEXT: ldr q1, [x0]
214
259
; ALL-NEXT: stp x9, x8, [sp, #48]
215
260
; ALL-NEXT: mov x8, sp
216
- ; ALL-NEXT: and x9, x10, #0x1f
261
+ ; ALL-NEXT: and x9, x10, #0x18
217
262
; ALL-NEXT: add x8, x8, #32
218
263
; ALL-NEXT: stp q0, q0, [sp]
219
264
; ALL-NEXT: str q1, [sp, #32]
220
265
; ALL-NEXT: sub x8, x8, x9
266
+ ; ALL-NEXT: lsl x9, x10, #3
267
+ ; ALL-NEXT: ldp x10, x11, [x8]
268
+ ; ALL-NEXT: ldp x12, x8, [x8, #16]
269
+ ; ALL-NEXT: mvn w13, w9
270
+ ; ALL-NEXT: and x9, x9, #0x38
271
+ ; ALL-NEXT: lsr x14, x10, #1
272
+ ; ALL-NEXT: lsr x15, x11, #1
273
+ ; ALL-NEXT: lsl x11, x11, x9
274
+ ; ALL-NEXT: lsr x16, x12, #1
275
+ ; ALL-NEXT: lsl x10, x10, x9
276
+ ; ALL-NEXT: lsl x12, x12, x9
277
+ ; ALL-NEXT: lsr x14, x14, x13
278
+ ; ALL-NEXT: lsl x8, x8, x9
279
+ ; ALL-NEXT: lsr x9, x16, x13
280
+ ; ALL-NEXT: lsr x13, x15, x13
281
+ ; ALL-NEXT: orr x11, x11, x14
282
+ ; ALL-NEXT: orr x8, x8, x9
283
+ ; ALL-NEXT: orr x9, x12, x13
284
+ ; ALL-NEXT: stp x10, x11, [x2]
285
+ ; ALL-NEXT: stp x9, x8, [x2, #16]
286
+ ; ALL-NEXT: add sp, sp, #64
287
+ ; ALL-NEXT: ret
288
+ %src = load i256 , ptr %src.ptr , align 1
289
+ %byteOff = load i256 , ptr %byteOff.ptr , align 1
290
+ %bitOff = shl i256 %byteOff , 3
291
+ %res = shl i256 %src , %bitOff
292
+ store i256 %res , ptr %dst , align 1
293
+ ret void
294
+ }
295
+
296
+ define void @shl_32bytes_dwordOff (ptr %src.ptr , ptr %dwordOff.ptr , ptr %dst ) nounwind {
297
+ ; ALL-LABEL: shl_32bytes_dwordOff:
298
+ ; ALL: // %bb.0:
299
+ ; ALL-NEXT: sub sp, sp, #64
300
+ ; ALL-NEXT: ldp x9, x8, [x0, #16]
301
+ ; ALL-NEXT: movi v0.2d, #0000000000000000
302
+ ; ALL-NEXT: ldr x10, [x1]
303
+ ; ALL-NEXT: ldr q1, [x0]
304
+ ; ALL-NEXT: stp x9, x8, [sp, #48]
305
+ ; ALL-NEXT: mov x8, sp
306
+ ; ALL-NEXT: ubfiz x9, x10, #3, #2
307
+ ; ALL-NEXT: add x8, x8, #32
308
+ ; ALL-NEXT: stp q0, q1, [sp, #16]
309
+ ; ALL-NEXT: str q0, [sp]
310
+ ; ALL-NEXT: sub x8, x8, x9
221
311
; ALL-NEXT: ldp x9, x10, [x8, #16]
222
312
; ALL-NEXT: ldr q0, [x8]
223
313
; ALL-NEXT: str q0, [x2]
224
314
; ALL-NEXT: stp x9, x10, [x2, #16]
225
315
; ALL-NEXT: add sp, sp, #64
226
316
; ALL-NEXT: ret
227
317
%src = load i256 , ptr %src.ptr , align 1
228
- %byteOff = load i256 , ptr %byteOff .ptr , align 1
229
- %bitOff = shl i256 %byteOff , 3
318
+ %dwordOff = load i256 , ptr %dwordOff .ptr , align 1
319
+ %bitOff = shl i256 %dwordOff , 6
230
320
%res = shl i256 %src , %bitOff
231
321
store i256 %res , ptr %dst , align 1
232
322
ret void
233
323
}
324
+
234
325
define void @ashr_32bytes (ptr %src.ptr , ptr %byteOff.ptr , ptr %dst ) nounwind {
235
326
; ALL-LABEL: ashr_32bytes:
236
327
; ALL: // %bb.0:
237
328
; ALL-NEXT: sub sp, sp, #64
238
329
; ALL-NEXT: ldp x9, x8, [x0, #16]
239
330
; ALL-NEXT: ldr x10, [x1]
240
331
; ALL-NEXT: ldr q0, [x0]
241
- ; ALL-NEXT: and x10 , x10, #0x1f
332
+ ; ALL-NEXT: and x11 , x10, #0x18
242
333
; ALL-NEXT: stp x9, x8, [sp, #16]
243
334
; ALL-NEXT: asr x8, x8, #63
244
335
; ALL-NEXT: mov x9, sp
245
336
; ALL-NEXT: str q0, [sp]
337
+ ; ALL-NEXT: add x9, x9, x11
338
+ ; ALL-NEXT: stp x8, x8, [sp, #48]
339
+ ; ALL-NEXT: stp x8, x8, [sp, #32]
340
+ ; ALL-NEXT: lsl x8, x10, #3
341
+ ; ALL-NEXT: ldp x11, x10, [x9, #16]
342
+ ; ALL-NEXT: ldp x9, x12, [x9]
343
+ ; ALL-NEXT: mvn w13, w8
344
+ ; ALL-NEXT: and x8, x8, #0x38
345
+ ; ALL-NEXT: lsl x14, x10, #1
346
+ ; ALL-NEXT: lsl x15, x11, #1
347
+ ; ALL-NEXT: lsr x11, x11, x8
348
+ ; ALL-NEXT: lsl x16, x12, #1
349
+ ; ALL-NEXT: asr x10, x10, x8
350
+ ; ALL-NEXT: lsr x12, x12, x8
351
+ ; ALL-NEXT: lsl x14, x14, x13
352
+ ; ALL-NEXT: lsr x8, x9, x8
353
+ ; ALL-NEXT: lsl x9, x16, x13
354
+ ; ALL-NEXT: lsl x13, x15, x13
355
+ ; ALL-NEXT: orr x11, x14, x11
356
+ ; ALL-NEXT: orr x8, x9, x8
357
+ ; ALL-NEXT: orr x9, x12, x13
358
+ ; ALL-NEXT: stp x11, x10, [x2, #16]
359
+ ; ALL-NEXT: stp x8, x9, [x2]
360
+ ; ALL-NEXT: add sp, sp, #64
361
+ ; ALL-NEXT: ret
362
+ %src = load i256 , ptr %src.ptr , align 1
363
+ %byteOff = load i256 , ptr %byteOff.ptr , align 1
364
+ %bitOff = shl i256 %byteOff , 3
365
+ %res = ashr i256 %src , %bitOff
366
+ store i256 %res , ptr %dst , align 1
367
+ ret void
368
+ }
369
+
370
+ define void @ashr_32bytes_dwordOff (ptr %src.ptr , ptr %dwordOff.ptr , ptr %dst ) nounwind {
371
+ ; ALL-LABEL: ashr_32bytes_dwordOff:
372
+ ; ALL: // %bb.0:
373
+ ; ALL-NEXT: sub sp, sp, #64
374
+ ; ALL-NEXT: ldp x9, x8, [x0, #16]
375
+ ; ALL-NEXT: ldr x10, [x1]
376
+ ; ALL-NEXT: ldr q0, [x0]
377
+ ; ALL-NEXT: stp x9, x8, [sp, #16]
378
+ ; ALL-NEXT: asr x8, x8, #63
379
+ ; ALL-NEXT: ubfiz x9, x10, #3, #2
380
+ ; ALL-NEXT: mov x10, sp
381
+ ; ALL-NEXT: str q0, [sp]
246
382
; ALL-NEXT: stp x8, x8, [sp, #48]
247
383
; ALL-NEXT: stp x8, x8, [sp, #32]
248
- ; ALL-NEXT: add x8, x9, x10
384
+ ; ALL-NEXT: add x8, x10, x9
249
385
; ALL-NEXT: ldp x10, x9, [x8, #16]
250
386
; ALL-NEXT: ldr q0, [x8]
251
387
; ALL-NEXT: str q0, [x2]
252
388
; ALL-NEXT: stp x10, x9, [x2, #16]
253
389
; ALL-NEXT: add sp, sp, #64
254
390
; ALL-NEXT: ret
255
391
%src = load i256 , ptr %src.ptr , align 1
256
- %byteOff = load i256 , ptr %byteOff .ptr , align 1
257
- %bitOff = shl i256 %byteOff , 3
392
+ %dwordOff = load i256 , ptr %dwordOff .ptr , align 1
393
+ %bitOff = shl i256 %dwordOff , 6
258
394
%res = ashr i256 %src , %bitOff
259
395
store i256 %res , ptr %dst , align 1
260
396
ret void
0 commit comments