mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 19:44:41 +02:00
8293290: RISC-V: Explicitly pass a third temp register to MacroAssembler::store_heap_oop
Reviewed-by: shade
This commit is contained in:
parent
48b3ab02f9
commit
5bed9f7675
16 changed files with 71 additions and 69 deletions
|
@ -272,18 +272,18 @@ void G1BarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorator
|
|||
}
|
||||
|
||||
void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2) {
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
|
||||
// flatten object address if needed
|
||||
if (dst.offset() == 0) {
|
||||
if (dst.base() != x13) {
|
||||
__ mv(x13, dst.base());
|
||||
if (dst.base() != tmp3) {
|
||||
__ mv(tmp3, dst.base());
|
||||
}
|
||||
} else {
|
||||
__ la(x13, dst);
|
||||
__ la(tmp3, dst);
|
||||
}
|
||||
|
||||
g1_write_barrier_pre(masm,
|
||||
x13 /* obj */,
|
||||
tmp3 /* obj */,
|
||||
tmp2 /* pre_val */,
|
||||
xthread /* thread */,
|
||||
tmp1 /* tmp */,
|
||||
|
@ -291,7 +291,7 @@ void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet deco
|
|||
false /* expand_call */);
|
||||
|
||||
if (val == noreg) {
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, Address(x13, 0), noreg, noreg, noreg);
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp3, 0), noreg, noreg, noreg, noreg);
|
||||
} else {
|
||||
// G1 barrier needs uncompressed oop for region cross check.
|
||||
Register new_val = val;
|
||||
|
@ -299,9 +299,9 @@ void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet deco
|
|||
new_val = t1;
|
||||
__ mv(new_val, val);
|
||||
}
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, Address(x13, 0), val, noreg, noreg);
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp3, 0), val, noreg, noreg, noreg);
|
||||
g1_write_barrier_post(masm,
|
||||
x13 /* store_adr */,
|
||||
tmp3 /* store_adr */,
|
||||
new_val /* new_val */,
|
||||
xthread /* thread */,
|
||||
tmp1 /* tmp */,
|
||||
|
|
|
@ -60,7 +60,7 @@ protected:
|
|||
Register tmp2);
|
||||
|
||||
virtual void oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2);
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3);
|
||||
|
||||
public:
|
||||
#ifdef COMPILER1
|
||||
|
|
|
@ -79,7 +79,7 @@ void BarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet decorators,
|
|||
}
|
||||
|
||||
void BarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2) {
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
|
||||
bool in_heap = (decorators & IN_HEAP) != 0;
|
||||
bool in_native = (decorators & IN_NATIVE) != 0;
|
||||
switch (type) {
|
||||
|
|
|
@ -52,7 +52,7 @@ public:
|
|||
virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Register dst, Address src, Register tmp1, Register tmp_thread);
|
||||
virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2);
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3);
|
||||
|
||||
virtual void try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env,
|
||||
Register obj, Register tmp, Label& slowpath);
|
||||
|
|
|
@ -88,21 +88,21 @@ void CardTableBarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembl
|
|||
}
|
||||
|
||||
void CardTableBarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2) {
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
|
||||
bool in_heap = (decorators & IN_HEAP) != 0;
|
||||
bool is_array = (decorators & IS_ARRAY) != 0;
|
||||
bool on_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0;
|
||||
bool precise = is_array || on_anonymous;
|
||||
|
||||
bool needs_post_barrier = val != noreg && in_heap;
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, noreg, noreg);
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, noreg, noreg, noreg);
|
||||
if (needs_post_barrier) {
|
||||
// flatten object address if needed
|
||||
if (!precise || dst.offset() == 0) {
|
||||
store_check(masm, dst.base(), x13);
|
||||
store_check(masm, dst.base(), tmp3);
|
||||
} else {
|
||||
__ la(x13, dst);
|
||||
store_check(masm, x13, t0);
|
||||
__ la(tmp3, dst);
|
||||
store_check(masm, tmp3, t0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2020, 2021, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -36,7 +36,7 @@ protected:
|
|||
virtual void gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators,
|
||||
Register start, Register count, Register tmp, RegSet saved_regs);
|
||||
virtual void oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2);
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3);
|
||||
};
|
||||
|
||||
#endif // #ifndef CPU_RISCV_GC_SHARED_CARDTABLEBARRIERSETASSEMBLER_RISCV_HPP
|
||||
|
|
|
@ -45,10 +45,10 @@ void ModRefBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, Decorat
|
|||
}
|
||||
|
||||
void ModRefBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2) {
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
|
||||
if (is_reference_type(type)) {
|
||||
oop_store_at(masm, decorators, type, dst, val, tmp1, tmp2);
|
||||
oop_store_at(masm, decorators, type, dst, val, tmp1, tmp2, tmp3);
|
||||
} else {
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2, tmp3);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2020, 2021, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -41,7 +41,7 @@ protected:
|
|||
Register start, Register count, Register tmp, RegSet saved_regs) {}
|
||||
|
||||
virtual void oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2) = 0;
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) = 0;
|
||||
|
||||
public:
|
||||
virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
|
||||
|
@ -49,7 +49,7 @@ public:
|
|||
virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
|
||||
Register start, Register count, Register tmp, RegSet saved_regs);
|
||||
virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2);
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3);
|
||||
};
|
||||
|
||||
#endif // CPU_RISCV_GC_SHARED_MODREFBARRIERSETASSEMBLER_RISCV_HPP
|
||||
|
|
|
@ -394,24 +394,24 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm,
|
|||
}
|
||||
|
||||
void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2) {
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
|
||||
bool on_oop = is_reference_type(type);
|
||||
if (!on_oop) {
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2, tmp3);
|
||||
return;
|
||||
}
|
||||
|
||||
// flatten object address if needed
|
||||
if (dst.offset() == 0) {
|
||||
if (dst.base() != x13) {
|
||||
__ mv(x13, dst.base());
|
||||
if (dst.base() != tmp3) {
|
||||
__ mv(tmp3, dst.base());
|
||||
}
|
||||
} else {
|
||||
__ la(x13, dst);
|
||||
__ la(tmp3, dst);
|
||||
}
|
||||
|
||||
shenandoah_write_barrier_pre(masm,
|
||||
x13 /* obj */,
|
||||
tmp3 /* obj */,
|
||||
tmp2 /* pre_val */,
|
||||
xthread /* thread */,
|
||||
tmp1 /* tmp */,
|
||||
|
@ -419,7 +419,7 @@ void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet
|
|||
false /* expand_call */);
|
||||
|
||||
if (val == noreg) {
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, Address(x13, 0), noreg, noreg, noreg);
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp3, 0), noreg, noreg, noreg, noreg);
|
||||
} else {
|
||||
iu_barrier(masm, val, tmp1);
|
||||
// G1 barrier needs uncompressed oop for region cross check.
|
||||
|
@ -428,7 +428,7 @@ void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet
|
|||
new_val = t1;
|
||||
__ mv(new_val, val);
|
||||
}
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, Address(x13, 0), val, noreg, noreg);
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp3, 0), val, noreg, noreg, noreg);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ public:
|
|||
virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Register dst, Address src, Register tmp1, Register tmp_thread);
|
||||
virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
|
||||
Address dst, Register val, Register tmp1, Register tmp2);
|
||||
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3);
|
||||
|
||||
virtual void try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env,
|
||||
Register obj, Register tmp, Label& slowpath);
|
||||
|
|
|
@ -111,7 +111,8 @@ void ZBarrierSetAssembler::store_at(MacroAssembler* masm,
|
|||
Address dst,
|
||||
Register val,
|
||||
Register tmp1,
|
||||
Register tmp2) {
|
||||
Register tmp2,
|
||||
Register tmp3) {
|
||||
// Verify value
|
||||
if (is_reference_type(type)) {
|
||||
// Note that src could be noreg, which means we
|
||||
|
@ -119,7 +120,7 @@ void ZBarrierSetAssembler::store_at(MacroAssembler* masm,
|
|||
if (val != noreg) {
|
||||
Label done;
|
||||
|
||||
// tmp1 and tmp2 are often set to noreg.
|
||||
// tmp1, tmp2 and tmp3 are often set to noreg.
|
||||
RegSet savedRegs = RegSet::of(t0);
|
||||
__ push_reg(savedRegs, sp);
|
||||
|
||||
|
@ -134,7 +135,7 @@ void ZBarrierSetAssembler::store_at(MacroAssembler* masm,
|
|||
}
|
||||
|
||||
// Store value
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
|
||||
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2, noreg);
|
||||
}
|
||||
|
||||
#endif // ASSERT
|
||||
|
|
|
@ -61,7 +61,8 @@ public:
|
|||
Address dst,
|
||||
Register val,
|
||||
Register tmp1,
|
||||
Register tmp2);
|
||||
Register tmp2,
|
||||
Register tmp3);
|
||||
#endif // ASSERT
|
||||
|
||||
virtual void arraycopy_prologue(MacroAssembler* masm,
|
||||
|
|
|
@ -1780,14 +1780,14 @@ void MacroAssembler::null_check(Register reg, int offset) {
|
|||
|
||||
void MacroAssembler::access_store_at(BasicType type, DecoratorSet decorators,
|
||||
Address dst, Register src,
|
||||
Register tmp1, Register thread_tmp) {
|
||||
Register tmp1, Register tmp2, Register tmp3) {
|
||||
BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler();
|
||||
decorators = AccessInternal::decorator_fixup(decorators);
|
||||
bool as_raw = (decorators & AS_RAW) != 0;
|
||||
if (as_raw) {
|
||||
bs->BarrierSetAssembler::store_at(this, decorators, type, dst, src, tmp1, thread_tmp);
|
||||
bs->BarrierSetAssembler::store_at(this, decorators, type, dst, src, tmp1, tmp2, tmp3);
|
||||
} else {
|
||||
bs->store_at(this, decorators, type, dst, src, tmp1, thread_tmp);
|
||||
bs->store_at(this, decorators, type, dst, src, tmp1, tmp2, tmp3);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1955,8 +1955,8 @@ void MacroAssembler::decode_heap_oop(Register d, Register s) {
|
|||
}
|
||||
|
||||
void MacroAssembler::store_heap_oop(Address dst, Register src, Register tmp1,
|
||||
Register thread_tmp, DecoratorSet decorators) {
|
||||
access_store_at(T_OBJECT, IN_HEAP | decorators, dst, src, tmp1, thread_tmp);
|
||||
Register tmp2, Register tmp3, DecoratorSet decorators) {
|
||||
access_store_at(T_OBJECT, IN_HEAP | decorators, dst, src, tmp1, tmp2, tmp3);
|
||||
}
|
||||
|
||||
void MacroAssembler::load_heap_oop(Register dst, Address src, Register tmp1,
|
||||
|
@ -1971,7 +1971,7 @@ void MacroAssembler::load_heap_oop_not_null(Register dst, Address src, Register
|
|||
|
||||
// Used for storing NULLs.
|
||||
void MacroAssembler::store_heap_oop_null(Address dst) {
|
||||
access_store_at(T_OBJECT, IN_HEAP, dst, noreg, noreg, noreg);
|
||||
access_store_at(T_OBJECT, IN_HEAP, dst, noreg, noreg, noreg, noreg);
|
||||
}
|
||||
|
||||
int MacroAssembler::corrected_idivl(Register result, Register rs1, Register rs2,
|
||||
|
|
|
@ -185,7 +185,7 @@ class MacroAssembler: public Assembler {
|
|||
void access_load_at(BasicType type, DecoratorSet decorators, Register dst,
|
||||
Address src, Register tmp1, Register thread_tmp);
|
||||
void access_store_at(BasicType type, DecoratorSet decorators, Address dst,
|
||||
Register src, Register tmp1, Register thread_tmp);
|
||||
Register src, Register tmp1, Register tmp2, Register tmp3);
|
||||
void load_klass(Register dst, Register src);
|
||||
void store_klass(Register dst, Register src);
|
||||
void cmp_klass(Register oop, Register trial_klass, Register tmp, Label &L);
|
||||
|
@ -205,7 +205,7 @@ class MacroAssembler: public Assembler {
|
|||
void load_heap_oop_not_null(Register dst, Address src, Register tmp1 = noreg,
|
||||
Register thread_tmp = noreg, DecoratorSet decorators = 0);
|
||||
void store_heap_oop(Address dst, Register src, Register tmp1 = noreg,
|
||||
Register thread_tmp = noreg, DecoratorSet decorators = 0);
|
||||
Register tmp2 = noreg, Register tmp3 = noreg, DecoratorSet decorators = 0);
|
||||
|
||||
void store_klass_gap(Register dst, Register src);
|
||||
|
||||
|
|
|
@ -1558,7 +1558,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||
__ align(OptoLoopAlignment);
|
||||
|
||||
__ BIND(L_store_element);
|
||||
__ store_heap_oop(Address(to, 0), copied_oop, noreg, noreg, AS_RAW); // store the oop
|
||||
__ store_heap_oop(Address(to, 0), copied_oop, noreg, noreg, noreg, AS_RAW); // store the oop
|
||||
__ add(to, to, UseCompressedOops ? 4 : 8);
|
||||
__ sub(count, count, 1);
|
||||
__ beqz(count, L_do_card_marks);
|
||||
|
|
|
@ -130,7 +130,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
|||
Register val,
|
||||
DecoratorSet decorators) {
|
||||
assert(val == noreg || val == x10, "parameter is just for looks");
|
||||
__ store_heap_oop(dst, val, x29, x11, decorators);
|
||||
__ store_heap_oop(dst, val, x29, x11, x13, decorators);
|
||||
}
|
||||
|
||||
static void do_oop_load(InterpreterMacroAssembler* _masm,
|
||||
|
@ -1041,7 +1041,7 @@ void TemplateTable::iastore() {
|
|||
index_check(x13, x11); // prefer index in x11
|
||||
__ add(x11, x11, arrayOopDesc::base_offset_in_bytes(T_INT) >> 2);
|
||||
__ shadd(t0, x11, x13, t0, 2);
|
||||
__ access_store_at(T_INT, IN_HEAP | IS_ARRAY, Address(t0, 0), x10, noreg, noreg);
|
||||
__ access_store_at(T_INT, IN_HEAP | IS_ARRAY, Address(t0, 0), x10, noreg, noreg, noreg);
|
||||
}
|
||||
|
||||
void TemplateTable::lastore() {
|
||||
|
@ -1054,7 +1054,7 @@ void TemplateTable::lastore() {
|
|||
index_check(x13, x11); // prefer index in x11
|
||||
__ add(x11, x11, arrayOopDesc::base_offset_in_bytes(T_LONG) >> 3);
|
||||
__ shadd(t0, x11, x13, t0, 3);
|
||||
__ access_store_at(T_LONG, IN_HEAP | IS_ARRAY, Address(t0, 0), x10, noreg, noreg);
|
||||
__ access_store_at(T_LONG, IN_HEAP | IS_ARRAY, Address(t0, 0), x10, noreg, noreg, noreg);
|
||||
}
|
||||
|
||||
void TemplateTable::fastore() {
|
||||
|
@ -1067,7 +1067,7 @@ void TemplateTable::fastore() {
|
|||
index_check(x13, x11); // prefer index in x11
|
||||
__ add(x11, x11, arrayOopDesc::base_offset_in_bytes(T_FLOAT) >> 2);
|
||||
__ shadd(t0, x11, x13, t0, 2);
|
||||
__ access_store_at(T_FLOAT, IN_HEAP | IS_ARRAY, Address(t0, 0), noreg /* ftos */, noreg, noreg);
|
||||
__ access_store_at(T_FLOAT, IN_HEAP | IS_ARRAY, Address(t0, 0), noreg /* ftos */, noreg, noreg, noreg);
|
||||
}
|
||||
|
||||
void TemplateTable::dastore() {
|
||||
|
@ -1080,7 +1080,7 @@ void TemplateTable::dastore() {
|
|||
index_check(x13, x11); // prefer index in x11
|
||||
__ add(x11, x11, arrayOopDesc::base_offset_in_bytes(T_DOUBLE) >> 3);
|
||||
__ shadd(t0, x11, x13, t0, 3);
|
||||
__ access_store_at(T_DOUBLE, IN_HEAP | IS_ARRAY, Address(t0, 0), noreg /* dtos */, noreg, noreg);
|
||||
__ access_store_at(T_DOUBLE, IN_HEAP | IS_ARRAY, Address(t0, 0), noreg /* dtos */, noreg, noreg, noreg);
|
||||
}
|
||||
|
||||
void TemplateTable::aastore() {
|
||||
|
@ -1161,7 +1161,7 @@ void TemplateTable::bastore()
|
|||
__ add(x11, x11, arrayOopDesc::base_offset_in_bytes(T_BYTE) >> 0);
|
||||
|
||||
__ add(x11, x13, x11);
|
||||
__ access_store_at(T_BYTE, IN_HEAP | IS_ARRAY, Address(x11, 0), x10, noreg, noreg);
|
||||
__ access_store_at(T_BYTE, IN_HEAP | IS_ARRAY, Address(x11, 0), x10, noreg, noreg, noreg);
|
||||
}
|
||||
|
||||
void TemplateTable::castore()
|
||||
|
@ -1175,7 +1175,7 @@ void TemplateTable::castore()
|
|||
index_check(x13, x11); // prefer index in x11
|
||||
__ add(x11, x11, arrayOopDesc::base_offset_in_bytes(T_CHAR) >> 1);
|
||||
__ shadd(t0, x11, x13, t0, 1);
|
||||
__ access_store_at(T_CHAR, IN_HEAP | IS_ARRAY, Address(t0, 0), x10, noreg, noreg);
|
||||
__ access_store_at(T_CHAR, IN_HEAP | IS_ARRAY, Address(t0, 0), x10, noreg, noreg, noreg);
|
||||
}
|
||||
|
||||
void TemplateTable::sastore()
|
||||
|
@ -2667,7 +2667,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
|||
}
|
||||
__ add(off, obj, off); // if static, obj from cache, else obj from stack.
|
||||
const Address field(off, 0); // off register as temparator register.
|
||||
__ access_store_at(T_BYTE, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_BYTE, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
if (rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_bputfield, bc, x11, true, byte_no);
|
||||
}
|
||||
|
@ -2687,7 +2687,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
|||
}
|
||||
__ add(off, obj, off); // if static, obj from cache, else obj from stack.
|
||||
const Address field(off, 0);
|
||||
__ access_store_at(T_BOOLEAN, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_BOOLEAN, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
if (rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_zputfield, bc, x11, true, byte_no);
|
||||
}
|
||||
|
@ -2728,7 +2728,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
|||
}
|
||||
__ add(off, obj, off); // if static, obj from cache, else obj from stack.
|
||||
const Address field(off, 0);
|
||||
__ access_store_at(T_INT, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_INT, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
if (rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_iputfield, bc, x11, true, byte_no);
|
||||
}
|
||||
|
@ -2748,7 +2748,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
|||
}
|
||||
__ add(off, obj, off); // if static, obj from cache, else obj from stack.
|
||||
const Address field(off, 0);
|
||||
__ access_store_at(T_CHAR, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_CHAR, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
if (rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_cputfield, bc, x11, true, byte_no);
|
||||
}
|
||||
|
@ -2768,7 +2768,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
|||
}
|
||||
__ add(off, obj, off); // if static, obj from cache, else obj from stack.
|
||||
const Address field(off, 0);
|
||||
__ access_store_at(T_SHORT, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_SHORT, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
if (rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_sputfield, bc, x11, true, byte_no);
|
||||
}
|
||||
|
@ -2788,7 +2788,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
|||
}
|
||||
__ add(off, obj, off); // if static, obj from cache, else obj from stack.
|
||||
const Address field(off, 0);
|
||||
__ access_store_at(T_LONG, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_LONG, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
if (rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_lputfield, bc, x11, true, byte_no);
|
||||
}
|
||||
|
@ -2808,7 +2808,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
|||
}
|
||||
__ add(off, obj, off); // if static, obj from cache, else obj from stack.
|
||||
const Address field(off, 0);
|
||||
__ access_store_at(T_FLOAT, IN_HEAP, field, noreg /* ftos */, noreg, noreg);
|
||||
__ access_store_at(T_FLOAT, IN_HEAP, field, noreg /* ftos */, noreg, noreg, noreg);
|
||||
if (rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_fputfield, bc, x11, true, byte_no);
|
||||
}
|
||||
|
@ -2830,7 +2830,7 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
|||
}
|
||||
__ add(off, obj, off); // if static, obj from cache, else obj from stack.
|
||||
const Address field(off, 0);
|
||||
__ access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos */, noreg, noreg);
|
||||
__ access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos */, noreg, noreg, noreg);
|
||||
if (rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_dputfield, bc, x11, true, byte_no);
|
||||
}
|
||||
|
@ -2967,28 +2967,28 @@ void TemplateTable::fast_storefield(TosState state)
|
|||
do_oop_store(_masm, field, x10, IN_HEAP);
|
||||
break;
|
||||
case Bytecodes::_fast_lputfield:
|
||||
__ access_store_at(T_LONG, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_LONG, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
break;
|
||||
case Bytecodes::_fast_iputfield:
|
||||
__ access_store_at(T_INT, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_INT, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
break;
|
||||
case Bytecodes::_fast_zputfield:
|
||||
__ access_store_at(T_BOOLEAN, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_BOOLEAN, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
break;
|
||||
case Bytecodes::_fast_bputfield:
|
||||
__ access_store_at(T_BYTE, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_BYTE, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
break;
|
||||
case Bytecodes::_fast_sputfield:
|
||||
__ access_store_at(T_SHORT, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_SHORT, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
break;
|
||||
case Bytecodes::_fast_cputfield:
|
||||
__ access_store_at(T_CHAR, IN_HEAP, field, x10, noreg, noreg);
|
||||
__ access_store_at(T_CHAR, IN_HEAP, field, x10, noreg, noreg, noreg);
|
||||
break;
|
||||
case Bytecodes::_fast_fputfield:
|
||||
__ access_store_at(T_FLOAT, IN_HEAP, field, noreg /* ftos */, noreg, noreg);
|
||||
__ access_store_at(T_FLOAT, IN_HEAP, field, noreg /* ftos */, noreg, noreg, noreg);
|
||||
break;
|
||||
case Bytecodes::_fast_dputfield:
|
||||
__ access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos */, noreg, noreg);
|
||||
__ access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos */, noreg, noreg, noreg);
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue