tcg-aarch64: Simplify tcg_out_ldst_9 encoding

At first glance the code appears to be using 1's compliment encoding,
a-la AArch32.  Except that the constant is "off", creating a complicated
split field 2's compliment encoding.

Much clearer to just use a normal mask and shift.

Reviewed-by: Claudio Fontana <claudio.fontana@huawei.com>
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
Richard Henderson 2014-03-04 08:52:49 -08:00
parent 017a86f7ad
commit 523fdc08cc

View File

@ -305,18 +305,8 @@ static inline void tcg_out_ldst_9(TCGContext *s,
TCGReg rd, TCGReg rn, tcg_target_long offset) TCGReg rd, TCGReg rn, tcg_target_long offset)
{ {
/* use LDUR with BASE register with 9bit signed unscaled offset */ /* use LDUR with BASE register with 9bit signed unscaled offset */
unsigned int mod, off; tcg_out32(s, op_data << 24 | op_type << 20
| (offset & 0x1ff) << 12 | rn << 5 | rd);
if (offset < 0) {
off = (256 + offset);
mod = 0x1;
} else {
off = offset;
mod = 0x0;
}
mod |= op_type;
tcg_out32(s, op_data << 24 | mod << 20 | off << 12 | rn << 5 | rd);
} }
/* tcg_out_ldst_12 expects a scaled unsigned immediate offset */ /* tcg_out_ldst_12 expects a scaled unsigned immediate offset */