< prev index next >
src/hotspot/cpu/aarch64/aarch64.ad
Print this page
rev 53735 : AArch64 support for ValueTypes
*** 1953,1962 ****
--- 1953,1986 ----
// BoxLockNode is not a MachNode, so we can't just call MachNode::size(ra_).
return 4;
}
//=============================================================================
+ #ifndef PRODUCT
+ void MachVVEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
+ {
+ st->print_cr("MachVVEPNode");
+ }
+ #endif
+
+ void MachVVEPNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const
+ {
+ // Unpack all value type args passed as oop and then jump to
+ // the verified entry point (skipping the unverified entry).
+ MacroAssembler _masm(&cbuf);
+
+ __ unpack_value_args(ra_->C);
+ __ b(*_verified_entry);
+ }
+
+ uint MachVVEPNode::size(PhaseRegAlloc* ra_) const
+ {
+ return MachNode::size(ra_); // too many variables; just compute it the hard way
+ }
+
+
+ //=============================================================================
#ifndef PRODUCT
void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
{
st->print_cr("# MachUEPNode");
*** 2365,2375 ****
static void getCallInfo(const TypeFunc *tf, int &gpcnt, int &fpcnt, int &rtype)
{
int gps = 0;
int fps = 0;
! const TypeTuple *domain = tf->domain();
int max = domain->cnt();
for (int i = TypeFunc::Parms; i < max; i++) {
const Type *t = domain->field_at(i);
switch(t->basic_type()) {
case T_FLOAT:
--- 2389,2399 ----
static void getCallInfo(const TypeFunc *tf, int &gpcnt, int &fpcnt, int &rtype)
{
int gps = 0;
int fps = 0;
! const TypeTuple *domain = tf->domain_cc();
int max = domain->cnt();
for (int i = TypeFunc::Parms; i < max; i++) {
const Type *t = domain->field_at(i);
switch(t->basic_type()) {
case T_FLOAT:
*** 7883,7892 ****
--- 7907,7931 ----
%}
ins_pipe(ialu_reg);
%}
+ instruct castN2X(iRegLNoSp dst, iRegN src) %{
+ match(Set dst (CastP2X src));
+
+ ins_cost(INSN_COST);
+ format %{ "mov $dst, $src\t# ptr -> long" %}
+
+ ins_encode %{
+ if ($dst$$reg != $src$$reg) {
+ __ mov(as_Register($dst$$reg), as_Register($src$$reg));
+ }
+ %}
+
+ ins_pipe(ialu_reg);
+ %}
+
instruct castP2X(iRegLNoSp dst, iRegP src) %{
match(Set dst (CastP2X src));
ins_cost(INSN_COST);
format %{ "mov $dst, $src\t# ptr -> long" %}
*** 13396,13408 ****
%}
// ============================================================================
// clearing of an array
! instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, Universe dummy, rFlagsReg cr)
%{
! match(Set dummy (ClearArray cnt base));
effect(USE_KILL cnt, USE_KILL base);
ins_cost(4 * INSN_COST);
format %{ "ClearArray $cnt, $base" %}
--- 13435,13447 ----
%}
// ============================================================================
// clearing of an array
! instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, iRegL val, Universe dummy, rFlagsReg cr)
%{
! match(Set dummy (ClearArray (Binary cnt base) val));
effect(USE_KILL cnt, USE_KILL base);
ins_cost(4 * INSN_COST);
format %{ "ClearArray $cnt, $base" %}
*** 13411,13425 ****
%}
ins_pipe(pipe_class_memory);
%}
! instruct clearArray_imm_reg(immL cnt, iRegP_R10 base, Universe dummy, rFlagsReg cr)
%{
! predicate((u_int64_t)n->in(2)->get_long()
< (u_int64_t)(BlockZeroingLowLimit >> LogBytesPerWord));
! match(Set dummy (ClearArray cnt base));
effect(USE_KILL base);
ins_cost(4 * INSN_COST);
format %{ "ClearArray $cnt, $base" %}
--- 13450,13465 ----
%}
ins_pipe(pipe_class_memory);
%}
! instruct clearArray_imm_reg(immL cnt, iRegP_R10 base, iRegL val, Universe dummy, rFlagsReg cr)
%{
! predicate((u_int64_t)n->in(3)->get_long()
< (u_int64_t)(BlockZeroingLowLimit >> LogBytesPerWord));
!
! match(Set dummy (ClearArray (Binary cnt base) val));
effect(USE_KILL base);
ins_cost(4 * INSN_COST);
format %{ "ClearArray $cnt, $base" %}
< prev index next >