static void emit_load_assignment_rhs_to_reg (const char *reg);
static int emit_load_deref_assignment_expression_to_reg_now (const char *reg);
+static int emit_statement_rhs_const32_to_rdx_if_possible (void);
+
static void emit_floating_stack_to_int_pair_now (const char *lo, const char *hi);
static void emit_integer_pair_to_floating_stack_now (const char *lo, const char *hi, int size);
last_elem_size = elem_size;
last_lvalue_size = elem_size;
+ /*
+ * A subscript changes the final lvalue from the whole array member
+ * to one array element. Keep the postfix metadata synchronized or
+ * the 64-bit expression loader will later use the array's total
+ * storage size as the scalar load width (e.g. UINT8 Length[2]
+ * becomes a 16-bit load for Length[i]).
+ */
+ if (postfix_member_seen) {
+
+ postfix_member_size = index_step_size (elem_size);
+
+ if (postfix_member_pointer_depth > 0) {
+ postfix_member_pointer_depth--;
+ }
+
+ }
+
current_object_size = elem_size;
continue;
emit_push_reg_now ("rdx");
emit_push_reg_now (reg);
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now (reg);
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, prefix_deref_size);
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
- emit_pop_reg_now ("rax");
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+ emit_pop_reg_now ("rax");
emit_assignment_binary_op (prefix_assign_op, 0);
}
emit_push_reg_now ("rdx");
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, deref_size);
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, deref_size);
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("rax");
emit_load_deref_reg_ex_now ("rax", deref_size, deref_is_unsigned);
-
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
emit_pop_reg_now ("rax");
emit_load_deref_reg_now ("rax", deref_size);
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("rax", "rcx", 0, deref_size);
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_push_reg_now ("rdx");
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, deref_size);
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, deref_size);
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_push_reg_now ("rdx");
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, deref_size);
emit_push_reg_now ("rdx");
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("rdx");
emit_load_member_from_addr_reg_now ("rax", "rdx", member_offset, member_size);
emit_push_reg_now ("rdx");
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("rdx");
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, elem_size);
emit_push_reg_now ("rdx");
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("rdx");
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, elem_size);
emit_push_reg_now ("rdx");
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("rdx");
emit_load_member_from_addr_reg_now ("rax", "rdx", member_offset, member_size);
emit_push_reg_now ("rdx");
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("rdx");
emit_load_member_from_addr_reg_now ("rax", "rdx", 0, lvalue_size);
emit_push_reg_now ("rax");
- emit_load_assignment_rhs_expression_to_reg ("rdx");
+ if (!emit_statement_rhs_const32_to_rdx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("rdx");
+ }
+
emit_pop_reg_now ("rax");
emit_assignment_binary_op (assign_op, 0);
static void emit_load_assignment_rhs_to_reg (const char *reg);
static int emit_load_deref_assignment_expression_to_reg_now (const char *reg);
+static int emit_statement_rhs_const32_to_edx_if_possible (void);
+
static void emit_floating_stack_to_int_pair_now (const char *lo, const char *hi);
static void emit_integer_pair_to_floating_stack_now (const char *lo, const char *hi, int size);
} else {
emit_load_deref_reg_now ("ecx", store_size);
-
emit_push_reg_now ("ecx");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
emit_pop_reg_now ("eax");
emit_push_reg_now ("edx");
emit_push_reg_now (reg);
- emit_load_assignment_rhs_expression_to_reg ("edx");
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now (reg);
emit_assignment_binary_op (op, 0);
static int emit_load_assignment_binary_expression_prec_to_reg (const char *reg, int min_prec) {
int is_unsigned;
+
int expr_pointer_depth;
int expr_pointed_size;
emit_load_member_from_addr_reg_now ("eax", "edx", 0, prefix_deref_size);
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
- emit_pop_reg_now ("eax");
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+ emit_pop_reg_now ("eax");
emit_assignment_binary_op (prefix_assign_op, 0);
}
emit_push_reg_now ("edx");
emit_load_member_from_addr_reg_now ("eax", "edx", 0, deref_size);
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("eax", "edx", 0, deref_size);
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("eax");
emit_load_deref_reg_ex_now ("eax", deref_size, deref_is_unsigned);
-
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
emit_pop_reg_now ("eax");
emit_load_deref_reg_now ("eax", deref_size);
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("eax", "ecx", 0, deref_size);
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_push_reg_now ("edx");
emit_load_member_from_addr_reg_now ("eax", "edx", 0, deref_size);
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("eax", "edx", 0, deref_size);
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_push_reg_now ("edx");
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_load_member_from_addr_reg_now ("eax", "edx", 0, deref_size);
emit_push_reg_now ("edx");
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("edx");
emit_load_member_from_addr_reg_now ("eax", "edx", member_offset, member_size);
emit_push_reg_now ("edx");
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("edx");
emit_load_member_from_addr_reg_now ("eax", "edx", 0, elem_size);
emit_push_reg_now ("edx");
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("edx");
emit_load_member_from_addr_reg_now ("eax", "edx", 0, elem_size);
emit_push_reg_now ("edx");
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("edx");
emit_load_member_from_addr_reg_now ("eax", "edx", member_offset, member_size);
emit_push_reg_now ("edx");
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (op, 0);
emit_pop_reg_now ("edx");
emit_load_member_from_addr_reg_now ("eax", "edx", 0, lvalue_size);
emit_push_reg_now ("eax");
- emit_load_assignment_rhs_expression_to_reg ("edx");
+ if (!emit_statement_rhs_const32_to_edx_if_possible ()) {
+ emit_load_assignment_rhs_expression_to_reg ("edx");
+ }
+
emit_pop_reg_now ("eax");
emit_assignment_binary_op (assign_op, 0);