< prev index next >
src/cpu/s390/vm/c1_LIRGenerator_s390.cpp
Print this page
*** 1,8 ****
/*
! * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2016 SAP SE. 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,8 ----
/*
! * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2016, 2017, SAP SE. 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.
*** 59,82 ****
} else {
load_item();
}
}
- inline void load_int_as_long(LIR_List *ll, LIRItem &li, LIR_Opr dst) {
- LIR_Opr r = li.value()->operand();
- if (r->is_constant()) {
- // Constants get loaded with sign extend on this platform.
- ll->move(li.result(), dst);
- } else {
- if (!r->is_register()) {
- li.load_item_force(dst);
- }
- LIR_Opr dst_l = FrameMap::as_long_opr(dst->as_register());
- ll->convert(Bytecodes::_i2l, li.result(), dst_l); // Convert.
- }
- }
-
//--------------------------------------------------------------
// LIRGenerator
//--------------------------------------------------------------
LIR_Opr LIRGenerator::exceptionOopOpr() { return FrameMap::as_oop_opr(Z_EXC_OOP); }
--- 59,68 ----
*** 1215,1228 ****
LIR_Opr arg1 = cc->at(0);
LIR_Opr arg2 = cc->at(1);
LIR_Opr arg3 = cc->at(2);
- // CCallingConventionRequiresIntsAsLongs
crc.load_item_force(arg1); // We skip int->long conversion here, because CRC32 stub doesn't care about high bits.
__ leal(LIR_OprFact::address(a), arg2);
! load_int_as_long(gen()->lir(), len, arg3);
__ call_runtime_leaf(StubRoutines::updateBytesCRC32(), LIR_OprFact::illegalOpr, result_reg, cc->args());
__ move(result_reg, result);
break;
}
--- 1201,1213 ----
LIR_Opr arg1 = cc->at(0);
LIR_Opr arg2 = cc->at(1);
LIR_Opr arg3 = cc->at(2);
crc.load_item_force(arg1); // We skip int->long conversion here, because CRC32 stub doesn't care about high bits.
__ leal(LIR_OprFact::address(a), arg2);
! len.load_item_force(arg3); // We skip int->long conversion here, because CRC32 stub expects int.
__ call_runtime_leaf(StubRoutines::updateBytesCRC32(), LIR_OprFact::illegalOpr, result_reg, cc->args());
__ move(result_reg, result);
break;
}
*** 1231,1241 ****
}
}
}
void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
! Unimplemented();
}
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
assert(x->number_of_arguments() == 3, "wrong type");
assert(UseFMA, "Needs FMA instructions support.");
--- 1216,1279 ----
}
}
}
void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
! assert(UseCRC32CIntrinsics, "or should not be here");
! LIR_Opr result = rlock_result(x);
!
! switch (x->id()) {
! case vmIntrinsics::_updateBytesCRC32C:
! case vmIntrinsics::_updateDirectByteBufferCRC32C: {
! bool is_updateBytes = (x->id() == vmIntrinsics::_updateBytesCRC32C);
!
! LIRItem crc(x->argument_at(0), this);
! LIRItem buf(x->argument_at(1), this);
! LIRItem off(x->argument_at(2), this);
! LIRItem len(x->argument_at(3), this);
! buf.load_item();
! off.load_nonconstant();
!
! LIR_Opr index = off.result();
! int offset = is_updateBytes ? arrayOopDesc::base_offset_in_bytes(T_BYTE) : 0;
! if (off.result()->is_constant()) {
! index = LIR_OprFact::illegalOpr;
! offset += off.result()->as_jint();
! }
! LIR_Opr base_op = buf.result();
!
! if (index->is_valid()) {
! LIR_Opr tmp = new_register(T_LONG);
! __ convert(Bytecodes::_i2l, index, tmp);
! index = tmp;
! }
!
! LIR_Address* a = new LIR_Address(base_op, index, offset, T_BYTE);
!
! BasicTypeList signature(3);
! signature.append(T_INT);
! signature.append(T_ADDRESS);
! signature.append(T_INT);
! CallingConvention* cc = frame_map()->c_calling_convention(&signature);
! const LIR_Opr result_reg = result_register_for (x->type());
!
! LIR_Opr arg1 = cc->at(0);
! LIR_Opr arg2 = cc->at(1);
! LIR_Opr arg3 = cc->at(2);
!
! crc.load_item_force(arg1); // We skip int->long conversion here, because CRC32C stub doesn't care about high bits.
! __ leal(LIR_OprFact::address(a), arg2);
! len.load_item_force(arg3); // We skip int->long conversion here, because CRC32C stub expects int.
!
! __ call_runtime_leaf(StubRoutines::updateBytesCRC32C(), LIR_OprFact::illegalOpr, result_reg, cc->args());
! __ move(result_reg, result);
! break;
! }
! default: {
! ShouldNotReachHere();
! }
! }
}
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
assert(x->number_of_arguments() == 3, "wrong type");
assert(UseFMA, "Needs FMA instructions support.");
*** 1262,1267 ****
}
void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
fatal("vectorizedMismatch intrinsic is not implemented on this platform");
}
-
--- 1300,1304 ----
< prev index next >