From nobody Tue Feb 10 02:00:34 2026 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.zohomail.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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508541839657643.8467604871732; Fri, 20 Oct 2017 16:23:59 -0700 (PDT) Received: from localhost ([::1]:55986 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e5gdq-0008MK-VB for importer@patchew.org; Fri, 20 Oct 2017 19:23:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44229) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e5gag-0005lS-UB for qemu-devel@nongnu.org; Fri, 20 Oct 2017 19:20:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e5gae-0007Vt-TS for qemu-devel@nongnu.org; Fri, 20 Oct 2017 19:20:34 -0400 Received: from mail-pf0-x244.google.com ([2607:f8b0:400e:c00::244]:52238) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1e5gae-0007Ve-Iw for qemu-devel@nongnu.org; Fri, 20 Oct 2017 19:20:32 -0400 Received: by mail-pf0-x244.google.com with SMTP id e64so13061628pfk.9 for ; Fri, 20 Oct 2017 16:20:32 -0700 (PDT) Received: from cloudburst.twiddle.net (97-113-165-104.tukw.qwest.net. [97.113.165.104]) by smtp.gmail.com with ESMTPSA id a17sm3532594pfk.173.2017.10.20.16.20.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 20 Oct 2017 16:20:30 -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 :mime-version:content-transfer-encoding; bh=yFf5aptS9JMyAj1nT49k1zhjUezvvexHNQGOVkPHuJA=; b=KukJ4ReE6MMfOHoKKVS6vvCNaiZkrux/GxR2/QekcSnmabokUYEag0NaOv9u3kXCfY XhOpC4eZTYKmxMZr6vGisCh79ZyxUtR2ZZR7iPWP/Nts5/K4KR4JemjoX9lkMgNu2h9m TcuiJ3qhhjAGsJ//QLHww01mUrscys6UdI5nI= 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:mime-version:content-transfer-encoding; bh=yFf5aptS9JMyAj1nT49k1zhjUezvvexHNQGOVkPHuJA=; b=LQ8E9fvrIrtG77paONgZrb9Rkhg0jMiWpMgEj1AWnmkZdyvSrJwwWrGyNwxDDB6yMh Tj86mCeCDFuJE9VLCTxOCJNccjkRUXOkbwibsQzIK7LS2xwxjixMlaxTUZCHl0B6+9or DW/onvnGR93kcjFB+NIOIpCY0fjoLS4+dNUYj9R/JxMXbljCxtrhk6Aho5/VYqi5UwVL IfKKydOKTZDRpFlJzhAe45cY1udjvCAwkfw8+hQ9yeHnpa+cZCd49p9ziiLEOzc5vR7s S5xhCURVlpRJwSEDnczNpkT9DoVnb4BAbVIqT+iXtUc7H5j89lugRE5NoF78glxuITSH feaQ== X-Gm-Message-State: AMCzsaUUuzMboHp5eQsWNozodyCaenyGcOc4lulZ2jDxDe4ORNeAec6s 6q5b9XadtX2qJfXwLl7QVh8LYWvsw3Y= X-Google-Smtp-Source: ABhQp+TIFc/WxURxQSDFjGl7nhiE80fEDvUHIfpbb3TG7SjP7TmTu9MnvDWmydfOUoYM5yuPwl+5Uw== X-Received: by 10.84.211.79 with SMTP id b73mr5241003pli.214.1508541631203; Fri, 20 Oct 2017 16:20:31 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Fri, 20 Oct 2017 16:19:34 -0700 Message-Id: <20171020232023.15010-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171020232023.15010-1-richard.henderson@linaro.org> References: <20171020232023.15010-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::244 Subject: [Qemu-devel] [PATCH v7 03/52] tcg: Propagate args to op->args in tcg.c 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: pbonzini@redhat.com, cota@braap.org, f4bug@amsat.org, Richard Henderson 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 From: Richard Henderson Reviewed-by: Emilio G. Cota Reviewed-by: Alex Benn=C3=A9e Signed-off-by: Richard Henderson --- tcg/tcg.c | 121 ++++++++++++++++++++++++++++++----------------------------= ---- 1 file changed, 58 insertions(+), 63 deletions(-) diff --git a/tcg/tcg.c b/tcg/tcg.c index 98673f2190..4f56077f64 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -1277,14 +1277,12 @@ void tcg_dump_ops(TCGContext *s) for (oi =3D s->gen_op_buf[0].next; oi !=3D 0; oi =3D op->next) { int i, k, nb_oargs, nb_iargs, nb_cargs; const TCGOpDef *def; - const TCGArg *args; TCGOpcode c; int col =3D 0; =20 op =3D &s->gen_op_buf[oi]; c =3D op->opc; def =3D &tcg_op_defs[c]; - args =3D op->args; =20 if (c =3D=3D INDEX_op_insn_start) { col +=3D qemu_log("%s ----", oi !=3D s->gen_op_buf[0].next ? "= \n" : ""); @@ -1292,9 +1290,9 @@ void tcg_dump_ops(TCGContext *s) for (i =3D 0; i < TARGET_INSN_START_WORDS; ++i) { target_ulong a; #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS - a =3D ((target_ulong)args[i * 2 + 1] << 32) | args[i * 2]; + a =3D deposit64(op->args[i * 2], 32, 32, op->args[i * 2 + = 1]); #else - a =3D args[i]; + a =3D op->args[i]; #endif col +=3D qemu_log(" " TARGET_FMT_lx, a); } @@ -1306,14 +1304,14 @@ void tcg_dump_ops(TCGContext *s) =20 /* function name, flags, out args */ col +=3D qemu_log(" %s %s,$0x%" TCG_PRIlx ",$%d", def->name, - tcg_find_helper(s, args[nb_oargs + nb_iargs]), - args[nb_oargs + nb_iargs + 1], nb_oargs); + tcg_find_helper(s, op->args[nb_oargs + nb_iarg= s]), + op->args[nb_oargs + nb_iargs + 1], nb_oargs); for (i =3D 0; i < nb_oargs; i++) { col +=3D qemu_log(",%s", tcg_get_arg_str_idx(s, buf, sizeo= f(buf), - args[i])); + op->args[i])); } for (i =3D 0; i < nb_iargs; i++) { - TCGArg arg =3D args[nb_oargs + i]; + TCGArg arg =3D op->args[nb_oargs + i]; const char *t =3D ""; if (arg !=3D TCG_CALL_DUMMY_ARG) { t =3D tcg_get_arg_str_idx(s, buf, sizeof(buf), arg); @@ -1333,14 +1331,14 @@ void tcg_dump_ops(TCGContext *s) col +=3D qemu_log(","); } col +=3D qemu_log("%s", tcg_get_arg_str_idx(s, buf, sizeof= (buf), - args[k++])); + op->args[k++])); } for (i =3D 0; i < nb_iargs; i++) { if (k !=3D 0) { col +=3D qemu_log(","); } col +=3D qemu_log("%s", tcg_get_arg_str_idx(s, buf, sizeof= (buf), - args[k++])); + op->args[k++])); } switch (c) { case INDEX_op_brcond_i32: @@ -1351,10 +1349,11 @@ void tcg_dump_ops(TCGContext *s) case INDEX_op_brcond_i64: case INDEX_op_setcond_i64: case INDEX_op_movcond_i64: - if (args[k] < ARRAY_SIZE(cond_name) && cond_name[args[k]])= { - col +=3D qemu_log(",%s", cond_name[args[k++]]); + if (op->args[k] < ARRAY_SIZE(cond_name) + && cond_name[op->args[k]]) { + col +=3D qemu_log(",%s", cond_name[op->args[k++]]); } else { - col +=3D qemu_log(",$0x%" TCG_PRIlx, args[k++]); + col +=3D qemu_log(",$0x%" TCG_PRIlx, op->args[k++]); } i =3D 1; break; @@ -1363,7 +1362,7 @@ void tcg_dump_ops(TCGContext *s) case INDEX_op_qemu_ld_i64: case INDEX_op_qemu_st_i64: { - TCGMemOpIdx oi =3D args[k++]; + TCGMemOpIdx oi =3D op->args[k++]; TCGMemOp op =3D get_memop(oi); unsigned ix =3D get_mmuidx(oi); =20 @@ -1388,14 +1387,15 @@ void tcg_dump_ops(TCGContext *s) case INDEX_op_brcond_i32: case INDEX_op_brcond_i64: case INDEX_op_brcond2_i32: - col +=3D qemu_log("%s$L%d", k ? "," : "", arg_label(args[k= ])->id); + col +=3D qemu_log("%s$L%d", k ? "," : "", + arg_label(op->args[k])->id); i++, k++; break; default: break; } for (; i < nb_cargs; i++, k++) { - col +=3D qemu_log("%s$0x%" TCG_PRIlx, k ? "," : "", args[k= ]); + col +=3D qemu_log("%s$0x%" TCG_PRIlx, k ? "," : "", op->ar= gs[k]); } } if (op->life) { @@ -1656,7 +1656,6 @@ static void liveness_pass_1(TCGContext *s, uint8_t *t= emp_state) TCGArg arg; =20 TCGOp * const op =3D &s->gen_op_buf[oi]; - TCGArg * const args =3D op->args; TCGOpcode opc =3D op->opc; const TCGOpDef *def =3D &tcg_op_defs[opc]; =20 @@ -1669,12 +1668,12 @@ static void liveness_pass_1(TCGContext *s, uint8_t = *temp_state) =20 nb_oargs =3D op->callo; nb_iargs =3D op->calli; - call_flags =3D args[nb_oargs + nb_iargs + 1]; + call_flags =3D op->args[nb_oargs + nb_iargs + 1]; =20 /* pure functions can be removed if their result is unused= */ if (call_flags & TCG_CALL_NO_SIDE_EFFECTS) { for (i =3D 0; i < nb_oargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; if (temp_state[arg] !=3D TS_DEAD) { goto do_not_remove_call; } @@ -1685,7 +1684,7 @@ static void liveness_pass_1(TCGContext *s, uint8_t *t= emp_state) =20 /* output args are dead */ for (i =3D 0; i < nb_oargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; if (temp_state[arg] & TS_DEAD) { arg_life |=3D DEAD_ARG << i; } @@ -1708,7 +1707,7 @@ static void liveness_pass_1(TCGContext *s, uint8_t *t= emp_state) =20 /* record arguments that die in this helper */ for (i =3D nb_oargs; i < nb_iargs + nb_oargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; if (arg !=3D TCG_CALL_DUMMY_ARG) { if (temp_state[arg] & TS_DEAD) { arg_life |=3D DEAD_ARG << i; @@ -1717,7 +1716,7 @@ static void liveness_pass_1(TCGContext *s, uint8_t *t= emp_state) } /* input arguments are live for preceding opcodes */ for (i =3D nb_oargs; i < nb_iargs + nb_oargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; if (arg !=3D TCG_CALL_DUMMY_ARG) { temp_state[arg] &=3D ~TS_DEAD; } @@ -1729,7 +1728,7 @@ static void liveness_pass_1(TCGContext *s, uint8_t *t= emp_state) break; case INDEX_op_discard: /* mark the temporary as dead */ - temp_state[args[0]] =3D TS_DEAD; + temp_state[op->args[0]] =3D TS_DEAD; break; =20 case INDEX_op_add2_i32: @@ -1750,15 +1749,15 @@ static void liveness_pass_1(TCGContext *s, uint8_t = *temp_state) the low part. The result can be optimized to a simple add or sub. This happens often for x86_64 guest when the cpu mode is set to 32 bit. */ - if (temp_state[args[1]] =3D=3D TS_DEAD) { - if (temp_state[args[0]] =3D=3D TS_DEAD) { + if (temp_state[op->args[1]] =3D=3D TS_DEAD) { + if (temp_state[op->args[0]] =3D=3D TS_DEAD) { goto do_remove; } /* Replace the opcode and adjust the args in place, leaving 3 unused args at the end. */ op->opc =3D opc =3D opc_new; - args[1] =3D args[2]; - args[2] =3D args[4]; + op->args[1] =3D op->args[2]; + op->args[2] =3D op->args[4]; /* Fall through and mark the single-word operation live. = */ nb_iargs =3D 2; nb_oargs =3D 1; @@ -1788,21 +1787,21 @@ static void liveness_pass_1(TCGContext *s, uint8_t = *temp_state) do_mul2: nb_iargs =3D 2; nb_oargs =3D 2; - if (temp_state[args[1]] =3D=3D TS_DEAD) { - if (temp_state[args[0]] =3D=3D TS_DEAD) { + if (temp_state[op->args[1]] =3D=3D TS_DEAD) { + if (temp_state[op->args[0]] =3D=3D TS_DEAD) { /* Both parts of the operation are dead. */ goto do_remove; } /* The high part of the operation is dead; generate the lo= w. */ op->opc =3D opc =3D opc_new; - args[1] =3D args[2]; - args[2] =3D args[3]; - } else if (temp_state[args[0]] =3D=3D TS_DEAD && have_opc_new2= ) { + op->args[1] =3D op->args[2]; + op->args[2] =3D op->args[3]; + } else if (temp_state[op->args[0]] =3D=3D TS_DEAD && have_opc_= new2) { /* The low part of the operation is dead; generate the hig= h. */ op->opc =3D opc =3D opc_new2; - args[0] =3D args[1]; - args[1] =3D args[2]; - args[2] =3D args[3]; + op->args[0] =3D op->args[1]; + op->args[1] =3D op->args[2]; + op->args[2] =3D op->args[3]; } else { goto do_not_remove; } @@ -1820,7 +1819,7 @@ static void liveness_pass_1(TCGContext *s, uint8_t *t= emp_state) implies side effects */ if (!(def->flags & TCG_OPF_SIDE_EFFECTS) && nb_oargs !=3D 0) { for (i =3D 0; i < nb_oargs; i++) { - if (temp_state[args[i]] !=3D TS_DEAD) { + if (temp_state[op->args[i]] !=3D TS_DEAD) { goto do_not_remove; } } @@ -1830,7 +1829,7 @@ static void liveness_pass_1(TCGContext *s, uint8_t *t= emp_state) do_not_remove: /* output args are dead */ for (i =3D 0; i < nb_oargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; if (temp_state[arg] & TS_DEAD) { arg_life |=3D DEAD_ARG << i; } @@ -1852,14 +1851,14 @@ static void liveness_pass_1(TCGContext *s, uint8_t = *temp_state) =20 /* record arguments that die in this opcode */ for (i =3D nb_oargs; i < nb_oargs + nb_iargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; if (temp_state[arg] & TS_DEAD) { arg_life |=3D DEAD_ARG << i; } } /* input arguments are live for preceding opcodes */ for (i =3D nb_oargs; i < nb_oargs + nb_iargs; i++) { - temp_state[args[i]] &=3D ~TS_DEAD; + temp_state[op->args[i]] &=3D ~TS_DEAD; } } break; @@ -1894,7 +1893,6 @@ static bool liveness_pass_2(TCGContext *s, uint8_t *t= emp_state) =20 for (oi =3D s->gen_op_buf[0].next; oi !=3D 0; oi =3D oi_next) { TCGOp *op =3D &s->gen_op_buf[oi]; - TCGArg *args =3D op->args; TCGOpcode opc =3D op->opc; const TCGOpDef *def =3D &tcg_op_defs[opc]; TCGLifeData arg_life =3D op->life; @@ -1906,7 +1904,7 @@ static bool liveness_pass_2(TCGContext *s, uint8_t *t= emp_state) if (opc =3D=3D INDEX_op_call) { nb_oargs =3D op->callo; nb_iargs =3D op->calli; - call_flags =3D args[nb_oargs + nb_iargs + 1]; + call_flags =3D op->args[nb_oargs + nb_iargs + 1]; } else { nb_iargs =3D def->nb_iargs; nb_oargs =3D def->nb_oargs; @@ -1927,7 +1925,7 @@ static bool liveness_pass_2(TCGContext *s, uint8_t *t= emp_state) =20 /* Make sure that input arguments are available. */ for (i =3D nb_oargs; i < nb_iargs + nb_oargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; /* Note this unsigned test catches TCG_CALL_ARG_DUMMY too. */ if (arg < nb_globals) { dir =3D dir_temps[arg]; @@ -1937,11 +1935,10 @@ static bool liveness_pass_2(TCGContext *s, uint8_t = *temp_state) ? INDEX_op_ld_i32 : INDEX_op_ld_i64); TCGOp *lop =3D tcg_op_insert_before(s, op, lopc, 3); - TCGArg *largs =3D lop->args; =20 - largs[0] =3D dir; - largs[1] =3D temp_idx(s, its->mem_base); - largs[2] =3D its->mem_offset; + lop->args[0] =3D dir; + lop->args[1] =3D temp_idx(s, its->mem_base); + lop->args[2] =3D its->mem_offset; =20 /* Loaded, but synced with memory. */ temp_state[arg] =3D TS_MEM; @@ -1953,11 +1950,11 @@ static bool liveness_pass_2(TCGContext *s, uint8_t = *temp_state) No action is required except keeping temp_state up to date so that we reload when needed. */ for (i =3D nb_oargs; i < nb_iargs + nb_oargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; if (arg < nb_globals) { dir =3D dir_temps[arg]; if (dir !=3D 0) { - args[i] =3D dir; + op->args[i] =3D dir; changes =3D true; if (IS_DEAD_ARG(i)) { temp_state[arg] =3D TS_DEAD; @@ -1988,7 +1985,7 @@ static bool liveness_pass_2(TCGContext *s, uint8_t *t= emp_state) =20 /* Outputs become available. */ for (i =3D 0; i < nb_oargs; i++) { - arg =3D args[i]; + arg =3D op->args[i]; if (arg >=3D nb_globals) { continue; } @@ -1996,7 +1993,7 @@ static bool liveness_pass_2(TCGContext *s, uint8_t *t= emp_state) if (dir =3D=3D 0) { continue; } - args[i] =3D dir; + op->args[i] =3D dir; changes =3D true; =20 /* The output is now live and modified. */ @@ -2009,11 +2006,10 @@ static bool liveness_pass_2(TCGContext *s, uint8_t = *temp_state) ? INDEX_op_st_i32 : INDEX_op_st_i64); TCGOp *sop =3D tcg_op_insert_after(s, op, sopc, 3); - TCGArg *sargs =3D sop->args; =20 - sargs[0] =3D dir; - sargs[1] =3D temp_idx(s, its->mem_base); - sargs[2] =3D its->mem_offset; + sop->args[0] =3D dir; + sop->args[1] =3D temp_idx(s, its->mem_base); + sop->args[2] =3D its->mem_offset; =20 temp_state[arg] =3D TS_MEM; } @@ -2841,7 +2837,6 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb) num_insns =3D -1; for (oi =3D s->gen_op_buf[0].next; oi !=3D 0; oi =3D oi_next) { TCGOp * const op =3D &s->gen_op_buf[oi]; - TCGArg * const args =3D op->args; TCGOpcode opc =3D op->opc; const TCGOpDef *def =3D &tcg_op_defs[opc]; TCGLifeData arg_life =3D op->life; @@ -2854,11 +2849,11 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *t= b) switch (opc) { case INDEX_op_mov_i32: case INDEX_op_mov_i64: - tcg_reg_alloc_mov(s, def, args, arg_life); + tcg_reg_alloc_mov(s, def, op->args, arg_life); break; case INDEX_op_movi_i32: case INDEX_op_movi_i64: - tcg_reg_alloc_movi(s, args, arg_life); + tcg_reg_alloc_movi(s, op->args, arg_life); break; case INDEX_op_insn_start: if (num_insns >=3D 0) { @@ -2868,22 +2863,22 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *t= b) for (i =3D 0; i < TARGET_INSN_START_WORDS; ++i) { target_ulong a; #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS - a =3D ((target_ulong)args[i * 2 + 1] << 32) | args[i * 2]; + a =3D deposit64(op->args[i * 2], 32, 32, op->args[i * 2 + = 1]); #else - a =3D args[i]; + a =3D op->args[i]; #endif s->gen_insn_data[num_insns][i] =3D a; } break; case INDEX_op_discard: - temp_dead(s, &s->temps[args[0]]); + temp_dead(s, &s->temps[op->args[0]]); break; case INDEX_op_set_label: tcg_reg_alloc_bb_end(s, s->reserved_regs); - tcg_out_label(s, arg_label(args[0]), s->code_ptr); + tcg_out_label(s, arg_label(op->args[0]), s->code_ptr); break; case INDEX_op_call: - tcg_reg_alloc_call(s, op->callo, op->calli, args, arg_life); + tcg_reg_alloc_call(s, op->callo, op->calli, op->args, arg_life= ); break; default: /* Sanity check that we've not introduced any unhandled opcode= s. */ @@ -2891,7 +2886,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb) /* Note: in order to speed up the code, it would be much faster to have specialized register allocator functions for some common argument patterns */ - tcg_reg_alloc_op(s, def, opc, args, arg_life); + tcg_reg_alloc_op(s, def, opc, op->args, arg_life); break; } #ifdef CONFIG_DEBUG_TCG --=20 2.13.6