summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGalen Williamson <galen@vector35.com>2025-08-13 19:17:06 -0400
committerGalen Williamson <galen@vector35.com>2025-08-14 14:06:49 -0400
commit7d9f39f95d3d95a839db64347c5d2f4cabf788dd (patch)
tree3fc0734b492778c79292df794d3818385c4065c6
parent0becd045c5e3e0997c30cb64f19fe21b2b3c421f (diff)
[armv7] add explicit signedness to conversions for scalar forms of VCVT
-rw-r--r--arch/armv7/il.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/arch/armv7/il.cpp b/arch/armv7/il.cpp
index 73cf9a9a..0d79bcf6 100644
--- a/arch/armv7/il.cpp
+++ b/arch/armv7/il.cpp
@@ -4938,14 +4938,28 @@ bool GetLowLevelILForArmInstruction(Architecture* arch, uint64_t addr, LowLevelI
{
// To integer cases
case DT_S32:
+ switch (instr.dataType2)
+ {
+ case DT_F32:
+ case DT_F64:
+ ConditionExecute(il, instr.cond, il.SetRegister(get_register_size(op1.reg), op1.reg,
+ il.SignExtend(get_register_size(op1.reg),
+ il.FloatToInt(get_register_size(op1.reg), il.RoundToInt(get_register_size(op2.reg),
+ il.Register(get_register_size(op2.reg), op2.reg))))));
+ break;
+ default:
+ break;
+ }
+ break;
case DT_U32:
switch (instr.dataType2)
{
case DT_F32:
case DT_F64:
ConditionExecute(il, instr.cond, il.SetRegister(get_register_size(op1.reg), op1.reg,
- il.FloatToInt(get_register_size(op1.reg), il.RoundToInt(get_register_size(op2.reg),
- il.Register(get_register_size(op2.reg), op2.reg)))));
+ il.ZeroExtend(get_register_size(op1.reg),
+ il.FloatToInt(get_register_size(op1.reg), il.RoundToInt(get_register_size(op2.reg),
+ il.Register(get_register_size(op2.reg), op2.reg))))));
break;
default:
break;
@@ -4957,10 +4971,16 @@ bool GetLowLevelILForArmInstruction(Architecture* arch, uint64_t addr, LowLevelI
switch (instr.dataType2)
{
case DT_S32:
+ ConditionExecute(il, instr.cond, il.SetRegister(get_register_size(op1.reg), op1.reg,
+ il.IntToFloat(get_register_size(op1.reg),
+ il.SignExtend(get_register_size(op1.reg),
+ il.Register(get_register_size(op2.reg), op2.reg)))));
+ break;
case DT_U32:
ConditionExecute(il, instr.cond, il.SetRegister(get_register_size(op1.reg), op1.reg,
il.IntToFloat(get_register_size(op1.reg),
- il.Register(get_register_size(op2.reg), op2.reg))));
+ il.ZeroExtend(get_register_size(op1.reg),
+ il.Register(get_register_size(op2.reg), op2.reg)))));
break;
default:
break;