diff mbox series

[v4,01/11] target/loongarch: Add macro to check current arch

Message ID 20230808015506.1705140-2-c@jia.je
State New
Headers show
Series Add la32 & va32 mode for loongarch64-softmmu | expand

Commit Message

Jiajie Chen Aug. 8, 2023, 1:54 a.m. UTC
Add macro to check if the current cpucfg[1].arch equals to 1(LA32) or
2(LA64).

Signed-off-by: Jiajie Chen <c@jia.je>
---
 target/loongarch/cpu.h | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Richard Henderson Aug. 8, 2023, 5:01 p.m. UTC | #1
On 8/7/23 18:54, Jiajie Chen wrote:
> Add macro to check if the current cpucfg[1].arch equals to 1(LA32) or
> 2(LA64).
> 
> Signed-off-by: Jiajie Chen <c@jia.je>
> ---
>   target/loongarch/cpu.h | 7 +++++++
>   1 file changed, 7 insertions(+)
> 
> diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
> index fa371ca8ba..bf0da8d5b4 100644
> --- a/target/loongarch/cpu.h
> +++ b/target/loongarch/cpu.h
> @@ -132,6 +132,13 @@ FIELD(CPUCFG1, HP, 24, 1)
>   FIELD(CPUCFG1, IOCSR_BRD, 25, 1)
>   FIELD(CPUCFG1, MSG_INT, 26, 1)
>   
> +/* cpucfg[1].arch */
> +#define CPUCFG1_ARCH_LA32        1
> +#define CPUCFG1_ARCH_LA64        2
> +
> +#define LOONGARCH_CPUCFG_ARCH(env, mode) \
> +  (FIELD_EX32(env->cpucfg[1], CPUCFG1, ARCH) == CPUCFG1_ARCH_##mode)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

But in using this recall that 0 is a defined value for "simplified la32", so

    !LOONGARCH_CPUCFG_ARCH(env, LA64)

may not in future equal

    LOONGARCH_CPUCFG_ARCH(env, LA32)

it someone ever decides to implement this simplified version. (We emulate very small 
embedded Arm cpus, so it's not out of the question that you may want to emulate the very 
smallest LoongArch cpus.)

It might be easier to just define

static inline bool is_la64(CPULoongArch64 *env)
{
     return FIELD_EX32(env->cpucfg[1], CPUCFG1, ARCH) == CPUCFG1_ARCH_LA64;
}


r~
Jiajie Chen Aug. 8, 2023, 5:13 p.m. UTC | #2
On 2023/8/9 01:01, Richard Henderson wrote:
> On 8/7/23 18:54, Jiajie Chen wrote:
>> Add macro to check if the current cpucfg[1].arch equals to 1(LA32) or
>> 2(LA64).
>>
>> Signed-off-by: Jiajie Chen <c@jia.je>
>> ---
>>   target/loongarch/cpu.h | 7 +++++++
>>   1 file changed, 7 insertions(+)
>>
>> diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
>> index fa371ca8ba..bf0da8d5b4 100644
>> --- a/target/loongarch/cpu.h
>> +++ b/target/loongarch/cpu.h
>> @@ -132,6 +132,13 @@ FIELD(CPUCFG1, HP, 24, 1)
>>   FIELD(CPUCFG1, IOCSR_BRD, 25, 1)
>>   FIELD(CPUCFG1, MSG_INT, 26, 1)
>>   +/* cpucfg[1].arch */
>> +#define CPUCFG1_ARCH_LA32        1
>> +#define CPUCFG1_ARCH_LA64        2
>> +
>> +#define LOONGARCH_CPUCFG_ARCH(env, mode) \
>> +  (FIELD_EX32(env->cpucfg[1], CPUCFG1, ARCH) == CPUCFG1_ARCH_##mode)
>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>
> But in using this recall that 0 is a defined value for "simplified 
> la32", so
>
>    !LOONGARCH_CPUCFG_ARCH(env, LA64)
>
> may not in future equal
>
>    LOONGARCH_CPUCFG_ARCH(env, LA32)
>
> it someone ever decides to implement this simplified version. (We 
> emulate very small embedded Arm cpus, so it's not out of the question 
> that you may want to emulate the very smallest LoongArch cpus.)


Yes, actually the LoongArch 32 Reduced (or "simplified la32") version is 
my final aim because we are making embedded LoongArch32 Reduced CPUs on 
FPGA for a competition, and supporting LoongArch 32 is the first step ahead.


>
> It might be easier to just define
>
> static inline bool is_la64(CPULoongArch64 *env)
> {
>     return FIELD_EX32(env->cpucfg[1], CPUCFG1, ARCH) == 
> CPUCFG1_ARCH_LA64;
> }


Sure, I will use this way.


>
>
> r~
Philippe Mathieu-Daudé Aug. 10, 2023, 11:06 a.m. UTC | #3
On 8/8/23 03:54, Jiajie Chen wrote:
> Add macro to check if the current cpucfg[1].arch equals to 1(LA32) or
> 2(LA64).
> 
> Signed-off-by: Jiajie Chen <c@jia.je>
> ---
>   target/loongarch/cpu.h | 7 +++++++
>   1 file changed, 7 insertions(+)
> 
> diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
> index fa371ca8ba..bf0da8d5b4 100644
> --- a/target/loongarch/cpu.h
> +++ b/target/loongarch/cpu.h
> @@ -132,6 +132,13 @@ FIELD(CPUCFG1, HP, 24, 1)
>   FIELD(CPUCFG1, IOCSR_BRD, 25, 1)
>   FIELD(CPUCFG1, MSG_INT, 26, 1)
>   
> +/* cpucfg[1].arch */
> +#define CPUCFG1_ARCH_LA32        1
> +#define CPUCFG1_ARCH_LA64        2
> +
> +#define LOONGARCH_CPUCFG_ARCH(env, mode) \
> +  (FIELD_EX32(env->cpucfg[1], CPUCFG1, ARCH) == CPUCFG1_ARCH_##mode)

The 'LOONGARCH_CPUCFG_ARCH()' macro name is misleading. If you want
to return a boolean, maybe rename as CHECK(). But clearer would be
a function (taking an enum CPUCFG1_ARCH_LAxx argument).

>   /* cpucfg[2] bits */
>   FIELD(CPUCFG2, FP, 0, 1)
>   FIELD(CPUCFG2, FP_SP, 1, 1)
Philippe Mathieu-Daudé Aug. 10, 2023, 11:08 a.m. UTC | #4
On 8/8/23 19:13, Jiajie Chen wrote:
> 
> On 2023/8/9 01:01, Richard Henderson wrote:
>> On 8/7/23 18:54, Jiajie Chen wrote:
>>> Add macro to check if the current cpucfg[1].arch equals to 1(LA32) or
>>> 2(LA64).
>>>
>>> Signed-off-by: Jiajie Chen <c@jia.je>
>>> ---
>>>   target/loongarch/cpu.h | 7 +++++++
>>>   1 file changed, 7 insertions(+)


>> It might be easier to just define
>>
>> static inline bool is_la64(CPULoongArch64 *env)
>> {
>>     return FIELD_EX32(env->cpucfg[1], CPUCFG1, ARCH) == 
>> CPUCFG1_ARCH_LA64;
>> }

Ah, drop my other suggestion (Richard's way is simpler).

> Sure, I will use this way.
diff mbox series

Patch

diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
index fa371ca8ba..bf0da8d5b4 100644
--- a/target/loongarch/cpu.h
+++ b/target/loongarch/cpu.h
@@ -132,6 +132,13 @@  FIELD(CPUCFG1, HP, 24, 1)
 FIELD(CPUCFG1, IOCSR_BRD, 25, 1)
 FIELD(CPUCFG1, MSG_INT, 26, 1)
 
+/* cpucfg[1].arch */
+#define CPUCFG1_ARCH_LA32        1
+#define CPUCFG1_ARCH_LA64        2
+
+#define LOONGARCH_CPUCFG_ARCH(env, mode) \
+  (FIELD_EX32(env->cpucfg[1], CPUCFG1, ARCH) == CPUCFG1_ARCH_##mode)
+
 /* cpucfg[2] bits */
 FIELD(CPUCFG2, FP, 0, 1)
 FIELD(CPUCFG2, FP_SP, 1, 1)