RFR: 8341068: [s390x] intrinsics for divideUnsigned and remainderUnsigned methods in java.lang.Integer and java.lang.Long

Andrew Haley aph at openjdk.org
Thu Oct 17 12:56:11 UTC 2024


On Thu, 17 Oct 2024 09:45:19 GMT, Amit Kumar <amitkumar at openjdk.org> wrote:

> Add match rules for UDivI, UModI, UDivL, UModL. And also adds `dlr` and `dlgr` instruction. 
> 
> Tier1 test are clean for fastdebug vm; 
> 
> Before this patch, `compiler/c2/TestDivModNodes.java` was failing (see jbs issue) but with this patch test is passing. 
> 
> Without Patch: 
> 
> 
> Benchmark                                  (BUFFER_SIZE)  (divisorType)  Mode  Cnt     Score     Error  Units
> IntegerDivMod.testDivideRemainderUnsigned           1024          mixed  avgt   15  1935.176 ±   2.191  ns/op
> IntegerDivMod.testDivideRemainderUnsigned           1024       positive  avgt   15  1934.915 ±   3.207  ns/op
> IntegerDivMod.testDivideRemainderUnsigned           1024       negative  avgt   15  1934.325 ±   1.108  ns/op
> IntegerDivMod.testDivideUnsigned                    1024          mixed  avgt   15  1809.782 ±  49.341  ns/op
> IntegerDivMod.testDivideUnsigned                    1024       positive  avgt   15  1769.326 ±   2.607  ns/op
> IntegerDivMod.testDivideUnsigned                    1024       negative  avgt   15  1784.053 ±  71.190  ns/op
> IntegerDivMod.testRemainderUnsigned                 1024          mixed  avgt   15  2026.978 ±   1.534  ns/op
> IntegerDivMod.testRemainderUnsigned                 1024       positive  avgt   15  2028.039 ±   3.812  ns/op
> IntegerDivMod.testRemainderUnsigned                 1024       negative  avgt   15  2437.843 ± 636.808  ns/op
> Finished running test 'micro:java.lang.IntegerDivMod'
> 
>  
> Benchmark                               (BUFFER_SIZE)  (divisorType)  Mode  Cnt     Score    Error  Units
> LongDivMod.testDivideRemainderUnsigned           1024          mixed  avgt   15  4524.897 ± 16.566  ns/op
> LongDivMod.testDivideRemainderUnsigned           1024       positive  avgt   15  4373.714 ±  9.514  ns/op
> LongDivMod.testDivideRemainderUnsigned           1024       negative  avgt   15  2018.309 ±  1.788  ns/op
> LongDivMod.testDivideUnsigned                    1024          mixed  avgt   15  4320.382 ± 19.055  ns/op
> LongDivMod.testDivideUnsigned                    1024       positive  avgt   15  3988.953 ±  8.770  ns/op
> LongDivMod.testDivideUnsigned                    1024       negative  avgt   15  1069.703 ±  1.525  ns/op
> LongDivMod.testRemainderUnsigned                 1024          mixed  avgt   15  5589.319 ±  4.247  ns/op
> LongDivMod.testRemainderUnsigned                 1024       positive  avgt   15  3904.555 ±  3.191  ns/op
> LongDivMod.testRemainderUnsigned                 1024       negative  avgt   15  1765.761 ±  1.539  ns/op
> Finished ...

src/hotspot/cpu/s390/s390.ad line 6258:

> 6256: // Unsigned Integer Register Division
> 6257: // NOTE: z_dlr requires even-odd pair. remainder will be in even register(r4) & quotient will be stored in odd register(r5)
> 6258: // for dividend, leftmost 32bits will be in r4 and rightmost 32bits will be in r5 register.

Suggestion:

// for dividend, upper 32bits will be in r4 and lower 32bits will be in r5 register.


This PR uses the terms "leftmost" and "rightmost" for numerically higher and lower parts of an integer. I wondered if this perhaps was common in s390.ad, but it is not. Please say "higher" and "lower".

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

PR Review Comment: https://git.openjdk.org/jdk/pull/21559#discussion_r1804731105


More information about the hotspot-compiler-dev mailing list