mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
Hexagon (target/hexagon) add F2_sfinvsqrta
Rd32,Pe4 = sfinvsqrta(Rs32) Square root approx The helper packs the 2 32-bit results into a 64-bit value, and the fGEN_TCG override unpacks them into the proper results. Test cases in tests/tcg/hexagon/multi_result.c FP exception tests added to tests/tcg/hexagon/fpstuff.c Signed-off-by: Taylor Simpson <tsimpson@quicinc.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <1617930474-31979-19-git-send-email-tsimpson@quicinc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
d934c16d8a
commit
dd8705bdf5
9 changed files with 121 additions and 1 deletions
|
@ -326,6 +326,27 @@ uint64_t HELPER(sfrecipa)(CPUHexagonState *env, float32 RsV, float32 RtV)
|
|||
return ((uint64_t)RdV << 32) | PeV;
|
||||
}
|
||||
|
||||
uint64_t HELPER(sfinvsqrta)(CPUHexagonState *env, float32 RsV)
|
||||
{
|
||||
int PeV = 0;
|
||||
float32 RdV;
|
||||
int idx;
|
||||
int adjust;
|
||||
int mant;
|
||||
int exp;
|
||||
|
||||
arch_fpop_start(env);
|
||||
if (arch_sf_invsqrt_common(&RsV, &RdV, &adjust, &env->fp_status)) {
|
||||
PeV = adjust;
|
||||
idx = (RsV >> 17) & 0x7f;
|
||||
mant = (invsqrt_lookup_table[idx] << 15);
|
||||
exp = SF_BIAS - ((float32_getexp(RsV) - SF_BIAS) >> 1) - 1;
|
||||
RdV = build_float32(extract32(RsV, 31, 1), exp, mant);
|
||||
}
|
||||
arch_fpop_end(env);
|
||||
return ((uint64_t)RdV << 32) | PeV;
|
||||
}
|
||||
|
||||
/*
|
||||
* mem_noshuf
|
||||
* Section 5.5 of the Hexagon V67 Programmer's Reference Manual
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue