RFR: 8282221: x86 intrinsics for divideUnsigned and remainderUnsigned methods in java.lang.Integer and java.lang.Long [v4]
Jatin Bhateja
jbhateja at openjdk.java.net
Thu Feb 24 14:18:13 UTC 2022
On Thu, 24 Feb 2022 02:43:46 GMT, Vamsi Parasa <duke at openjdk.java.net> wrote:
>> Optimizes the divideUnsigned() and remainderUnsigned() methods in java.lang.Integer and java.lang.Long classes using x86 intrinsics. This change shows 3x improvement for Integer methods and upto 25% improvement for Long. This change also implements the DivMod optimization which fuses division and modulus operations if needed. The DivMod optimization shows 3x improvement for Integer and ~65% improvement for Long.
>
> Vamsi Parasa has updated the pull request incrementally with one additional commit since the last revision:
>
> fix 32bit build issues
src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp line 4408:
> 4406: jmp(done);
> 4407: bind(neg_divisor_fastpath);
> 4408: // Fastpath for divisor < 0:
How about checking if divisor is +ve or -ve constant and non-constant dividend in identity routine and setting a flag in IR node, which can be used to either emit fast / slow path in a new instruction selection pattern. It will save emitting redundant instructions.
src/hotspot/share/opto/divnode.cpp line 881:
> 879: return (phase->type( in(2) )->higher_equal(TypeLong::ONE)) ? in(1) : this;
> 880: }
> 881: //------------------------------Value------------------------------------------
Ideal transform to replace unsigned divide by cheaper logical right shift instruction if divisor is POW will be useful.
src/hotspot/share/opto/divnode.cpp line 897:
> 895:
> 896: // Either input is BOTTOM ==> the result is the local BOTTOM
> 897: const Type *bot = bottom_type();
Can we add constant folding handling when both dividend and divisor are constants.
-------------
PR: https://git.openjdk.java.net/jdk/pull/7572
More information about the hotspot-compiler-dev
mailing list