jwf@vaxine.UUCP (Jim Franklin) (01/31/86)
---- There is a bug in the VAX 4.2BSD cc compiler related to expressions involving "register short *" operands and the bitwise-& operator. The problem does not occur if you remove the "register" declaration or if you compile without optimizing. Program good.c below will correctly print: 6 6 1 However, if you autoincrement t in the printf statement, i.e., *t++ & SYM_TYPE, the optimizer generates bogus code and you get the following output from program bad.c: 6 1664 6 The problem is that the optimizer generates an extzv with autoincrement for bad.c, and the implied length is 4 bytes (so t gets incremented by 4 bytes rather than 2). -------------------------- good.c -------------------------------------- #define SYM_READONLY 0x8000 #define SYM_TYPE 0x7ff short t_values[] = { 6 | SYM_READONLY, 6 | SYM_READONLY, 1 | SYM_READONLY }; main() { register short * t; int i; t = t_values; for ( i = 0; i < 3; i++ ) { printf ("%d\n", *t & SYM_TYPE); t++; } } -------------------------- bad.c -------------------------------------- #define SYM_READONLY 0x8000 #define SYM_TYPE 0x7ff short t_values[] = { 6 | SYM_READONLY, 6 | SYM_READONLY, 1 | SYM_READONLY }; main() { register short * t; int i; t = t_values; for ( i = 0; i < 3; i++ ) printf ("%d\n", *t++ & SYM_TYPE); } -------------------------- good.s ------------------------------------- .data .data .align 1 .globl _t_values _t_values:.long 0x80068006 .long 0x8001 .text LL0:.align 1 .globl _main .data 1 L21:.ascii "%d\12\0" .text .set L13,0x800 .data .text _main:.word L13 subl2 $4,sp moval _t_values,r11 clrl -4(fp) L2000001:extzv $0,$11,(r11),-(sp) pushal L21 calls $2,_printf addl2 $2,r11 aoblss $3,-4(fp),L2000001 ret -------------------------- bad.s -------------------------------------- .data .data .align 1 .globl _t_values _t_values:.long 0x80068006 .long 0x8001 .text LL0:.align 1 .globl _main .data 1 L21:.ascii "%d\12\0" .text .set L13,0x800 .data .text _main:.word L13 subl2 $4,sp moval _t_values,r11 clrl -4(fp) L2000001:extzv $0,$11,(r11)+,-(sp) <-- wrong !!! pushal L21 calls $2,_printf aoblss $3,-4(fp),L2000001 ret -----------------------------------------------------------------------
chris@umcp-cs.UUCP (Chris Torek) (02/02/86)
This has been fixed for ages. The problem is in /lib/c2, where it folds cvt[bw]l+bicl instruction pairs into extzv instructions: it should not do this if the left operand of the cvt instruction contains an auto increment or decrement. The easiest way to fix /lib/c2 is to disable the optimisation completely. A better fix is no doubt already in the Mt. Xinu bug list and is already in the 4.3 c2. -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 1415) UUCP: seismo!umcp-cs!chris CSNet: chris@umcp-cs ARPA: chris@mimsy.umd.edu