diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2005-12-06 09:04:38 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2005-12-06 09:04:38 +0000 |
commit | 8bbd5b9c94edd98b450097d6c99ea2dfbafad05d (patch) | |
tree | cd6ba0183a0fafcba7c54343f8001691c604a7d4 /sources | |
parent | fc0af274210727cbe4f3f3709d3685b0aca50bcb (diff) | |
download | scala-8bbd5b9c94edd98b450097d6c99ea2dfbafad05d.tar.gz scala-8bbd5b9c94edd98b450097d6c99ea2dfbafad05d.tar.bz2 scala-8bbd5b9c94edd98b450097d6c99ea2dfbafad05d.zip |
Better code generation for CZJUMPS.
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/tools/nsc/backend/jvm/GenJVM.scala | 30 |
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) => |