xref: /llvm-project/llvm/test/CodeGen/Thumb2/mve-ldst-regimm.ll (revision b5b663aac17415625340eb29c8010832bfc4c21c)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
3
4%struct.s_int8_t = type { [16 x i8], [16 x i8] }
5%struct.s_int16_t = type { [8 x i16], [8 x i16] }
6%struct.s_int32_t = type { [4 x i32], [4 x i32] }
7%struct.s_float16_t = type { [8 x half], [8 x half] }
8%struct.s_float32_t = type { [4 x float], [4 x float] }
9
10define hidden void @fwd_int8_t(ptr noalias %v) local_unnamed_addr #0 {
11; CHECK-LABEL: fwd_int8_t:
12; CHECK:       @ %bb.0: @ %entry
13; CHECK-NEXT:    vldrb.u8 q0, [r0]
14; CHECK-NEXT:    vstrb.8 q0, [r0, #16]
15; CHECK-NEXT:    bx lr
16entry:
17  %arrayidx3 = getelementptr inbounds %struct.s_int8_t, ptr %v, i32 0, i32 1, i32 0
18  %0 = load <16 x i8>, ptr %v, align 1
19  store <16 x i8> %0, ptr %arrayidx3, align 1
20  ret void
21}
22
23define hidden void @fwd_int16_t(ptr noalias nocapture %v) local_unnamed_addr #0 {
24; CHECK-LABEL: fwd_int16_t:
25; CHECK:       @ %bb.0: @ %entry
26; CHECK-NEXT:    vldrh.u16 q0, [r0]
27; CHECK-NEXT:    vstrh.16 q0, [r0, #16]
28; CHECK-NEXT:    bx lr
29entry:
30  %arrayidx3 = getelementptr inbounds %struct.s_int16_t, ptr %v, i32 0, i32 1, i32 0
31  %0 = load <8 x i16>, ptr %v, align 2
32  store <8 x i16> %0, ptr %arrayidx3, align 2
33  ret void
34}
35
36define hidden void @fwd_int32_t(ptr noalias nocapture %v) local_unnamed_addr #0 {
37; CHECK-LABEL: fwd_int32_t:
38; CHECK:       @ %bb.0: @ %entry
39; CHECK-NEXT:    vldrw.u32 q0, [r0]
40; CHECK-NEXT:    vstrw.32 q0, [r0, #16]
41; CHECK-NEXT:    bx lr
42entry:
43  %arrayidx3 = getelementptr inbounds %struct.s_int32_t, ptr %v, i32 0, i32 1, i32 0
44  %0 = load <4 x i32>, ptr %v, align 4
45  store <4 x i32> %0, ptr %arrayidx3, align 4
46  ret void
47}
48
49define hidden void @fwd_float16_t(ptr noalias nocapture %v) local_unnamed_addr #0 {
50; CHECK-LABEL: fwd_float16_t:
51; CHECK:       @ %bb.0: @ %entry
52; CHECK-NEXT:    vldrh.u16 q0, [r0], #16
53; CHECK-NEXT:    vstrh.16 q0, [r0]
54; CHECK-NEXT:    bx lr
55entry:
56  %arrayidx3 = getelementptr inbounds %struct.s_float16_t, ptr %v, i32 0, i32 1, i32 0
57  %0 = load <8 x half>, ptr %v, align 2
58  store <8 x half> %0, ptr %arrayidx3, align 2
59  ret void
60}
61
62define hidden void @fwd_float32_t(ptr noalias nocapture %v) local_unnamed_addr #0 {
63; CHECK-LABEL: fwd_float32_t:
64; CHECK:       @ %bb.0: @ %entry
65; CHECK-NEXT:    vldrw.u32 q0, [r0]
66; CHECK-NEXT:    vstrw.32 q0, [r0, #16]
67; CHECK-NEXT:    bx lr
68entry:
69  %d = getelementptr inbounds %struct.s_float32_t, ptr %v, i32 0, i32 1
70  %0 = load <4 x i32>, ptr %v, align 4
71  store <4 x i32> %0, ptr %d, align 4
72  ret void
73}
74
75define hidden void @bwd_int8_t(ptr noalias %v) local_unnamed_addr #0 {
76; CHECK-LABEL: bwd_int8_t:
77; CHECK:       @ %bb.0: @ %for.end
78; CHECK-NEXT:    vldrb.u8 q0, [r0]
79; CHECK-NEXT:    vstrb.8 q0, [r0, #-16]
80; CHECK-NEXT:    bx lr
81for.end:
82  %0 = load <16 x i8>, ptr %v, align 1
83  %arrayidx3 = getelementptr inbounds %struct.s_int8_t, ptr %v, i32 -1, i32 1, i32 0
84  store <16 x i8> %0, ptr %arrayidx3, align 1
85  ret void
86}
87
88define hidden void @bwd_int16_t(ptr noalias nocapture %v) local_unnamed_addr #0 {
89; CHECK-LABEL: bwd_int16_t:
90; CHECK:       @ %bb.0: @ %for.end
91; CHECK-NEXT:    vldrh.u16 q0, [r0]
92; CHECK-NEXT:    vstrh.16 q0, [r0, #-16]
93; CHECK-NEXT:    bx lr
94for.end:
95  %0 = load <8 x i16>, ptr %v, align 2
96  %arrayidx3 = getelementptr inbounds %struct.s_int16_t, ptr %v, i32 -1, i32 1, i32 0
97  store <8 x i16> %0, ptr %arrayidx3, align 2
98  ret void
99}
100
101define hidden void @bwd_int32_t(ptr noalias nocapture %v) local_unnamed_addr #0 {
102; CHECK-LABEL: bwd_int32_t:
103; CHECK:       @ %bb.0: @ %for.end
104; CHECK-NEXT:    vldrw.u32 q0, [r0]
105; CHECK-NEXT:    vstrw.32 q0, [r0, #-16]
106; CHECK-NEXT:    bx lr
107for.end:
108  %0 = load <4 x i32>, ptr %v, align 4
109  %arrayidx3 = getelementptr inbounds %struct.s_int32_t, ptr %v, i32 -1, i32 1, i32 0
110  store <4 x i32> %0, ptr %arrayidx3, align 4
111  ret void
112}
113
114define hidden void @bwd_float16_t(ptr noalias nocapture %v) local_unnamed_addr #0 {
115; CHECK-LABEL: bwd_float16_t:
116; CHECK:       @ %bb.0: @ %for.end
117; CHECK-NEXT:    vldrh.u16 q0, [r0], #-16
118; CHECK-NEXT:    vstrh.16 q0, [r0]
119; CHECK-NEXT:    bx lr
120for.end:
121  %0 = load <8 x half>, ptr %v, align 2
122  %arrayidx3 = getelementptr inbounds %struct.s_float16_t, ptr %v, i32 -1, i32 1, i32 0
123  store <8 x half> %0, ptr %arrayidx3, align 2
124  ret void
125}
126
127define hidden void @bwd_float32_t(ptr noalias nocapture %v) local_unnamed_addr #0 {
128; CHECK-LABEL: bwd_float32_t:
129; CHECK:       @ %bb.0: @ %for.end
130; CHECK-NEXT:    vldrw.u32 q0, [r0]
131; CHECK-NEXT:    vstrw.32 q0, [r0, #-16]
132; CHECK-NEXT:    bx lr
133for.end:
134  %0 = load <4 x i32>, ptr %v, align 4
135  %d = getelementptr inbounds %struct.s_float32_t, ptr %v, i32 -1, i32 1
136  store <4 x i32> %0, ptr %d, align 4
137  ret void
138}
139