[M3devel] libm3/Swap?
Jay K
jay.krell at cornell.edu
Sat May 15 11:24:02 CEST 2010
Oh I see, it is sign extending the result, not copying the sign from the original.
- Jay
----------------------------------------
> From: jay.krell at cornell.edu
> To: m3devel at elegosoft.com
> Subject: libm3/Swap?
> Date: Sat, 15 May 2010 07:08:03 +0000
>
>
> libm3/.../swap.m3:
>
>
> FROM Word IMPORT Or, And, Not, LeftShift, RightShift, Extract;
>
>
> CONST
> B0 = 16_FF;
> B1 = 16_FF00;
> B2 = 16_FF0000;
> B3 = 16_FF000000;
>
>
> (* These will all be zero on machines with BYTESIZE(INTEGER) = 32 *)
> B4 = LeftShift(B3, 8);
> B5 = LeftShift(B4, 8);
> B6 = LeftShift(B5, 8);
> B7 = LeftShift(B6, 8);
>
> CONST SignExt32 = ARRAY [0..1] OF Word.T {0, Not(16_FFFFFFFF)};
>
> (* Swaps the lower 4 bytes of i *)
> PROCEDURE Swap4 (i: Int32): Int32 =
> BEGIN
> IF BYTESIZE(INTEGER) = 4 THEN
> RETURN Or(Or(RightShift(And(B3, i), 24), RightShift(And(B2, i), 8)),
> Or(LeftShift(And(B1, i), 8), LeftShift(And(B0, i), 24)));
> ELSIF BYTESIZE(INTEGER) = 8 THEN
> RETURN
> Or(SignExt32[Extract(i, 7, 1)],
> Or(Or(RightShift(And(B3, i), 24), RightShift(And(B2, i), 8)),
> Or(LeftShift(And(B1, i), 8), LeftShift(And(B0, i), 24))));
> ELSE
> RAISE Failure;
> END;
> END Swap4;
>
>
> What is the meaning of the 7?
> In Extract(i, 7, 1)?
> Presumably it should be 63??
> I guess I'll write a test..
>
>
> Is there a better idiom that doesn't expose architectures to compile code for other word sizes?
> Maybe fork the file and include_dir(WORD_SIZE)?
> Like is done in m3core/src/C?
>
>
> - Jay
>
More information about the M3devel
mailing list