x86-asm: Correctly infer register size for bools

Register operands of type _Bool weren't correctly getting
the 8-bit sized registers (but rather used the default 32-bit
ones).
This commit is contained in:
Michael Matz 2016-08-08 20:46:16 +02:00
parent 9e0af6d2b5
commit 0381387640
2 changed files with 12 additions and 1 deletions

View File

@ -1478,7 +1478,8 @@ ST_FUNC void subst_asm_operand(CString *add_str,
tcc_error("internal compiler error"); tcc_error("internal compiler error");
/* choose register operand size */ /* choose register operand size */
if ((sv->type.t & VT_BTYPE) == VT_BYTE) if ((sv->type.t & VT_BTYPE) == VT_BYTE ||
(sv->type.t & VT_BTYPE) == VT_BOOL)
size = 1; size = 1;
else if ((sv->type.t & VT_BTYPE) == VT_SHORT) else if ((sv->type.t & VT_BTYPE) == VT_SHORT)
size = 2; size = 2;

View File

@ -2678,6 +2678,9 @@ void asm_test(void)
int base_func = 42; int base_func = 42;
void override_func3 (void); void override_func3 (void);
unsigned long asmret; unsigned long asmret;
#ifdef BOOL_ISOC99
_Bool somebool;
#endif
printf("inline asm:\n"); printf("inline asm:\n");
@ -2726,6 +2729,13 @@ void asm_test(void)
asm volatile("" : "=r" (asmret) : "0"(s2)); asm volatile("" : "=r" (asmret) : "0"(s2));
if (asmret != s2.addr) if (asmret != s2.addr)
printf("asmstr: failed\n"); printf("asmstr: failed\n");
#ifdef BOOL_ISOC99
/* Check that the typesize correctly sets the register size to
8 bit. */
asm volatile("cmp %1,%2; sete %0" : "=a"(somebool) : "r"(1), "r"(2));
if (!somebool)
printf("asmbool: failed\n");
#endif
return; return;
label1: label1:
goto label2; goto label2;