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 |