summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2005-12-06 09:04:38 +0000
committerIulian Dragos <jaguarul@gmail.com>2005-12-06 09:04:38 +0000
commit8bbd5b9c94edd98b450097d6c99ea2dfbafad05d (patch)
treecd6ba0183a0fafcba7c54343f8001691c604a7d4
parentfc0af274210727cbe4f3f3709d3685b0aca50bcb (diff)
downloadscala-8bbd5b9c94edd98b450097d6c99ea2dfbafad05d.tar.gz
scala-8bbd5b9c94edd98b450097d6c99ea2dfbafad05d.tar.bz2
scala-8bbd5b9c94edd98b450097d6c99ea2dfbafad05d.zip
Better code generation for CZJUMPS.
-rw-r--r--sources/scala/tools/nsc/backend/jvm/GenJVM.scala30
1 files changed, 21 insertions, 9 deletions
diff --git a/sources/scala/tools/nsc/backend/jvm/GenJVM.scala b/sources/scala/tools/nsc/backend/jvm/GenJVM.scala
index d998884ae8..a896ebcf20 100644
--- a/sources/scala/tools/nsc/backend/jvm/GenJVM.scala
+++ b/sources/scala/tools/nsc/backend/jvm/GenJVM.scala
@@ -531,14 +531,22 @@ abstract class GenJVM extends SubComponent {
case CZJUMP(success, failure, cond, kind) =>
kind match {
case BOOL | BYTE | CHAR | SHORT | INT =>
- jcode.emitIF(conds(cond), labels(success));
- if (nextBlock != failure)
- jcode.emitGOTO_maybe_W(labels(failure), false);
+ if (nextBlock == success) {
+ jcode.emitIF(conds(negate(cond)), labels(failure));
+ } else {
+ jcode.emitIF(conds(cond), labels(success));
+ if (nextBlock != failure)
+ jcode.emitGOTO_maybe_W(labels(failure), false);
+ }
case REFERENCE(_) | ARRAY(_) =>
- jcode.emitIFNULL(labels(success));
- if (nextBlock != failure)
- jcode.emitGOTO_maybe_W(labels(failure), false);
+ if (nextBlock == success) {
+ jcode.emitIFNONNULL(labels(failure));
+ } else {
+ jcode.emitIFNULL(labels(success));
+ if (nextBlock != failure)
+ jcode.emitGOTO_maybe_W(labels(failure), false);
+ }
case _ =>
kind match {
@@ -546,9 +554,13 @@ abstract class GenJVM extends SubComponent {
case FLOAT => jcode.emitFCONST_0(); jcode.emitFCMPL();
case DOUBLE => jcode.emitDCONST_0(); jcode.emitDCMPL();
}
- jcode.emitIF(conds(cond), labels(success));
- if (nextBlock != failure)
- jcode.emitGOTO_maybe_W(labels(failure), false);
+ if (nextBlock == success) {
+ jcode.emitIF(conds(negate(cond)), labels(failure));
+ } else {
+ jcode.emitIF(conds(cond), labels(success));
+ if (nextBlock != failure)
+ jcode.emitGOTO_maybe_W(labels(failure), false);
+ }
}
case RETURN(kind) =>