< prev index next >

src/hotspot/share/c1/c1_LIR.cpp

Print this page

*** 1,7 **** /* ! * Copyright (c) 2000, 2017, Oracle and/or its affiliates. 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2000, 2019, Oracle and/or its affiliates. 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 365,374 **** --- 365,386 ---- } else { ShouldNotReachHere(); } } + LIR_OpFlattenedStoreCheck::LIR_OpFlattenedStoreCheck(LIR_Opr object, ciKlass* element_klass, + LIR_Opr tmp1, LIR_Opr tmp2, + CodeEmitInfo* info_for_exception) + : LIR_Op(lir_flattened_store_check, LIR_OprFact::illegalOpr, NULL) + , _object(object) + , _element_klass(element_klass) + , _tmp1(tmp1) + , _tmp2(tmp2) + , _info_for_exception(info_for_exception) + { + _stub = new ArrayStoreExceptionStub(object, info_for_exception); + } LIR_OpArrayCopy::LIR_OpArrayCopy(LIR_Opr src, LIR_Opr src_pos, LIR_Opr dst, LIR_Opr dst_pos, LIR_Opr length, LIR_Opr tmp, ciArrayKlass* expected_type, int flags, CodeEmitInfo* info) : LIR_Op(lir_arraycopy, LIR_OprFact::illegalOpr, info) , _src(src)
*** 856,865 **** --- 868,890 ---- if (opTypeCheck->_result->is_valid()) do_output(opTypeCheck->_result); do_stub(opTypeCheck->_stub); break; } + // LIR_OpFlattenedStoreCheck + case lir_flattened_store_check: { + assert(op->as_OpFlattenedStoreCheck() != NULL, "must be"); + LIR_OpFlattenedStoreCheck* opFlattenedStoreCheck = (LIR_OpFlattenedStoreCheck*)op; + + if (opFlattenedStoreCheck->_info_for_exception) do_info(opFlattenedStoreCheck->_info_for_exception); + if (opFlattenedStoreCheck->_object->is_valid()) do_temp(opFlattenedStoreCheck->_object); + if (opFlattenedStoreCheck->_tmp1->is_valid()) do_temp(opFlattenedStoreCheck->_tmp1); + if (opFlattenedStoreCheck->_tmp2->is_valid()) do_temp(opFlattenedStoreCheck->_tmp2); + do_stub(opFlattenedStoreCheck->_stub); + break; + } + // LIR_OpCompareAndSwap case lir_cas_long: case lir_cas_obj: case lir_cas_int: { assert(op->as_OpCompareAndSwap() != NULL, "must be");
*** 1043,1052 **** --- 1068,1084 ---- if (stub()) { masm->append_code_stub(stub()); } } + void LIR_OpFlattenedStoreCheck::emit_code(LIR_Assembler* masm) { + masm->emit_opFlattenedStoreCheck(this); + if (stub()) { + masm->append_code_stub(stub()); + } + } + void LIR_OpCompareAndSwap::emit_code(LIR_Assembler* masm) { masm->emit_compare_and_swap(this); } void LIR_Op3::emit_code(LIR_Assembler* masm) {
*** 1442,1451 **** --- 1474,1490 ---- // Emit an implicit null check append(new LIR_Op1(lir_null_check, opr, info)); } } + void LIR_List::flattened_store_check(LIR_Opr object, ciKlass* element_klass, + LIR_Opr tmp1, LIR_Opr tmp2, + CodeEmitInfo* info_for_exception) { + LIR_OpFlattenedStoreCheck* c = new LIR_OpFlattenedStoreCheck(object, element_klass, tmp1, tmp2, info_for_exception); + append(c); + } + void LIR_List::cas_long(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value, LIR_Opr t1, LIR_Opr t2, LIR_Opr result) { append(new LIR_OpCompareAndSwap(lir_cas_long, addr, cmp_value, new_value, t1, t2, result)); }
*** 1734,1743 **** --- 1773,1784 ---- case lir_delay_slot: s = "delay"; break; // LIR_OpTypeCheck case lir_instanceof: s = "instanceof"; break; case lir_checkcast: s = "checkcast"; break; case lir_store_check: s = "store_check"; break; + // LIR_OpFlattenedStoreCheck + case lir_flattened_store_check: s = "flattened_store_check"; break; // LIR_OpCompareAndSwap case lir_cas_long: s = "cas_long"; break; case lir_cas_obj: s = "cas_obj"; break; case lir_cas_int: s = "cas_int"; break; // LIR_OpProfileCall
*** 1979,1988 **** --- 2020,2037 ---- tmp3()->print(out); out->print(" "); result_opr()->print(out); out->print(" "); if (info_for_exception() != NULL) out->print(" [bci:%d]", info_for_exception()->stack()->bci()); } + void LIR_OpFlattenedStoreCheck::print_instr(outputStream* out) const { + object()->print(out); out->print(" "); + element_klass()->print_name_on(out); out->print(" "); + tmp1()->print(out); out->print(" "); + tmp2()->print(out); out->print(" "); + if (info_for_exception() != NULL) out->print(" [bci:%d]", info_for_exception()->stack()->bci()); + } + // LIR_Op3 void LIR_Op3::print_instr(outputStream* out) const { in_opr1()->print(out); out->print(" "); in_opr2()->print(out); out->print(" ");
< prev index next >