Allow for [base - disp]

This commit is contained in:
gingerBill
2026-08-18 14:11:01 +01:00
parent 6e17e7a2de
commit 12c89ee2bf
4 changed files with 63 additions and 6 deletions

View File

@@ -8,6 +8,9 @@ struct lbAsmGenerate {
WriteOperandFlag_IsScale = 1<<1,
WriteOperandFlag_IsScaleLog2 = 1<<2,
WriteOperandFlag_Negate = 1<<3,
WriteOperandFlag_NONE = 0,
WriteOperandFlag_DEFAULT = WriteOperandFlag_PrintPrefixes,
};
@@ -77,6 +80,10 @@ struct lbAsmGenerate {
asm_string = gb_string_appendc(asm_string, "$$");
}
if (flags & WriteOperandFlag_Negate) {
val = -val;
}
asm_string = gb_string_append_fmt(asm_string, "%d", cast(int)val);
break;
}
@@ -97,6 +104,11 @@ struct lbAsmGenerate {
return write_constant_operand(asm_string, op, flags);
}
if (flags & WriteOperandFlag_Negate) {
flags &= ~WriteOperandFlag_Negate;
asm_string = gb_string_appendc(asm_string, "-");
}
switch (op->kind) {
case_ast_node(i, Ident, op);
Entity *e = entity_of_node(op);
@@ -276,14 +288,25 @@ struct lbAsmGenerate_amd64 : lbAsmGenerate {
gbString write_memory_operand(gbString asm_string, Slice<i32> const &op_number, AstAsmMemoryOperand *mem_op, u32 flags) override {
if (mem_op->disp) {
asm_string = this->write_operand(asm_string, op_number, mem_op->disp, flags&~WriteOperandFlag_PrintPrefixes);
u32 disp_flags = flags;
disp_flags &= ~WriteOperandFlag_PrintPrefixes;
if (mem_op->disp_op.kind == Token_Sub) {
disp_flags |= WriteOperandFlag_Negate;
}
asm_string = this->write_operand(asm_string, op_number, mem_op->disp, disp_flags);
}
asm_string = gb_string_appendc(asm_string, "(");
GB_ASSERT(mem_op->base != nullptr);
asm_string = this->write_operand(asm_string, op_number, mem_op->base, flags);
if (mem_op->index) {
u32 index_flags = flags;
if (mem_op->index_op.kind == Token_Sub) {
index_flags |= WriteOperandFlag_Negate;
}
asm_string = gb_string_appendc(asm_string, ",");
asm_string = this->write_operand(asm_string, op_number, mem_op->index, flags);
asm_string = this->write_operand(asm_string, op_number, mem_op->index, index_flags);
if (mem_op->scale) {
asm_string = gb_string_appendc(asm_string, ",");
switch (mem_op->scale_op.kind) {
@@ -634,7 +657,7 @@ struct lbAsmGenerate_amd64 : lbAsmGenerate {
LLVMValueRef call = LLVMBuildCall2(p->builder, fn_ty, ia, call_args.data, cast(unsigned)call_args.count, "");
if (false) {
if (true) {
// DEBUG PRINT!!!
// DEBUG PRINT!!!
// DEBUG PRINT!!!