30a31
> #include "base/condcodes.hh"
34,36d34
< static int32_t arm_NEG(int32_t val) { return (val >> 31); }
< static int32_t arm_POS(int32_t val) { return ((~val) >> 31); }
<
42,43c40,42
< enum ArmShiftType shiftType;
< shiftType = (enum ArmShiftType) type;
---
> assert(shamt < 32);
> ArmShiftType shiftType;
> shiftType = (ArmShiftType)type;
47,68c46,66
< case LSL:
< return (base << shamt);
< case LSR:
< if (shamt == 0)
< return (0);
< else
< return (base >> shamt);
< case ASR:
< if (shamt == 0)
< return ((uint32_t) ((int32_t) base >> 31L));
< else
< return ((uint32_t) (((int32_t) base) >> shamt));
< case ROR:
< //shamt = shamt & 0x1f;
< if (shamt == 0)
< return (cfval << 31) | (base >> 1); // RRX
< else
< return (base << (32 - shamt)) | (base >> shamt);
< default:
< fprintf(stderr, "Unhandled shift type\n");
< exit(1);
< break;
---
> case LSL:
> return base << shamt;
> case LSR:
> if (shamt == 0)
> return 0;
> else
> return base >> shamt;
> case ASR:
> if (shamt == 0)
> return (int32_t)base >> 31;
> else
> return (int32_t)base >> shamt;
> case ROR:
> if (shamt == 0)
> return (cfval << 31) | (base >> 1); // RRX
> else
> return (base << (32 - shamt)) | (base >> shamt);
> default:
> fprintf(stderr, "Unhandled shift type\n");
> exit(1);
> break;
83,113c81,105
< case LSL:
< if (shamt == 0)
< return (base);
< else if (shamt >= 32)
< return (0);
< else
< return (base << shamt);
< case LSR:
< if (shamt == 0)
< return (base);
< else if (shamt >= 32)
< return (0);
< else
< return (base >> shamt);
< case ASR:
< if (shamt == 0)
< return base;
< else if (shamt >= 32)
< return ((uint32_t) ((int32_t) base >> 31L));
< else
< return ((uint32_t) (((int32_t) base) >> (int) shamt));
< case ROR:
< shamt = shamt & 0x1f;
< if (shamt == 0)
< return (base);
< else
< return ((base << (32 - shamt)) | (base >> shamt));
< default:
< fprintf(stderr, "Unhandled shift type\n");
< exit(1);
< break;
---
> case LSL:
> if (shamt >= 32)
> return 0;
> else
> return base << shamt;
> case LSR:
> if (shamt >= 32)
> return 0;
> else
> return base >> shamt;
> case ASR:
> if (shamt >= 32)
> return (int32_t)base >> 31;
> else
> return (int32_t)base >> shamt;
> case ROR:
> shamt = shamt & 0x1f;
> if (shamt == 0)
> return base;
> else
> return (base << (32 - shamt)) | (base >> shamt);
> default:
> fprintf(stderr, "Unhandled shift type\n");
> exit(1);
> break;
120c112
< int32_t
---
> bool
129c121,124
< case LSL:
---
> case LSL:
> if (shamt == 0)
> return cfval;
> else
131,151c126,145
< case LSR:
< if (shamt == 0)
< return (base >> 31) & 1;
< else
< return (base >> (shamt - 1)) & 1;
< case ASR:
< if (shamt == 0)
< return (base >> 31L);
< else
< return ((uint32_t) (((int32_t) base) >> (shamt - 1))) & 1;
< case ROR:
< shamt = shamt & 0x1f;
< if (shamt == 0)
< return (base & 1); // RRX
< else
< return (base >> (shamt - 1)) & 1;
< default:
< fprintf(stderr, "Unhandled shift type\n");
< exit(1);
< break;
<
---
> case LSR:
> if (shamt == 0)
> return (base >> 31);
> else
> return (base >> (shamt - 1)) & 1;
> case ASR:
> if (shamt == 0)
> return (base >> 31);
> else
> return (base >> (shamt - 1)) & 1;
> case ROR:
> shamt = shamt & 0x1f;
> if (shamt == 0)
> return (base & 1); // RRX
> else
> return (base >> (shamt - 1)) & 1;
> default:
> fprintf(stderr, "Unhandled shift type\n");
> exit(1);
> break;
158c152
< int32_t
---
> bool
164a159,161
> if (shamt == 0)
> return cfval;
>
167,204c164,186
< case LSL:
< if (shamt == 0)
< return (!!cfval);
< else if (shamt == 32)
< return (base & 1);
< else if (shamt > 32)
< return (0);
< else
< return ((base >> (32 - shamt)) & 1);
< case LSR:
< if (shamt == 0)
< return (!!cfval);
< else if (shamt == 32)
< return (base >> 31);
< else if (shamt > 32)
< return (0);
< else
< return ((base >> (shamt - 1)) & 1);
< case ASR:
< if (shamt == 0)
< return (!!cfval);
< else if (shamt >= 32)
< return (base >> 31L);
< else
< return (((uint32_t) (((int32_t) base) >> (shamt - 1))) & 1);
< case ROR:
< if (shamt == 0)
< return (!!cfval);
< shamt = shamt & 0x1f;
< if (shamt == 0)
< return (base >> 31); // RRX
< else
< return ((base >> (shamt - 1)) & 1);
< default:
< fprintf(stderr, "Unhandled shift type\n");
< exit(1);
< break;
<
---
> case LSL:
> if (shamt > 32)
> return 0;
> else
> return (base >> (32 - shamt)) & 1;
> case LSR:
> if (shamt > 32)
> return 0;
> else
> return (base >> (shamt - 1)) & 1;
> case ASR:
> if (shamt > 32)
> shamt = 32;
> return (base >> (shamt - 1)) & 1;
> case ROR:
> shamt = shamt & 0x1f;
> if (shamt == 0)
> shamt = 32;
> return (base >> (shamt - 1)) & 1;
> default:
> fprintf(stderr, "Unhandled shift type\n");
> exit(1);
> break;
211c193
< int32_t
---
> bool
214,219c196
< if ((lhs | rhs) >> 30)
< return ((arm_NEG(lhs) && arm_NEG(rhs)) ||
< (arm_NEG(lhs) && arm_POS(result)) ||
< (arm_NEG(rhs) && arm_POS(result)));
<
< return 0;
---
> return findCarry(32, result, lhs, rhs);
223c200
< int32_t
---
> bool
226,231c203
< if ((lhs >= rhs) || ((rhs | lhs) >> 31))
< return ((arm_NEG(lhs) && arm_POS(rhs)) ||
< (arm_NEG(lhs) && arm_POS(result)) ||
< (arm_POS(rhs) && arm_POS(result)));
<
< return 0;
---
> return findCarry(32, result, lhs, ~rhs);
234c206
< int32_t
---
> bool
237,241c209
< if ((lhs | rhs) >> 30)
< return ((arm_NEG(lhs) && arm_NEG(rhs) && arm_POS(result)) ||
< (arm_POS(lhs) && arm_POS(rhs) && arm_NEG(result)));
<
< return 0;
---
> return findOverflow(32, result, lhs, rhs);
244c212
< int32_t
---
> bool
247,251c215
< if ((lhs >= rhs) || ((rhs | lhs) >> 31))
< return ((arm_NEG(lhs) && arm_POS(rhs) && arm_POS(result)) ||
< (arm_POS(lhs) && arm_NEG(rhs) && arm_NEG(result)));
<
< return 0;
---
> return findOverflow(32, result, lhs, ~rhs);