target/microblaze: Implement cmp and cmpu inline
These are simple enough operations; we do not need to call an out-of-line helper. Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
a2b0b90e79
commit
58b48b637d
@ -1,6 +1,4 @@
|
|||||||
DEF_HELPER_FLAGS_2(raise_exception, TCG_CALL_NO_WG, noreturn, env, i32)
|
DEF_HELPER_FLAGS_2(raise_exception, TCG_CALL_NO_WG, noreturn, env, i32)
|
||||||
DEF_HELPER_2(cmp, i32, i32, i32)
|
|
||||||
DEF_HELPER_2(cmpu, i32, i32, i32)
|
|
||||||
|
|
||||||
DEF_HELPER_3(divs, i32, env, i32, i32)
|
DEF_HELPER_3(divs, i32, env, i32, i32)
|
||||||
DEF_HELPER_3(divu, i32, env, i32, i32)
|
DEF_HELPER_3(divu, i32, env, i32, i32)
|
||||||
|
@ -69,26 +69,6 @@ void helper_raise_exception(CPUMBState *env, uint32_t index)
|
|||||||
cpu_loop_exit(cs);
|
cpu_loop_exit(cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t helper_cmp(uint32_t a, uint32_t b)
|
|
||||||
{
|
|
||||||
uint32_t t;
|
|
||||||
|
|
||||||
t = b + ~a + 1;
|
|
||||||
if ((b & 0x80000000) ^ (a & 0x80000000))
|
|
||||||
t = (t & 0x7fffffff) | (b & 0x80000000);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t helper_cmpu(uint32_t a, uint32_t b)
|
|
||||||
{
|
|
||||||
uint32_t t;
|
|
||||||
|
|
||||||
t = b + ~a + 1;
|
|
||||||
if ((b & 0x80000000) ^ (a & 0x80000000))
|
|
||||||
t = (t & 0x7fffffff) | (a & 0x80000000);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int div_prepare(CPUMBState *env, uint32_t a, uint32_t b)
|
static inline int div_prepare(CPUMBState *env, uint32_t a, uint32_t b)
|
||||||
{
|
{
|
||||||
MicroBlazeCPU *cpu = env_archcpu(env);
|
MicroBlazeCPU *cpu = env_archcpu(env);
|
||||||
|
@ -327,8 +327,28 @@ DO_TYPEBV(addic, true, gen_addc)
|
|||||||
DO_TYPEBI(addik, false, tcg_gen_addi_i32)
|
DO_TYPEBI(addik, false, tcg_gen_addi_i32)
|
||||||
DO_TYPEBV(addikc, true, gen_addkc)
|
DO_TYPEBV(addikc, true, gen_addkc)
|
||||||
|
|
||||||
DO_TYPEA(cmp, false, gen_helper_cmp)
|
static void gen_cmp(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||||
DO_TYPEA(cmpu, false, gen_helper_cmpu)
|
{
|
||||||
|
TCGv_i32 lt = tcg_temp_new_i32();
|
||||||
|
|
||||||
|
tcg_gen_setcond_i32(TCG_COND_LT, lt, inb, ina);
|
||||||
|
tcg_gen_sub_i32(out, inb, ina);
|
||||||
|
tcg_gen_deposit_i32(out, out, lt, 31, 1);
|
||||||
|
tcg_temp_free_i32(lt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gen_cmpu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||||
|
{
|
||||||
|
TCGv_i32 lt = tcg_temp_new_i32();
|
||||||
|
|
||||||
|
tcg_gen_setcond_i32(TCG_COND_LTU, lt, inb, ina);
|
||||||
|
tcg_gen_sub_i32(out, inb, ina);
|
||||||
|
tcg_gen_deposit_i32(out, out, lt, 31, 1);
|
||||||
|
tcg_temp_free_i32(lt);
|
||||||
|
}
|
||||||
|
|
||||||
|
DO_TYPEA(cmp, false, gen_cmp)
|
||||||
|
DO_TYPEA(cmpu, false, gen_cmpu)
|
||||||
|
|
||||||
/* No input carry, but output carry. */
|
/* No input carry, but output carry. */
|
||||||
static void gen_rsub(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
static void gen_rsub(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb)
|
||||||
|
Loading…
Reference in New Issue
Block a user