On Thu, 22 Jan 2026 17:27:58 GMT, Andrew Haley <[email protected]> wrote:

>> Eric Fang has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Extract some helper functions for better readability
>
> src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.hpp line 50:
> 
>> 48:   void sve_maxv(bool is_unsigned, FloatRegister dst, SIMD_RegVariant 
>> size,
>> 49:                 PRegister pg, FloatRegister src);
>> 50: 
> 
> Using separate definitions here is adding unnecessary complexity.
> 
> I'd do something like this in the header file:
> 
> 
>   // Typedefs used to disambiguate overloaded member functions.
>   typedef void (Assembler::*neon_reduction2)
>     (FloatRegister, Assembler::SIMD_Arrangement, FloatRegister);
>   typedef void (Assembler::*sve_reduction3)
>     (FloatRegister, Assembler::SIMD_RegVariant, PRegister, FloatRegister);
> 
>   // Helper functions for min/max reduction operations
>   void neon_minp(bool is_unsigned, FloatRegister dst, SIMD_Arrangement size,
>                  FloatRegister src1, FloatRegister src2) {
>     auto m = is_unsigned ? &Assembler::uminp : &Assembler::sminp;
>     (this->*m)(dst, size, src1, src2);
>   }
>   void neon_maxp(bool is_unsigned, FloatRegister dst, SIMD_Arrangement size,
>                    FloatRegister src1, FloatRegister src2) {
>     auto m = is_unsigned ? &Assembler::umaxp : &Assembler::smaxp;
>     (this->*m)(dst, size, src1, src2);
>   }
>   void neon_minv(bool is_unsigned, FloatRegister dst, SIMD_Arrangement size,
>                  FloatRegister src) {
>     auto m = is_unsigned ? (neon_reduction2)&Assembler::uminv : 
> &Assembler::sminv;
>     (this->*m)(dst, size, src);
>   }
>   void neon_maxv(bool is_unsigned, FloatRegister dst, SIMD_Arrangement size,
>                  FloatRegister src) {
>     auto m = is_unsigned ? (neon_reduction2)&Assembler::umaxv : 
> &Assembler::smaxv;
>     (this->*m)(dst, size, src);
>   }
>   void sve_minv(bool is_unsigned, FloatRegister dst, SIMD_RegVariant size,
>                 PRegister pg, FloatRegister src) {
>     auto m = is_unsigned ? (sve_reduction3)&Assembler::sve_uminv : 
> &Assembler::sve_sminv;
>     (this->*m)(dst, size, pg, src);
>   }
>   void sve_maxv(bool is_unsigned, FloatRegister dst, SIMD_RegVariant size,
>                 PRegister pg, FloatRegister src) {
>     auto m = is_unsigned ? (sve_reduction3)&Assembler::sve_umaxv : 
> &Assembler::sve_smaxv;
>     (this->*m)(dst, size, pg, src);
>   }
> 
> 
> 
> To some extent it's a matter of taste, but please try not to use much more 
> repetitive and boilerplate code than you need to.

I’m not sure, but would the code below be better? It might make the macro 
assembler a bit tidier.

  void neon_minmaxp(bool is_unsigned, bool is_max, FloatRegister dst,
                    SIMD_Arrangement size, FloatRegister src1, FloatRegister 
src2) {
    auto m = is_unsigned ? (is_max ? &Assembler::umaxp : &Assembler::uminp)
                         : (is_max ? &Assembler::smaxp : &Assembler::sminp);
    (this->*m)(dst, size, src1, src2);
  }

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/28693#discussion_r2753257260

Reply via email to