1f8da88d7SSong Gao /* SPDX-License-Identifier: GPL-2.0-or-later */ 2f8da88d7SSong Gao /* 3f8da88d7SSong Gao * LoongArch translation routines. 4f8da88d7SSong Gao * 5f8da88d7SSong Gao * Copyright (c) 2021 Loongson Technology Corporation Limited 6f8da88d7SSong Gao */ 7f8da88d7SSong Gao 8f8da88d7SSong Gao #ifndef TARGET_LOONGARCH_TRANSLATE_H 9f8da88d7SSong Gao #define TARGET_LOONGARCH_TRANSLATE_H 10f8da88d7SSong Gao 11f8da88d7SSong Gao #include "exec/translator.h" 12f8da88d7SSong Gao 13*143d6785SSong Gao #define TRANS(NAME, FUNC, ...) \ 14*143d6785SSong Gao static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \ 15*143d6785SSong Gao { return FUNC(ctx, a, __VA_ARGS__); } 16*143d6785SSong Gao 17*143d6785SSong Gao /* 18*143d6785SSong Gao * If an operation is being performed on less than TARGET_LONG_BITS, 19*143d6785SSong Gao * it may require the inputs to be sign- or zero-extended; which will 20*143d6785SSong Gao * depend on the exact operation being performed. 21*143d6785SSong Gao */ 22*143d6785SSong Gao typedef enum { 23*143d6785SSong Gao EXT_NONE, 24*143d6785SSong Gao EXT_SIGN, 25*143d6785SSong Gao EXT_ZERO, 26*143d6785SSong Gao } DisasExtend; 27*143d6785SSong Gao 28f8da88d7SSong Gao typedef struct DisasContext { 29f8da88d7SSong Gao DisasContextBase base; 30f8da88d7SSong Gao target_ulong page_start; 31f8da88d7SSong Gao uint32_t opcode; 32f8da88d7SSong Gao int mem_idx; 33*143d6785SSong Gao TCGv zero; 34*143d6785SSong Gao /* Space for 3 operands plus 1 extra for address computation. */ 35*143d6785SSong Gao TCGv temp[4]; 36*143d6785SSong Gao uint8_t ntemp; 37f8da88d7SSong Gao } DisasContext; 38f8da88d7SSong Gao 39f8da88d7SSong Gao void generate_exception(DisasContext *ctx, int excp); 40f8da88d7SSong Gao 41f8da88d7SSong Gao extern TCGv cpu_gpr[32], cpu_pc; 42f8da88d7SSong Gao extern TCGv_i32 cpu_fscr0; 43f8da88d7SSong Gao extern TCGv_i64 cpu_fpr[32]; 44f8da88d7SSong Gao 45f8da88d7SSong Gao #endif 46