void HELPER(gvec_fcmlad)(void *vd, void *vn, void *vm, void *vfpst, uint32_t desc) { uintptr_t opr_sz = simd_oprsz(desc); float64 *d = vd; float64 *n = vn; float64 *m = vm; float_status *fpst = vfpst; intptr_t flip = extract32(desc, SIMD_DATA_SHIFT, 1); uint64_t neg_imag = extract32(desc, SIMD_DATA_SHIFT + 1, 1); uint64_t neg_real = flip ^ neg_imag; uintptr_t i; /* Shift boolean to the sign bit so we can xor to negate. */ neg_real <<= 63; neg_imag <<= 63; for (i = 0; i < opr_sz / 8; i += 2) { float64 e2 = n[i + flip]; float64 e1 = m[i + flip] ^ neg_real; float64 e4 = e2; float64 e3 = m[i + 1 - flip] ^ neg_imag; d[i] = float64_muladd(e2, e1, d[i], 0, fpst); d[i + 1] = float64_muladd(e4, e3, d[i + 1], 0, fpst); } clear_tail(d, opr_sz, simd_maxsz(desc)); }
void HELPER(gvec_fcaddd)(void *vd, void *vn, void *vm, void *vfpst, uint32_t desc) { uintptr_t opr_sz = simd_oprsz(desc); float64 *d = vd; float64 *n = vn; float64 *m = vm; float_status *fpst = vfpst; uint64_t neg_real = extract64(desc, SIMD_DATA_SHIFT, 1); uint64_t neg_imag = neg_real ^ 1; uintptr_t i; /* Shift boolean to the sign bit so we can xor to negate. */ neg_real <<= 63; neg_imag <<= 63; for (i = 0; i < opr_sz / 8; i += 2) { float64 e0 = n[i]; float64 e1 = m[i + 1] ^ neg_imag; float64 e2 = n[i + 1]; float64 e3 = m[i] ^ neg_real; d[i] = float64_add(e0, e1, fpst); d[i + 1] = float64_add(e2, e3, fpst); } clear_tail(d, opr_sz, simd_maxsz(desc)); }
void HELPER(gvec_fcadds)(void *vd, void *vn, void *vm, void *vfpst, uint32_t desc) { uintptr_t opr_sz = simd_oprsz(desc); float32 *d = vd; float32 *n = vn; float32 *m = vm; float_status *fpst = vfpst; uint32_t neg_real = extract32(desc, SIMD_DATA_SHIFT, 1); uint32_t neg_imag = neg_real ^ 1; uintptr_t i; /* Shift boolean to the sign bit so we can xor to negate. */ neg_real <<= 31; neg_imag <<= 31; for (i = 0; i < opr_sz / 4; i += 2) { float32 e0 = n[H4(i)]; float32 e1 = m[H4(i + 1)] ^ neg_imag; float32 e2 = n[H4(i + 1)]; float32 e3 = m[H4(i)] ^ neg_real; d[H4(i)] = float32_add(e0, e1, fpst); d[H4(i + 1)] = float32_add(e2, e3, fpst); } clear_tail(d, opr_sz, simd_maxsz(desc)); }
void HELPER(gvec_fcmlas_idx)(void *vd, void *vn, void *vm, void *vfpst, uint32_t desc) { uintptr_t opr_sz = simd_oprsz(desc); float32 *d = vd; float32 *n = vn; float32 *m = vm; float_status *fpst = vfpst; intptr_t flip = extract32(desc, SIMD_DATA_SHIFT, 1); uint32_t neg_imag = extract32(desc, SIMD_DATA_SHIFT + 1, 1); uint32_t neg_real = flip ^ neg_imag; uintptr_t i; float32 e1 = m[H4(flip)]; float32 e3 = m[H4(1 - flip)]; /* Shift boolean to the sign bit so we can xor to negate. */ neg_real <<= 31; neg_imag <<= 31; e1 ^= neg_real; e3 ^= neg_imag; for (i = 0; i < opr_sz / 4; i += 2) { float32 e2 = n[H4(i + flip)]; float32 e4 = e2; d[H4(i)] = float32_muladd(e2, e1, d[H4(i)], 0, fpst); d[H4(i + 1)] = float32_muladd(e4, e3, d[H4(i + 1)], 0, fpst); } clear_tail(d, opr_sz, simd_maxsz(desc)); }
void HELPER(gvec_mov)(void *d, void *a, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); memcpy(d, a, oprsz); clear_high(d, oprsz, desc); }
void HELPER(gvec_add16)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec16)) { *(vec16 *)(d + i) = *(vec16 *)(a + i) + *(vec16 *)(b + i); } clear_high(d, oprsz, desc); }
void HELPER(gvec_eqv)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec64)) { *(vec64 *)(d + i) = ~(*(vec64 *)(a + i) ^ *(vec64 *)(b + i)); } clear_high(d, oprsz, desc); }
void HELPER(gvec_neg64)(void *d, void *a, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec64)) { *(vec64 *)(d + i) = -*(vec64 *)(a + i); } clear_high(d, oprsz, desc); }
void HELPER(gvec_adds8)(void *d, void *a, uint64_t b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); vec8 vecb = (vec8)DUP16(b); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec8)) { *(vec8 *)(d + i) = *(vec8 *)(a + i) + vecb; } clear_high(d, oprsz, desc); }
void HELPER(gvec_sar64i)(void *d, void *a, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); int shift = simd_data(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec64)) { *(svec64 *)(d + i) = *(svec64 *)(a + i) >> shift; } clear_high(d, oprsz, desc); }
void HELPER(gvec_ors)(void *d, void *a, uint64_t b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); vec64 vecb = (vec64)DUP2(b); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec64)) { *(vec64 *)(d + i) = *(vec64 *)(a + i) | vecb; } clear_high(d, oprsz, desc); }
void HELPER(gvec_muls32)(void *d, void *a, uint64_t b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); vec32 vecb = (vec32)DUP4(b); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec32)) { *(vec32 *)(d + i) = *(vec32 *)(a + i) * vecb; } clear_high(d, oprsz, desc); }
void HELPER(gvec_subs16)(void *d, void *a, uint64_t b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); vec16 vecb = (vec16)DUP8(b); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec16)) { *(vec16 *)(d + i) = *(vec16 *)(a + i) - vecb; } clear_high(d, oprsz, desc); }
void HELPER(gvec_shl32i)(void *d, void *a, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); int shift = simd_data(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(vec32)) { *(vec32 *)(d + i) = *(vec32 *)(a + i) << shift; } clear_high(d, oprsz, desc); }
void HELPER(gvec_umax64)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(uint64_t)) { uint64_t aa = *(uint64_t *)(a + i); uint64_t bb = *(uint64_t *)(b + i); uint64_t dd = aa > bb ? aa : bb; *(uint64_t *)(d + i) = dd; } clear_high(d, oprsz, desc); }
void HELPER(gvec_smin16)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(int16_t)) { int16_t aa = *(int16_t *)(a + i); int16_t bb = *(int16_t *)(b + i); int16_t dd = aa < bb ? aa : bb; *(int16_t *)(d + i) = dd; } clear_high(d, oprsz, desc); }
void HELPER(gvec_ussub16)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(uint16_t)) { int r = *(uint16_t *)(a + i) - *(uint16_t *)(b + i); if (r < 0) { r = 0; } *(uint16_t *)(d + i) = r; } clear_high(d, oprsz, desc); }
void HELPER(gvec_dup32)(void *d, uint32_t desc, uint32_t c) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; if (c == 0) { oprsz = 0; } else { for (i = 0; i < oprsz; i += sizeof(uint32_t)) { *(uint32_t *)(d + i) = c; } } clear_high(d, oprsz, desc); }
void HELPER(gvec_usadd16)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(uint16_t)) { unsigned r = *(uint16_t *)(a + i) + *(uint16_t *)(b + i); if (r > UINT16_MAX) { r = UINT16_MAX; } *(uint16_t *)(d + i) = r; } clear_high(d, oprsz, desc); }
void HELPER(gvec_qrdmlsh_s32)(void *vd, void *vn, void *vm, void *ve, uint32_t desc) { uintptr_t opr_sz = simd_oprsz(desc); int32_t *d = vd; int32_t *n = vn; int32_t *m = vm; CPUARMState *env = ve; uintptr_t i; for (i = 0; i < opr_sz / 4; ++i) { d[i] = helper_neon_qrdmlsh_s32(env, n[i], m[i], d[i]); } clear_tail(d, opr_sz, simd_maxsz(desc)); }
void HELPER(gvec_qrdmlah_s16)(void *vd, void *vn, void *vm, void *ve, uint32_t desc) { uintptr_t opr_sz = simd_oprsz(desc); int16_t *d = vd; int16_t *n = vn; int16_t *m = vm; CPUARMState *env = ve; uintptr_t i; for (i = 0; i < opr_sz / 2; ++i) { d[i] = inl_qrdmlah_s16(env, n[i], m[i], d[i]); } clear_tail(d, opr_sz, simd_maxsz(desc)); }
void HELPER(gvec_sssub16)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(int16_t)) { int r = *(int16_t *)(a + i) - *(int16_t *)(b + i); if (r > INT16_MAX) { r = INT16_MAX; } else if (r < INT16_MIN) { r = INT16_MIN; } *(int16_t *)(d + i) = r; } clear_high(d, oprsz, desc); }
void HELPER(gvec_usadd64)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(uint64_t)) { uint64_t ai = *(uint64_t *)(a + i); uint64_t bi = *(uint64_t *)(b + i); uint64_t di = ai + bi; if (di < ai) { di = UINT64_MAX; } *(uint64_t *)(d + i) = di; } clear_high(d, oprsz, desc); }
void HELPER(gvec_ussub32)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(uint32_t)) { uint32_t ai = *(uint32_t *)(a + i); uint32_t bi = *(uint32_t *)(b + i); uint32_t di = ai - bi; if (ai < bi) { di = 0; } *(uint32_t *)(d + i) = di; } clear_high(d, oprsz, desc); }
void HELPER(gvec_sssub64)(void *d, void *a, void *b, uint32_t desc) { intptr_t oprsz = simd_oprsz(desc); intptr_t i; for (i = 0; i < oprsz; i += sizeof(int64_t)) { int64_t ai = *(int64_t *)(a + i); int64_t bi = *(int64_t *)(b + i); int64_t di = ai - bi; if (((di ^ ai) & (ai ^ bi)) < 0) { /* Signed overflow. */ di = (di < 0 ? INT64_MAX : INT64_MIN); } *(int64_t *)(d + i) = di; } clear_high(d, oprsz, desc); }