};
/* n must be a constant to be efficient */
-static inline int lshift(int x, int n)
+inline static Int lshift ( Int x, Int n )
{
- if (n >= 0)
- return x << n;
- else
- return x >> (-n);
+ if (n >= 0)
+ return x << n;
+ else
+ return x >> (-n);
}
#define PREAMBLE(__data_bits) \
- const UInt DATA_MASK \
+ /* const */ UInt DATA_MASK \
= __data_bits==8 ? 0xFF \
: (__data_bits==16 ? 0xFFFF \
: 0xFFFFFFFF); \
- const UInt SIGN_MASK = 1 << (__data_bits - 1); \
- const UInt CC_DST = cc_dst; \
- const UInt CC_SRC = cc_src
+ /* const */ UInt SIGN_MASK = 1 << (__data_bits - 1); \
+ /* const */ UInt CC_DST = cc_dst_formal; \
+ /* const */ UInt CC_SRC = cc_src_formal; \
+ /* Three bogus assignments, which hopefully gcc can */ \
+ /* optimise away, and which stop it complaining about */ \
+ /* unused variables. */ \
+ SIGN_MASK = SIGN_MASK; \
+ DATA_MASK = DATA_MASK; \
+ CC_SRC = CC_SRC;
+
/*-------------------------------------------------------------*/
-#define ACTIONS_ADD(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_ADD(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
src1 = CC_SRC; \
src2 = CC_DST; \
dst = src1 + src2; \
- cf = (DATA_TYPE)dst < (DATA_TYPE)src1; \
+ cf = (DATA_UTYPE)dst < (DATA_UTYPE)src1; \
pf = parity_table[(uint8_t)dst]; \
af = (dst ^ src1 ^ src2) & 0x10; \
- zf = ((DATA_TYPE)dst == 0) << 6; \
+ zf = ((DATA_UTYPE)dst == 0) << 6; \
sf = lshift(dst, 8 - DATA_BITS) & 0x80; \
of = lshift((src1 ^ src2 ^ -1) & (src1 ^ dst), \
12 - DATA_BITS) & CC_O; \
/*-------------------------------------------------------------*/
-#define ACTIONS_ADC(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_ADC(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
src1 = CC_SRC; \
src2 = CC_DST; \
dst = src1 + src2 + 1; \
- cf = (DATA_TYPE)dst <= (DATA_TYPE)src1; \
+ cf = (DATA_UTYPE)dst <= (DATA_UTYPE)src1; \
pf = parity_table[(uint8_t)dst]; \
af = (dst ^ src1 ^ src2) & 0x10; \
- zf = ((DATA_TYPE)dst == 0) << 6; \
+ zf = ((DATA_UTYPE)dst == 0) << 6; \
sf = lshift(dst, 8 - DATA_BITS) & 0x80; \
of = lshift((src1 ^ src2 ^ -1) & (src1 ^ dst), \
12 - DATA_BITS) & CC_O; \
/*-------------------------------------------------------------*/
-#define ACTIONS_SUB(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_SUB(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
src1 = CC_DST; \
src2 = CC_SRC; \
dst = src1 - src2; \
- cf = (DATA_TYPE)src1 < (DATA_TYPE)src2; \
+ cf = (DATA_UTYPE)src1 < (DATA_UTYPE)src2; \
pf = parity_table[(uint8_t)dst]; \
af = (dst ^ src1 ^ src2) & 0x10; \
- zf = ((DATA_TYPE)dst == 0) << 6; \
+ zf = ((DATA_UTYPE)dst == 0) << 6; \
sf = lshift(dst, 8 - DATA_BITS) & 0x80; \
of = lshift((src1 ^ src2) & (src1 ^ dst), \
12 - DATA_BITS) & CC_O; \
/*-------------------------------------------------------------*/
-#define ACTIONS_SBB(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_SBB(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
src1 = CC_DST; \
src2 = CC_SRC; \
dst = (src1 - src2) - 1; \
- cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2; \
+ cf = (DATA_UTYPE)src1 <= (DATA_UTYPE)src2; \
pf = parity_table[(uint8_t)dst]; \
af = (dst ^ src1 ^ src2) & 0x10; \
- zf = ((DATA_TYPE)dst == 0) << 6; \
+ zf = ((DATA_UTYPE)dst == 0) << 6; \
sf = lshift(dst, 8 - DATA_BITS) & 0x80; \
of = lshift((src1 ^ src2) & (src1 ^ dst), \
12 - DATA_BITS) & CC_O; \
/*-------------------------------------------------------------*/
-#define ACTIONS_LOGIC(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_LOGIC(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
cf = 0; \
pf = parity_table[(uint8_t)CC_DST]; \
af = 0; \
- zf = ((DATA_TYPE)CC_DST == 0) << 6; \
+ zf = ((DATA_UTYPE)CC_DST == 0) << 6; \
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80; \
of = 0; \
return cf | pf | af | zf | sf | of; \
/*-------------------------------------------------------------*/
-#define ACTIONS_INC(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_INC(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
cf = CC_SRC; \
pf = parity_table[(uint8_t)CC_DST]; \
af = (CC_DST ^ src1 ^ src2) & 0x10; \
- zf = ((DATA_TYPE)CC_DST == 0) << 6; \
+ zf = ((DATA_UTYPE)CC_DST == 0) << 6; \
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80; \
of = ((CC_DST & DATA_MASK) == SIGN_MASK) << 11; \
return cf | pf | af | zf | sf | of; \
/*-------------------------------------------------------------*/
-#define ACTIONS_DEC(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_DEC(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
cf = CC_SRC; \
pf = parity_table[(uint8_t)CC_DST]; \
af = (CC_DST ^ src1 ^ src2) & 0x10; \
- zf = ((DATA_TYPE)CC_DST == 0) << 6; \
+ zf = ((DATA_UTYPE)CC_DST == 0) << 6; \
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80; \
of = ((CC_DST & DATA_MASK) \
== ((uint32_t)SIGN_MASK - 1)) << 11; \
/*-------------------------------------------------------------*/
-#define ACTIONS_SHL(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_SHL(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
cf = (CC_SRC >> (DATA_BITS - 1)) & CC_C; \
pf = parity_table[(uint8_t)CC_DST]; \
af = 0; /* undefined */ \
- zf = ((DATA_TYPE)CC_DST == 0) << 6; \
+ zf = ((DATA_UTYPE)CC_DST == 0) << 6; \
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80; \
/* of is defined if shift count == 1 */ \
of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O; \
/*-------------------------------------------------------------*/
-#define ACTIONS_SAR(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_SAR(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
cf = CC_SRC & 1; \
pf = parity_table[(uint8_t)CC_DST]; \
af = 0; /* undefined */ \
- zf = ((DATA_TYPE)CC_DST == 0) << 6; \
+ zf = ((DATA_UTYPE)CC_DST == 0) << 6; \
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80; \
/* of is defined if shift count == 1 */ \
of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O; \
/* ROL: cf' = lsb(result). of' = msb(result) ^ lsb(result). */
/* DST = result, SRC = old flags */
-#define ACTIONS_ROL(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_ROL(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int fl \
/* ROR: cf' = msb(result). of' = msb(result) ^ msb-1(result). */
/* DST = result, SRC = old flags */
-#define ACTIONS_ROR(DATA_BITS,DATA_TYPE) \
+#define ACTIONS_ROR(DATA_BITS,DATA_UTYPE) \
{ \
PREAMBLE(DATA_BITS); \
int fl \
/*-------------------------------------------------------------*/
-#define ACTIONS_SMUL(DATA_BITS,DATA_STYPE,DATA_S2TYPE) \
+#define ACTIONS_UMUL(DATA_BITS,DATA_UTYPE,DATA_U2TYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
- DATA_STYPE hi; \
- DATA_STYPE lo = ((DATA_STYPE)CC_SRC) * ((DATA_STYPE)CC_DST);\
- DATA_S2TYPE rr = ((DATA_S2TYPE)((DATA_STYPE)CC_SRC)) \
- * ((DATA_S2TYPE)((DATA_STYPE)CC_DST)); \
- hi = (DATA_STYPE)(rr >>/*s*/ DATA_BITS); \
- cf = (hi != (lo >>/*s*/ (DATA_BITS-1))); \
+ DATA_UTYPE hi; \
+ DATA_UTYPE lo = ((DATA_UTYPE)CC_SRC) * ((DATA_UTYPE)CC_DST);\
+ DATA_U2TYPE rr = ((DATA_U2TYPE)((DATA_UTYPE)CC_SRC)) \
+ * ((DATA_U2TYPE)((DATA_UTYPE)CC_DST)); \
+ hi = (DATA_UTYPE)(rr >>/*u*/ DATA_BITS); \
+ cf = (hi != 0); \
pf = parity_table[(uint8_t)lo]; \
af = 0; /* undefined */ \
- zf = (lo == 0) << 6; \
+ zf = (lo == 0) << 6; \
sf = lshift(lo, 8 - DATA_BITS) & 0x80; \
of = cf << 11; \
return cf | pf | af | zf | sf | of; \
/*-------------------------------------------------------------*/
-#define ACTIONS_UMUL(DATA_BITS,DATA_UTYPE,DATA_U2TYPE) \
+#define ACTIONS_SMUL(DATA_BITS,DATA_STYPE,DATA_S2TYPE) \
{ \
PREAMBLE(DATA_BITS); \
int cf, pf, af, zf, sf, of; \
- DATA_UTYPE hi; \
- DATA_UTYPE lo = ((DATA_UTYPE)CC_SRC) * ((DATA_UTYPE)CC_DST);\
- DATA_U2TYPE rr = ((DATA_U2TYPE)((DATA_UTYPE)CC_SRC)) \
- * ((DATA_U2TYPE)((DATA_UTYPE)CC_DST)); \
- hi = (DATA_UTYPE)(rr >>/*u*/ DATA_BITS); \
- cf = (hi != 0); \
+ DATA_STYPE hi; \
+ DATA_STYPE lo = ((DATA_STYPE)CC_SRC) * ((DATA_STYPE)CC_DST);\
+ DATA_S2TYPE rr = ((DATA_S2TYPE)((DATA_STYPE)CC_SRC)) \
+ * ((DATA_S2TYPE)((DATA_STYPE)CC_DST)); \
+ hi = (DATA_STYPE)(rr >>/*s*/ DATA_BITS); \
+ cf = (hi != (lo >>/*s*/ (DATA_BITS-1))); \
pf = parity_table[(uint8_t)lo]; \
af = 0; /* undefined */ \
- zf = (lo == 0) << 6; \
+ zf = (lo == 0) << 6; \
sf = lshift(lo, 8 - DATA_BITS) & 0x80; \
of = cf << 11; \
return cf | pf | af | zf | sf | of; \
/* CALLED FROM GENERATED CODE */
/* Calculate all the 6 flags from the supplied thunk parameters. */
-/*static*/ UInt calculate_eflags_all ( UInt cc_op, UInt cc_src, UInt cc_dst )
+/*static*/
+UInt calculate_eflags_all ( UInt cc_op, UInt cc_src_formal, UInt cc_dst_formal )
{
# if PROFILE_EFLAGS
n_calc_all++;
# endif
switch (cc_op) {
case CC_OP_COPY:
- return cc_src & (CC_MASK_O | CC_MASK_S | CC_MASK_Z
- | CC_MASK_A | CC_MASK_C | CC_MASK_P);
+ return cc_src_formal
+ & (CC_MASK_O | CC_MASK_S | CC_MASK_Z
+ | CC_MASK_A | CC_MASK_C | CC_MASK_P);
case CC_OP_ADDB: ACTIONS_ADD( 8, UChar );
case CC_OP_ADDW: ACTIONS_ADD( 16, UShort );
default:
/* shouldn't really make these calls from generated code */
vex_printf("calculate_eflags_all( %d, 0x%x, 0x%x )\n",
- cc_op, cc_src, cc_dst );
+ cc_op, cc_src_formal, cc_dst_formal );
vpanic("calculate_eflags_all");
}
}