"MOVWF", LTYPE3, AMOVWF,
"LDREX", LTYPE3, ALDREX,
+ "LDREXD", LTYPE3, ALDREXD,
"STREX", LTYPE9, ASTREX,
+ "STREXD", LTYPE9, ASTREXD,
/*
"ABSF", LTYPEI, AABSF,
ALDREX,
ASTREX,
+
+ ALDREXD,
+ ASTREXD,
ALAST,
};
aclass(&p->from);
if(instoffset != 0)
diag("offset must be zero in STREX");
- o1 = (0x3<<23) | (0xf9<<4);
+ o1 = (0x18<<20) | (0xf90);
o1 |= p->from.reg << 16;
o1 |= p->reg << 0;
o1 |= p->to.reg << 12;
o1 = oprrr(ACMP+AEND, p->scond);
o1 |= p->from.reg<<16;
break;
+ case 91: /* ldrexd oreg,reg */
+ aclass(&p->from);
+ if(instoffset != 0)
+ diag("offset must be zero in LDREX");
+ o1 = (0x1b<<20) | (0xf9f);
+ o1 |= p->from.reg << 16;
+ o1 |= p->to.reg << 12;
+ o1 |= (p->scond & C_SCOND) << 28;
+ break;
+ case 92: /* strexd reg,oreg,reg */
+ aclass(&p->from);
+ if(instoffset != 0)
+ diag("offset must be zero in STREX");
+ o1 = (0x1a<<20) | (0xf90);
+ o1 |= p->from.reg << 16;
+ o1 |= p->reg << 0;
+ o1 |= p->to.reg << 12;
+ o1 |= (p->scond & C_SCOND) << 28;
+ break;
}
out[0] = o1;
{ ATST, C_REG, C_NONE, C_NONE, 90, 4, 0 },
+ { ALDREXD, C_SOREG,C_NONE, C_REG, 91, 4, 0 },
+ { ASTREXD, C_SOREG,C_REG, C_REG, 92, 4, 0 },
+
{ AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0 },
};
case ALDREX:
case ASTREX:
+ case ALDREXD:
+ case ASTREXD:
case ATST:
break;
}