239
/* Unsigned saturating accumulate of signed value
241
* Op1/Rn is treated as signed
242
* Op2/Rd is treated as unsigned
244
* Explicit casting is used to ensure the correct sign extension of
245
* inputs. The result is treated as a unsigned value and saturated as such.
247
* We use a macro for the 8/16 bit cases which expects signed integers of va,
248
* vb, and vr for interim calculation and an unsigned 32 bit result value r.
251
#define USATACC(bits, shift) \
253
va = sextract32(a, shift, bits); \
254
vb = extract32(b, shift, bits); \
256
if (vr > UINT##bits##_MAX) { \
258
vr = UINT##bits##_MAX; \
259
} else if (vr < 0) { \
263
r = deposit32(r, shift, bits, vr); \
266
uint32_t HELPER(neon_uqadd_s8)(CPUARMState *env, uint32_t a, uint32_t b)
278
uint32_t HELPER(neon_uqadd_s16)(CPUARMState *env, uint32_t a, uint32_t b)
290
uint32_t HELPER(neon_uqadd_s32)(CPUARMState *env, uint32_t a, uint32_t b)
292
int64_t va = (int32_t)a;
293
int64_t vb = (uint32_t)b;
294
int64_t vr = va + vb;
295
if (vr > UINT32_MAX) {
305
uint64_t HELPER(neon_uqadd_s64)(CPUARMState *env, uint64_t a, uint64_t b)
309
/* We only need to look at the pattern of SIGN bits to detect
312
if (~a & b & ~res & SIGNBIT64) {
315
} else if (a & ~b & res & SIGNBIT64) {
322
/* Signed saturating accumulate of unsigned value
324
* Op1/Rn is treated as unsigned
325
* Op2/Rd is treated as signed
327
* The result is treated as a signed value and saturated as such
329
* We use a macro for the 8/16 bit cases which expects signed integers of va,
330
* vb, and vr for interim calculation and an unsigned 32 bit result value r.
333
#define SSATACC(bits, shift) \
335
va = extract32(a, shift, bits); \
336
vb = sextract32(b, shift, bits); \
338
if (vr > INT##bits##_MAX) { \
340
vr = INT##bits##_MAX; \
341
} else if (vr < INT##bits##_MIN) { \
343
vr = INT##bits##_MIN; \
345
r = deposit32(r, shift, bits, vr); \
348
uint32_t HELPER(neon_sqadd_u8)(CPUARMState *env, uint32_t a, uint32_t b)
360
uint32_t HELPER(neon_sqadd_u16)(CPUARMState *env, uint32_t a, uint32_t b)
373
uint32_t HELPER(neon_sqadd_u32)(CPUARMState *env, uint32_t a, uint32_t b)
376
int64_t op1 = (uint32_t)a;
377
int64_t op2 = (int32_t)b;
379
if (res > INT32_MAX) {
382
} else if (res < INT32_MIN) {
389
uint64_t HELPER(neon_sqadd_u64)(CPUARMState *env, uint64_t a, uint64_t b)
393
/* We only need to look at the pattern of SIGN bits to detect an overflow */
396
| (a & ~b)) & SIGNBIT64) {
239
404
#define NEON_USAT(dest, src1, src2, type) do { \
240
405
uint32_t tmp = (uint32_t)src1 - (uint32_t)src2; \
241
406
if (tmp != (type)tmp) { \
1823
2010
return -float32_lt(f1, f0, fpst);
2013
uint64_t HELPER(neon_acge_f64)(uint64_t a, uint64_t b, void *fpstp)
2015
float_status *fpst = fpstp;
2016
float64 f0 = float64_abs(make_float64(a));
2017
float64 f1 = float64_abs(make_float64(b));
2018
return -float64_le(f1, f0, fpst);
2021
uint64_t HELPER(neon_acgt_f64)(uint64_t a, uint64_t b, void *fpstp)
2023
float_status *fpst = fpstp;
2024
float64 f0 = float64_abs(make_float64(a));
2025
float64 f1 = float64_abs(make_float64(b));
2026
return -float64_lt(f1, f0, fpst);
1826
2029
#define ELEM(V, N, SIZE) (((V) >> ((N) * (SIZE))) & ((1ull << (SIZE)) - 1))
1828
2031
void HELPER(neon_qunzip8)(CPUARMState *env, uint32_t rd, uint32_t rm)