summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Levillain <rpl@google.com>2014-11-10 14:43:26 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-11-10 14:43:26 +0000
commit974bc2747b345667e07692109d63675ec50955a3 (patch)
treebe5eb89a51ce94314b5c0761171eb276faf1ec36
parentbb5b390c3b7c1d6571e73672124f82cc40026f6a (diff)
parent666c732cfa211abf44ed90120a87bf8c18138e55 (diff)
downloadandroid_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.cc2
-rw-r--r--compiler/optimizing/code_generator_x86.cc2
-rw-r--r--compiler/optimizing/code_generator_x86_64.cc2
-rw-r--r--test/422-type-conversion/src/Main.java30
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; }
}