target/arm: Implement MIN/MAX (immediate)
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20250803014019.416797-3-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
3b53af353b
commit
d0e4b9d4d7
2 changed files with 54 additions and 0 deletions
|
|
@ -156,6 +156,16 @@ MOVZ . 10 100101 .. ................ ..... @movw_32
|
|||
MOVK . 11 100101 .. ................ ..... @movw_64
|
||||
MOVK . 11 100101 .. ................ ..... @movw_32
|
||||
|
||||
# Min/Max (immediate)
|
||||
|
||||
@minmaxi_s sf:1 .. ........... imm:s8 rn:5 rd:5 &rri_sf
|
||||
@minmaxi_u sf:1 .. ........... imm:8 rn:5 rd:5 &rri_sf
|
||||
|
||||
SMAX_i . 00 1000111 0000 ........ ..... ..... @minmaxi_s
|
||||
SMIN_i . 00 1000111 0010 ........ ..... ..... @minmaxi_s
|
||||
UMAX_i . 00 1000111 0001 ........ ..... ..... @minmaxi_u
|
||||
UMIN_i . 00 1000111 0011 ........ ..... ..... @minmaxi_u
|
||||
|
||||
# Bitfield
|
||||
|
||||
&bitfield rd rn sf immr imms
|
||||
|
|
|
|||
|
|
@ -4552,6 +4552,50 @@ TRANS(SUB_i, gen_rri, a, 1, 1, tcg_gen_sub_i64)
|
|||
TRANS(ADDS_i, gen_rri, a, 0, 1, a->sf ? gen_add64_CC : gen_add32_CC)
|
||||
TRANS(SUBS_i, gen_rri, a, 0, 1, a->sf ? gen_sub64_CC : gen_sub32_CC)
|
||||
|
||||
/*
|
||||
* Min/Max (immediate)
|
||||
*/
|
||||
|
||||
static void gen_wrap3_i32(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, NeonGenTwoOpFn fn)
|
||||
{
|
||||
TCGv_i32 t1 = tcg_temp_new_i32();
|
||||
TCGv_i32 t2 = tcg_temp_new_i32();
|
||||
|
||||
tcg_gen_extrl_i64_i32(t1, n);
|
||||
tcg_gen_extrl_i64_i32(t2, m);
|
||||
fn(t1, t1, t2);
|
||||
tcg_gen_extu_i32_i64(d, t1);
|
||||
}
|
||||
|
||||
static void gen_smax32_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m)
|
||||
{
|
||||
gen_wrap3_i32(d, n, m, tcg_gen_smax_i32);
|
||||
}
|
||||
|
||||
static void gen_smin32_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m)
|
||||
{
|
||||
gen_wrap3_i32(d, n, m, tcg_gen_smin_i32);
|
||||
}
|
||||
|
||||
static void gen_umax32_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m)
|
||||
{
|
||||
gen_wrap3_i32(d, n, m, tcg_gen_umax_i32);
|
||||
}
|
||||
|
||||
static void gen_umin32_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m)
|
||||
{
|
||||
gen_wrap3_i32(d, n, m, tcg_gen_umin_i32);
|
||||
}
|
||||
|
||||
TRANS_FEAT(SMAX_i, aa64_cssc, gen_rri, a, 0, 0,
|
||||
a->sf ? tcg_gen_smax_i64 : gen_smax32_i64)
|
||||
TRANS_FEAT(SMIN_i, aa64_cssc, gen_rri, a, 0, 0,
|
||||
a->sf ? tcg_gen_smin_i64 : gen_smin32_i64)
|
||||
TRANS_FEAT(UMAX_i, aa64_cssc, gen_rri, a, 0, 0,
|
||||
a->sf ? tcg_gen_umax_i64 : gen_umax32_i64)
|
||||
TRANS_FEAT(UMIN_i, aa64_cssc, gen_rri, a, 0, 0,
|
||||
a->sf ? tcg_gen_umin_i64 : gen_umin32_i64)
|
||||
|
||||
/*
|
||||
* Add/subtract (immediate, with tags)
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue