diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index bf2f31c5a4f..f70b9f85546 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -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); @@ -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); @@ -8119,6 +8138,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) %{ @@ -8132,6 +8163,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) @@ -8146,6 +8189,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) %{ @@ -8159,6 +8214,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) %{ @@ -8172,6 +8239,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) %{ @@ -8185,6 +8264,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) %{