Check for invalid alignment values when decoding VLDn/VSTn (single ln) instructions.

Patch by Chris Lidbury.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163321 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tim Northover
2012-09-06 15:17:49 +00:00
parent 3d5f96ee1b
commit eae1d34029
6 changed files with 131 additions and 8 deletions

View File

@@ -3710,8 +3710,16 @@ static DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn,
if (fieldFromInstruction(Insn, 6, 1))
return MCDisassembler::Fail; // UNDEFINED
index = fieldFromInstruction(Insn, 7, 1);
if (fieldFromInstruction(Insn, 4, 2) != 0)
align = 4;
switch (fieldFromInstruction(Insn, 4, 2)) {
case 0 :
align = 0; break;
case 3:
align = 4; break;
default:
return MCDisassembler::Fail;
}
break;
}
if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
@@ -3769,8 +3777,16 @@ static DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn,
if (fieldFromInstruction(Insn, 6, 1))
return MCDisassembler::Fail; // UNDEFINED
index = fieldFromInstruction(Insn, 7, 1);
if (fieldFromInstruction(Insn, 4, 2) != 0)
align = 4;
switch (fieldFromInstruction(Insn, 4, 2)) {
case 0:
align = 0; break;
case 3:
align = 4; break;
default:
return MCDisassembler::Fail;
}
break;
}
if (Rm != 0xF) { // Writeback
@@ -4090,8 +4106,15 @@ static DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn,
inc = 2;
break;
case 2:
if (fieldFromInstruction(Insn, 4, 2))
align = 4 << fieldFromInstruction(Insn, 4, 2);
switch (fieldFromInstruction(Insn, 4, 2)) {
case 0:
align = 0; break;
case 3:
return MCDisassembler::Fail;
default:
align = 4 << fieldFromInstruction(Insn, 4, 2); break;
}
index = fieldFromInstruction(Insn, 7, 1);
if (fieldFromInstruction(Insn, 6, 1))
inc = 2;
@@ -4164,8 +4187,15 @@ static DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn,
inc = 2;
break;
case 2:
if (fieldFromInstruction(Insn, 4, 2))
align = 4 << fieldFromInstruction(Insn, 4, 2);
switch (fieldFromInstruction(Insn, 4, 2)) {
case 0:
align = 0; break;
case 3:
return MCDisassembler::Fail;
default:
align = 4 << fieldFromInstruction(Insn, 4, 2); break;
}
index = fieldFromInstruction(Insn, 7, 1);
if (fieldFromInstruction(Insn, 6, 1))
inc = 2;