annotate src/share/vm/shark/sharkIntrinsics.cpp @ 1843:0715f0cf171d

Merge
author jcoomes
date Fri, 08 Oct 2010 09:29:09 -0700
parents d2ede61b7a12
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1 /*
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
2 * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
3 * Copyright 2009 Red Hat, Inc.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
5 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
8 * published by the Free Software Foundation.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
9 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
14 * accompanied this code).
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
15 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
19 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
22 * questions.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
23 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
24 */
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
25
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
26 #include "incls/_precompiled.incl"
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
27 #include "incls/_sharkIntrinsics.cpp.incl"
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
28
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
29 using namespace llvm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
30
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
31 bool SharkIntrinsics::is_intrinsic(ciMethod *target) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
32 switch (target->intrinsic_id()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
33 case vmIntrinsics::_none:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
34 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
35
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
36 // java.lang.Math
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
37 case vmIntrinsics::_min:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
38 case vmIntrinsics::_max:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
39 case vmIntrinsics::_dabs:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
40 case vmIntrinsics::_dsin:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
41 case vmIntrinsics::_dcos:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
42 case vmIntrinsics::_dtan:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
43 case vmIntrinsics::_datan2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
44 case vmIntrinsics::_dsqrt:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
45 case vmIntrinsics::_dlog:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46 case vmIntrinsics::_dlog10:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 case vmIntrinsics::_dpow:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48 case vmIntrinsics::_dexp:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51 // java.lang.Object
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 case vmIntrinsics::_getClass:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55 // java.lang.System
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56 case vmIntrinsics::_currentTimeMillis:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 // java.lang.Thread
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 case vmIntrinsics::_currentThread:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63 // sun.misc.Unsafe
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64 case vmIntrinsics::_compareAndSwapInt:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65 return true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 if (SharkPerformanceWarnings) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69 warning(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70 "unhandled intrinsic vmIntrinsic::%s",
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71 vmIntrinsics::name_at(target->intrinsic_id()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74 return false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 void SharkIntrinsics::inline_intrinsic(ciMethod *target, SharkState *state) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 SharkIntrinsics intrinsic(state, target);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79 intrinsic.do_intrinsic();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 void SharkIntrinsics::do_intrinsic() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 switch (target()->intrinsic_id()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84 // java.lang.Math
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 case vmIntrinsics::_min:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 do_Math_minmax(llvm::ICmpInst::ICMP_SLE);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88 case vmIntrinsics::_max:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 do_Math_minmax(llvm::ICmpInst::ICMP_SGE);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91 case vmIntrinsics::_dabs:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 do_Math_1to1(builder()->fabs());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94 case vmIntrinsics::_dsin:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 do_Math_1to1(builder()->sin());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 case vmIntrinsics::_dcos:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 do_Math_1to1(builder()->cos());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100 case vmIntrinsics::_dtan:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 do_Math_1to1(builder()->tan());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 case vmIntrinsics::_datan2:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104 do_Math_2to1(builder()->atan2());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106 case vmIntrinsics::_dsqrt:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107 do_Math_1to1(builder()->sqrt());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109 case vmIntrinsics::_dlog:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110 do_Math_1to1(builder()->log());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112 case vmIntrinsics::_dlog10:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 do_Math_1to1(builder()->log10());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115 case vmIntrinsics::_dpow:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 do_Math_2to1(builder()->pow());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 case vmIntrinsics::_dexp:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 do_Math_1to1(builder()->exp());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122 // java.lang.Object
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123 case vmIntrinsics::_getClass:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 do_Object_getClass();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127 // java.lang.System
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 case vmIntrinsics::_currentTimeMillis:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 do_System_currentTimeMillis();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132 // java.lang.Thread
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 case vmIntrinsics::_currentThread:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134 do_Thread_currentThread();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 // sun.misc.Unsafe
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 case vmIntrinsics::_compareAndSwapInt:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139 do_Unsafe_compareAndSwapInt();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142 default:
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143 ShouldNotReachHere();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 void SharkIntrinsics::do_Math_minmax(ICmpInst::Predicate p) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 // Pop the arguments
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 SharkValue *sb = state()->pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 SharkValue *sa = state()->pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151 Value *a = sa->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152 Value *b = sb->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 // Perform the test
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 BasicBlock *ip = builder()->GetBlockInsertionPoint();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 BasicBlock *return_a = builder()->CreateBlock(ip, "return_a");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157 BasicBlock *return_b = builder()->CreateBlock(ip, "return_b");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 BasicBlock *done = builder()->CreateBlock(ip, "done");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160 builder()->CreateCondBr(builder()->CreateICmp(p, a, b), return_a, return_b);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 builder()->SetInsertPoint(return_a);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 builder()->CreateBr(done);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165 builder()->SetInsertPoint(return_b);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 builder()->CreateBr(done);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168 builder()->SetInsertPoint(done);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 PHINode *phi = builder()->CreatePHI(a->getType(), "result");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 phi->addIncoming(a, return_a);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171 phi->addIncoming(b, return_b);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 // Push the result
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 state()->push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175 SharkValue::create_jint(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 phi,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177 sa->zero_checked() && sb->zero_checked()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 void SharkIntrinsics::do_Math_1to1(Value *function) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 SharkValue *empty = state()->pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182 assert(empty == NULL, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 state()->push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 SharkValue::create_jdouble(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185 builder()->CreateCall(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186 function, state()->pop()->jdouble_value())));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 state()->push(NULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 void SharkIntrinsics::do_Math_2to1(Value *function) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 SharkValue *empty = state()->pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 assert(empty == NULL, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193 Value *y = state()->pop()->jdouble_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 empty = state()->pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 assert(empty == NULL, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196 Value *x = state()->pop()->jdouble_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 state()->push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 SharkValue::create_jdouble(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200 builder()->CreateCall2(function, x, y)));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201 state()->push(NULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 void SharkIntrinsics::do_Object_getClass() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205 Value *klass = builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 state()->pop()->jobject_value(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207 in_ByteSize(oopDesc::klass_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209 "klass");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 Value *klass_part = builder()->CreateAddressOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212 klass,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 in_ByteSize(klassOopDesc::klass_part_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214 SharkType::klass_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 "klass_part");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217 state()->push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218 SharkValue::create_jobject(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 klass_part,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221 in_ByteSize(Klass::java_mirror_offset_in_bytes()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 "java_mirror"),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 true));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 void SharkIntrinsics::do_System_currentTimeMillis() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228 state()->push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 SharkValue::create_jlong(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 builder()->CreateCall(builder()->current_time_millis()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
232 state()->push(NULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
233 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
234
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 void SharkIntrinsics::do_Thread_currentThread() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236 state()->push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 SharkValue::create_jobject(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238 builder()->CreateValueOfStructEntry(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239 thread(), JavaThread::threadObj_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 SharkType::oop_type(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241 "threadObj"),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242 true));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 void SharkIntrinsics::do_Unsafe_compareAndSwapInt() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246 // Pop the arguments
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 Value *x = state()->pop()->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 Value *e = state()->pop()->jint_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 SharkValue *empty = state()->pop();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250 assert(empty == NULL, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 Value *offset = state()->pop()->jlong_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 Value *object = state()->pop()->jobject_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 Value *unsafe = state()->pop()->jobject_value();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255 // Convert the offset
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 offset = builder()->CreateCall(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 builder()->unsafe_field_offset_to_byte_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 offset);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
260 // Locate the field
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
261 Value *addr = builder()->CreateIntToPtr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
262 builder()->CreateAdd(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
263 builder()->CreatePtrToInt(object, SharkType::intptr_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
264 builder()->CreateIntCast(offset, SharkType::intptr_type(), true)),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
265 PointerType::getUnqual(SharkType::jint_type()),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
266 "addr");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
267
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
268 // Perform the operation
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
269 Value *result = builder()->CreateCmpxchgInt(x, addr, e);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
270
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
271 // Push the result
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
272 state()->push(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
273 SharkValue::create_jint(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
274 builder()->CreateIntCast(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
275 builder()->CreateICmpEQ(result, e), SharkType::jint_type(), true),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
276 false));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
277 }