chris@MIMSY.UMD.EDU (Chris Torek) (01/22/89)
I have been comparing some of the code gcc generates with what /lib/c2 uses. Here are a few things I caught: ------------ code is a &= ~(1 << b()) gcc produces ashl r0,$1,r0 mcoml r0,r0 mcoml _a,r1 bicl3 r1,r0,_a which is more simply ashl r0,$1,r0 bicl2 r1,_a ------------ code is struct { ... short a; ... } *p; ... p->a & 0xff ... gcc produces movw 30(r1),r4 bicl3 $-256,r4,r1 which is more simply movzbl 30(r1),r1 although the latter does a byte reference rather than a longword. If nothing else, the sequence should be movw+movzbl. ------------ code is something complex gcc produces movl -4(fp),r2 bitl *40(r10)[r2],$-2147483648 jeql Lxxx movl -4(fp),36(r10) which is more simply movl -4(fp),r2 bitl *40(r10)[r2],$-2147483648 jeql Lxxx movl r2,36(r10) That is, it seems to have forgotten that it already has -4(fp) in r2. [incidentally, why not `jbc $31,*40(r10)[r2]', while we are at it?] ------------ code is f() { int b; g(&b); } gcc produces subl3 $4,fp,-(sp) which is more simply mova[bwl] 4(fp),-(sp) ------------ code is f(volatile int a) { if (a & 1) g(); } gcc produces jbc $0,4(ap),Lxxx which is more simply jlbc 4(ap),Lxxx Note that the latter does a longword reference; the former is technically incorrect, although gcc does the right thing if the situation is really such that a could be in I/O space. (It would be valid to use jlbc on a volatile int.) Chris