[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 9/9] target/arm: Convert v8.2-fp16 from featu
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-devel] [PATCH v2 9/9] target/arm: Convert v8.2-fp16 from feature bit to pfr0 test |
Date: |
Sun, 30 Sep 2018 21:45:40 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0 |
On 9/30/18 9:29 PM, Richard Henderson wrote:
> On 9/28/18 11:34 AM, Philippe Mathieu-Daudé wrote:
>> On 27/09/2018 23:13, Richard Henderson wrote:
>>> Signed-off-by: Richard Henderson <address@hidden>
>>> ---
>>> target/arm/cpu.h | 17 +++++++++++++++-
>>> target/arm/translate-a64.h | 1 +
>>> target/arm/translate.h | 1 +
>>> linux-user/elfload.c | 6 +-----
>>> target/arm/cpu64.c | 13 ++++++-------
>>> target/arm/helper.c | 2 +-
>>> target/arm/translate-a64.c | 40 +++++++++++++++++++-------------------
>>> target/arm/translate.c | 6 +++---
>>> 8 files changed, 49 insertions(+), 37 deletions(-)
>>>
>>> diff --git a/target/arm/cpu.h b/target/arm/cpu.h
>>> index 152a558a94..bca4ee4281 100644
>>> --- a/target/arm/cpu.h
>>> +++ b/target/arm/cpu.h
>>> @@ -1566,7 +1566,6 @@ enum arm_features {
>>> ARM_FEATURE_PMU, /* has PMU support */
>>> ARM_FEATURE_VBAR, /* has cp15 VBAR */
>>> ARM_FEATURE_M_SECURITY, /* M profile Security Extension */
>>> - ARM_FEATURE_V8_FP16, /* implements v8.2 half-precision float */
>>> ARM_FEATURE_M_MAIN, /* M profile Main Extension */
>>> };
>>>
>>> @@ -3176,6 +3175,16 @@ static inline bool aa32_feature_dp(ARMCPU *cpu)
>>> return FIELD_EX32(cpu->id_isar6, ID_ISAR6, DP) != 0;
>>> }
>>>
>>> +static inline bool aa32_feature_fp16_arith(ARMCPU *cpu)
>>> +{
>>> + /*
>>> + * This is a placeholder for use by VCMA until the rest of
>>> + * the ARMv8.2-FP16 extension is implemented for aa32 mode.
>>> + * At which point we can properly set and check MVFR1.FPHP.
>>> + */
>>> + return FIELD_EX64(cpu->id_aa64pfr0, ID_AA64PFR0, FP) == 1;
>>> +}
>>> +
>>> /*
>>> * 64-bit feature tests via id registers.
>>> */
>>> @@ -3244,6 +3253,12 @@ static inline bool aa64_feature_fcma(ARMCPU *cpu)
>>> return FIELD_EX64(cpu->id_aa64isar1, ID_AA64ISAR1, FCMA) != 0;
>>> }
>>>
>>> +static inline bool aa64_feature_fp16(ARMCPU *cpu)
>>> +{
>>> + /* We always set the AdvSIMD and FP fields identically wrt FP16. */
>>> + return FIELD_EX64(cpu->id_aa64pfr0, ID_AA64PFR0, FP) == 1;
>>> +}
>>> +
>>> static inline bool aa64_feature_sve(ARMCPU *cpu)
>>> {
>>> return FIELD_EX64(cpu->id_aa64pfr0, ID_AA64PFR0, SVE) != 0;
>>> diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
>>> index 636f3fded3..e122cef242 100644
>>> --- a/target/arm/translate-a64.h
>>> +++ b/target/arm/translate-a64.h
>>> @@ -140,6 +140,7 @@ FORWARD_FEATURE(sm3)
>>> FORWARD_FEATURE(sm4)
>>> FORWARD_FEATURE(dp)
>>> FORWARD_FEATURE(fcma)
>>> +FORWARD_FEATURE(fp16)
>>> FORWARD_FEATURE(sve)
>>>
>>> #undef FORWARD_FEATURE
>>> diff --git a/target/arm/translate.h b/target/arm/translate.h
>>> index d8eafbe88d..e022d6d4e6 100644
>>> --- a/target/arm/translate.h
>>> +++ b/target/arm/translate.h
>>> @@ -205,6 +205,7 @@ FORWARD_FEATURE(crc32)
>>> FORWARD_FEATURE(rdm)
>>> FORWARD_FEATURE(vcma)
>>> FORWARD_FEATURE(dp)
>>> +FORWARD_FEATURE(fp16_arith)
>>>
>>> #undef FORWARD_FEATURE
>>>
>>> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
>>> index c4969f163e..bcb2c9928c 100644
>>> --- a/linux-user/elfload.c
>>> +++ b/linux-user/elfload.c
>>> @@ -573,8 +573,6 @@ static uint32_t get_elf_hwcap(void)
>>> hwcaps |= ARM_HWCAP_A64_ASIMD;
>>>
>>> /* probe for the extra features */
>>> -#define GET_FEATURE(feat, hwcap) \
>>> - do { if (arm_feature(&cpu->env, feat)) { hwcaps |= hwcap; } } while (0)
>>> #define GET_FEATURE_ID(feat, hwcap) \
>>> do { if (aa64_feature_##feat(cpu)) { hwcaps |= hwcap; } } while (0)
>>>
>>> @@ -587,15 +585,13 @@ static uint32_t get_elf_hwcap(void)
>>> GET_FEATURE_ID(sha3, ARM_HWCAP_A64_SHA3);
>>> GET_FEATURE_ID(sm3, ARM_HWCAP_A64_SM3);
>>> GET_FEATURE_ID(sm4, ARM_HWCAP_A64_SM4);
>>> - GET_FEATURE(ARM_FEATURE_V8_FP16,
>>> - ARM_HWCAP_A64_FPHP | ARM_HWCAP_A64_ASIMDHP);
>>> + GET_FEATURE_ID(fp16, ARM_HWCAP_A64_FPHP | ARM_HWCAP_A64_ASIMDHP);
>>> GET_FEATURE_ID(atomics, ARM_HWCAP_A64_ATOMICS);
>>> GET_FEATURE_ID(rdm, ARM_HWCAP_A64_ASIMDRDM);
>>> GET_FEATURE_ID(dp, ARM_HWCAP_A64_ASIMDDP);
>>> GET_FEATURE_ID(fcma, ARM_HWCAP_A64_FCMA);
>>> GET_FEATURE_ID(sve, ARM_HWCAP_A64_SVE);
>>>
>>> -#undef GET_FEATURE
>>> #undef GET_FEATURE_ID
>>>
>>> return hwcaps;
>>> diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
>>> index 8f95de677a..c734e2b2cd 100644
>>> --- a/target/arm/cpu64.c
>>> +++ b/target/arm/cpu64.c
>>> @@ -259,6 +259,8 @@ static void aarch64_max_initfn(Object *obj)
>>> FIELD_DP64(cpu->id_aa64isar1, ID_AA64ISAR1, FCMA, 1);
>>>
>>> FIELD_DP64(cpu->id_aa64pfr0, ID_AA64PFR0, SVE, 1);
>>> + FIELD_DP64(cpu->id_aa64pfr0, ID_AA64PFR0, FP, 1);
>>> + FIELD_DP64(cpu->id_aa64pfr0, ID_AA64PFR0, ADVSIMD, 1);
>>>
>>> /* Replicate the same data to the 32-bit id registers. */
>>> FIELD_DP32(cpu->id_isar5, ID_ISAR5, AES, 2); /* AES + PMULL */
>>> @@ -268,15 +270,12 @@ static void aarch64_max_initfn(Object *obj)
>>> FIELD_DP32(cpu->id_isar5, ID_ISAR5, RDM, 1);
>>> FIELD_DP32(cpu->id_isar5, ID_ISAR5, VCMA, 1);
>>> FIELD_DP32(cpu->id_isar6, ID_ISAR6, DP, 1);
>>> + /*
>>> + * FIXME: ARMv8.2-FP16 is not implemented for aa32,
>>> + * so do not set MVFR1.FPHP and MVFR.SIMDHP.
>>> + */
>>
>> Shouldn't we use this then?
>>
>> FIELD_DP64(cpu->id_aa64pfr0, ID_AA64PFR0, FP, 0b1111);
>
>
> No, that would indicate no floating point unit at all in aa64 mode.
Indeed.
> What made you think this?
I misread this was aarch64_max_initfn() ;)
Regards,
Phil.