idecode_expression.h [plain text]
#define SIGNED64(val) ((signed64)(signed32)(val))
#define UNSIGNED64(val) ((unsigned64)(unsigned32)(val))
#define ALU_BEGIN(val) \
{ \
natural_word alu_val; \
unsigned64 alu_carry_val; \
signed64 alu_overflow_val; \
ALU_SET(val)
#define ALU_END(TARG,CA,OE,Rc) \
{ \
signed_word const alu_result = _ALU_RESULT_VAL(CA,OE,Rc); \
\
if (OE) { \
if ((((unsigned64)(alu_overflow_val & BIT64(0))) \
>> 32) \
== (alu_overflow_val & BIT64(32))) \
XER &= (~xer_overflow); \
else \
XER |= (xer_summary_overflow | xer_overflow); \
} \
\
if (CA) { \
XER = ((XER & ~xer_carry) \
| SHUFFLED32((alu_carry_val >> 32), 31, xer_carry_bit)); \
\
} \
TRACE(trace_alu, (" Result = %ld (0x%lx), XER = %ld\n", \
(long)alu_result, (long)alu_result, (long)XER)); \
\
CR0_COMPARE(alu_result, 0, Rc); \
\
TARG = alu_result; \
}}
#define _ALU_RESULT_VAL(CA,OE,Rc) (WITH_TARGET_WORD_BITSIZE == 64 \
? alu_val \
: (OE \
? alu_overflow_val \
: (CA \
? alu_carry_val \
: alu_val)))
#if (WITH_TARGET_WORD_BITSIZE == 64)
#define ALU_SET(val) \
do { \
alu_val = val; \
alu_carry_val = ((unsigned64)alu_val) >> 32; \
alu_overflow_val = ((signed64)alu_val) >> 32; \
} while (0)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_SET(val) \
do { \
alu_val = val; \
alu_carry_val = (unsigned32)(alu_val); \
alu_overflow_val = (signed32)(alu_val); \
} while (0)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 64)
#define ALU_ADD(val) \
do { \
unsigned64 alu_lo = (UNSIGNED64(alu_val) \
+ UNSIGNED64(val)); \
signed alu_carry = ((alu_lo & BIT(31)) != 0); \
alu_carry_val = (alu_carry_val \
+ UNSIGNED64(EXTRACTED(val, 0, 31)) \
+ alu_carry); \
alu_overflow_val = (alu_overflow_val \
+ SIGNED64(EXTRACTED(val, 0, 31)) \
+ alu_carry); \
alu_val = alu_val + val; \
} while (0)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_ADD(val) \
do { \
alu_val += val; \
alu_carry_val += (unsigned32)(val); \
alu_overflow_val += (signed32)(val); \
} while (0)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 64)
#define ALU_ADD_CA \
do { \
signed carry = MASKED32(XER, xer_carry_bit, xer_carry_bit) != 0; \
ALU_ADD(carry); \
} while (0)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_ADD_CA \
do { \
signed carry = MASKED32(XER, xer_carry_bit, xer_carry_bit) != 0; \
ALU_ADD(carry); \
} while (0)
#endif
#if 0
#if (WITH_TARGET_WORD_BITSIZE == 64)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_SUB(val) \
do { \
alu_val -= val; \
alu_carry_val -= (unsigned32)(val); \
alu_overflow_val -= (signed32)(val); \
} while (0)
#endif
#endif
#if (WITH_TARGET_WORD_BITSIZE == 64)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_OR(val) \
do { \
alu_val |= val; \
alu_carry_val = (unsigned32)(alu_val); \
alu_overflow_val = (signed32)(alu_val); \
} while (0)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 64)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_XOR(val) \
do { \
alu_val ^= val; \
alu_carry_val = (unsigned32)(alu_val); \
alu_overflow_val = (signed32)(alu_val); \
} while (0)
#endif
#if 0
#if (WITH_TARGET_WORD_BITSIZE == 64)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_NEGATE \
do { \
alu_val = -alu_val; \
alu_carry_val = -alu_carry_val; \
alu_overflow_val = -alu_overflow_val; \
} while(0)
#endif
#endif
#if (WITH_TARGET_WORD_BITSIZE == 64)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_AND(val) \
do { \
alu_val &= val; \
alu_carry_val = (unsigned32)(alu_val); \
alu_overflow_val = (signed32)(alu_val); \
} while (0)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 64)
#define ALU_NOT \
do { \
signed64 new_alu_val = ~alu_val; \
ALU_SET(new_alu_val); \
} while (0)
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
#define ALU_NOT \
do { \
signed new_alu_val = ~alu_val; \
ALU_SET(new_alu_val); \
} while(0)
#endif
#define CR1_UPDATE(Rc) \
do { \
if (Rc) { \
CR_SET(1, EXTRACTED32(FPSCR, fpscr_fx_bit, fpscr_ox_bit)); \
} \
} while (0)
#define _DO_CR_COMPARE(LHS, RHS) \
(((LHS) < (RHS)) \
? cr_i_negative \
: (((LHS) > (RHS)) \
? cr_i_positive \
: cr_i_zero))
#define CR_SET(REG, VAL) MBLIT32(CR, REG*4, REG*4+3, VAL)
#define CR_FIELD(REG) EXTRACTED32(CR, REG*4, REG*4+3)
#define CR_SET_XER_SO(REG, VAL) \
do { \
creg new_bits = ((XER & xer_summary_overflow) \
? (cr_i_summary_overflow | VAL) \
: VAL); \
CR_SET(REG, new_bits); \
} while(0)
#define CR_COMPARE(REG, LHS, RHS) \
do { \
creg new_bits = ((XER & xer_summary_overflow) \
? (cr_i_summary_overflow | _DO_CR_COMPARE(LHS,RHS)) \
: _DO_CR_COMPARE(LHS,RHS)); \
CR_SET(REG, new_bits); \
} while (0)
#define CR0_COMPARE(LHS, RHS, Rc) \
do { \
if (Rc) { \
CR_COMPARE(0, LHS, RHS); \
TRACE(trace_alu, \
("CR=0x%08lx, LHS=%ld, RHS=%ld\n", \
(unsigned long)CR, (long)LHS, (long)RHS)); \
} \
} while (0)
#define MEM(SIGN, EA, NR_BYTES) \
((SIGN##_##NR_BYTES) vm_data_map_read_##NR_BYTES(cpu_data_map(processor), EA, \
processor, cia)) \
#define STORE(EA, NR_BYTES, VAL) \
do { \
vm_data_map_write_##NR_BYTES(cpu_data_map(processor), EA, VAL, \
processor, cia); \
} while (0)
#define FPSCR_BEGIN \
{ \
fpscreg old_fpscr UNUSED = FPSCR
#define FPSCR_END(Rc) { \
\
if ((FPSCR & fpscr_vx_bits)) \
FPSCR |= fpscr_vx; \
else \
FPSCR &= ~fpscr_vx; \
\
if (((FPSCR & fpscr_vx) && (FPSCR & fpscr_ve)) \
|| ((FPSCR & fpscr_ox) && (FPSCR & fpscr_oe)) \
|| ((FPSCR & fpscr_ux) && (FPSCR & fpscr_ue)) \
|| ((FPSCR & fpscr_zx) && (FPSCR & fpscr_ze)) \
|| ((FPSCR & fpscr_xx) && (FPSCR & fpscr_xe))) \
FPSCR |= fpscr_fex; \
else \
FPSCR &= ~fpscr_fex; \
CR1_UPDATE(Rc); \
\
if ((MSR & (msr_floating_point_exception_mode_0 \
| msr_floating_point_exception_mode_1)) \
&& (FPSCR & fpscr_fex)) \
program_interrupt(processor, cia, \
floating_point_enabled_program_interrupt); \
}}
#define FPSCR_SET(REG, VAL) MBLIT32(FPSCR, REG*4, REG*4+3, VAL)
#define FPSCR_FIELD(REG) EXTRACTED32(FPSCR, REG*4, REG*4+3)
#define FPSCR_SET_FPCC(VAL) MBLIT32(FPSCR, fpscr_fpcc_bit, fpscr_fpcc_bit+3, VAL)
#define FPSCR_OR_VX(VAL) \
do { \
\
FPSCR |= (VAL); \
FPSCR |= fpscr_fx; \
} while (0)
#define FPSCR_SET_OX(COND) \
do { \
if (COND) { \
FPSCR |= fpscr_ox; \
FPSCR |= fpscr_fx; \
} \
else \
FPSCR &= ~fpscr_ox; \
} while (0)
#define FPSCR_SET_UX(COND) \
do { \
if (COND) { \
FPSCR |= fpscr_ux; \
FPSCR |= fpscr_fx; \
} \
else \
FPSCR &= ~fpscr_ux; \
} while (0)
#define FPSCR_SET_ZX(COND) \
do { \
if (COND) { \
FPSCR |= fpscr_zx; \
FPSCR |= fpscr_fx; \
} \
else \
FPSCR &= ~fpscr_zx; \
} while (0)
#define FPSCR_SET_XX(COND) \
do { \
if (COND) { \
FPSCR |= fpscr_xx; \
FPSCR |= fpscr_fx; \
} \
} while (0)
#define FPSCR_SET_FR(COND) do { \
if (COND) \
FPSCR |= fpscr_fr; \
else \
FPSCR &= ~fpscr_fr; \
} while (0)
#define FPSCR_SET_FI(COND) \
do { \
if (COND) { \
FPSCR |= fpscr_fi; \
} \
else \
FPSCR &= ~fpscr_fi; \
} while (0)
#define FPSCR_SET_FPRF(VAL) \
do { \
FPSCR = (FPSCR & ~fpscr_fprf) | (VAL); \
} while (0)