@@ -450,3 +450,50 @@ define <4 x i8> @bitcast(i32 %0) {
450450 %2 = bitcast i32 %0 to <4 x i8 >
451451 ret <4 x i8 > %2
452452}
453+
454+ define <4 x i8 > @strict_align_aligned (ptr %v4i8_ptr ) "target-features" ="+strict-align" {
455+ ; CHECK-LE-LABEL: strict_align_aligned:
456+ ; CHECK-LE: // %bb.0:
457+ ; CHECK-LE-NEXT: ldr s0, [x0]
458+ ; CHECK-LE-NEXT: ushll v0.8h, v0.8b, #0
459+ ; CHECK-LE-NEXT: // kill: def $d0 killed $d0 killed $q0
460+ ; CHECK-LE-NEXT: ret
461+ ;
462+ ; CHECK-BE-LABEL: strict_align_aligned:
463+ ; CHECK-BE: // %bb.0:
464+ ; CHECK-BE-NEXT: ldr s0, [x0]
465+ ; CHECK-BE-NEXT: rev32 v0.8b, v0.8b
466+ ; CHECK-BE-NEXT: ushll v0.8h, v0.8b, #0
467+ ; CHECK-BE-NEXT: rev64 v0.4h, v0.4h
468+ ; CHECK-BE-NEXT: ret
469+ %v4i8 = load <4 x i8 >, ptr %v4i8_ptr , align 4
470+ ret <4 x i8 > %v4i8
471+ }
472+
473+ define <4 x i8 > @strict_align_unaligned (ptr %v4i8_ptr ) "target-features" ="+strict-align" {
474+ ; CHECK-LE-LABEL: strict_align_unaligned:
475+ ; CHECK-LE: // %bb.0:
476+ ; CHECK-LE-NEXT: ld1 { v0.b }[0], [x0]
477+ ; CHECK-LE-NEXT: add x8, x0, #1
478+ ; CHECK-LE-NEXT: ld1 { v0.b }[2], [x8]
479+ ; CHECK-LE-NEXT: add x8, x0, #2
480+ ; CHECK-LE-NEXT: ld1 { v0.b }[4], [x8]
481+ ; CHECK-LE-NEXT: add x8, x0, #3
482+ ; CHECK-LE-NEXT: ld1 { v0.b }[6], [x8]
483+ ; CHECK-LE-NEXT: // kill: def $d0 killed $d0 killed $q0
484+ ; CHECK-LE-NEXT: ret
485+ ;
486+ ; CHECK-BE-LABEL: strict_align_unaligned:
487+ ; CHECK-BE: // %bb.0:
488+ ; CHECK-BE-NEXT: ld1 { v0.b }[0], [x0]
489+ ; CHECK-BE-NEXT: add x8, x0, #1
490+ ; CHECK-BE-NEXT: ld1 { v0.b }[2], [x8]
491+ ; CHECK-BE-NEXT: add x8, x0, #2
492+ ; CHECK-BE-NEXT: ld1 { v0.b }[4], [x8]
493+ ; CHECK-BE-NEXT: add x8, x0, #3
494+ ; CHECK-BE-NEXT: ld1 { v0.b }[6], [x8]
495+ ; CHECK-BE-NEXT: rev64 v0.4h, v0.4h
496+ ; CHECK-BE-NEXT: ret
497+ %v4i8 = load <4 x i8 >, ptr %v4i8_ptr , align 1
498+ ret <4 x i8 > %v4i8
499+ }
0 commit comments