diff --git a/i386-asm.c b/i386-asm.c index dd8bb98..3d87e92 100644 --- a/i386-asm.c +++ b/i386-asm.c @@ -1478,7 +1478,8 @@ ST_FUNC void subst_asm_operand(CString *add_str, tcc_error("internal compiler error"); /* 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; else if ((sv->type.t & VT_BTYPE) == VT_SHORT) size = 2; diff --git a/tests/tcctest.c b/tests/tcctest.c index f8a9ca6..52dbfaf 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -2678,6 +2678,9 @@ void asm_test(void) int base_func = 42; void override_func3 (void); unsigned long asmret; +#ifdef BOOL_ISOC99 + _Bool somebool; +#endif printf("inline asm:\n"); @@ -2726,6 +2729,13 @@ void asm_test(void) asm volatile("" : "=r" (asmret) : "0"(s2)); if (asmret != s2.addr) 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; label1: goto label2;