blob: 326cb4e1677b6636eb5d62ffe72016ecb90b0b7f [file]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple aarch64 | FileCheck %s --check-prefix CHECK-LE
; RUN: llc < %s -mtriple aarch64_be | FileCheck %s --check-prefix CHECK-BE
; Note: Currently, interleaved stores are only directly supported on AArch64 for 64 bit or 128 bit vector data.
; Representative tests for each store type class where STNP shouldn't be lowered
; when optimizing for size.
define void @test_stnp_interleaved_store2_v2i32_Os(<2 x i32> %v0, <2 x i32> %v1, ptr %ptr) #0 {
; CHECK-LE-LABEL: test_stnp_interleaved_store2_v2i32_Os:
; CHECK-LE: // %bb.0: // %entry
; CHECK-LE-NEXT: // kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
; CHECK-LE-NEXT: // kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
; CHECK-LE-NEXT: st2 { v0.2s, v1.2s }, [x0]
; CHECK-LE-NEXT: ret
;
; CHECK-BE-LABEL: test_stnp_interleaved_store2_v2i32_Os:
; CHECK-BE: // %bb.0: // %entry
; CHECK-BE-NEXT: rev64 v2.2s, v1.2s
; CHECK-BE-NEXT: rev64 v1.2s, v0.2s
; CHECK-BE-NEXT: st2 { v1.2s, v2.2s }, [x0]
; CHECK-BE-NEXT: ret
entry:
%shuffle = shufflevector <2 x i32> %v0, <2 x i32> %v1,
<4 x i32> <i32 0, i32 2, i32 1, i32 3>
store <4 x i32> %shuffle, ptr %ptr, align 4, !nontemporal !0
ret void
}
define void @test_stnp_interleaved_store2_v2i32_Oz(<2 x i32> %v0, <2 x i32> %v1, ptr %ptr) #1 {
; CHECK-LE-LABEL: test_stnp_interleaved_store2_v2i32_Oz:
; CHECK-LE: // %bb.0: // %entry
; CHECK-LE-NEXT: // kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
; CHECK-LE-NEXT: // kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
; CHECK-LE-NEXT: st2 { v0.2s, v1.2s }, [x0]
; CHECK-LE-NEXT: ret
;
; CHECK-BE-LABEL: test_stnp_interleaved_store2_v2i32_Oz:
; CHECK-BE: // %bb.0: // %entry
; CHECK-BE-NEXT: rev64 v2.2s, v1.2s
; CHECK-BE-NEXT: rev64 v1.2s, v0.2s
; CHECK-BE-NEXT: st2 { v1.2s, v2.2s }, [x0]
; CHECK-BE-NEXT: ret
entry:
%shuffle = shufflevector <2 x i32> %v0, <2 x i32> %v1,
<4 x i32> <i32 0, i32 2, i32 1, i32 3>
store <4 x i32> %shuffle, ptr %ptr, align 4, !nontemporal !0
ret void
}
define void @test_stnp_interleaved_store2_v2i64_Os(<2 x i64> %v0, <2 x i64> %v1, ptr %ptr) #0 {
; CHECK-LE-LABEL: test_stnp_interleaved_store2_v2i64_Os:
; CHECK-LE: // %bb.0: // %entry
; CHECK-LE-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
; CHECK-LE-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
; CHECK-LE-NEXT: st2 { v0.2d, v1.2d }, [x0]
; CHECK-LE-NEXT: ret
;
; CHECK-BE-LABEL: test_stnp_interleaved_store2_v2i64_Os:
; CHECK-BE: // %bb.0: // %entry
; CHECK-BE-NEXT: ext v2.16b, v1.16b, v1.16b, #8
; CHECK-BE-NEXT: ext v1.16b, v0.16b, v0.16b, #8
; CHECK-BE-NEXT: st2 { v1.2d, v2.2d }, [x0]
; CHECK-BE-NEXT: ret
entry:
%shuffle = shufflevector <2 x i64> %v0, <2 x i64> %v1,
<4 x i32> <i32 0, i32 2, i32 1, i32 3>
store <4 x i64> %shuffle, ptr %ptr, align 8, !nontemporal !0
ret void
}
define void @test_stnp_interleaved_store2_v2i64_Oz(<2 x i64> %v0, <2 x i64> %v1, ptr %ptr) #1 {
; CHECK-LE-LABEL: test_stnp_interleaved_store2_v2i64_Oz:
; CHECK-LE: // %bb.0: // %entry
; CHECK-LE-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
; CHECK-LE-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
; CHECK-LE-NEXT: st2 { v0.2d, v1.2d }, [x0]
; CHECK-LE-NEXT: ret
;
; CHECK-BE-LABEL: test_stnp_interleaved_store2_v2i64_Oz:
; CHECK-BE: // %bb.0: // %entry
; CHECK-BE-NEXT: ext v2.16b, v1.16b, v1.16b, #8
; CHECK-BE-NEXT: ext v1.16b, v0.16b, v0.16b, #8
; CHECK-BE-NEXT: st2 { v1.2d, v2.2d }, [x0]
; CHECK-BE-NEXT: ret
entry:
%shuffle = shufflevector <2 x i64> %v0, <2 x i64> %v1,
<4 x i32> <i32 0, i32 2, i32 1, i32 3>
store <4 x i64> %shuffle, ptr %ptr, align 8, !nontemporal !0
ret void
}
!0 = !{ i32 1 }
attributes #0 = { optsize }
attributes #1 = { minsize optsize }