From patchwork Tue Oct 16 22:31:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 148999 Delivered-To: patch@linaro.org Received: by 2002:a2e:8595:0:0:0:0:0 with SMTP id b21-v6csp5667142lji; Tue, 16 Oct 2018 15:32:04 -0700 (PDT) X-Google-Smtp-Source: ACcGV60eyeJ9eiFoPxT3NHwPGQgE2k+Vx1qTNoyWTnI+rWS950P2m/1O/76vUeandCFeT72sPLob X-Received: by 2002:a0c:959a:: with SMTP id s26mr23216506qvs.199.1539729124430; Tue, 16 Oct 2018 15:32:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539729124; cv=none; d=google.com; s=arc-20160816; b=tK+RH7dLAEUxpY2WVPIV4RqyrUYCSBeXUBC0avsKDYbjz995ZbC1NySVN5ktw9w7xT hqpuG8QD8QUtX6x4uMGABZTTQVuq7sFRs3oHR8BcrsecjoGohpr2GcX+P8QYLStVVBqS qu1k3OdUkMh6ixr3Pe2aQvLQ0fWFTcjG/gKzYj5lxBkp/GGdlGRJFIiq47V0uxVl/nUD 7MRjS1reV+3bxwXCL6KURMDht+oEoHdVZlJKtVDp5pN8Ow8PAkhjS5JO+wjGSIoJe6KM nTR5zRppEgEopK7JkL+Yx+1gsehx/uBRLjU4MyTIu5qs0R24BujfKL9j9T5QdALHfnIo 9gjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature; bh=OA4LdOsFHbSmWRJIo1FxBhszuZ4V7BbMIn4L6rabrBI=; b=lzasHIYwFAgpfg85QSr5VZl0+DnEg6g7wrt8lkepNvWIyI7HoBwoZHR+0ewXwzecHl /1CnMEUjDN7mHHQIhqZ5eIaUfXOcaCRPzPiWf4jS9fUdj5n5Rs4IWweimkZvuT5w9xdI R3zzv6XtGCRTke7qOIXz/MWWiy4h3CCDeVzl83XdEj26SPY8jsWx7CntCQHZ0sjEaNlt BcOL6HpEn85TKNXILJsOPvScs0yD88eCT5tapI+8gVLeRyv8W9FKuVEI7v43/60cpF9z 9a+RqvSw0jl666H9Qrmg8QWWND33KVXCe8kQ3bPpZGR7GCYbrjBsFl34/KJ54A4qe4Qw a5HA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=T2zMHvGl; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id h46si4603123qvd.63.2018.10.16.15.32.04 for (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 16 Oct 2018 15:32:04 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=T2zMHvGl; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:60400 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gCXsh-0001c4-QF for patch@linaro.org; Tue, 16 Oct 2018 18:32:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53657) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gCXsD-0001Xd-Sc for qemu-devel@nongnu.org; Tue, 16 Oct 2018 18:31:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gCXsA-0005Vr-JM for qemu-devel@nongnu.org; Tue, 16 Oct 2018 18:31:33 -0400 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]:41233) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gCXs9-0005Hs-7r for qemu-devel@nongnu.org; Tue, 16 Oct 2018 18:31:30 -0400 Received: by mail-pg1-x543.google.com with SMTP id 23-v6so11511492pgc.8 for ; Tue, 16 Oct 2018 15:31:26 -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=OA4LdOsFHbSmWRJIo1FxBhszuZ4V7BbMIn4L6rabrBI=; b=T2zMHvGlMVTJFVNiNIUD7kM4vL9/fjn14rOfNhcNqTWA/L+0/5j/C4+aRTkKUghsu/ UW9+Fl4815gL+cBv8gpTyW2JesIj51xundBgurx6GwOsO3ubiceHNGjTY8cX3uW3LSmb kcEKvSKHCVlAXXAT6x6RdKZ6WauqBV6dlCcmU= 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=OA4LdOsFHbSmWRJIo1FxBhszuZ4V7BbMIn4L6rabrBI=; b=KZ5h4TBc5/WCQoevvp8ZBZquSr49V67cpShhZFy5tmr0qGSnVE4KbxgqtWvPvyskK/ PpcxVRrwQrCmgUu8rXDky91CudnUZLEfQFUPW/7rxsuKdeG2qlOlZzycA7tNd2oS0YJq DXsuF0BnPOu0hr6YMH0A4Q0AyQb/xGa/v2wnlON0ZAE1YdZB09Z4AK4q2xyI+2iGmG4A BSPzaraS/YjWfGb9sR+NTJ1Ee9WRGwqsbKz++TjckUAJBMXshDEiHD1RuImxLTem0dno 11oBLaApEB67YCa80a5npp7adc86Tzfs7JNyu/D6hRFcsWgKqLON2dG73CWs//hEfmBy AvRQ== X-Gm-Message-State: ABuFfoh3H4d86cIc4GDDSvmSVfbgsupwkTLk3V80QpsYIJuzooCesJeu /rFWS5u1VrzuVcxTZGmD0jUnC6i66w0= X-Received: by 2002:a63:5a0d:: with SMTP id o13-v6mr22041106pgb.267.1539729085079; Tue, 16 Oct 2018 15:31:25 -0700 (PDT) Received: from cloudburst.twiddle.net (174-21-9-133.tukw.qwest.net. [174.21.9.133]) by smtp.gmail.com with ESMTPSA id a79-v6sm23094458pfa.124.2018.10.16.15.31.23 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 16 Oct 2018 15:31:24 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Tue, 16 Oct 2018 15:31:11 -0700 Message-Id: <20181016223115.24100-5-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181016223115.24100-1-richard.henderson@linaro.org> References: <20181016223115.24100-1-richard.henderson@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::543 Subject: [Qemu-devel] [PATCH v4 4/8] target/arm: Convert division from feature bits to isar0 tests 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 Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Both arm and thumb2 division are controlled by the same ISAR field, which takes care of the arm implies thumb case. Having M imply thumb2 division was wrong for cortex-m0, which is v6m and does not have thumb2 at all, much less thumb2 division. Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Richard Henderson --- target/arm/cpu.h | 12 ++++++++++-- linux-user/elfload.c | 4 ++-- target/arm/cpu.c | 10 +--------- target/arm/translate.c | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) -- 2.17.2 diff --git a/target/arm/cpu.h b/target/arm/cpu.h index a87edbe869..a757aecd57 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -1556,7 +1556,6 @@ enum arm_features { ARM_FEATURE_VFP3, ARM_FEATURE_VFP_FP16, ARM_FEATURE_NEON, - ARM_FEATURE_THUMB_DIV, /* divide supported in Thumb encoding */ ARM_FEATURE_M, /* Microcontroller profile. */ ARM_FEATURE_OMAPCP, /* OMAP specific CP15 ops handling. */ ARM_FEATURE_THUMB2EE, @@ -1566,7 +1565,6 @@ enum arm_features { ARM_FEATURE_V5, ARM_FEATURE_STRONGARM, ARM_FEATURE_VAPA, /* cp15 VA to PA lookups */ - ARM_FEATURE_ARM_DIV, /* divide supported in ARM encoding */ ARM_FEATURE_VFP4, /* VFPv4 (implies that NEON is v2) */ ARM_FEATURE_GENERIC_TIMER, ARM_FEATURE_MVFR, /* Media and VFP Feature Registers 0 and 1 */ @@ -3145,6 +3143,16 @@ extern const uint64_t pred_esz_masks[4]; /* * 32-bit feature tests via id registers. */ +static inline bool isar_feature_thumb_div(const ARMISARegisters *id) +{ + return FIELD_EX32(id->id_isar0, ID_ISAR0, DIVIDE) != 0; +} + +static inline bool isar_feature_arm_div(const ARMISARegisters *id) +{ + return FIELD_EX32(id->id_isar0, ID_ISAR0, DIVIDE) > 1; +} + static inline bool isar_feature_aa32_aes(const ARMISARegisters *id) { return FIELD_EX32(id->id_isar5, ID_ISAR5, AES) != 0; diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 97014959ff..1e0f22d812 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -471,8 +471,8 @@ static uint32_t get_elf_hwcap(void) GET_FEATURE(ARM_FEATURE_VFP3, ARM_HWCAP_ARM_VFPv3); GET_FEATURE(ARM_FEATURE_V6K, ARM_HWCAP_ARM_TLS); GET_FEATURE(ARM_FEATURE_VFP4, ARM_HWCAP_ARM_VFPv4); - GET_FEATURE(ARM_FEATURE_ARM_DIV, ARM_HWCAP_ARM_IDIVA); - GET_FEATURE(ARM_FEATURE_THUMB_DIV, ARM_HWCAP_ARM_IDIVT); + GET_FEATURE_ID(arm_div, ARM_HWCAP_ARM_IDIVA); + GET_FEATURE_ID(thumb_div, ARM_HWCAP_ARM_IDIVT); /* All QEMU's VFPv3 CPUs have 32 registers, see VFP_DREG in translate.c. * Note that the ARM_HWCAP_ARM_VFPv3D16 bit is always the inverse of * ARM_HWCAP_ARM_VFPD32 (and so always clear for QEMU); it is unrelated diff --git a/target/arm/cpu.c b/target/arm/cpu.c index 6f27c33b55..9319f92f1f 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -829,7 +829,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp) * Presence of EL2 itself is ARM_FEATURE_EL2, and of the * Security Extensions is ARM_FEATURE_EL3. */ - set_feature(env, ARM_FEATURE_ARM_DIV); + assert(cpu_isar_feature(arm_div, cpu)); set_feature(env, ARM_FEATURE_LPAE); set_feature(env, ARM_FEATURE_V7); } @@ -862,12 +862,6 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp) if (arm_feature(env, ARM_FEATURE_V5)) { set_feature(env, ARM_FEATURE_V4T); } - if (arm_feature(env, ARM_FEATURE_M)) { - set_feature(env, ARM_FEATURE_THUMB_DIV); - } - if (arm_feature(env, ARM_FEATURE_ARM_DIV)) { - set_feature(env, ARM_FEATURE_THUMB_DIV); - } if (arm_feature(env, ARM_FEATURE_VFP4)) { set_feature(env, ARM_FEATURE_VFP3); set_feature(env, ARM_FEATURE_VFP_FP16); @@ -1388,8 +1382,6 @@ static void cortex_r5_initfn(Object *obj) ARMCPU *cpu = ARM_CPU(obj); set_feature(&cpu->env, ARM_FEATURE_V7); - set_feature(&cpu->env, ARM_FEATURE_THUMB_DIV); - set_feature(&cpu->env, ARM_FEATURE_ARM_DIV); set_feature(&cpu->env, ARM_FEATURE_V7MP); set_feature(&cpu->env, ARM_FEATURE_PMSA); cpu->midr = 0x411fc153; /* r1p3 */ diff --git a/target/arm/translate.c b/target/arm/translate.c index f621595197..8b2be71439 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -9755,7 +9755,7 @@ static void disas_arm_insn(DisasContext *s, unsigned int insn) case 1: case 3: /* SDIV, UDIV */ - if (!arm_dc_feature(s, ARM_FEATURE_ARM_DIV)) { + if (!dc_isar_feature(arm_div, s)) { goto illegal_op; } if (((insn >> 5) & 7) || (rd != 15)) { @@ -10963,7 +10963,7 @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn) tmp2 = load_reg(s, rm); if ((op & 0x50) == 0x10) { /* sdiv, udiv */ - if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DIV)) { + if (!dc_isar_feature(thumb_div, s)) { goto illegal_op; } if (op & 0x20)