summaryrefslogtreecommitdiffhomepage
path: root/Private/CompilerKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-28 09:58:23 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-28 09:58:23 +0100
commitf08280eb5759350b2bc22a0ae901184ffc7bd80f (patch)
tree99d0690559b3a7176d4fcb920023e03d37ff1839 /Private/CompilerKit
parent73482b5dd2f8bacc019c8db2a563f45f81961686 (diff)
Asm: Improved AMD64 support for i64asm.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/CompilerKit')
-rw-r--r--Private/CompilerKit/AsmKit/Arch/amd64.hpp14
-rw-r--r--Private/CompilerKit/AsmKit/AsmKit.hpp69
2 files changed, 63 insertions, 20 deletions
diff --git a/Private/CompilerKit/AsmKit/Arch/amd64.hpp b/Private/CompilerKit/AsmKit/Arch/amd64.hpp
index 239bdca..ac92c9b 100644
--- a/Private/CompilerKit/AsmKit/Arch/amd64.hpp
+++ b/Private/CompilerKit/AsmKit/Arch/amd64.hpp
@@ -45,12 +45,19 @@ struct CpuCodeAMD64
#define kJumpLimitStandardLimit 0xEB
inline std::vector<CpuCodeAMD64> kOpcodesAMD64 = {
- kAsmOpcodeDecl("int", 0xE3)
+ kAsmOpcodeDecl("int", 0xCD)
kAsmOpcodeDecl("into", 0xCE)
+ kAsmOpcodeDecl("intd", 0xF1)
+ kAsmOpcodeDecl("int3", 0xC3)
+
kAsmOpcodeDecl("iret", 0xCF)
- kAsmOpcodeDecl("ret", 0xC3)
+ kAsmOpcodeDecl("retf", 0xCB)
+ kAsmOpcodeDecl("retn", 0xC3)
kAsmOpcodeDecl("sti", 0xfb)
kAsmOpcodeDecl("cli", 0xfa)
+
+ kAsmOpcodeDecl("nop", 0x90)
+
kAsmOpcodeDecl("mov eax", 0xb8)
kAsmOpcodeDecl("mov ecx", 0xb9)
kAsmOpcodeDecl("mov edx", 0xba)
@@ -58,8 +65,11 @@ inline std::vector<CpuCodeAMD64> kOpcodesAMD64 = {
kAsmOpcodeDecl("mov esp", 0xbc)
kAsmOpcodeDecl("mov ebp", 0xbd)
kAsmOpcodeDecl("mov esi", 0xbe)
+
kAsmOpcodeDecl("jmp", 0xE9)
kAsmOpcodeDecl("call", 0xE9)
+
+ kAsmOpcodeDecl("mov", 0x00)
};
// \brief 64x0 register prefix
diff --git a/Private/CompilerKit/AsmKit/AsmKit.hpp b/Private/CompilerKit/AsmKit/AsmKit.hpp
index cc8940e..a561aad 100644
--- a/Private/CompilerKit/AsmKit/AsmKit.hpp
+++ b/Private/CompilerKit/AsmKit/AsmKit.hpp
@@ -61,6 +61,53 @@ namespace CompilerKit
};
+ union NumberCastBase
+ {
+ NumberCastBase() = default;
+ ~NumberCastBase() = default;
+
+ };
+
+ union NumberCast64 final
+ {
+ NumberCast64() = default;
+ explicit NumberCast64(UInt64 raw) : raw(raw) {}
+ ~NumberCast64() { raw = 0; }
+
+ CharType number[8];
+ UInt64 raw;
+ };
+
+ union NumberCast32 final
+ {
+ NumberCast32() = default;
+ explicit NumberCast32(UInt32 raw) : raw(raw) {}
+ ~NumberCast32() { raw = 0; }
+
+ CharType number[4];
+ UInt32 raw;
+ };
+
+ union NumberCast16 final
+ {
+ NumberCast16() = default;
+ explicit NumberCast16(UInt16 raw) : raw(raw) {}
+ ~NumberCast16() { raw = 0; }
+
+ CharType number[2];
+ UInt16 raw;
+ };
+
+ union NumberCast8 final
+ {
+ NumberCast8() = default;
+ explicit NumberCast8(UInt8 raw) : raw(raw) {}
+ ~NumberCast8() { raw = 0; }
+
+ CharType number;
+ UInt8 raw;
+ };
+
class PlatformAssembler
{
public:
@@ -89,6 +136,10 @@ namespace CompilerKit
virtual bool WriteLine(std::string &line, const std::string &file) override;
virtual bool WriteNumber(const std::size_t& pos, std::string& from_what) override;
+ virtual bool WriteNumber16(const std::size_t& pos, std::string& from_what);
+ virtual bool WriteNumber32(const std::size_t& pos, std::string& from_what);
+ virtual bool WriteNumber8(const std::size_t& pos, std::string& from_what);
+
};
#endif // __ASM_NEED_AMD64__
@@ -128,23 +179,5 @@ namespace CompilerKit
};
#endif // __ASM_NEED_32x0__
-
- union NumberCast final
- {
- explicit NumberCast(UInt64 raw) : raw(raw) {}
- ~NumberCast() { raw = 0; }
-
- CharType number[8];
- UInt64 raw;
- };
-
- union NumberCast32 final
- {
- explicit NumberCast32(UInt32 raw) : raw(raw) {}
- ~NumberCast32() { raw = 0; }
-
- CharType number[4];
- UInt32 raw;
- };
}