aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c49
1 files changed, 25 insertions, 24 deletions
diff --git a/main.c b/main.c
index 4e8f24f..38ce100 100644
--- a/main.c
+++ b/main.c
@@ -309,27 +309,39 @@ static void assemble() {
}
}
- if (isregkind(op->src->kind) && isregkind(op->dst->kind)) {
+ if (isregkind(op->dst->kind)) {
+ rm = rbits(op->dst->kind);
+ }
+
+ if (isregkind(op->src->kind)) {
- if (op->kind == ASM_ADD)
- opcode = 0x03;
- else if (op->kind == ASM_SUB)
- opcode = 0x2b;
- else {
+ if (op->kind == ASM_ADD) {
+ opcode = 0x01;
+ } else if (op->kind == ASM_AND) {
+ opcode = 0x21;
+ } else if (op->kind == ASM_SUB) {
+ opcode = 0x29;
+ } else if (op->kind == ASM_XOR) {
+ opcode = 0x31;
+ } else {
fatal("unreachable");
}
- reg = rbits(op->dst->kind);
- rm = rbits(op->src->kind);
-
+ reg = rbits(op->src->kind);
} else if (op->src->kind == ASM_IMM) {
if (op->kind == ASM_ADD) {
opcode = 0x81;
reg = 0x00;
+ } else if (op->kind == ASM_AND) {
+ opcode = 0x81;
+ reg = 0x05;
} else if (op->kind == ASM_SUB) {
opcode = 0x81;
reg = 0x05;
+ } else if (op->kind == ASM_XOR) {
+ opcode = 0x81;
+ reg = 0x05;
} else {
fatal("unreachable");
}
@@ -340,23 +352,8 @@ static void assemble() {
rm = rbits(op->dst->kind);
}
- } else if (isregkind(op->src->kind)) {
- assert(memarg);
-
- if (op->kind == ASM_ADD) {
- opcode = 0x01;
- } else if (op->kind == ASM_SUB) {
- opcode = 0x29;
- } else {
- fatal("unreachable");
- }
-
- reg = rbits(op->src->kind);
-
} else if (op->src->kind == ASM_MEMARG) {
fatal("todo");
- } else {
- fatal("unreachable");
}
rex = REX(op->type == 'q', reg & (1 << 4), 0, rm & (1 << 4));
@@ -372,6 +369,8 @@ static void assemble() {
}
switch (dispsz) {
+ case 0:
+ break;
case 1:
sb((uint8_t)disp);
break;
@@ -383,6 +382,8 @@ static void assemble() {
}
switch (immsz) {
+ case 0:
+ break;
case 1:
sb((uint8_t)imm);
break;