mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 07:34:33 +00:00
The ARM disassembler did not handle the alignment correctly for VLD*DUP* instructions
(single element or n-element structure to all lanes). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129550 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
06b2a60ef9
commit
de29a52940
@ -2657,6 +2657,33 @@ static bool DisassembleNLdSt(MCInst &MI, unsigned Opcode, uint32_t insn,
|
||||
// <size> == 32 && Inst{6} == 1 --> DblSpaced = true
|
||||
if (Name.endswith("32") || Name.endswith("32_UPD"))
|
||||
DblSpaced = slice(insn, 6, 6) == 1;
|
||||
} else if (Name.find("DUP") != std::string::npos) {
|
||||
// Single element (or structure) to all lanes.
|
||||
// Inst{9-8} encodes the number of element(s) in the structure, with:
|
||||
// 0b00 (VLD1DUP) (for this, a bit makes sense only for data size 16 and 32.
|
||||
// 0b01 (VLD2DUP)
|
||||
// 0b10 (VLD3DUP) (for this, a bit must be encoded as 0)
|
||||
// 0b11 (VLD4DUP)
|
||||
//
|
||||
// Inst{7-6} encodes the data size, with:
|
||||
// 0b00 => 8, 0b01 => 16, 0b10 => 32
|
||||
//
|
||||
// Inst{4} (the a bit) encodes the align action (0: standard alignment)
|
||||
unsigned elem = slice(insn, 9, 8) + 1;
|
||||
unsigned a = slice(insn, 4, 4);
|
||||
if (elem != 3) {
|
||||
// 0b11 is not a valid encoding for Inst{7-6}.
|
||||
if (slice(insn, 7, 6) == 3)
|
||||
return false;
|
||||
unsigned data_size = 8 << slice(insn, 7, 6);
|
||||
// For VLD1DUP, a bit makes sense only for data size of 16 and 32.
|
||||
if (a && data_size == 8)
|
||||
return false;
|
||||
|
||||
// Now we can calculate the alignment!
|
||||
if (a)
|
||||
alignment = elem * data_size;
|
||||
}
|
||||
} else {
|
||||
// Multiple n-element structures with type encoded as Inst{11-8}.
|
||||
// See, for example, A8.6.316 VLD4 (multiple 4-element structures).
|
||||
|
10
test/MC/Disassembler/ARM/invalid-VLD1DUPq8_UPD-arm.txt
Normal file
10
test/MC/Disassembler/ARM/invalid-VLD1DUPq8_UPD-arm.txt
Normal file
@ -0,0 +1,10 @@
|
||||
# RUN: llvm-mc --disassemble %s -triple=arm-apple-darwin9 |& grep {invalid instruction encoding}
|
||||
|
||||
# Opcode=737 Name=VLD1DUPq8_UPD Format=ARM_FORMAT_NLdSt(30)
|
||||
# 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
# | 1: 1: 1: 1| 0: 1: 0: 0| 1: 0: 1: 0| 0: 0: 0: 0| 0: 0: 1: 1| 1: 1: 0: 0| 0: 0: 1: 1| 1: 1: 0: 1|
|
||||
# -------------------------------------------------------------------------------------------------
|
||||
#
|
||||
# 'a' == 1 and data_size == 8 is invalid
|
||||
0x3d 0x3c 0xa0 0xf4
|
@ -21,6 +21,12 @@
|
||||
# CHECK: vld4.8 {d4, d6, d8, d10}, [r2]
|
||||
0x0f 0x41 0x22 0xf4
|
||||
|
||||
# CHECK: vld1.32 {d3[], d4[]}, [r0, :32]!
|
||||
0xbd 0x3c 0xa0 0xf4
|
||||
|
||||
# CHECK: vld4.16 {d3[], d4[], d5[], d6[]}, [r0, :64]!
|
||||
0x7d 0x3f 0xa0 0xf4
|
||||
|
||||
# CHECK: vmov d0, d15
|
||||
0x1f 0x01 0x2f 0xf2
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user