1/* simdhp.s Test file for AArch64 half-precision floating-point
2   vector instructions.  */
3
4	/* Vector three-same.  */
5
6	.macro three_same, op
7	\op	v1.2d, v2.2d, v3.2d
8	\op	v1.2s, v2.2s, v3.2s
9	\op	v1.4s, v2.4s, v3.4s
10	\op	v0.4h, v0.4h, v0.4h
11	\op	v1.4h, v2.4h, v3.4h
12	\op	v0.8h, v0.8h, v0.8h
13	\op	v1.8h, v2.8h, v3.8h
14	.endm
15
16	.text
17
18	three_same fmaxnm
19	three_same fmaxnmp
20	three_same fminnm
21	three_same fminnmp
22	three_same fmla
23	three_same fmls
24	three_same fadd
25	three_same faddp
26	three_same fsub
27	three_same fmulx
28	three_same fmul
29	three_same fcmeq
30	three_same fcmge
31	three_same fcmgt
32	three_same facge
33	three_same facgt
34	three_same fmax
35	three_same fmaxp
36	three_same fmin
37	three_same fminp
38	three_same frecps
39	three_same fdiv
40	three_same frsqrts
41
42	/* Scalar three-same.  */
43
44	.macro sthree_same, op
45	\op	d0, d1, d2
46	\op	s0, s1, s2
47	\op	h0, h1, h2
48	\op	h0, h0, h0
49	.endm
50
51	sthree_same fabd
52	sthree_same fmulx
53	sthree_same fcmeq
54	sthree_same fcmgt
55	sthree_same fcmge
56	sthree_same facge
57	sthree_same facgt
58	sthree_same frecps
59	sthree_same frsqrts
60
61	/* Vector two-register misc.  */
62
63	.macro tworeg_zero, op
64	\op	v0.2d, v1.2d, #0.0
65	\op	v0.2s, v1.2s, #0.0
66	\op	v0.4s, v1.4s, #0.0
67	\op	v0.4h, v1.4h, #0.0
68	\op	v0.8h, v1.8h, #0.0
69	.endm
70
71	tworeg_zero fcmgt
72	tworeg_zero fcmge
73	tworeg_zero fcmeq
74	tworeg_zero fcmle
75	tworeg_zero fcmlt
76
77	.macro tworeg_misc, op
78	\op	v0.2d, v1.2d
79	\op	v0.2s, v1.2s
80	\op	v0.4s, v1.4s
81	\op	v0.4h, v1.4h
82	\op	v0.8h, v1.8h
83	.endm
84
85	tworeg_misc fabs
86	tworeg_misc fneg
87
88	tworeg_misc frintn
89	tworeg_misc frinta
90	tworeg_misc frintp
91
92	tworeg_misc frintm
93	tworeg_misc frintx
94	tworeg_misc frintz
95	tworeg_misc frinti
96
97	tworeg_misc fcvtns
98	tworeg_misc fcvtnu
99	tworeg_misc fcvtps
100	tworeg_misc fcvtpu
101
102	tworeg_misc fcvtms
103	tworeg_misc fcvtmu
104	tworeg_misc fcvtzs
105	tworeg_misc fcvtzu
106
107	tworeg_misc fcvtas
108	tworeg_misc fcvtau
109
110	tworeg_misc scvtf
111	tworeg_misc ucvtf
112	tworeg_misc frecpe
113	tworeg_misc frsqrte
114	tworeg_misc fsqrt
115
116	/* Scalar two-register misc.  */
117
118	.macro stworeg_zero, op
119	\op	d0, d1, #0.0
120	\op	s0, s1, #0.0
121	\op	h0, h1, #0.0
122	\op	h0, h0, #0.0
123	.endm
124
125	stworeg_zero fcmgt
126	stworeg_zero fcmge
127	stworeg_zero fcmeq
128	stworeg_zero fcmle
129	stworeg_zero fcmlt
130
131	.macro stworeg_misc, op
132	\op	d0, d1
133	\op	s0, s1
134	\op	h0, h1
135	\op	h0, h0
136	.endm
137
138	stworeg_misc fcvtns
139	stworeg_misc fcvtnu
140	stworeg_misc fcvtps
141	stworeg_misc fcvtpu
142
143	stworeg_misc fcvtms
144	stworeg_misc fcvtmu
145	stworeg_misc fcvtzs
146	stworeg_misc fcvtzu
147
148	stworeg_misc fcvtas
149	stworeg_misc fcvtau
150
151	stworeg_misc scvtf
152	stworeg_misc ucvtf
153
154	stworeg_misc frecpe
155	stworeg_misc frsqrte
156	stworeg_misc frecpx
157
158	/* Vector indexed element.  */
159
160	.macro indexed_elem, op
161	\op	v1.2d, v2.2d, v3.d[1]
162	\op	v1.2s, v2.2s, v3.s[2]
163	\op	v1.4s, v2.4s, v3.s[1]
164	\op	v0.4h, v0.4h, v0.h[0]
165	\op	v1.4h, v2.4h, v3.h[0]
166	\op	v0.8h, v0.8h, v0.h[0]
167	\op	v1.8h, v2.8h, v3.h[0]
168	.endm
169
170	indexed_elem fmla
171	indexed_elem fmls
172
173	indexed_elem fmul
174	indexed_elem fmulx
175
176	/* Scalar indexed element.  */
177
178	.macro sindexed_elem, op
179	\op	d1, d2, v3.d[1]
180	\op	s1, s2, v3.s[1]
181	\op	h1, h2, v3.h[1]
182	\op	h0, h0, v0.h[0]
183	.endm
184
185	sindexed_elem fmla
186	sindexed_elem fmls
187
188	sindexed_elem fmul
189	sindexed_elem fmulx
190
191	/* Adv.SIMD across lanes.  */
192
193	.macro across_lanes, op
194	\op	s1, v2.4s
195	\op	h1, v2.4h
196	\op	h1, v2.8h
197	\op	h0, v0.4h
198	\op	h0, v0.8h
199	.endm
200
201	across_lanes fmaxnmv
202	across_lanes fmaxv
203	across_lanes fminnmv
204	across_lanes fminv
205
206	/* Adv.SIMD modified immediate.  */
207
208	fmov	v1.2d, #2.0
209	fmov	v1.2s, #2.0
210	fmov	v1.4s, #2.0
211	fmov	v1.4h, #2.0
212	fmov	v1.8h, #2.0
213	fmov	v0.4h, #1.0
214	fmov	v0.8h, #1.0
215
216	/* Adv.SIMD scalar pairwise.  */
217
218	.macro scalar_pairwise, op
219	\op	d1, v2.2d
220	\op	s1, v2.2s
221	\op	h1, v2.2h
222	\op	h0, v0.2h
223	.endm
224
225	scalar_pairwise fmaxnmp
226	scalar_pairwise faddp
227	scalar_pairwise fmaxp
228	scalar_pairwise fminnmp
229	scalar_pairwise fminp
230
231	/* Adv.SIMD shift by immediate.  */
232
233	.macro shift_imm, op
234	\op v1.2d, v2.2d, #3
235	\op v1.2s, v2.2s, #3
236	\op v1.4s, v2.4s, #3
237	\op v1.4h, v2.4h, #3
238	\op v1.8h, v2.8h, #3
239	\op v0.4h, v0.4h, #1
240	\op v0.8h, v0.8h, #1
241	.endm
242
243	shift_imm scvtf
244	shift_imm fcvtzs
245	shift_imm ucvtf
246	shift_imm fcvtzu
247
248	/* Adv.SIMD scalar shift by immediate.  */
249
250	.macro sshift_imm, op
251	\op d1, d2, #3
252	\op s1, s2, #3
253	\op h1, h2, #3
254	\op h0, h0, #1
255	.endm
256
257	sshift_imm scvtf
258	sshift_imm fcvtzs
259	sshift_imm ucvtf
260	sshift_imm fcvtzu
261