diff options
| author | Mason Reed <mason@vector35.com> | 2024-08-22 20:28:39 -0400 |
|---|---|---|
| committer | mason <35282038+emesare@users.noreply.github.com> | 2024-08-27 11:16:59 -0700 |
| commit | 19d431815793d1a6e48d6c277d32a583047638a8 (patch) | |
| tree | 982d535bd201896b7235e33b08a1afce9c9f21c9 /arch/armv7 | |
| parent | 600f99ac5df8e9e5093e2962a6806b04d33e9122 (diff) | |
Fix unconstrained VADD and VABS
Diffstat (limited to 'arch/armv7')
| -rw-r--r-- | arch/armv7/thumb2_disasm/il_thumb2.cpp | 18 |
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), |
