diff options
author | Roland Levillain <rpl@google.com> | 2014-11-10 14:43:26 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-11-10 14:43:26 +0000 |
commit | 974bc2747b345667e07692109d63675ec50955a3 (patch) | |
tree | be5eb89a51ce94314b5c0761171eb276faf1ec36 | |
parent | bb5b390c3b7c1d6571e73672124f82cc40026f6a (diff) | |
parent | 666c732cfa211abf44ed90120a87bf8c18138e55 (diff) | |
download | android_art-974bc2747b345667e07692109d63675ec50955a3.tar.gz android_art-974bc2747b345667e07692109d63675ec50955a3.tar.bz2 android_art-974bc2747b345667e07692109d63675ec50955a3.zip |
Merge "Support Java conversions from char to long in opt. compiler."
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 2 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 2 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86_64.cc | 2 | ||||
-rw-r--r-- | test/422-type-conversion/src/Main.java | 30 |
4 files changed, 25 insertions, 11 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 6218fc973a..467c2a6c29 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -1338,6 +1338,7 @@ void LocationsBuilderARM::VisitTypeConversion(HTypeConversion* conversion) { case Primitive::kPrimByte: case Primitive::kPrimShort: case Primitive::kPrimInt: + case Primitive::kPrimChar: // int-to-long conversion. locations->SetInAt(0, Location::RequiresRegister()); locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap); @@ -1380,6 +1381,7 @@ void InstructionCodeGeneratorARM::VisitTypeConversion(HTypeConversion* conversio case Primitive::kPrimByte: case Primitive::kPrimShort: case Primitive::kPrimInt: + case Primitive::kPrimChar: // int-to-long conversion. DCHECK(out.IsRegisterPair()); DCHECK(in.IsRegister()); diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 82591b0ebf..d66180be32 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -1266,6 +1266,7 @@ void LocationsBuilderX86::VisitTypeConversion(HTypeConversion* conversion) { case Primitive::kPrimByte: case Primitive::kPrimShort: case Primitive::kPrimInt: + case Primitive::kPrimChar: // int-to-long conversion. locations->SetInAt(0, Location::RegisterLocation(EAX)); locations->SetOut(Location::RegisterPairLocation(EAX, EDX)); @@ -1308,6 +1309,7 @@ void InstructionCodeGeneratorX86::VisitTypeConversion(HTypeConversion* conversio case Primitive::kPrimByte: case Primitive::kPrimShort: case Primitive::kPrimInt: + case Primitive::kPrimChar: // int-to-long conversion. DCHECK_EQ(out.AsRegisterPairLow<Register>(), EAX); DCHECK_EQ(out.AsRegisterPairHigh<Register>(), EDX); diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index d2730a5b37..e09b6cab08 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -1264,6 +1264,7 @@ void LocationsBuilderX86_64::VisitTypeConversion(HTypeConversion* conversion) { case Primitive::kPrimByte: case Primitive::kPrimShort: case Primitive::kPrimInt: + case Primitive::kPrimChar: // int-to-long conversion. // TODO: We would benefit from a (to-be-implemented) // Location::RegisterOrStackSlot requirement for this input. @@ -1309,6 +1310,7 @@ void InstructionCodeGeneratorX86_64::VisitTypeConversion(HTypeConversion* conver case Primitive::kPrimByte: case Primitive::kPrimShort: case Primitive::kPrimInt: + case Primitive::kPrimChar: // int-to-long conversion. DCHECK(in.IsRegister()); __ movsxd(out.As<CpuRegister>(), in.As<CpuRegister>()); diff --git a/test/422-type-conversion/src/Main.java b/test/422-type-conversion/src/Main.java index d2ffc5bdfc..d61f255179 100644 --- a/test/422-type-conversion/src/Main.java +++ b/test/422-type-conversion/src/Main.java @@ -26,6 +26,7 @@ public class Main { public static void main(String[] args) { byteToLong(); + charToLong(); shortToLong(); intToLong(); } @@ -63,18 +64,25 @@ public class Main { assertEquals(-2147483648L, $opt$IntToLong(-2147483648)); // -(2^31) } - static long $opt$ByteToLong(byte a) { - // Translates to an int-to-long Dex instruction. - return a; - } + private static void charToLong() { + assertEquals(1L, $opt$CharToLong((char)1)); + assertEquals(0L, $opt$CharToLong((char)0)); + assertEquals(51L, $opt$CharToLong((char)51)); + assertEquals(32767L, $opt$CharToLong((char)32767)); // (2^15) - 1 + assertEquals(65535L, $opt$CharToLong((char)65535)); // (2^16) - 1 - static long $opt$ShortToLong(short a) { - // Translates to an int-to-long Dex instruction. - return a; - } + assertEquals(0L, $opt$CharToLong('\u0000')); + assertEquals(65535L, $opt$CharToLong('\uFFFF')); // (2^16) - 1 - static long $opt$IntToLong(int a) { - // Translates to an int-to-long Dex instruction. - return a; + assertEquals(65535L, $opt$CharToLong((char)-1)); + assertEquals(65485L, $opt$CharToLong((char)-51)); + assertEquals(32769L, $opt$CharToLong((char)-32767)); // -(2^15) - 1 + assertEquals(32768L, $opt$CharToLong((char)-32768)); // -(2^15) } + + // All these methods produce an int-to-long Dex instruction. + static long $opt$ByteToLong(byte a) { return a; } + static long $opt$ShortToLong(short a) { return a; } + static long $opt$IntToLong(int a) { return a; } + static long $opt$CharToLong(int a) { return a; } } |