summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorGalen Williamson <galen@vector35.com>2025-08-06 19:22:13 -0400
committerGalen Williamson <galen@vector35.com>2025-08-14 14:06:49 -0400
commit193450bcf90800753aec316322ee651c5520ea57 (patch)
treefef4afd867ada17bb774db20c7d292df14c09df9 /arch
parent408894062e4ff6b7271d7eaaf877d59be1712c74 (diff)
[armv7] Add lifting for VCVT floating-point scalar variants
Diffstat (limited to 'arch')
-rw-r--r--arch/armv7/il.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/arch/armv7/il.cpp b/arch/armv7/il.cpp
index de53689b..73cf9a9a 100644
--- a/arch/armv7/il.cpp
+++ b/arch/armv7/il.cpp
@@ -4936,18 +4936,31 @@ bool GetLowLevelILForArmInstruction(Architecture* arch, uint64_t addr, LowLevelI
case ARMV7_VCVT:
switch (instr.dataType)
{
+ // To integer cases
case DT_S32:
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(4, il.Register(get_register_size(op2.reg), op2.reg))));
- ConditionExecute(il, instr.cond,
- il.SetRegister(get_register_size(op1.reg), op1.reg,
- il.FloatToInt(get_register_size(op1.reg), il.Register(get_register_size(op2.reg), op2.reg))));
+ 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)))));
+ break;
+ default:
+ break;
+ }
+ break;
+ // To float from integer cases
+ case DT_F32:
+ case DT_F64:
+ switch (instr.dataType2)
+ {
+ case DT_S32:
+ 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))));
break;
default:
break;