[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