14a136e0aSClaudio Fontana /* 24a136e0aSClaudio Fontana * Initial TCG Implementation for aarch64 34a136e0aSClaudio Fontana * 44a136e0aSClaudio Fontana * Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH 54a136e0aSClaudio Fontana * Written by Claudio Fontana 64a136e0aSClaudio Fontana * 74a136e0aSClaudio Fontana * This work is licensed under the terms of the GNU GPL, version 2 or 84a136e0aSClaudio Fontana * (at your option) any later version. 94a136e0aSClaudio Fontana * 104a136e0aSClaudio Fontana * See the COPYING file in the top-level directory for details. 114a136e0aSClaudio Fontana */ 124a136e0aSClaudio Fontana 1314e54f8eSMarkus Armbruster #ifndef AARCH64_TCG_TARGET_H 1414e54f8eSMarkus Armbruster #define AARCH64_TCG_TARGET_H 154a136e0aSClaudio Fontana 160dd0c7faSRichard Henderson #include "host/cpuinfo.h" 170dd0c7faSRichard Henderson 188587c30cSRichard Henderson #define TCG_TARGET_INSN_UNIT_SIZE 4 19d59d83a1SRichard Henderson #define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1) 204a136e0aSClaudio Fontana 214a136e0aSClaudio Fontana typedef enum { 22d82b78e4SRichard Henderson TCG_REG_X0, TCG_REG_X1, TCG_REG_X2, TCG_REG_X3, 23d82b78e4SRichard Henderson TCG_REG_X4, TCG_REG_X5, TCG_REG_X6, TCG_REG_X7, 24d82b78e4SRichard Henderson TCG_REG_X8, TCG_REG_X9, TCG_REG_X10, TCG_REG_X11, 25d82b78e4SRichard Henderson TCG_REG_X12, TCG_REG_X13, TCG_REG_X14, TCG_REG_X15, 26d82b78e4SRichard Henderson TCG_REG_X16, TCG_REG_X17, TCG_REG_X18, TCG_REG_X19, 27d82b78e4SRichard Henderson TCG_REG_X20, TCG_REG_X21, TCG_REG_X22, TCG_REG_X23, 28d82b78e4SRichard Henderson TCG_REG_X24, TCG_REG_X25, TCG_REG_X26, TCG_REG_X27, 29d82b78e4SRichard Henderson TCG_REG_X28, TCG_REG_X29, TCG_REG_X30, 30d82b78e4SRichard Henderson 31d82b78e4SRichard Henderson /* X31 is either the stack pointer or zero, depending on context. */ 32d82b78e4SRichard Henderson TCG_REG_SP = 31, 33d82b78e4SRichard Henderson TCG_REG_XZR = 31, 34d82b78e4SRichard Henderson 3514e4c1e2SRichard Henderson TCG_REG_V0 = 32, TCG_REG_V1, TCG_REG_V2, TCG_REG_V3, 3614e4c1e2SRichard Henderson TCG_REG_V4, TCG_REG_V5, TCG_REG_V6, TCG_REG_V7, 3714e4c1e2SRichard Henderson TCG_REG_V8, TCG_REG_V9, TCG_REG_V10, TCG_REG_V11, 3814e4c1e2SRichard Henderson TCG_REG_V12, TCG_REG_V13, TCG_REG_V14, TCG_REG_V15, 3914e4c1e2SRichard Henderson TCG_REG_V16, TCG_REG_V17, TCG_REG_V18, TCG_REG_V19, 4014e4c1e2SRichard Henderson TCG_REG_V20, TCG_REG_V21, TCG_REG_V22, TCG_REG_V23, 4114e4c1e2SRichard Henderson TCG_REG_V24, TCG_REG_V25, TCG_REG_V26, TCG_REG_V27, 4214e4c1e2SRichard Henderson TCG_REG_V28, TCG_REG_V29, TCG_REG_V30, TCG_REG_V31, 4314e4c1e2SRichard Henderson 44d82b78e4SRichard Henderson /* Aliases. */ 45d82b78e4SRichard Henderson TCG_REG_FP = TCG_REG_X29, 46d82b78e4SRichard Henderson TCG_REG_LR = TCG_REG_X30, 47d82b78e4SRichard Henderson TCG_AREG0 = TCG_REG_X19, 484a136e0aSClaudio Fontana } TCGReg; 494a136e0aSClaudio Fontana 5014e4c1e2SRichard Henderson #define TCG_TARGET_NB_REGS 64 514a136e0aSClaudio Fontana 524a136e0aSClaudio Fontana /* used for function call generation */ 534a136e0aSClaudio Fontana #define TCG_REG_CALL_STACK TCG_REG_SP 544a136e0aSClaudio Fontana #define TCG_TARGET_STACK_ALIGN 16 554a136e0aSClaudio Fontana #define TCG_TARGET_CALL_STACK_OFFSET 0 56eb8b0224SRichard Henderson #define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL 57c8eef960SRichard Henderson #define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL 587f89fdf8SRichard Henderson #ifdef CONFIG_DARWIN 597f89fdf8SRichard Henderson # define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL 607f89fdf8SRichard Henderson #else 615427a9a7SRichard Henderson # define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN 627f89fdf8SRichard Henderson #endif 635427a9a7SRichard Henderson #define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL 644a136e0aSClaudio Fontana 650dd0c7faSRichard Henderson #define have_lse (cpuinfo & CPUINFO_LSE) 660dd0c7faSRichard Henderson #define have_lse2 (cpuinfo & CPUINFO_LSE2) 67b7649419SRichard Henderson 684a136e0aSClaudio Fontana /* optional instructions */ 698678b71cSRichard Henderson #define TCG_TARGET_HAS_div_i32 1 708678b71cSRichard Henderson #define TCG_TARGET_HAS_rem_i32 1 7131f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext8s_i32 1 7231f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext16s_i32 1 7331f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext8u_i32 1 7431f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext16u_i32 1 759c4a059dSClaudio Fontana #define TCG_TARGET_HAS_bswap16_i32 1 769c4a059dSClaudio Fontana #define TCG_TARGET_HAS_bswap32_i32 1 7714b155ddSRichard Henderson #define TCG_TARGET_HAS_not_i32 1 784a136e0aSClaudio Fontana #define TCG_TARGET_HAS_rot_i32 1 7914b155ddSRichard Henderson #define TCG_TARGET_HAS_andc_i32 1 8014b155ddSRichard Henderson #define TCG_TARGET_HAS_orc_i32 1 8114b155ddSRichard Henderson #define TCG_TARGET_HAS_eqv_i32 1 824a136e0aSClaudio Fontana #define TCG_TARGET_HAS_nand_i32 0 834a136e0aSClaudio Fontana #define TCG_TARGET_HAS_nor_i32 0 8453c76c19SRichard Henderson #define TCG_TARGET_HAS_clz_i32 1 8553c76c19SRichard Henderson #define TCG_TARGET_HAS_ctz_i32 1 86a768e4e9SRichard Henderson #define TCG_TARGET_HAS_ctpop_i32 0 87b3c56df7SRichard Henderson #define TCG_TARGET_HAS_deposit_i32 1 88e2179f94SRichard Henderson #define TCG_TARGET_HAS_extract_i32 1 89e2179f94SRichard Henderson #define TCG_TARGET_HAS_sextract_i32 1 90464c2969SRichard Henderson #define TCG_TARGET_HAS_extract2_i32 1 91f58a7deaSRichard Henderson #define TCG_TARGET_HAS_negsetcond_i32 1 92c6e929e7SRichard Henderson #define TCG_TARGET_HAS_add2_i32 1 93c6e929e7SRichard Henderson #define TCG_TARGET_HAS_sub2_i32 1 944a136e0aSClaudio Fontana #define TCG_TARGET_HAS_mulu2_i32 0 954a136e0aSClaudio Fontana #define TCG_TARGET_HAS_muls2_i32 0 9603271524SRichard Henderson #define TCG_TARGET_HAS_muluh_i32 0 9703271524SRichard Henderson #define TCG_TARGET_HAS_mulsh_i32 0 9813d885b0SRichard Henderson #define TCG_TARGET_HAS_extr_i64_i32 0 9907ce0b05SRichard Henderson #define TCG_TARGET_HAS_qemu_st8_i32 0 1004a136e0aSClaudio Fontana 1018678b71cSRichard Henderson #define TCG_TARGET_HAS_div_i64 1 1028678b71cSRichard Henderson #define TCG_TARGET_HAS_rem_i64 1 10331f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext8s_i64 1 10431f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext16s_i64 1 10531f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext32s_i64 1 10631f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext8u_i64 1 10731f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext16u_i64 1 10831f1275bSClaudio Fontana #define TCG_TARGET_HAS_ext32u_i64 1 1099c4a059dSClaudio Fontana #define TCG_TARGET_HAS_bswap16_i64 1 1109c4a059dSClaudio Fontana #define TCG_TARGET_HAS_bswap32_i64 1 1119c4a059dSClaudio Fontana #define TCG_TARGET_HAS_bswap64_i64 1 11214b155ddSRichard Henderson #define TCG_TARGET_HAS_not_i64 1 1134a136e0aSClaudio Fontana #define TCG_TARGET_HAS_rot_i64 1 11414b155ddSRichard Henderson #define TCG_TARGET_HAS_andc_i64 1 11514b155ddSRichard Henderson #define TCG_TARGET_HAS_orc_i64 1 11614b155ddSRichard Henderson #define TCG_TARGET_HAS_eqv_i64 1 1174a136e0aSClaudio Fontana #define TCG_TARGET_HAS_nand_i64 0 1184a136e0aSClaudio Fontana #define TCG_TARGET_HAS_nor_i64 0 11953c76c19SRichard Henderson #define TCG_TARGET_HAS_clz_i64 1 12053c76c19SRichard Henderson #define TCG_TARGET_HAS_ctz_i64 1 121a768e4e9SRichard Henderson #define TCG_TARGET_HAS_ctpop_i64 0 122b3c56df7SRichard Henderson #define TCG_TARGET_HAS_deposit_i64 1 123e2179f94SRichard Henderson #define TCG_TARGET_HAS_extract_i64 1 124e2179f94SRichard Henderson #define TCG_TARGET_HAS_sextract_i64 1 125464c2969SRichard Henderson #define TCG_TARGET_HAS_extract2_i64 1 126f58a7deaSRichard Henderson #define TCG_TARGET_HAS_negsetcond_i64 1 127c6e929e7SRichard Henderson #define TCG_TARGET_HAS_add2_i64 1 128c6e929e7SRichard Henderson #define TCG_TARGET_HAS_sub2_i64 1 1294a136e0aSClaudio Fontana #define TCG_TARGET_HAS_mulu2_i64 0 1304a136e0aSClaudio Fontana #define TCG_TARGET_HAS_muls2_i64 0 1311fcc9ddfSRichard Henderson #define TCG_TARGET_HAS_muluh_i64 1 1321fcc9ddfSRichard Henderson #define TCG_TARGET_HAS_mulsh_i64 1 133a8583393SRichard Henderson 134929124ecSRichard Henderson /* 135929124ecSRichard Henderson * Without FEAT_LSE2, we must use LDXP+STXP to implement atomic 128-bit load, 136929124ecSRichard Henderson * which requires writable pages. We must defer to the helper for user-only, 137929124ecSRichard Henderson * but in system mode all ram is writable for the host. 138929124ecSRichard Henderson */ 139929124ecSRichard Henderson #ifdef CONFIG_USER_ONLY 140929124ecSRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128 have_lse2 141929124ecSRichard Henderson #else 142929124ecSRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128 1 143929124ecSRichard Henderson #endif 14412fde9bcSRichard Henderson 145339adf2fSRichard Henderson #define TCG_TARGET_HAS_tst 1 146caf3eaccSRichard Henderson 14714e4c1e2SRichard Henderson #define TCG_TARGET_HAS_v64 1 14814e4c1e2SRichard Henderson #define TCG_TARGET_HAS_v128 1 14914e4c1e2SRichard Henderson #define TCG_TARGET_HAS_v256 0 15014e4c1e2SRichard Henderson 15114e4c1e2SRichard Henderson #define TCG_TARGET_HAS_andc_vec 1 15214e4c1e2SRichard Henderson #define TCG_TARGET_HAS_orc_vec 1 153ed523473SRichard Henderson #define TCG_TARGET_HAS_nand_vec 0 154ed523473SRichard Henderson #define TCG_TARGET_HAS_nor_vec 0 155ed523473SRichard Henderson #define TCG_TARGET_HAS_eqv_vec 0 15614e4c1e2SRichard Henderson #define TCG_TARGET_HAS_not_vec 1 15714e4c1e2SRichard Henderson #define TCG_TARGET_HAS_neg_vec 1 158a456394aSRichard Henderson #define TCG_TARGET_HAS_abs_vec 1 159b0f7e744SRichard Henderson #define TCG_TARGET_HAS_roti_vec 0 16023850a74SRichard Henderson #define TCG_TARGET_HAS_rots_vec 0 1615d0ceda9SRichard Henderson #define TCG_TARGET_HAS_rotv_vec 0 16214e4c1e2SRichard Henderson #define TCG_TARGET_HAS_shi_vec 1 16314e4c1e2SRichard Henderson #define TCG_TARGET_HAS_shs_vec 0 16479525dfdSRichard Henderson #define TCG_TARGET_HAS_shv_vec 1 16514e4c1e2SRichard Henderson #define TCG_TARGET_HAS_mul_vec 1 166d32648d4SRichard Henderson #define TCG_TARGET_HAS_sat_vec 1 16793f332a5SRichard Henderson #define TCG_TARGET_HAS_minmax_vec 1 168a9e434a5SRichard Henderson #define TCG_TARGET_HAS_bitsel_vec 1 169f75da298SRichard Henderson #define TCG_TARGET_HAS_cmpsel_vec 0 170*b04574d4SRichard Henderson #define TCG_TARGET_HAS_tst_vec 1 17114e4c1e2SRichard Henderson 172a8583393SRichard Henderson #define TCG_TARGET_DEFAULT_MO (0) 173659ef5cbSRichard Henderson #define TCG_TARGET_NEED_LDST_LABELS 17455129955SRichard Henderson #define TCG_TARGET_NEED_POOL_LABELS 175659ef5cbSRichard Henderson 17614e54f8eSMarkus Armbruster #endif /* AARCH64_TCG_TARGET_H */ 177