Commit 00d3b8f59bb58e4c7ae52fc73d55d2f27e664443

Authored by aurel32
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 1972 for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--)
1973 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 2002 void helper_lvsl (ppc_avr_t *r, target_ulong sh)
1976 2003 {
1977 2004 int i, j = (sh & 0xf);
... ...