/*
This file is part of JOP, the Java Optimized Processor
see <http://www.jopdesign.com/>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fpu;
import com.jopdesign.sys.Native;
// class Native {
// public static double toDouble(long v) {
// return Double.longBitsToDouble(v);
// }
// }
public class GenDoubleTestSim {
static double [] nums = { Double.NaN,
Double.MAX_VALUE,
Double.MIN_VALUE,
Double.NEGATIVE_INFINITY,
Double.POSITIVE_INFINITY,
0.0,
1.0,
-1.0,
-126.0,
-24.0,
-2.0,
2.0,
24.0,
127.0,
3.14159,
2.71828,
// we have no invokestatic in Startup.interpret()
// use special native function
Native.toDouble(0x0080000000800000L),
Native.toDouble(0x3380000033800000L),
Native.toDouble(0x3E8000003E800000L),
Native.toDouble(0x3F0000003F000000L),
Native.toDouble(0x3F8000003F800000L),
Native.toDouble(0x4000000040000000L),
Native.toDouble(0x4080000040800000L),
Native.toDouble(0x4B8000004B800000L),
Native.toDouble(0x7F0000007F000000L),
Native.toDouble(0x8080000080800000L),
Native.toDouble(0xB3800000B3800000L),
Native.toDouble(0xBE800000BE800000L),
Native.toDouble(0xBF000000BF000000L),
Native.toDouble(0xBF800000BF800000L),
Native.toDouble(0xC0000000C0000000L),
Native.toDouble(0xC0800000C0800000L),
Native.toDouble(0xCB800000CB800000L),
Native.toDouble(0xFE800000FE800000L),
Native.toDouble(0x0000000000000000L),
Native.toDouble(0x0000000100000001L),
Native.toDouble(0x0000000200000002L),
Native.toDouble(0x0000000400000004L),
Native.toDouble(0x0000000800000008L),
Native.toDouble(0x0000001000000010L),
Native.toDouble(0x0000002000000020L),
Native.toDouble(0x0000004000000040L),
Native.toDouble(0x0000008000000080L),
Native.toDouble(0x0000010000000100L),
Native.toDouble(0x0000020000000200L),
Native.toDouble(0x0000040000000400L),
Native.toDouble(0x0000080000000800L),
Native.toDouble(0x0000100000001000L),
Native.toDouble(0x0000200000002000L),
Native.toDouble(0x0000400000004000L),
Native.toDouble(0x0000800000008000L),
Native.toDouble(0x0001000000010000L),
Native.toDouble(0x0002000000020000L),
Native.toDouble(0x0004000000040000L),
Native.toDouble(0x0008000000080000L),
Native.toDouble(0x0010000000100000L),
Native.toDouble(0x0020000000200000L),
Native.toDouble(0x0040000000400000L),
Native.toDouble(0x0080000000800000L),
Native.toDouble(0x0100000001000000L),
Native.toDouble(0x0200000002000000L),
Native.toDouble(0x0400000004000000L),
Native.toDouble(0x0800000008000000L),
Native.toDouble(0x1000000010000000L),
Native.toDouble(0x2000000020000000L),
Native.toDouble(0x4000000040000000L),
Native.toDouble(0x8000000080000000L),
Native.toDouble(0xC0000000C0000000L),
Native.toDouble(0xE0000000E0000000L),
Native.toDouble(0xF0000000F0000000L),
Native.toDouble(0xF8000000F8000000L),
Native.toDouble(0xFC000000FC000000L),
Native.toDouble(0xFE000000FE000000L),
Native.toDouble(0xFF000000FF000000L),
Native.toDouble(0xFF800000FF800000L),
Native.toDouble(0xFFC00000FFC00000L),
Native.toDouble(0xFFE00000FFE00000L),
Native.toDouble(0xFFF00000FFF00000L),
Native.toDouble(0xFFF80000FFF80000L),
Native.toDouble(0xFFFC0000FFFC0000L),
Native.toDouble(0xFFFE0000FFFE0000L),
Native.toDouble(0xFFFF0000FFFF0000L),
Native.toDouble(0xFFFF8000FFFF8000L),
Native.toDouble(0xFFFFC000FFFFC000L),
Native.toDouble(0xFFFFE000FFFFE000L),
Native.toDouble(0xFFFFF000FFFFF000L),
Native.toDouble(0xFFFFF800FFFFF800L),
Native.toDouble(0xFFFFFC00FFFFFC00L),
Native.toDouble(0xFFFFFE00FFFFFE00L),
Native.toDouble(0xFFFFFF00FFFFFF00L),
Native.toDouble(0xFFFFFF80FFFFFF80L),
Native.toDouble(0xFFFFFFC0FFFFFFC0L),
Native.toDouble(0xFFFFFFE0FFFFFFE0L),
Native.toDouble(0xFFFFFFF0FFFFFFF0L),
Native.toDouble(0xFFFFFFF8FFFFFFF8L),
Native.toDouble(0xFFFFFFFCFFFFFFFCL),
Native.toDouble(0xFFFFFFFEFFFFFFFEL),
Native.toDouble(0xFFFFFFFFFFFFFFFFL),
Native.toDouble(0xFFFFFFFEFFFFFFFEL),
Native.toDouble(0xFFFFFFFDFFFFFFFDL),
Native.toDouble(0xFFFFFFFBFFFFFFFBL),
Native.toDouble(0xFFFFFFF7FFFFFFF7L),
Native.toDouble(0xFFFFFFEFFFFFFFEFL),
Native.toDouble(0xFFFFFFDFFFFFFFDFL),
Native.toDouble(0xFFFFFFBFFFFFFFBFL),
Native.toDouble(0xFFFFFF7FFFFFFF7FL),
Native.toDouble(0xFFFFFEFFFFFFFEFFL),
Native.toDouble(0xFFFFFDFFFFFFFDFFL),
Native.toDouble(0xFFFFFBFFFFFFFBFFL),
Native.toDouble(0xFFFFF7FFFFFFF7FFL),
Native.toDouble(0xFFFFEFFFFFFFEFFFL),
Native.toDouble(0xFFFFDFFFFFFFDFFFL),
Native.toDouble(0xFFFFBFFFFFFFBFFFL),
Native.toDouble(0xFFFF7FFFFFFF7FFFL),
Native.toDouble(0xFFFEFFFFFFFEFFFFL),
Native.toDouble(0xFFFDFFFFFFFDFFFFL),
Native.toDouble(0xFFFBFFFFFFFBFFFFL),
Native.toDouble(0xFFF7FFFFFFF7FFFFL),
Native.toDouble(0xFFEFFFFFFFEFFFFFL),
Native.toDouble(0xFFDFFFFFFFDFFFFFL),
Native.toDouble(0xFFBFFFFFFFBFFFFFL),
Native.toDouble(0xFF7FFFFFFF7FFFFFL),
Native.toDouble(0xFEFFFFFFFEFFFFFFL),
Native.toDouble(0xFDFFFFFFFDFFFFFFL),
Native.toDouble(0xFBFFFFFFFBFFFFFFL),
Native.toDouble(0xF7FFFFFFF7FFFFFFL),
Native.toDouble(0xEFFFFFFFEFFFFFFFL),
Native.toDouble(0xDFFFFFFFDFFFFFFFL),
Native.toDouble(0xBFFFFFFFBFFFFFFFL),
Native.toDouble(0x7FFFFFFF7FFFFFFFL),
Native.toDouble(0x3FFFFFFF3FFFFFFFL),
Native.toDouble(0x1FFFFFFF1FFFFFFFL),
Native.toDouble(0x0FFFFFFF0FFFFFFFL),
Native.toDouble(0x07FFFFFF07FFFFFFL),
Native.toDouble(0x03FFFFFF03FFFFFFL),
Native.toDouble(0x01FFFFFF01FFFFFFL),
Native.toDouble(0x00FFFFFF00FFFFFFL),
Native.toDouble(0x007FFFFF007FFFFFL),
Native.toDouble(0x003FFFFF003FFFFFL),
Native.toDouble(0x001FFFFF001FFFFFL),
Native.toDouble(0x000FFFFF000FFFFFL),
Native.toDouble(0x0007FFFF0007FFFFL),
Native.toDouble(0x0003FFFF0003FFFFL),
Native.toDouble(0x0001FFFF0001FFFFL),
Native.toDouble(0x0000FFFF0000FFFFL),
Native.toDouble(0x00007FFF00007FFFL),
Native.toDouble(0x00003FFF00003FFFL),
Native.toDouble(0x00001FFF00001FFFL),
Native.toDouble(0x00000FFF00000FFFL),
Native.toDouble(0x000007FF000007FFL),
Native.toDouble(0x000003FF000003FFL),
Native.toDouble(0x000001FF000001FFL),
Native.toDouble(0x000000FF000000FFL),
Native.toDouble(0x0000007F0000007FL),
Native.toDouble(0x0000003F0000003FL),
Native.toDouble(0x0000001F0000001FL),
Native.toDouble(0x0000000F0000000FL),
Native.toDouble(0x0000000700000007L),
Native.toDouble(0x0000000300000003L),
Native.toDouble(0x8000000080000000L),
Native.toDouble(0x8000000180000001L),
Native.toDouble(0x8000000280000002L),
Native.toDouble(0x8000000480000004L),
Native.toDouble(0x8000000880000008L),
Native.toDouble(0x8000001080000010L),
Native.toDouble(0x8000002080000020L),
Native.toDouble(0x8000004080000040L),
Native.toDouble(0x8000008080000080L),
Native.toDouble(0x8000010080000100L),
Native.toDouble(0x8000020080000200L),
Native.toDouble(0x8000040080000400L),
Native.toDouble(0x8000080080000800L),
Native.toDouble(0x8000100080001000L),
Native.toDouble(0x8000200080002000L),
Native.toDouble(0x8000400080004000L),
Native.toDouble(0x8000800080008000L),
Native.toDouble(0x8001000080010000L),
Native.toDouble(0x8002000080020000L),
Native.toDouble(0x8004000080040000L),
Native.toDouble(0x8008000080080000L),
Native.toDouble(0x8010000080100000L),
Native.toDouble(0x8020000080200000L),
Native.toDouble(0x8040000080400000L),
Native.toDouble(0x8080000080800000L),
Native.toDouble(0x8100000081000000L),
Native.toDouble(0x8200000082000000L),
Native.toDouble(0x8400000084000000L),
Native.toDouble(0x8800000088000000L),
Native.toDouble(0x9000000090000000L),
Native.toDouble(0xA0000000A0000000L),
Native.toDouble(0xC0000000C0000000L),
Native.toDouble(0x8000000080000000L),
Native.toDouble(0xBFFFFFFFBFFFFFFFL),
Native.toDouble(0x9FFFFFFF9FFFFFFFL),
Native.toDouble(0x8FFFFFFF8FFFFFFFL),
Native.toDouble(0x87FFFFFF87FFFFFFL),
Native.toDouble(0x83FFFFFF83FFFFFFL),
Native.toDouble(0x81FFFFFF81FFFFFFL),
Native.toDouble(0x80FFFFFF80FFFFFFL),
Native.toDouble(0x807FFFFF807FFFFFL),
Native.toDouble(0x803FFFFF803FFFFFL),
Native.toDouble(0x801FFFFF801FFFFFL),
Native.toDouble(0x800FFFFF800FFFFFL),
Native.toDouble(0x8007FFFF8007FFFFL),
Native.toDouble(0x8003FFFF8003FFFFL),
Native.toDouble(0x8001FFFF8001FFFFL),
Native.toDouble(0x8000FFFF8000FFFFL),
Native.toDouble(0x80007FFF80007FFFL),
Native.toDouble(0x80003FFF80003FFFL),
Native.toDouble(0x80001FFF80001FFFL),
Native.toDouble(0x80000FFF80000FFFL),
Native.toDouble(0x800007FF800007FFL),
Native.toDouble(0x800003FF800003FFL),
Native.toDouble(0x800001FF800001FFL),
Native.toDouble(0x800000FF800000FFL),
Native.toDouble(0x8000007F8000007FL),
Native.toDouble(0x8000003F8000003FL),
Native.toDouble(0x8000001F8000001FL),
Native.toDouble(0x8000000F8000000FL),
Native.toDouble(0x8000000780000007L),
Native.toDouble(0x8000000380000003L),
Native.toDouble(0xabfb2c81abfb2c81L),
Native.toDouble(0xeb21feceeb21feceL),
Native.toDouble(0x361b388b361b388bL),
Native.toDouble(0x7621d1447621d144L),
Native.toDouble(0x838b1c87838b1c87L),
Native.toDouble(0x4476555a4476555aL),
Native.toDouble(0xac7cc276ac7cc276L),
Native.toDouble(0xec4111feec4111feL),
Native.toDouble(0x83bd1c1b83bd1c1bL),
Native.toDouble(0x43bd69ec43bd69ecL),
Native.toDouble(0xb08711b2b08711b2L),
Native.toDouble(0x70e7fc0170e7fc01L),
Native.toDouble(0xb6c4c126b6c4c126L),
Native.toDouble(0xf84a5aedf84a5aedL),
Native.toDouble(0x9e1b55f99e1b55f9L),
Native.toDouble(0x5e99b6605e99b660L),
Native.toDouble(0xbfc02e00bfc02e00L),
Native.toDouble(0xc2020300c2020300L),
Native.toDouble(0xc22a0300c22a0300L),
Native.toDouble(0xc2020300c2020300L),
Native.toDouble(0xc1780200c1780200L),
Native.toDouble(0xc1e40400c1e40400L),
Native.toDouble(0xbfc02c00bfc02c00L),
Native.toDouble(0xc1180d00c1180d00L),
Native.toDouble(0xc2df0100c2df0100L),
Native.toDouble(0xc19c0000c19c0000L),
Native.toDouble(0xc2950100c2950100L),
Native.toDouble(0xc2a30100c2a30100L),
Native.toDouble(0xc2c30100c2c30100L),
Native.toDouble(0x3effffff3effffffL)
};
public static void main (String[] args) {
System.out.println("Checking values...");
for (int i=0; i<nums.length; i++) {
System.out.println(Long.toHexString(Double.doubleToLongBits(nums[i])));
}
System.out.println("Testing double precision floating-point operations...");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
System.out.println(Long.toHexString(Double.doubleToLongBits(nums[i] + nums[k])));
}
}
System.out.println("Testing + finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
System.out.println(Long.toHexString(Double.doubleToLongBits(nums[i] - nums[k])));
}
}
System.out.println("Testing - finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
System.out.println(Long.toHexString(Double.doubleToLongBits(nums[i] * nums[k])));
}
}
System.out.println("Testing * finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
System.out.println(Long.toHexString(Double.doubleToLongBits(nums[i] / nums[k])));
}
}
System.out.println("Testing / finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
System.out.println(Long.toHexString(Double.doubleToLongBits(nums[i] % nums[k])));
}
}
System.out.println("Testing % finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
if (nums[i] < nums[k])
System.err.println("true");
else
System.err.println("false");
}
}
System.out.println("Testing < finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
if (nums[i] > nums[k])
System.err.println("true");
else
System.err.println("false");
}
}
System.out.println("Testing > finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
if (nums[i] <= nums[k])
System.err.println("true");
else
System.err.println("false");
}
}
System.out.println("Testing <= finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
if (nums[i] >= nums[k])
System.err.println("true");
else
System.err.println("false");
}
}
System.out.println("Testing >= finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
if (nums[i] == nums[k])
System.err.println("true");
else
System.err.println("false");
}
}
System.out.println("Testing == finished.");
for (int i=0; i<nums.length; i++) {
for (int k=0; k<nums.length; k++) {
if (nums[i] != nums[k])
System.err.println("true");
else
System.err.println("false");
}
}
System.out.println("Testing != finished.");
for (int i=0; i<nums.length; i++) {
System.out.println(Long.toHexString(Double.doubleToLongBits(-(nums[i]))));
}
System.out.println("Testing - finished.");
for (int i=0; i<nums.length; i++) {
System.out.println(Long.toHexString(Double.doubleToLongBits((int)(nums[i]))));
}
System.out.println("Testing (int) finished.");
for (int i=0; i<nums.length; i++) {
System.out.println(Long.toHexString(Double.doubleToLongBits(Math.round(nums[i]))));
}
System.out.println("Testing Math.round finished.");
System.err.println("All tests finished.");
}
}