RFR: Store verification
Roland Westrelin
rwestrel at redhat.com
Fri Oct 21 08:27:39 UTC 2016
> I have not yet implemented store-checks in x86_64.ad yet, because I
> couldn't figure out how/where to insert the necessary MacroAssembler
> calls. Roland: maybe you could have a look?
Below is an example of how I think you would do in x86_64.ad
Also it seems you got some conditions wrong.
Roland.
diff --git a/src/cpu/x86/vm/macroAssembler_x86.cpp b/src/cpu/x86/vm/macroAssembler_x86.cpp
--- a/src/cpu/x86/vm/macroAssembler_x86.cpp
+++ b/src/cpu/x86/vm/macroAssembler_x86.cpp
@@ -6123,7 +6123,7 @@
}
void MacroAssembler::_shenandoah_store_addr_check(Register dst, const char* msg, const char* file, int line) {
- if (! UseShenandoahGC && ! ShenandoahStoreCheck) return;
+ if (! UseShenandoahGC || ! ShenandoahStoreCheck) return;
if (dst == rsp) return; // Stack-based target
Register raddr = r9;
@@ -6169,7 +6169,7 @@
}
void MacroAssembler::_shenandoah_store_check(Register dst, Register value, const char* msg, const char* file, int line) {
- if (! UseShenandoahGC && ! ShenandoahStoreCheck) return;
+ if (! UseShenandoahGC || ! ShenandoahStoreCheck) return;
if (dst == rsp) return; // Stack-based target
Register raddr = r8;
diff --git a/src/cpu/x86/vm/x86_64.ad b/src/cpu/x86/vm/x86_64.ad
--- a/src/cpu/x86/vm/x86_64.ad
+++ b/src/cpu/x86/vm/x86_64.ad
@@ -2693,6 +2693,15 @@
RELOC_DISP32);
%}
+ enc_class shenandoah_store_check(memory mem, any_RegP src) %{
+ MacroAssembler _masm(&cbuf);
+ __ shenandoah_store_check($mem$$Address, $src$$Register);
+ %}
+
+ enc_class shenandoah_store_addr_check(memory mem) %{
+ MacroAssembler _masm(&cbuf);
+ __ shenandoah_store_addr_check($mem$$Address);
+ %}
%}
@@ -5665,7 +5674,7 @@
ins_cost(125); // XXX
format %{ "movl $mem, $src\t# int" %}
opcode(0x89);
- ins_encode(REX_reg_mem(src, mem), OpcP, reg_mem(src, mem));
+ ins_encode(shenandoah_store_addr_check(mem), REX_reg_mem(src, mem), OpcP, reg_mem(src, mem));
ins_pipe(ialu_mem_reg);
%}
@@ -5689,7 +5698,7 @@
ins_cost(125); // XXX
format %{ "movq $mem, $src\t# ptr" %}
opcode(0x89);
- ins_encode(REX_reg_mem_wide(src, mem), OpcP, reg_mem(src, mem));
+ ins_encode(shenandoah_store_check(mem, src), REX_reg_mem_wide(src, mem), OpcP, reg_mem(src, mem));
ins_pipe(ialu_mem_reg);
%}
More information about the shenandoah-dev
mailing list