1 /* |
1 /* |
2 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2004, 2017, 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. |
74 __ mov (robj, c_rarg1); |
74 __ mov (robj, c_rarg1); |
75 __ testb (rcounter, 1); |
75 __ testb (rcounter, 1); |
76 __ jcc (Assembler::notZero, slow); |
76 __ jcc (Assembler::notZero, slow); |
77 if (os::is_MP()) { |
77 if (os::is_MP()) { |
78 __ xorptr(robj, rcounter); |
78 __ xorptr(robj, rcounter); |
79 __ xorptr(robj, rcounter); // obj, since |
79 __ xorptr(robj, rcounter); // obj, since |
80 // robj ^ rcounter ^ rcounter == robj |
80 // robj ^ rcounter ^ rcounter == robj |
81 // robj is data dependent on rcounter. |
81 // robj is data dependent on rcounter. |
82 } |
82 } |
83 __ movptr(robj, Address(robj, 0)); // *obj |
83 |
|
84 __ clear_jweak_tag(robj); |
|
85 |
|
86 __ movptr(robj, Address(robj, 0)); // *obj |
84 __ mov (roffset, c_rarg2); |
87 __ mov (roffset, c_rarg2); |
85 __ shrptr(roffset, 2); // offset |
88 __ shrptr(roffset, 2); // offset |
86 |
89 |
87 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); |
90 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); |
88 speculative_load_pclist[count] = __ pc(); |
91 speculative_load_pclist[count] = __ pc(); |
89 switch (type) { |
92 switch (type) { |
90 case T_BOOLEAN: __ movzbl (rax, Address(robj, roffset, Address::times_1)); break; |
93 case T_BOOLEAN: __ movzbl (rax, Address(robj, roffset, Address::times_1)); break; |
172 __ mov (robj, c_rarg1); |
175 __ mov (robj, c_rarg1); |
173 __ testb (rcounter, 1); |
176 __ testb (rcounter, 1); |
174 __ jcc (Assembler::notZero, slow); |
177 __ jcc (Assembler::notZero, slow); |
175 if (os::is_MP()) { |
178 if (os::is_MP()) { |
176 __ xorptr(robj, rcounter); |
179 __ xorptr(robj, rcounter); |
177 __ xorptr(robj, rcounter); // obj, since |
180 __ xorptr(robj, rcounter); // obj, since |
178 // robj ^ rcounter ^ rcounter == robj |
181 // robj ^ rcounter ^ rcounter == robj |
179 // robj is data dependent on rcounter. |
182 // robj is data dependent on rcounter. |
180 } |
183 } |
181 __ movptr(robj, Address(robj, 0)); // *obj |
184 |
|
185 __ clear_jweak_tag(robj); |
|
186 |
|
187 __ movptr(robj, Address(robj, 0)); // *obj |
182 __ mov (roffset, c_rarg2); |
188 __ mov (roffset, c_rarg2); |
183 __ shrptr(roffset, 2); // offset |
189 __ shrptr(roffset, 2); // offset |
184 |
190 |
185 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); |
191 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); |
186 speculative_load_pclist[count] = __ pc(); |
192 speculative_load_pclist[count] = __ pc(); |
187 switch (type) { |
193 switch (type) { |
188 case T_FLOAT: __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break; |
194 case T_FLOAT: __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break; |