c1_LIRGenerator_x86.cpp revision 953
1879N/A# include "incls/_c1_LIRGenerator_x86.cpp.incl"
1879N/A if (r->is_constant()) {
0N/A case doubleTag: opr = UseSSE >= 2 ? FrameMap::xmm0_double_opr : FrameMap::fpu0_double_opr; break;
0N/A case addressTag:
0N/A if (needs_card_mark) {
0N/Avoid LIRGenerator::cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info) {
0N/Avoid LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr base, int disp, BasicType type, CodeEmitInfo* info) {
0N/Avoid LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr base, LIR_Opr disp, BasicType type, CodeEmitInfo* info) {
0N/A bool needs_range_check = true;
0N/A if (use_length) {
0N/A if (needs_range_check) {
0N/A if (needs_store_check) {
0N/A set_no_result(x);
0N/A if (x->needs_null_check()) {
0N/A LIR_Address* array_addr = emit_array_address(array.result(), index.result(), x->elt_type(), obj_store);
0N/A if (use_length) {
0N/A set_no_result(x);
0N/A if (UseBiasedLocking) {
0N/A if (x->needs_null_check()) {
0N/A set_no_result(x);
0N/A bool must_load_right = false;
0N/A if (must_load_both) {
0N/A if ((UseSSE >= 1 && x->op() == Bytecodes::_frem) || (UseSSE >= 2 && x->op() == Bytecodes::_drem)) {
0N/A // special handling for frem and drem: no SSE instruction, so must use FPU with temporary fpu stack slots
0N/A rlock_result(x);
0N/A if (!ImplicitDiv0Checks) {
0N/A bool use_constant = false;
0N/A use_constant = true;
0N/A use_constant = true;
0N/A if (use_constant) {
0N/A rlock_result(x);
0N/A rlock_result(x);
0N/A if (x->is_commutative() && x->y()->as_Constant() == NULL && x->x()->use_count() > x->y()->use_count()) {
0N/A x->swap_operands();
0N/A if (must_load_count) {
0N/A if (x->is_commutative() && x->y()->as_Constant() == NULL && x->x()->use_count() > x->y()->use_count()) {
0N/A x->swap_operands();
0N/A __ fcmp2int(left.result(), right.result(), reg, (code == Bytecodes::_fcmpl || code == Bytecodes::_dcmpl));
0N/A LIRItem new_value (x->argument_at(2), this); // replace field with new_value if it matches cmp_value
0N/A default: ShouldNotReachHere();
0N/A set_no_result(x);
0N/A __ arraycopy(src.result(), src_pos.result(), dst.result(), dst_pos.result(), length.result(), tmp, expected_type, flags, info); // does add_safepoint
0N/A case Bytecodes::_i2s: fixed_input = false; fixed_result = false; round_result = false; needs_stub = false; break;
0N/A case Bytecodes::_f2d: fixed_input = UseSSE == 1; fixed_result = false; round_result = false; needs_stub = false; break;
0N/A case Bytecodes::_d2f: fixed_input = false; fixed_result = UseSSE == 1; round_result = UseSSE < 1; needs_stub = false; break;
0N/A case Bytecodes::_i2f: fixed_input = false; fixed_result = false; round_result = UseSSE < 1; needs_stub = false; break;
1142N/A case Bytecodes::_i2d: fixed_input = false; fixed_result = false; round_result = false; needs_stub = false; break;
0N/A case Bytecodes::_f2i: fixed_input = false; fixed_result = false; round_result = false; needs_stub = true; break;
0N/A case Bytecodes::_d2i: fixed_input = false; fixed_result = false; round_result = false; needs_stub = true; break;
0N/A case Bytecodes::_l2f: fixed_input = false; fixed_result = UseSSE >= 1; round_result = UseSSE < 1; needs_stub = false; break;
0N/A case Bytecodes::_l2d: fixed_input = false; fixed_result = UseSSE >= 2; round_result = UseSSE < 2; needs_stub = false; break;
0N/A case Bytecodes::_f2l: fixed_input = true; fixed_result = true; round_result = false; needs_stub = false; break;
0N/A case Bytecodes::_d2l: fixed_input = true; fixed_result = true; round_result = false; needs_stub = false; break;
0N/A default: ShouldNotReachHere();
0N/A if (fixed_input) {
0N/A if (fixed_result) {
0N/A } else if (round_result) {
0N/A if (needs_stub) {
0N/A // in case of patching (i.e., object class is not yet loaded), we need to reexecute the instruction
0N/A if (x->is_incompatible_class_change_check()) {
0N/A stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
0N/A stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
0N/A if (tag == longTag && yin->is_constant() && yin->get_jlong_constant() == 0 && (cond == If::eql || cond == If::neq)) {
0N/A if (x->is_safepoint()) {
0N/A set_no_result(x);