src/cpu/x86/vm/jniFastGetField_x86_64.cpp

changeset 9669
32bc598624bd
parent 8316
626f594dffa6
child 9703
2fdf635bcf28
equal deleted inserted replaced
9668:acb9351e3a29 9669:32bc598624bd
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;

mercurial