xref: /aosp_15_r20/art/test/580-checker-fp16/src-art/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker import libcore.util.FP16;
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker public class Main {
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker     public static short FP16_ALT_NAN = (short)(FP16.NaN | 0x0098);
22*795d594fSAndroid Build Coastguard Worker 
Main()23*795d594fSAndroid Build Coastguard Worker     public Main() {
24*795d594fSAndroid Build Coastguard Worker     }
25*795d594fSAndroid Build Coastguard Worker 
TestFP16ToFloatRawIntBits(short half)26*795d594fSAndroid Build Coastguard Worker     public static int TestFP16ToFloatRawIntBits(short half) {
27*795d594fSAndroid Build Coastguard Worker         float f = FP16.toFloat(half);
28*795d594fSAndroid Build Coastguard Worker         // Since in this test class we need to check the integer representing of
29*795d594fSAndroid Build Coastguard Worker         // the actual float NaN values, the floatToRawIntBits() is used instead of
30*795d594fSAndroid Build Coastguard Worker         // floatToIntBits().
31*795d594fSAndroid Build Coastguard Worker         return Float.floatToRawIntBits(f);
32*795d594fSAndroid Build Coastguard Worker     }
33*795d594fSAndroid Build Coastguard Worker 
assertEquals(short expected, short calculated)34*795d594fSAndroid Build Coastguard Worker     public static void assertEquals(short expected, short calculated) {
35*795d594fSAndroid Build Coastguard Worker         if (expected != calculated) {
36*795d594fSAndroid Build Coastguard Worker             throw new Error("Expected: " + expected + ", Calculated: " + calculated);
37*795d594fSAndroid Build Coastguard Worker         }
38*795d594fSAndroid Build Coastguard Worker     }
assertEquals(float expected, float calculated)39*795d594fSAndroid Build Coastguard Worker     public static void assertEquals(float expected, float calculated) {
40*795d594fSAndroid Build Coastguard Worker         if (expected != calculated) {
41*795d594fSAndroid Build Coastguard Worker             throw new Error("Expected: " + expected + ", Calculated: " + calculated);
42*795d594fSAndroid Build Coastguard Worker         }
43*795d594fSAndroid Build Coastguard Worker     }
assertEquals(int expected, int calculated)44*795d594fSAndroid Build Coastguard Worker     public static void assertEquals(int expected, int calculated) {
45*795d594fSAndroid Build Coastguard Worker         if (expected != calculated) {
46*795d594fSAndroid Build Coastguard Worker             throw new Error("Expected: " + expected + ", Calculated: " + calculated);
47*795d594fSAndroid Build Coastguard Worker         }
48*795d594fSAndroid Build Coastguard Worker     }
assertTrue(boolean condition)49*795d594fSAndroid Build Coastguard Worker     static public void assertTrue(boolean condition) {
50*795d594fSAndroid Build Coastguard Worker         if (!condition) {
51*795d594fSAndroid Build Coastguard Worker             throw new Error("condition not true");
52*795d594fSAndroid Build Coastguard Worker         }
53*795d594fSAndroid Build Coastguard Worker     }
54*795d594fSAndroid Build Coastguard Worker 
assertFalse(boolean condition)55*795d594fSAndroid Build Coastguard Worker     static public void assertFalse(boolean condition) {
56*795d594fSAndroid Build Coastguard Worker         if (condition) {
57*795d594fSAndroid Build Coastguard Worker             throw new Error("condition not false");
58*795d594fSAndroid Build Coastguard Worker         }
59*795d594fSAndroid Build Coastguard Worker     }
60*795d594fSAndroid Build Coastguard Worker 
testHalfToFloatToHalfConversions()61*795d594fSAndroid Build Coastguard Worker     public static void testHalfToFloatToHalfConversions(){
62*795d594fSAndroid Build Coastguard Worker         // Test FP16 to float and back to Half for all possible Short values
63*795d594fSAndroid Build Coastguard Worker         for (short h = Short.MIN_VALUE; h < Short.MAX_VALUE; h++) {
64*795d594fSAndroid Build Coastguard Worker             if (FP16.isNaN(h)) {
65*795d594fSAndroid Build Coastguard Worker                 // NaN inputs are tested below.
66*795d594fSAndroid Build Coastguard Worker                 continue;
67*795d594fSAndroid Build Coastguard Worker             }
68*795d594fSAndroid Build Coastguard Worker             assertEquals(h, FP16.toHalf(FP16.toFloat(h)));
69*795d594fSAndroid Build Coastguard Worker         }
70*795d594fSAndroid Build Coastguard Worker     }
71*795d594fSAndroid Build Coastguard Worker 
testToHalf()72*795d594fSAndroid Build Coastguard Worker     public static void testToHalf(){
73*795d594fSAndroid Build Coastguard Worker         // These asserts check some known values and edge cases for FP16.toHalf
74*795d594fSAndroid Build Coastguard Worker         // and have been inspired by the cts HalfTest.
75*795d594fSAndroid Build Coastguard Worker         // Zeroes, NaN and infinities
76*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.toHalf(0.0f));
77*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_ZERO, FP16.toHalf(-0.0f));
78*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.toHalf(Float.NaN));
79*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_INFINITY, FP16.toHalf(Float.POSITIVE_INFINITY));
80*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_INFINITY, FP16.toHalf(Float.NEGATIVE_INFINITY));
81*795d594fSAndroid Build Coastguard Worker         // Known values
82*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x3c01, FP16.toHalf(1.0009765625f));
83*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0xc000, FP16.toHalf(-2.0f));
84*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x0400, FP16.toHalf(6.10352e-5f));
85*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x7bff, FP16.toHalf(65504.0f));
86*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x3555, FP16.toHalf(1.0f / 3.0f));
87*795d594fSAndroid Build Coastguard Worker         // Subnormals
88*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x03ff, FP16.toHalf(6.09756e-5f));
89*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.MIN_VALUE, FP16.toHalf(5.96046e-8f));
90*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x83ff, FP16.toHalf(-6.09756e-5f));
91*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x8001, FP16.toHalf(-5.96046e-8f));
92*795d594fSAndroid Build Coastguard Worker         // Subnormals (flushed to +/-0)
93*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.toHalf(5.96046e-9f));
94*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_ZERO, FP16.toHalf(-5.96046e-9f));
95*795d594fSAndroid Build Coastguard Worker         // Test for values that overflow the mantissa bits into exp bits
96*795d594fSAndroid Build Coastguard Worker         assertEquals(0x1000, FP16.toHalf(Float.intBitsToFloat(0x39fff000)));
97*795d594fSAndroid Build Coastguard Worker         assertEquals(0x0400, FP16.toHalf(Float.intBitsToFloat(0x387fe000)));
98*795d594fSAndroid Build Coastguard Worker         // Floats with absolute value above +/-65519 are rounded to +/-inf
99*795d594fSAndroid Build Coastguard Worker         // when using round-to-even
100*795d594fSAndroid Build Coastguard Worker         assertEquals(0x7bff, FP16.toHalf(65519.0f));
101*795d594fSAndroid Build Coastguard Worker         assertEquals(0x7bff, FP16.toHalf(65519.9f));
102*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_INFINITY, FP16.toHalf(65520.0f));
103*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_INFINITY, FP16.toHalf(-65520.0f));
104*795d594fSAndroid Build Coastguard Worker         // Check if numbers are rounded to nearest even when they
105*795d594fSAndroid Build Coastguard Worker         // cannot be accurately represented by Half
106*795d594fSAndroid Build Coastguard Worker         assertEquals(0x6800, FP16.toHalf(2049.0f));
107*795d594fSAndroid Build Coastguard Worker         assertEquals(0x6c00, FP16.toHalf(4098.0f));
108*795d594fSAndroid Build Coastguard Worker         assertEquals(0x7000, FP16.toHalf(8196.0f));
109*795d594fSAndroid Build Coastguard Worker         assertEquals(0x7400, FP16.toHalf(16392.0f));
110*795d594fSAndroid Build Coastguard Worker         assertEquals(0x7800, FP16.toHalf(32784.0f));
111*795d594fSAndroid Build Coastguard Worker 
112*795d594fSAndroid Build Coastguard Worker     }
113*795d594fSAndroid Build Coastguard Worker 
testToFloat()114*795d594fSAndroid Build Coastguard Worker     public static void testToFloat(){
115*795d594fSAndroid Build Coastguard Worker         // FP16 SNaN/QNaN inputs to float
116*795d594fSAndroid Build Coastguard Worker         // The most significant bit of mantissa:
117*795d594fSAndroid Build Coastguard Worker         //                 V
118*795d594fSAndroid Build Coastguard Worker         // 0xfc01: 1 11111 0000000001 (signaling NaN)
119*795d594fSAndroid Build Coastguard Worker         // 0xfdff: 1 11111 0111111111 (signaling NaN)
120*795d594fSAndroid Build Coastguard Worker         // 0xfe00: 1 11111 1000000000 (quiet NaN)
121*795d594fSAndroid Build Coastguard Worker         // 0xffff: 1 11111 1111111111 (quiet NaN)
122*795d594fSAndroid Build Coastguard Worker         // This test is inspired by Java implementation of android.util.Half.toFloat(),
123*795d594fSAndroid Build Coastguard Worker         // where the implementation performs SNaN->QNaN conversion.
124*795d594fSAndroid Build Coastguard Worker         assert(Float.isNaN(FP16.toFloat((short)0xfc01)));
125*795d594fSAndroid Build Coastguard Worker         assert(Float.isNaN(FP16.toFloat((short)0xfdff)));
126*795d594fSAndroid Build Coastguard Worker         assert(Float.isNaN(FP16.toFloat((short)0xfe00)));
127*795d594fSAndroid Build Coastguard Worker         assert(Float.isNaN(FP16.toFloat((short)0xffff)));
128*795d594fSAndroid Build Coastguard Worker         assertEquals(0xffc02000, TestFP16ToFloatRawIntBits((short)(0xfc01)));  // SNaN->QNaN
129*795d594fSAndroid Build Coastguard Worker         assertEquals(0xffffe000, TestFP16ToFloatRawIntBits((short)(0xfdff)));  // SNaN->QNaN
130*795d594fSAndroid Build Coastguard Worker         assertEquals(0xffc00000, TestFP16ToFloatRawIntBits((short)(0xfe00)));  // QNaN->QNaN
131*795d594fSAndroid Build Coastguard Worker         assertEquals(0xffffe000, TestFP16ToFloatRawIntBits((short)(0xffff)));  // QNaN->QNaN
132*795d594fSAndroid Build Coastguard Worker     }
133*795d594fSAndroid Build Coastguard Worker 
testFloor()134*795d594fSAndroid Build Coastguard Worker     public static void testFloor() {
135*795d594fSAndroid Build Coastguard Worker         // These tests have been taken from the cts HalfTest
136*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_INFINITY, FP16.floor(FP16.POSITIVE_INFINITY));
137*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_INFINITY, FP16.floor(FP16.NEGATIVE_INFINITY));
138*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.floor(FP16.POSITIVE_ZERO));
139*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_ZERO, FP16.floor(FP16.NEGATIVE_ZERO));
140*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.floor(FP16.NaN));
141*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.LOWEST_VALUE, FP16.floor(FP16.LOWEST_VALUE));
142*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.floor(FP16.MIN_NORMAL));
143*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.floor((short) 0x3ff));
144*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.floor(FP16.toHalf(0.2f)));
145*795d594fSAndroid Build Coastguard Worker         assertEquals(-1.0f, FP16.toFloat(FP16.floor(FP16.toHalf(-0.2f))));
146*795d594fSAndroid Build Coastguard Worker         assertEquals(-1.0f, FP16.toFloat(FP16.floor(FP16.toHalf(-0.7f))));
147*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.floor(FP16.toHalf(0.7f)));
148*795d594fSAndroid Build Coastguard Worker         assertEquals(124.0f, FP16.toFloat(FP16.floor(FP16.toHalf(124.7f))));
149*795d594fSAndroid Build Coastguard Worker         assertEquals(-125.0f, FP16.toFloat(FP16.floor(FP16.toHalf(-124.7f))));
150*795d594fSAndroid Build Coastguard Worker         assertEquals(124.0f, FP16.toFloat(FP16.floor(FP16.toHalf(124.2f))));
151*795d594fSAndroid Build Coastguard Worker         assertEquals(-125.0f, FP16.toFloat(FP16.floor(FP16.toHalf(-124.2f))));
152*795d594fSAndroid Build Coastguard Worker         // floor for NaN values
153*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x7e01, FP16.floor((short) 0x7c01));
154*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x7f00, FP16.floor((short) 0x7d00));
155*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0xfe01, FP16.floor((short) 0xfc01));
156*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0xff00, FP16.floor((short) 0xfd00));
157*795d594fSAndroid Build Coastguard Worker     }
158*795d594fSAndroid Build Coastguard Worker 
testCeil()159*795d594fSAndroid Build Coastguard Worker     public static void testCeil() {
160*795d594fSAndroid Build Coastguard Worker         // These tests have been taken from the cts HalfTest
161*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_INFINITY, FP16.ceil(FP16.POSITIVE_INFINITY));
162*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_INFINITY, FP16.ceil(FP16.NEGATIVE_INFINITY));
163*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.ceil(FP16.POSITIVE_ZERO));
164*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_ZERO, FP16.ceil(FP16.NEGATIVE_ZERO));
165*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.ceil(FP16.NaN));
166*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.LOWEST_VALUE, FP16.ceil(FP16.LOWEST_VALUE));
167*795d594fSAndroid Build Coastguard Worker         assertEquals(1.0f, FP16.toFloat(FP16.ceil(FP16.MIN_NORMAL)));
168*795d594fSAndroid Build Coastguard Worker         assertEquals(1.0f, FP16.toFloat(FP16.ceil((short) 0x3ff)));
169*795d594fSAndroid Build Coastguard Worker         assertEquals(1.0f, FP16.toFloat(FP16.ceil(FP16.toHalf(0.2f))));
170*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_ZERO, FP16.ceil(FP16.toHalf(-0.2f)));
171*795d594fSAndroid Build Coastguard Worker         assertEquals(1.0f, FP16.toFloat(FP16.ceil(FP16.toHalf(0.7f))));
172*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_ZERO, FP16.ceil(FP16.toHalf(-0.7f)));
173*795d594fSAndroid Build Coastguard Worker         assertEquals(125.0f, FP16.toFloat(FP16.ceil(FP16.toHalf(124.7f))));
174*795d594fSAndroid Build Coastguard Worker         assertEquals(-124.0f, FP16.toFloat(FP16.ceil(FP16.toHalf(-124.7f))));
175*795d594fSAndroid Build Coastguard Worker         assertEquals(125.0f, FP16.toFloat(FP16.ceil(FP16.toHalf(124.2f))));
176*795d594fSAndroid Build Coastguard Worker         assertEquals(-124.0f, FP16.toFloat(FP16.ceil(FP16.toHalf(-124.2f))));
177*795d594fSAndroid Build Coastguard Worker         // ceil for NaN values
178*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x7e01, FP16.floor((short) 0x7c01));
179*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x7f00, FP16.floor((short) 0x7d00));
180*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0xfe01, FP16.floor((short) 0xfc01));
181*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0xff00, FP16.floor((short) 0xfd00));
182*795d594fSAndroid Build Coastguard Worker     }
183*795d594fSAndroid Build Coastguard Worker 
testRint()184*795d594fSAndroid Build Coastguard Worker     public static void testRint() {
185*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_INFINITY, FP16.rint(FP16.POSITIVE_INFINITY));
186*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_INFINITY, FP16.rint(FP16.NEGATIVE_INFINITY));
187*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.rint(FP16.POSITIVE_ZERO));
188*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_ZERO, FP16.rint(FP16.NEGATIVE_ZERO));
189*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.rint(FP16.NaN));
190*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.LOWEST_VALUE, FP16.rint(FP16.LOWEST_VALUE));
191*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.rint(FP16.MIN_VALUE));
192*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.rint((short) 0x200));
193*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.rint((short) 0x3ff));
194*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.POSITIVE_ZERO, FP16.rint(FP16.toHalf(0.2f)));
195*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NEGATIVE_ZERO, FP16.rint(FP16.toHalf(-0.2f)));
196*795d594fSAndroid Build Coastguard Worker         assertEquals(1.0f, FP16.toFloat(FP16.rint(FP16.toHalf(0.7f))));
197*795d594fSAndroid Build Coastguard Worker         assertEquals(-1.0f, FP16.toFloat(FP16.rint(FP16.toHalf(-0.7f))));
198*795d594fSAndroid Build Coastguard Worker         assertEquals(0.0f, FP16.toFloat(FP16.rint(FP16.toHalf(0.5f))));
199*795d594fSAndroid Build Coastguard Worker         assertEquals(-0.0f, FP16.toFloat(FP16.rint(FP16.toHalf(-0.5f))));
200*795d594fSAndroid Build Coastguard Worker         assertEquals(125.0f, FP16.toFloat(FP16.rint(FP16.toHalf(124.7f))));
201*795d594fSAndroid Build Coastguard Worker         assertEquals(-125.0f, FP16.toFloat(FP16.rint(FP16.toHalf(-124.7f))));
202*795d594fSAndroid Build Coastguard Worker         assertEquals(124.0f, FP16.toFloat(FP16.rint(FP16.toHalf(124.2f))));
203*795d594fSAndroid Build Coastguard Worker         assertEquals(-124.0f, FP16.toFloat(FP16.rint(FP16.toHalf(-124.2f))));
204*795d594fSAndroid Build Coastguard Worker         // floor for NaN values
205*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x7e01, FP16.floor((short) 0x7c01));
206*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0x7f00, FP16.floor((short) 0x7d00));
207*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0xfe01, FP16.floor((short) 0xfc01));
208*795d594fSAndroid Build Coastguard Worker         assertEquals((short) 0xff00, FP16.floor((short) 0xfd00));
209*795d594fSAndroid Build Coastguard Worker 
210*795d594fSAndroid Build Coastguard Worker     }
211*795d594fSAndroid Build Coastguard Worker 
testGreater()212*795d594fSAndroid Build Coastguard Worker     public static void testGreater() {
213*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.POSITIVE_INFINITY, FP16.NEGATIVE_INFINITY));
214*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.POSITIVE_INFINITY, FP16.MAX_VALUE));
215*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.MAX_VALUE, FP16.POSITIVE_INFINITY));
216*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.NEGATIVE_INFINITY, FP16.LOWEST_VALUE));
217*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.LOWEST_VALUE, FP16.NEGATIVE_INFINITY));
218*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.NEGATIVE_ZERO, FP16.POSITIVE_ZERO));
219*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.POSITIVE_ZERO, FP16.NEGATIVE_ZERO));
220*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(12.3f), FP16.NaN));
221*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.NaN, FP16.toHalf(12.3f)));
222*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.MIN_NORMAL, FP16.MIN_VALUE));
223*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.MIN_VALUE, FP16.MIN_NORMAL));
224*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.toHalf(12.4f), FP16.toHalf(12.3f)));
225*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(12.3f), FP16.toHalf(12.4f)));
226*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(-12.4f), FP16.toHalf(-12.3f)));
227*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.toHalf(-12.3f), FP16.toHalf(-12.4f)));
228*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater((short) 0x3ff, FP16.MIN_VALUE));
229*795d594fSAndroid Build Coastguard Worker 
230*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(-1.0f), FP16.toHalf(0.0f)));
231*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.toHalf(0.0f), FP16.toHalf(-1.0f)));
232*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(-1.0f), FP16.toHalf(-1.0f)));
233*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(-1.3f), FP16.toHalf(-1.3f)));
234*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.toHalf(1.0f), FP16.toHalf(0.0f)));
235*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(0.0f), FP16.toHalf(1.0f)));
236*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(1.0f), FP16.toHalf(1.0f)));
237*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(1.3f), FP16.toHalf(1.3f)));
238*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(-0.1f), FP16.toHalf(0.0f)));
239*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.toHalf(0.0f), FP16.toHalf(-0.1f)));
240*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(-0.1f), FP16.toHalf(-0.1f)));
241*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greater(FP16.toHalf(0.1f), FP16.toHalf(0.0f)));
242*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(0.0f), FP16.toHalf(0.1f)));
243*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greater(FP16.toHalf(0.1f), FP16.toHalf(0.1f)));
244*795d594fSAndroid Build Coastguard Worker     }
245*795d594fSAndroid Build Coastguard Worker 
testGreaterEquals()246*795d594fSAndroid Build Coastguard Worker     public static void testGreaterEquals() {
247*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.POSITIVE_INFINITY, FP16.NEGATIVE_INFINITY));
248*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.POSITIVE_INFINITY, FP16.MAX_VALUE));
249*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.MAX_VALUE, FP16.POSITIVE_INFINITY));
250*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.NEGATIVE_INFINITY, FP16.LOWEST_VALUE));
251*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.LOWEST_VALUE, FP16.NEGATIVE_INFINITY));
252*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.NEGATIVE_ZERO, FP16.POSITIVE_ZERO));
253*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.POSITIVE_ZERO, FP16.NEGATIVE_ZERO));
254*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.toHalf(12.3f), FP16.NaN));
255*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.NaN, FP16.toHalf(12.3f)));
256*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.MIN_NORMAL, FP16.MIN_VALUE));
257*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.MIN_VALUE, FP16.MIN_NORMAL));
258*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(12.4f), FP16.toHalf(12.3f)));
259*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.toHalf(12.3f), FP16.toHalf(12.4f)));
260*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.toHalf(-12.4f), FP16.toHalf(-12.3f)));
261*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(-12.3f), FP16.toHalf(-12.4f)));
262*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals((short) 0x3ff, FP16.MIN_VALUE));
263*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.NEGATIVE_INFINITY, FP16.NEGATIVE_INFINITY));
264*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.POSITIVE_INFINITY, FP16.POSITIVE_INFINITY));
265*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(12.12356f), FP16.toHalf(12.12356f)));
266*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(-12.12356f), FP16.toHalf(-12.12356f)));
267*795d594fSAndroid Build Coastguard Worker 
268*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.toHalf(-1.0f), FP16.toHalf(0.0f)));
269*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(0.0f), FP16.toHalf(-1.0f)));
270*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(-1.0f), FP16.toHalf(-1.0f)));
271*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(-1.3f), FP16.toHalf(-1.3f)));
272*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(1.0f), FP16.toHalf(0.0f)));
273*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.toHalf(0.0f), FP16.toHalf(1.0f)));
274*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(1.0f), FP16.toHalf(1.0f)));
275*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(1.3f), FP16.toHalf(1.3f)));
276*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.toHalf(-0.1f), FP16.toHalf(0.0f)));
277*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(0.0f), FP16.toHalf(-0.1f)));
278*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(-0.1f), FP16.toHalf(-0.1f)));
279*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(0.1f), FP16.toHalf(0.0f)));
280*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.greaterEquals(FP16.toHalf(0.0f), FP16.toHalf(0.1f)));
281*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.greaterEquals(FP16.toHalf(0.1f), FP16.toHalf(0.1f)));
282*795d594fSAndroid Build Coastguard Worker     }
283*795d594fSAndroid Build Coastguard Worker 
testLess()284*795d594fSAndroid Build Coastguard Worker     public static void testLess() {
285*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.NEGATIVE_INFINITY, FP16.POSITIVE_INFINITY));
286*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.MAX_VALUE, FP16.POSITIVE_INFINITY));
287*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.POSITIVE_INFINITY, FP16.MAX_VALUE));
288*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.LOWEST_VALUE, FP16.NEGATIVE_INFINITY));
289*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.NEGATIVE_INFINITY, FP16.LOWEST_VALUE));
290*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.POSITIVE_ZERO, FP16.NEGATIVE_ZERO));
291*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.NEGATIVE_ZERO, FP16.POSITIVE_ZERO));
292*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.NaN, FP16.toHalf(12.3f)));
293*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(12.3f), FP16.NaN));
294*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.MIN_VALUE, FP16.MIN_NORMAL));
295*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.MIN_NORMAL, FP16.MIN_VALUE));
296*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.toHalf(12.3f), FP16.toHalf(12.4f)));
297*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(12.4f), FP16.toHalf(12.3f)));
298*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(-12.3f), FP16.toHalf(-12.4f)));
299*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.toHalf(-12.4f), FP16.toHalf(-12.3f)));
300*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.MIN_VALUE, (short) 0x3ff));
301*795d594fSAndroid Build Coastguard Worker 
302*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.toHalf(-1.0f), FP16.toHalf(0.0f)));
303*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(0.0f), FP16.toHalf(-1.0f)));
304*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(-1.0f), FP16.toHalf(-1.0f)));
305*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(-1.3f), FP16.toHalf(-1.3f)));
306*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(1.0f), FP16.toHalf(0.0f)));
307*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.toHalf(0.0f), FP16.toHalf(1.0f)));
308*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(1.0f), FP16.toHalf(1.0f)));
309*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(1.3f), FP16.toHalf(1.3f)));
310*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.toHalf(-0.1f), FP16.toHalf(0.0f)));
311*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(0.0f), FP16.toHalf(-0.1f)));
312*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(-0.1f), FP16.toHalf(-0.1f)));
313*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(0.1f), FP16.toHalf(0.0f)));
314*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.less(FP16.toHalf(0.0f), FP16.toHalf(0.1f)));
315*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.less(FP16.toHalf(0.1f), FP16.toHalf(0.1f)));
316*795d594fSAndroid Build Coastguard Worker     }
317*795d594fSAndroid Build Coastguard Worker 
testLessEquals()318*795d594fSAndroid Build Coastguard Worker     public static void testLessEquals() {
319*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.NEGATIVE_INFINITY, FP16.POSITIVE_INFINITY));
320*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.MAX_VALUE, FP16.POSITIVE_INFINITY));
321*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.POSITIVE_INFINITY, FP16.MAX_VALUE));
322*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.LOWEST_VALUE, FP16.NEGATIVE_INFINITY));
323*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.NEGATIVE_INFINITY, FP16.LOWEST_VALUE));
324*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.POSITIVE_ZERO, FP16.NEGATIVE_ZERO));
325*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.NEGATIVE_ZERO, FP16.POSITIVE_ZERO));
326*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.NaN, FP16.toHalf(12.3f)));
327*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.toHalf(12.3f), FP16.NaN));
328*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.MIN_VALUE, FP16.MIN_NORMAL));
329*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.MIN_NORMAL, FP16.MIN_VALUE));
330*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(12.3f), FP16.toHalf(12.4f)));
331*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.toHalf(12.4f), FP16.toHalf(12.3f)));
332*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.toHalf(-12.3f), FP16.toHalf(-12.4f)));
333*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(-12.4f), FP16.toHalf(-12.3f)));
334*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.MIN_VALUE, (short) 0x3ff));
335*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.NEGATIVE_INFINITY, FP16.NEGATIVE_INFINITY));
336*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.POSITIVE_INFINITY, FP16.POSITIVE_INFINITY));
337*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(12.12356f), FP16.toHalf(12.12356f)));
338*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(-12.12356f), FP16.toHalf(-12.12356f)));
339*795d594fSAndroid Build Coastguard Worker 
340*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(-1.0f), FP16.toHalf(0.0f)));
341*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.toHalf(0.0f), FP16.toHalf(-1.0f)));
342*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(-1.0f), FP16.toHalf(-1.0f)));
343*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(-1.3f), FP16.toHalf(-1.3f)));
344*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.toHalf(1.0f), FP16.toHalf(0.0f)));
345*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(0.0f), FP16.toHalf(1.0f)));
346*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(1.0f), FP16.toHalf(1.0f)));
347*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(1.3f), FP16.toHalf(1.3f)));
348*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(-0.1f), FP16.toHalf(0.0f)));
349*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.toHalf(0.0f), FP16.toHalf(-0.1f)));
350*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(-0.1f), FP16.toHalf(-0.1f)));
351*795d594fSAndroid Build Coastguard Worker         assertFalse(FP16.lessEquals(FP16.toHalf(0.1f), FP16.toHalf(0.0f)));
352*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(0.0f), FP16.toHalf(0.1f)));
353*795d594fSAndroid Build Coastguard Worker         assertTrue(FP16.lessEquals(FP16.toHalf(0.1f), FP16.toHalf(0.1f)));
354*795d594fSAndroid Build Coastguard Worker     }
355*795d594fSAndroid Build Coastguard Worker 
testCompare()356*795d594fSAndroid Build Coastguard Worker     public static void testCompare() {
357*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.NaN, FP16.NaN));
358*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.NaN, FP16_ALT_NAN));
359*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16_ALT_NAN, FP16.NaN));
360*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.POSITIVE_INFINITY));
361*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.POSITIVE_INFINITY, FP16.NaN));
362*795d594fSAndroid Build Coastguard Worker 
363*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.POSITIVE_INFINITY, FP16.POSITIVE_INFINITY));
364*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.NEGATIVE_INFINITY, FP16.NEGATIVE_INFINITY));
365*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.POSITIVE_INFINITY, FP16.NEGATIVE_INFINITY));
366*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_INFINITY, FP16.POSITIVE_INFINITY));
367*795d594fSAndroid Build Coastguard Worker 
368*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.POSITIVE_ZERO, FP16.POSITIVE_ZERO));
369*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.NEGATIVE_ZERO, FP16.NEGATIVE_ZERO));
370*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.POSITIVE_ZERO, FP16.NEGATIVE_ZERO));
371*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_ZERO, FP16.POSITIVE_ZERO));
372*795d594fSAndroid Build Coastguard Worker 
373*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.toHalf(12.462f), FP16.toHalf(12.462f)));
374*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.toHalf(-12.462f), FP16.toHalf(-12.462f)));
375*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.toHalf(12.462f), FP16.toHalf(-12.462f)));
376*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.toHalf(-12.462f), FP16.toHalf(12.462f)));
377*795d594fSAndroid Build Coastguard Worker 
378*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.toHalf(12.462f)));
379*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.toHalf(-12.462f)));
380*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.EPSILON));
381*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.LOWEST_VALUE));
382*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.MAX_VALUE));
383*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.MIN_NORMAL));
384*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.MIN_VALUE));
385*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.NEGATIVE_INFINITY));
386*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.NEGATIVE_ZERO));
387*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NaN, FP16.POSITIVE_ZERO));
388*795d594fSAndroid Build Coastguard Worker 
389*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.toHalf(12.462f), FP16.NaN));
390*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.toHalf(-12.462f), FP16.NaN));
391*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.EPSILON, FP16.NaN));
392*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.LOWEST_VALUE, FP16.NaN));
393*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.MAX_VALUE, FP16.NaN));
394*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.MIN_NORMAL, FP16.NaN));
395*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.MIN_VALUE, FP16.NaN));
396*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_INFINITY, FP16.NaN));
397*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_ZERO, FP16.NaN));
398*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.POSITIVE_ZERO, FP16.NaN));
399*795d594fSAndroid Build Coastguard Worker 
400*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.POSITIVE_INFINITY, FP16.NEGATIVE_ZERO));
401*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.POSITIVE_INFINITY, FP16.POSITIVE_ZERO));
402*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.POSITIVE_INFINITY, FP16.toHalf(12.462f)));
403*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.POSITIVE_INFINITY, FP16.toHalf(-12.462f)));
404*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_INFINITY, FP16.toHalf(12.462f)));
405*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_INFINITY, FP16.toHalf(-12.462f)));
406*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_INFINITY, FP16.NEGATIVE_ZERO));
407*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_INFINITY, FP16.POSITIVE_ZERO));
408*795d594fSAndroid Build Coastguard Worker 
409*795d594fSAndroid Build Coastguard Worker         assertEquals(-1, FP16.compare(FP16.NEGATIVE_ZERO, FP16.toHalf(12.462f)));
410*795d594fSAndroid Build Coastguard Worker         assertEquals(1, FP16.compare(FP16.NEGATIVE_ZERO, FP16.toHalf(-12.462f)));
411*795d594fSAndroid Build Coastguard Worker     }
412*795d594fSAndroid Build Coastguard Worker 
413*795d594fSAndroid Build Coastguard Worker     /// CHECK-START-ARM64: void Main.testCheckCompare() disassembly (after)
414*795d594fSAndroid Build Coastguard Worker     /// CHECK-IF: hasIsaFeature("fp16")
415*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 InvokeStaticOrDirect intrinsic:FP16Compare
416*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 fcmp {{h\d+}}, {{h\d+}}
417*795d594fSAndroid Build Coastguard Worker     /// CHECK-ELSE:
418*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 InvokeStaticOrDirect intrinsic:FP16Compare
419*795d594fSAndroid Build Coastguard Worker     ///      CHECK-NOT:             fcmp {{h\d+}}, {{h\d+}}
420*795d594fSAndroid Build Coastguard Worker     /// CHECK-FI:
421*795d594fSAndroid Build Coastguard Worker 
testCheckCompare()422*795d594fSAndroid Build Coastguard Worker     public static void testCheckCompare() {
423*795d594fSAndroid Build Coastguard Worker         assertEquals(0, FP16.compare(FP16.toHalf(12.462f), FP16.toHalf(12.462f)));
424*795d594fSAndroid Build Coastguard Worker     }
425*795d594fSAndroid Build Coastguard Worker 
assertMinPermutations(short small, short large)426*795d594fSAndroid Build Coastguard Worker     public static void assertMinPermutations(short small, short large){
427*795d594fSAndroid Build Coastguard Worker         assertEquals(small, FP16.min(small, large));
428*795d594fSAndroid Build Coastguard Worker         assertEquals(small, FP16.min(large, small));
429*795d594fSAndroid Build Coastguard Worker 
430*795d594fSAndroid Build Coastguard Worker         assertEquals(small, FP16.min(small, small));
431*795d594fSAndroid Build Coastguard Worker         assertEquals(large, FP16.min(large, large));
432*795d594fSAndroid Build Coastguard Worker     }
433*795d594fSAndroid Build Coastguard Worker 
testMin()434*795d594fSAndroid Build Coastguard Worker     public static void testMin() {
435*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.NEGATIVE_INFINITY, FP16.POSITIVE_INFINITY);
436*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.NEGATIVE_ZERO,FP16.POSITIVE_ZERO);
437*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.NEGATIVE_INFINITY, FP16.LOWEST_VALUE);
438*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.MAX_VALUE, FP16.POSITIVE_INFINITY);
439*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.MIN_VALUE, FP16.MIN_NORMAL);
440*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.POSITIVE_ZERO, FP16.MIN_VALUE);
441*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.POSITIVE_ZERO, FP16.MIN_NORMAL);
442*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.toHalf(-3.456f), FP16.toHalf(-3.453f));
443*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.toHalf(3.453f), FP16.toHalf(3.456f));
444*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.toHalf(-3.456f), FP16.toHalf(3.456f));
445*795d594fSAndroid Build Coastguard Worker         assertMinPermutations(FP16.NaN, FP16.LOWEST_VALUE);
446*795d594fSAndroid Build Coastguard Worker 
447*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.min(FP16.NaN, FP16_ALT_NAN));
448*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.min(FP16_ALT_NAN, FP16.NaN));
449*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.min(FP16.NaN, FP16.NaN));
450*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.min(FP16_ALT_NAN, FP16_ALT_NAN));
451*795d594fSAndroid Build Coastguard Worker     }
452*795d594fSAndroid Build Coastguard Worker 
453*795d594fSAndroid Build Coastguard Worker     /// CHECK-START-ARM64: void Main.testCheckMin() disassembly (after)
454*795d594fSAndroid Build Coastguard Worker     /// CHECK-IF: hasIsaFeature("fp16")
455*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 InvokeStaticOrDirect intrinsic:FP16Min
456*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 fcmp {{h\d+}}, {{h\d+}}
457*795d594fSAndroid Build Coastguard Worker     /// CHECK-ELSE:
458*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 InvokeStaticOrDirect intrinsic:FP16Min
459*795d594fSAndroid Build Coastguard Worker     ///      CHECK-NOT:             fcmp {{h\d+}}, {{h\d+}}
460*795d594fSAndroid Build Coastguard Worker     /// CHECK-FI:
testCheckMin()461*795d594fSAndroid Build Coastguard Worker     public static void testCheckMin() {
462*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.toHalf(-3.456f), FP16.min(FP16.toHalf(-3.456f), FP16.toHalf(-3.453f)));
463*795d594fSAndroid Build Coastguard Worker     }
464*795d594fSAndroid Build Coastguard Worker 
assertMaxPermutations(short small, short large)465*795d594fSAndroid Build Coastguard Worker     public static void assertMaxPermutations(short small, short large){
466*795d594fSAndroid Build Coastguard Worker         assertEquals(large, FP16.max(small, large));
467*795d594fSAndroid Build Coastguard Worker         assertEquals(large, FP16.max(large, small));
468*795d594fSAndroid Build Coastguard Worker 
469*795d594fSAndroid Build Coastguard Worker         assertEquals(small, FP16.max(small, small));
470*795d594fSAndroid Build Coastguard Worker         assertEquals(large, FP16.max(large, large));
471*795d594fSAndroid Build Coastguard Worker     }
472*795d594fSAndroid Build Coastguard Worker 
testMax()473*795d594fSAndroid Build Coastguard Worker     public static void testMax() {
474*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.NEGATIVE_INFINITY, FP16.POSITIVE_INFINITY);
475*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.NEGATIVE_ZERO,FP16.POSITIVE_ZERO);
476*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.NEGATIVE_INFINITY, FP16.LOWEST_VALUE);
477*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.MAX_VALUE, FP16.POSITIVE_INFINITY);
478*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.MIN_VALUE, FP16.MIN_NORMAL);
479*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.POSITIVE_ZERO, FP16.MIN_VALUE);
480*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.POSITIVE_ZERO, FP16.MIN_NORMAL);
481*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.toHalf(-3.456f), FP16.toHalf(-3.453f));
482*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.toHalf(3.453f), FP16.toHalf(3.456f));
483*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.toHalf(-3.456f), FP16.toHalf(3.456f));
484*795d594fSAndroid Build Coastguard Worker         assertMaxPermutations(FP16.MAX_VALUE, FP16.NaN);
485*795d594fSAndroid Build Coastguard Worker 
486*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.max(FP16.NaN, FP16_ALT_NAN));
487*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.max(FP16_ALT_NAN, FP16.NaN));
488*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.max(FP16.NaN, FP16.NaN));
489*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.NaN, FP16.max(FP16_ALT_NAN, FP16_ALT_NAN));
490*795d594fSAndroid Build Coastguard Worker     }
491*795d594fSAndroid Build Coastguard Worker 
492*795d594fSAndroid Build Coastguard Worker     /// CHECK-START-ARM64: void Main.testCheckMax() disassembly (after)
493*795d594fSAndroid Build Coastguard Worker     /// CHECK-IF: hasIsaFeature("fp16")
494*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 InvokeStaticOrDirect intrinsic:FP16Max
495*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 fcmp {{h\d+}}, {{h\d+}}
496*795d594fSAndroid Build Coastguard Worker     /// CHECK-ELSE:
497*795d594fSAndroid Build Coastguard Worker     ///      CHECK:                 InvokeStaticOrDirect intrinsic:FP16Max
498*795d594fSAndroid Build Coastguard Worker     ///      CHECK-NOT:             fcmp {{h\d+}}, {{h\d+}}
499*795d594fSAndroid Build Coastguard Worker     /// CHECK-FI:
testCheckMax()500*795d594fSAndroid Build Coastguard Worker     public static void testCheckMax() {
501*795d594fSAndroid Build Coastguard Worker         assertEquals(FP16.toHalf(-3.453f), FP16.max(FP16.toHalf(-3.456f), FP16.toHalf(-3.453f)));
502*795d594fSAndroid Build Coastguard Worker     }
503*795d594fSAndroid Build Coastguard Worker 
main(String args[])504*795d594fSAndroid Build Coastguard Worker     public static void main(String args[]) {
505*795d594fSAndroid Build Coastguard Worker         testHalfToFloatToHalfConversions();
506*795d594fSAndroid Build Coastguard Worker         testToHalf();
507*795d594fSAndroid Build Coastguard Worker         testToFloat();
508*795d594fSAndroid Build Coastguard Worker         testFloor();
509*795d594fSAndroid Build Coastguard Worker         testCeil();
510*795d594fSAndroid Build Coastguard Worker         testRint();
511*795d594fSAndroid Build Coastguard Worker         testGreater();
512*795d594fSAndroid Build Coastguard Worker         testGreaterEquals();
513*795d594fSAndroid Build Coastguard Worker         testLessEquals();
514*795d594fSAndroid Build Coastguard Worker         testLess();
515*795d594fSAndroid Build Coastguard Worker         testCompare();
516*795d594fSAndroid Build Coastguard Worker         testCheckCompare();
517*795d594fSAndroid Build Coastguard Worker         testMin();
518*795d594fSAndroid Build Coastguard Worker         testCheckMin();
519*795d594fSAndroid Build Coastguard Worker         testMax();
520*795d594fSAndroid Build Coastguard Worker         testCheckMax();
521*795d594fSAndroid Build Coastguard Worker     }
522*795d594fSAndroid Build Coastguard Worker }
523