tcg: Add TCG_TARGET_CALL_{RET,ARG}_I128
Fill in the parameters for the host ABI for Int128 for those backends which require no extra modification. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
e9709e17ac
commit
5427a9a760
@ -54,6 +54,8 @@ typedef enum {
|
|||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
||||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_div_i32 1
|
#define TCG_TARGET_HAS_div_i32 1
|
||||||
|
@ -91,6 +91,8 @@ extern bool use_neon_instructions;
|
|||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
||||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_ext8s_i32 1
|
#define TCG_TARGET_HAS_ext8s_i32 1
|
||||||
|
@ -92,6 +92,8 @@ typedef enum {
|
|||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
||||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_movcond_i32 1
|
#define TCG_TARGET_HAS_movcond_i32 1
|
||||||
|
@ -89,6 +89,8 @@ typedef enum {
|
|||||||
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
#endif
|
#endif
|
||||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||||
|
|
||||||
/* MOVN/MOVZ instructions detection */
|
/* MOVN/MOVZ instructions detection */
|
||||||
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
|
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
|
||||||
|
@ -54,6 +54,9 @@
|
|||||||
#else
|
#else
|
||||||
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
#endif
|
#endif
|
||||||
|
/* Note sysv arg alignment applies only to 2-word types, not more. */
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||||
|
|
||||||
/* For some memory operations, we need a scratch that isn't R0. For the AIX
|
/* For some memory operations, we need a scratch that isn't R0. For the AIX
|
||||||
calling convention, we can re-use the TOC register since we'll be reloading
|
calling convention, we can re-use the TOC register since we'll be reloading
|
||||||
|
@ -85,9 +85,12 @@ typedef enum {
|
|||||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
|
||||||
#if TCG_TARGET_REG_BITS == 32
|
#if TCG_TARGET_REG_BITS == 32
|
||||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
|
||||||
#else
|
#else
|
||||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
|
||||||
#endif
|
#endif
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_movcond_i32 0
|
#define TCG_TARGET_HAS_movcond_i32 0
|
||||||
|
@ -169,6 +169,8 @@ extern uint64_t s390_facilities[3];
|
|||||||
#define TCG_TARGET_CALL_STACK_OFFSET 160
|
#define TCG_TARGET_CALL_STACK_OFFSET 160
|
||||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
|
||||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
|
||||||
|
|
||||||
#define TCG_TARGET_HAS_MEMORY_BSWAP 1
|
#define TCG_TARGET_HAS_MEMORY_BSWAP 1
|
||||||
|
|
||||||
|
@ -73,6 +73,8 @@ typedef enum {
|
|||||||
#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS)
|
#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS)
|
||||||
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
|
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
|
||||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
|
||||||
|
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
|
||||||
|
|
||||||
#if defined(__VIS__) && __VIS__ >= 0x300
|
#if defined(__VIS__) && __VIS__ >= 0x300
|
||||||
#define use_vis3_instructions 1
|
#define use_vis3_instructions 1
|
||||||
|
@ -765,8 +765,8 @@ static void init_call_layout(TCGHelperInfo *info)
|
|||||||
break;
|
break;
|
||||||
case dh_typecode_i128:
|
case dh_typecode_i128:
|
||||||
info->nr_out = 128 / TCG_TARGET_REG_BITS;
|
info->nr_out = 128 / TCG_TARGET_REG_BITS;
|
||||||
info->out_kind = TCG_CALL_RET_NORMAL; /* TODO */
|
info->out_kind = TCG_TARGET_CALL_RET_I128;
|
||||||
switch (/* TODO */ TCG_CALL_RET_NORMAL) {
|
switch (TCG_TARGET_CALL_RET_I128) {
|
||||||
case TCG_CALL_RET_NORMAL:
|
case TCG_CALL_RET_NORMAL:
|
||||||
/* Query the last register now to trigger any assert early. */
|
/* Query the last register now to trigger any assert early. */
|
||||||
tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
|
tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
|
||||||
@ -854,7 +854,7 @@ static void init_call_layout(TCGHelperInfo *info)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TCG_TYPE_I128:
|
case TCG_TYPE_I128:
|
||||||
switch (/* TODO */ TCG_CALL_ARG_NORMAL) {
|
switch (TCG_TARGET_CALL_ARG_I128) {
|
||||||
case TCG_CALL_ARG_EVEN:
|
case TCG_CALL_ARG_EVEN:
|
||||||
layout_arg_even(&cum);
|
layout_arg_even(&cum);
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
Loading…
Reference in New Issue
Block a user