@@ -8,6 +8,16 @@ define void @st1lane_16b(<16 x i8> %A, i8* %D) {
8
8
ret void
9
9
}
10
10
11
+ define void @st1lane0_ro_16b (<16 x i8 > %A , i8* %D , i64 %offset ) {
12
+ ; CHECK-LABEL: st1lane0_ro_16b
13
+ ; CHECK: umov.b w[[WREG:[0-9]+]], v0[0]
14
+ ; CHECK: strb w[[WREG]], [x0, x1]
15
+ %ptr = getelementptr i8* %D , i64 %offset
16
+ %tmp = extractelement <16 x i8 > %A , i32 0
17
+ store i8 %tmp , i8* %ptr
18
+ ret void
19
+ }
20
+
11
21
define void @st1lane_8h (<8 x i16 > %A , i16* %D ) {
12
22
; CHECK-LABEL: st1lane_8h
13
23
; CHECK: st1.h
@@ -16,6 +26,15 @@ define void @st1lane_8h(<8 x i16> %A, i16* %D) {
16
26
ret void
17
27
}
18
28
29
+ define void @st1lane0_ro_8h (<8 x i16 > %A , i16* %D , i64 %offset ) {
30
+ ; CHECK-LABEL: st1lane0_ro_8h
31
+ ; CHECK: str h0, [x0, x1, lsl #1]
32
+ %ptr = getelementptr i16* %D , i64 %offset
33
+ %tmp = extractelement <8 x i16 > %A , i32 0
34
+ store i16 %tmp , i16* %ptr
35
+ ret void
36
+ }
37
+
19
38
define void @st1lane_4s (<4 x i32 > %A , i32* %D ) {
20
39
; CHECK-LABEL: st1lane_4s
21
40
; CHECK: st1.s
@@ -24,6 +43,15 @@ define void @st1lane_4s(<4 x i32> %A, i32* %D) {
24
43
ret void
25
44
}
26
45
46
+ define void @st1lane0_ro_4s (<4 x i32 > %A , i32* %D , i64 %offset ) {
47
+ ; CHECK-LABEL: st1lane0_ro_4s
48
+ ; CHECK: str s0, [x0, x1, lsl #2]
49
+ %ptr = getelementptr i32* %D , i64 %offset
50
+ %tmp = extractelement <4 x i32 > %A , i32 0
51
+ store i32 %tmp , i32* %ptr
52
+ ret void
53
+ }
54
+
27
55
define void @st1lane_4s_float (<4 x float > %A , float * %D ) {
28
56
; CHECK-LABEL: st1lane_4s_float
29
57
; CHECK: st1.s
@@ -32,6 +60,15 @@ define void @st1lane_4s_float(<4 x float> %A, float* %D) {
32
60
ret void
33
61
}
34
62
63
+ define void @st1lane0_ro_4s_float (<4 x float > %A , float * %D , i64 %offset ) {
64
+ ; CHECK-LABEL: st1lane0_ro_4s_float
65
+ ; CHECK: str s0, [x0, x1, lsl #2]
66
+ %ptr = getelementptr float * %D , i64 %offset
67
+ %tmp = extractelement <4 x float > %A , i32 0
68
+ store float %tmp , float * %ptr
69
+ ret void
70
+ }
71
+
35
72
define void @st1lane_2d (<2 x i64 > %A , i64* %D ) {
36
73
; CHECK-LABEL: st1lane_2d
37
74
; CHECK: st1.d
@@ -40,6 +77,15 @@ define void @st1lane_2d(<2 x i64> %A, i64* %D) {
40
77
ret void
41
78
}
42
79
80
+ define void @st1lane0_ro_2d (<2 x i64 > %A , i64* %D , i64 %offset ) {
81
+ ; CHECK-LABEL: st1lane0_ro_2d
82
+ ; CHECK: str d0, [x0, x1, lsl #3]
83
+ %ptr = getelementptr i64* %D , i64 %offset
84
+ %tmp = extractelement <2 x i64 > %A , i32 0
85
+ store i64 %tmp , i64* %ptr
86
+ ret void
87
+ }
88
+
43
89
define void @st1lane_2d_double (<2 x double > %A , double * %D ) {
44
90
; CHECK-LABEL: st1lane_2d_double
45
91
; CHECK: st1.d
@@ -48,6 +94,15 @@ define void @st1lane_2d_double(<2 x double> %A, double* %D) {
48
94
ret void
49
95
}
50
96
97
+ define void @st1lane0_ro_2d_double (<2 x double > %A , double * %D , i64 %offset ) {
98
+ ; CHECK-LABEL: st1lane0_ro_2d_double
99
+ ; CHECK: str d0, [x0, x1, lsl #3]
100
+ %ptr = getelementptr double * %D , i64 %offset
101
+ %tmp = extractelement <2 x double > %A , i32 0
102
+ store double %tmp , double * %ptr
103
+ ret void
104
+ }
105
+
51
106
define void @st1lane_8b (<8 x i8 > %A , i8* %D ) {
52
107
; CHECK-LABEL: st1lane_8b
53
108
; CHECK: st1.b
@@ -56,6 +111,16 @@ define void @st1lane_8b(<8 x i8> %A, i8* %D) {
56
111
ret void
57
112
}
58
113
114
+ define void @st1lane0_ro_8b (<8 x i8 > %A , i8* %D , i64 %offset ) {
115
+ ; CHECK-LABEL: st1lane0_ro_8b
116
+ ; CHECK: umov.b w[[WREG:[0-9]+]], v0[0]
117
+ ; CHECK: strb w[[WREG]], [x0, x1]
118
+ %ptr = getelementptr i8* %D , i64 %offset
119
+ %tmp = extractelement <8 x i8 > %A , i32 0
120
+ store i8 %tmp , i8* %ptr
121
+ ret void
122
+ }
123
+
59
124
define void @st1lane_4h (<4 x i16 > %A , i16* %D ) {
60
125
; CHECK-LABEL: st1lane_4h
61
126
; CHECK: st1.h
@@ -64,6 +129,15 @@ define void @st1lane_4h(<4 x i16> %A, i16* %D) {
64
129
ret void
65
130
}
66
131
132
+ define void @st1lane0_ro_4h (<4 x i16 > %A , i16* %D , i64 %offset ) {
133
+ ; CHECK-LABEL: st1lane0_ro_4h
134
+ ; CHECK: str h0, [x0, x1, lsl #1]
135
+ %ptr = getelementptr i16* %D , i64 %offset
136
+ %tmp = extractelement <4 x i16 > %A , i32 0
137
+ store i16 %tmp , i16* %ptr
138
+ ret void
139
+ }
140
+
67
141
define void @st1lane_2s (<2 x i32 > %A , i32* %D ) {
68
142
; CHECK-LABEL: st1lane_2s
69
143
; CHECK: st1.s
@@ -72,6 +146,15 @@ define void @st1lane_2s(<2 x i32> %A, i32* %D) {
72
146
ret void
73
147
}
74
148
149
+ define void @st1lane0_ro_2s (<2 x i32 > %A , i32* %D , i64 %offset ) {
150
+ ; CHECK-LABEL: st1lane0_ro_2s
151
+ ; CHECK: str s0, [x0, x1, lsl #2]
152
+ %ptr = getelementptr i32* %D , i64 %offset
153
+ %tmp = extractelement <2 x i32 > %A , i32 0
154
+ store i32 %tmp , i32* %ptr
155
+ ret void
156
+ }
157
+
75
158
define void @st1lane_2s_float (<2 x float > %A , float * %D ) {
76
159
; CHECK-LABEL: st1lane_2s_float
77
160
; CHECK: st1.s
@@ -80,6 +163,15 @@ define void @st1lane_2s_float(<2 x float> %A, float* %D) {
80
163
ret void
81
164
}
82
165
166
+ define void @st1lane0_ro_2s_float (<2 x float > %A , float * %D , i64 %offset ) {
167
+ ; CHECK-LABEL: st1lane0_ro_2s_float
168
+ ; CHECK: str s0, [x0, x1, lsl #2]
169
+ %ptr = getelementptr float * %D , i64 %offset
170
+ %tmp = extractelement <2 x float > %A , i32 0
171
+ store float %tmp , float * %ptr
172
+ ret void
173
+ }
174
+
83
175
define void @st2lane_16b (<16 x i8 > %A , <16 x i8 > %B , i8* %D ) {
84
176
; CHECK-LABEL: st2lane_16b
85
177
; CHECK: st2.b
0 commit comments