aboutsummaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog4
-rw-r--r--gcc/java/jcf-write.c27
2 files changed, 12 insertions, 19 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 135423a..efa1c0c 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,7 @@
+2004-07-02 Richard Henderson <rth@redhat.com>
+
+ * jcf-write.c (generate_bytecode_insns <case SAVE_EXPR>): Rewrite.
+
2004-07-01 Richard Henderson <rth@redhat.com>
* class.c (registerClass_libfunc): Remove.
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 42136c6..09b39da 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -2197,35 +2197,24 @@ generate_bytecode_insns (tree exp, int target, struct jcf_partial *state)
}
break;
case SAVE_EXPR:
- /* Because the state associated with a SAVE_EXPR tree node must
- be a RTL expression, we use it to store the DECL_LOCAL_INDEX
- of a temporary variable in a CONST_INT. */
- if (! SAVE_EXPR_RTL (exp))
+ /* The first time through, the argument of the SAVE_EXPR will be
+ something complex. Evaluate it, and replace the argument with
+ a VAR_DECL that holds the result. */
+ arg = TREE_OPERAND (exp, 0);
+ if (TREE_CODE (arg) != VAR_DECL || DECL_NAME (arg))
{
tree type = TREE_TYPE (exp);
tree decl = build_decl (VAR_DECL, NULL_TREE, type);
- generate_bytecode_insns (TREE_OPERAND (exp, 0),
- STACK_TARGET, state);
+ generate_bytecode_insns (arg, STACK_TARGET, state);
localvar_alloc (decl, state);
- SAVE_EXPR_RTL (exp) = GEN_INT (DECL_LOCAL_INDEX (decl));
+ TREE_OPERAND (exp, 0) = decl;
emit_dup (TYPE_IS_WIDE (type) ? 2 : 1, 0, state);
emit_store (decl, state);
}
else
{
- /* The following code avoids creating a temporary DECL just
- to pass to emit_load. This code could be factored with
- the similar implementation in emit_load_or_store. */
tree type = TREE_TYPE (exp);
- int kind = adjust_typed_op (type, 4);
- int index = (int) INTVAL (SAVE_EXPR_RTL (exp));
- if (index <= 3)
- {
- RESERVE (1); /* [ilfda]load_[0123] */
- OP1 (OPCODE_iload + 5 + 4*kind + index);
- }
- else /* [ilfda]load */
- maybe_wide (OPCODE_iload + kind, index, state);
+ emit_load (arg, state);
NOTE_PUSH (TYPE_IS_WIDE (type) ? 2 : 1);
}
break;