On 10/6/2026 4:14 PM, Anton Johansson wrote:
> On 01/10/26, Pierrick Bouvier wrote:
>> On 10/1/2026 8:59 AM, Anton Johansson wrote:
>>> Replaces uses of target_ulong with fixed-size integers, this is a
>>> prerequisite step to compiling cpu.c once for system-mode.
>>>
>>> Note: the widening of target_long to int64_t in adjust_addr_body() is
>>> safe as rv32 is ruled out earlier in the function via the check
>>>
>>>   /* do nothing for rv32 mode */
>>>   if (riscv_cpu_mxl(env) == MXL_RV32) {
>>>       return addr;
>>>   }
>>>
>>> meaning target_long must be equal to int64_t anyway.
>>>
>>> Duplicate includes between vector_helper.c and vector_internals.h are
>>> removed.
>>>
>>> Signed-off-by: Anton Johansson <[email protected]>
>>> ---
>>>  target/riscv/internals.h            | 31 +++++++++---------
>>>  target/riscv/tcg/vector_internals.h |  5 +--
>>>  target/riscv/tcg/vector_helper.c    | 64 
>>> +++++++++++++++++--------------------
>>>  3 files changed, 47 insertions(+), 53 deletions(-)
>>>
>>
>> ...
>>
>>>  /* Zjpm addr masking routine */
>>> -static inline target_ulong adjust_addr_body(CPURISCVState *env,
>>> -                                            target_ulong addr,
>>> -                                            bool is_virt_addr)
>>> +static inline uint64_t adjust_addr_body(CPURISCVState *env,
>>> +                                        uint64_t addr,
>>> +                                        bool is_virt_addr)
>>>  {
>>>      RISCVPmPmm pmm = PMM_FIELD_DISABLED;
>>>      uint32_t pmlen = 0;
>>> @@ -239,7 +238,7 @@ static inline target_ulong 
>>> adjust_addr_body(CPURISCVState *env,
>>>  
>>>      /* sign/zero extend masked address by N-1 bit */
>>>      if (signext) {
>>> -        addr = (target_long)addr >> pmlen;
>>> +        addr = (int64_t)addr >> pmlen;
>>>      } else {
>>>          addr = addr >> pmlen;
>>>      }
>>
>> I think this one is incorrect, since for a 32-bit addr, value will not
>> get sign extended, so shift will be unsigned.
>>
>> ```
>> #include <stdio.h>
>> #include <stdint.h>
>> #include <inttypes.h>
>>
>> uint64_t out64(uint64_t in)
>> {
>>     return (int64_t) in >> 1;
>> }
>>
>> uint32_t out32(uint32_t in)
>> {
>>     return (int32_t) in >> 1;
>> }
>>
>> int main()
>> {
>>     printf("32: %"PRIx32"\n", out32(0xffffffff));
>>     printf("64: %"PRIx64"\n", out64(0xffffffff));
>> }
>> ```
>>
>> Output is:
>> 32: ffffffff
>> 64: 7fffffff
>>
>> We need to add a:
>> if (target_long_bits() == 32) {
>>   addr = (int32_t)addr >> pmlen;
>> else {
>>   addr = (int64_t)addr >> pmlen;
>> }
>>
>> Regards,
>> Pierrick
> 
> No this is not necessary unless I'm missing something, see commit comment.
> MXL_RV32 is ruled out earlier in the function
> 
>   static inline uint64_t adjust_addr_body(CPURISCVState *env,
>                                           uint64_t addr,
>                                           bool is_virt_addr)
>   {
>       ...
>   
>       /* do nothing for rv32 mode */
>       if (riscv_cpu_mxl(env) == MXL_RV32) {
>           return addr;
>       }
> 
>       ...
> 
>       /* sign/zero extend masked address by N-1 bit */
>       if (signext) {
>         addr = (int64_t)addr >> pmlen;
>       } else {
>           addr = addr >> pmlen;
>       }
> 
>       return addr;
>   }
>

I have to confess I didn't open the full body in my editor to double
check that. In this case, that's correct.

Reviewed-by: Pierrick Bouvier <[email protected]>

Regards,
Pierrick




Reply via email to