From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50669) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W9FNy-0000SO-Ut for qemu-devel@nongnu.org; Fri, 31 Jan 2014 09:48:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W9FNt-0007Lv-31 for qemu-devel@nongnu.org; Fri, 31 Jan 2014 09:48:02 -0500 Received: from mail-qa0-x22a.google.com ([2607:f8b0:400d:c00::22a]:39287) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W9FNs-0007Lj-V8 for qemu-devel@nongnu.org; Fri, 31 Jan 2014 09:47:57 -0500 Received: by mail-qa0-f42.google.com with SMTP id k4so6467023qaq.1 for ; Fri, 31 Jan 2014 06:47:56 -0800 (PST) Sender: Richard Henderson From: Richard Henderson Date: Fri, 31 Jan 2014 08:47:01 -0600 Message-Id: <1391179623-13626-7-git-send-email-rth@twiddle.net> In-Reply-To: <1391179623-13626-1-git-send-email-rth@twiddle.net> References: <1391179623-13626-1-git-send-email-rth@twiddle.net> Subject: [Qemu-devel] [PATCH 6/8] tcg/optimize: Simply some logical ops to NOT List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aurelien@aurel32.net Given, of course, an appropriate constant. These could be generated from the "canonical" operation for inversion on the guest, or via other optimizations. Signed-off-by: Richard Henderson --- tcg/optimize.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tcg/optimize.c b/tcg/optimize.c index 3291a08..cdfc746 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -655,6 +655,63 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, } } break; + CASE_OP_32_64(xor): + CASE_OP_32_64(nand): + if (temps[args[1]].state != TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == -1) { + i = 1; + goto try_not; + } + break; + CASE_OP_32_64(nor): + if (temps[args[1]].state != TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0) { + i = 1; + goto try_not; + } + break; + CASE_OP_32_64(andc): + if (temps[args[2]].state != TCG_TEMP_CONST + && temps[args[1]].state == TCG_TEMP_CONST + && temps[args[1]].val == -1) { + i = 2; + goto try_not; + } + break; + CASE_OP_32_64(orc): + CASE_OP_32_64(eqv): + if (temps[args[2]].state != TCG_TEMP_CONST + && temps[args[1]].state == TCG_TEMP_CONST + && temps[args[1]].val == 0) { + i = 2; + goto try_not; + } + break; + try_not: + { + TCGOpcode not_op; + bool have_not; + + if (def->flags & TCG_OPF_64BIT) { + not_op = INDEX_op_not_i64; + have_not = TCG_TARGET_HAS_not_i64; + } else { + not_op = INDEX_op_not_i32; + have_not = TCG_TARGET_HAS_not_i32; + } + if (!have_not) { + break; + } + s->gen_opc_buf[op_index] = not_op; + reset_temp(args[0]); + gen_args[0] = args[0]; + gen_args[1] = args[i]; + args += 3; + gen_args += 2; + continue; + } default: break; } -- 1.8.5.3