Skip to content

Commit dae8fb9

Browse files
rth7680pm215
authored andcommitted
target/arm: Implement SVE reverse within elements
Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180613015641.5667-9-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
1 parent 792a557 commit dae8fb9

File tree

4 files changed

+93
-7
lines changed

4 files changed

+93
-7
lines changed

target/arm/helper-sve.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,20 @@ DEF_HELPER_FLAGS_4(sve_compact_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
465465

466466
DEF_HELPER_FLAGS_2(sve_last_active_element, TCG_CALL_NO_RWG, s32, ptr, i32)
467467

468+
DEF_HELPER_FLAGS_4(sve_revb_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
469+
DEF_HELPER_FLAGS_4(sve_revb_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
470+
DEF_HELPER_FLAGS_4(sve_revb_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
471+
472+
DEF_HELPER_FLAGS_4(sve_revh_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
473+
DEF_HELPER_FLAGS_4(sve_revh_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
474+
475+
DEF_HELPER_FLAGS_4(sve_revw_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
476+
477+
DEF_HELPER_FLAGS_4(sve_rbit_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
478+
DEF_HELPER_FLAGS_4(sve_rbit_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
479+
DEF_HELPER_FLAGS_4(sve_rbit_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
480+
DEF_HELPER_FLAGS_4(sve_rbit_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
481+
468482
DEF_HELPER_FLAGS_5(sve_and_pppp, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
469483
DEF_HELPER_FLAGS_5(sve_bic_pppp, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
470484
DEF_HELPER_FLAGS_5(sve_eor_pppp, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)

target/arm/sve.decode

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,13 @@ CPY_m_v 00000101 .. 100000 100 ... ..... ..... @rd_pg_rn
456456
# SVE copy element from general register to vector (predicated)
457457
CPY_m_r 00000101 .. 101000 101 ... ..... ..... @rd_pg_rn
458458

459+
# SVE reverse within elements
460+
# Note esz >= operation size
461+
REVB 00000101 .. 1001 00 100 ... ..... ..... @rd_pg_rn
462+
REVH 00000101 .. 1001 01 100 ... ..... ..... @rd_pg_rn
463+
REVW 00000101 .. 1001 10 100 ... ..... ..... @rd_pg_rn
464+
RBIT 00000101 .. 1001 11 100 ... ..... ..... @rd_pg_rn
465+
459466
### SVE Predicate Logical Operations Group
460467

461468
# SVE predicate logical operations

target/arm/sve_helper.c

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,26 @@ static inline uint64_t expand_pred_s(uint8_t byte)
238238
return word[byte & 0x11];
239239
}
240240

241+
/* Swap 16-bit words within a 32-bit word. */
242+
static inline uint32_t hswap32(uint32_t h)
243+
{
244+
return rol32(h, 16);
245+
}
246+
247+
/* Swap 16-bit words within a 64-bit word. */
248+
static inline uint64_t hswap64(uint64_t h)
249+
{
250+
uint64_t m = 0x0000ffff0000ffffull;
251+
h = rol64(h, 32);
252+
return ((h & m) << 16) | ((h >> 16) & m);
253+
}
254+
255+
/* Swap 32-bit words within a 64-bit word. */
256+
static inline uint64_t wswap64(uint64_t h)
257+
{
258+
return rol64(h, 32);
259+
}
260+
241261
#define LOGICAL_PPPP(NAME, FUNC) \
242262
void HELPER(NAME)(void *vd, void *vn, void *vm, void *vg, uint32_t desc) \
243263
{ \
@@ -616,6 +636,20 @@ DO_ZPZ(sve_neg_h, uint16_t, H1_2, DO_NEG)
616636
DO_ZPZ(sve_neg_s, uint32_t, H1_4, DO_NEG)
617637
DO_ZPZ_D(sve_neg_d, uint64_t, DO_NEG)
618638

639+
DO_ZPZ(sve_revb_h, uint16_t, H1_2, bswap16)
640+
DO_ZPZ(sve_revb_s, uint32_t, H1_4, bswap32)
641+
DO_ZPZ_D(sve_revb_d, uint64_t, bswap64)
642+
643+
DO_ZPZ(sve_revh_s, uint32_t, H1_4, hswap32)
644+
DO_ZPZ_D(sve_revh_d, uint64_t, hswap64)
645+
646+
DO_ZPZ_D(sve_revw_d, uint64_t, wswap64)
647+
648+
DO_ZPZ(sve_rbit_b, uint8_t, H1, revbit8)
649+
DO_ZPZ(sve_rbit_h, uint16_t, H1_2, revbit16)
650+
DO_ZPZ(sve_rbit_s, uint32_t, H1_4, revbit32)
651+
DO_ZPZ_D(sve_rbit_d, uint64_t, revbit64)
652+
619653
/* Three-operand expander, unpredicated, in which the third operand is "wide".
620654
*/
621655
#define DO_ZZW(NAME, TYPE, TYPEW, H, OP) \
@@ -1587,13 +1621,6 @@ void HELPER(sve_rev_b)(void *vd, void *vn, uint32_t desc)
15871621
}
15881622
}
15891623

1590-
static inline uint64_t hswap64(uint64_t h)
1591-
{
1592-
uint64_t m = 0x0000ffff0000ffffull;
1593-
h = rol64(h, 32);
1594-
return ((h & m) << 16) | ((h >> 16) & m);
1595-
}
1596-
15971624
void HELPER(sve_rev_h)(void *vd, void *vn, uint32_t desc)
15981625
{
15991626
intptr_t i, j, opr_sz = simd_oprsz(desc);

target/arm/translate-sve.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2643,6 +2643,44 @@ static bool trans_CPY_m_v(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
26432643
return true;
26442644
}
26452645

2646+
static bool trans_REVB(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
2647+
{
2648+
static gen_helper_gvec_3 * const fns[4] = {
2649+
NULL,
2650+
gen_helper_sve_revb_h,
2651+
gen_helper_sve_revb_s,
2652+
gen_helper_sve_revb_d,
2653+
};
2654+
return do_zpz_ool(s, a, fns[a->esz]);
2655+
}
2656+
2657+
static bool trans_REVH(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
2658+
{
2659+
static gen_helper_gvec_3 * const fns[4] = {
2660+
NULL,
2661+
NULL,
2662+
gen_helper_sve_revh_s,
2663+
gen_helper_sve_revh_d,
2664+
};
2665+
return do_zpz_ool(s, a, fns[a->esz]);
2666+
}
2667+
2668+
static bool trans_REVW(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
2669+
{
2670+
return do_zpz_ool(s, a, a->esz == 3 ? gen_helper_sve_revw_d : NULL);
2671+
}
2672+
2673+
static bool trans_RBIT(DisasContext *s, arg_rpr_esz *a, uint32_t insn)
2674+
{
2675+
static gen_helper_gvec_3 * const fns[4] = {
2676+
gen_helper_sve_rbit_b,
2677+
gen_helper_sve_rbit_h,
2678+
gen_helper_sve_rbit_s,
2679+
gen_helper_sve_rbit_d,
2680+
};
2681+
return do_zpz_ool(s, a, fns[a->esz]);
2682+
}
2683+
26462684
/*
26472685
*** SVE Memory - 32-bit Gather and Unsized Contiguous Group
26482686
*/

0 commit comments

Comments
 (0)