[aarch64-port-dev ] RFR: Add support for G1GC

Andrew Haley aph at redhat.com
Tue Mar 18 11:12:33 UTC 2014


On 03/18/2014 10:52 AM, Edward Nevill wrote:
> Hi,
> 
> The following patch adds support for G1GC.
> 
> This is disabled by default and only enabled with the -XX:+UseG1GC option.
> 
> I have tested this against JTreg hotspot and it gives no additional failures/errors.
> 
> OK to push?

One or two questions inline:

> --- CUT HERE ---
> exporting patch:
> # HG changeset patch
> # User Edward Nevill edward.nevill at linaro.org
> # Date 1395139429 0
> #      Tue Mar 18 10:43:49 2014 +0000
> # Node ID 53205a277e07e8be32c4592ba0982f7bc3817717
> # Parent  939480aaf1b23f1013de7bca05dd6a2c3cef3430
> Add support for G1GC
> 
> diff -r 939480aaf1b2 -r 53205a277e07 src/cpu/aarch64/vm/aarch64.ad
> --- a/src/cpu/aarch64/vm/aarch64.ad	Tue Mar 11 15:44:21 2014 +0000
> +++ b/src/cpu/aarch64/vm/aarch64.ad	Tue Mar 18 10:43:49 2014 +0000
> @@ -5112,6 +5112,19 @@
>  
>  // Store Instructions
>  
> +// Store CMS card-mark Immediate
> +instruct storeimmCM0(immI0 zero, memory mem)
> +%{
> +  match(Set mem (StoreCM mem zero));
> +
> +  ins_cost(MEMORY_REF_COST);
> +  format %{ "strb zr, $mem\t# byte" %}
> +
> +  ins_encode(aarch64_enc_strb0(mem));

Are you sure this isn't a store release?  I'm not sure.

> @@ -1866,47 +1866,47 @@
>  void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst) {
>    
>    assert(left->is_single_cpu() || left->is_double_cpu(), "expect single or double register");
> -  if (left->is_single_cpu()) {
> -    assert (right->is_single_cpu() || right->is_constant(), "single register or constant expected");
> -    if (right->is_constant()
> -	&& Assembler::operand_valid_for_logical_immediate(true, right->as_jint())) {
> -
> -      switch (code) {
> -      case lir_logic_and: __ andw (dst->as_register(), left->as_register(), right->as_jint()); break;
> -      case lir_logic_or:  __ orrw (dst->as_register(), left->as_register(), right->as_jint()); break;
> -      case lir_logic_xor: __ eorw (dst->as_register(), left->as_register(), right->as_jint()); break;
> -      default: ShouldNotReachHere(); break;
> -      }
> -    } else {
> -      switch (code) {
> -      case lir_logic_and: __ andw (dst->as_register(), left->as_register(), right->as_register()); break;
> -      case lir_logic_or:  __ orrw (dst->as_register(), left->as_register(), right->as_register()); break;
> -      case lir_logic_xor: __ eorw (dst->as_register(), left->as_register(), right->as_register()); break;
> -      default: ShouldNotReachHere(); break;
> -      }
> -    }
> -  } else {
> -    assert (right->is_double_cpu() || right->is_constant(), "single register or constant expected");
> -    if (right->is_double_cpu()) {
> -      switch (code) {
> -      case lir_logic_and: __ andr(dst->as_register_lo(), left->as_register_lo(), right->as_register_lo()); break;
> -      case lir_logic_or:  __ orr (dst->as_register_lo(), left->as_register_lo(), right->as_register_lo()); break;
> -      case lir_logic_xor: __ eor (dst->as_register_lo(), left->as_register_lo(), right->as_register_lo()); break;
> -      default:
> -	ShouldNotReachHere();
> -	break;
> -      }
> -    } else {
> -      switch (code) {
> -      case lir_logic_and: __ andr(dst->as_register_lo(), left->as_register_lo(), right->as_jlong()); break;
> -      case lir_logic_or:  __ orr (dst->as_register_lo(), left->as_register_lo(), right->as_jlong()); break;
> -      case lir_logic_xor: __ eor (dst->as_register_lo(), left->as_register_lo(), right->as_jlong()); break;
> -      default:
> -	ShouldNotReachHere();
> -	break;
> -      }
> -    }
> -  }
> +  Register Rleft = left->is_single_cpu() ? left->as_register() :
> +                                           left->as_register_lo();
> +   if (dst->is_single_cpu()) {
> +     Register Rdst = dst->as_register();
> +     if (right->is_constant()) {
> +       switch (code) {
> +         case lir_logic_and: __ andw (Rdst, Rleft, right->as_jint()); break;
> +         case lir_logic_or:  __ orrw (Rdst, Rleft, right->as_jint()); break;
> +         case lir_logic_xor: __ eorw (Rdst, Rleft, right->as_jint()); break;
> +         default: ShouldNotReachHere(); break;
> +       }
> +     } else {
> +       Register Rright = right->is_single_cpu() ? right->as_register() :
> +                                                  right->as_register_lo();
> +       switch (code) {
> +         case lir_logic_and: __ andw (Rdst, Rleft, Rright); break;
> +         case lir_logic_or:  __ orrw (Rdst, Rleft, Rright); break;
> +         case lir_logic_xor: __ eorw (Rdst, Rleft, Rright); break;
> +         default: ShouldNotReachHere(); break;
> +       }
> +     }
> +   } else {
> +     Register Rdst = dst->as_register_lo();
> +     if (right->is_constant()) {
> +       switch (code) {
> +         case lir_logic_and: __ andr (Rdst, Rleft, right->as_jlong()); break;
> +         case lir_logic_or:  __ orr (Rdst, Rleft, right->as_jlong()); break;
> +         case lir_logic_xor: __ eor (Rdst, Rleft, right->as_jlong()); break;
> +         default: ShouldNotReachHere(); break;
> +       }
> +     } else {
> +       Register Rright = right->is_single_cpu() ? right->as_register() :
> +                                                  right->as_register_lo();
> +       switch (code) {
> +         case lir_logic_and: __ andr (Rdst, Rleft, Rright); break;
> +         case lir_logic_or:  __ orr (Rdst, Rleft, Rright); break;
> +         case lir_logic_xor: __ eor (Rdst, Rleft, Rright); break;
> +         default: ShouldNotReachHere(); break;
> +       }
> +     }
> +   }
>  }

What is this rewrite of logic_op for?  Is it part of this patch?

> +	//__ push(r0->bit(1) | r1->bit(1), sp);
> +	__ push(r0->bit(1) | r1->bit(1) | rscratch1->bit(1) | rscratch2->bit(1), sp);

What is the commented-out code for?  Why is this particular set of registers
pushed?

> +  // Calling the runtime using the regular call_VM_leaf mechanism generates
> +  // code (generated by InterpreterMacroAssember::call_VM_leaf_base)
> +  // that checks that the *(ebp+frame::interpreter_frame_last_sp) == NULL.

Does it really?

Otherwise this is OK.

Andrew.




More information about the aarch64-port-dev mailing list