1fb1f70f3SAlistair Francis /* 2fb1f70f3SAlistair Francis * Tiny Code Generator for QEMU 3fb1f70f3SAlistair Francis * 4fb1f70f3SAlistair Francis * Copyright (c) 2018 SiFive, Inc 5fb1f70f3SAlistair Francis * 6fb1f70f3SAlistair Francis * Permission is hereby granted, free of charge, to any person obtaining a copy 7fb1f70f3SAlistair Francis * of this software and associated documentation files (the "Software"), to deal 8fb1f70f3SAlistair Francis * in the Software without restriction, including without limitation the rights 9fb1f70f3SAlistair Francis * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10fb1f70f3SAlistair Francis * copies of the Software, and to permit persons to whom the Software is 11fb1f70f3SAlistair Francis * furnished to do so, subject to the following conditions: 12fb1f70f3SAlistair Francis * 13fb1f70f3SAlistair Francis * The above copyright notice and this permission notice shall be included in 14fb1f70f3SAlistair Francis * all copies or substantial portions of the Software. 15fb1f70f3SAlistair Francis * 16fb1f70f3SAlistair Francis * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17fb1f70f3SAlistair Francis * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18fb1f70f3SAlistair Francis * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19fb1f70f3SAlistair Francis * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20fb1f70f3SAlistair Francis * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21fb1f70f3SAlistair Francis * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22fb1f70f3SAlistair Francis * THE SOFTWARE. 23fb1f70f3SAlistair Francis */ 24fb1f70f3SAlistair Francis 25fb1f70f3SAlistair Francis #ifndef RISCV_TCG_TARGET_H 26fb1f70f3SAlistair Francis #define RISCV_TCG_TARGET_H 27fb1f70f3SAlistair Francis 28b86c6ba6SRichard Henderson #include "host/cpuinfo.h" 29b86c6ba6SRichard Henderson 30fb1f70f3SAlistair Francis #define TCG_TARGET_INSN_UNIT_SIZE 4 31f63e7089SHuang Shiyuan #define TCG_TARGET_NB_REGS 64 3226a75d12SRichard Henderson #define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1) 33fb1f70f3SAlistair Francis 34fb1f70f3SAlistair Francis typedef enum { 35f63e7089SHuang Shiyuan TCG_REG_ZERO, TCG_REG_RA, TCG_REG_SP, TCG_REG_GP, 36f63e7089SHuang Shiyuan TCG_REG_TP, TCG_REG_T0, TCG_REG_T1, TCG_REG_T2, 37f63e7089SHuang Shiyuan TCG_REG_S0, TCG_REG_S1, TCG_REG_A0, TCG_REG_A1, 38f63e7089SHuang Shiyuan TCG_REG_A2, TCG_REG_A3, TCG_REG_A4, TCG_REG_A5, 39f63e7089SHuang Shiyuan TCG_REG_A6, TCG_REG_A7, TCG_REG_S2, TCG_REG_S3, 40f63e7089SHuang Shiyuan TCG_REG_S4, TCG_REG_S5, TCG_REG_S6, TCG_REG_S7, 41f63e7089SHuang Shiyuan TCG_REG_S8, TCG_REG_S9, TCG_REG_S10, TCG_REG_S11, 42f63e7089SHuang Shiyuan TCG_REG_T3, TCG_REG_T4, TCG_REG_T5, TCG_REG_T6, 43f63e7089SHuang Shiyuan 44f63e7089SHuang Shiyuan /* RISC-V V Extension registers */ 45f63e7089SHuang Shiyuan TCG_REG_V0, TCG_REG_V1, TCG_REG_V2, TCG_REG_V3, 46f63e7089SHuang Shiyuan TCG_REG_V4, TCG_REG_V5, TCG_REG_V6, TCG_REG_V7, 47f63e7089SHuang Shiyuan TCG_REG_V8, TCG_REG_V9, TCG_REG_V10, TCG_REG_V11, 48f63e7089SHuang Shiyuan TCG_REG_V12, TCG_REG_V13, TCG_REG_V14, TCG_REG_V15, 49f63e7089SHuang Shiyuan TCG_REG_V16, TCG_REG_V17, TCG_REG_V18, TCG_REG_V19, 50f63e7089SHuang Shiyuan TCG_REG_V20, TCG_REG_V21, TCG_REG_V22, TCG_REG_V23, 51f63e7089SHuang Shiyuan TCG_REG_V24, TCG_REG_V25, TCG_REG_V26, TCG_REG_V27, 52f63e7089SHuang Shiyuan TCG_REG_V28, TCG_REG_V29, TCG_REG_V30, TCG_REG_V31, 53fb1f70f3SAlistair Francis 54fb1f70f3SAlistair Francis /* aliases */ 55fb1f70f3SAlistair Francis TCG_AREG0 = TCG_REG_S0, 56fb1f70f3SAlistair Francis TCG_GUEST_BASE_REG = TCG_REG_S1, 57fb1f70f3SAlistair Francis TCG_REG_TMP0 = TCG_REG_T6, 58fb1f70f3SAlistair Francis TCG_REG_TMP1 = TCG_REG_T5, 59fb1f70f3SAlistair Francis TCG_REG_TMP2 = TCG_REG_T4, 60fb1f70f3SAlistair Francis } TCGReg; 61fb1f70f3SAlistair Francis 62fb1f70f3SAlistair Francis /* used for function call generation */ 63fb1f70f3SAlistair Francis #define TCG_REG_CALL_STACK TCG_REG_SP 64fb1f70f3SAlistair Francis #define TCG_TARGET_STACK_ALIGN 16 65fb1f70f3SAlistair Francis #define TCG_TARGET_CALL_STACK_OFFSET 0 66eb8b0224SRichard Henderson #define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL 67c8eef960SRichard Henderson #define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL 685427a9a7SRichard Henderson #define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL 695427a9a7SRichard Henderson #define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL 70fb1f70f3SAlistair Francis 71fb1f70f3SAlistair Francis /* optional instructions */ 7241e4c0a9SRichard Henderson #define TCG_TARGET_HAS_negsetcond_i32 1 73fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_div_i32 1 74fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_rem_i32 1 75fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_div2_i32 0 76b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB) 77fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_deposit_i32 0 78fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_extract_i32 0 79fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_sextract_i32 0 80fce1296fSRichard Henderson #define TCG_TARGET_HAS_extract2_i32 0 81fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_add2_i32 1 82fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_sub2_i32 1 83fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_mulu2_i32 0 84fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_muls2_i32 0 85aeb6326eSRichard Henderson #define TCG_TARGET_HAS_muluh_i32 0 86aeb6326eSRichard Henderson #define TCG_TARGET_HAS_mulsh_i32 0 87fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext8s_i32 1 88fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext16s_i32 1 89fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext8u_i32 1 90fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext16u_i32 1 91b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_bswap16_i32 (cpuinfo & CPUINFO_ZBB) 92b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_bswap32_i32 (cpuinfo & CPUINFO_ZBB) 93fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_not_i32 1 94b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_andc_i32 (cpuinfo & CPUINFO_ZBB) 95b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_orc_i32 (cpuinfo & CPUINFO_ZBB) 96b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_eqv_i32 (cpuinfo & CPUINFO_ZBB) 97fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_nand_i32 0 98fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_nor_i32 0 99b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_clz_i32 (cpuinfo & CPUINFO_ZBB) 100b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_ctz_i32 (cpuinfo & CPUINFO_ZBB) 101b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_ctpop_i32 (cpuinfo & CPUINFO_ZBB) 102fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_brcond2 1 103fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_setcond2 1 10407ce0b05SRichard Henderson #define TCG_TARGET_HAS_qemu_st8_i32 0 105fb1f70f3SAlistair Francis 10641e4c0a9SRichard Henderson #define TCG_TARGET_HAS_negsetcond_i64 1 107fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_div_i64 1 108fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_rem_i64 1 109fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_div2_i64 0 110b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_rot_i64 (cpuinfo & CPUINFO_ZBB) 111fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_deposit_i64 0 112fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_extract_i64 0 113fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_sextract_i64 0 114fce1296fSRichard Henderson #define TCG_TARGET_HAS_extract2_i64 0 11513d885b0SRichard Henderson #define TCG_TARGET_HAS_extr_i64_i32 1 116fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext8s_i64 1 117fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext16s_i64 1 118fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext32s_i64 1 119fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext8u_i64 1 120fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext16u_i64 1 121fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_ext32u_i64 1 122b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_bswap16_i64 (cpuinfo & CPUINFO_ZBB) 123b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_bswap32_i64 (cpuinfo & CPUINFO_ZBB) 124b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_bswap64_i64 (cpuinfo & CPUINFO_ZBB) 125fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_not_i64 1 126b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_andc_i64 (cpuinfo & CPUINFO_ZBB) 127b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_orc_i64 (cpuinfo & CPUINFO_ZBB) 128b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_eqv_i64 (cpuinfo & CPUINFO_ZBB) 129fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_nand_i64 0 130fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_nor_i64 0 131b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_clz_i64 (cpuinfo & CPUINFO_ZBB) 132b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_ctz_i64 (cpuinfo & CPUINFO_ZBB) 133b86c6ba6SRichard Henderson #define TCG_TARGET_HAS_ctpop_i64 (cpuinfo & CPUINFO_ZBB) 134fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_add2_i64 1 135fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_sub2_i64 1 136fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_mulu2_i64 0 137fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_muls2_i64 0 138fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_muluh_i64 1 139fb1f70f3SAlistair Francis #define TCG_TARGET_HAS_mulsh_i64 1 140fb1f70f3SAlistair Francis 14112fde9bcSRichard Henderson #define TCG_TARGET_HAS_qemu_ldst_i128 0 14212fde9bcSRichard Henderson 143caf3eaccSRichard Henderson #define TCG_TARGET_HAS_tst 0 144caf3eaccSRichard Henderson 145f63e7089SHuang Shiyuan /* vector instructions */ 146*4b7868f8STANG Tiancheng #define TCG_TARGET_HAS_v64 (cpuinfo & CPUINFO_ZVE64X) 147*4b7868f8STANG Tiancheng #define TCG_TARGET_HAS_v128 (cpuinfo & CPUINFO_ZVE64X) 148*4b7868f8STANG Tiancheng #define TCG_TARGET_HAS_v256 (cpuinfo & CPUINFO_ZVE64X) 149f63e7089SHuang Shiyuan #define TCG_TARGET_HAS_andc_vec 0 150f63e7089SHuang Shiyuan #define TCG_TARGET_HAS_orc_vec 0 151f63e7089SHuang Shiyuan #define TCG_TARGET_HAS_nand_vec 0 152f63e7089SHuang Shiyuan #define TCG_TARGET_HAS_nor_vec 0 153f63e7089SHuang Shiyuan #define TCG_TARGET_HAS_eqv_vec 0 1545a63f599STANG Tiancheng #define TCG_TARGET_HAS_not_vec 1 155c283c074STANG Tiancheng #define TCG_TARGET_HAS_neg_vec 1 156f63e7089SHuang Shiyuan #define TCG_TARGET_HAS_abs_vec 0 157d1843219STANG Tiancheng #define TCG_TARGET_HAS_roti_vec 1 158d1843219STANG Tiancheng #define TCG_TARGET_HAS_rots_vec 1 159d1843219STANG Tiancheng #define TCG_TARGET_HAS_rotv_vec 1 160cbde22f1STANG Tiancheng #define TCG_TARGET_HAS_shi_vec 1 161cbde22f1STANG Tiancheng #define TCG_TARGET_HAS_shs_vec 1 162cbde22f1STANG Tiancheng #define TCG_TARGET_HAS_shv_vec 1 163101c1ef5STANG Tiancheng #define TCG_TARGET_HAS_mul_vec 1 164101c1ef5STANG Tiancheng #define TCG_TARGET_HAS_sat_vec 1 1651631f19bSTANG Tiancheng #define TCG_TARGET_HAS_minmax_vec 1 166f63e7089SHuang Shiyuan #define TCG_TARGET_HAS_bitsel_vec 0 167a31768c0STANG Tiancheng #define TCG_TARGET_HAS_cmpsel_vec 1 168f63e7089SHuang Shiyuan 169f63e7089SHuang Shiyuan #define TCG_TARGET_HAS_tst_vec 0 170f63e7089SHuang Shiyuan 171fb1f70f3SAlistair Francis #define TCG_TARGET_DEFAULT_MO (0) 172fb1f70f3SAlistair Francis 173fb1f70f3SAlistair Francis #define TCG_TARGET_NEED_LDST_LABELS 174fb1f70f3SAlistair Francis #define TCG_TARGET_NEED_POOL_LABELS 175fb1f70f3SAlistair Francis 176fb1f70f3SAlistair Francis #endif 177