diff options
Diffstat (limited to 'gcc/java/jcf-write.c')
-rw-r--r-- | gcc/java/jcf-write.c | 27 |
1 files changed, 8 insertions, 19 deletions
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; |