Adding the register number to TOK_ASM_*ax would not be correct; the mm*
registers appear past TOK_ASM_rdi, the 8th register. This commit adds
special handling for the numbered registers and their byte, word and
dword counterparts.
---
 i386-asm.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/i386-asm.c b/i386-asm.c
index 85fb424c..89c02bed 100644
--- a/i386-asm.c
+++ b/i386-asm.c
@@ -1517,6 +1517,7 @@ ST_FUNC void subst_asm_operand(CString *add_str,
                               SValue *sv, int modifier)
 {
     int r, reg, size, val;
+    char suff;
 
     r = sv->r;
     if ((r & VT_VALMASK) == VT_CONST) {
@@ -1596,6 +1597,27 @@ ST_FUNC void subst_asm_operand(CString *add_str,
 #endif
         }
 
+#ifdef TCC_TARGET_X86_64
+        if (reg >= 8) {
+            if (size == 8) {
+                cstr_printf(add_str, "%%r%d", reg);
+                return;
+            }
+            switch (size) {
+                case 1:
+                    suff = 'b';
+                    break;
+                case 2:
+                    suff = 'w';
+                    break;
+                case 4:
+                    suff = 'd';
+                    break;
+            }
+            cstr_printf(add_str, "%%r%d%c", reg, suff);
+        }
+#endif
+
         switch(size) {
         case -1:
             reg = TOK_ASM_ah + reg;
-- 
2.51.2


_______________________________________________
Tinycc-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to