64 ResourceMark rm;
65 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
66 CodeBuffer cbuf(blob);
67 MacroAssembler* masm = new MacroAssembler(&cbuf);
68 address fast_entry = __ pc();
69
70 Label slow;
71
72 ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr());
73 __ mov32 (rcounter, counter);
74 __ mov (robj, c_rarg1);
75 __ testb (rcounter, 1);
76 __ jcc (Assembler::notZero, slow);
77 if (os::is_MP()) {
78 __ xorptr(robj, rcounter);
79 __ xorptr(robj, rcounter); // obj, since
80 // robj ^ rcounter ^ rcounter == robj
81 // robj is data dependent on rcounter.
82 }
83
84 __ clear_jweak_tag(robj);
85
86 __ movptr(robj, Address(robj, 0)); // *obj
87 __ mov (roffset, c_rarg2);
88 __ shrptr(roffset, 2); // offset
89
90 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
91 speculative_load_pclist[count] = __ pc();
92 switch (type) {
93 case T_BOOLEAN: __ movzbl (rax, Address(robj, roffset, Address::times_1)); break;
94 case T_BYTE: __ movsbl (rax, Address(robj, roffset, Address::times_1)); break;
95 case T_CHAR: __ movzwl (rax, Address(robj, roffset, Address::times_1)); break;
96 case T_SHORT: __ movswl (rax, Address(robj, roffset, Address::times_1)); break;
97 case T_INT: __ movl (rax, Address(robj, roffset, Address::times_1)); break;
98 case T_LONG: __ movq (rax, Address(robj, roffset, Address::times_1)); break;
99 default: ShouldNotReachHere();
100 }
101
102 if (os::is_MP()) {
103 __ lea(rcounter_addr, counter);
104 // ca is data dependent on rax.
165 ResourceMark rm;
166 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
167 CodeBuffer cbuf(blob);
168 MacroAssembler* masm = new MacroAssembler(&cbuf);
169 address fast_entry = __ pc();
170
171 Label slow;
172
173 ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr());
174 __ mov32 (rcounter, counter);
175 __ mov (robj, c_rarg1);
176 __ testb (rcounter, 1);
177 __ jcc (Assembler::notZero, slow);
178 if (os::is_MP()) {
179 __ xorptr(robj, rcounter);
180 __ xorptr(robj, rcounter); // obj, since
181 // robj ^ rcounter ^ rcounter == robj
182 // robj is data dependent on rcounter.
183 }
184
185 __ clear_jweak_tag(robj);
186
187 __ movptr(robj, Address(robj, 0)); // *obj
188 __ mov (roffset, c_rarg2);
189 __ shrptr(roffset, 2); // offset
190
191 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
192 speculative_load_pclist[count] = __ pc();
193 switch (type) {
194 case T_FLOAT: __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break;
195 case T_DOUBLE: __ movdbl (xmm0, Address(robj, roffset, Address::times_1)); break;
196 default: ShouldNotReachHere();
197 }
198
199 if (os::is_MP()) {
200 __ lea(rcounter_addr, counter);
201 __ movdq (rax, xmm0);
202 // counter address is data dependent on xmm0.
203 __ xorptr(rcounter_addr, rax);
204 __ xorptr(rcounter_addr, rax);
205 __ cmpl (rcounter, Address(rcounter_addr, 0));
|
64 ResourceMark rm;
65 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
66 CodeBuffer cbuf(blob);
67 MacroAssembler* masm = new MacroAssembler(&cbuf);
68 address fast_entry = __ pc();
69
70 Label slow;
71
72 ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr());
73 __ mov32 (rcounter, counter);
74 __ mov (robj, c_rarg1);
75 __ testb (rcounter, 1);
76 __ jcc (Assembler::notZero, slow);
77 if (os::is_MP()) {
78 __ xorptr(robj, rcounter);
79 __ xorptr(robj, rcounter); // obj, since
80 // robj ^ rcounter ^ rcounter == robj
81 // robj is data dependent on rcounter.
82 }
83
84 __ testb(robj, JNIHandles::weak_tag_mask);
85 __ jcc (Assembler::notZero, slow);
86
87 __ movptr(robj, Address(robj, 0)); // *obj
88 __ mov (roffset, c_rarg2);
89 __ shrptr(roffset, 2); // offset
90
91 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
92 speculative_load_pclist[count] = __ pc();
93 switch (type) {
94 case T_BOOLEAN: __ movzbl (rax, Address(robj, roffset, Address::times_1)); break;
95 case T_BYTE: __ movsbl (rax, Address(robj, roffset, Address::times_1)); break;
96 case T_CHAR: __ movzwl (rax, Address(robj, roffset, Address::times_1)); break;
97 case T_SHORT: __ movswl (rax, Address(robj, roffset, Address::times_1)); break;
98 case T_INT: __ movl (rax, Address(robj, roffset, Address::times_1)); break;
99 case T_LONG: __ movq (rax, Address(robj, roffset, Address::times_1)); break;
100 default: ShouldNotReachHere();
101 }
102
103 if (os::is_MP()) {
104 __ lea(rcounter_addr, counter);
105 // ca is data dependent on rax.
166 ResourceMark rm;
167 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
168 CodeBuffer cbuf(blob);
169 MacroAssembler* masm = new MacroAssembler(&cbuf);
170 address fast_entry = __ pc();
171
172 Label slow;
173
174 ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr());
175 __ mov32 (rcounter, counter);
176 __ mov (robj, c_rarg1);
177 __ testb (rcounter, 1);
178 __ jcc (Assembler::notZero, slow);
179 if (os::is_MP()) {
180 __ xorptr(robj, rcounter);
181 __ xorptr(robj, rcounter); // obj, since
182 // robj ^ rcounter ^ rcounter == robj
183 // robj is data dependent on rcounter.
184 }
185
186 __ testb(robj, JNIHandles::weak_tag_mask);
187 __ jcc (Assembler::notZero, slow);
188
189 __ movptr(robj, Address(robj, 0)); // *obj
190 __ mov (roffset, c_rarg2);
191 __ shrptr(roffset, 2); // offset
192
193 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
194 speculative_load_pclist[count] = __ pc();
195 switch (type) {
196 case T_FLOAT: __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break;
197 case T_DOUBLE: __ movdbl (xmm0, Address(robj, roffset, Address::times_1)); break;
198 default: ShouldNotReachHere();
199 }
200
201 if (os::is_MP()) {
202 __ lea(rcounter_addr, counter);
203 __ movdq (rax, xmm0);
204 // counter address is data dependent on xmm0.
205 __ xorptr(rcounter_addr, rax);
206 __ xorptr(rcounter_addr, rax);
207 __ cmpl (rcounter, Address(rcounter_addr, 0));
|