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

@@ -2489,16 +2489,21 @@ gb_internal Ast *parse_asm_operand(AstFile *f, bool allow_memory_operand) {
Ast *disp = nullptr;
Ast *type = nullptr;
Token index_op = {};
Token scale_op = {};
Token disp_op = {};
base = parse_asm_operand(f, false);
// [base]
// [base + index]
// [base - index]
// [base + index + disp]
// [base + index*scale] // *, <<, >>
// [base + index*scale + disp]
if (allow_token(f, Token_Add)) {
if (allow_token(f, Token_Add) ||
allow_token(f, Token_Sub)) {
index_op = f->prev_token;
index = parse_asm_operand(f, false);
if (allow_token(f, Token_Mul) ||
allow_token(f, Token_Shl) ||
@@ -2506,7 +2511,9 @@ gb_internal Ast *parse_asm_operand(AstFile *f, bool allow_memory_operand) {
scale_op = f->prev_token;
scale = parse_asm_operand(f, false);
}
if (allow_token(f, Token_Add)) {
if (allow_token(f, Token_Add) ||
allow_token(f, Token_Sub)) {
disp_op = f->prev_token;
disp = parse_asm_operand(f, false);
}
}
@@ -2521,9 +2528,11 @@ gb_internal Ast *parse_asm_operand(AstFile *f, bool allow_memory_operand) {
Ast *mem = alloc_ast_node(f, Ast_AsmMemoryOperand);
mem->AsmMemoryOperand.open = open;
mem->AsmMemoryOperand.base = base;
mem->AsmMemoryOperand.index_op = index_op;
mem->AsmMemoryOperand.index = index;
mem->AsmMemoryOperand.scale = scale;
mem->AsmMemoryOperand.scale_op = scale_op;
mem->AsmMemoryOperand.scale = scale;
mem->AsmMemoryOperand.disp_op = disp_op;
mem->AsmMemoryOperand.disp = disp;
mem->AsmMemoryOperand.close = close;
mem->AsmMemoryOperand.type = type;