Skip to content

Commit

Permalink
8282049: AArch64: Use ZR for integer zero immediate volatile stores
Browse files Browse the repository at this point in the history
Backport-of: 413bef6890e9ba820590aa48017c4c7b1d691d24
  • Loading branch information
Dmitry Chuyko authored and Paul Hohensee committed Sep 15, 2022
1 parent 6f6b072 commit 46f94ad
Showing 1 changed file with 91 additions and 0 deletions.
91 changes: 91 additions & 0 deletions src/hotspot/cpu/aarch64/aarch64.ad
Expand Up @@ -3105,16 +3105,30 @@ encode %{
rscratch1, stlrb);
%}

enc_class aarch64_enc_stlrb0(memory mem) %{
MOV_VOLATILE(zr, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
rscratch1, stlrb);
%}

enc_class aarch64_enc_stlrh(iRegI src, memory mem) %{
MOV_VOLATILE(as_Register($src$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
rscratch1, stlrh);
%}

enc_class aarch64_enc_stlrh0(memory mem) %{
MOV_VOLATILE(zr, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
rscratch1, stlrh);
%}

enc_class aarch64_enc_stlrw(iRegI src, memory mem) %{
MOV_VOLATILE(as_Register($src$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
rscratch1, stlrw);
%}

enc_class aarch64_enc_stlrw0(memory mem) %{
MOV_VOLATILE(zr, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
rscratch1, stlrw);
%}

enc_class aarch64_enc_ldarsbw(iRegI dst, memory mem) %{
Register dst_reg = as_Register($dst$$reg);
Expand Down Expand Up @@ -3205,6 +3219,11 @@ encode %{
rscratch1, stlr);
%}

enc_class aarch64_enc_stlr0(memory mem) %{
MOV_VOLATILE(zr, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
rscratch1, stlr);
%}

enc_class aarch64_enc_fstlrs(vRegF src, memory mem) %{
{
C2_MacroAssembler _masm(&cbuf);
Expand Down Expand Up @@ -8115,6 +8134,18 @@ instruct storeB_volatile(iRegIorL2I src, /* sync_memory*/indirect mem)
ins_pipe(pipe_class_memory);
%}

instruct storeimmB0_volatile(immI0 zero, /* sync_memory*/indirect mem)
%{
match(Set mem (StoreB mem zero));

ins_cost(VOLATILE_REF_COST);
format %{ "stlrb zr, $mem\t# byte" %}

ins_encode(aarch64_enc_stlrb0(mem));

ins_pipe(pipe_class_memory);
%}

// Store Char/Short
instruct storeC_volatile(iRegIorL2I src, /* sync_memory*/indirect mem)
%{
Expand All @@ -8128,6 +8159,18 @@ instruct storeC_volatile(iRegIorL2I src, /* sync_memory*/indirect mem)
ins_pipe(pipe_class_memory);
%}

instruct storeimmC0_volatile(immI0 zero, /* sync_memory*/indirect mem)
%{
match(Set mem (StoreC mem zero));

ins_cost(VOLATILE_REF_COST);
format %{ "stlrh zr, $mem\t# short" %}

ins_encode(aarch64_enc_stlrh0(mem));

ins_pipe(pipe_class_memory);
%}

// Store Integer

instruct storeI_volatile(iRegIorL2I src, /* sync_memory*/indirect mem)
Expand All @@ -8142,6 +8185,18 @@ instruct storeI_volatile(iRegIorL2I src, /* sync_memory*/indirect mem)
ins_pipe(pipe_class_memory);
%}

instruct storeimmI0_volatile(immI0 zero, /* sync_memory*/indirect mem)
%{
match(Set mem(StoreI mem zero));

ins_cost(VOLATILE_REF_COST);
format %{ "stlrw zr, $mem\t# int" %}

ins_encode(aarch64_enc_stlrw0(mem));

ins_pipe(pipe_class_memory);
%}

// Store Long (64 bit signed)
instruct storeL_volatile(iRegL src, /* sync_memory*/indirect mem)
%{
Expand All @@ -8155,6 +8210,18 @@ instruct storeL_volatile(iRegL src, /* sync_memory*/indirect mem)
ins_pipe(pipe_class_memory);
%}

instruct storeimmL0_volatile(immL0 zero, /* sync_memory*/indirect mem)
%{
match(Set mem (StoreL mem zero));

ins_cost(VOLATILE_REF_COST);
format %{ "stlr zr, $mem\t# int" %}

ins_encode(aarch64_enc_stlr0(mem));

ins_pipe(pipe_class_memory);
%}

// Store Pointer
instruct storeP_volatile(iRegP src, /* sync_memory*/indirect mem)
%{
Expand All @@ -8168,6 +8235,18 @@ instruct storeP_volatile(iRegP src, /* sync_memory*/indirect mem)
ins_pipe(pipe_class_memory);
%}

instruct storeimmP0_volatile(immP0 zero, /* sync_memory*/indirect mem)
%{
match(Set mem (StoreP mem zero));

ins_cost(VOLATILE_REF_COST);
format %{ "stlr zr, $mem\t# ptr" %}

ins_encode(aarch64_enc_stlr0(mem));

ins_pipe(pipe_class_memory);
%}

// Store Compressed Pointer
instruct storeN_volatile(iRegN src, /* sync_memory*/indirect mem)
%{
Expand All @@ -8181,6 +8260,18 @@ instruct storeN_volatile(iRegN src, /* sync_memory*/indirect mem)
ins_pipe(pipe_class_memory);
%}

instruct storeimmN0_volatile(immN0 zero, /* sync_memory*/indirect mem)
%{
match(Set mem (StoreN mem zero));

ins_cost(VOLATILE_REF_COST);
format %{ "stlrw zr, $mem\t# compressed ptr" %}

ins_encode(aarch64_enc_stlrw0(mem));

ins_pipe(pipe_class_memory);
%}

// Store Float
instruct storeF_volatile(vRegF src, /* sync_memory*/indirect mem)
%{
Expand Down

0 comments on commit 46f94ad

Please sign in to comment.