ARM: fix assertions for uxtb and co.
Allow operands with ROR #0. Behind the scene they are mapped to LSL #0. BUG=v8:3209 LOG=N R=ulan@chromium.org Review URL: https://codereview.chromium.org/198053014 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20171 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
be4c4953b7
commit
d5753f27d9
@ -354,12 +354,17 @@ Operand::Operand(Handle<Object> handle) {
|
||||
|
||||
Operand::Operand(Register rm, ShiftOp shift_op, int shift_imm) {
|
||||
ASSERT(is_uint5(shift_imm));
|
||||
ASSERT(shift_op != ROR || shift_imm != 0); // use RRX if you mean it
|
||||
|
||||
rm_ = rm;
|
||||
rs_ = no_reg;
|
||||
shift_op_ = shift_op;
|
||||
shift_imm_ = shift_imm & 31;
|
||||
if (shift_op == RRX) {
|
||||
|
||||
if ((shift_op == ROR) && (shift_imm == 0)) {
|
||||
// ROR #0 is functionally equivalent to LSL #0 and this allow us to encode
|
||||
// RRX as ROR #0 (See below).
|
||||
shift_op = LSL;
|
||||
} else if (shift_op == RRX) {
|
||||
// encoded as ROR with shift_imm == 0
|
||||
ASSERT(shift_imm == 0);
|
||||
shift_op_ = ROR;
|
||||
@ -1788,7 +1793,9 @@ void Assembler::uxtb(Register dst,
|
||||
(src.shift_imm_ == 8) ||
|
||||
(src.shift_imm_ == 16) ||
|
||||
(src.shift_imm_ == 24));
|
||||
ASSERT(src.shift_op() == ROR);
|
||||
// Operand maps ROR #0 to LSL #0.
|
||||
ASSERT((src.shift_op() == ROR) ||
|
||||
((src.shift_op() == LSL) && (src.shift_imm_ == 0)));
|
||||
emit(cond | 0x6E*B20 | 0xF*B16 | dst.code()*B12 |
|
||||
((src.shift_imm_ >> 1)&0xC)*B8 | 7*B4 | src.rm().code());
|
||||
}
|
||||
@ -1810,7 +1817,9 @@ void Assembler::uxtab(Register dst,
|
||||
(src2.shift_imm_ == 8) ||
|
||||
(src2.shift_imm_ == 16) ||
|
||||
(src2.shift_imm_ == 24));
|
||||
ASSERT(src2.shift_op() == ROR);
|
||||
// Operand maps ROR #0 to LSL #0.
|
||||
ASSERT((src2.shift_op() == ROR) ||
|
||||
((src2.shift_op() == LSL) && (src2.shift_imm_ == 0)));
|
||||
emit(cond | 0x6E*B20 | src1.code()*B16 | dst.code()*B12 |
|
||||
((src2.shift_imm_ >> 1) &0xC)*B8 | 7*B4 | src2.rm().code());
|
||||
}
|
||||
@ -1830,7 +1839,9 @@ void Assembler::uxtb16(Register dst,
|
||||
(src.shift_imm_ == 8) ||
|
||||
(src.shift_imm_ == 16) ||
|
||||
(src.shift_imm_ == 24));
|
||||
ASSERT(src.shift_op() == ROR);
|
||||
// Operand maps ROR #0 to LSL #0.
|
||||
ASSERT((src.shift_op() == ROR) ||
|
||||
((src.shift_op() == LSL) && (src.shift_imm_ == 0)));
|
||||
emit(cond | 0x6C*B20 | 0xF*B16 | dst.code()*B12 |
|
||||
((src.shift_imm_ >> 1)&0xC)*B8 | 7*B4 | src.rm().code());
|
||||
}
|
||||
|
@ -1061,7 +1061,7 @@ void Decoder::DecodeType3(Instruction* instr) {
|
||||
if (instr->Bits(19, 16) == 0xF) {
|
||||
switch (instr->Bits(11, 10)) {
|
||||
case 0:
|
||||
Format(instr, "uxtb16'cond 'rd, 'rm, ror #0");
|
||||
Format(instr, "uxtb16'cond 'rd, 'rm");
|
||||
break;
|
||||
case 1:
|
||||
Format(instr, "uxtb16'cond 'rd, 'rm, ror #8");
|
||||
@ -1085,7 +1085,7 @@ void Decoder::DecodeType3(Instruction* instr) {
|
||||
if (instr->Bits(19, 16) == 0xF) {
|
||||
switch (instr->Bits(11, 10)) {
|
||||
case 0:
|
||||
Format(instr, "uxtb'cond 'rd, 'rm, ror #0");
|
||||
Format(instr, "uxtb'cond 'rd, 'rm");
|
||||
break;
|
||||
case 1:
|
||||
Format(instr, "uxtb'cond 'rd, 'rm, ror #8");
|
||||
@ -1100,7 +1100,7 @@ void Decoder::DecodeType3(Instruction* instr) {
|
||||
} else {
|
||||
switch (instr->Bits(11, 10)) {
|
||||
case 0:
|
||||
Format(instr, "uxtab'cond 'rd, 'rn, 'rm, ror #0");
|
||||
Format(instr, "uxtab'cond 'rd, 'rn, 'rm");
|
||||
break;
|
||||
case 1:
|
||||
Format(instr, "uxtab'cond 'rd, 'rn, 'rm, ror #8");
|
||||
|
@ -410,6 +410,8 @@ TEST(Type3) {
|
||||
"e6843895 pkhbt r3, r4, r5, lsl #17");
|
||||
COMPARE(pkhtb(r3, r4, Operand(r5, ASR, 17)),
|
||||
"e68438d5 pkhtb r3, r4, r5, asr #17");
|
||||
COMPARE(uxtb(r9, Operand(r10, ROR, 0)),
|
||||
"e6ef907a uxtb r9, r10");
|
||||
COMPARE(uxtb(r3, Operand(r4, ROR, 8)),
|
||||
"e6ef3474 uxtb r3, r4, ror #8");
|
||||
COMPARE(uxtab(r3, r4, Operand(r5, ROR, 8)),
|
||||
|
Loading…
Reference in New Issue
Block a user