tcg: Add tcg_gen_vec_shl{shr}{sar}16i_i32
Implement tcg_gen_vec_shl{shr}{sar}16i_tl by adding corresponging i32 OP. Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com> Message-Id: <20210624105023.3852-4-zhiwei_liu@c-sky.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
448e7aa28c
commit
04f2a8bbc0
@ -408,16 +408,26 @@ void tcg_gen_vec_add16_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b);
|
|||||||
void tcg_gen_vec_sub8_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b);
|
void tcg_gen_vec_sub8_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b);
|
||||||
void tcg_gen_vec_sub16_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b);
|
void tcg_gen_vec_sub16_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b);
|
||||||
|
|
||||||
|
void tcg_gen_vec_shl16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t);
|
||||||
|
void tcg_gen_vec_shr16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t);
|
||||||
|
void tcg_gen_vec_sar16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t);
|
||||||
|
|
||||||
#if TARGET_LONG_BITS == 64
|
#if TARGET_LONG_BITS == 64
|
||||||
#define tcg_gen_vec_add8_tl tcg_gen_vec_add8_i64
|
#define tcg_gen_vec_add8_tl tcg_gen_vec_add8_i64
|
||||||
#define tcg_gen_vec_sub8_tl tcg_gen_vec_sub8_i64
|
#define tcg_gen_vec_sub8_tl tcg_gen_vec_sub8_i64
|
||||||
#define tcg_gen_vec_add16_tl tcg_gen_vec_add16_i64
|
#define tcg_gen_vec_add16_tl tcg_gen_vec_add16_i64
|
||||||
#define tcg_gen_vec_sub16_tl tcg_gen_vec_sub16_i64
|
#define tcg_gen_vec_sub16_tl tcg_gen_vec_sub16_i64
|
||||||
|
#define tcg_gen_vec_shl16i_tl tcg_gen_vec_shl16i_i64
|
||||||
|
#define tcg_gen_vec_shr16i_tl tcg_gen_vec_shr16i_i64
|
||||||
|
#define tcg_gen_vec_sar16i_tl tcg_gen_vec_sar16i_i64
|
||||||
#else
|
#else
|
||||||
#define tcg_gen_vec_add8_tl tcg_gen_vec_add8_i32
|
#define tcg_gen_vec_add8_tl tcg_gen_vec_add8_i32
|
||||||
#define tcg_gen_vec_sub8_tl tcg_gen_vec_sub8_i32
|
#define tcg_gen_vec_sub8_tl tcg_gen_vec_sub8_i32
|
||||||
#define tcg_gen_vec_add16_tl tcg_gen_vec_add16_i32
|
#define tcg_gen_vec_add16_tl tcg_gen_vec_add16_i32
|
||||||
#define tcg_gen_vec_sub16_tl tcg_gen_vec_sub16_i32
|
#define tcg_gen_vec_sub16_tl tcg_gen_vec_sub16_i32
|
||||||
|
#define tcg_gen_vec_shl16i_tl tcg_gen_vec_shl16i_i32
|
||||||
|
#define tcg_gen_vec_shr16i_tl tcg_gen_vec_shr16i_i32
|
||||||
|
#define tcg_gen_vec_sar16i_tl tcg_gen_vec_sar16i_i32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2678,6 +2678,13 @@ void tcg_gen_vec_shl16i_i64(TCGv_i64 d, TCGv_i64 a, int64_t c)
|
|||||||
tcg_gen_andi_i64(d, d, mask);
|
tcg_gen_andi_i64(d, d, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tcg_gen_vec_shl16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t c)
|
||||||
|
{
|
||||||
|
uint32_t mask = dup_const(MO_16, 0xffff << c);
|
||||||
|
tcg_gen_shli_i32(d, a, c);
|
||||||
|
tcg_gen_andi_i32(d, d, mask);
|
||||||
|
}
|
||||||
|
|
||||||
void tcg_gen_gvec_shli(unsigned vece, uint32_t dofs, uint32_t aofs,
|
void tcg_gen_gvec_shli(unsigned vece, uint32_t dofs, uint32_t aofs,
|
||||||
int64_t shift, uint32_t oprsz, uint32_t maxsz)
|
int64_t shift, uint32_t oprsz, uint32_t maxsz)
|
||||||
{
|
{
|
||||||
@ -2729,6 +2736,13 @@ void tcg_gen_vec_shr16i_i64(TCGv_i64 d, TCGv_i64 a, int64_t c)
|
|||||||
tcg_gen_andi_i64(d, d, mask);
|
tcg_gen_andi_i64(d, d, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tcg_gen_vec_shr16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t c)
|
||||||
|
{
|
||||||
|
uint32_t mask = dup_const(MO_16, 0xffff >> c);
|
||||||
|
tcg_gen_shri_i32(d, a, c);
|
||||||
|
tcg_gen_andi_i32(d, d, mask);
|
||||||
|
}
|
||||||
|
|
||||||
void tcg_gen_gvec_shri(unsigned vece, uint32_t dofs, uint32_t aofs,
|
void tcg_gen_gvec_shri(unsigned vece, uint32_t dofs, uint32_t aofs,
|
||||||
int64_t shift, uint32_t oprsz, uint32_t maxsz)
|
int64_t shift, uint32_t oprsz, uint32_t maxsz)
|
||||||
{
|
{
|
||||||
@ -2794,6 +2808,20 @@ void tcg_gen_vec_sar16i_i64(TCGv_i64 d, TCGv_i64 a, int64_t c)
|
|||||||
tcg_temp_free_i64(s);
|
tcg_temp_free_i64(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tcg_gen_vec_sar16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t c)
|
||||||
|
{
|
||||||
|
uint32_t s_mask = dup_const(MO_16, 0x8000 >> c);
|
||||||
|
uint32_t c_mask = dup_const(MO_16, 0xffff >> c);
|
||||||
|
TCGv_i32 s = tcg_temp_new_i32();
|
||||||
|
|
||||||
|
tcg_gen_shri_i32(d, a, c);
|
||||||
|
tcg_gen_andi_i32(s, d, s_mask); /* isolate (shifted) sign bit */
|
||||||
|
tcg_gen_andi_i32(d, d, c_mask); /* clear out bits above sign */
|
||||||
|
tcg_gen_muli_i32(s, s, (2 << c) - 2); /* replicate isolated signs */
|
||||||
|
tcg_gen_or_i32(d, d, s); /* include sign extension */
|
||||||
|
tcg_temp_free_i32(s);
|
||||||
|
}
|
||||||
|
|
||||||
void tcg_gen_gvec_sari(unsigned vece, uint32_t dofs, uint32_t aofs,
|
void tcg_gen_gvec_sari(unsigned vece, uint32_t dofs, uint32_t aofs,
|
||||||
int64_t shift, uint32_t oprsz, uint32_t maxsz)
|
int64_t shift, uint32_t oprsz, uint32_t maxsz)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user