This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: Java: Fix jcf-write fold() fallout
- From: Bryce McKinlay <mckinlay at redhat dot com>
- To: java-patches at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Fri, 28 May 2004 19:43:14 -0400
- Subject: Patch: Java: Fix jcf-write fold() fallout
jcf-write is also broken due to fold() changes. This patch fixes the
libjava bootstrap. I'm checking it in immediately because it fixes a
bootstrap problem, however I'd appreciate if those who know this code
better would retrospectively review it :-)
Thanks to Tom Tromey for helping me figure this out.
Regards
Bryce
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.
Index: jcf-write.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf-write.c,v
retrieving revision 1.144
diff -u -r1.144 jcf-write.c
--- jcf-write.c 13 May 2004 06:40:36 -0000 1.144
+++ jcf-write.c 28 May 2004 23:40:53 -0000
@@ -1093,6 +1093,8 @@
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 @@
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 @@
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);