RFR: 8270086: ARM32-softfp: Do not load CONSTANT_double using the condy helper methods in the interpreter
Aleksey Shipilev
shade at openjdk.java.net
Mon Jul 26 08:40:05 UTC 2021
On Tue, 13 Jul 2021 13:17:58 GMT, Christoph Göttschkes <cgo at openjdk.org> wrote:
> Hi,
>
> please review this fix for the template interpreter for ARM32-softfp.
>
> With the introduction of condy, the interpreter started to load double constants using the condy_helper, which is unnecessary. Also, the [resolve_ldc](https://github.com/openjdk/jdk/blob/8973867fb9568a3a527b763c9ce10cebdfb306d0/src/hotspot/share/interpreter/interpreterRuntime.cpp#L148) implementation of the interpreter runtime might not be designed to load constant values. It should only load strings and condy.
>
> https://github.com/openjdk/jdk/blob/2ee56fd1cf4acd634e19cc77b7c9a6858e1c315a/src/hotspot/cpu/arm/templateTable_arm.cpp#L515-L560
>
> I refactored the ldc2_w bytecode imlpementation. Now, the ifdef between soft and hard float covers both types, CONSTANT_Long and CONSTANT_Double. I did this, because for the softfp, we can use a conditional cmp, since double and long are both placed on the stack in the same way. The same is also done for CONSTANT_Integer and CONSTANT_Float in the ldc bytecode implementation. Also, I think it is easier to follow the code this way.
>
> Old ldc2_w implementation (before condy was implemented for ARM32):
>
> https://github.com/openjdk/jdk/blob/7101b28dc3903be27cb46a00781f4d74f81f1114/src/hotspot/cpu/arm/templateTable_arm.cpp#L497-L537
>
> Testing: ARMv7-A (hardfp) hotspot tier1, ARMv5TE (softfp) hotspot tier1
I see that this patch does, and I think it goes in the right direction. Let's follow the form of other arches `TemplateTable::ldc2_w` does, and what other places in ARM32 template interpreter do?
These are my suggestions:
- Rename label `Condy` to `NotLong`
- Rename label `exit` to `Done`
- Handle only double path under !_ABI_HARD_PATH
Something like (drafting it blindly):
Label NotDouble, NotLong, Done;
__ cmp(Rtemp, JVM_CONSTANT_Double);
__ b(NotDouble, ne);
#ifdef __ABI_HARD__
__ ldr_double(D0_tos, Address(Rbase, base_offset));
#else
__ ldr(R0_tos_lo, Address(Rbase, base_offset + 0 * wordSize));
__ ldr(R1_tos_hi, Address(Rbase, base_offset + 1 * wordSize));
#endif
__ push(dtos);
__ b(Done);
__ bind(NotDouble);
__ cmp(Rtemp, JVM_CONSTANT_Long);
__ b(NotLong, ne);
__ ldr(R0_tos_lo, Address(Rbase, base_offset + 0 * wordSize));
__ ldr(R1_tos_hi, Address(Rbase, base_offset + 1 * wordSize));
__ push(ltos);
__ b(Done);
__ bind(NotLong);
condy_helper(Done);
__ bind(Done);
-------------
PR: https://git.openjdk.java.net/jdk/pull/4767
More information about the hotspot-compiler-dev
mailing list