Based on ARM chapter 4.4.
X-1.14 Camiel Vanderhoeven 14-MAR-2008 1. More meaningful exceptions replace throwing (int) 1. 2. U64 macro replaces X64 macro.
X-1.13 Camiel Vanderhoeven 28-JAN-2008 Better floating-point exception handling.
X-1.12 Camiel Vanderhoeven 24-JAN-2008 Fixed some overflow-detection issues.
X-1.11 Camiel Vanderhoeven 22-JAN-2008 Also fixed MULQ/V.
X-1.10 Camiel Vanderhoeven 22-JAN-2008 Use RA, RAV style macro's for integer registers; fixed MULQ.
X-1.9 Camiel Vanderhoeven 22-JAN-2008 Implemented missing /V integer instructions.
X-1.8 Camiel Vanderhoeven 21-JAN-2008 Fixed misunderstanding of the INT bit in integer overflow traps.
X-1.7 Camiel Vanderhoeven 18-JAN-2008 Replaced sext_64 inlines with sext_u64_<bits> inlines for performance reasons (thanks to David Hittner for spotting this!);
X-1.6 David Hittner 16-JAN-2008 Added ADDL/V instruction
X-1.5 Camiel Vanderhoeven 2-DEC-2007 Use sext_64 inline.
X-1.4 Camiel Vanderhoeven 11-APR-2007 Moved all data that should be saved to a state file to a structure "state".
X-1.3 Camiel Vanderhoeven 30-MAR-2007 Added old changelog comments.
X-1.2 Camiel Vanderhoeven 18-MAR-2007 Bugfix in CTLZ and CTTZ instructions. Fixes the INCON_SCHED bugcheck (bug # 1680064).
X-1.1 Camiel Vanderhoeven 18-FEB-2007 File created. Contains code previously found in AlphaCPU.h
Definition in file cpu_arith.h.
Go to the source code of this file.
Defines | |
| #define | DO_CMPEQ RCV = (RAV == RBV) ? 1 : 0; |
| #define | DO_CMPLT RCV = ((s64) RAV < (s64) RBV) ? 1 : 0; |
| #define | DO_CMPLE RCV = ((s64) RAV <= (s64) RBV) ? 1 : 0; |
| #define | DO_ADDQ RCV = RAV + RBV; |
| #define | DO_S4ADDQ RCV = (RAV * 4) + RBV; |
| #define | DO_S8ADDQ RCV = (RAV * 8) + RBV; |
| #define | DO_ADDQ_V |
| #define | DO_ADDL RCV = sext_u64_32(RAV + RBV); |
| #define | DO_S4ADDL RCV = sext_u64_32((RAV * 4) + RBV); |
| #define | DO_S8ADDL RCV = sext_u64_32((RAV * 8) + RBV); |
| #define | DO_ADDL_V |
| #define | DO_CTLZ |
| #define | DO_CTPOP |
| #define | DO_CTTZ |
| #define | DO_CMPULT RCV = ((u64) RAV < (u64) RBV) ? 1 : 0; |
| #define | DO_CMPULE RCV = ((u64) RAV <= (u64) RBV) ? 1 : 0; |
| #define | DO_MULL RCV = sext_u64_32(sext_u64_32(RAV) * sext_u64_32(RBV)); |
| #define | DO_MULL_V |
| #define | DO_MULQ RCV = RAV * RBV; |
| #define | DO_MULQ_V |
| #define | DO_UMULH uemul64(RAV, RBV, &RCV); |
| #define | DO_SUBQ RCV = RAV - RBV; |
| #define | DO_S4SUBQ RCV = (RAV * 4) - RBV; |
| #define | DO_S8SUBQ RCV = (RAV * 8) - RBV; |
| #define | DO_SUBQ_V |
| #define | DO_SUBL RCV = sext_u64_32(RAV - RBV); |
| #define | DO_S4SUBL RCV = sext_u64_32((RAV * 4) - RBV); |
| #define | DO_S8SUBL RCV = sext_u64_32((RAV * 8) - RBV); |
| #define | DO_SUBL_V |
| #define DO_ADDL RCV = sext_u64_32(RAV + RBV); |
Definition at line 107 of file cpu_arith.h.
| #define DO_ADDL_V |
Value:
{ \
u64 rav = RAV; \
u64 rbv = RBV; \
RCV = sext_u64_32(rav + rbv); \
\
/* test for integer overflow */ \
if(((~rav ^ rbv) & (rav ^ RCV)) & L_SIGN) \
{ \
ARITH_TRAP_I(TRAP_IOV, RC); \
printf("ADDL_V %016"LL "x + %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
RCV); \
} \
}
Definition at line 111 of file cpu_arith.h.
| #define DO_ADDQ RCV = RAV + RBV; |
Definition at line 88 of file cpu_arith.h.
| #define DO_ADDQ_V |
Value:
{ \
u64 rav = RAV; \
u64 rbv = RBV; \
RCV = rav + rbv; \
\
/* test for integer overflow */ \
if(((~rav ^ rbv) & (rav ^ RCV)) & Q_SIGN) \
{ \
ARITH_TRAP_I(TRAP_IOV, RC); \
printf("ADDQ_V %016"LL "x + %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
RCV); \
} \
}
Definition at line 92 of file cpu_arith.h.
| #define DO_CMPEQ RCV = (RAV == RBV) ? 1 : 0; |
Definition at line 83 of file cpu_arith.h.
Definition at line 85 of file cpu_arith.h.
Definition at line 84 of file cpu_arith.h.
Definition at line 152 of file cpu_arith.h.
Definition at line 151 of file cpu_arith.h.
| #define DO_CTLZ |
Value:
temp_64 = 0; \ temp_64_2 = RBV; \ for(i = 63; i >= 0; i--) \ if((temp_64_2 >> i) & 1) \ break; \ else \ temp_64++; \ RCV = temp_64;
Definition at line 126 of file cpu_arith.h.
| #define DO_CTPOP |
Value:
temp_64 = 0; \ temp_64_2 = RBV; \ for(i = 0; i < 64; i++) \ if((temp_64_2 >> i) & 1) \ temp_64++; \ RCV = temp_64;
Definition at line 135 of file cpu_arith.h.
| #define DO_CTTZ |
Value:
temp_64 = 0; \ temp_64_2 = RBV; \ for(i = 0; i < 64; i++) \ if((temp_64_2 >> i) & 1) \ break; \ else \ temp_64++; \ RCV = temp_64;
Definition at line 142 of file cpu_arith.h.
| #define DO_MULL RCV = sext_u64_32(sext_u64_32(RAV) * sext_u64_32(RBV)); |
Definition at line 155 of file cpu_arith.h.
| #define DO_MULL_V |
Value:
{ \
u64 rav = RAV; \
u64 rbv = RBV; \
u64 sr = sext_u64_32(rav) * sext_u64_32(rbv); \
RCV = sext_u64_32(sr); \
if((RCV ^ sr) & U64(0xffffffff00000000)) \
{ \
ARITH_TRAP_I(TRAP_IOV, RC); \
printf("MULL_V %016"LL "x * %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
RCV); \
} \
}
Definition at line 157 of file cpu_arith.h.
| #define DO_MULQ RCV = RAV * RBV; |
Definition at line 171 of file cpu_arith.h.
| #define DO_MULQ_V |
Value:
{ \
u64 rav = RAV; \
u64 rbv = RBV; \
u64 t64; \
RCV = uemul64(rav, rbv, &t64); \
if(Q_GETSIGN(rav)) \
t64 -= rbv; \
if(Q_GETSIGN(rbv)) \
t64 -= rav; \
if(Q_GETSIGN(RCV) ? (t64 != X64_QUAD) : (t64 != 0)) \
{ \
ARITH_TRAP_I(TRAP_IOV, RC); \
printf("MULQ_V %016"LL "x * %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
RCV); \
} \
}
Definition at line 173 of file cpu_arith.h.
| #define DO_S4ADDL RCV = sext_u64_32((RAV * 4) + RBV); |
Definition at line 108 of file cpu_arith.h.
| #define DO_S4ADDQ RCV = (RAV * 4) + RBV; |
Definition at line 89 of file cpu_arith.h.
| #define DO_S4SUBL RCV = sext_u64_32((RAV * 4) - RBV); |
Definition at line 214 of file cpu_arith.h.
| #define DO_S4SUBQ RCV = (RAV * 4) - RBV; |
Definition at line 195 of file cpu_arith.h.
| #define DO_S8ADDL RCV = sext_u64_32((RAV * 8) + RBV); |
Definition at line 109 of file cpu_arith.h.
| #define DO_S8ADDQ RCV = (RAV * 8) + RBV; |
Definition at line 90 of file cpu_arith.h.
| #define DO_S8SUBL RCV = sext_u64_32((RAV * 8) - RBV); |
Definition at line 215 of file cpu_arith.h.
| #define DO_S8SUBQ RCV = (RAV * 8) - RBV; |
Definition at line 196 of file cpu_arith.h.
| #define DO_SUBL RCV = sext_u64_32(RAV - RBV); |
Definition at line 213 of file cpu_arith.h.
| #define DO_SUBL_V |
Value:
{ \
u64 rav = RAV; \
u64 rbv = RBV; \
RCV = sext_u64_32(rav - rbv); \
\
/* test for integer overflow */ \
if(((rav ^ rbv) & (rav ^ RCV)) & L_SIGN) \
{ \
ARITH_TRAP_I(TRAP_IOV, RC); \
printf("SUBL_V %016"LL "x - %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
RCV); \
} \
}
Definition at line 217 of file cpu_arith.h.
| #define DO_SUBQ RCV = RAV - RBV; |
Definition at line 194 of file cpu_arith.h.
| #define DO_SUBQ_V |
Value:
{ \
u64 rav = RAV; \
u64 rbv = RBV; \
RCV = rav - rbv; \
\
/* test for integer overflow */ \
if(((rav ^ rbv) & (rav ^ RCV)) & Q_SIGN) \
{ \
ARITH_TRAP_I(TRAP_IOV, RC); \
printf("SUBQ_V %016"LL "x - %016"LL "x = %016"LL "x + TRAP.\n", rav, rbv, \
RCV); \
} \
}
Definition at line 198 of file cpu_arith.h.
| #define DO_UMULH uemul64(RAV, RBV, &RCV); |
Definition at line 191 of file cpu_arith.h.