summaryrefslogtreecommitdiff
path: root/arch/armv7
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2024-08-22 20:28:39 -0400
committermason <35282038+emesare@users.noreply.github.com>2024-08-27 11:16:59 -0700
commit19d431815793d1a6e48d6c277d32a583047638a8 (patch)
tree982d535bd201896b7235e33b08a1afce9c9f21c9 /arch/armv7
parent600f99ac5df8e9e5093e2962a6806b04d33e9122 (diff)
Fix unconstrained VADD and VABS
Diffstat (limited to 'arch/armv7')
-rw-r--r--arch/armv7/thumb2_disasm/il_thumb2.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/arch/armv7/thumb2_disasm/il_thumb2.cpp b/arch/armv7/thumb2_disasm/il_thumb2.cpp
index c68506be..996b76a3 100644
--- a/arch/armv7/thumb2_disasm/il_thumb2.cpp
+++ b/arch/armv7/thumb2_disasm/il_thumb2.cpp
@@ -1455,10 +1455,24 @@ bool GetLowLevelILForNEONInstruction(Architecture* arch, LowLevelILFunction& il,
(void)ifThenBlock;
switch (instr->mnem){
case armv7::ARMV7_VABS:
- il.AddInstruction(WriteILOperand(il, instr, 0, il.FloatAbs(GetRegisterSize(instr, 0), ReadILOperand(il, instr, 1))));
+ if (strcmp(instr->format->operation, "vabs.f64") == 0 || strcmp(instr->format->operation, "vabs.f32") == 0)
+ {
+ il.AddInstruction(WriteILOperand(il, instr, 0, il.FloatAbs(GetRegisterSize(instr, 0), ReadILOperand(il, instr, 1))));
+ }
+ else
+ {
+ il.AddInstruction(il.Unimplemented());
+ }
break;
case armv7::ARMV7_VADD:
- il.AddInstruction(WriteArithOperand(il, instr, il.Add(GetRegisterSize(instr, 0), ReadILOperand(il, instr, 1), ReadILOperand(il, instr, 2))));
+ if (strcmp(instr->format->operation, "vadd.f64") == 0 || strcmp(instr->format->operation, "vadd.f32") == 0)
+ {
+ il.AddInstruction(WriteArithOperand(il, instr, il.FloatAdd(GetRegisterSize(instr, 0), ReadILOperand(il, instr, 1), ReadILOperand(il, instr, 2))));
+ }
+ else
+ {
+ il.AddInstruction(il.Unimplemented());
+ }
break;
case armv7::ARMV7_VBIF:
il.AddInstruction(WriteArithOperand(il, instr, il.Or(GetRegisterSize(instr, 0),