Revision 5856d44e target-arm/translate.c
b/target-arm/translate.c | ||
---|---|---|
8016 | 8016 |
} |
8017 | 8017 |
} |
8018 | 8018 |
} else { |
8019 |
int i; |
|
8019 |
int i, loaded_base = 0; |
|
8020 |
TCGv loaded_var; |
|
8020 | 8021 |
/* Load/store multiple. */ |
8021 | 8022 |
addr = load_reg(s, rn); |
8022 | 8023 |
offset = 0; |
... | ... | |
8028 | 8029 |
tcg_gen_addi_i32(addr, addr, -offset); |
8029 | 8030 |
} |
8030 | 8031 |
|
8032 |
TCGV_UNUSED(loaded_var); |
|
8031 | 8033 |
for (i = 0; i < 16; i++) { |
8032 | 8034 |
if ((insn & (1 << i)) == 0) |
8033 | 8035 |
continue; |
... | ... | |
8036 | 8038 |
tmp = gen_ld32(addr, IS_USER(s)); |
8037 | 8039 |
if (i == 15) { |
8038 | 8040 |
gen_bx(s, tmp); |
8041 |
} else if (i == rn) { |
|
8042 |
loaded_var = tmp; |
|
8043 |
loaded_base = 1; |
|
8039 | 8044 |
} else { |
8040 | 8045 |
store_reg(s, i, tmp); |
8041 | 8046 |
} |
... | ... | |
8046 | 8051 |
} |
8047 | 8052 |
tcg_gen_addi_i32(addr, addr, 4); |
8048 | 8053 |
} |
8054 |
if (loaded_base) { |
|
8055 |
store_reg(s, rn, loaded_var); |
|
8056 |
} |
|
8049 | 8057 |
if (insn & (1 << 21)) { |
8050 | 8058 |
/* Base register writeback. */ |
8051 | 8059 |
if (insn & (1 << 24)) { |
Also available in: Unified diff