hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
changeset 12377 ae6def2813e0
parent 11886 feebf5c9f40c
child 12739 09f26b73ae66
equal deleted inserted replaced
12376:714c569bbff0 12377:ae6def2813e0
     1 /*
     1 /*
     2  * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
  2877 
  2877 
  2878   __ cmp(lir_cond(x->cond()), left.result(), right.result());
  2878   __ cmp(lir_cond(x->cond()), left.result(), right.result());
  2879   __ cmove(lir_cond(x->cond()), t_val.result(), f_val.result(), reg, as_BasicType(x->x()->type()));
  2879   __ cmove(lir_cond(x->cond()), t_val.result(), f_val.result(), reg, as_BasicType(x->x()->type()));
  2880 }
  2880 }
  2881 
  2881 
       
  2882 void LIRGenerator::do_RuntimeCall(address routine, int expected_arguments, Intrinsic* x) {
       
  2883     assert(x->number_of_arguments() == expected_arguments, "wrong type");
       
  2884     LIR_Opr reg = result_register_for(x->type());
       
  2885     __ call_runtime_leaf(routine, getThreadTemp(),
       
  2886                          reg, new LIR_OprList());
       
  2887     LIR_Opr result = rlock_result(x);
       
  2888     __ move(reg, result);
       
  2889 }
       
  2890 
       
  2891 #ifdef TRACE_HAVE_INTRINSICS
       
  2892 void LIRGenerator::do_ThreadIDIntrinsic(Intrinsic* x) {
       
  2893     LIR_Opr thread = getThreadPointer();
       
  2894     LIR_Opr osthread = new_pointer_register();
       
  2895     __ move(new LIR_Address(thread, in_bytes(JavaThread::osthread_offset()), osthread->type()), osthread);
       
  2896     size_t thread_id_size = OSThread::thread_id_size();
       
  2897     if (thread_id_size == (size_t) BytesPerLong) {
       
  2898       LIR_Opr id = new_register(T_LONG);
       
  2899       __ move(new LIR_Address(osthread, in_bytes(OSThread::thread_id_offset()), T_LONG), id);
       
  2900       __ convert(Bytecodes::_l2i, id, rlock_result(x));
       
  2901     } else if (thread_id_size == (size_t) BytesPerInt) {
       
  2902       __ move(new LIR_Address(osthread, in_bytes(OSThread::thread_id_offset()), T_INT), rlock_result(x));
       
  2903     } else {
       
  2904       ShouldNotReachHere();
       
  2905     }
       
  2906 }
       
  2907 
       
  2908 void LIRGenerator::do_ClassIDIntrinsic(Intrinsic* x) {
       
  2909     CodeEmitInfo* info = state_for(x);
       
  2910     CodeEmitInfo* info2 = new CodeEmitInfo(info); // Clone for the second null check
       
  2911     assert(info != NULL, "must have info");
       
  2912     LIRItem arg(x->argument_at(1), this);
       
  2913     arg.load_item();
       
  2914     LIR_Opr klass = new_register(T_OBJECT);
       
  2915     __ move(new LIR_Address(arg.result(), java_lang_Class::klass_offset_in_bytes(), T_OBJECT), klass, info);
       
  2916     LIR_Opr id = new_register(T_LONG);
       
  2917     ByteSize offset = TRACE_ID_OFFSET;
       
  2918     LIR_Address* trace_id_addr = new LIR_Address(klass, in_bytes(offset), T_LONG);
       
  2919     __ move(trace_id_addr, id);
       
  2920     __ logical_or(id, LIR_OprFact::longConst(0x01l), id);
       
  2921     __ store(id, trace_id_addr);
       
  2922     __ logical_and(id, LIR_OprFact::longConst(~0x3l), id);
       
  2923     __ move(id, rlock_result(x));
       
  2924 }
       
  2925 #endif
  2882 
  2926 
  2883 void LIRGenerator::do_Intrinsic(Intrinsic* x) {
  2927 void LIRGenerator::do_Intrinsic(Intrinsic* x) {
  2884   switch (x->id()) {
  2928   switch (x->id()) {
  2885   case vmIntrinsics::_intBitsToFloat      :
  2929   case vmIntrinsics::_intBitsToFloat      :
  2886   case vmIntrinsics::_doubleToRawLongBits :
  2930   case vmIntrinsics::_doubleToRawLongBits :
  2888   case vmIntrinsics::_floatToRawIntBits   : {
  2932   case vmIntrinsics::_floatToRawIntBits   : {
  2889     do_FPIntrinsics(x);
  2933     do_FPIntrinsics(x);
  2890     break;
  2934     break;
  2891   }
  2935   }
  2892 
  2936 
  2893   case vmIntrinsics::_currentTimeMillis: {
  2937 #ifdef TRACE_HAVE_INTRINSICS
  2894     assert(x->number_of_arguments() == 0, "wrong type");
  2938   case vmIntrinsics::_threadID: do_ThreadIDIntrinsic(x); break;
  2895     LIR_Opr reg = result_register_for(x->type());
  2939   case vmIntrinsics::_classID: do_ClassIDIntrinsic(x); break;
  2896     __ call_runtime_leaf(CAST_FROM_FN_PTR(address, os::javaTimeMillis), getThreadTemp(),
  2940   case vmIntrinsics::_counterTime:
  2897                          reg, new LIR_OprList());
  2941     do_RuntimeCall(CAST_FROM_FN_PTR(address, TRACE_TIME_METHOD), 0, x);
  2898     LIR_Opr result = rlock_result(x);
       
  2899     __ move(reg, result);
       
  2900     break;
  2942     break;
  2901   }
  2943 #endif
  2902 
  2944 
  2903   case vmIntrinsics::_nanoTime: {
  2945   case vmIntrinsics::_currentTimeMillis:
  2904     assert(x->number_of_arguments() == 0, "wrong type");
  2946     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeMillis), 0, x);
  2905     LIR_Opr reg = result_register_for(x->type());
       
  2906     __ call_runtime_leaf(CAST_FROM_FN_PTR(address, os::javaTimeNanos), getThreadTemp(),
       
  2907                          reg, new LIR_OprList());
       
  2908     LIR_Opr result = rlock_result(x);
       
  2909     __ move(reg, result);
       
  2910     break;
  2947     break;
  2911   }
  2948 
       
  2949   case vmIntrinsics::_nanoTime:
       
  2950     do_RuntimeCall(CAST_FROM_FN_PTR(address, os::javaTimeNanos), 0, x);
       
  2951     break;
  2912 
  2952 
  2913   case vmIntrinsics::_Object_init:    do_RegisterFinalizer(x); break;
  2953   case vmIntrinsics::_Object_init:    do_RegisterFinalizer(x); break;
  2914   case vmIntrinsics::_getClass:       do_getClass(x);      break;
  2954   case vmIntrinsics::_getClass:       do_getClass(x);      break;
  2915   case vmIntrinsics::_currentThread:  do_currentThread(x); break;
  2955   case vmIntrinsics::_currentThread:  do_currentThread(x); break;
  2916 
  2956