Commit 00d3b8f59bb58e4c7ae52fc73d55d2f27e664443
1 parent
d1258698
Add saturating arithmetic conversion functions for subsequent instructions.
Signed-off-by: Nathan Froyd <froydnj@codesourcery.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6181 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
27 additions
and
0 deletions
target-ppc/op_helper.c
@@ -1972,6 +1972,33 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_ | @@ -1972,6 +1972,33 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_ | ||
1972 | for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--) | 1972 | for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--) |
1973 | #endif | 1973 | #endif |
1974 | 1974 | ||
1975 | +/* Saturating arithmetic helpers. */ | ||
1976 | +#define SATCVT(from, to, from_type, to_type, min, max, use_min, use_max) \ | ||
1977 | + static always_inline to_type cvt##from##to (from_type x, int *sat) \ | ||
1978 | + { \ | ||
1979 | + to_type r; \ | ||
1980 | + if (use_min && x < min) { \ | ||
1981 | + r = min; \ | ||
1982 | + *sat = 1; \ | ||
1983 | + } else if (use_max && x > max) { \ | ||
1984 | + r = max; \ | ||
1985 | + *sat = 1; \ | ||
1986 | + } else { \ | ||
1987 | + r = x; \ | ||
1988 | + } \ | ||
1989 | + return r; \ | ||
1990 | + } | ||
1991 | +SATCVT(sh, sb, int16_t, int8_t, INT8_MIN, INT8_MAX, 1, 1) | ||
1992 | +SATCVT(sw, sh, int32_t, int16_t, INT16_MIN, INT16_MAX, 1, 1) | ||
1993 | +SATCVT(sd, sw, int64_t, int32_t, INT32_MIN, INT32_MAX, 1, 1) | ||
1994 | +SATCVT(uh, ub, uint16_t, uint8_t, 0, UINT8_MAX, 0, 1) | ||
1995 | +SATCVT(uw, uh, uint32_t, uint16_t, 0, UINT16_MAX, 0, 1) | ||
1996 | +SATCVT(ud, uw, uint64_t, uint32_t, 0, UINT32_MAX, 0, 1) | ||
1997 | +SATCVT(sh, ub, int16_t, uint8_t, 0, UINT8_MAX, 1, 1) | ||
1998 | +SATCVT(sw, uh, int32_t, uint16_t, 0, UINT16_MAX, 1, 1) | ||
1999 | +SATCVT(sd, uw, int64_t, uint32_t, 0, UINT32_MAX, 1, 1) | ||
2000 | +#undef SATCVT | ||
2001 | + | ||
1975 | void helper_lvsl (ppc_avr_t *r, target_ulong sh) | 2002 | void helper_lvsl (ppc_avr_t *r, target_ulong sh) |
1976 | { | 2003 | { |
1977 | int i, j = (sh & 0xf); | 2004 | int i, j = (sh & 0xf); |