@@ -41,6 +41,48 @@ entry:
41
41
ret <8 x i16 > %out
42
42
}
43
43
44
+ define arm_aapcs_vfpcc <8 x i16 > @vmovn32_trunc3 (<4 x i32 > %src1 ) {
45
+ ; CHECK-LABEL: vmovn32_trunc3:
46
+ ; CHECK: @ %bb.0: @ %entry
47
+ ; CHECK-NEXT: vmov q1, q0
48
+ ; CHECK-NEXT: vmov r0, s4
49
+ ; CHECK-NEXT: vmov.16 q0[0], r0
50
+ ; CHECK-NEXT: vmov.16 q0[1], r0
51
+ ; CHECK-NEXT: vmov r0, s5
52
+ ; CHECK-NEXT: vmov.16 q0[2], r0
53
+ ; CHECK-NEXT: vmov.16 q0[3], r0
54
+ ; CHECK-NEXT: vmov r0, s6
55
+ ; CHECK-NEXT: vmov.16 q0[4], r0
56
+ ; CHECK-NEXT: vmov.16 q0[5], r0
57
+ ; CHECK-NEXT: vmov r0, s7
58
+ ; CHECK-NEXT: vmov.16 q0[6], r0
59
+ ; CHECK-NEXT: vmov.16 q0[7], r0
60
+ ; CHECK-NEXT: bx lr
61
+ ;
62
+ ; CHECKBE-LABEL: vmovn32_trunc3:
63
+ ; CHECKBE: @ %bb.0: @ %entry
64
+ ; CHECKBE-NEXT: vrev64.32 q2, q0
65
+ ; CHECKBE-NEXT: vmov r0, s8
66
+ ; CHECKBE-NEXT: vmov.16 q1[0], r0
67
+ ; CHECKBE-NEXT: vmov.16 q1[1], r0
68
+ ; CHECKBE-NEXT: vmov r0, s9
69
+ ; CHECKBE-NEXT: vmov.16 q1[2], r0
70
+ ; CHECKBE-NEXT: vmov.16 q1[3], r0
71
+ ; CHECKBE-NEXT: vmov r0, s10
72
+ ; CHECKBE-NEXT: vmov.16 q1[4], r0
73
+ ; CHECKBE-NEXT: vmov.16 q1[5], r0
74
+ ; CHECKBE-NEXT: vmov r0, s11
75
+ ; CHECKBE-NEXT: vmov.16 q1[6], r0
76
+ ; CHECKBE-NEXT: vmov.16 q1[7], r0
77
+ ; CHECKBE-NEXT: vrev64.16 q0, q1
78
+ ; CHECKBE-NEXT: bx lr
79
+ entry:
80
+ %strided.vec = shufflevector <4 x i32 > %src1 , <4 x i32 > undef , <8 x i32 > <i32 0 , i32 0 , i32 1 , i32 1 , i32 2 , i32 2 , i32 3 , i32 3 >
81
+ %out = trunc <8 x i32 > %strided.vec to <8 x i16 >
82
+ ret <8 x i16 > %out
83
+ }
84
+
85
+
44
86
define arm_aapcs_vfpcc <16 x i8 > @vmovn16_trunc1 (<8 x i16 > %src1 , <8 x i16 > %src2 ) {
45
87
; CHECK-LABEL: vmovn16_trunc1:
46
88
; CHECK: @ %bb.0: @ %entry
@@ -80,6 +122,72 @@ entry:
80
122
ret <16 x i8 > %out
81
123
}
82
124
125
+ define arm_aapcs_vfpcc <16 x i8 > @vmovn16_trunc3 (<8 x i16 > %src1 ) {
126
+ ; CHECK-LABEL: vmovn16_trunc3:
127
+ ; CHECK: @ %bb.0: @ %entry
128
+ ; CHECK-NEXT: vmov.u16 r0, q0[0]
129
+ ; CHECK-NEXT: vmov q1, q0
130
+ ; CHECK-NEXT: vmov.8 q0[0], r0
131
+ ; CHECK-NEXT: vmov.8 q0[1], r0
132
+ ; CHECK-NEXT: vmov.u16 r0, q1[1]
133
+ ; CHECK-NEXT: vmov.8 q0[2], r0
134
+ ; CHECK-NEXT: vmov.8 q0[3], r0
135
+ ; CHECK-NEXT: vmov.u16 r0, q1[2]
136
+ ; CHECK-NEXT: vmov.8 q0[4], r0
137
+ ; CHECK-NEXT: vmov.8 q0[5], r0
138
+ ; CHECK-NEXT: vmov.u16 r0, q1[3]
139
+ ; CHECK-NEXT: vmov.8 q0[6], r0
140
+ ; CHECK-NEXT: vmov.8 q0[7], r0
141
+ ; CHECK-NEXT: vmov.u16 r0, q1[4]
142
+ ; CHECK-NEXT: vmov.8 q0[8], r0
143
+ ; CHECK-NEXT: vmov.8 q0[9], r0
144
+ ; CHECK-NEXT: vmov.u16 r0, q1[5]
145
+ ; CHECK-NEXT: vmov.8 q0[10], r0
146
+ ; CHECK-NEXT: vmov.8 q0[11], r0
147
+ ; CHECK-NEXT: vmov.u16 r0, q1[6]
148
+ ; CHECK-NEXT: vmov.8 q0[12], r0
149
+ ; CHECK-NEXT: vmov.8 q0[13], r0
150
+ ; CHECK-NEXT: vmov.u16 r0, q1[7]
151
+ ; CHECK-NEXT: vmov.8 q0[14], r0
152
+ ; CHECK-NEXT: vmov.8 q0[15], r0
153
+ ; CHECK-NEXT: bx lr
154
+ ;
155
+ ; CHECKBE-LABEL: vmovn16_trunc3:
156
+ ; CHECKBE: @ %bb.0: @ %entry
157
+ ; CHECKBE-NEXT: vrev64.16 q2, q0
158
+ ; CHECKBE-NEXT: vmov.u16 r0, q2[0]
159
+ ; CHECKBE-NEXT: vmov.8 q1[0], r0
160
+ ; CHECKBE-NEXT: vmov.8 q1[1], r0
161
+ ; CHECKBE-NEXT: vmov.u16 r0, q2[1]
162
+ ; CHECKBE-NEXT: vmov.8 q1[2], r0
163
+ ; CHECKBE-NEXT: vmov.8 q1[3], r0
164
+ ; CHECKBE-NEXT: vmov.u16 r0, q2[2]
165
+ ; CHECKBE-NEXT: vmov.8 q1[4], r0
166
+ ; CHECKBE-NEXT: vmov.8 q1[5], r0
167
+ ; CHECKBE-NEXT: vmov.u16 r0, q2[3]
168
+ ; CHECKBE-NEXT: vmov.8 q1[6], r0
169
+ ; CHECKBE-NEXT: vmov.8 q1[7], r0
170
+ ; CHECKBE-NEXT: vmov.u16 r0, q2[4]
171
+ ; CHECKBE-NEXT: vmov.8 q1[8], r0
172
+ ; CHECKBE-NEXT: vmov.8 q1[9], r0
173
+ ; CHECKBE-NEXT: vmov.u16 r0, q2[5]
174
+ ; CHECKBE-NEXT: vmov.8 q1[10], r0
175
+ ; CHECKBE-NEXT: vmov.8 q1[11], r0
176
+ ; CHECKBE-NEXT: vmov.u16 r0, q2[6]
177
+ ; CHECKBE-NEXT: vmov.8 q1[12], r0
178
+ ; CHECKBE-NEXT: vmov.8 q1[13], r0
179
+ ; CHECKBE-NEXT: vmov.u16 r0, q2[7]
180
+ ; CHECKBE-NEXT: vmov.8 q1[14], r0
181
+ ; CHECKBE-NEXT: vmov.8 q1[15], r0
182
+ ; CHECKBE-NEXT: vrev64.8 q0, q1
183
+ ; CHECKBE-NEXT: bx lr
184
+ entry:
185
+ %strided.vec = shufflevector <8 x i16 > %src1 , <8 x i16 > undef , <16 x i32 > <i32 0 , i32 0 , i32 1 , i32 1 , i32 2 , i32 2 , i32 3 , i32 3 , i32 4 , i32 4 , i32 5 , i32 5 , i32 6 , i32 6 , i32 7 , i32 7 >
186
+ %out = trunc <16 x i16 > %strided.vec to <16 x i8 >
187
+ ret <16 x i8 > %out
188
+ }
189
+
190
+
83
191
84
192
define arm_aapcs_vfpcc <2 x i64 > @vmovn64_t1 (<2 x i64 > %src1 , <2 x i64 > %src2 ) {
85
193
; CHECK-LABEL: vmovn64_t1:
@@ -331,6 +439,25 @@ entry:
331
439
ret <4 x i32 > %out
332
440
}
333
441
442
+ define arm_aapcs_vfpcc <4 x i32 > @vmovn32_single_t (<4 x i32 > %src1 ) {
443
+ ; CHECK-LABEL: vmovn32_single_t:
444
+ ; CHECK: @ %bb.0: @ %entry
445
+ ; CHECK-NEXT: vmov.f32 s1, s0
446
+ ; CHECK-NEXT: vmov.f32 s3, s2
447
+ ; CHECK-NEXT: bx lr
448
+ ;
449
+ ; CHECKBE-LABEL: vmovn32_single_t:
450
+ ; CHECKBE: @ %bb.0: @ %entry
451
+ ; CHECKBE-NEXT: vrev64.32 q1, q0
452
+ ; CHECKBE-NEXT: vmov.f32 s5, s4
453
+ ; CHECKBE-NEXT: vmov.f32 s7, s6
454
+ ; CHECKBE-NEXT: vrev64.32 q0, q1
455
+ ; CHECKBE-NEXT: bx lr
456
+ entry:
457
+ %out = shufflevector <4 x i32 > %src1 , <4 x i32 > undef , <4 x i32 > <i32 0 , i32 0 , i32 2 , i32 2 >
458
+ ret <4 x i32 > %out
459
+ }
460
+
334
461
335
462
336
463
@@ -474,6 +601,29 @@ entry:
474
601
ret <8 x i16 > %out
475
602
}
476
603
604
+ define arm_aapcs_vfpcc <8 x i16 > @vmovn16_single_t (<8 x i16 > %src1 ) {
605
+ ; CHECK-LABEL: vmovn16_single_t:
606
+ ; CHECK: @ %bb.0: @ %entry
607
+ ; CHECK-NEXT: vins.f16 s0, s0
608
+ ; CHECK-NEXT: vins.f16 s1, s1
609
+ ; CHECK-NEXT: vins.f16 s2, s2
610
+ ; CHECK-NEXT: vins.f16 s3, s3
611
+ ; CHECK-NEXT: bx lr
612
+ ;
613
+ ; CHECKBE-LABEL: vmovn16_single_t:
614
+ ; CHECKBE: @ %bb.0: @ %entry
615
+ ; CHECKBE-NEXT: vrev64.16 q1, q0
616
+ ; CHECKBE-NEXT: vins.f16 s5, s5
617
+ ; CHECKBE-NEXT: vins.f16 s4, s4
618
+ ; CHECKBE-NEXT: vins.f16 s6, s6
619
+ ; CHECKBE-NEXT: vins.f16 s7, s7
620
+ ; CHECKBE-NEXT: vrev64.16 q0, q1
621
+ ; CHECKBE-NEXT: bx lr
622
+ entry:
623
+ %out = shufflevector <8 x i16 > %src1 , <8 x i16 > undef , <8 x i32 > <i32 0 , i32 0 , i32 2 , i32 2 , i32 4 , i32 4 , i32 6 , i32 6 >
624
+ ret <8 x i16 > %out
625
+ }
626
+
477
627
478
628
define arm_aapcs_vfpcc <16 x i8 > @vmovn8_b1 (<16 x i8 > %src1 , <16 x i8 > %src2 ) {
479
629
; CHECK-LABEL: vmovn8_b1:
@@ -710,3 +860,67 @@ entry:
710
860
%out = shufflevector <16 x i8 > %src1 , <16 x i8 > %src2 , <16 x i32 > <i32 16 , i32 1 , i32 18 , i32 3 , i32 20 , i32 5 , i32 22 , i32 7 , i32 24 , i32 9 , i32 26 , i32 11 , i32 28 , i32 13 , i32 30 , i32 15 >
711
861
ret <16 x i8 > %out
712
862
}
863
+
864
+ define arm_aapcs_vfpcc <16 x i8 > @vmovn8_single_t (<16 x i8 > %src1 ) {
865
+ ; CHECK-LABEL: vmovn8_single_t:
866
+ ; CHECK: @ %bb.0: @ %entry
867
+ ; CHECK-NEXT: vmov.u8 r0, q0[0]
868
+ ; CHECK-NEXT: vmov q1, q0
869
+ ; CHECK-NEXT: vmov.8 q0[0], r0
870
+ ; CHECK-NEXT: vmov.8 q0[1], r0
871
+ ; CHECK-NEXT: vmov.u8 r0, q1[2]
872
+ ; CHECK-NEXT: vmov.8 q0[2], r0
873
+ ; CHECK-NEXT: vmov.8 q0[3], r0
874
+ ; CHECK-NEXT: vmov.u8 r0, q1[4]
875
+ ; CHECK-NEXT: vmov.8 q0[4], r0
876
+ ; CHECK-NEXT: vmov.8 q0[5], r0
877
+ ; CHECK-NEXT: vmov.u8 r0, q1[6]
878
+ ; CHECK-NEXT: vmov.8 q0[6], r0
879
+ ; CHECK-NEXT: vmov.8 q0[7], r0
880
+ ; CHECK-NEXT: vmov.u8 r0, q1[8]
881
+ ; CHECK-NEXT: vmov.8 q0[8], r0
882
+ ; CHECK-NEXT: vmov.8 q0[9], r0
883
+ ; CHECK-NEXT: vmov.u8 r0, q1[10]
884
+ ; CHECK-NEXT: vmov.8 q0[10], r0
885
+ ; CHECK-NEXT: vmov.8 q0[11], r0
886
+ ; CHECK-NEXT: vmov.u8 r0, q1[12]
887
+ ; CHECK-NEXT: vmov.8 q0[12], r0
888
+ ; CHECK-NEXT: vmov.8 q0[13], r0
889
+ ; CHECK-NEXT: vmov.u8 r0, q1[14]
890
+ ; CHECK-NEXT: vmov.8 q0[14], r0
891
+ ; CHECK-NEXT: vmov.8 q0[15], r0
892
+ ; CHECK-NEXT: bx lr
893
+ ;
894
+ ; CHECKBE-LABEL: vmovn8_single_t:
895
+ ; CHECKBE: @ %bb.0: @ %entry
896
+ ; CHECKBE-NEXT: vrev64.8 q2, q0
897
+ ; CHECKBE-NEXT: vmov.u8 r0, q2[0]
898
+ ; CHECKBE-NEXT: vmov.8 q1[0], r0
899
+ ; CHECKBE-NEXT: vmov.8 q1[1], r0
900
+ ; CHECKBE-NEXT: vmov.u8 r0, q2[2]
901
+ ; CHECKBE-NEXT: vmov.8 q1[2], r0
902
+ ; CHECKBE-NEXT: vmov.8 q1[3], r0
903
+ ; CHECKBE-NEXT: vmov.u8 r0, q2[4]
904
+ ; CHECKBE-NEXT: vmov.8 q1[4], r0
905
+ ; CHECKBE-NEXT: vmov.8 q1[5], r0
906
+ ; CHECKBE-NEXT: vmov.u8 r0, q2[6]
907
+ ; CHECKBE-NEXT: vmov.8 q1[6], r0
908
+ ; CHECKBE-NEXT: vmov.8 q1[7], r0
909
+ ; CHECKBE-NEXT: vmov.u8 r0, q2[8]
910
+ ; CHECKBE-NEXT: vmov.8 q1[8], r0
911
+ ; CHECKBE-NEXT: vmov.8 q1[9], r0
912
+ ; CHECKBE-NEXT: vmov.u8 r0, q2[10]
913
+ ; CHECKBE-NEXT: vmov.8 q1[10], r0
914
+ ; CHECKBE-NEXT: vmov.8 q1[11], r0
915
+ ; CHECKBE-NEXT: vmov.u8 r0, q2[12]
916
+ ; CHECKBE-NEXT: vmov.8 q1[12], r0
917
+ ; CHECKBE-NEXT: vmov.8 q1[13], r0
918
+ ; CHECKBE-NEXT: vmov.u8 r0, q2[14]
919
+ ; CHECKBE-NEXT: vmov.8 q1[14], r0
920
+ ; CHECKBE-NEXT: vmov.8 q1[15], r0
921
+ ; CHECKBE-NEXT: vrev64.8 q0, q1
922
+ ; CHECKBE-NEXT: bx lr
923
+ entry:
924
+ %out = shufflevector <16 x i8 > %src1 , <16 x i8 > undef , <16 x i32 > <i32 0 , i32 0 , i32 2 , i32 2 , i32 4 , i32 4 , i32 6 , i32 6 , i32 8 , i32 8 , i32 10 , i32 10 , i32 12 , i32 12 , i32 14 , i32 14 >
925
+ ret <16 x i8 > %out
926
+ }
0 commit comments