aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/main.c b/main.c
index d4a326e..4806722 100644
--- a/main.c
+++ b/main.c
@@ -276,7 +276,7 @@ static void assemble() {
} else {
fatal("TODO mem arg with disp");
}
- } else {
+ } else { // imm, r64
uint8_t rbits = r64bits(add->dst->kind);
uint8_t rex = REX(1,0,0,rbits&(1<<4));
sb3(rex, 0x81, modrm(0x03, 0x00, rbits));
@@ -291,11 +291,14 @@ static void assemble() {
case ASM_MEMARG:
fatal("TODO");
break;
- default:
- sb3(REX_W, 0x03,
- modrm(0x03, r64bits(add->dst->kind), r64bits(add->src->kind)));
+ default: { // r64, r64
+ uint8_t srcbits = r64bits(add->src->kind);
+ uint8_t dstbits = r64bits(add->dst->kind);
+ uint8_t rex = REX(1,dstbits&(1<<4),0,srcbits&(1<<4));
+ sb3(rex, 0x03, modrm(0x03, dstbits, srcbits));
break;
}
+ }
break;
}
break;