src/share/vm/c1/c1_LIRGenerator.cpp

changeset 3709
0105f367a14c
parent 3592
701a83c86f28
child 3787
6759698e3140
equal deleted inserted replaced
3708:c263e0e9f14b 3709:0105f367a14c
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

mercurial