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