bmacintyre@watdragon.waterloo.edu (Blair MacIntyre) (03/07/89)
[eat this and choke] I recently got my third compiler bug causing problems for me on this one project, so I thought it was about time to summarize them and post it. Here is the output from the Manx C 3.6a of three bugs I have discovered: ------- A) testing the wrong thing: ( I'm including every thing up to the bug for clarity ) ------- ; ;_GLcode( x, y, z, w, wec ) ; double x, y, z; public __GLcode __GLcode: link a5,#.2 movem.l .3,-(sp) ; register double w; ; double wec[6]; ;{ move.l 32(a5),d4 ; short code = 0; clr.w -2(a5) ; ; if( (wec[0] = w+y) < 0.0 ) ; code |= 1; move.l 16(a5),d1 move.l d0,-(sp) <-- what is it saving? No one knows! move.l d4,d0 jsr .Fadd# move.l 40(a5),a0 move.l d0,d1 move.l d1,(a0) move.l (sp)+,d0 <-- whatever it was, that's what its jsr .Ftst# comparing against! bge .4 bset.b #0,-1(a5) ; .4 -------- B) so, I rewrote the routine, taking the assignment out of the if. Now I have a LUCAS board, so I compiled it for the 68881 --> now, it's trashing a register variable -------- ;OutCode _GLcode1( x, y, z, w, wec ) ; Coord x, y, z; public __GLcode1 __GLcode1: link a5,#.8 movem.l .9,-(sp) fmovem.x .10,-(sp) ; register Coord w; ; WindowEdgeCoord wec; ;{ fmove.d 32(a5),fp4 <-- move w to fp4 ; OutCode code = 0; clr.w -2(a5) ; ; wec[BOTTOM_PLANE] = w+y; move.l 40(a5),a0 fadd.d 16(a5),fp4 <-- add y into w fmove.d fp4,(a0) ; if( wec[BOTTOM_PLANE] < 0.0 ) ; code |= 1; move.l 40(a5),a0 fmove.d (a0),fp0 fbge .11 bset.b #0,-1(a5) ; ; wec[TOP_PLANE] = w-y; .11 move.l 40(a5),a0 fsub.d 16(a5),fp4 <-- now, for the next use of w, it fmove.d fp4,8(a0) doesn't reinitialize it, giving wec[TOP_PLANE] = w+y-y = w ... NO! -------- C) On another note, here is the Manx compiler generating non-existant opcodes! -------- ; register valuea, valuep; <-- missdeclared a var ... I wanted register double valuea, valuep; ; ; [ insert other code here! ] ; ; valuep = sqrt(valuep); move.w d5,d0 sqrt.w d0 <-- what the Heck is that?! fmove.w d0,fp0 fintrz fp0 fmove.l fp0,d0 move.w d0,d5 ; valuea = sqrt(valuea); move.w d4,d0 sqrt.w d0 <-- and again!!! fmove.w d0,fp0 fintrz fp0 fmove.l fp0,d0 move.w d0,d4 ; ------ There you have it. Straight from the horses mouth! No, who was it that said they were selling the Lattice C 5.0?!? :-) Blair -- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= = Blair MacIntyre, bmacintyre@watsol.{waterloo.edu, UWaterloo.ca} = = "Don't be mean ... remember, no matter where you go, there you are." BBanzai= =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=