Revision 02da0b2d
b/target-arm/helper.h | ||
---|---|---|
154 | 154 |
DEF_HELPER_2(ror_cc, i32, i32, i32) |
155 | 155 |
|
156 | 156 |
/* neon_helper.c */ |
157 |
DEF_HELPER_2(neon_qadd_u8, i32, i32, i32)
|
|
158 |
DEF_HELPER_2(neon_qadd_s8, i32, i32, i32)
|
|
159 |
DEF_HELPER_2(neon_qadd_u16, i32, i32, i32)
|
|
160 |
DEF_HELPER_2(neon_qadd_s16, i32, i32, i32)
|
|
161 |
DEF_HELPER_2(neon_qadd_u32, i32, i32, i32)
|
|
162 |
DEF_HELPER_2(neon_qadd_s32, i32, i32, i32)
|
|
163 |
DEF_HELPER_2(neon_qsub_u8, i32, i32, i32)
|
|
164 |
DEF_HELPER_2(neon_qsub_s8, i32, i32, i32)
|
|
165 |
DEF_HELPER_2(neon_qsub_u16, i32, i32, i32)
|
|
166 |
DEF_HELPER_2(neon_qsub_s16, i32, i32, i32)
|
|
167 |
DEF_HELPER_2(neon_qsub_u32, i32, i32, i32)
|
|
168 |
DEF_HELPER_2(neon_qsub_s32, i32, i32, i32)
|
|
169 |
DEF_HELPER_2(neon_qadd_u64, i64, i64, i64)
|
|
170 |
DEF_HELPER_2(neon_qadd_s64, i64, i64, i64)
|
|
171 |
DEF_HELPER_2(neon_qsub_u64, i64, i64, i64)
|
|
172 |
DEF_HELPER_2(neon_qsub_s64, i64, i64, i64)
|
|
157 |
DEF_HELPER_3(neon_qadd_u8, i32, env, i32, i32)
|
|
158 |
DEF_HELPER_3(neon_qadd_s8, i32, env, i32, i32)
|
|
159 |
DEF_HELPER_3(neon_qadd_u16, i32, env, i32, i32)
|
|
160 |
DEF_HELPER_3(neon_qadd_s16, i32, env, i32, i32)
|
|
161 |
DEF_HELPER_3(neon_qadd_u32, i32, env, i32, i32)
|
|
162 |
DEF_HELPER_3(neon_qadd_s32, i32, env, i32, i32)
|
|
163 |
DEF_HELPER_3(neon_qsub_u8, i32, env, i32, i32)
|
|
164 |
DEF_HELPER_3(neon_qsub_s8, i32, env, i32, i32)
|
|
165 |
DEF_HELPER_3(neon_qsub_u16, i32, env, i32, i32)
|
|
166 |
DEF_HELPER_3(neon_qsub_s16, i32, env, i32, i32)
|
|
167 |
DEF_HELPER_3(neon_qsub_u32, i32, env, i32, i32)
|
|
168 |
DEF_HELPER_3(neon_qsub_s32, i32, env, i32, i32)
|
|
169 |
DEF_HELPER_3(neon_qadd_u64, i64, env, i64, i64)
|
|
170 |
DEF_HELPER_3(neon_qadd_s64, i64, env, i64, i64)
|
|
171 |
DEF_HELPER_3(neon_qsub_u64, i64, env, i64, i64)
|
|
172 |
DEF_HELPER_3(neon_qsub_s64, i64, env, i64, i64)
|
|
173 | 173 |
|
174 | 174 |
DEF_HELPER_2(neon_hadd_s8, i32, i32, i32) |
175 | 175 |
DEF_HELPER_2(neon_hadd_u8, i32, i32, i32) |
... | ... | |
247 | 247 |
DEF_HELPER_2(neon_rshl_s32, i32, i32, i32) |
248 | 248 |
DEF_HELPER_2(neon_rshl_u64, i64, i64, i64) |
249 | 249 |
DEF_HELPER_2(neon_rshl_s64, i64, i64, i64) |
250 |
DEF_HELPER_2(neon_qshl_u8, i32, i32, i32)
|
|
251 |
DEF_HELPER_2(neon_qshl_s8, i32, i32, i32)
|
|
252 |
DEF_HELPER_2(neon_qshl_u16, i32, i32, i32)
|
|
253 |
DEF_HELPER_2(neon_qshl_s16, i32, i32, i32)
|
|
254 |
DEF_HELPER_2(neon_qshl_u32, i32, i32, i32)
|
|
255 |
DEF_HELPER_2(neon_qshl_s32, i32, i32, i32)
|
|
256 |
DEF_HELPER_2(neon_qshl_u64, i64, i64, i64)
|
|
257 |
DEF_HELPER_2(neon_qshl_s64, i64, i64, i64)
|
|
258 |
DEF_HELPER_2(neon_qshlu_s8, i32, i32, i32);
|
|
259 |
DEF_HELPER_2(neon_qshlu_s16, i32, i32, i32);
|
|
260 |
DEF_HELPER_2(neon_qshlu_s32, i32, i32, i32);
|
|
261 |
DEF_HELPER_2(neon_qshlu_s64, i64, i64, i64);
|
|
262 |
DEF_HELPER_2(neon_qrshl_u8, i32, i32, i32)
|
|
263 |
DEF_HELPER_2(neon_qrshl_s8, i32, i32, i32)
|
|
264 |
DEF_HELPER_2(neon_qrshl_u16, i32, i32, i32)
|
|
265 |
DEF_HELPER_2(neon_qrshl_s16, i32, i32, i32)
|
|
266 |
DEF_HELPER_2(neon_qrshl_u32, i32, i32, i32)
|
|
267 |
DEF_HELPER_2(neon_qrshl_s32, i32, i32, i32)
|
|
268 |
DEF_HELPER_2(neon_qrshl_u64, i64, i64, i64)
|
|
269 |
DEF_HELPER_2(neon_qrshl_s64, i64, i64, i64)
|
|
250 |
DEF_HELPER_3(neon_qshl_u8, i32, env, i32, i32)
|
|
251 |
DEF_HELPER_3(neon_qshl_s8, i32, env, i32, i32)
|
|
252 |
DEF_HELPER_3(neon_qshl_u16, i32, env, i32, i32)
|
|
253 |
DEF_HELPER_3(neon_qshl_s16, i32, env, i32, i32)
|
|
254 |
DEF_HELPER_3(neon_qshl_u32, i32, env, i32, i32)
|
|
255 |
DEF_HELPER_3(neon_qshl_s32, i32, env, i32, i32)
|
|
256 |
DEF_HELPER_3(neon_qshl_u64, i64, env, i64, i64)
|
|
257 |
DEF_HELPER_3(neon_qshl_s64, i64, env, i64, i64)
|
|
258 |
DEF_HELPER_3(neon_qshlu_s8, i32, env, i32, i32);
|
|
259 |
DEF_HELPER_3(neon_qshlu_s16, i32, env, i32, i32);
|
|
260 |
DEF_HELPER_3(neon_qshlu_s32, i32, env, i32, i32);
|
|
261 |
DEF_HELPER_3(neon_qshlu_s64, i64, env, i64, i64);
|
|
262 |
DEF_HELPER_3(neon_qrshl_u8, i32, env, i32, i32)
|
|
263 |
DEF_HELPER_3(neon_qrshl_s8, i32, env, i32, i32)
|
|
264 |
DEF_HELPER_3(neon_qrshl_u16, i32, env, i32, i32)
|
|
265 |
DEF_HELPER_3(neon_qrshl_s16, i32, env, i32, i32)
|
|
266 |
DEF_HELPER_3(neon_qrshl_u32, i32, env, i32, i32)
|
|
267 |
DEF_HELPER_3(neon_qrshl_s32, i32, env, i32, i32)
|
|
268 |
DEF_HELPER_3(neon_qrshl_u64, i64, env, i64, i64)
|
|
269 |
DEF_HELPER_3(neon_qrshl_s64, i64, env, i64, i64)
|
|
270 | 270 |
|
271 | 271 |
DEF_HELPER_2(neon_add_u8, i32, i32, i32) |
272 | 272 |
DEF_HELPER_2(neon_add_u16, i32, i32, i32) |
... | ... | |
295 | 295 |
DEF_HELPER_1(neon_cls_s32, i32, i32) |
296 | 296 |
DEF_HELPER_1(neon_cnt_u8, i32, i32) |
297 | 297 |
|
298 |
DEF_HELPER_2(neon_qdmulh_s16, i32, i32, i32)
|
|
299 |
DEF_HELPER_2(neon_qrdmulh_s16, i32, i32, i32)
|
|
300 |
DEF_HELPER_2(neon_qdmulh_s32, i32, i32, i32)
|
|
301 |
DEF_HELPER_2(neon_qrdmulh_s32, i32, i32, i32)
|
|
298 |
DEF_HELPER_3(neon_qdmulh_s16, i32, env, i32, i32)
|
|
299 |
DEF_HELPER_3(neon_qrdmulh_s16, i32, env, i32, i32)
|
|
300 |
DEF_HELPER_3(neon_qdmulh_s32, i32, env, i32, i32)
|
|
301 |
DEF_HELPER_3(neon_qrdmulh_s32, i32, env, i32, i32)
|
|
302 | 302 |
|
303 | 303 |
DEF_HELPER_1(neon_narrow_u8, i32, i64) |
304 | 304 |
DEF_HELPER_1(neon_narrow_u16, i32, i64) |
305 |
DEF_HELPER_1(neon_unarrow_sat8, i32, i64)
|
|
306 |
DEF_HELPER_1(neon_narrow_sat_u8, i32, i64)
|
|
307 |
DEF_HELPER_1(neon_narrow_sat_s8, i32, i64)
|
|
308 |
DEF_HELPER_1(neon_unarrow_sat16, i32, i64)
|
|
309 |
DEF_HELPER_1(neon_narrow_sat_u16, i32, i64)
|
|
310 |
DEF_HELPER_1(neon_narrow_sat_s16, i32, i64)
|
|
311 |
DEF_HELPER_1(neon_unarrow_sat32, i32, i64)
|
|
312 |
DEF_HELPER_1(neon_narrow_sat_u32, i32, i64)
|
|
313 |
DEF_HELPER_1(neon_narrow_sat_s32, i32, i64)
|
|
305 |
DEF_HELPER_2(neon_unarrow_sat8, i32, env, i64)
|
|
306 |
DEF_HELPER_2(neon_narrow_sat_u8, i32, env, i64)
|
|
307 |
DEF_HELPER_2(neon_narrow_sat_s8, i32, env, i64)
|
|
308 |
DEF_HELPER_2(neon_unarrow_sat16, i32, env, i64)
|
|
309 |
DEF_HELPER_2(neon_narrow_sat_u16, i32, env, i64)
|
|
310 |
DEF_HELPER_2(neon_narrow_sat_s16, i32, env, i64)
|
|
311 |
DEF_HELPER_2(neon_unarrow_sat32, i32, env, i64)
|
|
312 |
DEF_HELPER_2(neon_narrow_sat_u32, i32, env, i64)
|
|
313 |
DEF_HELPER_2(neon_narrow_sat_s32, i32, env, i64)
|
|
314 | 314 |
DEF_HELPER_1(neon_narrow_high_u8, i32, i64) |
315 | 315 |
DEF_HELPER_1(neon_narrow_high_u16, i32, i64) |
316 | 316 |
DEF_HELPER_1(neon_narrow_round_high_u8, i32, i64) |
... | ... | |
326 | 326 |
DEF_HELPER_2(neon_paddl_u32, i64, i64, i64) |
327 | 327 |
DEF_HELPER_2(neon_subl_u16, i64, i64, i64) |
328 | 328 |
DEF_HELPER_2(neon_subl_u32, i64, i64, i64) |
329 |
DEF_HELPER_2(neon_addl_saturate_s32, i64, i64, i64)
|
|
330 |
DEF_HELPER_2(neon_addl_saturate_s64, i64, i64, i64)
|
|
329 |
DEF_HELPER_3(neon_addl_saturate_s32, i64, env, i64, i64)
|
|
330 |
DEF_HELPER_3(neon_addl_saturate_s64, i64, env, i64, i64)
|
|
331 | 331 |
DEF_HELPER_2(neon_abdl_u16, i64, i32, i32) |
332 | 332 |
DEF_HELPER_2(neon_abdl_s16, i64, i32, i32) |
333 | 333 |
DEF_HELPER_2(neon_abdl_u32, i64, i32, i32) |
... | ... | |
343 | 343 |
DEF_HELPER_1(neon_negl_u32, i64, i64) |
344 | 344 |
DEF_HELPER_1(neon_negl_u64, i64, i64) |
345 | 345 |
|
346 |
DEF_HELPER_1(neon_qabs_s8, i32, i32)
|
|
347 |
DEF_HELPER_1(neon_qabs_s16, i32, i32)
|
|
348 |
DEF_HELPER_1(neon_qabs_s32, i32, i32)
|
|
349 |
DEF_HELPER_1(neon_qneg_s8, i32, i32)
|
|
350 |
DEF_HELPER_1(neon_qneg_s16, i32, i32)
|
|
351 |
DEF_HELPER_1(neon_qneg_s32, i32, i32)
|
|
346 |
DEF_HELPER_2(neon_qabs_s8, i32, env, i32)
|
|
347 |
DEF_HELPER_2(neon_qabs_s16, i32, env, i32)
|
|
348 |
DEF_HELPER_2(neon_qabs_s32, i32, env, i32)
|
|
349 |
DEF_HELPER_2(neon_qneg_s8, i32, env, i32)
|
|
350 |
DEF_HELPER_2(neon_qneg_s16, i32, env, i32)
|
|
351 |
DEF_HELPER_2(neon_qneg_s32, i32, env, i32)
|
|
352 | 352 |
|
353 | 353 |
DEF_HELPER_3(neon_min_f32, i32, i32, i32, ptr) |
354 | 354 |
DEF_HELPER_3(neon_max_f32, i32, i32, i32, ptr) |
... | ... | |
458 | 458 |
|
459 | 459 |
DEF_HELPER_2(set_teecr, void, env, i32) |
460 | 460 |
|
461 |
DEF_HELPER_2(neon_unzip8, void, i32, i32)
|
|
462 |
DEF_HELPER_2(neon_unzip16, void, i32, i32)
|
|
463 |
DEF_HELPER_2(neon_qunzip8, void, i32, i32)
|
|
464 |
DEF_HELPER_2(neon_qunzip16, void, i32, i32)
|
|
465 |
DEF_HELPER_2(neon_qunzip32, void, i32, i32)
|
|
466 |
DEF_HELPER_2(neon_zip8, void, i32, i32)
|
|
467 |
DEF_HELPER_2(neon_zip16, void, i32, i32)
|
|
468 |
DEF_HELPER_2(neon_qzip8, void, i32, i32)
|
|
469 |
DEF_HELPER_2(neon_qzip16, void, i32, i32)
|
|
470 |
DEF_HELPER_2(neon_qzip32, void, i32, i32)
|
|
461 |
DEF_HELPER_3(neon_unzip8, void, env, i32, i32)
|
|
462 |
DEF_HELPER_3(neon_unzip16, void, env, i32, i32)
|
|
463 |
DEF_HELPER_3(neon_qunzip8, void, env, i32, i32)
|
|
464 |
DEF_HELPER_3(neon_qunzip16, void, env, i32, i32)
|
|
465 |
DEF_HELPER_3(neon_qunzip32, void, env, i32, i32)
|
|
466 |
DEF_HELPER_3(neon_zip8, void, env, i32, i32)
|
|
467 |
DEF_HELPER_3(neon_zip16, void, env, i32, i32)
|
|
468 |
DEF_HELPER_3(neon_qzip8, void, env, i32, i32)
|
|
469 |
DEF_HELPER_3(neon_qzip16, void, env, i32, i32)
|
|
470 |
DEF_HELPER_3(neon_qzip32, void, env, i32, i32)
|
|
471 | 471 |
|
472 | 472 |
#include "def-helper.h" |
b/target-arm/neon_helper.c | ||
---|---|---|
10 | 10 |
#include <stdio.h> |
11 | 11 |
|
12 | 12 |
#include "cpu.h" |
13 |
#include "exec.h" |
|
13 |
#include "exec-all.h"
|
|
14 | 14 |
#include "helper.h" |
15 | 15 |
|
16 | 16 |
#define SIGNBIT (uint32_t)0x80000000 |
... | ... | |
113 | 113 |
uint32_t HELPER(glue(neon_,name))(uint32_t arg1, uint32_t arg2) \ |
114 | 114 |
NEON_VOP_BODY(vtype, n) |
115 | 115 |
|
116 |
#define NEON_VOP_ENV(name, vtype, n) \ |
|
117 |
uint32_t HELPER(glue(neon_,name))(CPUState *env, uint32_t arg1, uint32_t arg2) \ |
|
118 |
NEON_VOP_BODY(vtype, n) |
|
119 |
|
|
116 | 120 |
/* Pairwise operations. */ |
117 | 121 |
/* For 32-bit elements each segment only contains a single element, so |
118 | 122 |
the elementwise and pairwise operations are the same. */ |
... | ... | |
161 | 165 |
dest = tmp; \ |
162 | 166 |
}} while(0) |
163 | 167 |
#define NEON_FN(dest, src1, src2) NEON_USAT(dest, src1, src2, uint8_t) |
164 |
NEON_VOP(qadd_u8, neon_u8, 4) |
|
168 |
NEON_VOP_ENV(qadd_u8, neon_u8, 4)
|
|
165 | 169 |
#undef NEON_FN |
166 | 170 |
#define NEON_FN(dest, src1, src2) NEON_USAT(dest, src1, src2, uint16_t) |
167 |
NEON_VOP(qadd_u16, neon_u16, 2) |
|
171 |
NEON_VOP_ENV(qadd_u16, neon_u16, 2)
|
|
168 | 172 |
#undef NEON_FN |
169 | 173 |
#undef NEON_USAT |
170 | 174 |
|
171 |
uint32_t HELPER(neon_qadd_u32)(uint32_t a, uint32_t b) |
|
175 |
uint32_t HELPER(neon_qadd_u32)(CPUState *env, uint32_t a, uint32_t b)
|
|
172 | 176 |
{ |
173 | 177 |
uint32_t res = a + b; |
174 | 178 |
if (res < a) { |
... | ... | |
178 | 182 |
return res; |
179 | 183 |
} |
180 | 184 |
|
181 |
uint64_t HELPER(neon_qadd_u64)(uint64_t src1, uint64_t src2) |
|
185 |
uint64_t HELPER(neon_qadd_u64)(CPUState *env, uint64_t src1, uint64_t src2)
|
|
182 | 186 |
{ |
183 | 187 |
uint64_t res; |
184 | 188 |
|
... | ... | |
203 | 207 |
dest = tmp; \ |
204 | 208 |
} while(0) |
205 | 209 |
#define NEON_FN(dest, src1, src2) NEON_SSAT(dest, src1, src2, int8_t) |
206 |
NEON_VOP(qadd_s8, neon_s8, 4) |
|
210 |
NEON_VOP_ENV(qadd_s8, neon_s8, 4)
|
|
207 | 211 |
#undef NEON_FN |
208 | 212 |
#define NEON_FN(dest, src1, src2) NEON_SSAT(dest, src1, src2, int16_t) |
209 |
NEON_VOP(qadd_s16, neon_s16, 2) |
|
213 |
NEON_VOP_ENV(qadd_s16, neon_s16, 2)
|
|
210 | 214 |
#undef NEON_FN |
211 | 215 |
#undef NEON_SSAT |
212 | 216 |
|
213 |
uint32_t HELPER(neon_qadd_s32)(uint32_t a, uint32_t b) |
|
217 |
uint32_t HELPER(neon_qadd_s32)(CPUState *env, uint32_t a, uint32_t b)
|
|
214 | 218 |
{ |
215 | 219 |
uint32_t res = a + b; |
216 | 220 |
if (((res ^ a) & SIGNBIT) && !((a ^ b) & SIGNBIT)) { |
... | ... | |
220 | 224 |
return res; |
221 | 225 |
} |
222 | 226 |
|
223 |
uint64_t HELPER(neon_qadd_s64)(uint64_t src1, uint64_t src2) |
|
227 |
uint64_t HELPER(neon_qadd_s64)(CPUState *env, uint64_t src1, uint64_t src2)
|
|
224 | 228 |
{ |
225 | 229 |
uint64_t res; |
226 | 230 |
|
... | ... | |
241 | 245 |
dest = tmp; \ |
242 | 246 |
}} while(0) |
243 | 247 |
#define NEON_FN(dest, src1, src2) NEON_USAT(dest, src1, src2, uint8_t) |
244 |
NEON_VOP(qsub_u8, neon_u8, 4) |
|
248 |
NEON_VOP_ENV(qsub_u8, neon_u8, 4)
|
|
245 | 249 |
#undef NEON_FN |
246 | 250 |
#define NEON_FN(dest, src1, src2) NEON_USAT(dest, src1, src2, uint16_t) |
247 |
NEON_VOP(qsub_u16, neon_u16, 2) |
|
251 |
NEON_VOP_ENV(qsub_u16, neon_u16, 2)
|
|
248 | 252 |
#undef NEON_FN |
249 | 253 |
#undef NEON_USAT |
250 | 254 |
|
251 |
uint32_t HELPER(neon_qsub_u32)(uint32_t a, uint32_t b) |
|
255 |
uint32_t HELPER(neon_qsub_u32)(CPUState *env, uint32_t a, uint32_t b)
|
|
252 | 256 |
{ |
253 | 257 |
uint32_t res = a - b; |
254 | 258 |
if (res > a) { |
... | ... | |
258 | 262 |
return res; |
259 | 263 |
} |
260 | 264 |
|
261 |
uint64_t HELPER(neon_qsub_u64)(uint64_t src1, uint64_t src2) |
|
265 |
uint64_t HELPER(neon_qsub_u64)(CPUState *env, uint64_t src1, uint64_t src2)
|
|
262 | 266 |
{ |
263 | 267 |
uint64_t res; |
264 | 268 |
|
... | ... | |
284 | 288 |
dest = tmp; \ |
285 | 289 |
} while(0) |
286 | 290 |
#define NEON_FN(dest, src1, src2) NEON_SSAT(dest, src1, src2, int8_t) |
287 |
NEON_VOP(qsub_s8, neon_s8, 4) |
|
291 |
NEON_VOP_ENV(qsub_s8, neon_s8, 4)
|
|
288 | 292 |
#undef NEON_FN |
289 | 293 |
#define NEON_FN(dest, src1, src2) NEON_SSAT(dest, src1, src2, int16_t) |
290 |
NEON_VOP(qsub_s16, neon_s16, 2) |
|
294 |
NEON_VOP_ENV(qsub_s16, neon_s16, 2)
|
|
291 | 295 |
#undef NEON_FN |
292 | 296 |
#undef NEON_SSAT |
293 | 297 |
|
294 |
uint32_t HELPER(neon_qsub_s32)(uint32_t a, uint32_t b) |
|
298 |
uint32_t HELPER(neon_qsub_s32)(CPUState *env, uint32_t a, uint32_t b)
|
|
295 | 299 |
{ |
296 | 300 |
uint32_t res = a - b; |
297 | 301 |
if (((res ^ a) & SIGNBIT) && ((a ^ b) & SIGNBIT)) { |
... | ... | |
301 | 305 |
return res; |
302 | 306 |
} |
303 | 307 |
|
304 |
uint64_t HELPER(neon_qsub_s64)(uint64_t src1, uint64_t src2) |
|
308 |
uint64_t HELPER(neon_qsub_s64)(CPUState *env, uint64_t src1, uint64_t src2)
|
|
305 | 309 |
{ |
306 | 310 |
uint64_t res; |
307 | 311 |
|
... | ... | |
652 | 656 |
dest = ~0; \ |
653 | 657 |
} \ |
654 | 658 |
}} while (0) |
655 |
NEON_VOP(qshl_u8, neon_u8, 4) |
|
656 |
NEON_VOP(qshl_u16, neon_u16, 2) |
|
657 |
NEON_VOP(qshl_u32, neon_u32, 1) |
|
659 |
NEON_VOP_ENV(qshl_u8, neon_u8, 4)
|
|
660 |
NEON_VOP_ENV(qshl_u16, neon_u16, 2)
|
|
661 |
NEON_VOP_ENV(qshl_u32, neon_u32, 1)
|
|
658 | 662 |
#undef NEON_FN |
659 | 663 |
|
660 |
uint64_t HELPER(neon_qshl_u64)(uint64_t val, uint64_t shiftop) |
|
664 |
uint64_t HELPER(neon_qshl_u64)(CPUState *env, uint64_t val, uint64_t shiftop)
|
|
661 | 665 |
{ |
662 | 666 |
int8_t shift = (int8_t)shiftop; |
663 | 667 |
if (shift >= 64) { |
... | ... | |
707 | 711 |
} \ |
708 | 712 |
} \ |
709 | 713 |
}} while (0) |
710 |
NEON_VOP(qshl_s8, neon_s8, 4) |
|
711 |
NEON_VOP(qshl_s16, neon_s16, 2) |
|
712 |
NEON_VOP(qshl_s32, neon_s32, 1) |
|
714 |
NEON_VOP_ENV(qshl_s8, neon_s8, 4)
|
|
715 |
NEON_VOP_ENV(qshl_s16, neon_s16, 2)
|
|
716 |
NEON_VOP_ENV(qshl_s32, neon_s32, 1)
|
|
713 | 717 |
#undef NEON_FN |
714 | 718 |
|
715 |
uint64_t HELPER(neon_qshl_s64)(uint64_t valop, uint64_t shiftop) |
|
719 |
uint64_t HELPER(neon_qshl_s64)(CPUState *env, uint64_t valop, uint64_t shiftop)
|
|
716 | 720 |
{ |
717 | 721 |
int8_t shift = (uint8_t)shiftop; |
718 | 722 |
int64_t val = valop; |
... | ... | |
762 | 766 |
} \ |
763 | 767 |
} \ |
764 | 768 |
}} while (0) |
765 |
NEON_VOP(qshlu_s8, neon_u8, 4) |
|
766 |
NEON_VOP(qshlu_s16, neon_u16, 2) |
|
769 |
NEON_VOP_ENV(qshlu_s8, neon_u8, 4)
|
|
770 |
NEON_VOP_ENV(qshlu_s16, neon_u16, 2)
|
|
767 | 771 |
#undef NEON_FN |
768 | 772 |
|
769 |
uint32_t HELPER(neon_qshlu_s32)(uint32_t valop, uint32_t shiftop) |
|
773 |
uint32_t HELPER(neon_qshlu_s32)(CPUState *env, uint32_t valop, uint32_t shiftop)
|
|
770 | 774 |
{ |
771 | 775 |
if ((int32_t)valop < 0) { |
772 | 776 |
SET_QC(); |
773 | 777 |
return 0; |
774 | 778 |
} |
775 |
return helper_neon_qshl_u32(valop, shiftop); |
|
779 |
return helper_neon_qshl_u32(env, valop, shiftop);
|
|
776 | 780 |
} |
777 | 781 |
|
778 |
uint64_t HELPER(neon_qshlu_s64)(uint64_t valop, uint64_t shiftop) |
|
782 |
uint64_t HELPER(neon_qshlu_s64)(CPUState *env, uint64_t valop, uint64_t shiftop)
|
|
779 | 783 |
{ |
780 | 784 |
if ((int64_t)valop < 0) { |
781 | 785 |
SET_QC(); |
782 | 786 |
return 0; |
783 | 787 |
} |
784 |
return helper_neon_qshl_u64(valop, shiftop); |
|
788 |
return helper_neon_qshl_u64(env, valop, shiftop);
|
|
785 | 789 |
} |
786 | 790 |
|
787 | 791 |
/* FIXME: This is wrong. */ |
... | ... | |
808 | 812 |
dest = ~0; \ |
809 | 813 |
} \ |
810 | 814 |
}} while (0) |
811 |
NEON_VOP(qrshl_u8, neon_u8, 4) |
|
812 |
NEON_VOP(qrshl_u16, neon_u16, 2) |
|
815 |
NEON_VOP_ENV(qrshl_u8, neon_u8, 4)
|
|
816 |
NEON_VOP_ENV(qrshl_u16, neon_u16, 2)
|
|
813 | 817 |
#undef NEON_FN |
814 | 818 |
|
815 | 819 |
/* The addition of the rounding constant may overflow, so we use an |
816 | 820 |
* intermediate 64 bits accumulator. */ |
817 |
uint32_t HELPER(neon_qrshl_u32)(uint32_t val, uint32_t shiftop) |
|
821 |
uint32_t HELPER(neon_qrshl_u32)(CPUState *env, uint32_t val, uint32_t shiftop)
|
|
818 | 822 |
{ |
819 | 823 |
uint32_t dest; |
820 | 824 |
int8_t shift = (int8_t)shiftop; |
... | ... | |
844 | 848 |
|
845 | 849 |
/* Handling addition overflow with 64 bits inputs values is more |
846 | 850 |
* tricky than with 32 bits values. */ |
847 |
uint64_t HELPER(neon_qrshl_u64)(uint64_t val, uint64_t shiftop) |
|
851 |
uint64_t HELPER(neon_qrshl_u64)(CPUState *env, uint64_t val, uint64_t shiftop)
|
|
848 | 852 |
{ |
849 | 853 |
int8_t shift = (int8_t)shiftop; |
850 | 854 |
if (shift >= 64) { |
... | ... | |
905 | 909 |
} \ |
906 | 910 |
} \ |
907 | 911 |
}} while (0) |
908 |
NEON_VOP(qrshl_s8, neon_s8, 4) |
|
909 |
NEON_VOP(qrshl_s16, neon_s16, 2) |
|
912 |
NEON_VOP_ENV(qrshl_s8, neon_s8, 4)
|
|
913 |
NEON_VOP_ENV(qrshl_s16, neon_s16, 2)
|
|
910 | 914 |
#undef NEON_FN |
911 | 915 |
|
912 | 916 |
/* The addition of the rounding constant may overflow, so we use an |
913 | 917 |
* intermediate 64 bits accumulator. */ |
914 |
uint32_t HELPER(neon_qrshl_s32)(uint32_t valop, uint32_t shiftop) |
|
918 |
uint32_t HELPER(neon_qrshl_s32)(CPUState *env, uint32_t valop, uint32_t shiftop)
|
|
915 | 919 |
{ |
916 | 920 |
int32_t dest; |
917 | 921 |
int32_t val = (int32_t)valop; |
... | ... | |
940 | 944 |
|
941 | 945 |
/* Handling addition overflow with 64 bits inputs values is more |
942 | 946 |
* tricky than with 32 bits values. */ |
943 |
uint64_t HELPER(neon_qrshl_s64)(uint64_t valop, uint64_t shiftop) |
|
947 |
uint64_t HELPER(neon_qrshl_s64)(CPUState *env, uint64_t valop, uint64_t shiftop)
|
|
944 | 948 |
{ |
945 | 949 |
int8_t shift = (uint8_t)shiftop; |
946 | 950 |
int64_t val = valop; |
... | ... | |
1149 | 1153 |
dest = tmp >> 16; \ |
1150 | 1154 |
} while(0) |
1151 | 1155 |
#define NEON_FN(dest, src1, src2) NEON_QDMULH16(dest, src1, src2, 0) |
1152 |
NEON_VOP(qdmulh_s16, neon_s16, 2) |
|
1156 |
NEON_VOP_ENV(qdmulh_s16, neon_s16, 2)
|
|
1153 | 1157 |
#undef NEON_FN |
1154 | 1158 |
#define NEON_FN(dest, src1, src2) NEON_QDMULH16(dest, src1, src2, 1) |
1155 |
NEON_VOP(qrdmulh_s16, neon_s16, 2) |
|
1159 |
NEON_VOP_ENV(qrdmulh_s16, neon_s16, 2)
|
|
1156 | 1160 |
#undef NEON_FN |
1157 | 1161 |
#undef NEON_QDMULH16 |
1158 | 1162 |
|
... | ... | |
1175 | 1179 |
dest = tmp >> 32; \ |
1176 | 1180 |
} while(0) |
1177 | 1181 |
#define NEON_FN(dest, src1, src2) NEON_QDMULH32(dest, src1, src2, 0) |
1178 |
NEON_VOP(qdmulh_s32, neon_s32, 1) |
|
1182 |
NEON_VOP_ENV(qdmulh_s32, neon_s32, 1)
|
|
1179 | 1183 |
#undef NEON_FN |
1180 | 1184 |
#define NEON_FN(dest, src1, src2) NEON_QDMULH32(dest, src1, src2, 1) |
1181 |
NEON_VOP(qrdmulh_s32, neon_s32, 1) |
|
1185 |
NEON_VOP_ENV(qrdmulh_s32, neon_s32, 1)
|
|
1182 | 1186 |
#undef NEON_FN |
1183 | 1187 |
#undef NEON_QDMULH32 |
1184 | 1188 |
|
... | ... | |
1219 | 1223 |
return ((x >> 16) & 0xffff) | ((x >> 32) & 0xffff0000); |
1220 | 1224 |
} |
1221 | 1225 |
|
1222 |
uint32_t HELPER(neon_unarrow_sat8)(uint64_t x) |
|
1226 |
uint32_t HELPER(neon_unarrow_sat8)(CPUState *env, uint64_t x)
|
|
1223 | 1227 |
{ |
1224 | 1228 |
uint16_t s; |
1225 | 1229 |
uint8_t d; |
... | ... | |
1246 | 1250 |
return res; |
1247 | 1251 |
} |
1248 | 1252 |
|
1249 |
uint32_t HELPER(neon_narrow_sat_u8)(uint64_t x) |
|
1253 |
uint32_t HELPER(neon_narrow_sat_u8)(CPUState *env, uint64_t x)
|
|
1250 | 1254 |
{ |
1251 | 1255 |
uint16_t s; |
1252 | 1256 |
uint8_t d; |
... | ... | |
1269 | 1273 |
return res; |
1270 | 1274 |
} |
1271 | 1275 |
|
1272 |
uint32_t HELPER(neon_narrow_sat_s8)(uint64_t x) |
|
1276 |
uint32_t HELPER(neon_narrow_sat_s8)(CPUState *env, uint64_t x)
|
|
1273 | 1277 |
{ |
1274 | 1278 |
int16_t s; |
1275 | 1279 |
uint8_t d; |
... | ... | |
1292 | 1296 |
return res; |
1293 | 1297 |
} |
1294 | 1298 |
|
1295 |
uint32_t HELPER(neon_unarrow_sat16)(uint64_t x) |
|
1299 |
uint32_t HELPER(neon_unarrow_sat16)(CPUState *env, uint64_t x)
|
|
1296 | 1300 |
{ |
1297 | 1301 |
uint32_t high; |
1298 | 1302 |
uint32_t low; |
... | ... | |
1315 | 1319 |
return low | (high << 16); |
1316 | 1320 |
} |
1317 | 1321 |
|
1318 |
uint32_t HELPER(neon_narrow_sat_u16)(uint64_t x) |
|
1322 |
uint32_t HELPER(neon_narrow_sat_u16)(CPUState *env, uint64_t x)
|
|
1319 | 1323 |
{ |
1320 | 1324 |
uint32_t high; |
1321 | 1325 |
uint32_t low; |
... | ... | |
1332 | 1336 |
return low | (high << 16); |
1333 | 1337 |
} |
1334 | 1338 |
|
1335 |
uint32_t HELPER(neon_narrow_sat_s16)(uint64_t x) |
|
1339 |
uint32_t HELPER(neon_narrow_sat_s16)(CPUState *env, uint64_t x)
|
|
1336 | 1340 |
{ |
1337 | 1341 |
int32_t low; |
1338 | 1342 |
int32_t high; |
... | ... | |
1349 | 1353 |
return (uint16_t)low | (high << 16); |
1350 | 1354 |
} |
1351 | 1355 |
|
1352 |
uint32_t HELPER(neon_unarrow_sat32)(uint64_t x) |
|
1356 |
uint32_t HELPER(neon_unarrow_sat32)(CPUState *env, uint64_t x)
|
|
1353 | 1357 |
{ |
1354 | 1358 |
if (x & 0x8000000000000000ull) { |
1355 | 1359 |
SET_QC(); |
... | ... | |
1362 | 1366 |
return x; |
1363 | 1367 |
} |
1364 | 1368 |
|
1365 |
uint32_t HELPER(neon_narrow_sat_u32)(uint64_t x) |
|
1369 |
uint32_t HELPER(neon_narrow_sat_u32)(CPUState *env, uint64_t x)
|
|
1366 | 1370 |
{ |
1367 | 1371 |
if (x > 0xffffffffu) { |
1368 | 1372 |
SET_QC(); |
... | ... | |
1371 | 1375 |
return x; |
1372 | 1376 |
} |
1373 | 1377 |
|
1374 |
uint32_t HELPER(neon_narrow_sat_s32)(uint64_t x) |
|
1378 |
uint32_t HELPER(neon_narrow_sat_s32)(CPUState *env, uint64_t x)
|
|
1375 | 1379 |
{ |
1376 | 1380 |
if ((int64_t)x != (int32_t)x) { |
1377 | 1381 |
SET_QC(); |
... | ... | |
1478 | 1482 |
return (a - b) ^ mask; |
1479 | 1483 |
} |
1480 | 1484 |
|
1481 |
uint64_t HELPER(neon_addl_saturate_s32)(uint64_t a, uint64_t b) |
|
1485 |
uint64_t HELPER(neon_addl_saturate_s32)(CPUState *env, uint64_t a, uint64_t b)
|
|
1482 | 1486 |
{ |
1483 | 1487 |
uint32_t x, y; |
1484 | 1488 |
uint32_t low, high; |
... | ... | |
1500 | 1504 |
return low | ((uint64_t)high << 32); |
1501 | 1505 |
} |
1502 | 1506 |
|
1503 |
uint64_t HELPER(neon_addl_saturate_s64)(uint64_t a, uint64_t b) |
|
1507 |
uint64_t HELPER(neon_addl_saturate_s64)(CPUState *env, uint64_t a, uint64_t b)
|
|
1504 | 1508 |
{ |
1505 | 1509 |
uint64_t result; |
1506 | 1510 |
|
... | ... | |
1676 | 1680 |
} else if (x < 0) { \ |
1677 | 1681 |
x = -x; \ |
1678 | 1682 |
}} while (0) |
1679 |
uint32_t HELPER(neon_qabs_s8)(uint32_t x) |
|
1683 |
uint32_t HELPER(neon_qabs_s8)(CPUState *env, uint32_t x)
|
|
1680 | 1684 |
{ |
1681 | 1685 |
neon_s8 vec; |
1682 | 1686 |
NEON_UNPACK(neon_s8, vec, x); |
... | ... | |
1696 | 1700 |
} else { \ |
1697 | 1701 |
x = -x; \ |
1698 | 1702 |
}} while (0) |
1699 |
uint32_t HELPER(neon_qneg_s8)(uint32_t x) |
|
1703 |
uint32_t HELPER(neon_qneg_s8)(CPUState *env, uint32_t x)
|
|
1700 | 1704 |
{ |
1701 | 1705 |
neon_s8 vec; |
1702 | 1706 |
NEON_UNPACK(neon_s8, vec, x); |
... | ... | |
1716 | 1720 |
} else if (x < 0) { \ |
1717 | 1721 |
x = -x; \ |
1718 | 1722 |
}} while (0) |
1719 |
uint32_t HELPER(neon_qabs_s16)(uint32_t x) |
|
1723 |
uint32_t HELPER(neon_qabs_s16)(CPUState *env, uint32_t x)
|
|
1720 | 1724 |
{ |
1721 | 1725 |
neon_s16 vec; |
1722 | 1726 |
NEON_UNPACK(neon_s16, vec, x); |
... | ... | |
1734 | 1738 |
} else { \ |
1735 | 1739 |
x = -x; \ |
1736 | 1740 |
}} while (0) |
1737 |
uint32_t HELPER(neon_qneg_s16)(uint32_t x) |
|
1741 |
uint32_t HELPER(neon_qneg_s16)(CPUState *env, uint32_t x)
|
|
1738 | 1742 |
{ |
1739 | 1743 |
neon_s16 vec; |
1740 | 1744 |
NEON_UNPACK(neon_s16, vec, x); |
... | ... | |
1745 | 1749 |
} |
1746 | 1750 |
#undef DO_QNEG16 |
1747 | 1751 |
|
1748 |
uint32_t HELPER(neon_qabs_s32)(uint32_t x) |
|
1752 |
uint32_t HELPER(neon_qabs_s32)(CPUState *env, uint32_t x)
|
|
1749 | 1753 |
{ |
1750 | 1754 |
if (x == SIGNBIT) { |
1751 | 1755 |
SET_QC(); |
... | ... | |
1756 | 1760 |
return x; |
1757 | 1761 |
} |
1758 | 1762 |
|
1759 |
uint32_t HELPER(neon_qneg_s32)(uint32_t x) |
|
1763 |
uint32_t HELPER(neon_qneg_s32)(CPUState *env, uint32_t x)
|
|
1760 | 1764 |
{ |
1761 | 1765 |
if (x == SIGNBIT) { |
1762 | 1766 |
SET_QC(); |
... | ... | |
1828 | 1832 |
|
1829 | 1833 |
#define ELEM(V, N, SIZE) (((V) >> ((N) * (SIZE))) & ((1ull << (SIZE)) - 1)) |
1830 | 1834 |
|
1831 |
void HELPER(neon_qunzip8)(uint32_t rd, uint32_t rm) |
|
1835 |
void HELPER(neon_qunzip8)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1832 | 1836 |
{ |
1833 | 1837 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
1834 | 1838 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
... | ... | |
1856 | 1860 |
env->vfp.regs[rd + 1] = make_float64(d1); |
1857 | 1861 |
} |
1858 | 1862 |
|
1859 |
void HELPER(neon_qunzip16)(uint32_t rd, uint32_t rm) |
|
1863 |
void HELPER(neon_qunzip16)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1860 | 1864 |
{ |
1861 | 1865 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
1862 | 1866 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
... | ... | |
1876 | 1880 |
env->vfp.regs[rd + 1] = make_float64(d1); |
1877 | 1881 |
} |
1878 | 1882 |
|
1879 |
void HELPER(neon_qunzip32)(uint32_t rd, uint32_t rm) |
|
1883 |
void HELPER(neon_qunzip32)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1880 | 1884 |
{ |
1881 | 1885 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
1882 | 1886 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
... | ... | |
1892 | 1896 |
env->vfp.regs[rd + 1] = make_float64(d1); |
1893 | 1897 |
} |
1894 | 1898 |
|
1895 |
void HELPER(neon_unzip8)(uint32_t rd, uint32_t rm) |
|
1899 |
void HELPER(neon_unzip8)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1896 | 1900 |
{ |
1897 | 1901 |
uint64_t zm = float64_val(env->vfp.regs[rm]); |
1898 | 1902 |
uint64_t zd = float64_val(env->vfp.regs[rd]); |
... | ... | |
1908 | 1912 |
env->vfp.regs[rd] = make_float64(d0); |
1909 | 1913 |
} |
1910 | 1914 |
|
1911 |
void HELPER(neon_unzip16)(uint32_t rd, uint32_t rm) |
|
1915 |
void HELPER(neon_unzip16)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1912 | 1916 |
{ |
1913 | 1917 |
uint64_t zm = float64_val(env->vfp.regs[rm]); |
1914 | 1918 |
uint64_t zd = float64_val(env->vfp.regs[rd]); |
... | ... | |
1920 | 1924 |
env->vfp.regs[rd] = make_float64(d0); |
1921 | 1925 |
} |
1922 | 1926 |
|
1923 |
void HELPER(neon_qzip8)(uint32_t rd, uint32_t rm) |
|
1927 |
void HELPER(neon_qzip8)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1924 | 1928 |
{ |
1925 | 1929 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
1926 | 1930 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
... | ... | |
1948 | 1952 |
env->vfp.regs[rd + 1] = make_float64(d1); |
1949 | 1953 |
} |
1950 | 1954 |
|
1951 |
void HELPER(neon_qzip16)(uint32_t rd, uint32_t rm) |
|
1955 |
void HELPER(neon_qzip16)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1952 | 1956 |
{ |
1953 | 1957 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
1954 | 1958 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
... | ... | |
1968 | 1972 |
env->vfp.regs[rd + 1] = make_float64(d1); |
1969 | 1973 |
} |
1970 | 1974 |
|
1971 |
void HELPER(neon_qzip32)(uint32_t rd, uint32_t rm) |
|
1975 |
void HELPER(neon_qzip32)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1972 | 1976 |
{ |
1973 | 1977 |
uint64_t zm0 = float64_val(env->vfp.regs[rm]); |
1974 | 1978 |
uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); |
... | ... | |
1984 | 1988 |
env->vfp.regs[rd + 1] = make_float64(d1); |
1985 | 1989 |
} |
1986 | 1990 |
|
1987 |
void HELPER(neon_zip8)(uint32_t rd, uint32_t rm) |
|
1991 |
void HELPER(neon_zip8)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
1988 | 1992 |
{ |
1989 | 1993 |
uint64_t zm = float64_val(env->vfp.regs[rm]); |
1990 | 1994 |
uint64_t zd = float64_val(env->vfp.regs[rd]); |
... | ... | |
2000 | 2004 |
env->vfp.regs[rd] = make_float64(d0); |
2001 | 2005 |
} |
2002 | 2006 |
|
2003 |
void HELPER(neon_zip16)(uint32_t rd, uint32_t rm) |
|
2007 |
void HELPER(neon_zip16)(CPUState *env, uint32_t rd, uint32_t rm)
|
|
2004 | 2008 |
{ |
2005 | 2009 |
uint64_t zm = float64_val(env->vfp.regs[rm]); |
2006 | 2010 |
uint64_t zd = float64_val(env->vfp.regs[rd]); |
b/target-arm/translate.c | ||
---|---|---|
3711 | 3711 |
if (q) { |
3712 | 3712 |
switch (size) { |
3713 | 3713 |
case 0: |
3714 |
gen_helper_neon_qunzip8(tmp, tmp2); |
|
3714 |
gen_helper_neon_qunzip8(cpu_env, tmp, tmp2);
|
|
3715 | 3715 |
break; |
3716 | 3716 |
case 1: |
3717 |
gen_helper_neon_qunzip16(tmp, tmp2); |
|
3717 |
gen_helper_neon_qunzip16(cpu_env, tmp, tmp2);
|
|
3718 | 3718 |
break; |
3719 | 3719 |
case 2: |
3720 |
gen_helper_neon_qunzip32(tmp, tmp2); |
|
3720 |
gen_helper_neon_qunzip32(cpu_env, tmp, tmp2);
|
|
3721 | 3721 |
break; |
3722 | 3722 |
default: |
3723 | 3723 |
abort(); |
... | ... | |
3725 | 3725 |
} else { |
3726 | 3726 |
switch (size) { |
3727 | 3727 |
case 0: |
3728 |
gen_helper_neon_unzip8(tmp, tmp2); |
|
3728 |
gen_helper_neon_unzip8(cpu_env, tmp, tmp2);
|
|
3729 | 3729 |
break; |
3730 | 3730 |
case 1: |
3731 |
gen_helper_neon_unzip16(tmp, tmp2); |
|
3731 |
gen_helper_neon_unzip16(cpu_env, tmp, tmp2);
|
|
3732 | 3732 |
break; |
3733 | 3733 |
default: |
3734 | 3734 |
abort(); |
... | ... | |
3750 | 3750 |
if (q) { |
3751 | 3751 |
switch (size) { |
3752 | 3752 |
case 0: |
3753 |
gen_helper_neon_qzip8(tmp, tmp2); |
|
3753 |
gen_helper_neon_qzip8(cpu_env, tmp, tmp2);
|
|
3754 | 3754 |
break; |
3755 | 3755 |
case 1: |
3756 |
gen_helper_neon_qzip16(tmp, tmp2); |
|
3756 |
gen_helper_neon_qzip16(cpu_env, tmp, tmp2);
|
|
3757 | 3757 |
break; |
3758 | 3758 |
case 2: |
3759 |
gen_helper_neon_qzip32(tmp, tmp2); |
|
3759 |
gen_helper_neon_qzip32(cpu_env, tmp, tmp2);
|
|
3760 | 3760 |
break; |
3761 | 3761 |
default: |
3762 | 3762 |
abort(); |
... | ... | |
3764 | 3764 |
} else { |
3765 | 3765 |
switch (size) { |
3766 | 3766 |
case 0: |
3767 |
gen_helper_neon_zip8(tmp, tmp2); |
|
3767 |
gen_helper_neon_zip8(cpu_env, tmp, tmp2);
|
|
3768 | 3768 |
break; |
3769 | 3769 |
case 1: |
3770 |
gen_helper_neon_zip16(tmp, tmp2); |
|
3770 |
gen_helper_neon_zip16(cpu_env, tmp, tmp2);
|
|
3771 | 3771 |
break; |
3772 | 3772 |
default: |
3773 | 3773 |
abort(); |
... | ... | |
4167 | 4167 |
static inline void gen_neon_narrow_sats(int size, TCGv dest, TCGv_i64 src) |
4168 | 4168 |
{ |
4169 | 4169 |
switch (size) { |
4170 |
case 0: gen_helper_neon_narrow_sat_s8(dest, src); break; |
|
4171 |
case 1: gen_helper_neon_narrow_sat_s16(dest, src); break; |
|
4172 |
case 2: gen_helper_neon_narrow_sat_s32(dest, src); break; |
|
4170 |
case 0: gen_helper_neon_narrow_sat_s8(dest, cpu_env, src); break;
|
|
4171 |
case 1: gen_helper_neon_narrow_sat_s16(dest, cpu_env, src); break;
|
|
4172 |
case 2: gen_helper_neon_narrow_sat_s32(dest, cpu_env, src); break;
|
|
4173 | 4173 |
default: abort(); |
4174 | 4174 |
} |
4175 | 4175 |
} |
... | ... | |
4177 | 4177 |
static inline void gen_neon_narrow_satu(int size, TCGv dest, TCGv_i64 src) |
4178 | 4178 |
{ |
4179 | 4179 |
switch (size) { |
4180 |
case 0: gen_helper_neon_narrow_sat_u8(dest, src); break; |
|
4181 |
case 1: gen_helper_neon_narrow_sat_u16(dest, src); break; |
|
4182 |
case 2: gen_helper_neon_narrow_sat_u32(dest, src); break; |
|
4180 |
case 0: gen_helper_neon_narrow_sat_u8(dest, cpu_env, src); break;
|
|
4181 |
case 1: gen_helper_neon_narrow_sat_u16(dest, cpu_env, src); break;
|
|
4182 |
case 2: gen_helper_neon_narrow_sat_u32(dest, cpu_env, src); break;
|
|
4183 | 4183 |
default: abort(); |
4184 | 4184 |
} |
4185 | 4185 |
} |
... | ... | |
4187 | 4187 |
static inline void gen_neon_unarrow_sats(int size, TCGv dest, TCGv_i64 src) |
4188 | 4188 |
{ |
4189 | 4189 |
switch (size) { |
4190 |
case 0: gen_helper_neon_unarrow_sat8(dest, src); break; |
|
4191 |
case 1: gen_helper_neon_unarrow_sat16(dest, src); break; |
|
4192 |
case 2: gen_helper_neon_unarrow_sat32(dest, src); break; |
|
4190 |
case 0: gen_helper_neon_unarrow_sat8(dest, cpu_env, src); break;
|
|
4191 |
case 1: gen_helper_neon_unarrow_sat16(dest, cpu_env, src); break;
|
|
4192 |
case 2: gen_helper_neon_unarrow_sat32(dest, cpu_env, src); break;
|
|
4193 | 4193 |
default: abort(); |
4194 | 4194 |
} |
4195 | 4195 |
} |
... | ... | |
4281 | 4281 |
static inline void gen_neon_addl_saturate(TCGv_i64 op0, TCGv_i64 op1, int size) |
4282 | 4282 |
{ |
4283 | 4283 |
switch (size) { |
4284 |
case 1: gen_helper_neon_addl_saturate_s32(op0, op0, op1); break; |
|
4285 |
case 2: gen_helper_neon_addl_saturate_s64(op0, op0, op1); break; |
|
4284 |
case 1: gen_helper_neon_addl_saturate_s32(op0, cpu_env, op0, op1); break;
|
|
4285 |
case 2: gen_helper_neon_addl_saturate_s64(op0, cpu_env, op0, op1); break;
|
|
4286 | 4286 |
default: abort(); |
4287 | 4287 |
} |
4288 | 4288 |
} |
... | ... | |
4558 | 4558 |
switch (op) { |
4559 | 4559 |
case NEON_3R_VQADD: |
4560 | 4560 |
if (u) { |
4561 |
gen_helper_neon_qadd_u64(cpu_V0, cpu_V0, cpu_V1); |
|
4561 |
gen_helper_neon_qadd_u64(cpu_V0, cpu_env, |
|
4562 |
cpu_V0, cpu_V1); |
|
4562 | 4563 |
} else { |
4563 |
gen_helper_neon_qadd_s64(cpu_V0, cpu_V0, cpu_V1); |
|
4564 |
gen_helper_neon_qadd_s64(cpu_V0, cpu_env, |
|
4565 |
cpu_V0, cpu_V1); |
|
4564 | 4566 |
} |
4565 | 4567 |
break; |
4566 | 4568 |
case NEON_3R_VQSUB: |
4567 | 4569 |
if (u) { |
4568 |
gen_helper_neon_qsub_u64(cpu_V0, cpu_V0, cpu_V1); |
|
4570 |
gen_helper_neon_qsub_u64(cpu_V0, cpu_env, |
|
4571 |
cpu_V0, cpu_V1); |
|
4569 | 4572 |
} else { |
4570 |
gen_helper_neon_qsub_s64(cpu_V0, cpu_V0, cpu_V1); |
|
4573 |
gen_helper_neon_qsub_s64(cpu_V0, cpu_env, |
|
4574 |
cpu_V0, cpu_V1); |
|
4571 | 4575 |
} |
4572 | 4576 |
break; |
4573 | 4577 |
case NEON_3R_VSHL: |
... | ... | |
4579 | 4583 |
break; |
4580 | 4584 |
case NEON_3R_VQSHL: |
4581 | 4585 |
if (u) { |
4582 |
gen_helper_neon_qshl_u64(cpu_V0, cpu_V1, cpu_V0); |
|
4586 |
gen_helper_neon_qshl_u64(cpu_V0, cpu_env, |
|
4587 |
cpu_V1, cpu_V0); |
|
4583 | 4588 |
} else { |
4584 |
gen_helper_neon_qshl_s64(cpu_V0, cpu_V1, cpu_V0); |
|
4589 |
gen_helper_neon_qshl_s64(cpu_V0, cpu_env, |
|
4590 |
cpu_V1, cpu_V0); |
|
4585 | 4591 |
} |
4586 | 4592 |
break; |
4587 | 4593 |
case NEON_3R_VRSHL: |
... | ... | |
4593 | 4599 |
break; |
4594 | 4600 |
case NEON_3R_VQRSHL: |
4595 | 4601 |
if (u) { |
4596 |
gen_helper_neon_qrshl_u64(cpu_V0, cpu_V1, cpu_V0); |
|
4602 |
gen_helper_neon_qrshl_u64(cpu_V0, cpu_env, |
|
4603 |
cpu_V1, cpu_V0); |
|
4597 | 4604 |
} else { |
4598 |
gen_helper_neon_qrshl_s64(cpu_V0, cpu_V1, cpu_V0); |
|
4605 |
gen_helper_neon_qrshl_s64(cpu_V0, cpu_env, |
|
4606 |
cpu_V1, cpu_V0); |
|
4599 | 4607 |
} |
4600 | 4608 |
break; |
4601 | 4609 |
case NEON_3R_VADD_VSUB: |
... | ... | |
4693 | 4701 |
GEN_NEON_INTEGER_OP(hadd); |
4694 | 4702 |
break; |
4695 | 4703 |
case NEON_3R_VQADD: |
4696 |
GEN_NEON_INTEGER_OP(qadd); |
|
4704 |
GEN_NEON_INTEGER_OP_ENV(qadd);
|
|
4697 | 4705 |
break; |
4698 | 4706 |
case NEON_3R_VRHADD: |
4699 | 4707 |
GEN_NEON_INTEGER_OP(rhadd); |
... | ... | |
4736 | 4744 |
GEN_NEON_INTEGER_OP(hsub); |
4737 | 4745 |
break; |
4738 | 4746 |
case NEON_3R_VQSUB: |
4739 |
GEN_NEON_INTEGER_OP(qsub); |
|
4747 |
GEN_NEON_INTEGER_OP_ENV(qsub);
|
|
4740 | 4748 |
break; |
4741 | 4749 |
case NEON_3R_VCGT: |
4742 | 4750 |
GEN_NEON_INTEGER_OP(cgt); |
... | ... | |
4748 | 4756 |
GEN_NEON_INTEGER_OP(shl); |
4749 | 4757 |
break; |
4750 | 4758 |
case NEON_3R_VQSHL: |
4751 |
GEN_NEON_INTEGER_OP(qshl); |
|
4759 |
GEN_NEON_INTEGER_OP_ENV(qshl);
|
|
4752 | 4760 |
break; |
4753 | 4761 |
case NEON_3R_VRSHL: |
4754 | 4762 |
GEN_NEON_INTEGER_OP(rshl); |
4755 | 4763 |
break; |
4756 | 4764 |
case NEON_3R_VQRSHL: |
4757 |
GEN_NEON_INTEGER_OP(qrshl); |
|
4765 |
GEN_NEON_INTEGER_OP_ENV(qrshl);
|
|
4758 | 4766 |
break; |
4759 | 4767 |
case NEON_3R_VMAX: |
4760 | 4768 |
GEN_NEON_INTEGER_OP(max); |
... | ... | |
4836 | 4844 |
case NEON_3R_VQDMULH_VQRDMULH: /* Multiply high. */ |
4837 | 4845 |
if (!u) { /* VQDMULH */ |
4838 | 4846 |
switch (size) { |
4839 |
case 1: gen_helper_neon_qdmulh_s16(tmp, tmp, tmp2); break; |
|
4840 |
case 2: gen_helper_neon_qdmulh_s32(tmp, tmp, tmp2); break; |
|
4847 |
case 1: |
|
4848 |
gen_helper_neon_qdmulh_s16(tmp, cpu_env, tmp, tmp2); |
|
4849 |
break; |
|
4850 |
case 2: |
|
4851 |
gen_helper_neon_qdmulh_s32(tmp, cpu_env, tmp, tmp2); |
|
4852 |
break; |
|
4841 | 4853 |
default: abort(); |
4842 | 4854 |
} |
4843 | 4855 |
} else { /* VQRDMULH */ |
4844 | 4856 |
switch (size) { |
4845 |
case 1: gen_helper_neon_qrdmulh_s16(tmp, tmp, tmp2); break; |
|
4846 |
case 2: gen_helper_neon_qrdmulh_s32(tmp, tmp, tmp2); break; |
|
4857 |
case 1: |
|
4858 |
gen_helper_neon_qrdmulh_s16(tmp, cpu_env, tmp, tmp2); |
|
4859 |
break; |
|
4860 |
case 2: |
|
4861 |
gen_helper_neon_qrdmulh_s32(tmp, cpu_env, tmp, tmp2); |
|
4862 |
break; |
|
4847 | 4863 |
default: abort(); |
4848 | 4864 |
} |
4849 | 4865 |
} |
... | ... | |
5035 | 5051 |
gen_helper_neon_shl_u64(cpu_V0, cpu_V0, cpu_V1); |
5036 | 5052 |
break; |
5037 | 5053 |
case 6: /* VQSHLU */ |
5038 |
gen_helper_neon_qshlu_s64(cpu_V0, cpu_V0, cpu_V1); |
|
5054 |
gen_helper_neon_qshlu_s64(cpu_V0, cpu_env, |
|
5055 |
cpu_V0, cpu_V1); |
|
5039 | 5056 |
break; |
5040 | 5057 |
case 7: /* VQSHL */ |
5041 | 5058 |
if (u) { |
5042 |
gen_helper_neon_qshl_u64(cpu_V0, |
|
5059 |
gen_helper_neon_qshl_u64(cpu_V0, cpu_env,
|
|
5043 | 5060 |
cpu_V0, cpu_V1); |
5044 | 5061 |
} else { |
5045 |
gen_helper_neon_qshl_s64(cpu_V0, |
|
5062 |
gen_helper_neon_qshl_s64(cpu_V0, cpu_env,
|
|
5046 | 5063 |
cpu_V0, cpu_V1); |
5047 | 5064 |
} |
5048 | 5065 |
break; |
... | ... | |
5094 | 5111 |
case 6: /* VQSHLU */ |
5095 | 5112 |
switch (size) { |
5096 | 5113 |
case 0: |
5097 |
gen_helper_neon_qshlu_s8(tmp, tmp, tmp2); |
|
5114 |
gen_helper_neon_qshlu_s8(tmp, cpu_env, |
|
5115 |
tmp, tmp2); |
|
5098 | 5116 |
break; |
5099 | 5117 |
case 1: |
5100 |
gen_helper_neon_qshlu_s16(tmp, tmp, tmp2); |
|
5118 |
gen_helper_neon_qshlu_s16(tmp, cpu_env, |
|
5119 |
tmp, tmp2); |
|
5101 | 5120 |
break; |
5102 | 5121 |
case 2: |
5103 |
gen_helper_neon_qshlu_s32(tmp, tmp, tmp2); |
|
5122 |
gen_helper_neon_qshlu_s32(tmp, cpu_env, |
|
5123 |
tmp, tmp2); |
|
5104 | 5124 |
break; |
5105 | 5125 |
default: |
5106 | 5126 |
abort(); |
5107 | 5127 |
} |
5108 | 5128 |
break; |
5109 | 5129 |
case 7: /* VQSHL */ |
5110 |
GEN_NEON_INTEGER_OP(qshl); |
|
5130 |
GEN_NEON_INTEGER_OP_ENV(qshl);
|
|
5111 | 5131 |
break; |
5112 | 5132 |
} |
5113 | 5133 |
tcg_temp_free_i32(tmp2); |
... | ... | |
5616 | 5636 |
tmp2 = neon_load_reg(rn, pass); |
5617 | 5637 |
if (op == 12) { |
5618 | 5638 |
if (size == 1) { |
5619 |
gen_helper_neon_qdmulh_s16(tmp, tmp, tmp2); |
|
5639 |
gen_helper_neon_qdmulh_s16(tmp, cpu_env, tmp, tmp2);
|
|
5620 | 5640 |
} else { |
5621 |
gen_helper_neon_qdmulh_s32(tmp, tmp, tmp2); |
|
5641 |
gen_helper_neon_qdmulh_s32(tmp, cpu_env, tmp, tmp2);
|
|
5622 | 5642 |
} |
5623 | 5643 |
} else if (op == 13) { |
5624 | 5644 |
if (size == 1) { |
5625 |
gen_helper_neon_qrdmulh_s16(tmp, tmp, tmp2); |
|
5645 |
gen_helper_neon_qrdmulh_s16(tmp, cpu_env, tmp, tmp2);
|
|
5626 | 5646 |
} else { |
5627 |
gen_helper_neon_qrdmulh_s32(tmp, tmp, tmp2); |
|
5647 |
gen_helper_neon_qrdmulh_s32(tmp, cpu_env, tmp, tmp2);
|
|
5628 | 5648 |
} |
5629 | 5649 |
} else if (op & 1) { |
5630 | 5650 |
TCGv_ptr fpstatus = get_fpstatus_ptr(1); |
... | ... | |
5996 | 6016 |
break; |
5997 | 6017 |
case NEON_2RM_VQABS: |
5998 | 6018 |
switch (size) { |
5999 |
case 0: gen_helper_neon_qabs_s8(tmp, tmp); break; |
|
6000 |
case 1: gen_helper_neon_qabs_s16(tmp, tmp); break; |
|
6001 |
case 2: gen_helper_neon_qabs_s32(tmp, tmp); break; |
|
6019 |
case 0: |
|
6020 |
gen_helper_neon_qabs_s8(tmp, cpu_env, tmp); |
|
6021 |
break; |
|
6022 |
case 1: |
|
6023 |
gen_helper_neon_qabs_s16(tmp, cpu_env, tmp); |
|
6024 |
break; |
|
6025 |
case 2: |
|
6026 |
gen_helper_neon_qabs_s32(tmp, cpu_env, tmp); |
|
6027 |
break; |
|
6002 | 6028 |
default: abort(); |
6003 | 6029 |
} |
6004 | 6030 |
break; |
6005 | 6031 |
case NEON_2RM_VQNEG: |
6006 | 6032 |
switch (size) { |
6007 |
case 0: gen_helper_neon_qneg_s8(tmp, tmp); break; |
|
6008 |
case 1: gen_helper_neon_qneg_s16(tmp, tmp); break; |
|
6009 |
case 2: gen_helper_neon_qneg_s32(tmp, tmp); break; |
|
6033 |
case 0: |
|
6034 |
gen_helper_neon_qneg_s8(tmp, cpu_env, tmp); |
|
6035 |
break; |
|
6036 |
case 1: |
|
6037 |
gen_helper_neon_qneg_s16(tmp, cpu_env, tmp); |
|
6038 |
break; |
|
6039 |
case 2: |
|
6040 |
gen_helper_neon_qneg_s32(tmp, cpu_env, tmp); |
|
6041 |
break; |
|
6010 | 6042 |
default: abort(); |
6011 | 6043 |
} |
6012 | 6044 |
break; |
Also available in: Unified diff