From 20a97bb570e84520e33c84bcadddbcb8a6df6c63 Mon Sep 17 00:00:00 2001 From: David Brown Date: Wed, 21 Sep 2016 11:56:21 +0100 Subject: [PATCH] Add check that double and long long (both 64 bit) have same alignment. --- src/library/ooc/oocLowLReal.Mod | 164 ++++++++++++++++---------------- src/tools/make/configure.c | 1 + 2 files changed, 84 insertions(+), 81 deletions(-) diff --git a/src/library/ooc/oocLowLReal.Mod b/src/library/ooc/oocLowLReal.Mod index 0a15f6dd..e28e13cf 100644 --- a/src/library/ooc/oocLowLReal.Mod +++ b/src/library/ooc/oocLowLReal.Mod @@ -1,21 +1,23 @@ (* $Id: LowLReal.Mod,v 1.6 1999/09/02 13:15:35 acken Exp $ *) MODULE oocLowLReal; +(* ToDo. support 64 bit builds *) + (* - LowLReal - Gives access to the underlying properties of the type LONGREAL - for IEEE double-precision numbers. + LowLReal - Gives access to the underlying properties of the type LONGREAL + for IEEE double-precision numbers. Copyright (C) 1996 Michael Griebling - + This module is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as + it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This module is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA @@ -26,7 +28,7 @@ MODULE oocLowLReal; IMPORT Low := oocLowReal, S := SYSTEM; (* - + Real number properties are defined as follows: radix--The whole number value of the radix used to represent the @@ -44,50 +46,50 @@ IMPORT Low := oocLowReal, S := SYSTEM; small--The smallest positive value of the corresponding real number type, represented to maximal precision. - IEC559--A Boolean value that is TRUE if and only if the implementation - of the corresponding real number type conforms to IEC 559:1989 + IEC559--A Boolean value that is TRUE if and only if the implementation + of the corresponding real number type conforms to IEC 559:1989 (IEEE 754:1987) in all regards. NOTES 6 -- If `IEC559' is TRUE, the value of `radix' is 2. - 7 -- If LowReal.IEC559 is TRUE, the 32-bit format of IEC 559:1989 + 7 -- If LowReal.IEC559 is TRUE, the 32-bit format of IEC 559:1989 is used for the type REAL. - 7 -- If LowLong.IEC559 is TRUE, the 64-bit format of IEC 559:1989 + 7 -- If LowLong.IEC559 is TRUE, the 64-bit format of IEC 559:1989 is used for the type REAL. - LIA1--A Boolean value that is TRUE if and only if the implementation of - the corresponding real number type conforms to ISO/IEC 10967-1:199x - (LIA-1) in all regards: parameters, arithmetic, exceptions, and + LIA1--A Boolean value that is TRUE if and only if the implementation of + the corresponding real number type conforms to ISO/IEC 10967-1:199x + (LIA-1) in all regards: parameters, arithmetic, exceptions, and notification. - rounds--A Boolean value that is TRUE if and only if each operation produces - a result that is one of the values of the corresponding real number + rounds--A Boolean value that is TRUE if and only if each operation produces + a result that is one of the values of the corresponding real number type nearest to the mathematical result. - gUnderflow--A Boolean value that is TRUE if and only if there are values of - the corresponding real number type between 0.0 and `small'. + gUnderflow--A Boolean value that is TRUE if and only if there are values of + the corresponding real number type between 0.0 and `small'. - exception--A Boolean value that is TRUE if and only if every operation that + exception--A Boolean value that is TRUE if and only if every operation that attempts to produce a real value out of range raises an exception. - extend--A Boolean value that is TRUE if and only if expressions of the - corresponding real number type are computed to higher precision than + extend--A Boolean value that is TRUE if and only if expressions of the + corresponding real number type are computed to higher precision than the stored values. - nModes--The whole number value giving the number of bit positions needed for + nModes--The whole number value giving the number of bit positions needed for the status flags for mode control. - + *) CONST radix*= 2; - places*= 53; - expoMax*= 1023; + places*= 53; + expoMax*= 1023; expoMin*= 1-expoMax; large*= MAX(LONGREAL); (*1.7976931348623157D+308;*) (* MAX(LONGREAL) *) (*small*= 2.2250738585072014D-308;*) small*= 2.2250738585072014/9.9999999999999981D307(*/10^308)*); - IEC559*= TRUE; + IEC559*= TRUE; LIA1*= FALSE; rounds*= FALSE; gUnderflow*= TRUE; (* there are IEEE numbers smaller than `small' *) @@ -97,23 +99,23 @@ CONST ONE=1.0D0; (* some commonly-used constants *) ZERO=0.0D0; TEN=1.0D1; - + DEBUG = TRUE; - expOffset=expoMax; - hiBit=19; + expOffset=expoMax; + hiBit=19; expBit=hiBit+1; nMask={0..hiBit,31}; (* number mask *) expMask={expBit..30}; (* exponent mask *) - + TYPE Modes*= SET; LongInt=ARRAY 2 OF LONGINT; - LongSet=ARRAY 2 OF SET; - + LongSet=ARRAY 2 OF SET; + VAR (*sml* : LONGREAL; tmp: LONGREAL;*) (* this was a test to get small as a variable at runtime. obviously, compile time preferred; -- noch *) - isBigEndian-: BOOLEAN; (* set when target is big endian *) + isBigEndian-: BOOLEAN; (* set when target is big endian *) (* PROCEDURE power0(i, j : INTEGER) : LONGREAL; (* used to calculate sml at runtime; -- noch *) VAR k : INTEGER; @@ -139,7 +141,7 @@ END err; PROCEDURE ClearError*; BEGIN Low.ClearError -END ClearError; +END ClearError; PROCEDURE ErrorHandler*(err: INTEGER); BEGIN @@ -185,26 +187,26 @@ BEGIN RETURN x END ToReal; (*<* POP *> *) - + PROCEDURE exponent*(x: LONGREAL): INTEGER; -(* +(* The value of the call exponent(x) shall be the exponent value of `x' that lies between `expoMin' and `expoMax'. An exception shall occur and may be raised if `x' is equal to 0.0. - *) + *) VAR ra: LongInt; BEGIN (* NOTE: x=0.0 should raise exception *) IF x=ZERO THEN RETURN 0 - ELSE Move(x, ra); - RETURN SHORT(S.LSH(ra[0],-expBit) MOD 2048)-expOffset + ELSE Move(x, ra); + RETURN SHORT(S.LSH(ra[0],-expBit) MOD 2048)-expOffset END END exponent; PROCEDURE exponent10*(x: LONGREAL): INTEGER; -(* - The value of the call exponent10(x) shall be the base 10 exponent - value of `x'. An exception shall occur and may be raised if `x' is +(* + The value of the call exponent10(x) shall be the base 10 exponent + value of `x'. An exception shall occur and may be raised if `x' is equal to 0.0. *) VAR exp: INTEGER; @@ -215,19 +217,19 @@ BEGIN WHILE x<1 DO x:=x*TEN; DEC(exp) END; RETURN exp END exponent10; - + PROCEDURE fraction*(x: LONGREAL): LONGREAL; (* The value of the call fraction(x) shall be the significand (or significant) part of `x'. Hence the following relationship shall - hold: x = scale(fraction(x), exponent(x)). + hold: x = scale(fraction(x), exponent(x)). *) CONST eZero={(hiBit+2)..29}; VAR ra: LongInt; BEGIN - IF x=ZERO THEN RETURN ZERO + IF x=ZERO THEN RETURN ZERO ELSE Move(x, ra); - ra[0]:=S.VAL(LONGINT, S.VAL(SET,ra[0])*nMask+eZero); + ra[0]:=S.VAL(LONGINT, S.VAL(SET,ra[0])*nMask+eZero); RETURN Real(ra)*2.0D0 END END fraction; @@ -246,13 +248,13 @@ PROCEDURE IsNaN * (real: LONGREAL) : BOOLEAN; BEGIN MoveSet(real, ra); RETURN (ra[0]*expMask=expMask) & ((ra[1]#{}) OR (ra[0]*fracMask#{})) -END IsNaN; +END IsNaN; PROCEDURE sign*(x: LONGREAL): LONGREAL; (* The value of the call sign(x) shall be 1.0 if `x' is greater than 0.0, or shall be -1.0 if `x' is less than 0.0, or shall be either 1.0 or - -1.0 if `x' is equal to 0.0. + -1.0 if `x' is equal to 0.0. *) BEGIN IF x