From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58785) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VApte-00085A-S1 for qemu-devel@nongnu.org; Sat, 17 Aug 2013 19:27:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VAptY-0001Vp-UH for qemu-devel@nongnu.org; Sat, 17 Aug 2013 19:27:02 -0400 Received: from mail-pb0-x230.google.com ([2607:f8b0:400e:c01::230]:54349) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VAptY-0001Vj-OG for qemu-devel@nongnu.org; Sat, 17 Aug 2013 19:26:56 -0400 Received: by mail-pb0-f48.google.com with SMTP id ma3so3384721pbc.7 for ; Sat, 17 Aug 2013 16:26:56 -0700 (PDT) Sender: Richard Henderson From: Richard Henderson Date: Sat, 17 Aug 2013 16:26:46 -0700 Message-Id: <1376782006-31746-5-git-send-email-rth@twiddle.net> In-Reply-To: <1376782006-31746-1-git-send-email-rth@twiddle.net> References: <1376782006-31746-1-git-send-email-rth@twiddle.net> Subject: [Qemu-devel] [PATCH 4/4] tcg: Constant fold div, rem List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aurelien@aurel32.net Signed-off-by: Richard Henderson --- tcg/optimize.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tcg/optimize.c b/tcg/optimize.c index e8dedf3..b29bf25 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -304,6 +304,25 @@ static TCGArg do_constant_folding_2(TCGOpcode op, TCGArg x, TCGArg y) muls64(&l64, &h64, x, y); return h64; + case INDEX_op_div_i32: + /* Avoid crashing on divide by zero, otherwise undefined. */ + return (int32_t)x / ((int32_t)y ? : 1); + case INDEX_op_divu_i32: + return (uint32_t)x / ((uint32_t)y ? : 1); + case INDEX_op_div_i64: + return (int64_t)x / ((int64_t)y ? : 1); + case INDEX_op_divu_i64: + return (uint64_t)x / ((uint64_t)y ? : 1); + + case INDEX_op_rem_i32: + return (int32_t)x % ((int32_t)y ? : 1); + case INDEX_op_remu_i32: + return (uint32_t)x % ((uint32_t)y ? : 1); + case INDEX_op_rem_i64: + return (int64_t)x % ((int64_t)y ? : 1); + case INDEX_op_remu_i64: + return (uint64_t)x % ((uint64_t)y ? : 1); + default: fprintf(stderr, "Unrecognized operation %d in do_constant_folding.\n", op); @@ -902,6 +921,10 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, CASE_OP_32_64(nor): CASE_OP_32_64(muluh): CASE_OP_32_64(mulsh): + CASE_OP_32_64(div): + CASE_OP_32_64(divu): + CASE_OP_32_64(rem): + CASE_OP_32_64(remu): if (temps[args[1]].state == TCG_TEMP_CONST && temps[args[2]].state == TCG_TEMP_CONST) { s->gen_opc_buf[op_index] = op_to_movi(op); -- 1.8.1.4