From nobody Wed Nov 5 18:19:38 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496682148064350.2341429971102; Mon, 5 Jun 2017 10:02:28 -0700 (PDT) Received: from localhost ([::1]:34400 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHvOZ-00061N-D6 for importer@patchew.org; Mon, 05 Jun 2017 13:02:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56665) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHvFK-0004Km-Lz for qemu-devel@nongnu.org; Mon, 05 Jun 2017 12:52:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dHvFI-0003jT-Fz for qemu-devel@nongnu.org; Mon, 05 Jun 2017 12:52:50 -0400 Received: from mail-qt0-x244.google.com ([2607:f8b0:400d:c0d::244]:36125) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dHvFI-0003hu-5C for qemu-devel@nongnu.org; Mon, 05 Jun 2017 12:52:48 -0400 Received: by mail-qt0-x244.google.com with SMTP id s33so9906426qtg.3 for ; Mon, 05 Jun 2017 09:52:47 -0700 (PDT) Received: from bigtime.twiddle.net.com ([2602:47:d954:1500:5e51:4fff:fe40:9c64]) by smtp.gmail.com with ESMTPSA id c6sm1637044qtb.56.2017.06.05.09.52.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 05 Jun 2017 09:52:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=qRLi2AJdCXsrlkWbMLTKA33ENNSgl+GyBb1tpOahMMg=; b=qNjAAbII4gFCzFaJuM2dDhHPprTAPV700fS+9KGXh/9+IvsBngZIcGLXWzdoCeeLo6 pWhNiugCfVqcnpcC5+yQbPwv8lRUIrwxP7G52AUatQnUegVRYsu4850IqPIRQzbP3kvd AifVIGx3reZubkj+eFaSSqumMnrsDktm3qqjqJrc6uxMBp84FD46Zt0o/9Zr2j/3sOIE 2ciw9xEgrT8t64TuGjqHwuqFX5KISqFoRy4t7yVTvw8Zerx5ZzDSXI8k9D/rcAGcRSen isnm+T/5mUpYH21y50BWapxaH+rUconhIr+sN/yvVjilLDz2DwWbh6OPjr4nCkO3ns99 8muA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=qRLi2AJdCXsrlkWbMLTKA33ENNSgl+GyBb1tpOahMMg=; b=k5H6MOFH+nS4Q7iRmtePd6E2h4OJ2IBiKdqiC+fOOEf1kLpcB3BUnhVW8aGkGWXwuS arYeS7K/CyJ/4SP1YSlCzBGkTzN8sC8jGGUjR907sTT6WJtguomo5eVoXvx6HV6JLXMI 5y4zQ23nKjaXlQXvNmoZrR+UnbxPgAI4cWK/PgzirTdlAOmm11cqx2DCzUyKt752LvUG JQ/TxkgDnlgNsWKBRKt/QbeW3QmYoGgs8q1OlJCslYza9xVKcumIO1/WRhB5tm06I3gz skURL4JkqmD7K1lOwIvJlhARgYDAEWyzkre7hxBSY+Zl0ZcrGvBSK8XJw9ABKDit3W/1 pPrw== X-Gm-Message-State: AODbwcB7Ml5U0n5ffvbFYFsWJVM4pAqS1jOpoFE0BY18Bl+IOlkTPcGE eMuP9OCedDqZQXawdag= X-Received: by 10.55.102.138 with SMTP id a132mr23371731qkc.66.1496681567237; Mon, 05 Jun 2017 09:52:47 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 5 Jun 2017 09:52:14 -0700 Message-Id: <20170605165233.4135-8-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170605165233.4135-1-rth@twiddle.net> References: <20170605165233.4135-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::244 Subject: [Qemu-devel] [PULL 07/26] target/arm: optimize indirect branches 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, "Emilio G. Cota" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Emilio G. Cota" Speed up indirect branches by jumping to the target if it is valid. Softmmu measurements (see later commit for user-mode results): Note: baseline (i.e. speedup =3D=3D 1x) is QEMU v2.9.0. - Impact on Boot time | setup | ARM debian jessie boot+shutdown time | stddev | |--------+--------------------------------------+--------| | v2.9.0 | 8.84 | 0.07 | | +cross | 8.85 | 0.03 | | +jr | 8.83 | 0.06 | - NBench, arm-softmmu (debian jessie guest). Hos= t: Intel i7-4790K @ 4.00GHz 1.3x +-+-----------------------------------------------------------------= --------------------------------------------+-+ | = | | cross #= ### | 1.25x +cross+jr..........................................................#= ++#.........................................+-+ | #### #= # | | +++# # #= # | | +++ **** # #= # | 1.2x +-+...................................####............*..*..#......#= ..#.........................................+-+ | **** # * * # #= # #### | | * * # * * # #= # # # | 1.15x +-+................................*..*..#............*..*..#......#= ..#.....#..#................................+-+ | * * # * * # #= # # # | | * * # #### * * # #= # # # | | * * # # # * * # #= # # # #### | 1.1x +-+................................*..*..#......#..#..*..*..#......#= ..#.....#..#.........................#..#...+-+ | * * # # # * * # #= # # # # # | | * * # # # * * # #= # # # # # | 1.05x +-+..........................####..*..*..#......#..#..*..*..#......#= ..#.....#..#......+++............*****..#...+-+ | ***** # * * # # # * * # *****= # # # +++ | ****### * * # | | *+++* # * * # # # * * # *+++*= # **** # *****### * * # * * # | | *****### +++#### * * # * * # ***** # * * # * *= # * * # * | *++# * * # * * # | 1x +-++-+*+++*-+#++****++#++*+-+*++#+-*++*++#-+*+++*-+#++*++*++#++*+-+*= ++#+-*++*++#-+*+++*-+#++*++*++#++*+-+*++#+-++-+ | * * # * * # * * # * * # * * # * * # * *= # * * # * * # * * # * * # | | * * # * * # * * # * * # * * # * * # * *= # * * # * * # * * # * * # | 0.95x +-+---*****###--****###--*****###--****###--*****###--****###--*****= ###--****###--*****###--****###--*****###---+-+ ASSIGNMENT BITFIELD FOURFP EMULATION HUFFMAN LU DECOMPOSITIONE= URAL NNUMERIC SOSTRING SORT hmean png: http://imgur.com/eOLmZNR NB. 'cross' represents the previous commit. Signed-off-by: Emilio G. Cota Message-Id: <1493263764-18657-8-git-send-email-cota@braap.org> [rth: Replace gen_jr global variable with DISAS_EXIT state.] Signed-off-by: Richard Henderson --- target/arm/translate.c | 25 ++++++++++++++++--------- target/arm/translate.h | 4 ++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/target/arm/translate.c b/target/arm/translate.c index d72953f..0862f9e 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -1182,7 +1182,7 @@ static void gen_exception_internal_insn(DisasContext = *s, int offset, int excp) gen_set_condexec(s); gen_set_pc_im(s, s->pc - offset); gen_exception_internal(excp); - s->is_jmp =3D DISAS_JUMP; + s->is_jmp =3D DISAS_EXC; } =20 static void gen_exception_insn(DisasContext *s, int offset, int excp, @@ -1191,14 +1191,14 @@ static void gen_exception_insn(DisasContext *s, int= offset, int excp, gen_set_condexec(s); gen_set_pc_im(s, s->pc - offset); gen_exception(excp, syn, target_el); - s->is_jmp =3D DISAS_JUMP; + s->is_jmp =3D DISAS_EXC; } =20 /* Force a TB lookup after an instruction that changes the CPU state. */ static inline void gen_lookup_tb(DisasContext *s) { tcg_gen_movi_i32(cpu_R[15], s->pc & ~1); - s->is_jmp =3D DISAS_JUMP; + s->is_jmp =3D DISAS_EXIT; } =20 static inline void gen_hlt(DisasContext *s, int imm) @@ -4150,19 +4150,23 @@ static inline bool use_goto_tb(DisasContext *s, tar= get_ulong dest) #endif } =20 -static inline void gen_goto_tb(DisasContext *s, int n, target_ulong dest) +static void gen_goto_ptr(void) +{ + TCGv addr =3D tcg_temp_new(); + tcg_gen_extu_i32_tl(addr, cpu_R[15]); + tcg_gen_lookup_and_goto_ptr(addr); + tcg_temp_free(addr); +} + +static void gen_goto_tb(DisasContext *s, int n, target_ulong dest) { if (use_goto_tb(s, dest)) { tcg_gen_goto_tb(n); gen_set_pc_im(s, dest); tcg_gen_exit_tb((uintptr_t)s->tb + n); } else { - TCGv addr =3D tcg_temp_new(); - gen_set_pc_im(s, dest); - tcg_gen_extu_i32_tl(addr, cpu_R[15]); - tcg_gen_lookup_and_goto_ptr(addr); - tcg_temp_free(addr); + gen_goto_ptr(); } } =20 @@ -12095,11 +12099,14 @@ void gen_intermediate_code(CPUARMState *env, Tran= slationBlock *tb) gen_set_pc_im(dc, dc->pc); /* fall through */ case DISAS_JUMP: + gen_goto_ptr(); + break; default: /* indicate that the hash table must be used to find the next = TB */ tcg_gen_exit_tb(0); break; case DISAS_TB_JUMP: + case DISAS_EXC: /* nothing more to generate */ break; case DISAS_WFI: diff --git a/target/arm/translate.h b/target/arm/translate.h index 6b2cc34..15d383d 100644 --- a/target/arm/translate.h +++ b/target/arm/translate.h @@ -139,6 +139,10 @@ static void disas_set_insn_syndrome(DisasContext *s, u= int32_t syn) * custom end-of-TB code) */ #define DISAS_BX_EXCRET 11 +/* For instructions which want an immediate exit to the main loop, + * as opposed to attempting to use lookup_and_goto_ptr. + */ +#define DISAS_EXIT 12 =20 #ifdef TARGET_AARCH64 void a64_translate_init(void); --=20 2.9.4