shithub: scc

Download patch

ref: c2677b83f943373787dd200c425fc2cbb90a49c0
parent: 2d60e8ab6926bc6850e5299182747c314e2589ce
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Fri May 18 04:11:32 EDT 2018

[as/286] Add reg8_reg8()

This function implements 8 bit register to register instructions.
It hasn't been tested, but it should work.

--- a/as/target/x86/ins.c
+++ b/as/target/x86/ins.c
@@ -6,6 +6,15 @@
 #include "../../as.h"
 #include "proc.h"
 
+#define addrbyte(mod, reg, rm) ((mod) << 6 | (reg) << 3 | (rm))
+
+enum addr_mode {
+	MEM_MODE   = 0,
+	MEM8_MODE  = 1,
+	MEM16_MODE = 2,
+	REG_MODE   = 3,
+};
+
 static int
 getclass(Node *np)
 {
@@ -220,4 +229,33 @@
 Node *
 moperand(void)
 {
+}
+
+static int
+reg8toint(Node *np)
+{
+	switch (np->sym->value) {
+	case AREG_AL: return 0;
+	case AREG_CL: return 1;
+	case AREG_DL: return 2;
+	case AREG_BL: return 3;
+	case AREG_AH: return 4;
+	case AREG_CH: return 5;
+	case AREG_DH: return 6;
+	case AREG_BH: return 7;
+	default:      abort();
+	}
+}
+
+void
+reg8_reg8(Op *op, Node **args)
+{
+	int src, dst;
+	char buf[2];
+
+	src = reg8toint(args[0]);
+	dst = reg8toint(args[1]);
+	buf[0] = op->bytes[0];
+	buf[1] = addrbyte(REG_MODE, src, dst);
+	emit(buf, 2);
 }
--- a/as/target/x86/rules.dat
+++ b/as/target/x86/rules.dat
@@ -1,5 +1,5 @@
-reg8	AREG8
-reg16	AREG16
+reg8	AREG_R8CLASS
+reg16	AREG_R16CLASS
 imm8	AIMM8
 imm16	AIMM16
 imm32	AIMM32
--- a/as/target/x86/x86.dat
+++ b/as/target/x86/x86.dat
@@ -24,4 +24,4 @@
 
 
 # 8 bit arithmetic operations
-#ADDB	reg8,reg8	2	0x00,0xc0	reg2reg	I286,I386,AMD64
+ADDB	reg8,reg8	2	0x00	reg8_reg8	I286,I386,AMD64