aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Chambers <[email protected]>2021-10-05 13:47:38 +1300
committerAndrew Chambers <[email protected]>2021-10-05 13:47:38 +1300
commitdda3e77e5b3c01c52fc38a29cd81d49c52abb26c (patch)
tree76f87eea6761f4644db4557de04979a31512b630
parentc628b13a9852751a059c09defb432316d6ceaca2 (diff)
Handle more cases.
-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;