Annotation of 43BSDTahoe/lib/pcc/pcc.vax/LOG, revision 1.1

1.1     ! root        1: There was a bug which caused compiler errors when floating values were
        !             2: assigned to bit fields.  Some overenthusiastic optimization on my part
        !             3: led to a float-to-int conversion on the rhs of the assignment being
        !             4: dropped.  Bit fields are now treated as a special case.  [pcc.vax:
        !             5: local2.c]
        !             6: 
        !             7: At the instigation of Rob Pike, enums were neutered: they now behave
        !             8: exactly like ints.  The only traces of Johnson's treatment of enums are
        !             9: warnings about clashes between one enum type and another enum type in
        !            10: certain expressions.  This fix was trickier than it looked; it would
        !            11: have been much simpler to drop ALL warnings about enums, as Rob would
        !            12: recommend.  [mip: trees.c]
        !            13: 
        !            14: Arthur Olsen pointed out a bug with the evaluation of constant
        !            15: expressions -- the usual arithmetic conversions are not always
        !            16: performed.  Rather than follow Arthur's simple suggestion, I decided to
        !            17: be safe and arranged to use the same conversion code on constants that
        !            18: we use on variables.  We short-cut the test if the operand(s) are ints,
        !            19: which is the usual case, so the impact on compile time should be
        !            20: small.  [mip: trees.c]
        !            21: 
        !            22: Guy Harris noted that chkpun() considered multiply dimensioned arrays
        !            23: and multiply indirect pointers to be the same thing, which they are
        !            24: most certainly not.  His fix causes an 'illegal pointer combination'
        !            25: warning to be emitted for code like:
        !            26: 
        !            27:        char **cpp, c2a[10][20]; cpp = c2a; cpp[5][3] = 'a';
        !            28: 
        !            29: The new code is actually simpler than the old...  [mip: trees.c]
        !            30: 
        !            31: Another irritation of Rob Pike's is fixed -- the old-style assignment
        !            32: ops have been ifdef'ed out.  No more of those obnoxious 'ambiguous
        !            33: assignment: assignment op taken' messages!  [mip: scan.c]
        !            34: 
        !            35: Yet another Rob Pike complaint: you couldn't refer directly to the
        !            36: members of a structure which had been returned by a function.  You may
        !            37: now utter things like 'f().a' and get away with them.  The illegal form
        !            38: '(&f())->a' used to work; since this has the same tree representation
        !            39: as the legal form, an ugly wart was added to the action for '&' which
        !            40: specifically rules this form out.  To be consistent, a similar
        !            41: exception was made for expressions of the form '(a = b).c'.  [mip:
        !            42: cgram.y]
        !            43: 
        !            44: Moved configuration flags from Makefile into macdefs.h and converted
        !            45: some more trivial routines into macros.  This cleans up the Makefile
        !            46: considerably and consolidates assembler-dependent flags.  [pcc.vax:
        !            47: macdefs.h, code.c, order.c, Makefile; mip: onepass.h]
        !            48: 
        !            49: More efficiency hacks: the compiler now does its best to avoid emitting
        !            50: ANY code after an error is detected.  Previously only code generation
        !            51: through the code table was suppressed after an error.  This change can
        !            52: buy up to 25% in speed improvements if the dbx stab flag is enabled.
        !            53: The latest 'ccom' runs twice as fast as the 4.2 BSD compiler in this
        !            54: situation...  [pcc.vax:  macdefs.h, local.c, code.c; mip: cgram.y,
        !            55: scan.c, pftn.c]
        !            56: 
        !            57: For ANSI compatibility, we now accept void expressions in the colon
        !            58: part of a conditional expression.  Both subexpressions under the colon
        !            59: operator must be void if one is void.  The overall type of the
        !            60: conditional expression is void in this case.  [mip: trees.c]
        !            61: 
        !            62: As long as we're doing away with old-fashioned assignment operators, we
        !            63: might as well terminate old-fashioned initializations too.  [mip: cgram.y]
        !            64: 
        !            65: A fix from James Schoner for bitfield assignments was installed.  The
        !            66: problem was that the rhs of a bitfield assignment was used as its
        !            67: value, an overlooked aspect of the several earlier bug fixes for
        !            68: problems of this variety.  The bug caused
        !            69: 
        !            70:        struct { unsigned a:4, b:3, c:2; } x;
        !            71:        int i;
        !            72:        i = x.b = 255;
        !            73: 
        !            74: to store 255 in i instead of 7.  [pcc.vax: table.c, local2.c]
        !            75: 
        !            76: Scanner code was added to handle the System V/ANSI preprocessor
        !            77: extensions #ident and #pragma.  Currently #ident is ignored.  #pragma
        !            78: may be used as a substitute for lint-style comment directives; e.g. use
        !            79: '#pragma LINTLIBRARY' for '/* LINTLIBRARY */'.  The #pragma stuff
        !            80: requires the hacked-up cpp with ANSI extensions which may eventually be
        !            81: put into circulation here at Utah.  The #line control from cpp is now
        !            82: recognized with the same syntax by ccom.  Unknown control lines elicit
        !            83: a warning.  A small bug is fixed by this new code -- previously #ident
        !            84: and other unknown controls caused the line control mechanism to get
        !            85: screwed up, so that bogus dbx stabs were put in the output.  [mip:
        !            86: scan.c]
        !            87: 
        !            88: There seems to be a loophole in initializations -- apparently it is
        !            89: legal to initialize a bitfield with a symbolic constant (i.e. the
        !            90: address of something).  No loader that I know of will handle this!  The
        !            91: compiler now emits an error when someone tries this trick; it really
        !            92: can't do any better.  [mip: pftn.c]
        !            93: 
        !            94: Someone complained that all illegal characters were being printed as
        !            95: octal numbers in the error message.  This was changed so that printable
        !            96: characters are printed normally, and all funny characters are printed
        !            97: in C 'char' style.  [mip: scan.c]
        !            98: 
        !            99: Conversion of unsigned constants to floating point values was broken
        !           100: because the requisite cast in makety() had been commented out!  Argh.
        !           101: Unsigned comparisons of constants were similarly botched.  [mip: trees.c]
        !           102: 
        !           103: Ray Butterworth made a sensible suggestion that array definitions which
        !           104: aren't external and allocate no storage should elicit errors.  I
        !           105: modified his suggestion slightly by moving the test into nidcl(), where
        !           106: we can be sure that an array isn't being initialized.  I also adopted
        !           107: his suggestion for a lint warning for arrays with explicit dimensions
        !           108: that are lost by the rule that converts array types into pointer types
        !           109: in formal arguments; the warning is contingent on lint's -h flag.
        !           110: [mip: pftn.c]
        !           111: 
        !           112: The structures for fpn and dpn nodes (floating point constants) were
        !           113: changed to make them conform in shape to the other nodes.  [mip: ndu.h]
        !           114: 
        !           115: Overenthusiastic SCONV optimization code in optim2() led to functions
        !           116: not cooperating with certain casts; e.g.
        !           117: 
        !           118:        unsigned char x(); ... y((char)x()) ...
        !           119: 
        !           120: failed to sign-extend the result of x().  [pcc.vax: local2.c]
        !           121: 
        !           122: A bug in outstruct() caused it to check 'stab[-1].name == NULL' for
        !           123: unnamed structures.  For some reason this didn't break until my recent
        !           124: lint fixes tweaked the compiler in some subtle way...  [pcc.vax: stab.c]
        !           125: 
        !           126: The makefile was changed to pass C options to lint properly and to drop
        !           127: the '-a' flag to lint in the 'lintall' entry.  '-a' really ought to
        !           128: work but unfortunately the arrangement of 'int'-like types in the
        !           129: compiler is extremely confusing and inconsistent, so I eventually gave
        !           130: up trying to force the issue.  Sam Leffler's 'rel.c' for release
        !           131: information was also added.  [pcc.vax: Makefile, rel.c]
        !           132: 
        !           133: I fixed defid() so that it now insists that all argument type
        !           134: declarations must refer to names in the argument list.  Previously you
        !           135: could get away with:
        !           136: 
        !           137:        int a;
        !           138:        x()
        !           139:                int a;
        !           140:        { ... }
        !           141: 
        !           142: Use of 'a' in the body of x() would elicit the immortal error message
        !           143: 'warning: bad arg temp'.  [mip: pftn.c]
        !           144: 
        !           145: For some reason, mainp2() in the two-pass version of the compiler had a
        !           146: switch statement with two 'default' cases.  I zapped the obvious one.
        !           147: [mip: reader.c]
        !           148: 
        !           149: Botched initializations sometimes left the declarations code in a funny
        !           150: state, so a fixinit() routine was invented to aid error recovery.  For
        !           151: example, the following illegal program forced a core dump:
        !           152: 
        !           153:        char m[] = ;
        !           154:        x() {
        !           155:                y("splat");
        !           156:        }
        !           157: 
        !           158: The compiler tried to read "splat" into m[] and died horribly.  [mip:
        !           159: cgram.y, pftn.c]
        !           160: 
        !           161: The compiler now warns 'can't take size of function' when asked to do
        !           162: something amazing like '... void f(); ... if (f[10]) ...'.  Previously
        !           163: it produced a compiler error instead.  [mip: pftn.c]
        !           164: 
        !           165: If a program tried to access a value below the argument list on the
        !           166: stack using the clever tactic of manipulating the address of an
        !           167: argument, it drew a warning 'bad arg temp'.  For the sake of these
        !           168: clever programs, the warning has been suppressed.  [pcc.vax: local2.c]
        !           169: 
        !           170: The assembler would sometimes print 'Branch too long: try -J flag' even
        !           171: when you used the -J flag and when there was no reason for it to be
        !           172: making long branches.  This was due to a bug in jxxxfix() which caused
        !           173: tests for explodable branch instructions to terminate early in later
        !           174: phases of the topological sort, because the loop termination code
        !           175: didn't take into account the fact that not all code addresses are
        !           176: updated by jxxxbump().  The fix is to match the pointer to the data
        !           177: structure for the code in the sorted table rather than check for its
        !           178: generated address.  [as: asjxxx.c]
        !           179: 
        !           180: The peephole optimizer normally compares instructions for equality
        !           181: based on their instruction type and their operands.  Unfortunately
        !           182: several instructions are too complex for c2 to handle and are given an
        !           183: instruction type of 0; thus all such instructions compared equal.  The
        !           184: equop() routine was changed to test the names of these '0' type
        !           185: instructions for equality.  [c2: c21.c]
        !           186: 
        !           187: The compiler sometimes botched computations into stack temporaries by
        !           188: treating expressions like '-40(fp)[r1]' as permissible temporaries.  I
        !           189: rewrote the shtemp() routine to make it explicit that the 'stack
        !           190: temporary' goal in code generation means precisely that the final
        !           191: expression must not contain any references to temporary registers (like
        !           192: r1).  I had to add a couple templates to the code table to push
        !           193: exceedingly complex OREG expressions onto the stack when this goal is
        !           194: attempted.  [pcc.vax: local2.c, table.c]
        !           195: 
        !           196: A bug sometimes caused a redeclaration of an array in an inner scope to
        !           197: affect the outer array when the outer array was incompletely specified
        !           198: (by leaving out the most significant dimension).  For example:
        !           199: 
        !           200:        extern int a[];
        !           201:        x(){ int a[10]; }
        !           202:        int a[20];
        !           203: 
        !           204: This code would elicit the error 'foo.c, line 3: redeclaration of a'.
        !           205: The routine defid() is used to enter new definitions; for some reason
        !           206: scope problems are not resolved in defid() until much other code has
        !           207: been executed, including code that deals with filling out array sizes.
        !           208: The change makes defid() notice inner scopes with auto and register
        !           209: declarations earlier than usual.  [mip: pftn.c]
        !           210: 
        !           211: Case expressions are explicitly restricted to contain only int constants,
        !           212: char constants and sizeof expressions (C Reference Manual section 15).
        !           213: Previously the compiler didn't test for expressions like '(int) &foo[10]'
        !           214: and thus it would generate some rather bogus code.  Expressions which
        !           215: resolve to names now elicit the same 'non-constant case expression'
        !           216: warning which you receive for variables.  [mip: cgram.y]
        !           217: 
        !           218: The value of an assignment to an unsigned bitfield was signed through
        !           219: an oversight in the code table.  [pcc.vax: table.c]
        !           220: 
        !           221: From Sam Kendall, a fix to prevent structs, unions, floats, doubles
        !           222: and void from being cast to pointer types.  [mip: trees.c]
        !           223: 
        !           224: Some relict code in moditype() was causing void functions not to be
        !           225: converted into pointers in some situations.  [mip: trees.c]
        !           226: 
        !           227: A minor optimization -- when the lhs of a simple assignment op (&=, |=,
        !           228: ^=, +-, -=) is smaller than int size, we can sometimes pun the rhs and
        !           229: avoid promoting the lhs to int, performing the operation in int width
        !           230: and converting from int back to the lhs type.  For example:
        !           231: 
        !           232:        register char *ap, *bp;
        !           233:        *ap++ |= *bp << 1;
        !           234: 
        !           235: This used to require 7 instructions, but now needs only 3.  [pcc.vax:
        !           236: table.c]
        !           237: 
        !           238: At some point I added code to conval() to balance types before
        !           239: performing constant folding...  While hacking on the tahoe compiler, I
        !           240: decided that this code was too complex and replaced it with equivalent
        !           241: code that's shorter and easier to understand.  [mip: trees.c]
        !           242: 
        !           243: Lines containing multiple statements were broken up for the sake of
        !           244: tracing with the source debugger in tcheck() and talloc().  [mip:
        !           245: common.c]
        !           246: 
        !           247: I discovered that the C compiler called urem() in three different
        !           248: places with a constant divisor...  In my subsequent rampage I hacked
        !           249: the compiler to generate inline code for all unsigned division and
        !           250: modulus operations with constant divisors.  The largest inline
        !           251: expansion should use only 5 instructions, with most using just 3 or 4.
        !           252: The changes touched several files but really weren't very messy.
        !           253: [mip:  pass1.h, match.c; pcc.vax: local2.c, order.c, table.c]
        !           254: 
        !           255: A lot of new code was added to handle a really simple problem:
        !           256: 
        !           257:        unsigned char uc = 255;
        !           258:        if (uc == -1) ...
        !           259: 
        !           260: This incorrectly tested true, because the compiler generated a test
        !           261: that looked only at the low order byte of the constant.  Not only that,
        !           262: but the compiler didn't realize that this test could be short-
        !           263: circuited, since -1 is equal to 4294967295 unsigned and is hence out of
        !           264: the range of an unsigned char.  Rather than add lots of cruft to the
        !           265: code table, I shoved it into optim2() -- the compiler now picks up all
        !           266: the absurd cases where a constant is out of the range of precision of
        !           267: a variable it's tested against.  To avoid having to write lots of code
        !           268: templates to handle unbalanced unsigned/signed expressions, I forced
        !           269: tymatch() to take notice of unbalanced expressions and promote the
        !           270: signed operand to unsigned (except with assignment operators, sigh).
        !           271: This change in turned required tweaks in autoincr() and in the code
        !           272: table to get code quality back.  I hope I can come up with a better way
        !           273: to do this...  [mip: trees.c; pcc.vax: local2.c, order.c, table.c]
        !           274: 
        !           275: The value of TNULL was changed from 'pointer to undef' to 'pointer to
        !           276: member of enum' so that 'void *' can be a real type.  TNULL is used to
        !           277: tag unused symbol table slots.  [mip: manifest.h]
        !           278: 
        !           279: A bug in clearst() led to problems with 'schain botch' errors.  When a
        !           280: hash collision occurs, a symbol is (linearly) rehashed; if the symbol
        !           281: which forced the rehash is deleted, the relook() loop in clearst() will
        !           282: cause another symbol with the same hash code to move up and replace the
        !           283: deleted symbol.  Torek's 'schain' hack for speedy identification of
        !           284: symbols at the same block level will get screwed up by this operation
        !           285: since it relies on a linked list of table entries -- moving an entry
        !           286: garbles the list.  How did this code ever work before?  [mip: pftn.c]
        !           287: 
        !           288: Changed putins() in ascode.c in the assembler to permit 0(pc) as a
        !           289: write operand...  Previously the assembler automatically optimized
        !           290: this to (pc), which is an illegal operand.  [as.vax: ascode.c]
        !           291: 
        !           292: The complement of an unsigned char or unsigned short value should have
        !           293: its high bits set, since the 'usual arithmetic conversions' widen these
        !           294: small integers 'before' the operation.  [pcc.vax: table.c]
        !           295: 
        !           296: A minor code improvement in ccom led to problems in c2 -- c2 was able
        !           297: to optimize sequences like 'cvtbl -4(fp),r0; bicl2 $-256,r0' but not
        !           298: the (shorter and faster) 'cvtbl -4(fp),r0; movzbl r0,r0'.  A change in
        !           299: bflow() causes redundant conversions to be noted and removed, restoring
        !           300: code quality.  [c2: c21.c]
        !           301: 
        !           302: A typo in the 'bitsize' array definition resulted in an unterminated
        !           303: comment which screwed up the bit sizes for several types.  I only
        !           304: noticed this because I ran the source off with vgrind and the error
        !           305: was exposed by comment highlighting...  [c2: c21.c]
        !           306: 
        !           307: An earlier change to conval() caused LONG and ULONG types to be hacked
        !           308: into INT and UNSIGNED; this was fine for the (VAX) compiler, but led
        !           309: to inconsistencies with lint.  [mip: trees.c]
        !           310: 
        !           311: When a syntax error occurs, the parser throws away tokens until it can
        !           312: enter a known state.  If a string or character constant delimiter is
        !           313: tossed, the parser will try to interpret the contents of the constant
        !           314: as code and can get very confused.  A hack was added to yylex() to
        !           315: detect this situation -- basically, if a delimiter is seen but the
        !           316: string or character constant has not been processed by lxstr() at the
        !           317: next call to yylex(), yylex() will call lxstr() itself and dispose of
        !           318: the rest of the constant.  [mip: scan.c]
        !           319: 
        !           320: Following a suggestion by Arthur Olsen, the production for 'switch' was
        !           321: modified to complain about constant switch expressions with 'lint -h'.
        !           322: [mip: cgram.y]
        !           323: 
        !           324: Another Arthur Olsen bug report pointed out a problem with increment
        !           325: operations that don't match a code template...  Two attempts at
        !           326: rewriting the increment are made: the first tries to turn the lvalue
        !           327: operand into an OREG, and the second applies a tree transformation to
        !           328: convert 'x++' into '(x += sizeof x) - sizeof x'.  A mistake in the
        !           329: routine setincr() caused the lvalue operand in its entirety to be
        !           330: generated into a register instead of just the lvalue operand's address,
        !           331: producing something like 'r0 = x, (r0 += sizeof x) - sizeof x' instead
        !           332: of 'r0 = &x, (*r0 += sizeof x) - sizeof x'.  [pcc.vax: order.c]
        !           333: 
        !           334: Better code for floating post-increment and -decrement can be generated
        !           335: with a simple change to the code table and to zzzcode() so that the
        !           336: same hack for ordinary post-increment will work for floating point too.
        !           337: [pcc.vax: local2.c, table.c]
        !           338: 
        !           339: I added Arthur Olsen's massive lint fixes for typechecking printf().
        !           340: It sure would be nice if there were a way to specify new printf-like
        !           341: commands at execute time, perhaps through lint directives embedded in
        !           342: include files.  [lint: lint.c]
        !           343: 
        !           344: Arthur's warning about superfluous backslashes was added to lxstr().
        !           345: Rather than adding Arthur's (expensive) code for warning about the
        !           346: use of '$', I simply made it illegal (unless 'VMS' is defined).  I
        !           347: also took the opportunity to remove '`' gcos BCD constants.  I made
        !           348: a slight alteration to yylex() to cause it to eat unknown characters
        !           349: rather than punt, since this seemed more useful.  [mip: scan.c]
        !           350: 
        !           351: Lint would sometimes print a bogus 'i set but not used' warning in
        !           352: situations like this:
        !           353: 
        !           354:        static int i;
        !           355:        static int *ip = &i;
        !           356: 
        !           357:        i = 1;
        !           358:        return *ip;
        !           359: 
        !           360: If you moved the initialization out of the declaration, the warning
        !           361: disappeared.  I installed Arthur's hack for forcing lint to examine
        !           362: initializations.  This causes lint to treat initializations of auto,
        !           363: register and static variables as 'uses' and to ignore sizeof
        !           364: expressions as 'uses'.  Also, '&i' in a static or external
        !           365: initialization is now a 'set' and a 'use' of 'i'.  [lint: lint.c; mip:
        !           366: cgram.y, pftn.c]
        !           367: 
        !           368: VARARGS0 is now correctly treated differently from plain VARARGS.
        !           369: I don't remember who originally noticed this...  [lint: lint.c,
        !           370: lpass2.c]
        !           371: 
        !           372: The register allocation code failed to 'share' register pairs.  I don't
        !           373: know why this escaped notice for this long...  I added a bit in the
        !           374: 'busy' array to keep track of pairs and modified the code in usable()
        !           375: to notice pairs and try to 'share' them.  Some other code which treated
        !           376: the values of busy[] elements as arithmetic values had to be changed;
        !           377: there is now a macro which performs the proper test.  [mip: allo.c,
        !           378: match.c, pass2.h]
        !           379: 
        !           380: Some extensive code tweaking...  (1) If order() is called on to rewrite
        !           381: a UNARY MUL node and that node has a usable index expression, we now
        !           382: try to rewrite the base into a register so that oreg2() will produce a
        !           383: doubly-indexed OREG.  This is usually an impressive space saving.  (2)
        !           384: Instead of laboriously copying a constant 0.0 in data space to clear a
        !           385: double or a float, we issue the proper 'clrd' or 'clrf'.  This is done
        !           386: by a trick using an alternate prtdcon() routine; I'm not sure who
        !           387: invented it.  I guess I'm still not prepared to hack in support for
        !           388: floating literals and immediate constants.  (3) The conversion code now
        !           389: handles stack pushes directly, which often saves a spill to register.
        !           390: With very little adjustment, this also buys us optimally small pushes
        !           391: of constants.  (4) Pointer comparisons are now unsigned; I'm not sure
        !           392: what this really buys us, but I added it anyway.  (5) AND tests against
        !           393: constants are 'small' if both the constant and the other operand are
        !           394: also 'small'.  (6) base() now recognizes that NAME nodes can be used in
        !           395: pc relative deferred indexed addressing, which is much more compact
        !           396: than the equivalent code to compute the address into a register and
        !           397: indirect through it.  (7) The optimization code for ANDing with a
        !           398: constant now tries to produce a positive mask when small types are used
        !           399: so that literal operands are possible; a side effect is that the code
        !           400: is more readable.  (8) UCHAR/USHORT to FLOAT/DOUBLE conversions take an
        !           401: extra step through INT type to avoid the overhead of an UNSIGNED to
        !           402: FLOAT/DOUBLE conversion.  (9) If a logical operator sits above a pair
        !           403: of FLOAT to DOUBLE conversions, the conversions are deleted.  (10) Vast
        !           404: numbers of redundant or useless templates were deleted from the code
        !           405: table.  (11) Conversions to FLOAT in double-only arithmetic now go to
        !           406: the trouble of clipping off excess precision from INT and DOUBLE
        !           407: operands.  (12) DOUBLE to DOUBLE conversions introduced by reclaim()
        !           408: are now silently deleted in the table.  (13) A few 'movd's were turned
        !           409: into 'movq's -- more work needs to be done to make this consistent.
        !           410: [mip: reader.c; pcc.vax: macdefs.h, local.c, local2.c, table.c]
        !           411: 
        !           412: A bug which caused assignment op expressions with an unsigned char or
        !           413: unsigned short lhs and a floating rhs to treat the lhs as signed was
        !           414: fixed.  Some conversion-related stuff which used to be done in the
        !           415: table is now done in sconv() so that it's easier to handle and so that
        !           416: zzzcode() and its descendants can more safely perform conversions by
        !           417: calling zzzcode(p, 'A').  [pcc.vax: local2.c, table.c]
        !           418: 
        !           419: The code for setting the type of a floating point constant was bogus.
        !           420: A floating constant was float if it fit in a float without loss of
        !           421: precision, otherwise it was double.  This caused silliness like
        !           422: unexpectedly losing low order bits of integers in mixed floating and
        !           423: integral expressions.  The fix was to adopt the ANSI proposal that all
        !           424: floating constants are type double unless they bear an 'f' or 'F'
        !           425: suffix, in which case they are type float.  (Note that a cast to float
        !           426: has the same effect as a 'f' suffix and is just as efficient, but I
        !           427: conceded to the evident popularity of the 'f' suffix...)  [mip: scan.c;
        !           428: pcc.vax: local.c]
        !           429: 
        !           430: The ASG OPSIMP templates that produce byte and word instructions for
        !           431: byte and word destinations weren't being activated very often because
        !           432: the constant operands weren't normalized.  I added code to optim2() to
        !           433: appropriately reduce the range of constant operands of ASG OPSIMP
        !           434: operators and sign-extend.  This blows away many useless conversions to
        !           435: and from int.  [pcc.vax: local2.c]
        !           436: 
        !           437: The template for assignment ops with unsigned char/short lhs and
        !           438: floating rhs indicated register sharing for the wrong operand...
        !           439: [pcc.vax: table.c]
        !           440: 
        !           441: The new template that handled OREG for INTEMP failed to take into
        !           442: account the size variation in OREG objects.  [pcc.vax: table.c]
        !           443: 
        !           444: The offstar() routine tries to tweak UNARY MUL trees so that they can
        !           445: be handled most effectively by VAX addressing modes.  The code for
        !           446: identifying index expressions was adjusted so that more indexed
        !           447: addressing modes can be produced.  [pcc.vax: order.c]
        !           448: 
        !           449: Bogus error messages were being emitted for certain initializations
        !           450: following an earlier legitimate error.  It turns out that the
        !           451: optimization to prevent initialization code from being emitted after
        !           452: errors was preventing the initializer offset counter from being
        !           453: updated, and when this occurs, the initialization code screws up -- for
        !           454: example, string constants appear to be zero length.  The initialization
        !           455: code now always updates the offset even if errors have been detected,
        !           456: although code generation is still suppressed.  [pcc.vax: local.c]
        !           457: 
        !           458: An assignment to a bitfield in an indexed int-width structure led to
        !           459: code generation failure due to an indexed OREG child of FLD.  This is
        !           460: taboo because the VAX field instructions have byte-size side effects,
        !           461: and code in clocal() arranged for indexed structs to have int width.
        !           462: I changed clocal() to use byte width instead and it appears to work now
        !           463: (and even uses indexed byte addressing correctly).  [pcc.vax: local.c]
        !           464: 
        !           465: For some reason the unsigned-to-floating conversion code has always
        !           466: been long and complex when it could be short and simple.  I used the
        !           467: simple code in the Tahoe compiler but didn't think to put it in the VAX
        !           468: compiler until prodded by Robert Firth...  [pcc.vax: local2.c]
        !           469: 
        !           470: John Gilmore noticed that the ! operator didn't work with floating
        !           471: constants; this was pretty easy to fix.  [mip: trees.c]
        !           472: 
        !           473: For some reason, opact() put left and right shifts through tymatch().
        !           474: The type balancing of tymatch() is wrong for shifts -- the type of the
        !           475: shift depends only on the left operand, while the right operand is
        !           476: converted to int.  We now use the shift special case in buildtree() to
        !           477: fix the type.  [mip: trees.c]
        !           478: 
        !           479: Following ANSI (for once) we eliminate warnings for pointer conversions
        !           480: involving void *.  [mip: trees.c]
        !           481: 
        !           482: There were at least a couple bugs in c2 with code that converts 'ashl
        !           483: $2,rA,rB; movab _x[rB],rC' into 'moval _x[rB],rC'; one caused the type
        !           484: to be wrong ('movab' for 'moval'), one caused neighboring instructions
        !           485: to get deleted.  [c2.vax: c21.c]
        !           486: 
        !           487: A branch to a redundant test sometimes resulted in c2's deleting the
        !           488: label too, even if the label itself was not redundant.  [c2.vax: c21.c]
        !           489: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.