[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
http://www.pofo.de/
http://wishlist.ans-netz.de/
More information about the TUHS
mailing list