32x: drc: new debug facility (pdb). Few fixes thanks to it.

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@863 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2010-01-19 22:17:47 +00:00
parent 2368651527
commit 5686d93123
14 changed files with 708 additions and 33 deletions

View file

@ -241,30 +241,45 @@
#define EOP_MSR_REG(rm) EOP_C_MSR_REG(A_COND_AL,rm)
// XXX: AND, RSB, *C, MVN will break if 1 insn is not enough
// XXX: AND, RSB, *C, will break if 1 insn is not enough
static void emith_op_imm2(int cond, int s, int op, int rd, int rn, unsigned int imm)
{
int ror2;
u32 v;
if (op == A_OP_MOV) {
switch (op) {
case A_OP_MOV:
rn = 0;
if (~imm < 0x100) {
if (~imm < 0x10000) {
imm = ~imm;
op = A_OP_MVN;
}
} else if (imm == 0)
return;
break;
for (v = imm, ror2 = 0; v != 0 || op == A_OP_MOV; v >>= 8, ror2 -= 8/2) {
case A_OP_EOR:
case A_OP_SUB:
case A_OP_ADD:
case A_OP_ORR:
case A_OP_BIC:
if (s == 0 && imm == 0)
return;
break;
}
for (v = imm, ror2 = 0; ; ror2 -= 8/2) {
/* shift down to get 'best' rot2 */
for (; v && !(v & 3); v >>= 2)
ror2--;
EOP_C_DOP_IMM(cond, op, s, rn, rd, ror2 & 0x0f, v & 0xff);
v >>= 8;
if (v == 0)
break;
if (op == A_OP_MOV)
op = A_OP_ORR;
if (op == A_OP_MVN)
op = A_OP_BIC;
rn = rd;
}
}
@ -414,6 +429,9 @@ static int emith_xbranch(int cond, void *target, int is_call)
#define emith_add_r_imm(r, imm) \
emith_op_imm(A_COND_AL, 0, A_OP_ADD, r, imm)
#define emith_adc_r_imm(r, imm) \
emith_op_imm(A_COND_AL, 0, A_OP_ADC, r, imm)
#define emith_sub_r_imm(r, imm) \
emith_op_imm(A_COND_AL, 0, A_OP_SUB, r, imm)

View file

@ -180,13 +180,18 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI };
EMIT(imm, u32); \
} while (0)
// 2 - adc, 3 - sbb
#define emith_add_r_imm(r, imm) \
emith_arith_r_imm(0, r, imm)
#define emith_or_r_imm(r, imm) \
emith_arith_r_imm(1, r, imm)
#define emith_adc_r_imm(r, imm) \
emith_arith_r_imm(2, r, imm)
#define emith_sbc_r_imm(r, imm) \
emith_arith_r_imm(3, r, imm) // sbb
#define emith_and_r_imm(r, imm) \
emith_arith_r_imm(4, r, imm)