From patchwork Mon Oct 11 08:18:56 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Bengtsson X-Patchwork-Id: 67389 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 1E374B6F10 for ; Mon, 11 Oct 2010 19:35:07 +1100 (EST) Received: from localhost ([127.0.0.1]:40999 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1P5Dqa-0006q9-ED for incoming@patchwork.ozlabs.org; Mon, 11 Oct 2010 04:35:04 -0400 Received: from [140.186.70.92] (port=52765 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1P5Doq-00063s-Pk for qemu-devel@nongnu.org; Mon, 11 Oct 2010 04:33:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1P5DcW-0007ol-LW for qemu-devel@nongnu.org; Mon, 11 Oct 2010 04:20:33 -0400 Received: from mail-ew0-f45.google.com ([209.85.215.45]:53344) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1P5DcW-0007o3-Gs for qemu-devel@nongnu.org; Mon, 11 Oct 2010 04:20:32 -0400 Received: by ewy26 with SMTP id 26so1961613ewy.4 for ; Mon, 11 Oct 2010 01:20:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=3uZ/suGhcsRYI5GeZo3ZZPHHbsXCBggz66TEmC2cAHs=; b=HgKBHjNTJmb0PzogtU2GgKUZc/+R4o3USavITYzBoviiTTW0fIAirdPSZl4rmxUsNw YxrbGKa3ronlv9wqU8n+EkuYqxLYYKErT9iSkSDbibLqt12km8D6HEwOATw/Xe8aTpUp FOOWXr4w41PFyPMfG3MnBaA5OvwD9t2Y6AAzI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=dvnwtwbqZzvxtWJk1RPaPfOlpVtK+THuPQb9FEgZzKWz9doa5tzAl5w5X87v/NcK6h EiVlqguFWEaKj1kcCf0clVNSLiaFnih34RZvN8bqrh4LVSzVaA6hAQ9TD/taFG72wa/6 YTGfyLWl7YWBe3w815j1PVvQbDB2q0HUbhAqI= Received: by 10.213.7.81 with SMTP id c17mr3115922ebc.17.1286785231306; Mon, 11 Oct 2010 01:20:31 -0700 (PDT) Received: from localhost.localdomain (store.iar.se [213.136.49.54]) by mx.google.com with ESMTPS id p53sm3050424eeh.7.2010.10.11.01.20.29 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 11 Oct 2010 01:20:29 -0700 (PDT) From: Johan Bengtsson To: qemu-devel@nongnu.org Date: Mon, 11 Oct 2010 10:18:56 +0200 Message-Id: <1286785138-20401-1-git-send-email-teofrastius@gmail.com> X-Mailer: git-send-email 1.7.0.4 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: Johan Bengtsson Subject: [Qemu-devel] [PATCH 1/4] target-arm: Add support for PKHxx in thumb2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The PKHxx instructions were not recognized by the thumb2 decoder. The solution provided in this changeset is identical to the arm-mode implementation. Signed-off-by: Johan Bengtsson Acked-by: Peter Maydell --- target-arm/translate.c | 63 ++++++++++++++++++++++++++++++++++------------- 1 files changed, 45 insertions(+), 18 deletions(-) diff --git a/target-arm/translate.c b/target-arm/translate.c index 6fcdd7e..f39efc5 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -7601,27 +7601,54 @@ static int disas_thumb2_insn(CPUState *env, DisasContext *s, uint16_t insn_hw1) } } break; - case 5: /* Data processing register constant shift. */ - if (rn == 15) { - tmp = new_tmp(); - tcg_gen_movi_i32(tmp, 0); - } else { - tmp = load_reg(s, rn); - } - tmp2 = load_reg(s, rm); + case 5: + op = (insn >> 21) & 0xf; - shiftop = (insn >> 4) & 3; - shift = ((insn >> 6) & 3) | ((insn >> 10) & 0x1c); - conds = (insn & (1 << 20)) != 0; - logic_cc = (conds && thumb2_logic_op(op)); - gen_arm_shift_im(tmp2, shiftop, shift, logic_cc); - if (gen_thumb2_data_op(s, op, conds, 0, tmp, tmp2)) - goto illegal_op; - dead_tmp(tmp2); - if (rd != 15) { + if (op == 6) { + /* Halfword pack. */ + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + shift = ((insn >> 10) & 0x1c) | ((insn >> 6) & 0x3); + if (insn & (1 << 5)) { + /* pkhtb */ + if (shift == 0) + shift = 31; + tcg_gen_sari_i32(tmp2, tmp2, shift); + tcg_gen_andi_i32(tmp, tmp, 0xffff0000); + tcg_gen_ext16u_i32(tmp2, tmp2); + } else { + /* pkhbt */ + if (shift) + tcg_gen_shli_i32(tmp2, tmp2, shift); + tcg_gen_ext16u_i32(tmp, tmp); + tcg_gen_andi_i32(tmp2, tmp2, 0xffff0000); + } + tcg_gen_or_i32(tmp, tmp, tmp2); + dead_tmp(tmp2); store_reg(s, rd, tmp); } else { - dead_tmp(tmp); + /* Data processing register constant shift. */ + if (rn == 15) { + tmp = new_tmp(); + tcg_gen_movi_i32(tmp, 0); + } else { + tmp = load_reg(s, rn); + } + tmp2 = load_reg(s, rm); + + shiftop = (insn >> 4) & 3; + shift = ((insn >> 6) & 3) | ((insn >> 10) & 0x1c); + conds = (insn & (1 << 20)) != 0; + logic_cc = (conds && thumb2_logic_op(op)); + gen_arm_shift_im(tmp2, shiftop, shift, logic_cc); + if (gen_thumb2_data_op(s, op, conds, 0, tmp, tmp2)) + goto illegal_op; + dead_tmp(tmp2); + if (rd != 15) { + store_reg(s, rd, tmp); + } else { + dead_tmp(tmp); + } } break; case 13: /* Misc data processing. */