[M3devel] tangential 64 bit...

Jay jayk123 at hotmail.com
Tue Feb 26 21:34:51 CET 2008


Tony..are you sure..I'm not sure what I said is true.
It seems clear that the host integer size is well abstracted while interpreting target numbers.
 
I am more certain that [-1 .. 1] is empty, and this is likely a problem in TInt.Subtract.. 
PROCEDURE Add (READONLY a, b: Int;  VAR r: Int): BOOLEAN =  (* It is safe for r to alias a or b *)  VAR n := MIN (a.n, b.n);  carry := 0;  r_sign := Sign.Bad;      a_sign := CheckSign (a, n);  b_sign := CheckSign (b, n);  BEGIN    IF a_sign = Sign.Bad THEN RETURN FALSE END;    IF b_sign = Sign.Bad THEN RETURN FALSE END;    r.n := n;    FOR i := 0 TO n-1 DO      carry := a.x[i] + b.x[i] + carry;      r.x[i] := And (carry, Mask);      carry := RShift (carry, BITSIZE (IByte));    END;    r_sign := CheckSign (r, n);  <*ASSERT r_sign # Sign.Bad*>    RETURN (a_sign # b_sign) OR (a_sign = r_sign);  END Add;
 
PROCEDURE Subtract (READONLY a, b: Int;  VAR r: Int): BOOLEAN =  (* It is safe for r to alias a or b *)  VAR n := MIN (a.n, b.n);  borrow := 0; r_sign := Sign.Bad;      a_sign := CheckSign (a, n);  b_sign := CheckSign (b, n);  BEGIN    IF a_sign = Sign.Bad THEN RETURN FALSE END;    IF b_sign = Sign.Bad THEN RETURN FALSE END;    r.n := n;    FOR i := 0 TO n-1 DO      borrow := a.x[i] - b.x[i] - borrow;      r.x[i] := And (borrow, Mask);      borrow := And (RShift (borrow, BITSIZE (IByte)), 1);    END;    r_sign := CheckSign (r, n);  <*ASSERT r_sign # Sign.Bad*>    RETURN (a_sign = b_sign) OR (a_sign = r_sign);  END Subtract;
Is it not adequate to treat carry and borrow as one it, zero or non-zero?
Thinking in decimal about addition -- 9 + 9 = 18.
You can never overflow to 20, 30, 40, etc.
 
For substraction 0 - 9 = -9, never -10 or lower.
 
However "1" is a full decimal digit, not a bit.
In this case, the digits are bytes.
 
Aha, so maybe the problem is the "and"?
 
Let's check pm3 and decm3 3.6 again..
No, pm3 has the and too.. hm. I have to refresh some of my bit twiddling algorithms..
 
 - Jay


CC: m3devel at elegosoft.comFrom: hosking at cs.purdue.eduTo: jayk123 at hotmail.comSubject: Re: [M3devel] tangential 64 bit...Date: Tue, 26 Feb 2008 15:14:18 -0500


Indeed, on a 32-bit platform [16_0 .. 16_ffffffff] is an empty type, because 16_ffffffff is interpreted as an INTEGER constant with value -1, so the subrange is [0..-1].

This implies that one should not be using a 32-bit compiler to compile the 64-bit version of BasicCtypes.i3 in the first place.

Of course, this also implies that one cannot directly cross-compile to 64-bit targets from 32-bit hosts, which is kind of broken.  I suppose we could use LONGINT as necessary, realizing that LONGINT and INTEGER are distinct types that happen to have the same representation on 64-bit machines but different representation on 32-bit machines.  Does anyone know if it was *ever* possible in the old PM3 to cross-compile from 32-bit to 64-bit?  Presumably one needs an intermediate step where the C types used on the cross-compile host match those of the host instead of the target.


On Feb 26, 2008, at 1:53 PM, Jay wrote:

alpha/osf doesn't work because basictypes/ctypes has a problem with the 32bit or 64bit types.specifically "unsigned long" is "empty" for some reason and many errors cascade from that. if you change:  unsigned_int       = [16_0 .. 16_ffffffff];to  unsigned_int       = [16_0 .. 16_fffffffe]; you get:  ****** runtime error:***    An array subscript was out of range.***    file "../src/TWord.m3", line 199***Presumably fixing this first problem is the first step in any "real" 64 bit target (SPARC64, PPC64, AMD64, IA64), and the second problem should just be fixed as a matter of course. I know this is the least of anyone's concerns..  - Jay

Connect and share in new ways with Windows Live. Get it now!
_________________________________________________________________
Climb to the top of the charts! Play the word scramble challenge with star power.
http://club.live.com/star_shuffle.aspx?icid=starshuffle_wlmailtextlink_jan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20080226/3f37d1f0/attachment-0002.html>


More information about the M3devel mailing list