Mercurial > hg > truffle
comparison src/cpu/x86/vm/jniFastGetField_x86_64.cpp @ 304:dc7f315e41f7
5108146: Merge i486 and amd64 cpu directories
6459804: Want client (c1) compiler for x86_64 (amd64) for faster start-up
Reviewed-by: kvn
author | never |
---|---|
date | Wed, 27 Aug 2008 00:21:55 -0700 |
parents | a61af66fc99e |
children | 9ee9cf798b59 |
comparison
equal
deleted
inserted
replaced
303:fa4d1d240383 | 304:dc7f315e41f7 |
---|---|
65 | 65 |
66 Label slow; | 66 Label slow; |
67 | 67 |
68 ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr()); | 68 ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr()); |
69 __ mov32 (rcounter, counter); | 69 __ mov32 (rcounter, counter); |
70 __ movq (robj, c_rarg1); | 70 __ mov (robj, c_rarg1); |
71 __ testb (rcounter, 1); | 71 __ testb (rcounter, 1); |
72 __ jcc (Assembler::notZero, slow); | 72 __ jcc (Assembler::notZero, slow); |
73 if (os::is_MP()) { | 73 if (os::is_MP()) { |
74 __ xorq (robj, rcounter); | 74 __ xorptr(robj, rcounter); |
75 __ xorq (robj, rcounter); // obj, since | 75 __ xorptr(robj, rcounter); // obj, since |
76 // robj ^ rcounter ^ rcounter == robj | 76 // robj ^ rcounter ^ rcounter == robj |
77 // robj is data dependent on rcounter. | 77 // robj is data dependent on rcounter. |
78 } | 78 } |
79 __ movq (robj, Address(robj, 0)); // *obj | 79 __ movptr(robj, Address(robj, 0)); // *obj |
80 __ movq (roffset, c_rarg2); | 80 __ mov (roffset, c_rarg2); |
81 __ shrq (roffset, 2); // offset | 81 __ shrptr(roffset, 2); // offset |
82 | 82 |
83 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); | 83 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); |
84 speculative_load_pclist[count] = __ pc(); | 84 speculative_load_pclist[count] = __ pc(); |
85 switch (type) { | 85 switch (type) { |
86 case T_BOOLEAN: __ movzbl (rax, Address(robj, roffset, Address::times_1)); break; | 86 case T_BOOLEAN: __ movzbl (rax, Address(robj, roffset, Address::times_1)); break; |
93 } | 93 } |
94 | 94 |
95 if (os::is_MP()) { | 95 if (os::is_MP()) { |
96 __ lea(rcounter_addr, counter); | 96 __ lea(rcounter_addr, counter); |
97 // ca is data dependent on rax. | 97 // ca is data dependent on rax. |
98 __ xorq (rcounter_addr, rax); | 98 __ xorptr(rcounter_addr, rax); |
99 __ xorq (rcounter_addr, rax); | 99 __ xorptr(rcounter_addr, rax); |
100 __ cmpl (rcounter, Address(rcounter_addr, 0)); | 100 __ cmpl (rcounter, Address(rcounter_addr, 0)); |
101 } else { | 101 } else { |
102 __ cmp32 (rcounter, counter); | 102 __ cmp32 (rcounter, counter); |
103 } | 103 } |
104 __ jcc (Assembler::notEqual, slow); | 104 __ jcc (Assembler::notEqual, slow); |
163 | 163 |
164 Label slow; | 164 Label slow; |
165 | 165 |
166 ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr()); | 166 ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr()); |
167 __ mov32 (rcounter, counter); | 167 __ mov32 (rcounter, counter); |
168 __ movq (robj, c_rarg1); | 168 __ mov (robj, c_rarg1); |
169 __ testb (rcounter, 1); | 169 __ testb (rcounter, 1); |
170 __ jcc (Assembler::notZero, slow); | 170 __ jcc (Assembler::notZero, slow); |
171 if (os::is_MP()) { | 171 if (os::is_MP()) { |
172 __ xorq (robj, rcounter); | 172 __ xorptr(robj, rcounter); |
173 __ xorq (robj, rcounter); // obj, since | 173 __ xorptr(robj, rcounter); // obj, since |
174 // robj ^ rcounter ^ rcounter == robj | 174 // robj ^ rcounter ^ rcounter == robj |
175 // robj is data dependent on rcounter. | 175 // robj is data dependent on rcounter. |
176 } | 176 } |
177 __ movq (robj, Address(robj, 0)); // *obj | 177 __ movptr(robj, Address(robj, 0)); // *obj |
178 __ movq (roffset, c_rarg2); | 178 __ mov (roffset, c_rarg2); |
179 __ shrq (roffset, 2); // offset | 179 __ shrptr(roffset, 2); // offset |
180 | 180 |
181 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); | 181 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); |
182 speculative_load_pclist[count] = __ pc(); | 182 speculative_load_pclist[count] = __ pc(); |
183 switch (type) { | 183 switch (type) { |
184 case T_FLOAT: __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break; | 184 case T_FLOAT: __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break; |
188 | 188 |
189 if (os::is_MP()) { | 189 if (os::is_MP()) { |
190 __ lea(rcounter_addr, counter); | 190 __ lea(rcounter_addr, counter); |
191 __ movdq (rax, xmm0); | 191 __ movdq (rax, xmm0); |
192 // counter address is data dependent on xmm0. | 192 // counter address is data dependent on xmm0. |
193 __ xorq (rcounter_addr, rax); | 193 __ xorptr(rcounter_addr, rax); |
194 __ xorq (rcounter_addr, rax); | 194 __ xorptr(rcounter_addr, rax); |
195 __ cmpl (rcounter, Address(rcounter_addr, 0)); | 195 __ cmpl (rcounter, Address(rcounter_addr, 0)); |
196 } else { | 196 } else { |
197 __ cmp32 (rcounter, counter); | 197 __ cmp32 (rcounter, counter); |
198 } | 198 } |
199 __ jcc (Assembler::notEqual, slow); | 199 __ jcc (Assembler::notEqual, slow); |