static int assignment32_stop_before_condition_operator = 0;
static int assignment64_stop_before_condition_operator = 0;
+static int call_argument_preserve_wide_member_address = 0;
static void masm_flush_data_line (void);
emit_load_assignment_rhs_expression_to_pair ("eax", "edx", rhs_current_operand_is_unsigned_now ());
} else {
+
+ int saved_preserve_wide_member_address = call_argument_preserve_wide_member_address;
+ call_argument_preserve_wide_member_address = 1;
+
emit_load_assignment_rhs_expression_to_reg ("eax");
+ call_argument_preserve_wide_member_address = saved_preserve_wide_member_address;
+
}
if (state->ofp) {
} else if (arg_is_floating) {
emit_load_floating_rhs_expression_now (DATA_DOUBLE & 0x1f);
} else {
+
+ int saved_preserve_wide_member_address = call_argument_preserve_wide_member_address;
+ call_argument_preserve_wide_member_address = 1;
+
emit_load_assignment_rhs_expression_to_reg ("eax");
+ call_argument_preserve_wide_member_address = saved_preserve_wide_member_address;
+
}
if (state->ofp) {
*/
if (postfix_member_seen && postfix_member_pointer_depth == 0 && postfix_member_size == (DATA_LLONG & 0x1f) && !postfix_member_is_floating) {
- emit_load_deref_reg_now (reg, DATA_INT & 0x1f);
- postfix_member_size = DATA_INT & 0x1f;
+ /*
+ * A bare 64-bit member used as a call argument still needs its address
+ * here so the argument emitter can push both 32-bit halves. Outside
+ * that narrow case this 32-bit expression path continues to load the
+ * low word as before.
+ */
+ if (!(call_argument_preserve_wide_member_address && (tok.kind == TOK_COMMA || tok.kind == TOK_RPAREN))) {
+
+ emit_load_deref_reg_now (reg, DATA_INT & 0x1f);
+ postfix_member_size = DATA_INT & 0x1f;
+
+ }
}