mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
ARM: fix VEXT encoding corner case
The disassembly of VEXT instructions was too lax in the bits checked. This fixes the case where the instruction affects Q-registers but a misaligned lane was specified (should be UNDEFINED). Patch by Amaury de la Vieuville llvm-svn: 183003
This commit is contained in:
parent
77f91408dd
commit
6b0f4fd85b
@ -5509,8 +5509,9 @@ class VEXTd<string OpcodeStr, string Dt, ValueType Ty, Operand immTy>
|
|||||||
IIC_VEXTD, OpcodeStr, Dt, "$Vd, $Vn, $Vm, $index", "",
|
IIC_VEXTD, OpcodeStr, Dt, "$Vd, $Vn, $Vm, $index", "",
|
||||||
[(set DPR:$Vd, (Ty (NEONvext (Ty DPR:$Vn),
|
[(set DPR:$Vd, (Ty (NEONvext (Ty DPR:$Vn),
|
||||||
(Ty DPR:$Vm), imm:$index)))]> {
|
(Ty DPR:$Vm), imm:$index)))]> {
|
||||||
bits<4> index;
|
bits<3> index;
|
||||||
let Inst{11-8} = index{3-0};
|
let Inst{11} = 0b0;
|
||||||
|
let Inst{10-8} = index{2-0};
|
||||||
}
|
}
|
||||||
|
|
||||||
class VEXTq<string OpcodeStr, string Dt, ValueType Ty, Operand immTy>
|
class VEXTq<string OpcodeStr, string Dt, ValueType Ty, Operand immTy>
|
||||||
@ -5525,14 +5526,14 @@ class VEXTq<string OpcodeStr, string Dt, ValueType Ty, Operand immTy>
|
|||||||
}
|
}
|
||||||
|
|
||||||
def VEXTd8 : VEXTd<"vext", "8", v8i8, imm0_7> {
|
def VEXTd8 : VEXTd<"vext", "8", v8i8, imm0_7> {
|
||||||
let Inst{11-8} = index{3-0};
|
let Inst{10-8} = index{2-0};
|
||||||
}
|
}
|
||||||
def VEXTd16 : VEXTd<"vext", "16", v4i16, imm0_3> {
|
def VEXTd16 : VEXTd<"vext", "16", v4i16, imm0_3> {
|
||||||
let Inst{11-9} = index{2-0};
|
let Inst{10-9} = index{1-0};
|
||||||
let Inst{8} = 0b0;
|
let Inst{8} = 0b0;
|
||||||
}
|
}
|
||||||
def VEXTd32 : VEXTd<"vext", "32", v2i32, imm0_1> {
|
def VEXTd32 : VEXTd<"vext", "32", v2i32, imm0_1> {
|
||||||
let Inst{11-10} = index{1-0};
|
let Inst{10} = index{0};
|
||||||
let Inst{9-8} = 0b00;
|
let Inst{9-8} = 0b00;
|
||||||
}
|
}
|
||||||
def : Pat<(v2f32 (NEONvext (v2f32 DPR:$Vn),
|
def : Pat<(v2f32 (NEONvext (v2f32 DPR:$Vn),
|
||||||
|
5
test/MC/Disassembler/ARM/invalid-VEXTd-arm.txt
Normal file
5
test/MC/Disassembler/ARM/invalid-VEXTd-arm.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# RUN: llvm-mc --disassemble %s -triple=armv7 2>&1 | grep "invalid instruction encoding"
|
||||||
|
|
||||||
|
# invalid imm4 value (0b1xxx)
|
||||||
|
# A8.8.316: if Q == '0' && imm4<3> == '1' then UNDEFINED;
|
||||||
|
0x8f 0xf9 0xf7 0xf2
|
Loading…
Reference in New Issue
Block a user