[12] RFR 8206895: aarch64: rework error-prone cmp instruction

Andrew Haley aph at redhat.com
Wed Jul 11 15:48:04 UTC 2018

On 07/11/2018 04:42 PM, Boris Ulasevich wrote:
> Please review the following patch:
> http://cr.openjdk.java.net/~bulasevich/8206895/webrev.02
> https://bugs.openjdk.java.net/browse/JDK-8206895
> cmp instruction overloading introduced to force user to specify 
> immediate value type implicitly. The only allowed type is unsigned char. 

But how does this solve the problem?  Won't the C++ compiler silently
truncate cmp(reg, int) to a uint8 ?

> For immediate values outside of byte range subs macro should be called 
> directly.
> cmp calls all over the codes was fixed accordingly to the following plan:
>    cmp(reg, imm8)  -> cmp(reg, (u1)imm8)
>    cmp(reg, imm12) -> subs(zr, reg, imm12)
>    cmp(reg, imm64) -> subs(scratch, reg, imm64)
> The change was tested with jtreg tests.

This hunk looks wrong:

@@ -1129,7 +1129,7 @@

   if (super_check_offset.is_register()) {
     br(Assembler::EQ, *L_success);
-    cmp(super_check_offset.as_register(), sc_offset);
+    subs(zr, super_check_offset.as_register(), sc_offset);

cmp with register is still allowed.

Andrew Haley
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671

More information about the hotspot-dev mailing list