aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--i386-asm.c3
-rw-r--r--tests/tcctest.c10
2 files changed, 12 insertions, 1 deletions
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;