1 /* 2 * Copyright (c) 2006-2021, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2022-11-09 WangXiaoyao Add portable asm support 9 */ 10 #ifndef __OPCODE_H__ 11 #define __OPCODE_H__ 12 13 /** 14 * @brief binary opcode pseudo operations 15 * Used to bypass toolchain restriction on extension ISA 16 * 17 * WARNING: Xuantie ISAs are not compatible to each other in opcode. 18 * It's painful to port this file, and should be really careful. 19 */ 20 21 /** 22 * @brief RISC-V instruction formats 23 */ 24 25 /** 26 * R type: .insn r opcode6, func3, func7, rd, rs1, rs2 27 * 28 * +-------+-----+-----+-------+----+---------+ 29 * | func7 | rs2 | rs1 | func3 | rd | opcode6 | 30 * +-------+-----+-----+-------+----+---------+ 31 * 31 25 20 15 12 7 0 32 */ 33 #define __OPC_INSN_FORMAT_R(opcode, func3, func7, rd, rs1, rs2) \ 34 ".insn r "RT_STRINGIFY(opcode)","RT_STRINGIFY(func3)","RT_STRINGIFY(func7)","RT_STRINGIFY(rd)","RT_STRINGIFY(rs1)","RT_STRINGIFY(rs2) 35 36 /** 37 * @brief Xuantie T-HEAD extension ISA format 38 * Compatible to Xuantie C906R2S1 user manual v06 39 */ 40 #define __OPC_INSN_FORMAT_CACHE(func7, rs2, rs1) \ 41 __OPC_INSN_FORMAT_R(0x0b, 0x0, func7, x0, rs1, rs2) 42 43 #ifdef _TOOLCHAIN_SUPP_XTHEADE_ISA_ 44 #define OPC_SYNC "sync" 45 #define OPC_SYNC_I "sync.i" 46 47 #define OPC_DCACHE_CALL "dcache.call" 48 #define OPC_DCACHE_IALL "dcache.iall" 49 #define OPC_DCACHE_CIALL "dcache.ciall" 50 51 #define OPC_ICACHE_IALL "icache.iall" 52 53 #define OPC_DCACHE_CVA(rs1) "dcache.cva "RT_STRINGIFY(rs1) 54 #define OPC_DCACHE_IVA(rs1) "dcache.iva "RT_STRINGIFY(rs1) 55 #define OPC_DCACHE_CIVA(rs1) "dcache.civa "RT_STRINGIFY(rs1) 56 57 #define OPC_ICACHE_IVA(rs1) "icache.iva "RT_STRINGIFY(rs1) 58 #else /* !_TOOLCHAIN_NOT_SUPP_THEAD_ISA_ */ 59 #define OPC_SYNC ".long 0x0180000B" 60 #define OPC_SYNC_I ".long 0x01A0000B" 61 62 #define OPC_DCACHE_CALL ".long 0x0010000B" 63 #define OPC_DCACHE_IALL ".long 0x0020000B" 64 #define OPC_DCACHE_CIALL ".long 0x0030000B" 65 66 #define OPC_ICACHE_IALL ".long 0x0100000B" 67 68 #define OPC_DCACHE_CVA(rs1) __OPC_INSN_FORMAT_CACHE(0x1, x4, rs1) 69 #define OPC_DCACHE_IVA(rs1) __OPC_INSN_FORMAT_CACHE(0x1, x6, rs1) 70 #define OPC_DCACHE_CIVA(rs1) __OPC_INSN_FORMAT_CACHE(0x1, x7, rs1) 71 72 #define OPC_ICACHE_IVA(rs1) __OPC_INSN_FORMAT_CACHE(0x1, x16, rs1) 73 #endif /* _TOOLCHAIN_NOT_SUPP_THEAD_ISA_ */ 74 75 #ifdef _TOOLCHAIN_SUPP_ZIFENCEI_ISA_ 76 #define OPC_FENCE_I "fence.i" 77 #else /* !_TOOLCHAIN_SUPP_ZIFENCEI_ISA_ */ 78 #define OPC_FENCE_I ".long 0x0000100F" 79 #endif /* _TOOLCHAIN_SUPP_ZIFENCEI_ISA_ */ 80 81 #endif /* __OPCODE_H__ */