content: /*
   * Copyright (C) 2014 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  // Note that $opt$ is a marker for the optimizing compiler to test
  // it does compile the method.
  public class Main {
  
    public static void assertByteEquals(byte expected, byte result) {
      if (expected != result) {
        throw new Error("Expected: " + expected + ", found: " + result);
      }
    }
  
    public static void assertShortEquals(short expected, short result) {
      if (expected != result) {
        throw new Error("Expected: " + expected + ", found: " + result);
      }
    }
  
    public static void assertIntEquals(int expected, int result) {
      if (expected != result) {
        throw new Error("Expected: " + expected + ", found: " + result);
      }
    }
  
    public static void assertLongEquals(long expected, long result) {
      if (expected != result) {
        throw new Error("Expected: " + expected + ", found: " + result);
      }
    }
  
    public static void assertCharEquals(char expected, char result) {
      if (expected != result) {
        // Values are cast to int to display numeric values instead of
        // (UTF-16 encoded) characters.
        throw new Error("Expected: " + (int)expected + ", found: " + (int)result);
      }
    }
  
    public static void assertFloatEquals(float expected, float result) {
      if (expected != result) {
        throw new Error("Expected: " + expected + ", found: " + result);
      }
    }
  
    public static void assertDoubleEquals(double expected, double result) {
      if (expected != result) {
        throw new Error("Expected: " + expected + ", found: " + result);
      }
    }
  
    public static void assertFloatIsNaN(float result) {
      if (!Float.isNaN(result)) {
        throw new Error("Expected: NaN, found: " + result);
      }
    }
  
    public static void assertDoubleIsNaN(double result) {
      if (!Double.isNaN(result)) {
        throw new Error("Expected: NaN, found: " + result);
      }
    }
  
  
    public static void main(String[] args) {
      // Generate, compile and check int-to-long Dex instructions.
      byteToLong();
      shortToLong();
      intToLong();
      charToLong();
  
      // Generate, compile and check int-to-float Dex instructions.
      byteToFloat();
      shortToFloat();
      intToFloat();
      charToFloat();
  
      // Generate, compile and check int-to-double Dex instructions.
      byteToDouble();
      shortToDouble();
      intToDouble();
      charToDouble();
  
      // Generate, compile and check long-to-int Dex instructions.
      longToInt();
  
      // Generate, compile and check long-to-float Dex instructions.
      longToFloat();
  
      // Generate, compile and check long-to-double Dex instructions.
      longToDouble();
  
      // Generate, compile and check float-to-int Dex instructions.
      floatToInt();
  
      // Generate, compile and check float-to-long Dex instructions.
      floatToLong();
  
      // Generate, compile and check float-to-double Dex instructions.
      floatToDouble();
  
      // Generate, compile and check double-to-int Dex instructions.
      doubleToInt();
  
      // Generate, compile and check double-to-long Dex instructions.
      doubleToLong();
  
      // Generate, compile and check double-to-float Dex instructions.
      doubleToFloat();
  
      // Generate, compile and check int-to-byte Dex instructions.
      shortToByte();
      intToByte();
      charToByte();
  
      // Generate, compile and check int-to-short Dex instructions.
      byteToShort();
      intToShort();
      charToShort();
  
      // Generate, compile and check int-to-char Dex instructions.
      byteToChar();
      shortToChar();
      intToChar();
    }
  
    private static void byteToLong() {
      assertLongEquals(1L, $opt$noinline$ByteToLong((byte)1));
      assertLongEquals(0L, $opt$noinline$ByteToLong((byte)0));
      assertLongEquals(-1L, $opt$noinline$ByteToLong((byte)-1));
      assertLongEquals(51L, $opt$noinline$ByteToLong((byte)51));
      assertLongEquals(-51L, $opt$noinline$ByteToLong((byte)-51));
      assertLongEquals(127L, $opt$noinline$ByteToLong((byte)127));  // 2^7 - 1
      assertLongEquals(-127L, $opt$noinline$ByteToLong((byte)-127));  // -(2^7 - 1)
      assertLongEquals(-128L, $opt$noinline$ByteToLong((byte)-128));  // -(2^7)
    }
  
    private static void shortToLong() {
      assertLongEquals(1L, $opt$noinline$ShortToLong((short)1));
      assertLongEquals(0L, $opt$noinline$ShortToLong((short)0));
      assertLongEquals(-1L, $opt$noinline$ShortToLong((short)-1));
      assertLongEquals(51L, $opt$noinline$ShortToLong((short)51));
      assertLongEquals(-51L, $opt$noinline$ShortToLong((short)-51));
      assertLongEquals(32767L, $opt$noinline$ShortToLong((short)32767));  // 2^15 - 1
      assertLongEquals(-32767L, $opt$noinline$ShortToLong((short)-32767));  // -(2^15 - 1)
      assertLongEquals(-32768L, $opt$noinline$ShortToLong((short)-32768));  // -(2^15)
    }
  
    private static void intToLong() {
      assertLongEquals(1L, $opt$noinline$IntToLong(1));
      assertLongEquals(0L, $opt$noinline$IntToLong(0));
      assertLongEquals(-1L, $opt$noinline$IntToLong(-1));
      assertLongEquals(51L, $opt$noinline$IntToLong(51));
      assertLongEquals(-51L, $opt$noinline$IntToLong(-51));
      assertLongEquals(2147483647L, $opt$noinline$IntToLong(2147483647));  // 2^31 - 1
      assertLongEquals(-2147483647L, $opt$noinline$IntToLong(-2147483647));  // -(2^31 - 1)
      assertLongEquals(-2147483648L, $opt$noinline$IntToLong(-2147483648));  // -(2^31)
    }
  
    private static void charToLong() {
      assertLongEquals(1L, $opt$noinline$CharToLong((char)1));
      assertLongEquals(0L, $opt$noinline$CharToLong((char)0));
      assertLongEquals(51L, $opt$noinline$CharToLong((char)51));
      assertLongEquals(32767L, $opt$noinline$CharToLong((char)32767));  // 2^15 - 1
      assertLongEquals(65535L, $opt$noinline$CharToLong((char)65535));  // 2^16 - 1
      assertLongEquals(65535L, $opt$noinline$CharToLong((char)-1));
      assertLongEquals(65485L, $opt$noinline$CharToLong((char)-51));
      assertLongEquals(32769L, $opt$noinline$CharToLong((char)-32767));  // -(2^15 - 1)
      assertLongEquals(32768L, $opt$noinline$CharToLong((char)-32768));  // -(2^15)
    }
  
    private static void byteToFloat() {
      assertFloatEquals(1F, $opt$noinline$ByteToFloat((byte)1));
      assertFloatEquals(0F, $opt$noinline$ByteToFloat((byte)0));
      assertFloatEquals(-1F, $opt$noinline$ByteToFloat((byte)-1));
      assertFloatEquals(51F, $opt$noinline$ByteToFloat((byte)51));
      assertFloatEquals(-51F, $opt$noinline$ByteToFloat((byte)-51));
      assertFloatEquals(127F, $opt$noinline$ByteToFloat((byte)127));  // 2^7 - 1
      assertFloatEquals(-127F, $opt$noinline$ByteToFloat((byte)-127));  // -(2^7 - 1)
      assertFloatEquals(-128F, $opt$noinline$ByteToFloat((byte)-128));  // -(2^7)
    }
  
    private static void shortToFloat() {
      assertFloatEquals(1F, $opt$noinline$ShortToFloat((short)1));
      assertFloatEquals(0F, $opt$noinline$ShortToFloat((short)0));
      assertFloatEquals(-1F, $opt$noinline$ShortToFloat((short)-1));
      assertFloatEquals(51F, $opt$noinline$ShortToFloat((short)51));
      assertFloatEquals(-51F, $opt$noinline$ShortToFloat((short)-51));
      assertFloatEquals(32767F, $opt$noinline$ShortToFloat((short)32767));  // 2^15 - 1
      assertFloatEquals(-32767F, $opt$noinline$ShortToFloat((short)-32767));  // -(2^15 - 1)
      assertFloatEquals(-32768F, $opt$noinline$ShortToFloat((short)-32768));  // -(2^15)
    }
  
    private static void intToFloat() {
      assertFloatEquals(1F, $opt$noinline$IntToFloat(1));
      assertFloatEquals(0F, $opt$noinline$IntToFloat(0));
      assertFloatEquals(-1F, $opt$noinline$IntToFloat(-1));
      assertFloatEquals(51F, $opt$noinline$IntToFloat(51));
      assertFloatEquals(-51F, $opt$noinline$IntToFloat(-51));
      assertFloatEquals(16777215F, $opt$noinline$IntToFloat(16777215));  // 2^24 - 1
      assertFloatEquals(-16777215F, $opt$noinline$IntToFloat(-16777215));  // -(2^24 - 1)
      assertFloatEquals(16777216F, $opt$noinline$IntToFloat(16777216));  // 2^24
      assertFloatEquals(-16777216F, $opt$noinline$IntToFloat(-16777216));  // -(2^24)
      assertFloatEquals(2147483647F, $opt$noinline$IntToFloat(2147483647));  // 2^31 - 1
      assertFloatEquals(-2147483648F, $opt$noinline$IntToFloat(-2147483648));  // -(2^31)
    }
  
    private static void charToFloat() {
      assertFloatEquals(1F, $opt$noinline$CharToFloat((char)1));
      assertFloatEquals(0F, $opt$noinline$CharToFloat((char)0));
      assertFloatEquals(51F, $opt$noinline$CharToFloat((char)51));
      assertFloatEquals(32767F, $opt$noinline$CharToFloat((char)32767));  // 2^15 - 1
      assertFloatEquals(65535F, $opt$noinline$CharToFloat((char)65535));  // 2^16 - 1
      assertFloatEquals(65535F, $opt$noinline$CharToFloat((char)-1));
      assertFloatEquals(65485F, $opt$noinline$CharToFloat((char)-51));
      assertFloatEquals(32769F, $opt$noinline$CharToFloat((char)-32767));  // -(2^15 - 1)
      assertFloatEquals(32768F, $opt$noinline$CharToFloat((char)-32768));  // -(2^15)
    }
  
    private static void byteToDouble() {
      assertDoubleEquals(1D, $opt$noinline$ByteToDouble((byte)1));
      assertDoubleEquals(0D, $opt$noinline$ByteToDouble((byte)0));
      assertDoubleEquals(-1D, $opt$noinline$ByteToDouble((byte)-1));
      assertDoubleEquals(51D, $opt$noinline$ByteToDouble((byte)51));
      assertDoubleEquals(-51D, $opt$noinline$ByteToDouble((byte)-51));
      assertDoubleEquals(127D, $opt$noinline$ByteToDouble((byte)127));  // 2^7 - 1
      assertDoubleEquals(-127D, $opt$noinline$ByteToDouble((byte)-127));  // -(2^7 - 1)
      assertDoubleEquals(-128D, $opt$noinline$ByteToDouble((byte)-128));  // -(2^7)
    }
  
    private static void shortToDouble() {
      assertDoubleEquals(1D, $opt$noinline$ShortToDouble((short)1));
      assertDoubleEquals(0D, $opt$noinline$ShortToDouble((short)0));
      assertDoubleEquals(-1D, $opt$noinline$ShortToDouble((short)-1));
      assertDoubleEquals(51D, $opt$noinline$ShortToDouble((short)51));
      assertDoubleEquals(-51D, $opt$noinline$ShortToDouble((short)-51));
      assertDoubleEquals(32767D, $opt$noinline$ShortToDouble((short)32767));  // 2^15 - 1
      assertDoubleEquals(-32767D, $opt$noinline$ShortToDouble((short)-32767));  // -(2^15 - 1)
      assertDoubleEquals(-32768D, $opt$noinline$ShortToDouble((short)-32768));  // -(2^15)
    }
  
    private static void intToDouble() {
      assertDoubleEquals(1D, $opt$noinline$IntToDouble(1));
      assertDoubleEquals(0D, $opt$noinline$IntToDouble(0));
      assertDoubleEquals(-1D, $opt$noinline$IntToDouble(-1));
      assertDoubleEquals(51D, $opt$noinline$IntToDouble(51));
      assertDoubleEquals(-51D, $opt$noinline$IntToDouble(-51));
      assertDoubleEquals(16777216D, $opt$noinline$IntToDouble(16777216));  // 2^24
      assertDoubleEquals(-16777216D, $opt$noinline$IntToDouble(-16777216));  // -(2^24)
      assertDoubleEquals(2147483647D, $opt$noinline$IntToDouble(2147483647));  // 2^31 - 1
      assertDoubleEquals(-2147483648D, $opt$noinline$IntToDouble(-2147483648));  // -(2^31)
    }
  
    private static void charToDouble() {
      assertDoubleEquals(1D, $opt$noinline$CharToDouble((char)1));
      assertDoubleEquals(0D, $opt$noinline$CharToDouble((char)0));
      assertDoubleEquals(51D, $opt$noinline$CharToDouble((char)51));
      assertDoubleEquals(32767D, $opt$noinline$CharToDouble((char)32767));  // 2^15 - 1
      assertDoubleEquals(65535D, $opt$noinline$CharToDouble((char)65535));  // 2^16 - 1
      assertDoubleEquals(65535D, $opt$noinline$CharToDouble((char)-1));
      assertDoubleEquals(65485D, $opt$noinline$CharToDouble((char)-51));
      assertDoubleEquals(32769D, $opt$noinline$CharToDouble((char)-32767));  // -(2^15 - 1)
      assertDoubleEquals(32768D, $opt$noinline$CharToDouble((char)-32768));  // -(2^15)
    }
  
    private static void longToInt() {
      assertIntEquals(1, $opt$noinline$LongToInt(1L));
      assertIntEquals(0, $opt$noinline$LongToInt(0L));
      assertIntEquals(-1, $opt$noinline$LongToInt(-1L));
      assertIntEquals(51, $opt$noinline$LongToInt(51L));
      assertIntEquals(-51, $opt$noinline$LongToInt(-51L));
      assertIntEquals(2147483647, $opt$noinline$LongToInt(2147483647L));  // 2^31 - 1
      assertIntEquals(-2147483647, $opt$noinline$LongToInt(-2147483647L));  // -(2^31 - 1)
      assertIntEquals(-2147483648, $opt$noinline$LongToInt(-2147483648L));  // -(2^31)
      assertIntEquals(-2147483648, $opt$noinline$LongToInt(2147483648L));  // (2^31)
      assertIntEquals(2147483647, $opt$noinline$LongToInt(-2147483649L));  // -(2^31 + 1)
      assertIntEquals(-1, $opt$noinline$LongToInt(9223372036854775807L));  // 2^63 - 1
      assertIntEquals(1, $opt$noinline$LongToInt(-9223372036854775807L));  // -(2^63 - 1)
      assertIntEquals(0, $opt$noinline$LongToInt(-9223372036854775808L));  // -(2^63)
  
      assertIntEquals(42, $opt$noinline$LongLiteralToInt());
  
      // Ensure long-to-int conversions truncates values as expected.
      assertLongEquals(1L, $opt$noinline$IntToLong($opt$noinline$LongToInt(4294967297L)));  // 2^32 + 1
      assertLongEquals(0L, $opt$noinline$IntToLong($opt$noinline$LongToInt(4294967296L)));  // 2^32
      assertLongEquals(-1L, $opt$noinline$IntToLong($opt$noinline$LongToInt(4294967295L)));  // 2^32 - 1
      assertLongEquals(0L, $opt$noinline$IntToLong($opt$noinline$LongToInt(0L)));
      assertLongEquals(1L, $opt$noinline$IntToLong($opt$noinline$LongToInt(-4294967295L)));  // -(2^32 - 1)
      assertLongEquals(0L, $opt$noinline$IntToLong($opt$noinline$LongToInt(-4294967296L)));  // -(2^32)
      assertLongEquals(-1, $opt$noinline$IntToLong($opt$noinline$LongToInt(-4294967297L)));  // -(2^32 + 1)
    }
  
    private static void longToFloat() {
      assertFloatEquals(1F, $opt$noinline$LongToFloat(1L));
      assertFloatEquals(0F, $opt$noinline$LongToFloat(0L));
      assertFloatEquals(-1F, $opt$noinline$LongToFloat(-1L));
      assertFloatEquals(51F, $opt$noinline$LongToFloat(51L));
      assertFloatEquals(-51F, $opt$noinline$LongToFloat(-51L));
      assertFloatEquals(2147483647F, $opt$noinline$LongToFloat(2147483647L));  // 2^31 - 1
      assertFloatEquals(-2147483647F, $opt$noinline$LongToFloat(-2147483647L));  // -(2^31 - 1)
      assertFloatEquals(-2147483648F, $opt$noinline$LongToFloat(-2147483648L));  // -(2^31)
      assertFloatEquals(2147483648F, $opt$noinline$LongToFloat(2147483648L));  // (2^31)
      assertFloatEquals(-2147483649F, $opt$noinline$LongToFloat(-2147483649L));  // -(2^31 + 1)
      assertFloatEquals(4294967296F, $opt$noinline$LongToFloat(4294967296L));  // (2^32)
      assertFloatEquals(-4294967296F, $opt$noinline$LongToFloat(-4294967296L));  // -(2^32)
      assertFloatEquals(140739635871745F, $opt$noinline$LongToFloat(140739635871745L));  // 1 + 2^15 + 2^31 + 2^47
      assertFloatEquals(-140739635871745F, $opt$noinline$LongToFloat(-140739635871745L));  // -(1 + 2^15 + 2^31 + 2^47)
      assertFloatEquals(9223372036854775807F, $opt$noinline$LongToFloat(9223372036854775807L));  // 2^63 - 1
      assertFloatEquals(-9223372036854775807F, $opt$noinline$LongToFloat(-9223372036854775807L));  // -(2^63 - 1)
      assertFloatEquals(-9223372036854775808F, $opt$noinline$LongToFloat(-9223372036854775808L));  // -(2^63)
    }
  
    private static void longToDouble() {
      assertDoubleEquals(1D, $opt$noinline$LongToDouble(1L));
      assertDoubleEquals(0D, $opt$noinline$LongToDouble(0L));
      assertDoubleEquals(-1D, $opt$noinline$LongToDouble(-1L));
      assertDoubleEquals(51D, $opt$noinline$LongToDouble(51L));
      assertDoubleEquals(-51D, $opt$noinline$LongToDouble(-51L));
      assertDoubleEquals(2147483647D, $opt$noinline$LongToDouble(2147483647L));  // 2^31 - 1
      assertDoubleEquals(-2147483647D, $opt$noinline$LongToDouble(-2147483647L));  // -(2^31 - 1)
      assertDoubleEquals(-2147483648D, $opt$noinline$LongToDouble(-2147483648L));  // -(2^31)
      assertDoubleEquals(2147483648D, $opt$noinline$LongToDouble(2147483648L));  // (2^31)
      assertDoubleEquals(-2147483649D, $opt$noinline$LongToDouble(-2147483649L));  // -(2^31 + 1)
      assertDoubleEquals(4294967296D, $opt$noinline$LongToDouble(4294967296L));  // (2^32)
      assertDoubleEquals(-4294967296D, $opt$noinline$LongToDouble(-4294967296L));  // -(2^32)
      assertDoubleEquals(140739635871745D, $opt$noinline$LongToDouble(140739635871745L));  // 1 + 2^15 + 2^31 + 2^47
      assertDoubleEquals(-140739635871745D, $opt$noinline$LongToDouble(-140739635871745L));  // -(1 + 2^15 + 2^31 + 2^47)
      assertDoubleEquals(9223372036854775807D, $opt$noinline$LongToDouble(9223372036854775807L));  // 2^63 - 1
      assertDoubleEquals(-9223372036854775807D, $opt$noinline$LongToDouble(-9223372036854775807L));  // -(2^63 - 1)
      assertDoubleEquals(-9223372036854775808D, $opt$noinline$LongToDouble(-9223372036854775808L));  // -(2^63)
    }
  
    private static void floatToInt() {
      assertIntEquals(1, $opt$noinline$FloatToInt(1F));
      assertIntEquals(0, $opt$noinline$FloatToInt(0F));
      assertIntEquals(0, $opt$noinline$FloatToInt(-0F));
      assertIntEquals(-1, $opt$noinline$FloatToInt(-1F));
      assertIntEquals(51, $opt$noinline$FloatToInt(51F));
      assertIntEquals(-51, $opt$noinline$FloatToInt(-51F));
      assertIntEquals(0, $opt$noinline$FloatToInt(0.5F));
      assertIntEquals(0, $opt$noinline$FloatToInt(0.4999999F));
      assertIntEquals(0, $opt$noinline$FloatToInt(-0.4999999F));
      assertIntEquals(0, $opt$noinline$FloatToInt(-0.5F));
      assertIntEquals(42, $opt$noinline$FloatToInt(42.199F));
      assertIntEquals(-42, $opt$noinline$FloatToInt(-42.199F));
      assertIntEquals(2147483647, $opt$noinline$FloatToInt(2147483647F));  // 2^31 - 1
      assertIntEquals(-2147483648, $opt$noinline$FloatToInt(-2147483647F));  // -(2^31 - 1)
      assertIntEquals(-2147483648, $opt$noinline$FloatToInt(-2147483648F));  // -(2^31)
      assertIntEquals(2147483647, $opt$noinline$FloatToInt(2147483648F));  // (2^31)
      assertIntEquals(-2147483648, $opt$noinline$FloatToInt(-2147483649F));  // -(2^31 + 1)
      assertIntEquals(2147483647, $opt$noinline$FloatToInt(9223372036854775807F));  // 2^63 - 1
      assertIntEquals(-2147483648, $opt$noinline$FloatToInt(-9223372036854775807F));  // -(2^63 - 1)
      assertIntEquals(-2147483648, $opt$noinline$FloatToInt(-9223372036854775808F));  // -(2^63)
      assertIntEquals(0, $opt$noinline$FloatToInt(Float.NaN));
      assertIntEquals(2147483647, $opt$noinline$FloatToInt(Float.POSITIVE_INFINITY));
      assertIntEquals(-2147483648, $opt$noinline$FloatToInt(Float.NEGATIVE_INFINITY));
    }
  
    private static void floatToLong() {
      assertLongEquals(1L, $opt$noinline$FloatToLong(1F));
      assertLongEquals(0L, $opt$noinline$FloatToLong(0F));
      assertLongEquals(0L, $opt$noinline$FloatToLong(-0F));
      assertLongEquals(-1L, $opt$noinline$FloatToLong(-1F));
      assertLongEquals(51L, $opt$noinline$FloatToLong(51F));
      assertLongEquals(-51L, $opt$noinline$FloatToLong(-51F));
      assertLongEquals(0L, $opt$noinline$FloatToLong(0.5F));
      assertLongEquals(0L, $opt$noinline$FloatToLong(0.4999999F));
      assertLongEquals(0L, $opt$noinline$FloatToLong(-0.4999999F));
      assertLongEquals(0L, $opt$noinline$FloatToLong(-0.5F));
      assertLongEquals(42L, $opt$noinline$FloatToLong(42.199F));
      assertLongEquals(-42L, $opt$noinline$FloatToLong(-42.199F));
      assertLongEquals(2147483648L, $opt$noinline$FloatToLong(2147483647F));  // 2^31 - 1
      assertLongEquals(-2147483648L, $opt$noinline$FloatToLong(-2147483647F));  // -(2^31 - 1)
      assertLongEquals(-2147483648L, $opt$noinline$FloatToLong(-2147483648F));  // -(2^31)
      assertLongEquals(2147483648L, $opt$noinline$FloatToLong(2147483648F));  // (2^31)
      assertLongEquals(-2147483648L, $opt$noinline$FloatToLong(-2147483649F));  // -(2^31 + 1)
      assertLongEquals(9223372036854775807L, $opt$noinline$FloatToLong(9223372036854775807F));  // 2^63 - 1
      assertLongEquals(-9223372036854775808L, $opt$noinline$FloatToLong(-9223372036854775807F));  // -(2^63 - 1)
      assertLongEquals(-9223372036854775808L, $opt$noinline$FloatToLong(-9223372036854775808F));  // -(2^63)
      assertLongEquals(0L, $opt$noinline$FloatToLong(Float.NaN));
      assertLongEquals(9223372036854775807L, $opt$noinline$FloatToLong(Float.POSITIVE_INFINITY));
      assertLongEquals(-9223372036854775808L, $opt$noinline$FloatToLong(Float.NEGATIVE_INFINITY));
    }
  
    private static void floatToDouble() {
      assertDoubleEquals(1D, $opt$noinline$FloatToDouble(1F));
      assertDoubleEquals(0D, $opt$noinline$FloatToDouble(0F));
      assertDoubleEquals(0D, $opt$noinline$FloatToDouble(-0F));
      assertDoubleEquals(-1D, $opt$noinline$FloatToDouble(-1F));
      assertDoubleEquals(51D, $opt$noinline$FloatToDouble(51F));
      assertDoubleEquals(-51D, $opt$noinline$FloatToDouble(-51F));
      assertDoubleEquals(0.5D, $opt$noinline$FloatToDouble(0.5F));
      assertDoubleEquals(0.49999991059303284D, $opt$noinline$FloatToDouble(0.4999999F));
      assertDoubleEquals(-0.49999991059303284D, $opt$noinline$FloatToDouble(-0.4999999F));
      assertDoubleEquals(-0.5D, $opt$noinline$FloatToDouble(-0.5F));
      assertDoubleEquals(42.19900131225586D, $opt$noinline$FloatToDouble(42.199F));
      assertDoubleEquals(-42.19900131225586D, $opt$noinline$FloatToDouble(-42.199F));
      assertDoubleEquals(2147483648D, $opt$noinline$FloatToDouble(2147483647F));  // 2^31 - 1
      assertDoubleEquals(-2147483648D, $opt$noinline$FloatToDouble(-2147483647F));  // -(2^31 - 1)
      assertDoubleEquals(-2147483648D, $opt$noinline$FloatToDouble(-2147483648F));  // -(2^31)
      assertDoubleEquals(2147483648D, $opt$noinline$FloatToDouble(2147483648F));  // (2^31)
      assertDoubleEquals(-2147483648D, $opt$noinline$FloatToDouble(-2147483649F));  // -(2^31 + 1)
      assertDoubleEquals(9223372036854775807D, $opt$noinline$FloatToDouble(9223372036854775807F));  // 2^63 - 1
      assertDoubleEquals(-9223372036854775807D, $opt$noinline$FloatToDouble(-9223372036854775807F));  // -(2^63 - 1)
      assertDoubleEquals(-9223372036854775808D, $opt$noinline$FloatToDouble(-9223372036854775808F));  // -(2^63)
      assertDoubleIsNaN($opt$noinline$FloatToDouble(Float.NaN));
      assertDoubleEquals(Double.POSITIVE_INFINITY, $opt$noinline$FloatToDouble(Float.POSITIVE_INFINITY));
      assertDoubleEquals(Double.NEGATIVE_INFINITY, $opt$noinline$FloatToDouble(Float.NEGATIVE_INFINITY));
    }
  
    private static void doubleToInt() {
      assertIntEquals(1, $opt$noinline$DoubleToInt(1D));
      assertIntEquals(0, $opt$noinline$DoubleToInt(0D));
      assertIntEquals(0, $opt$noinline$DoubleToInt(-0D));
      assertIntEquals(-1, $opt$noinline$DoubleToInt(-1D));
      assertIntEquals(51, $opt$noinline$DoubleToInt(51D));
      assertIntEquals(-51, $opt$noinline$DoubleToInt(-51D));
      assertIntEquals(0, $opt$noinline$DoubleToInt(0.5D));
      assertIntEquals(0, $opt$noinline$DoubleToInt(0.4999999D));
      assertIntEquals(0, $opt$noinline$DoubleToInt(-0.4999999D));
      assertIntEquals(0, $opt$noinline$DoubleToInt(-0.5D));
      assertIntEquals(42, $opt$noinline$DoubleToInt(42.199D));
      assertIntEquals(-42, $opt$noinline$DoubleToInt(-42.199D));
      assertIntEquals(2147483647, $opt$noinline$DoubleToInt(2147483647D));  // 2^31 - 1
      assertIntEquals(-2147483647, $opt$noinline$DoubleToInt(-2147483647D));  // -(2^31 - 1)
      assertIntEquals(-2147483648, $opt$noinline$DoubleToInt(-2147483648D));  // -(2^31)
      assertIntEquals(2147483647, $opt$noinline$DoubleToInt(2147483648D));  // (2^31)
      assertIntEquals(-2147483648, $opt$noinline$DoubleToInt(-2147483649D));  // -(2^31 + 1)
      assertIntEquals(2147483647, $opt$noinline$DoubleToInt(9223372036854775807D));  // 2^63 - 1
      assertIntEquals(-2147483648, $opt$noinline$DoubleToInt(-9223372036854775807D));  // -(2^63 - 1)
      assertIntEquals(-2147483648, $opt$noinline$DoubleToInt(-9223372036854775808D));  // -(2^63)
      assertIntEquals(0, $opt$noinline$DoubleToInt(Double.NaN));
      assertIntEquals(2147483647, $opt$noinline$DoubleToInt(Double.POSITIVE_INFINITY));
      assertIntEquals(-2147483648, $opt$noinline$DoubleToInt(Double.NEGATIVE_INFINITY));
    }
  
    private static void doubleToLong() {
      assertLongEquals(1L, $opt$noinline$DoubleToLong(1D));
      assertLongEquals(0L, $opt$noinline$DoubleToLong(0D));
      assertLongEquals(0L, $opt$noinline$DoubleToLong(-0D));
      assertLongEquals(-1L, $opt$noinline$DoubleToLong(-1D));
      assertLongEquals(51L, $opt$noinline$DoubleToLong(51D));
      assertLongEquals(-51L, $opt$noinline$DoubleToLong(-51D));
      assertLongEquals(0L, $opt$noinline$DoubleToLong(0.5D));
      assertLongEquals(0L, $opt$noinline$DoubleToLong(0.4999999D));
      assertLongEquals(0L, $opt$noinline$DoubleToLong(-0.4999999D));
      assertLongEquals(0L, $opt$noinline$DoubleToLong(-0.5D));
      assertLongEquals(42L, $opt$noinline$DoubleToLong(42.199D));
      assertLongEquals(-42L, $opt$noinline$DoubleToLong(-42.199D));
      assertLongEquals(2147483647L, $opt$noinline$DoubleToLong(2147483647D));  // 2^31 - 1
      assertLongEquals(-2147483647L, $opt$noinline$DoubleToLong(-2147483647D));  // -(2^31 - 1)
      assertLongEquals(-2147483648L, $opt$noinline$DoubleToLong(-2147483648D));  // -(2^31)
      assertLongEquals(2147483648L, $opt$noinline$DoubleToLong(2147483648D));  // (2^31)
      assertLongEquals(-2147483649L, $opt$noinline$DoubleToLong(-2147483649D));  // -(2^31 + 1)
      assertLongEquals(9223372036854775807L, $opt$noinline$DoubleToLong(9223372036854775807D));  // 2^63 - 1
      assertLongEquals(-9223372036854775808L, $opt$noinline$DoubleToLong(-9223372036854775807D));  // -(2^63 - 1)
      assertLongEquals(-9223372036854775808L, $opt$noinline$DoubleToLong(-9223372036854775808D));  // -(2^63)
      assertLongEquals(0L, $opt$noinline$DoubleToLong(Double.NaN));
      assertLongEquals(9223372036854775807L, $opt$noinline$DoubleToLong(Double.POSITIVE_INFINITY));
      assertLongEquals(-9223372036854775808L, $opt$noinline$DoubleToLong(Double.NEGATIVE_INFINITY));
    }
  
    private static void doubleToFloat() {
      assertFloatEquals(1F, $opt$noinline$DoubleToFloat(1D));
      assertFloatEquals(0F, $opt$noinline$DoubleToFloat(0D));
      assertFloatEquals(0F, $opt$noinline$DoubleToFloat(-0D));
      assertFloatEquals(-1F, $opt$noinline$DoubleToFloat(-1D));
      assertFloatEquals(51F, $opt$noinline$DoubleToFloat(51D));
      assertFloatEquals(-51F, $opt$noinline$DoubleToFloat(-51D));
      assertFloatEquals(0.5F, $opt$noinline$DoubleToFloat(0.5D));
      assertFloatEquals(0.4999999F, $opt$noinline$DoubleToFloat(0.4999999D));
      assertFloatEquals(-0.4999999F, $opt$noinline$DoubleToFloat(-0.4999999D));
      assertFloatEquals(-0.5F, $opt$noinline$DoubleToFloat(-0.5D));
      assertFloatEquals(42.199F, $opt$noinline$DoubleToFloat(42.199D));
      assertFloatEquals(-42.199F, $opt$noinline$DoubleToFloat(-42.199D));
      assertFloatEquals(2147483648F, $opt$noinline$DoubleToFloat(2147483647D));  // 2^31 - 1
      assertFloatEquals(-2147483648F, $opt$noinline$DoubleToFloat(-2147483647D));  // -(2^31 - 1)
      assertFloatEquals(-2147483648F, $opt$noinline$DoubleToFloat(-2147483648D));  // -(2^31)
      assertFloatEquals(2147483648F, $opt$noinline$DoubleToFloat(2147483648D));  // (2^31)
      assertFloatEquals(-2147483648F, $opt$noinline$DoubleToFloat(-2147483649D));  // -(2^31 + 1)
      assertFloatEquals(9223372036854775807F, $opt$noinline$DoubleToFloat(9223372036854775807D));  // 2^63 - 1
      assertFloatEquals(-9223372036854775807F, $opt$noinline$DoubleToFloat(-9223372036854775807D));  // -(2^63 - 1)
      assertFloatEquals(-9223372036854775808F, $opt$noinline$DoubleToFloat(-9223372036854775808D));  // -(2^63)
      assertFloatIsNaN($opt$noinline$DoubleToFloat(Float.NaN));
      assertFloatEquals(Float.POSITIVE_INFINITY, $opt$noinline$DoubleToFloat(Double.POSITIVE_INFINITY));
      assertFloatEquals(Float.NEGATIVE_INFINITY, $opt$noinline$DoubleToFloat(Double.NEGATIVE_INFINITY));
    }
  
    private static void shortToByte() {
      assertByteEquals((byte)1, $opt$noinline$ShortToByte((short)1));
      assertByteEquals((byte)0, $opt$noinline$ShortToByte((short)0));
      assertByteEquals((byte)-1, $opt$noinline$ShortToByte((short)-1));
      assertByteEquals((byte)51, $opt$noinline$ShortToByte((short)51));
      assertByteEquals((byte)-51, $opt$noinline$ShortToByte((short)-51));
      assertByteEquals((byte)127, $opt$noinline$ShortToByte((short)127));  // 2^7 - 1
      assertByteEquals((byte)-127, $opt$noinline$ShortToByte((short)-127));  // -(2^7 - 1)
      assertByteEquals((byte)-128, $opt$noinline$ShortToByte((short)-128));  // -(2^7)
      assertByteEquals((byte)-128, $opt$noinline$ShortToByte((short)128));  // 2^7
      assertByteEquals((byte)127, $opt$noinline$ShortToByte((short)-129));  // -(2^7 + 1)
      assertByteEquals((byte)-1, $opt$noinline$ShortToByte((short)32767));  // 2^15 - 1
      assertByteEquals((byte)0, $opt$noinline$ShortToByte((short)-32768));  // -(2^15)
    }
  
    private static void intToByte() {
      assertByteEquals((byte)1, $opt$noinline$IntToByte(1));
      assertByteEquals((byte)0, $opt$noinline$IntToByte(0));
      assertByteEquals((byte)-1, $opt$noinline$IntToByte(-1));
      assertByteEquals((byte)51, $opt$noinline$IntToByte(51));
      assertByteEquals((byte)-51, $opt$noinline$IntToByte(-51));
      assertByteEquals((byte)127, $opt$noinline$IntToByte(127));  // 2^7 - 1
      assertByteEquals((byte)-127, $opt$noinline$IntToByte(-127));  // -(2^7 - 1)
      assertByteEquals((byte)-128, $opt$noinline$IntToByte(-128));  // -(2^7)
      assertByteEquals((byte)-128, $opt$noinline$IntToByte(128));  // 2^7
      assertByteEquals((byte)127, $opt$noinline$IntToByte(-129));  // -(2^7 + 1)
      assertByteEquals((byte)-1, $opt$noinline$IntToByte(2147483647));  // 2^31 - 1
      assertByteEquals((byte)0, $opt$noinline$IntToByte(-2147483648));  // -(2^31)
    }
  
    private static void charToByte() {
      assertByteEquals((byte)1, $opt$noinline$CharToByte((char)1));
      assertByteEquals((byte)0, $opt$noinline$CharToByte((char)0));
      assertByteEquals((byte)51, $opt$noinline$CharToByte((char)51));
      assertByteEquals((byte)127, $opt$noinline$CharToByte((char)127));  // 2^7 - 1
      assertByteEquals((byte)-128, $opt$noinline$CharToByte((char)128));  // 2^7
      assertByteEquals((byte)-1, $opt$noinline$CharToByte((char)32767));  // 2^15 - 1
      assertByteEquals((byte)-1, $opt$noinline$CharToByte((char)65535));  // 2^16 - 1
      assertByteEquals((byte)-1, $opt$noinline$CharToByte((char)-1));
      assertByteEquals((byte)-51, $opt$noinline$CharToByte((char)-51));
      assertByteEquals((byte)-127, $opt$noinline$CharToByte((char)-127));  // -(2^7 - 1)
      assertByteEquals((byte)-128, $opt$noinline$CharToByte((char)-128));  // -(2^7)
      assertByteEquals((byte)127, $opt$noinline$CharToByte((char)-129));  // -(2^7 + 1)
    }
  
    private static void byteToShort() {
      assertShortEquals((short)1, $opt$noinline$ByteToShort((byte)1));
      assertShortEquals((short)0, $opt$noinline$ByteToShort((byte)0));
      assertShortEquals((short)-1, $opt$noinline$ByteToShort((byte)-1));
      assertShortEquals((short)51, $opt$noinline$ByteToShort((byte)51));
      assertShortEquals((short)-51, $opt$noinline$ByteToShort((byte)-51));
      assertShortEquals((short)127, $opt$noinline$ByteToShort((byte)127));  // 2^7 - 1
      assertShortEquals((short)-127, $opt$noinline$ByteToShort((byte)-127));  // -(2^7 - 1)
      assertShortEquals((short)-128, $opt$noinline$ByteToShort((byte)-128));  // -(2^7)
    }
  
    private static void intToShort() {
      assertShortEquals((short)1, $opt$noinline$IntToShort(1));
      assertShortEquals((short)0, $opt$noinline$IntToShort(0));
      assertShortEquals((short)-1, $opt$noinline$IntToShort(-1));
      assertShortEquals((short)51, $opt$noinline$IntToShort(51));
      assertShortEquals((short)-51, $opt$noinline$IntToShort(-51));
      assertShortEquals((short)32767, $opt$noinline$IntToShort(32767));  // 2^15 - 1
      assertShortEquals((short)-32767, $opt$noinline$IntToShort(-32767));  // -(2^15 - 1)
      assertShortEquals((short)-32768, $opt$noinline$IntToShort(-32768));  // -(2^15)
      assertShortEquals((short)-32768, $opt$noinline$IntToShort(32768));  // 2^15
      assertShortEquals((short)32767, $opt$noinline$IntToShort(-32769));  // -(2^15 + 1)
      assertShortEquals((short)-1, $opt$noinline$IntToShort(2147483647));  // 2^31 - 1
      assertShortEquals((short)0, $opt$noinline$IntToShort(-2147483648));  // -(2^31)
    }
  
    private static void charToShort() {
      assertShortEquals((short)1, $opt$noinline$CharToShort((char)1));
      assertShortEquals((short)0, $opt$noinline$CharToShort((char)0));
      assertShortEquals((short)51, $opt$noinline$CharToShort((char)51));
      assertShortEquals((short)32767, $opt$noinline$CharToShort((char)32767));  // 2^15 - 1
      assertShortEquals((short)-32768, $opt$noinline$CharToShort((char)32768));  // 2^15
      assertShortEquals((short)-32767, $opt$noinline$CharToShort((char)32769));  // 2^15
      assertShortEquals((short)-1, $opt$noinline$CharToShort((char)65535));  // 2^16 - 1
      assertShortEquals((short)-1, $opt$noinline$CharToShort((char)-1));
      assertShortEquals((short)-51, $opt$noinline$CharToShort((char)-51));
      assertShortEquals((short)-32767, $opt$noinline$CharToShort((char)-32767));  // -(2^15 - 1)
      assertShortEquals((short)-32768, $opt$noinline$CharToShort((char)-32768));  // -(2^15)
      assertShortEquals((short)32767, $opt$noinline$CharToShort((char)-32769));  // -(2^15 + 1)
    }
  
    private static void byteToChar() {
      assertCharEquals((char)1, $opt$noinline$ByteToChar((byte)1));
      assertCharEquals((char)0, $opt$noinline$ByteToChar((byte)0));
      assertCharEquals((char)65535, $opt$noinline$ByteToChar((byte)-1));
      assertCharEquals((char)51, $opt$noinline$ByteToChar((byte)51));
      assertCharEquals((char)65485, $opt$noinline$ByteToChar((byte)-51));
      assertCharEquals((char)127, $opt$noinline$ByteToChar((byte)127));  // 2^7 - 1
      assertCharEquals((char)65409, $opt$noinline$ByteToChar((byte)-127));  // -(2^7 - 1)
      assertCharEquals((char)65408, $opt$noinline$ByteToChar((byte)-128));  // -(2^7)
    }
  
    private static void shortToChar() {
      assertCharEquals((char)1, $opt$noinline$ShortToChar((short)1));
      assertCharEquals((char)0, $opt$noinline$ShortToChar((short)0));
      assertCharEquals((char)65535, $opt$noinline$ShortToChar((short)-1));
      assertCharEquals((char)51, $opt$noinline$ShortToChar((short)51));
      assertCharEquals((char)65485, $opt$noinline$ShortToChar((short)-51));
      assertCharEquals((char)32767, $opt$noinline$ShortToChar((short)32767));  // 2^15 - 1
      assertCharEquals((char)32769, $opt$noinline$ShortToChar((short)-32767));  // -(2^15 - 1)
      assertCharEquals((char)32768, $opt$noinline$ShortToChar((short)-32768));  // -(2^15)
    }
  
    private static void intToChar() {
      assertCharEquals((char)1, $opt$noinline$IntToChar(1));
      assertCharEquals((char)0, $opt$noinline$IntToChar(0));
      assertCharEquals((char)65535, $opt$noinline$IntToChar(-1));
      assertCharEquals((char)51, $opt$noinline$IntToChar(51));
      assertCharEquals((char)65485, $opt$noinline$IntToChar(-51));
      assertCharEquals((char)32767, $opt$noinline$IntToChar(32767));  // 2^15 - 1
      assertCharEquals((char)32769, $opt$noinline$IntToChar(-32767));  // -(2^15 - 1)
      assertCharEquals((char)32768, $opt$noinline$IntToChar(32768));  // 2^15
      assertCharEquals((char)32768, $opt$noinline$IntToChar(-32768));  // -(2^15)
      assertCharEquals((char)65535, $opt$noinline$IntToChar(65535));  // 2^16 - 1
      assertCharEquals((char)1, $opt$noinline$IntToChar(-65535));  // -(2^16 - 1)
      assertCharEquals((char)0, $opt$noinline$IntToChar(65536));  // 2^16
      assertCharEquals((char)0, $opt$noinline$IntToChar(-65536));  // -(2^16)
      assertCharEquals((char)65535, $opt$noinline$IntToChar(2147483647));  // 2^31 - 1
      assertCharEquals((char)0, $opt$noinline$IntToChar(-2147483648));  // -(2^31)
    }
  
    // A dummy value to defeat inlining of these routines.
    static boolean doThrow = false;
  
    // These methods produce int-to-long Dex instructions.
    static long $opt$noinline$ByteToLong(byte a) { if (doThrow) throw new Error(); return (long)a; }
    static long $opt$noinline$ShortToLong(short a) { if (doThrow) throw new Error(); return (long)a; }
    static long $opt$noinline$IntToLong(int a) { if (doThrow) throw new Error(); return (long)a; }
    static long $opt$noinline$CharToLong(int a) { if (doThrow) throw new Error(); return (long)a; }
  
    // These methods produce int-to-float Dex instructions.
    static float $opt$noinline$ByteToFloat(byte a) { if (doThrow) throw new Error(); return (float)a; }
    static float $opt$noinline$ShortToFloat(short a) { if (doThrow) throw new Error(); return (float)a; }
    static float $opt$noinline$IntToFloat(int a) { if (doThrow) throw new Error(); return (float)a; }
    static float $opt$noinline$CharToFloat(char a) { if (doThrow) throw new Error(); return (float)a; }
  
    // These methods produce int-to-double Dex instructions.
    static double $opt$noinline$ByteToDouble(byte a) { if (doThrow) throw new Error(); return (double)a; }
    static double $opt$noinline$ShortToDouble(short a) { if (doThrow) throw new Error(); return (double)a; }
    static double $opt$noinline$IntToDouble(int a) { if (doThrow) throw new Error(); return (double)a; }
    static double $opt$noinline$CharToDouble(int a) { if (doThrow) throw new Error(); return (double)a; }
  
    // These methods produce long-to-int Dex instructions.
    static int $opt$noinline$LongToInt(long a) { if (doThrow) throw new Error(); return (int)a; }
    static int $opt$noinline$LongLiteralToInt() { if (doThrow) throw new Error(); return (int)42L; }
  
    // This method produces a long-to-float Dex instruction.
    static float $opt$noinline$LongToFloat(long a) { if (doThrow) throw new Error(); return (float)a; }
  
    // This method produces a long-to-double Dex instruction.
    static double $opt$noinline$LongToDouble(long a) { if (doThrow) throw new Error(); return (double)a; }
  
    // This method produces a float-to-int Dex instruction.
    static int $opt$noinline$FloatToInt(float a) { if (doThrow) throw new Error(); return (int)a; }
  
    // This method produces a float-to-long Dex instruction.
    static long $opt$noinline$FloatToLong(float a){ if (doThrow) throw new Error(); return (long)a; }
  
    // This method produces a float-to-double Dex instruction.
    static double $opt$noinline$FloatToDouble(float a) { if (doThrow) throw new Error(); return (double)a; }
  
    // This method produces a double-to-int Dex instruction.
    static int $opt$noinline$DoubleToInt(double a){ if (doThrow) throw new Error(); return (int)a; }
  
    // This method produces a double-to-long Dex instruction.
    static long $opt$noinline$DoubleToLong(double a){ if (doThrow) throw new Error(); return (long)a; }
  
    // This method produces a double-to-float Dex instruction.
    static float $opt$noinline$DoubleToFloat(double a) { if (doThrow) throw new Error(); return (float)a; }
  
    // These methods produce int-to-byte Dex instructions.
    static byte $opt$noinline$ShortToByte(short a) { if (doThrow) throw new Error(); return (byte)a; }
    static byte $opt$noinline$IntToByte(int a) { if (doThrow) throw new Error(); return (byte)a; }
    static byte $opt$noinline$CharToByte(char a) { if (doThrow) throw new Error(); return (byte)a; }
  
    // These methods produce int-to-short Dex instructions.
    static short $opt$noinline$ByteToShort(byte a) { if (doThrow) throw new Error(); return (short)a; }
    static short $opt$noinline$IntToShort(int a) { if (doThrow) throw new Error(); return (short)a; }
    static short $opt$noinline$CharToShort(char a) { if (doThrow) throw new Error(); return (short)a; }
  
    // These methods produce int-to-char Dex instructions.
    static char $opt$noinline$ByteToChar(byte a) { if (doThrow) throw new Error(); return (char)a; }
    static char $opt$noinline$ShortToChar(short a) { if (doThrow) throw new Error(); return (char)a; }
    static char $opt$noinline$IntToChar(int a) { if (doThrow) throw new Error(); return (char)a; }
  }
  