@@ -278,6 +278,58 @@ entry:
278278 ret void
279279}
280280
281+ define void @store_trunc_add_from_64bits (ptr %src , ptr %dst ) {
282+ ; CHECK-LABEL: store_trunc_add_from_64bits:
283+ ; CHECK: ; %bb.0: ; %entry
284+ ; CHECK-NEXT: sub sp, sp, #16
285+ ; CHECK-NEXT: .cfi_def_cfa_offset 16
286+ ; CHECK-NEXT: ldr s0, [x0]
287+ ; CHECK-NEXT: add x9, x0, #4
288+ ; CHECK-NEXT: Lloh0:
289+ ; CHECK-NEXT: adrp x8, lCPI7_0@PAGE
290+ ; CHECK-NEXT: Lloh1:
291+ ; CHECK-NEXT: ldr d1, [x8, lCPI7_0@PAGEOFF]
292+ ; CHECK-NEXT: ld1.h { v0 }[2], [x9]
293+ ; CHECK-NEXT: add.4h v0, v0, v1
294+ ; CHECK-NEXT: xtn.8b v1, v0
295+ ; CHECK-NEXT: umov.h w8, v0[2]
296+ ; CHECK-NEXT: str s1, [sp, #12]
297+ ; CHECK-NEXT: ldrh w9, [sp, #12]
298+ ; CHECK-NEXT: strb w8, [x1, #2]
299+ ; CHECK-NEXT: strh w9, [x1]
300+ ; CHECK-NEXT: add sp, sp, #16
301+ ; CHECK-NEXT: ret
302+ ; CHECK-NEXT: .loh AdrpLdr Lloh0, Lloh1
303+ ;
304+ ; BE-LABEL: store_trunc_add_from_64bits:
305+ ; BE: // %bb.0: // %entry
306+ ; BE-NEXT: sub sp, sp, #16
307+ ; BE-NEXT: .cfi_def_cfa_offset 16
308+ ; BE-NEXT: ldr s0, [x0]
309+ ; BE-NEXT: add x8, x0, #4
310+ ; BE-NEXT: rev32 v0.4h, v0.4h
311+ ; BE-NEXT: ld1 { v0.h }[2], [x8]
312+ ; BE-NEXT: adrp x8, .LCPI7_0
313+ ; BE-NEXT: add x8, x8, :lo12:.LCPI7_0
314+ ; BE-NEXT: ld1 { v1.4h }, [x8]
315+ ; BE-NEXT: add v0.4h, v0.4h, v1.4h
316+ ; BE-NEXT: xtn v1.8b, v0.8h
317+ ; BE-NEXT: umov w8, v0.h[2]
318+ ; BE-NEXT: rev32 v1.16b, v1.16b
319+ ; BE-NEXT: str s1, [sp, #12]
320+ ; BE-NEXT: ldrh w9, [sp, #12]
321+ ; BE-NEXT: strb w8, [x1, #2]
322+ ; BE-NEXT: strh w9, [x1]
323+ ; BE-NEXT: add sp, sp, #16
324+ ; BE-NEXT: ret
325+ entry:
326+ %l = load <3 x i16 >, ptr %src , align 1
327+ %a = add <3 x i16 > %l , <i16 3 , i16 4 , i16 5 >
328+ %t = trunc <3 x i16 > %a to <3 x i8 >
329+ store <3 x i8 > %t , ptr %dst , align 1
330+ ret void
331+ }
332+
281333define void @load_ext_to_64bits (ptr %src , ptr %dst ) {
282334; CHECK-LABEL: load_ext_to_64bits:
283335; CHECK: ; %bb.0: ; %entry
@@ -321,6 +373,60 @@ entry:
321373 ret void
322374}
323375
376+ define void @load_ext_add_to_64bits (ptr %src , ptr %dst ) {
377+ ; CHECK-LABEL: load_ext_add_to_64bits:
378+ ; CHECK: ; %bb.0: ; %entry
379+ ; CHECK-NEXT: sub sp, sp, #16
380+ ; CHECK-NEXT: .cfi_def_cfa_offset 16
381+ ; CHECK-NEXT: ldrh w9, [x0]
382+ ; CHECK-NEXT: Lloh2:
383+ ; CHECK-NEXT: adrp x8, lCPI9_0@PAGE
384+ ; CHECK-NEXT: Lloh3:
385+ ; CHECK-NEXT: ldr d1, [x8, lCPI9_0@PAGEOFF]
386+ ; CHECK-NEXT: add x8, x1, #4
387+ ; CHECK-NEXT: strh w9, [sp, #12]
388+ ; CHECK-NEXT: add x9, x0, #2
389+ ; CHECK-NEXT: ldr s0, [sp, #12]
390+ ; CHECK-NEXT: ushll.8h v0, v0, #0
391+ ; CHECK-NEXT: ld1.b { v0 }[4], [x9]
392+ ; CHECK-NEXT: bic.4h v0, #255, lsl #8
393+ ; CHECK-NEXT: add.4h v0, v0, v1
394+ ; CHECK-NEXT: st1.h { v0 }[2], [x8]
395+ ; CHECK-NEXT: str s0, [x1]
396+ ; CHECK-NEXT: add sp, sp, #16
397+ ; CHECK-NEXT: ret
398+ ; CHECK-NEXT: .loh AdrpLdr Lloh2, Lloh3
399+ ;
400+ ; BE-LABEL: load_ext_add_to_64bits:
401+ ; BE: // %bb.0: // %entry
402+ ; BE-NEXT: sub sp, sp, #16
403+ ; BE-NEXT: .cfi_def_cfa_offset 16
404+ ; BE-NEXT: ldrh w8, [x0]
405+ ; BE-NEXT: strh w8, [sp, #12]
406+ ; BE-NEXT: add x8, x0, #2
407+ ; BE-NEXT: ldr s0, [sp, #12]
408+ ; BE-NEXT: rev32 v0.8b, v0.8b
409+ ; BE-NEXT: ushll v0.8h, v0.8b, #0
410+ ; BE-NEXT: ld1 { v0.b }[4], [x8]
411+ ; BE-NEXT: adrp x8, .LCPI9_0
412+ ; BE-NEXT: add x8, x8, :lo12:.LCPI9_0
413+ ; BE-NEXT: ld1 { v1.4h }, [x8]
414+ ; BE-NEXT: add x8, x1, #4
415+ ; BE-NEXT: bic v0.4h, #255, lsl #8
416+ ; BE-NEXT: add v0.4h, v0.4h, v1.4h
417+ ; BE-NEXT: rev32 v1.8h, v0.8h
418+ ; BE-NEXT: st1 { v0.h }[2], [x8]
419+ ; BE-NEXT: str s1, [x1]
420+ ; BE-NEXT: add sp, sp, #16
421+ ; BE-NEXT: ret
422+ entry:
423+ %l = load <3 x i8 >, ptr %src , align 1
424+ %e = zext <3 x i8 > %l to <3 x i16 >
425+ %a = add <3 x i16 > %e , <i16 3 , i16 4 , i16 5 >
426+ store <3 x i16 > %a , ptr %dst , align 1
427+ ret void
428+ }
429+
324430define void @shift_trunc_store (ptr %src , ptr %dst ) {
325431; CHECK-LABEL: shift_trunc_store:
326432; CHECK: ; %bb.0:
0 commit comments