[TUHS] Introduction

Oliver Lehmann lehmann at ans-netz.de
Tue Jul 1 03:34:50 AEST 2008

Jose R. Valverde wrote:

> But you would still be able to see what did generate the code (barring
> register number).

my C code:

        register char *r2;
        register long r4;

	r2 = uap->linkname;
	r4 = (long) r2;
	r4 &= 0x7F00FFFF;
	u.u_dirp.l = (caddr_t) r4;

leads to:

        ldl     rr2,rr8(#4)			/* r2 = uap->linkname; */
        ldl     |_stkseg+~L1|(fp),rr2		/* r2 = uap->linkname; */
        ldl     |_stkseg+~L1+4|(fp),rr2		/* r4 = (long) r2;     */
        ldl     rr4,rr2				/* r4 &= 0x7F00FFFF;   */
        and     r4,#32512			/* r4 &= 0x7F00FFFF;   */
        ldl     |_stkseg+~L1+4|(fp),rr4		/* r4 &= 0x7F00FFFF;   */
        ldl     _u+78,rr4			/* u.u_dirp.l = (caddr_t) r4; */

looks not sooo bad - just the assigning into the stacked variables (no
idea why no register bound is used here even if I told the compiler to
make them register bound - but ,,register'' isn't that strong anyway)

> That is why I suggested the extra cast to
> see if the compiler would be misled into using an unneeded zero-offset
> assignment instruction to an auxiliary register.
> 	u.u_dirp.l = (caddr_t) ((long) (((saddr_t) uap->linkname).l) & 0x7F00FFFF);
> [...]
> but introducing a saddr_t cast that might fool the compiler into a
> temporary assignment with a zero offset (the .l) into ldl rr4,rr2

but not with that code :/

u.u_dirp.l = (caddr_t) ((long) (((saddr_t) uap->linkname).l) & 0x7F00FFFF);
"sys2_.c":50: operands of CAST have incompatible types 
"sys2_.c":50: warning: struct/union or struct/union pointer required

Thats why I changed it the last time... to * and ->.

 Oliver Lehmann

More information about the TUHS mailing list