diff --git a/Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc b/Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc index 408634fc75..c2269e5c78 100644 --- a/Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc +++ b/Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc @@ -518,12 +518,12 @@ thBitWidth: "#"^w is imm3_shft & imm2_shft & thc0004 [ w = thc0004 - ((imm3_shft thAddrShift:[Rn0003,Rm0003] is Rn0003; thc0405=0 & Rm0003 { local addr = Rn0003 + Rm0003; - export *:4 addr; + export addr; } thAddrShift: [Rn0003,Rm0003,"lsl #"^thc0405] is Rn0003; thc0405 & Rm0003 { local addr = Rn0003 + (Rm0003 << thc0405); - export *:4 addr; + export addr; } ##################### diff --git a/Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc b/Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc index 173f80f7cd..542d2fcd48 100644 --- a/Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc +++ b/Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc @@ -2413,7 +2413,7 @@ ArmPCRelImmed12: reloff is U23=0 & immed & rotate :blx HAddr24 is $(AMODE) & CALLoverride=0 & ARMcond=0 & cond=15 & c2527=5 & H24=0 & HAddr24 { lr = inst_next; - SetThumbMode(1); # TMode done by HAddr24's globalset + TB = 1; # TMode done by HAddr24's globalset, no need to invoke SetThumbMode(), since static call HAddr24; # don't do causes decompiler trouble TB = 0; } # Always changes to THUMB mode @@ -2421,7 +2421,7 @@ ArmPCRelImmed12: reloff is U23=0 & immed & rotate :blx HAddr24 is $(AMODE) & CALLoverride=1 & ARMcond=0 & cond=15 & c2527=5 & H24=0 & HAddr24 { lr = inst_next; - SetThumbMode(1); # TMode done by HAddr24's globalset + TB = 1; # TMode done by HAddr24's globalset, no need to invoke SetThumbMode(), since static goto HAddr24; } # Always changes to THUMB mode @@ -2429,7 +2429,7 @@ ArmPCRelImmed12: reloff is U23=0 & immed & rotate :blx HAddr24 is $(AMODE) & ARMcond=0 & CALLoverride=0 & cond=15 & c2527=5 & H24=1 & HAddr24 { lr = inst_next; - SetThumbMode(1); # TMode done by HAddr24's globalset + TB = 1; # TMode done by HAddr24's globalset, no need to invoke SetThumbMode(), since static call HAddr24; # don't do causes decompiler trouble TB = 0; } # Always changes to THUMB mode @@ -2437,7 +2437,7 @@ ArmPCRelImmed12: reloff is U23=0 & immed & rotate :blx HAddr24 is $(AMODE) & ARMcond=0 & CALLoverride=1 & cond=15 & c2527=5 & H24=1 & HAddr24 { lr = inst_next; - SetThumbMode(1); # TMode done by HAddr24's globalset + TB = 1; # TMode done by HAddr24's globalset, no need to invoke SetThumbMode(), since static goto HAddr24; } # Always changes to THUMB mode diff --git a/Ghidra/Processors/ARM/src/main/java/ghidra/program/emulation/ArmPcodeUseropLibraryFactory.java b/Ghidra/Processors/ARM/src/main/java/ghidra/program/emulation/ArmPcodeUseropLibraryFactory.java index 6a23cd78f1..cb29cbe441 100644 --- a/Ghidra/Processors/ARM/src/main/java/ghidra/program/emulation/ArmPcodeUseropLibraryFactory.java +++ b/Ghidra/Processors/ARM/src/main/java/ghidra/program/emulation/ArmPcodeUseropLibraryFactory.java @@ -19,9 +19,12 @@ import java.math.BigInteger; import ghidra.app.plugin.processors.sleigh.SleighLanguage; import ghidra.pcode.emu.DefaultPcodeThread.PcodeThreadExecutor; +import ghidra.pcode.error.LowlevelError; import ghidra.pcode.exec.*; import ghidra.pcode.exec.PcodeUseropLibraryFactory.UseropLibrary; -import ghidra.program.model.lang.*; +import ghidra.program.model.lang.Register; +import ghidra.program.model.lang.RegisterValue; +import ghidra.program.model.pcode.Varnode; import ghidra.util.Msg; @UseropLibrary("arm") @@ -39,7 +42,7 @@ public class ArmPcodeUseropLibraryFactory implements PcodeUseropLibraryFactory { // LATER: This should probably be injected private final ArmCpuState cpuState = new ArmCpuState(); - public ArmPcodeUseropLibrary(Language language) { + public ArmPcodeUseropLibrary(SleighLanguage language) { Register tModeReg = language.getRegister("TMode"); if (tModeReg != null) { tMode = new RegisterValue(tModeReg, BigInteger.ONE); @@ -49,6 +52,32 @@ public class ArmPcodeUseropLibraryFactory implements PcodeUseropLibraryFactory { tMode = null; aMode = null; } + + SleighPcodeUseropDefinition.Factory factory = + new SleighPcodeUseropDefinition.Factory(language); + + putOp(factory.define("VectorSignedToFloat") + .params("s", "mode") + .body(args -> switch (args.get(0).getSize()) { + case 4 -> "__op_output = int2float(s);"; + default -> throw new LowlevelError( + "VectorSignedToFloat: invalid dest size of " + args.get(0).getSize()); + }) + .build()); + putOp(factory.define("VectorUnsignedToFloat") + .params("s", "mode") + .body(args -> switch (args.get(0).getSize()) { + case 4 -> { + Varnode s = args.get(1); + yield """ + temp:%d = zext(s); + __op_output = int2float(s); + """.formatted(s.getSize() + 1); + } + default -> throw new LowlevelError( + "VectorSignedToFloat: invalid dest size of " + args.get(0).getSize()); + }) + .build()); } @PcodeUserop(modifiesContext = true) diff --git a/Ghidra/Processors/Hexagon/src/main/java/ghidra/program/emulation/HexagonPcodeUseropLibraryFactory.java b/Ghidra/Processors/Hexagon/src/main/java/ghidra/program/emulation/HexagonPcodeUseropLibraryFactory.java index 61b7cc92aa..eea13a06d9 100644 --- a/Ghidra/Processors/Hexagon/src/main/java/ghidra/program/emulation/HexagonPcodeUseropLibraryFactory.java +++ b/Ghidra/Processors/Hexagon/src/main/java/ghidra/program/emulation/HexagonPcodeUseropLibraryFactory.java @@ -104,7 +104,7 @@ public class HexagonPcodeUseropLibraryFactory implements PcodeUseropLibraryFacto case 4 -> "__op_output = __isClassifiedFloat32(bits, cls);"; case 8 -> "__op_output = __isClassifiedFloat64(bits, cls);"; default -> throw new LowlevelError( - "isClassifiedFloat: invalid float size of " + args.get(0).getSize()); + "isClassifiedFloat: invalid float size of " + args.get(1).getSize()); }) .build()); } diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/pcode/emu/jit/gen/ArmJitCodeGeneratorTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/pcode/emu/jit/gen/ArmJitCodeGeneratorTest.java index c8b8b3d077..7132da4e70 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/pcode/emu/jit/gen/ArmJitCodeGeneratorTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/ghidra/pcode/emu/jit/gen/ArmJitCodeGeneratorTest.java @@ -122,8 +122,8 @@ public class ArmJitCodeGeneratorTest extends AbstractJitCodeGeneratorTest { """, Map.ofEntries( Map.entry(0x00400000L, """ if (!ZR) goto ; - ISAModeSwitch = 1; - setISAMode(ISAModeSwitch); + TB = 1; + setISAMode(TB); emu_exec_decoded(); """)));