aboutsummaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorBryce McKinlay <mckinlay@redhat.com>2004-05-28 23:59:49 +0000
committerBryce McKinlay <bryce@gcc.gnu.org>2004-05-29 00:59:49 +0100
commit138c4fd48455093a2c8ffa962dcb420c3006fb01 (patch)
treeb6e25bb347c8b3f3a7ff33ff1be1c4067813b482 /gcc/java
parentb3dd05b10a8318c7af07941d3b13b75b5c4f5683 (diff)
downloadgcc-138c4fd48455093a2c8ffa962dcb420c3006fb01.zip
gcc-138c4fd48455093a2c8ffa962dcb420c3006fb01.tar.gz
gcc-138c4fd48455093a2c8ffa962dcb420c3006fb01.tar.bz2
jcf-write.c (generate_bytecode_conditional): Handle binops UNLT_EXPR, UNLE_EXPR, UNGT_EXPR, UNGE_EXPR, UNEQ_EXPR, and LTGT_EXPR.
* jcf-write.c (generate_bytecode_conditional): Handle binops UNLT_EXPR, UNLE_EXPR, UNGT_EXPR, UNGE_EXPR, UNEQ_EXPR, and LTGT_EXPR. (generate_bytecode_insns): Likewise. From-SVN: r82402
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog6
-rw-r--r--gcc/java/jcf-write.c35
2 files changed, 41 insertions, 0 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 1210613..443019c 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,5 +1,11 @@
2004-05-28 Bryce McKinlay <mckinlay@redhat.com>
+ * jcf-write.c (generate_bytecode_conditional): Handle binops UNLT_EXPR, UNLE_EXPR,
+ UNGT_EXPR, UNGE_EXPR, UNEQ_EXPR, and LTGT_EXPR.
+ (generate_bytecode_insns): Likewise.
+
+2004-05-28 Bryce McKinlay <mckinlay@redhat.com>
+
* check-init.c (check_init): Handle binops UNLT_EXPR, UNLE_EXPR,
UNGT_EXPR, UNGE_EXPR, UNEQ_EXPR, and LTGT_EXPR.
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index c715a2c..5aa6d5a 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -1093,6 +1093,8 @@ generate_bytecode_conditional (tree exp,
tree exp0, exp1, type;
int save_SP = state->code_SP;
enum java_opcode op, negop;
+ bool unordered = 0;
+
switch (TREE_CODE (exp))
{
case INTEGER_CST:
@@ -1164,25 +1166,52 @@ generate_bytecode_conditional (tree exp,
emit_goto (false_label, state);
}
break;
+
+ case UNEQ_EXPR:
+ unordered = 1;
case EQ_EXPR:
op = OPCODE_if_icmpeq;
goto compare;
+
+ case LTGT_EXPR:
+ unordered = 1;
case NE_EXPR:
op = OPCODE_if_icmpne;
goto compare;
+
+ case UNLT_EXPR:
+ unordered = 1;
case GT_EXPR:
op = OPCODE_if_icmpgt;
goto compare;
+
+ case UNGT_EXPR:
+ unordered = 1;
case LT_EXPR:
op = OPCODE_if_icmplt;
goto compare;
+
+ case UNLE_EXPR:
+ unordered = 1;
case GE_EXPR:
op = OPCODE_if_icmpge;
goto compare;
+
+ case UNGE_EXPR:
+ unordered = 1;
case LE_EXPR:
op = OPCODE_if_icmple;
goto compare;
+
compare:
+ if (unordered)
+ {
+ struct jcf_block *tmp = true_label;
+ true_label = false_label;
+ false_label = tmp;
+ true_branch_first = !true_branch_first;
+ }
+
exp0 = TREE_OPERAND (exp, 0);
exp1 = TREE_OPERAND (exp, 1);
type = TREE_TYPE (exp0);
@@ -1549,6 +1578,12 @@ generate_bytecode_insns (tree exp, int target, struct jcf_partial *state)
case LT_EXPR:
case GE_EXPR:
case LE_EXPR:
+ case UNLT_EXPR:
+ case UNLE_EXPR:
+ case UNGT_EXPR:
+ case UNGE_EXPR:
+ case UNEQ_EXPR:
+ case LTGT_EXPR:
{
struct jcf_block *then_label = gen_jcf_label (state);
struct jcf_block *else_label = gen_jcf_label (state);