From patchwork Thu Sep 7 18:19:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 111957 Delivered-To: patch@linaro.org Received: by 10.37.128.210 with SMTP id c18csp519821ybm; Thu, 7 Sep 2017 11:21:51 -0700 (PDT) X-Received: by 10.55.109.66 with SMTP id i63mr298327qkc.19.1504808511711; Thu, 07 Sep 2017 11:21:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504808511; cv=none; d=google.com; s=arc-20160816; b=Qx1nhRJhts96nBsHUcn6LiYA8+LQrI6dSkPYD5p+MHXOrKRr/eS0YvtJeQHEUbxVNs S2Wvc+wVbE5G7aE1rDi2sjcBCeTE0gIhstNKK2vrZJBxyLMFHdX3MtpQxA+uHlx29LyL NnZa6qRhXGVJQwpu/MEV/l/Q889XG69gipESm9IHB2w/hhSRQWPa4wHfhAUkvufhocDt cxzzgneNBimDzffSkQ7sVZta6eHOJtV0L3Mh/p6YxmzNnXN2xA8z4jQQc9U2WboLBS/k K8gTULRAY5J/yr7eSFl66vQ//4hg0/yUbFP36XxzPxFotG1DqZkDL++XrnOA5ABwipFq Rlhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:to:from:dkim-signature:arc-authentication-results; bh=U8G7jLxyl2fvoViYLUQ2i9RVyDuMQWVbBH5sbJtd/IU=; b=QW7arVglqxXSEcDU6FyF156pXqQeBJeDPQLVhiJV522WK3fyoQYAEsl6chFrcOnCJ7 PqG/iKeUiiEMUItyXeX0bhLi8Aur1Ll4jhSNEFANXPuhxqi3m+BwXTQjx2sjB8MtIl3X kO0UlAHvcj8nBuFrqqRRCl1MdZq80Y0v6WSVfasYuVo5nX+y4H7nu5UqqMJXTuKFHD3+ 23zVOxBm6RUQ8u8pdeoUSrlnNOcXwCjFCApaHviwtz9Ye3b7SgSGbOpg2nqlhGlcR/Zu kikcKCae+yQQKNwpVQr11NCJivu3Phmsx110oOpGvYqPY3MY1DHC1AGCr571LiPTV6bm MGfA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=M+2Y06aG; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [208.118.235.17]) by mx.google.com with ESMTPS id t125si280794qkb.502.2017.09.07.11.21.51 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 07 Sep 2017 11:21:51 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=M+2Y06aG; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:41660 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dq1Qz-0004da-GC for patch@linaro.org; Thu, 07 Sep 2017 14:21:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41791) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dq1P2-0003IT-LV for qemu-devel@nongnu.org; Thu, 07 Sep 2017 14:19:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dq1Ox-0007ZJ-1G for qemu-devel@nongnu.org; Thu, 07 Sep 2017 14:19:48 -0400 Received: from mail-pg0-x229.google.com ([2607:f8b0:400e:c05::229]:37144) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dq1Ow-0007Yk-PA for qemu-devel@nongnu.org; Thu, 07 Sep 2017 14:19:42 -0400 Received: by mail-pg0-x229.google.com with SMTP id d8so854103pgt.4 for ; Thu, 07 Sep 2017 11:19:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=U8G7jLxyl2fvoViYLUQ2i9RVyDuMQWVbBH5sbJtd/IU=; b=M+2Y06aG+zPRTd2Ca7H8mLcR8oIi/Fx3oM/mCx/OPmkPLHPMSuImh+yEpiraPa/YEr 4uzPHJtOkOJoKVmKIjGeRQvLB7YEZbr0QbNz+UnozkYZ1dlO+WM/gMtREsjb0UXFVv7q S5j1SYCFGYB5wgb0NEChE+8XMZcW1HBdpZ1uU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=U8G7jLxyl2fvoViYLUQ2i9RVyDuMQWVbBH5sbJtd/IU=; b=gOTLxCRoPBKolWl7qsM+LqjNSfTw+MiCDGH0LSEVvUxHJAm6yg7NaqiaanSXjNP3hV 3bV2oEe8ZgtB0DC7G6z9OD6ACpGxkiVw9+4U02Sa7ewzHnF3FoJwCQEKwWGc8Iwa1yZZ M+1j7+tu/lysJE11Ag9lqZsb6ZIqbCv7eVqOh3OnOzgYx+bwI73jvGiC2H60ptF0mHip +cXRWg3LCPt8ljFOOk2ucFe/X4NmTFIc6fXb+OAgwzBf6/J15zDU8wt10fn+BjZo01Hv t/p9pcK0umn/+O+p5k7GuPsRPrlr35j9Xgc6RUNjnrK5g3uX+PA7hGI5SJh9mwlmcveM FZ1w== X-Gm-Message-State: AHPjjUixJGR/RdL/+5CtwPh/j1FGmxNBrUcD7JbpTZf1xipXDpWRZsWj nKux+xaudtbw3T3d7JjZAw== X-Google-Smtp-Source: ADKCNb6FEF6AAWGG/eBy3uKjOFYA+RDuQsvHhc8vteQylc1i/kucUo9rC+AE1AhjU6xXOJzx3HMJ4g== X-Received: by 10.99.4.8 with SMTP id 8mr216134pge.123.1504808381470; Thu, 07 Sep 2017 11:19:41 -0700 (PDT) Received: from pike.twiddle.net (97-126-108-236.tukw.qwest.net. [97.126.108.236]) by smtp.gmail.com with ESMTPSA id s68sm412051pfd.72.2017.09.07.11.19.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 07 Sep 2017 11:19:40 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 7 Sep 2017 11:19:35 -0700 Message-Id: <20170907181938.3948-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.13.5 In-Reply-To: <20170907181938.3948-1-richard.henderson@linaro.org> References: <20170907181938.3948-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c05::229 Subject: [Qemu-devel] [PULL 1/4] target/alpha: Convert to DisasJumpType X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, Richard Henderson Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Richard Henderson Signed-off-by: Richard Henderson --- target/alpha/translate.c | 132 ++++++++++++++++++++--------------------------- 1 file changed, 55 insertions(+), 77 deletions(-) -- 2.13.5 diff --git a/target/alpha/translate.c b/target/alpha/translate.c index f465752208..a75bf5dd90 100644 --- a/target/alpha/translate.c +++ b/target/alpha/translate.c @@ -25,11 +25,10 @@ #include "exec/exec-all.h" #include "tcg-op.h" #include "exec/cpu_ldst.h" - #include "exec/helper-proto.h" #include "exec/helper-gen.h" - #include "trace-tcg.h" +#include "exec/translator.h" #include "exec/log.h" @@ -73,32 +72,12 @@ struct DisasContext { bool singlestep_enabled; }; -/* Return values from translate_one, indicating the state of the TB. - Note that zero indicates that we are not exiting the TB. */ - -typedef enum { - NO_EXIT, - - /* We have emitted one or more goto_tb. No fixup required. */ - EXIT_GOTO_TB, - - /* We are not using a goto_tb (for whatever reason), but have updated - the PC (for whatever reason), so there's no need to do it again on - exiting the TB. */ - EXIT_PC_UPDATED, - EXIT_PC_UPDATED_NOCHAIN, - - /* We are exiting the TB, but have neither emitted a goto_tb, nor - updated the PC for the next instruction to be executed. */ - EXIT_PC_STALE, - - /* We are exiting the TB due to page crossing or space constraints. */ - EXIT_FALLTHRU, - - /* We are ending the TB with a noreturn function call, e.g. longjmp. - No following code will be executed. */ - EXIT_NORETURN, -} ExitStatus; +/* Target-specific return values from translate_one, indicating the + state of the TB. Note that DISAS_NEXT indicates that we are not + exiting the TB. */ +#define DISAS_PC_UPDATED_NOCHAIN DISAS_TARGET_0 +#define DISAS_PC_UPDATED DISAS_TARGET_1 +#define DISAS_PC_STALE DISAS_TARGET_2 /* global register indexes */ static TCGv_env cpu_env; @@ -301,14 +280,14 @@ static void gen_excp_1(int exception, int error_code) tcg_temp_free_i32(tmp1); } -static ExitStatus gen_excp(DisasContext *ctx, int exception, int error_code) +static DisasJumpType gen_excp(DisasContext *ctx, int exception, int error_code) { tcg_gen_movi_i64(cpu_pc, ctx->pc); gen_excp_1(exception, error_code); - return EXIT_NORETURN; + return DISAS_NORETURN; } -static inline ExitStatus gen_invalid(DisasContext *ctx) +static inline DisasJumpType gen_invalid(DisasContext *ctx) { return gen_excp(ctx, EXCP_OPCDEC, 0); } @@ -434,9 +413,9 @@ static inline void gen_store_mem(DisasContext *ctx, tcg_temp_free(tmp); } -static ExitStatus gen_store_conditional(DisasContext *ctx, int ra, int rb, - int32_t disp16, int mem_idx, - TCGMemOp op) +static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb, + int32_t disp16, int mem_idx, + TCGMemOp op) { TCGLabel *lab_fail, *lab_done; TCGv addr, val; @@ -468,7 +447,7 @@ static ExitStatus gen_store_conditional(DisasContext *ctx, int ra, int rb, gen_set_label(lab_done); tcg_gen_movi_i64(cpu_lock_addr, -1); - return NO_EXIT; + return DISAS_NEXT; } static bool in_superpage(DisasContext *ctx, int64_t addr) @@ -507,7 +486,7 @@ static bool use_goto_tb(DisasContext *ctx, uint64_t dest) #endif } -static ExitStatus gen_bdirect(DisasContext *ctx, int ra, int32_t disp) +static DisasJumpType gen_bdirect(DisasContext *ctx, int ra, int32_t disp) { uint64_t dest = ctx->pc + (disp << 2); @@ -522,15 +501,15 @@ static ExitStatus gen_bdirect(DisasContext *ctx, int ra, int32_t disp) tcg_gen_goto_tb(0); tcg_gen_movi_i64(cpu_pc, dest); tcg_gen_exit_tb((uintptr_t)ctx->tb); - return EXIT_GOTO_TB; + return DISAS_NORETURN; } else { tcg_gen_movi_i64(cpu_pc, dest); - return EXIT_PC_UPDATED; + return DISAS_PC_UPDATED; } } -static ExitStatus gen_bcond_internal(DisasContext *ctx, TCGCond cond, - TCGv cmp, int32_t disp) +static DisasJumpType gen_bcond_internal(DisasContext *ctx, TCGCond cond, + TCGv cmp, int32_t disp) { uint64_t dest = ctx->pc + (disp << 2); TCGLabel *lab_true = gen_new_label(); @@ -547,7 +526,7 @@ static ExitStatus gen_bcond_internal(DisasContext *ctx, TCGCond cond, tcg_gen_movi_i64(cpu_pc, dest); tcg_gen_exit_tb((uintptr_t)ctx->tb + 1); - return EXIT_GOTO_TB; + return DISAS_NORETURN; } else { TCGv_i64 z = tcg_const_i64(0); TCGv_i64 d = tcg_const_i64(dest); @@ -558,16 +537,16 @@ static ExitStatus gen_bcond_internal(DisasContext *ctx, TCGCond cond, tcg_temp_free_i64(z); tcg_temp_free_i64(d); tcg_temp_free_i64(p); - return EXIT_PC_UPDATED; + return DISAS_PC_UPDATED; } } -static ExitStatus gen_bcond(DisasContext *ctx, TCGCond cond, int ra, - int32_t disp, int mask) +static DisasJumpType gen_bcond(DisasContext *ctx, TCGCond cond, int ra, + int32_t disp, int mask) { if (mask) { TCGv tmp = tcg_temp_new(); - ExitStatus ret; + DisasJumpType ret; tcg_gen_andi_i64(tmp, load_gpr(ctx, ra), 1); ret = gen_bcond_internal(ctx, cond, tmp, disp); @@ -609,11 +588,11 @@ static void gen_fold_mzero(TCGCond cond, TCGv dest, TCGv src) } } -static ExitStatus gen_fbcond(DisasContext *ctx, TCGCond cond, int ra, - int32_t disp) +static DisasJumpType gen_fbcond(DisasContext *ctx, TCGCond cond, int ra, + int32_t disp) { TCGv cmp_tmp = tcg_temp_new(); - ExitStatus ret; + DisasJumpType ret; gen_fold_mzero(cond, cmp_tmp, load_fpr(ctx, ra)); ret = gen_bcond_internal(ctx, cond, cmp_tmp, disp); @@ -1159,7 +1138,7 @@ static void gen_rx(DisasContext *ctx, int ra, int set) tcg_temp_free(tmp); } -static ExitStatus gen_call_pal(DisasContext *ctx, int palcode) +static DisasJumpType gen_call_pal(DisasContext *ctx, int palcode) { /* We're emulating OSF/1 PALcode. Many of these are trivial access to internal cpu registers. */ @@ -1185,7 +1164,7 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int palcode) palcode &= 0xbf; goto do_call_pal; } - return NO_EXIT; + return DISAS_NEXT; } #ifndef CONFIG_USER_ONLY @@ -1232,7 +1211,7 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int palcode) /* Allow interrupts to be recognized right away. */ tcg_gen_movi_i64(cpu_pc, ctx->pc); - return EXIT_PC_UPDATED_NOCHAIN; + return DISAS_PC_UPDATED_NOCHAIN; case 0x36: /* RDPS */ @@ -1270,7 +1249,7 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int palcode) palcode &= 0x3f; goto do_call_pal; } - return NO_EXIT; + return DISAS_NEXT; } #endif return gen_invalid(ctx); @@ -1307,10 +1286,10 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int palcode) tcg_gen_goto_tb(0); tcg_gen_movi_i64(cpu_pc, entry); tcg_gen_exit_tb((uintptr_t)ctx->tb); - return EXIT_GOTO_TB; + return DISAS_NORETURN; } else { tcg_gen_movi_i64(cpu_pc, entry); - return EXIT_PC_UPDATED; + return DISAS_PC_UPDATED; } } #endif @@ -1344,7 +1323,7 @@ static int cpu_pr_data(int pr) return 0; } -static ExitStatus gen_mfpr(DisasContext *ctx, TCGv va, int regno) +static DisasJumpType gen_mfpr(DisasContext *ctx, TCGv va, int regno) { void (*helper)(TCGv); int data; @@ -1366,7 +1345,7 @@ static ExitStatus gen_mfpr(DisasContext *ctx, TCGv va, int regno) gen_io_start(); helper(va); gen_io_end(); - return EXIT_PC_STALE; + return DISAS_PC_STALE; } else { helper(va); } @@ -1393,10 +1372,10 @@ static ExitStatus gen_mfpr(DisasContext *ctx, TCGv va, int regno) break; } - return NO_EXIT; + return DISAS_NEXT; } -static ExitStatus gen_mtpr(DisasContext *ctx, TCGv vb, int regno) +static DisasJumpType gen_mtpr(DisasContext *ctx, TCGv vb, int regno) { int data; @@ -1424,7 +1403,7 @@ static ExitStatus gen_mtpr(DisasContext *ctx, TCGv vb, int regno) case 252: /* HALT */ gen_helper_halt(vb); - return EXIT_PC_STALE; + return DISAS_PC_STALE; case 251: /* ALARM */ @@ -1438,7 +1417,7 @@ static ExitStatus gen_mtpr(DisasContext *ctx, TCGv vb, int regno) that ended with a CALL_PAL. Since the base register usually only changes during boot, flushing everything works well. */ gen_helper_tb_flush(cpu_env); - return EXIT_PC_STALE; + return DISAS_PC_STALE; case 32 ... 39: /* Accessing the "non-shadow" general registers. */ @@ -1467,7 +1446,7 @@ static ExitStatus gen_mtpr(DisasContext *ctx, TCGv vb, int regno) break; } - return NO_EXIT; + return DISAS_NEXT; } #endif /* !USER_ONLY*/ @@ -1499,7 +1478,7 @@ static ExitStatus gen_mtpr(DisasContext *ctx, TCGv vb, int regno) } \ } while (0) -static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) +static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) { int32_t disp21, disp16, disp12 __attribute__((unused)); uint16_t fn11; @@ -1507,7 +1486,7 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) bool islit, real_islit; TCGv va, vb, vc, tmp, tmp2; TCGv_i32 t32; - ExitStatus ret; + DisasJumpType ret; /* Decode all instruction fields */ opc = extract32(insn, 26, 6); @@ -1530,7 +1509,7 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) lit = 0; } - ret = NO_EXIT; + ret = DISAS_NEXT; switch (opc) { case 0x00: /* CALL_PAL */ @@ -2432,7 +2411,7 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) gen_io_start(); gen_helper_load_pcc(va, cpu_env); gen_io_end(); - ret = EXIT_PC_STALE; + ret = DISAS_PC_STALE; } else { gen_helper_load_pcc(va, cpu_env); } @@ -2480,7 +2459,7 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) if (ra != 31) { tcg_gen_movi_i64(ctx->ir[ra], ctx->pc); } - ret = EXIT_PC_UPDATED; + ret = DISAS_PC_UPDATED; break; case 0x1B: @@ -2738,7 +2717,7 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn) tcg_temp_free(tmp); tcg_gen_andi_i64(cpu_pc, vb, ~3); /* Allow interrupts to be recognized right away. */ - ret = EXIT_PC_UPDATED_NOCHAIN; + ret = DISAS_PC_UPDATED_NOCHAIN; break; #else goto invalid_opc; @@ -2959,7 +2938,7 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) target_ulong pc_start; target_ulong pc_mask; uint32_t insn; - ExitStatus ret; + DisasJumpType ret; int num_insns; int max_insns; @@ -3040,41 +3019,40 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb) /* If we reach a page boundary, are single stepping, or exhaust instruction count, stop generation. */ - if (ret == NO_EXIT + if (ret == DISAS_NEXT && ((ctx.pc & pc_mask) == 0 || tcg_op_buf_full() || num_insns >= max_insns || singlestep || ctx.singlestep_enabled)) { - ret = EXIT_FALLTHRU; + ret = DISAS_TOO_MANY; } - } while (ret == NO_EXIT); + } while (ret == DISAS_NEXT); if (tb->cflags & CF_LAST_IO) { gen_io_end(); } switch (ret) { - case EXIT_GOTO_TB: - case EXIT_NORETURN: + case DISAS_NORETURN: break; - case EXIT_FALLTHRU: + case DISAS_TOO_MANY: if (use_goto_tb(&ctx, ctx.pc)) { tcg_gen_goto_tb(0); tcg_gen_movi_i64(cpu_pc, ctx.pc); tcg_gen_exit_tb((uintptr_t)ctx.tb); } /* FALLTHRU */ - case EXIT_PC_STALE: + case DISAS_PC_STALE: tcg_gen_movi_i64(cpu_pc, ctx.pc); /* FALLTHRU */ - case EXIT_PC_UPDATED: + case DISAS_PC_UPDATED: if (!use_exit_tb(&ctx)) { tcg_gen_lookup_and_goto_ptr(cpu_pc); break; } /* FALLTHRU */ - case EXIT_PC_UPDATED_NOCHAIN: + case DISAS_PC_UPDATED_NOCHAIN: if (ctx.singlestep_enabled) { gen_excp_1(EXCP_DEBUG, 0); } else {