| Index: src/arm/disasm-arm.cc
|
| diff --git a/src/arm/disasm-arm.cc b/src/arm/disasm-arm.cc
|
| index e0c99caf5568dd19e111dda2b3618f702c0aa1c7..0b8fee10f4d2af83e8e04f2b26280893b073252a 100644
|
| --- a/src/arm/disasm-arm.cc
|
| +++ b/src/arm/disasm-arm.cc
|
| @@ -2211,11 +2211,30 @@ void Decoder::DecodeSpecialCondition(Instruction* instr) {
|
| "vmovl.u%d q%d, d%d", imm3 * 8, Vd, Vm);
|
| } else if (instr->Opc1Value() == 7 && instr->Bit(4) == 0) {
|
| if (instr->Bits(11, 7) == 0x18) {
|
| - int Vd = instr->VFPDRegValue(kSimd128Precision);
|
| int Vm = instr->VFPMRegValue(kDoublePrecision);
|
| - int index = instr->Bit(19);
|
| - out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
|
| - "vdup q%d, d%d[%d]", Vd, Vm, index);
|
| + int imm4 = instr->Bits(19, 16);
|
| + int size = 0, index = 0;
|
| + if ((imm4 & 0x1) != 0) {
|
| + size = 8;
|
| + index = imm4 >> 1;
|
| + } else if ((imm4 & 0x2) != 0) {
|
| + size = 16;
|
| + index = imm4 >> 2;
|
| + } else {
|
| + size = 32;
|
| + index = imm4 >> 3;
|
| + }
|
| + if (instr->Bit(6) == 0) {
|
| + int Vd = instr->VFPDRegValue(kDoublePrecision);
|
| + out_buffer_pos_ +=
|
| + SNPrintF(out_buffer_ + out_buffer_pos_, "vdup.%i d%d, d%d[%d]",
|
| + size, Vd, Vm, index);
|
| + } else {
|
| + int Vd = instr->VFPDRegValue(kSimd128Precision);
|
| + out_buffer_pos_ +=
|
| + SNPrintF(out_buffer_ + out_buffer_pos_, "vdup.%i q%d, d%d[%d]",
|
| + size, Vd, Vm, index);
|
| + }
|
| } else if (instr->Bits(11, 10) == 0x2) {
|
| int Vd = instr->VFPDRegValue(kDoublePrecision);
|
| int Vn = instr->VFPNRegValue(kDoublePrecision);
|
| @@ -2346,6 +2365,27 @@ void Decoder::DecodeSpecialCondition(Instruction* instr) {
|
| out_buffer_pos_ +=
|
| SNPrintF(out_buffer_ + out_buffer_pos_, "vshr.u%d q%d, q%d, #%d",
|
| size, Vd, Vm, shift);
|
| + } else if (instr->Bit(10) == 1 && instr->Bit(6) == 0 &&
|
| + instr->Bit(4) == 1) {
|
| + // vsli.<size> Dd, Dm, shift
|
| + // vsri.<size> Dd, Dm, shift
|
| + int imm7 = instr->Bits(21, 16);
|
| + if (instr->Bit(7) != 0) imm7 += 64;
|
| + int size = base::bits::RoundDownToPowerOfTwo32(imm7);
|
| + int shift;
|
| + char direction;
|
| + if (instr->Bit(8) == 1) {
|
| + shift = imm7 - size;
|
| + direction = 'l'; // vsli
|
| + } else {
|
| + shift = 2 * size - imm7;
|
| + direction = 'r'; // vsri
|
| + }
|
| + int Vd = instr->VFPDRegValue(kDoublePrecision);
|
| + int Vm = instr->VFPMRegValue(kDoublePrecision);
|
| + out_buffer_pos_ +=
|
| + SNPrintF(out_buffer_ + out_buffer_pos_, "vs%ci.%d d%d, d%d, #%d",
|
| + direction, size, Vd, Vm, shift);
|
| } else {
|
| Unknown(instr);
|
| }
|
|
|