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.
v2 to fix formatting of r8b, r8w, r8d etc.
---
i386-asm.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/i386-asm.c b/i386-asm.c
index 85fb424c..dd01a262 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,28 @@ 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);
+ return;
+ }
+#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