[M3devel] "please confirm my understanding"

Tony Hosking hosking at cs.purdue.edu
Thu Nov 29 16:59:26 CET 2007


On Nov 29, 2007, at 6:15 AM, Jay wrote:

> please confirm my understanding
>
> I don't feel great being a lone reader/changer of code esp. that I  
> didn't write and that lacks
>   sufficient documentation for my small brain/confidence. (I'm not  
> stupid, but this isn't trivial stuff either.)

If you are talking about the native x86 (non-gcc) backend then I  
concur that it is pretty unreadable.  Hence my lack of enthusiasm in  
working on it myself.

> I am bound to make mistakes.

We all do!

> In the context of Modula-3 code gen interfaces, and the word  
> interfaces, which apparently are identical/analogous/whatever:
>
> There is:
>
> Shift (aka, my bad naming, "generic" shift)

Yes, shift by n>0 is shift left.  n<0 is shift right.

> LeftShift
> RightShift
>
> LeftShift and RightShift allow only positive shift counts, 0 .. 31  
> or 0 .. 63 (given
>   particular word sizes and depending on types..)
> The "front end" checks constants against these.
> The "front end" inserts checks for variables against these.
> The back end can assume 0 .. 31 or 0 .. 63.

Yes, depending on word-size.

> It looks like the x86 back end does redundant masks against 31, at  
> least when shifting by a constant,
>   only in its own data, not in the codegen. Just a small waste of  
> time in the compiler, no negative affect on codegen.
>
> "generic" Shift accepts any number for a shift count.
> Negative numbers mean a right shift.
> Positive numbers mean a left shift.
> If the shift count is >31|63 or <-31|63, the result is not an  
> error, but zero.

Yes.

> In all cases, right shifts are unsigned, zero filling.

Yes.

> There is no shift operation that propagates the sign bit.
> In the Modula-3 language even. Perhaps, yes, integer division. But  
> the frontend does not optimize
> there and turn multiplication or division into shifts, I think,  
> haven't read much of the frontend. The backend could.

Correct.  I think the thinking was that a decent back-end would turn  
integer division by a power of 2 into an arithmetic right shift (the  
gcc backend certainly does).

> Rotate is presumably similar, but I have not looked at it.
> (LeftRotate, RightRotate, Rotate...)

Weird thing with these is the way the high/low bits are rotated  
around, so sign can change!

> m3-sys\m3back\src\m3x86.m3 implements left_shift, and right_shift,
>   very redundanty code, could be combined.
>
> The layering is /roughly/
>   m3x86 on top
>   stackx86 in the middle
>   codex86 at the bottom
>
> However m3x86 does call through to codex86 directly.
> They are largely one layer. There is no strict division.
> "stack" is a simple way to implement some optimizations and stategies
> around constant propagation and register allocation.
>
> It is a stack of "operands", which may be constants, globals, or  
> locals.
> If something is needed in a register, a register will be freed up.
> If something is later needed and the register hasn't been spilled,  
> it will be
>  reused. If not, not.
>
> Presently the operands are assumed to be of word size, 32 bits,  
> register size.
> That is largely a convenience, and very convenient.
> I will expand it to allow two word operands.
> It could be expanded to arbitrarily, at least to "fill" "all" the  
> registers, for some
>  not particularly interesting but theoretically useful scenarios --  
> passing "medium"
>  sized structs around by value or such. There are ABI concerns  
> though, this could
>  only be amongst local functions that aren't visible/used  
> externally (aka "custom calling conventions").

You can make some assumptions about how the front-end uses the middle- 
end interfaces.  For example, it only ever stacks integer things as  
32 or 64 bits, even if the integers have a memory representation that  
is 8 bits, etc.

> The "generic" shift (vs. left_shift, right_shift) is implemented in  
> stackx86
> while left_shift, right_shift are in m3x86. All three functions are  
> very similar,
> could be combined, and there is no good reason for some to be in  
> one layer
> vs. the other and it's a just a pointless inconsistency.
>
> Granted, "generic" shift is a good bit different, it has to check  
> the sign and the magnitude,
> whereas left and right can just blindly do the operation with no  
> comparisons or branches.
>
> Some of this I gather from attempting to compile code with shifts  
> -- esp. the frontend checking of stuff, which then lead me to look  
> at word.i3
> which declares subranges for the parameters.
>
> Is Bill Kalsow around?

Good question.  Farshad Nayeri may know where he ended up.

> Or the other original authors?

I know Michel Dagenais had a student who adapted the native x86  
backend for use on Linux with PM3.  I don't remember the student's name.

> Everyone just figured stuff out from the code, comments, and  
> "literature" (I ordered another copy of Nelson's good book. :) )
>
>
>  - Jay
>
>
> Connect and share in new ways with Windows Live. Connect now!




More information about the M3devel mailing list