Index: arch/amd64/local.c =================================================================== RCS file: /cvsroot/pcc/arch/amd64/local.c,v retrieving revision 1.18 diff -u -r1.18 local.c --- arch/amd64/local.c 11 Aug 2010 14:51:13 -0000 1.18 +++ arch/amd64/local.c 23 Aug 2010 09:34:27 -0000 @@ -50,7 +50,7 @@ #define UCHK(i) case i: if (ucon > MAX_##i) return 1; break SCHK(INT); SCHK(SHORT); - case BOOL: + UCHK(BOOL); SCHK(CHAR); UCHK(UNSIGNED); UCHK(USHORT); @@ -400,7 +400,7 @@ /* Float conversions may need extra casts */ if (p->n_type == FLOAT || p->n_type == DOUBLE) { - if (l->n_type < INT) { + if (l->n_type < INT || l->n_type == BOOL) { p->n_left = block(SCONV, l, NIL, ISUNSIGNED(l->n_type) ? UNSIGNED : INT, l->n_df, l->n_ap); @@ -415,7 +415,8 @@ if ((p->n_type & TMASK) == 0 && (l->n_type & TMASK) == 0 && btattr[p->n_type].atypsz == btattr[l->n_type].atypsz) { - if (p->n_type != FLOAT && p->n_type != DOUBLE && + if (p->n_type != BOOL && + p->n_type != FLOAT && p->n_type != DOUBLE && l->n_type != FLOAT && l->n_type != DOUBLE && l->n_type != LDOUBLE && p->n_type != LDOUBLE) { if (l->n_op == NAME || l->n_op == UMUL || @@ -500,7 +501,8 @@ nfree(p); p = l; } - if ((p->n_type == CHAR || p->n_type == UCHAR || + if ((p->n_type == BOOL || + p->n_type == CHAR || p->n_type == UCHAR || p->n_type == SHORT || p->n_type == USHORT) && (l->n_type == FLOAT || l->n_type == DOUBLE || l->n_type == LDOUBLE)) { @@ -535,8 +537,7 @@ p->n_op = ASSIGN; p->n_right = p->n_left; p->n_left = block(REG, NIL, NIL, p->n_type, 0, MKAP(INT)); - p->n_left->n_rval = p->n_left->n_type == BOOL ? - RETREG(CHAR) : RETREG(p->n_type); + p->n_left->n_rval = RETREG(p->n_type); break; case LS: Index: arch/amd64/local2.c =================================================================== RCS file: /cvsroot/pcc/arch/amd64/local2.c,v retrieving revision 1.18 diff -u -r1.18 local2.c --- arch/amd64/local2.c 30 May 2010 15:32:45 -0000 1.18 +++ arch/amd64/local2.c 23 Aug 2010 09:34:27 -0000 @@ -172,6 +172,7 @@ tlen(NODE *p) { switch(p->n_type) { + case BOOL: case CHAR: case UCHAR: return(1); @@ -440,6 +441,7 @@ pr = DECRA(p->n_reg, 0); lr = p->n_left->n_rval; switch (p->n_type) { + case BOOL: case CHAR: case UCHAR: if (rnames[pr][2] == 'l' && rnames[lr][2] == 'x' && @@ -717,6 +719,7 @@ case REG: switch (p->n_type) { + case BOOL: case CHAR: case UCHAR: rc = rbyte; @@ -845,6 +848,7 @@ case UNSIGNED: printf(" movl %s,%s\n", rlong[s], rlong[d]); break; + case BOOL: case CHAR: case UCHAR: printf(" movb %s,%s\n", rbyte[s], rbyte[d]); @@ -1039,7 +1043,7 @@ p->n_label = CLASSC; } else { p->n_label = CLASSA; - if (t == CHAR || t == UCHAR) { + if (t == BOOL || t == CHAR || t == UCHAR) { p->n_label = CLASSB; reg = reg * 2 + 8; } Index: arch/amd64/macdefs.h =================================================================== RCS file: /cvsroot/pcc/arch/amd64/macdefs.h,v retrieving revision 1.10 diff -u -r1.10 macdefs.h --- arch/amd64/macdefs.h 18 Apr 2010 19:34:14 -0000 1.10 +++ arch/amd64/macdefs.h 23 Aug 2010 09:34:27 -0000 @@ -73,6 +73,7 @@ /* * Min/max values. */ +#define MAX_BOOL 1 #define MIN_CHAR -128 #define MAX_CHAR 127 #define MAX_UCHAR 255 @@ -91,7 +92,6 @@ /* Default char is signed */ #undef CHAR_UNSIGNED -#define BOOL_TYPE CHAR /* what used to store _Bool */ /* * Use large-enough types. Index: arch/amd64/table.c =================================================================== RCS file: /cvsroot/pcc/arch/amd64/table.c,v retrieving revision 1.17 diff -u -r1.17 table.c --- arch/amd64/table.c 4 Jun 2010 06:48:53 -0000 1.17 +++ arch/amd64/table.c 23 Aug 2010 09:34:27 -0000 @@ -85,6 +85,13 @@ 0, RLEFT, "", }, +/* convert _Bool to _Bool */ +{ SCONV, INAREG, + SAREG, TBOOL, + SAREG, TBOOL, + 0, RLEFT, + "", }, + /* * Casts from memory to same or smaller register is equally simple. */ @@ -119,6 +126,14 @@ /* char to something */ +/* convert (u)char to _Bool. */ +{ SCONV, INAREG, + SAREG, TCHAR|TUCHAR, + SAREG, TBOOL, + NASL|NAREG, RESC1, + " cmpb $0,AL\n" + " setne A1\n", }, + /* convert char to (unsigned) short. */ { SCONV, ININT, SAREG|SOREG|SNAME, TCHAR, @@ -126,9 +141,9 @@ NASL|NAREG, RESC1, " movsbw AL,A1\n", }, -/* convert unsigned char to (u)short. */ +/* convert _Bool/unsigned char to (u)short. */ { SCONV, ININT, - SAREG|SOREG|SNAME, TUCHAR, + SAREG|SOREG|SNAME, TBOOL|TUCHAR, SAREG, TSHORT|TUSHORT, NASL|NAREG, RESC1, " movzbw AL,A1\n", }, @@ -140,9 +155,9 @@ NASL|NAREG, RESC1, " movsbl AL,A1\n", }, -/* convert unsigned char to (u)int. */ +/* convert _Bool/unsigned char to (u)int. */ { SCONV, ININT, - SAREG|SOREG|SNAME, TUCHAR, + SAREG|SOREG|SNAME, TBOOL|TUCHAR, SAREG, TWORD, NASL|NAREG, RESC1, " movzbl AL,A1\n", }, @@ -154,15 +169,23 @@ NAREG|NASL, RESC1, " movsbq AL,A1\n", }, -/* convert unsigned char to (u)long long */ +/* convert _Bool/unsigned char to (u)long long */ { SCONV, INAREG, - SAREG|SOREG|SNAME, TUCHAR, + SAREG|SOREG|SNAME, TBOOL|TUCHAR, SANY, TLL, NAREG|NASL, RESC1, " movzbq AL,A1\n", }, /* short to something */ +/* convert (u)short to _Bool. */ +{ SCONV, ININT, + SAREG, TSHORT|TUSHORT, + SAREG, TBOOL, + NASL|NAREG, RESC1, + " cmpw $0,AL\n" + " setne A1\n", }, + /* convert short to (u)int. */ { SCONV, ININT, SAREG|SOREG|SNAME, TSHORT, @@ -193,6 +216,14 @@ /* int to something */ +/* convert (u)int to _Bool */ +{ SCONV, INAREG, + SAREG, TWORD, + SAREG, TBOOL, + NASL|NAREG, RESC1, + " cmpl $0,AL\n" + " setne A1\n", }, + /* convert signed int to (u)long long */ { SCONV, INAREG, SAREG, TSWORD, @@ -207,6 +238,16 @@ NASL|NAREG, RESC1, " movl AL,Z1\n", },/* amd64 zero-extends 32-bit movl */ +/* long long to something */ + +/* convert long long to _Bool. */ +{ SCONV, INAREG, + SAREG, TLL, + SAREG, TBOOL, + NASL|NAREG, RESC1, + " cmpq $0,AL\n" + " setne A1\n", }, + /* * Floating point casts. amd64 uses xmm for float/double and x87 * for long double calculations. @@ -560,6 +601,18 @@ 0, RLEFT|RESCC, " Ob AR,AL\n", }, +{ OPSIMP, INAREG|FOREFF, + SAREG, TBOOL, + SAREG|SNAME|SOREG, TBOOL, + 0, RLEFT, + " Ob AR,AL\n", }, + +{ OPSIMP, INAREG|FOREFF, + SAREG|SNAME|SOREG, TBOOL, + SCON, TANY, + 0, RLEFT, + " Ob AR,AL\n", }, + /* * The next rules handle all shift operators. */ @@ -765,13 +818,13 @@ " movw AR,AL\n", }, { ASSIGN, FOREFF, - SAREG|SNAME|SOREG, TCHAR|TUCHAR, + SAREG|SNAME|SOREG, TBOOL|TCHAR|TUCHAR, SCON, TANY, 0, 0, " movb AR,AL\n", }, { ASSIGN, FOREFF|INAREG, - SAREG, TCHAR|TUCHAR, + SAREG, TBOOL|TCHAR|TUCHAR, SCON, TANY, 0, RDEST, " movb AR,AL\n", }, @@ -807,14 +860,14 @@ " movw AR,AL\n", }, { ASSIGN, FOREFF|INAREG, - SAREG|SNAME|SOREG, TCHAR|TUCHAR, - SAREG, TCHAR|TUCHAR|TWORD, + SAREG|SNAME|SOREG, TBOOL|TCHAR|TUCHAR, + SAREG, TBOOL|TCHAR|TUCHAR|TWORD, 0, RDEST, " movb AR,AL\n", }, { ASSIGN, FOREFF|INAREG, - SFLD, TCHAR|TUCHAR, - SAREG|SCON, TCHAR|TUCHAR, + SFLD, TBOOL|TCHAR|TUCHAR, + SAREG|SCON, TBOOL|TCHAR|TUCHAR, NAREG*2, RDEST, " movb AR,A2\n" " movzbl A2,A1\n" @@ -1076,7 +1129,7 @@ " cmpw AR,AL\n", }, { OPLOG, FORCC, - SAREG|SOREG|SNAME, TCHAR|TUCHAR, + SAREG|SOREG|SNAME, TBOOL|TCHAR|TUCHAR, SCON|SAREG, TANY, 0, RESCC, " cmpb AR,AL\n", }, @@ -1137,14 +1190,14 @@ " andw AR,AL\n", }, { AND, INAREG|FOREFF, - SAREG|SOREG|SNAME, TCHAR|TUCHAR, - SCON|SAREG, TCHAR|TUCHAR, + SAREG|SOREG|SNAME, TBOOL|TCHAR|TUCHAR, + SCON|SAREG, TBOOL|TCHAR|TUCHAR, 0, RLEFT, " andb AR,AL\n", }, { AND, INAREG|FOREFF, - SAREG, TCHAR|TUCHAR, - SAREG|SOREG|SNAME, TCHAR|TUCHAR, + SAREG, TBOOL|TCHAR|TUCHAR, + SAREG|SOREG|SNAME, TBOOL|TCHAR|TUCHAR, 0, RLEFT, " andb AR,AL\n", }, /* AND/OR/ER/NOT */ @@ -1195,7 +1248,7 @@ { OPLTYPE, INAREG, SANY, TANY, - SAREG|SOREG|SNAME|SCON, TCHAR|TUCHAR, + SAREG|SOREG|SNAME|SCON, TBOOL|TCHAR|TUCHAR, NAREG, RESC1, " movb AL,A1\n", }, @@ -1220,7 +1273,6 @@ /* * Negate a word. */ - { UMINUS, INAREG|FOREFF, SAREG, TLL|TPOINT, SAREG, TLL|TPOINT, @@ -1245,6 +1297,12 @@ 0, RLEFT, " negb AL\n", }, +{ UMINUS, INAREG|FOREFF, + SAREG, TBOOL, + SAREG, TBOOL, + 0, RLEFT, + "", }, + { UMINUS, INBREG, SBREG|SNAME|SOREG, TDOUBLE|TFLOAT, SBREG, TDOUBLE|TFLOAT, @@ -1270,7 +1328,7 @@ " notw AL\n", }, { COMPL, INAREG, - SAREG, TCHAR|TUCHAR, + SAREG, TBOOL|TCHAR|TUCHAR, SANY, TANY, 0, RLEFT, " notb AL\n", }, Index: arch/i386/local.c =================================================================== RCS file: /cvsroot/pcc/arch/i386/local.c,v retrieving revision 1.123 diff -u -r1.123 local.c --- arch/i386/local.c 11 Aug 2010 14:36:27 -0000 1.123 +++ arch/i386/local.c 23 Aug 2010 09:34:27 -0000 @@ -47,7 +47,7 @@ #define UCHK(i) case i: if (ucon > MAX_##i) return 1; break SCHK(INT); SCHK(SHORT); - case BOOL: + UCHK(BOOL); SCHK(CHAR); UCHK(UNSIGNED); UCHK(USHORT); @@ -561,7 +561,8 @@ if ((p->n_type & TMASK) == 0 && (l->n_type & TMASK) == 0 && btattr[p->n_type].atypsz == btattr[l->n_type].atypsz) { - if (p->n_type != FLOAT && p->n_type != DOUBLE && + if (p->ntype != BOOL && + p->n_type != FLOAT && p->n_type != DOUBLE && l->n_type != FLOAT && l->n_type != DOUBLE && l->n_type != LDOUBLE && p->n_type != LDOUBLE) { if (l->n_op == NAME || l->n_op == UMUL || @@ -646,7 +647,8 @@ nfree(p); p = l; } - if ((p->n_type == CHAR || p->n_type == UCHAR || + if ((p->n_type == BOOL || + p->n_type == CHAR || p->n_type == UCHAR || p->n_type == SHORT || p->n_type == USHORT) && (l->n_type == FLOAT || l->n_type == DOUBLE || l->n_type == LDOUBLE)) { @@ -681,8 +683,7 @@ p->n_op = ASSIGN; p->n_right = p->n_left; p->n_left = block(REG, NIL, NIL, p->n_type, 0, MKAP(INT)); - p->n_left->n_rval = p->n_left->n_type == BOOL ? - RETREG(CHAR) : RETREG(p->n_type); + p->n_left->n_rval = RETREG(p->n_type); break; case LS: Index: arch/i386/local2.c =================================================================== RCS file: /cvsroot/pcc/arch/i386/local2.c,v retrieving revision 1.145 diff -u -r1.145 local2.c --- arch/i386/local2.c 7 Aug 2010 09:00:22 -0000 1.145 +++ arch/i386/local2.c 23 Aug 2010 09:34:28 -0000 @@ -186,6 +186,7 @@ tlen(p) NODE *p; { switch(p->n_type) { + case BOOL: case CHAR: case UCHAR: return(1); @@ -435,7 +436,7 @@ { TWORD t = p->n_type; - if (t < LONGLONG || t == FLOAT || t > BTMASK) + if (t < LONGLONG || t == FLOAT || t == BOOL || t > BTMASK) return 4; if (t == LONGLONG || t == ULONGLONG || t == DOUBLE) return 8; @@ -655,6 +656,7 @@ pr = DECRA(p->n_reg, 0); lr = p->n_left->n_rval; switch (p->n_type) { + case BOOL: case CHAR: case UCHAR: if (rnames[pr][2] == 'l' && rnames[lr][2] == 'x' && @@ -1180,6 +1182,7 @@ rnames[d][3],rnames[d][4],rnames[d][5]); #endif break; + case BOOL: case CHAR: case UCHAR: printf(" movb %s,%s\n", rnames[s], rnames[d]); @@ -1243,7 +1246,7 @@ int gclass(TWORD t) { - if (t == CHAR || t == UCHAR) + if (t == BOOL || t == CHAR || t == UCHAR) return CLASSB; if (t == LONGLONG || t == ULONGLONG) return CLASSC; Index: arch/i386/macdefs.h =================================================================== RCS file: /cvsroot/pcc/arch/i386/macdefs.h,v retrieving revision 1.73 diff -u -r1.73 macdefs.h --- arch/i386/macdefs.h 14 May 2010 11:49:19 -0000 1.73 +++ arch/i386/macdefs.h 23 Aug 2010 09:34:28 -0000 @@ -80,6 +80,7 @@ /* * Min/max values. */ +#define MAX_BOOL 1 #define MIN_CHAR -128 #define MAX_CHAR 127 #define MAX_UCHAR 255 @@ -98,7 +99,6 @@ /* Default char is signed */ #undef CHAR_UNSIGNED -#define BOOL_TYPE CHAR /* what used to store _Bool */ /* * Use large-enough types. @@ -291,7 +291,7 @@ #define ENCRA2(x) ((x) << 12) /* A2 */ #define ENCRA(x,y) ((x) << (6+y*6)) /* encode regs in int */ /* XXX - return char in al? */ -#define RETREG(x) (x == CHAR || x == UCHAR ? AL : \ +#define RETREG(x) (x == BOOL || x == CHAR || x == UCHAR ? AL : \ x == LONGLONG || x == ULONGLONG ? EAXEDX : \ x == FLOAT || x == DOUBLE || x == LDOUBLE ? 31 : EAX) Index: arch/i386/table.c =================================================================== RCS file: /cvsroot/pcc/arch/i386/table.c,v retrieving revision 1.123 diff -u -r1.123 table.c --- arch/i386/table.c 7 Aug 2010 09:00:22 -0000 1.123 +++ arch/i386/table.c 23 Aug 2010 09:34:28 -0000 @@ -64,6 +64,13 @@ /* itself to itself, including pointers */ +/* convert _Bool to _Bool. */ +{ SCONV, INCH, + SHCH, TBOOL, + SHCH, TBOOL, + 0, RLEFT, + "", }, + /* convert (u)char to (u)char. */ { SCONV, INCH, SHCH, TCHAR|TUCHAR, @@ -99,6 +106,14 @@ 0, RLEFT, "", }, +/* convert (u)char to _Bool. */ +{ SCONV, INCH, + SHCH, TCHAR|TUCHAR, + SHCH, TBOOL, + NBSL|NBREG, RESC1, + " cmpb $0,AL\n" + " setne A1\n", }, + /* char to something */ /* convert char to (unsigned) short. */ @@ -108,9 +123,9 @@ NASL|NAREG, RESC1, " movsbw AL,A1\n", }, -/* convert unsigned char to (u)short. */ +/* convert _Bool/unsigned char to (u)short. */ { SCONV, ININT, - SHCH|SOREG|SNAME, TUCHAR, + SHCH|SOREG|SNAME, TBOOL|TUCHAR, SAREG, TSHORT|TUSHORT, NASL|NAREG, RESC1, " movzbw AL,A1\n", }, @@ -122,9 +137,9 @@ NASL|NAREG, RESC1, " movsbl AL,A1\n", }, -/* convert unsigned char to (u)int. */ +/* convert _Bool/unsigned char to (u)int. */ { SCONV, ININT, - SHCH|SOREG|SNAME, TUCHAR, + SHCH|SOREG|SNAME, TBOOL|TUCHAR, SAREG, TWORD, NASL|NAREG, RESC1, " movzbl AL,A1\n", }, @@ -136,9 +151,9 @@ NSPECIAL|NCREG|NCSL, RESC1, " movsbl AL,%eax\n cltd\n", }, -/* convert unsigned char to (u)long long */ +/* convert _Bool/unsigned char to (u)long long */ { SCONV, INLL, - SHCH|SOREG|SNAME, TUCHAR, + SHCH|SOREG|SNAME, TBOOL|TUCHAR, SANY, TLL, NCREG|NCSL, RESC1, " movzbl AL,A1\n xorl U1,U1\n", }, @@ -151,9 +166,9 @@ " movsbl AL,A1\n pushl A1\n" " fildl (%esp)\n addl $4,%esp\n", }, -/* convert (u)char (in register) to double XXX - use NTEMP */ +/* convert _Bool/unsigned char (in register) to double XXX - use NTEMP */ { SCONV, INFL, - SHCH|SOREG|SNAME, TUCHAR, + SHCH|SOREG|SNAME, TBOOL|TUCHAR, SHFL, TLDOUBLE|TDOUBLE|TFLOAT, NAREG|NASL|NDREG, RESC2, " movzbl AL,A1\n pushl A1\n" @@ -161,6 +176,14 @@ /* short to something */ +/* convert (u)short to _Bool. */ +{ SCONV, INCH, + SHINT, TSHORT|TUSHORT, + SHCH, TBOOL, + NBSL|NBREG, RESC1, + " cmpw $0,AL\n" + " setne A1\n", }, + /* convert short (in memory) to char */ { SCONV, INCH, SNAME|SOREG, TSHORT|TUSHORT, @@ -227,6 +250,14 @@ /* int to something */ +/* convert (u)int to _Bool. */ +{ SCONV, INCH, + SHINT, TWORD, + SHCH, TBOOL, + NBSL|NBREG, RESC1, + " cmpl $0,AL\n" + " setne A1\n", }, + /* convert int to char. This is done when register is loaded */ { SCONV, INCH, SAREG, TWORD|TPOINT, @@ -271,6 +302,14 @@ /* long long to something */ +/* convert (u)long long to _Bool. */ +{ SCONV, INCH, + SHLL, TLL, + SHCH, TBOOL, + NBSL|NBREG, RESC1, + " orl UL,AL\n" + " setne A1\n", }, + /* convert (u)long long to (u)char (mem->reg) */ { SCONV, INCH, SOREG|SNAME, TLL, @@ -338,6 +377,13 @@ /* float to something */ #if 0 /* go via int by adding an extra sconv in clocal() */ +/* convert float/double to _Bool */ +{ SCONV, INCH, + SHFL, TLDOUBLE|TDOUBLE|TFLOAT, + SHCH, TBOOL, + NBREG, RESC1, + "XXX: FIXME\n", }, + /* convert float/double to (u) char. XXX should use NTEMP here */ { SCONV, INCH, SHFL, TLDOUBLE|TDOUBLE|TFLOAT, @@ -741,6 +787,18 @@ 0, RLEFT, " Ol AR,AL\n Ol UR,UL\n", }, +{ OPSIMP, INCH|FOREFF, + SHCH, TBOOL, + SHCH|SNAME|SOREG, TBOOL, + 0, RLEFT, + " Ob AR,AL\n", }, + +{ OPSIMP, INCH|FOREFF, + SHCH|SNAME|SOREG, TBOOL, + SCON, TANY, + 0, RLEFT, + " Ob AR,AL\n", }, + /* Try use-reg instructions first */ { PLUS, INAREG, SAREG, TWORD|TPOINT, @@ -754,7 +812,6 @@ NAREG|NASL, RESC1, " leal -CR(AL),A1\n", }, - /* * The next rules handle all shift operators. */ @@ -954,13 +1011,13 @@ " movw AR,AL\n", }, { ASSIGN, FOREFF, - SHCH|SNAME|SOREG, TCHAR|TUCHAR, + SHCH|SNAME|SOREG, TBOOL|TCHAR|TUCHAR, SCON, TANY, 0, 0, " movb AR,AL\n", }, { ASSIGN, FOREFF|INCH, - SHCH, TCHAR|TUCHAR, + SHCH, TBOOL|TCHAR|TUCHAR, SCON, TANY, 0, RDEST, " movb AR,AL\n", }, @@ -996,14 +1053,14 @@ " movw AR,AL\n", }, { ASSIGN, FOREFF|INCH, - SHCH|SNAME|SOREG, TCHAR|TUCHAR, - SHCH, TCHAR|TUCHAR|TWORD, + SHCH|SNAME|SOREG, TBOOL|TCHAR|TUCHAR, + SHCH, TBOOL|TCHAR|TUCHAR|TWORD, 0, RDEST, " movb AR,AL\n", }, { ASSIGN, FOREFF|INBREG, - SFLD, TCHAR|TUCHAR, - SBREG|SCON, TCHAR|TUCHAR, + SFLD, TBOOL|TCHAR|TUCHAR, + SBREG|SCON, TBOOL|TCHAR|TUCHAR, NAREG|NBREG, RDEST, " movb AR,A2\n" " movzbl A2,A1\n" @@ -1306,7 +1363,7 @@ " cmpw AR,AL\n", }, { OPLOG, FORCC, - SBREG|SOREG|SNAME, TCHAR|TUCHAR, + SBREG|SOREG|SNAME, TBOOL|TCHAR|TUCHAR, SCON|SBREG, TANY, 0, RESCC, " cmpb AR,AL\n", }, @@ -1370,14 +1427,14 @@ " andw AR,AL\n", }, { AND, INBREG|FOREFF, - SBREG|SOREG|SNAME, TCHAR|TUCHAR, - SCON|SBREG, TCHAR|TUCHAR, + SBREG|SOREG|SNAME, TBOOL|TCHAR|TUCHAR, + SCON|SBREG, TBOOL|TCHAR|TUCHAR, 0, RLEFT, " andb AR,AL\n", }, { AND, INBREG|FOREFF, - SBREG, TCHAR|TUCHAR, - SBREG|SOREG|SNAME, TCHAR|TUCHAR, + SBREG, TBOOL|TCHAR|TUCHAR, + SBREG|SOREG|SNAME, TBOOL|TCHAR|TUCHAR, 0, RLEFT, " andb AR,AL\n", }, /* AND/OR/ER/NOT */ @@ -1446,7 +1503,7 @@ { OPLTYPE, INBREG, SANY, TANY, - SBREG|SOREG|SNAME|SCON, TCHAR|TUCHAR, + SBREG|SOREG|SNAME|SCON, TBOOL|TCHAR|TUCHAR, NBREG, RESC1, " movb AL,A1\n", }, @@ -1521,6 +1578,12 @@ 0, RLEFT, " fchs\n", }, +{ UMINUS, INBREG|FOREFF, + SBREG, TBOOL, + SBREG, TBOOL, + 0, RLEFT, + "", }, + { COMPL, INCREG, SCREG, TLL, SANY, TANY, @@ -1540,7 +1603,7 @@ " notw AL\n", }, { COMPL, INBREG, - SBREG, TCHAR|TUCHAR, + SBREG, TBOOL|TCHAR|TUCHAR, SANY, TANY, 0, RLEFT, " notb AL\n", }, @@ -1561,8 +1624,8 @@ " pushl AL\n", }, { FUNARG, FOREFF, - SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, - SANY, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR, + SCON, TWORD|TSHORT|TUSHORT|TBOOL|TCHAR|TUCHAR, + SANY, TWORD|TSHORT|TUSHORT|TBOOL|TCHAR|TUCHAR, 0, RNULL, " pushl AL\n", }, @@ -1585,8 +1648,8 @@ " movsbl AL,A1\n pushl A1\n", }, { FUNARG, FOREFF, - SHCH|SNAME|SOREG, TUCHAR, - SANY, TUCHAR, + SHCH|SNAME|SOREG, TBOOL|TUCHAR, + SANY, TBOOL|TUCHAR, NAREG, 0, " movzbl AL,A1\n pushl A1\n", }, Index: cc/ccom/main.c =================================================================== RCS file: /cvsroot/pcc/cc/ccom/main.c,v retrieving revision 1.105 diff -u -r1.105 main.c --- cc/ccom/main.c 11 Aug 2010 14:08:44 -0000 1.105 +++ cc/ccom/main.c 23 Aug 2010 09:34:28 -0000 @@ -83,8 +83,8 @@ { 0 }, /* unused */ { 0 }, /* unused */ { 0, ATTR_BASETYP }, /* VOID */ - { 0 }, /* SIGNED */ BTA(BOOL) + { 0 }, /* SIGNED */ BTA(FLOAT) /* FIMAG */ BTA(DOUBLE) /* IMAG */ BTA(LDOUBLE) /* LIMAG */ Index: cc/ccom/pass1.h =================================================================== RCS file: /cvsroot/pcc/cc/ccom/pass1.h,v retrieving revision 1.206 diff -u -r1.206 pass1.h --- cc/ccom/pass1.h 12 Aug 2010 06:39:22 -0000 1.206 +++ cc/ccom/pass1.h 23 Aug 2010 09:34:29 -0000 @@ -582,14 +582,13 @@ * The following types are only used in pass1. */ #define SIGNED (MAXTYPES+1) -#define BOOL (MAXTYPES+2) -#define FIMAG (MAXTYPES+3) -#define IMAG (MAXTYPES+4) -#define LIMAG (MAXTYPES+5) -#define FCOMPLEX (MAXTYPES+6) -#define COMPLEX (MAXTYPES+7) -#define LCOMPLEX (MAXTYPES+8) -#define ENUMTY (MAXTYPES+9) +#define FIMAG (MAXTYPES+2) +#define IMAG (MAXTYPES+3) +#define LIMAG (MAXTYPES+4) +#define FCOMPLEX (MAXTYPES+5) +#define COMPLEX (MAXTYPES+6) +#define LCOMPLEX (MAXTYPES+7) +#define ENUMTY (MAXTYPES+8) #define ISFTY(x) ((x) >= FLOAT && (x) <= LDOUBLE) #define ISCTY(x) ((x) >= FCOMPLEX && (x) <= LCOMPLEX) Index: cc/ccom/pftn.c =================================================================== RCS file: /cvsroot/pcc/cc/ccom/pftn.c,v retrieving revision 1.289 diff -u -r1.289 pftn.c --- cc/ccom/pftn.c 12 Aug 2010 06:39:22 -0000 1.289 +++ cc/ccom/pftn.c 23 Aug 2010 09:34:29 -0000 @@ -1753,7 +1753,7 @@ #endif if ((q = tc.saved) == NULL) { TWORD t; - if ((t = BTYPE(tc.type)) > LDOUBLE && t != VOID) + if ((t = BTYPE(tc.type)) > LDOUBLE && t != VOID && t != BOOL) cerror("typenode2 t %x", tc.type); if (t == UNDEF) { t = INT; @@ -2738,9 +2738,6 @@ } t = DECREF(cftnsp->stype); - if (t == BOOL) - t = BOOL_TYPE; - if (t != VOID && !ISSOU(t)) { p = tempnode(0, t, cftnsp->sdf, cftnsp->sap); tmpnr = regno(p); Index: cc/ccom/scan.l =================================================================== RCS file: /cvsroot/pcc/cc/ccom/scan.l,v retrieving revision 1.94 diff -u -r1.94 scan.l --- cc/ccom/scan.l 11 Aug 2010 14:08:44 -0000 1.94 +++ cc/ccom/scan.l 23 Aug 2010 09:34:29 -0000 @@ -91,7 +91,7 @@ } "asm" { return(C_ASM); } "auto" { return resw(AUTO, C_CLASS); } -"_Bool" { return resw(BOOL_TYPE, C_TYPE); } +"_Bool" { return resw(BOOL, C_TYPE); } "break" { return(C_BREAK); } "case" { return(C_CASE); } "char" { return resw(CHAR, C_TYPE); } Index: cc/ccom/trees.c =================================================================== RCS file: /cvsroot/pcc/cc/ccom/trees.c,v retrieving revision 1.253 diff -u -r1.253 trees.c --- cc/ccom/trees.c 12 Aug 2010 06:39:22 -0000 1.253 +++ cc/ccom/trees.c 23 Aug 2010 09:34:30 -0000 @@ -306,6 +306,15 @@ return r; } } + if (l != NULL && l->n_type == BOOL && o >= PLUSEQ && o <= RSEQ) { + NODE *lx, *rx; + + lx = talloc(); + *lx = *l; + rx = buildtree(UNASG o, l, r); + return buildtree(ASSIGN, lx, rx); + + } runtime: /* its real; we must make a new node */ @@ -448,7 +457,8 @@ case RS: /* must make type size at least int... */ if (p->n_type == CHAR || p->n_type == SHORT) { p->n_left = makety(l, INT, 0, 0, MKAP(INT)); - } else if (p->n_type == UCHAR || p->n_type == USHORT) { + } else if (p->n_type == BOOL || + p->n_type == UCHAR || p->n_type == USHORT) { p->n_left = makety(l, UNSIGNED, 0, 0, MKAP(UNSIGNED)); } @@ -2472,27 +2482,6 @@ /* Convert "PTR undef" (void *) to "PTR uchar" */ if (BTYPE(p->n_type) == VOID) p->n_type = (p->n_type & ~BTMASK) | UCHAR; - if (BTYPE(p->n_type) == BOOL) { - if (p->n_op == SCONV && p->n_type == BOOL) { - /* create a jump and a set */ - NODE *q, *r, *s; - int l, val; - - q = talloc(); - *q = *p; - q->n_type = BOOL_TYPE; - r = tempnode(0, BOOL_TYPE, NULL, MKAP(BOOL_TYPE)); - val = regno(r); - s = tempnode(val, BOOL_TYPE, NULL, MKAP(BOOL_TYPE)); - *p = *s; - q = buildtree(ASSIGN, r, q); - cbranch(buildtree(EQ, q, bcon(0)), bcon(l = getlab())); - ecode(buildtree(ASSIGN, s, bcon(1))); - plabel(l); - } else - p->n_type = (p->n_type & ~BTMASK) | BOOL_TYPE; - } - } void Index: mip/common.c =================================================================== RCS file: /cvsroot/pcc/mip/common.c,v retrieving revision 1.92 diff -u -r1.92 common.c --- mip/common.c 27 Mar 2010 23:46:12 -0000 1.92 +++ mip/common.c 23 Aug 2010 09:34:30 -0000 @@ -420,8 +420,8 @@ "enumty", "moety", "void", + "bool", "signed", /* pass1 */ - "bool", /* pass1 */ "fimag", /* pass1 */ "dimag", /* pass1 */ "limag", /* pass1 */ Index: mip/manifest.h =================================================================== RCS file: /cvsroot/pcc/mip/manifest.h,v retrieving revision 1.89 diff -u -r1.89 manifest.h --- mip/manifest.h 3 Jul 2010 15:51:07 -0000 1.89 +++ mip/manifest.h 23 Aug 2010 09:34:30 -0000 @@ -80,8 +80,9 @@ /* #define ENUMTY 17 */ /* #define MOETY 18 */ /* member of enum */ #define VOID 19 +#define BOOL 20 -#define MAXTYPES 19 /* highest type+1 to be used by lang code */ +#define MAXTYPES 20 /* highest type+1 to be used by lang code */ /* * Various flags */ Index: mip/match.c =================================================================== RCS file: /cvsroot/pcc/mip/match.c,v retrieving revision 1.93 diff -u -r1.93 match.c --- mip/match.c 4 Jun 2010 05:58:31 -0000 1.93 +++ mip/match.c 23 Aug 2010 09:34:31 -0000 @@ -220,6 +220,8 @@ return(0); switch (t) { + case BOOL: + return( tword & TBOOL ); case CHAR: return( tword & TCHAR ); case SHORT: Index: mip/pass2.h =================================================================== RCS file: /cvsroot/pcc/mip/pass2.h,v retrieving revision 1.126 diff -u -r1.126 pass2.h --- mip/pass2.h 3 Jul 2010 15:51:07 -0000 1.126 +++ mip/pass2.h 23 Aug 2010 09:34:31 -0000 @@ -134,6 +134,7 @@ #define TULONGLONG 0100000 /* unsigned long long */ #define TLDOUBLE 0200000 /* long double; exceeds 16 bit */ #define TFTN 0400000 /* function pointer; exceeds 16 bit */ +#define TBOOL 01000000/* C99: _Bool */ /* reclamation cookies */ #define RNULL 0 /* clobber result */