summaryrefslogtreecommitdiffhomepage
path: root/src/CompilerKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2026-01-18 16:49:57 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2026-01-18 16:49:57 +0100
commita39c93f475f30fad13580d178988b85ae1bfcce0 (patch)
tree19d359e017c494b8d6c4ced99381d5dd3ee420ce /src/CompilerKit
parent2e1b939a6a571e7437c5a0365f16879a224b862a (diff)
feat: Assemblers:x64: Add more instructions and codegen fixes.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/CompilerKit')
-rw-r--r--src/CompilerKit/src/Assemblers/Assembler+AMD64.cc52
1 files changed, 35 insertions, 17 deletions
diff --git a/src/CompilerKit/src/Assemblers/Assembler+AMD64.cc b/src/CompilerKit/src/Assemblers/Assembler+AMD64.cc
index f1736cc..a4c8d1f 100644
--- a/src/CompilerKit/src/Assemblers/Assembler+AMD64.cc
+++ b/src/CompilerKit/src/Assemblers/Assembler+AMD64.cc
@@ -297,7 +297,7 @@ NECTAR_MODULE(AssemblerMainAMD64) {
if (byte == 0) continue;
if (byte == 0xFF) {
- byte = 0;
+ byte = 0x00;
}
file_ptr_out << reinterpret_cast<const char*>(&byte)[0];
@@ -580,7 +580,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber(const std::size_t& pos, std::string&
CompilerKit::NumberCast64(strtol(jump_label.substr(pos + 2).c_str(), nullptr, 16));
for (auto& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -608,7 +608,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber(const std::size_t& pos, std::string&
}
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -631,7 +631,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber(const std::size_t& pos, std::string&
}
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -654,7 +654,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber(const std::size_t& pos, std::string&
CompilerKit::NumberCast64(strtol(jump_label.substr(pos).c_str(), nullptr, 10));
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -681,7 +681,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber32(const std::size_t& pos, std::strin
CompilerKit::NumberCast32 num = CompilerKit::NumberCast32(res);
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -708,7 +708,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber32(const std::size_t& pos, std::strin
}
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -730,7 +730,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber32(const std::size_t& pos, std::strin
}
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -752,7 +752,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber32(const std::size_t& pos, std::strin
CompilerKit::NumberCast32 num = CompilerKit::NumberCast32(res);
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -780,7 +780,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber16(const std::size_t& pos, std::strin
CompilerKit::NumberCast16(strtol(jump_label.substr(pos + 2).c_str(), nullptr, 16));
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -808,7 +808,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber16(const std::size_t& pos, std::strin
}
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -831,7 +831,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber16(const std::size_t& pos, std::strin
}
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -854,7 +854,7 @@ bool CompilerKit::EncoderAMD64::WriteNumber16(const std::size_t& pos, std::strin
CompilerKit::NumberCast16(strtol(jump_label.substr(pos).c_str(), nullptr, 10));
for (char& i : num.number) {
- if (i == 0) i = 0xFF;
+ if (i == 0) continue;
kAppBytes.push_back(i);
}
@@ -1194,6 +1194,20 @@ bool CompilerKit::EncoderAMD64::WriteLine(std::string line, std::string file) {
}
if (!found) {
+ if (isnumber(substr[0])) {
+ kAppBytes.emplace_back(name == "push" ? 0x68 : 0x8F);
+
+ if (kRegisterBitWidth == 64) {
+ this->WriteNumber(0, substr);
+ } else if (kRegisterBitWidth == 32) {
+ this->WriteNumber32(0, substr);
+ } else if (kRegisterBitWidth == 16) {
+ this->WriteNumber16(0, substr);
+ }
+
+ break;
+ }
+
CompilerKit::Detail::print_error("Invalid operand for " + name + ": " + substr,
"CompilerKit");
throw std::runtime_error("invalid_push_pop_operand");
@@ -1211,13 +1225,17 @@ bool CompilerKit::EncoderAMD64::WriteLine(std::string line, std::string file) {
} else if (name == "jmp" || name == "call") {
kAppBytes.emplace_back(opcodeAMD64.fOpcode);
- this->WriteNumber32(line.find(name) + name.size() + 1, line);
-
+ if (kRegisterBitWidth == 64) {
+ this->WriteNumber(line.find(name) + name.size() + 1, line);
+ } else {
+ this->WriteNumber32(line.find(name) + name.size() + 1, line);
+ }
break;
- } else if (name == "syscall") {
+ }
+
+ if (name == "syscall") {
kAppBytes.emplace_back(opcodeAMD64.fOpcode);
kAppBytes.emplace_back(0x05);
-
break;
} else {
kAppBytes.emplace_back(opcodeAMD64.fOpcode);