diff --git a/codegen.c b/codegen.c index 8f8ca1fd309d5c59aae001a82bc43d3d47fec576..5db73abf1f0103aee05578d50ddebb244b577783 100644 --- a/codegen.c +++ b/codegen.c @@ -173,25 +173,38 @@ static void gen_expr(Node *node) { gen_expr(node->lhs); pop("%rdi"); + char *ax, *di; + + if (node->lhs->ty->kind == TY_LONG || node->lhs->ty->base) { + ax = "%rax"; + di = "%rdi"; + } else { + ax = "%eax"; + di = "%edi"; + } + switch (node->kind) { case ND_ADD: - println(" add %%rdi, %%rax"); + println(" add %s, %s", di, ax); return; case ND_SUB: - println(" sub %%rdi, %%rax"); + println(" sub %s, %s", di, ax); return; case ND_MUL: - println(" imul %%rdi, %%rax"); + println(" imul %s, %s", di, ax); return; case ND_DIV: - println(" cqo"); - println(" idiv %%rdi"); + if (node->lhs->ty->size == 8) + println(" cqo"); + else + println(" cdq"); + println(" idiv %s", di); return; case ND_EQ: case ND_NE: case ND_LT: case ND_LE: - println(" cmp %%rdi, %%rax"); + println(" cmp %s, %s", di, ax); if (node->kind == ND_EQ) println(" sete %%al");