提交 8ed697e8 编写于 作者: W Will Newton 提交者: Peter Maydell

target-arm: Prepare VFP_CONV_FIX helpers for A64 uses

Make the VFP_CONV_FIX helpers a little more flexible in
preparation for the A64 uses. This requires two changes:
 * use the correct softfloat conversion function based on itype
   rather than always the int32 one; this is possible now that
   softfloat provides int16 versions and necessary for the
   future conversion-to-int64 A64 variants. This also allows
   us to drop the awkward 'sign' macro argument.
 * split the 'fsz' argument which currently controls both
   width of the input float type and width of the output
   integer type into two; this will allow us to specify the
   A64 64-bit-int-to-single conversion function, where the
   two widths are different.

We can also drop the (itype##_t) cast now that softfloat
guarantees that all the itype##_to_float* functions take
an integer argument of exactly the correct type.
Signed-off-by: NWill Newton <will.newton@linaro.org>
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
Reviewed-by: NRichard Henderson <rth@twiddle.net>
上级 f9288a76
...@@ -3976,17 +3976,17 @@ float32 VFP_HELPER(fcvts, d)(float64 x, CPUARMState *env) ...@@ -3976,17 +3976,17 @@ float32 VFP_HELPER(fcvts, d)(float64 x, CPUARMState *env)
} }
/* VFP3 fixed point conversion. */ /* VFP3 fixed point conversion. */
#define VFP_CONV_FIX(name, p, fsz, itype, sign) \ #define VFP_CONV_FIX(name, p, fsz, isz, itype) \
float##fsz HELPER(vfp_##name##to##p)(uint##fsz##_t x, uint32_t shift, \ float##fsz HELPER(vfp_##name##to##p)(uint##isz##_t x, uint32_t shift, \
void *fpstp) \ void *fpstp) \
{ \ { \
float_status *fpst = fpstp; \ float_status *fpst = fpstp; \
float##fsz tmp; \ float##fsz tmp; \
tmp = sign##int32_to_##float##fsz((itype##_t)x, fpst); \ tmp = itype##_to_##float##fsz(x, fpst); \
return float##fsz##_scalbn(tmp, -(int)shift, fpst); \ return float##fsz##_scalbn(tmp, -(int)shift, fpst); \
} \ } \
uint##fsz##_t HELPER(vfp_to##name##p)(float##fsz x, uint32_t shift, \ uint##isz##_t HELPER(vfp_to##name##p)(float##fsz x, uint32_t shift, \
void *fpstp) \ void *fpstp) \
{ \ { \
float_status *fpst = fpstp; \ float_status *fpst = fpstp; \
float##fsz tmp; \ float##fsz tmp; \
...@@ -3998,14 +3998,14 @@ uint##fsz##_t HELPER(vfp_to##name##p)(float##fsz x, uint32_t shift, \ ...@@ -3998,14 +3998,14 @@ uint##fsz##_t HELPER(vfp_to##name##p)(float##fsz x, uint32_t shift, \
return float##fsz##_to_##itype##_round_to_zero(tmp, fpst); \ return float##fsz##_to_##itype##_round_to_zero(tmp, fpst); \
} }
VFP_CONV_FIX(sh, d, 64, int16, ) VFP_CONV_FIX(sh, d, 64, 64, int16)
VFP_CONV_FIX(sl, d, 64, int32, ) VFP_CONV_FIX(sl, d, 64, 64, int32)
VFP_CONV_FIX(uh, d, 64, uint16, u) VFP_CONV_FIX(uh, d, 64, 64, uint16)
VFP_CONV_FIX(ul, d, 64, uint32, u) VFP_CONV_FIX(ul, d, 64, 64, uint32)
VFP_CONV_FIX(sh, s, 32, int16, ) VFP_CONV_FIX(sh, s, 32, 32, int16)
VFP_CONV_FIX(sl, s, 32, int32, ) VFP_CONV_FIX(sl, s, 32, 32, int32)
VFP_CONV_FIX(uh, s, 32, uint16, u) VFP_CONV_FIX(uh, s, 32, 32, uint16)
VFP_CONV_FIX(ul, s, 32, uint32, u) VFP_CONV_FIX(ul, s, 32, 32, uint32)
#undef VFP_CONV_FIX #undef VFP_CONV_FIX
/* Half precision conversions. */ /* Half precision conversions. */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册