Host vector support for arm neon.
-----BEGIN PGP SIGNATURE----- iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmC6d3sdHHJpY2hhcmQu aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV+9OQf/SuXFP5kbsxDB0TKc B6SSkuQo7wAzFfxGSlEtmXRajjAdi2B7bVnRHfFGvA1FuM+YTInuZ2Yazi5woiMP jtwY0Oz35nhegNJIJ9fOU7hOJOQSO2zAoHdAQlPL48aVYyqaNtZbxmSd6DMYc4yN UEcq0Wq6qKZSNnm9hXfNWn4Q4zdWczlW/UFeOKiVg1P3jPO2TqVBqas1qug67e7n Ov9lheO03nzSFRSh5A8z+va8w9TjaqvW4FIliNSZHhygRRD1NyxQsR7bbu0NkO58 3Jrl4JO2tpZB7M2um9FkDlu5537R3vDbYzXdcd1ZwxYGOcf5Hcd3QoSJUOA7WloC dP78ug== =NJu3 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-tcg-20210604' into staging Host vector support for arm neon. # gpg: Signature made Fri 04 Jun 2021 19:56:59 BST # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full] # Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F * remotes/rth-gitlab/tags/pull-tcg-20210604: tcg/arm: Implement TCG_TARGET_HAS_rotv_vec tcg/arm: Implement TCG_TARGET_HAS_roti_vec tcg/arm: Implement TCG_TARGET_HAS_shv_vec tcg/arm: Implement TCG_TARGET_HAS_bitsel_vec tcg/arm: Implement TCG_TARGET_HAS_minmax_vec tcg/arm: Implement TCG_TARGET_HAS_sat_vec tcg/arm: Implement TCG_TARGET_HAS_mul_vec tcg/arm: Implement TCG_TARGET_HAS_shi_vec tcg/arm: Implement andc, orc, abs, neg, not vector operations tcg/arm: Implement minimal vector operations tcg/arm: Implement tcg_out_dup*_vec tcg/arm: Implement tcg_out_mov for vector types tcg/arm: Implement tcg_out_ld/st for vector types tcg/arm: Add host vector framework tcg: Change parameters for tcg_target_const_match Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
6f398e533f
@ -277,11 +277,8 @@ static bool is_shimm1632(uint32_t v32, int *cmode, int *imm8)
|
||||
}
|
||||
}
|
||||
|
||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct)
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||
{
|
||||
int ct = arg_ct->ct;
|
||||
|
||||
if (ct & TCG_CT_CONST) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -13,11 +13,15 @@ C_O0_I1(r)
|
||||
C_O0_I2(r, r)
|
||||
C_O0_I2(r, rIN)
|
||||
C_O0_I2(s, s)
|
||||
C_O0_I2(w, r)
|
||||
C_O0_I3(s, s, s)
|
||||
C_O0_I4(r, r, rI, rI)
|
||||
C_O0_I4(s, s, s, s)
|
||||
C_O1_I1(r, l)
|
||||
C_O1_I1(r, r)
|
||||
C_O1_I1(w, r)
|
||||
C_O1_I1(w, w)
|
||||
C_O1_I1(w, wr)
|
||||
C_O1_I2(r, 0, rZ)
|
||||
C_O1_I2(r, l, l)
|
||||
C_O1_I2(r, r, r)
|
||||
@ -26,6 +30,12 @@ C_O1_I2(r, r, rIK)
|
||||
C_O1_I2(r, r, rIN)
|
||||
C_O1_I2(r, r, ri)
|
||||
C_O1_I2(r, rZ, rZ)
|
||||
C_O1_I2(w, 0, w)
|
||||
C_O1_I2(w, w, w)
|
||||
C_O1_I2(w, w, wO)
|
||||
C_O1_I2(w, w, wV)
|
||||
C_O1_I2(w, w, wZ)
|
||||
C_O1_I3(w, w, w, w)
|
||||
C_O1_I4(r, r, r, rI, rI)
|
||||
C_O1_I4(r, r, rIN, rIK, 0)
|
||||
C_O2_I1(r, r, l)
|
||||
|
@ -11,6 +11,7 @@
|
||||
REGS('r', ALL_GENERAL_REGS)
|
||||
REGS('l', ALL_QLOAD_REGS)
|
||||
REGS('s', ALL_QSTORE_REGS)
|
||||
REGS('w', ALL_VECTOR_REGS)
|
||||
|
||||
/*
|
||||
* Define constraint letters for constants:
|
||||
@ -19,4 +20,6 @@ REGS('s', ALL_QSTORE_REGS)
|
||||
CONST('I', TCG_CT_CONST_ARM)
|
||||
CONST('K', TCG_CT_CONST_INV)
|
||||
CONST('N', TCG_CT_CONST_NEG)
|
||||
CONST('O', TCG_CT_CONST_ORRI)
|
||||
CONST('V', TCG_CT_CONST_ANDI)
|
||||
CONST('Z', TCG_CT_CONST_ZERO)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -78,19 +78,42 @@ typedef enum {
|
||||
TCG_REG_R13,
|
||||
TCG_REG_R14,
|
||||
TCG_REG_PC,
|
||||
|
||||
TCG_REG_Q0,
|
||||
TCG_REG_Q1,
|
||||
TCG_REG_Q2,
|
||||
TCG_REG_Q3,
|
||||
TCG_REG_Q4,
|
||||
TCG_REG_Q5,
|
||||
TCG_REG_Q6,
|
||||
TCG_REG_Q7,
|
||||
TCG_REG_Q8,
|
||||
TCG_REG_Q9,
|
||||
TCG_REG_Q10,
|
||||
TCG_REG_Q11,
|
||||
TCG_REG_Q12,
|
||||
TCG_REG_Q13,
|
||||
TCG_REG_Q14,
|
||||
TCG_REG_Q15,
|
||||
|
||||
TCG_AREG0 = TCG_REG_R6,
|
||||
TCG_REG_CALL_STACK = TCG_REG_R13,
|
||||
} TCGReg;
|
||||
|
||||
#define TCG_TARGET_NB_REGS 16
|
||||
#define TCG_TARGET_NB_REGS 32
|
||||
|
||||
#ifdef __ARM_ARCH_EXT_IDIV__
|
||||
#define use_idiv_instructions 1
|
||||
#else
|
||||
extern bool use_idiv_instructions;
|
||||
#endif
|
||||
|
||||
#ifdef __ARM_NEON__
|
||||
#define use_neon_instructions 1
|
||||
#else
|
||||
extern bool use_neon_instructions;
|
||||
#endif
|
||||
|
||||
/* used for function call generation */
|
||||
#define TCG_REG_CALL_STACK TCG_REG_R13
|
||||
#define TCG_TARGET_STACK_ALIGN 8
|
||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
@ -128,9 +151,26 @@ extern bool use_idiv_instructions;
|
||||
#define TCG_TARGET_HAS_direct_jump 0
|
||||
#define TCG_TARGET_HAS_qemu_st8_i32 0
|
||||
|
||||
enum {
|
||||
TCG_AREG0 = TCG_REG_R6,
|
||||
};
|
||||
#define TCG_TARGET_HAS_v64 use_neon_instructions
|
||||
#define TCG_TARGET_HAS_v128 use_neon_instructions
|
||||
#define TCG_TARGET_HAS_v256 0
|
||||
|
||||
#define TCG_TARGET_HAS_andc_vec 1
|
||||
#define TCG_TARGET_HAS_orc_vec 1
|
||||
#define TCG_TARGET_HAS_not_vec 1
|
||||
#define TCG_TARGET_HAS_neg_vec 1
|
||||
#define TCG_TARGET_HAS_abs_vec 1
|
||||
#define TCG_TARGET_HAS_roti_vec 0
|
||||
#define TCG_TARGET_HAS_rots_vec 0
|
||||
#define TCG_TARGET_HAS_rotv_vec 0
|
||||
#define TCG_TARGET_HAS_shi_vec 1
|
||||
#define TCG_TARGET_HAS_shs_vec 0
|
||||
#define TCG_TARGET_HAS_shv_vec 0
|
||||
#define TCG_TARGET_HAS_mul_vec 1
|
||||
#define TCG_TARGET_HAS_sat_vec 1
|
||||
#define TCG_TARGET_HAS_minmax_vec 1
|
||||
#define TCG_TARGET_HAS_bitsel_vec 1
|
||||
#define TCG_TARGET_HAS_cmpsel_vec 0
|
||||
|
||||
#define TCG_TARGET_DEFAULT_MO (0)
|
||||
#define TCG_TARGET_HAS_MEMORY_BSWAP 1
|
||||
|
16
tcg/arm/tcg-target.opc.h
Normal file
16
tcg/arm/tcg-target.opc.h
Normal file
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) 2019 Linaro
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* See the COPYING file in the top-level directory for details.
|
||||
*
|
||||
* Target-specific opcodes for host vector expansion. These will be
|
||||
* emitted by tcg_expand_vec_op. For those familiar with GCC internals,
|
||||
* consider these to be UNSPEC with names.
|
||||
*/
|
||||
|
||||
DEF(arm_sli_vec, 1, 2, 1, IMPLVEC)
|
||||
DEF(arm_sshl_vec, 1, 2, 0, IMPLVEC)
|
||||
DEF(arm_ushl_vec, 1, 2, 0, IMPLVEC)
|
@ -210,10 +210,8 @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
|
||||
}
|
||||
|
||||
/* test if a constant matches the constraint */
|
||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct)
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||
{
|
||||
int ct = arg_ct->ct;
|
||||
if (ct & TCG_CT_CONST) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -193,11 +193,8 @@ static inline bool is_p2m1(tcg_target_long val)
|
||||
}
|
||||
|
||||
/* test if a constant matches the constraint */
|
||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct)
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||
{
|
||||
int ct;
|
||||
ct = arg_ct->ct;
|
||||
if (ct & TCG_CT_CONST) {
|
||||
return 1;
|
||||
} else if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
|
||||
|
@ -238,10 +238,8 @@ static bool reloc_pc14(tcg_insn_unit *src_rw, const tcg_insn_unit *target)
|
||||
}
|
||||
|
||||
/* test if a constant matches the constraint */
|
||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct)
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||
{
|
||||
int ct = arg_ct->ct;
|
||||
if (ct & TCG_CT_CONST) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -145,10 +145,8 @@ static inline tcg_target_long sextreg(tcg_target_long val, int pos, int len)
|
||||
}
|
||||
|
||||
/* test if a constant matches the constraint */
|
||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct)
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||
{
|
||||
int ct = arg_ct->ct;
|
||||
if (ct & TCG_CT_CONST) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -417,11 +417,8 @@ static bool patch_reloc(tcg_insn_unit *src_rw, int type,
|
||||
}
|
||||
|
||||
/* Test if a constant matches the constraint. */
|
||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct)
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||
{
|
||||
int ct = arg_ct->ct;
|
||||
|
||||
if (ct & TCG_CT_CONST) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -341,11 +341,8 @@ static bool patch_reloc(tcg_insn_unit *src_rw, int type,
|
||||
}
|
||||
|
||||
/* test if a constant matches the constraint */
|
||||
static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct)
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||
{
|
||||
int ct = arg_ct->ct;
|
||||
|
||||
if (ct & TCG_CT_CONST) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -148,8 +148,7 @@ static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1,
|
||||
static bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
|
||||
TCGReg base, intptr_t ofs);
|
||||
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target);
|
||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct);
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct);
|
||||
#ifdef TCG_TARGET_NEED_LDST_LABELS
|
||||
static int tcg_out_ldst_finalize(TCGContext *s);
|
||||
#endif
|
||||
@ -4078,7 +4077,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||
ts = arg_temp(arg);
|
||||
|
||||
if (ts->val_type == TEMP_VAL_CONST
|
||||
&& tcg_target_const_match(ts->val, ts->type, arg_ct)) {
|
||||
&& tcg_target_const_match(ts->val, ts->type, arg_ct->ct)) {
|
||||
/* constant is OK for instruction */
|
||||
const_args[i] = 1;
|
||||
new_args[i] = ts->val;
|
||||
|
@ -789,11 +789,9 @@ static inline bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
|
||||
}
|
||||
|
||||
/* Test if a constant matches the constraint. */
|
||||
static int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||
const TCGArgConstraint *arg_ct)
|
||||
static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||
{
|
||||
/* No need to return 0 or 1, 0 or != 0 is good enough. */
|
||||
return arg_ct->ct & TCG_CT_CONST;
|
||||
return ct & TCG_CT_CONST;
|
||||
}
|
||||
|
||||
static void tcg_target_init(TCGContext *s)
|
||||
|
Loading…
Reference in New Issue
Block a user