104 // ca is data dependent on rax.
105 __ xorptr(rcounter_addr, rax);
106 __ xorptr(rcounter_addr, rax);
107 __ cmpl (rcounter, Address(rcounter_addr, 0));
108 } else {
109 __ cmp32 (rcounter, counter);
110 }
111 __ jcc (Assembler::notEqual, slow);
112
113 __ ret (0);
114
115 slowcase_entry_pclist[count++] = __ pc();
116 __ bind (slow);
117 address slow_case_addr = NULL;
118 switch (type) {
119 case T_BOOLEAN: slow_case_addr = jni_GetBooleanField_addr(); break;
120 case T_BYTE: slow_case_addr = jni_GetByteField_addr(); break;
121 case T_CHAR: slow_case_addr = jni_GetCharField_addr(); break;
122 case T_SHORT: slow_case_addr = jni_GetShortField_addr(); break;
123 case T_INT: slow_case_addr = jni_GetIntField_addr(); break;
124 case T_LONG: slow_case_addr = jni_GetLongField_addr();
125 }
126 // tail call
127 __ jump (ExternalAddress(slow_case_addr));
128
129 __ flush ();
130
131 return fast_entry;
132 }
133
134 address JNI_FastGetField::generate_fast_get_boolean_field() {
135 return generate_fast_get_int_field0(T_BOOLEAN);
136 }
137
138 address JNI_FastGetField::generate_fast_get_byte_field() {
139 return generate_fast_get_int_field0(T_BYTE);
140 }
141
142 address JNI_FastGetField::generate_fast_get_char_field() {
143 return generate_fast_get_int_field0(T_CHAR);
144 }
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));
206 } else {
207 __ cmp32 (rcounter, counter);
208 }
209 __ jcc (Assembler::notEqual, slow);
210
211 __ ret (0);
212
213 slowcase_entry_pclist[count++] = __ pc();
214 __ bind (slow);
215 address slow_case_addr = NULL;
216 switch (type) {
217 case T_FLOAT: slow_case_addr = jni_GetFloatField_addr(); break;
218 case T_DOUBLE: slow_case_addr = jni_GetDoubleField_addr();
219 }
220 // tail call
221 __ jump (ExternalAddress(slow_case_addr));
222
223 __ flush ();
224
225 return fast_entry;
226 }
227
228 address JNI_FastGetField::generate_fast_get_float_field() {
229 return generate_fast_get_float_field0(T_FLOAT);
230 }
231
232 address JNI_FastGetField::generate_fast_get_double_field() {
233 return generate_fast_get_float_field0(T_DOUBLE);
234 }
|
104 // ca is data dependent on rax.
105 __ xorptr(rcounter_addr, rax);
106 __ xorptr(rcounter_addr, rax);
107 __ cmpl (rcounter, Address(rcounter_addr, 0));
108 } else {
109 __ cmp32 (rcounter, counter);
110 }
111 __ jcc (Assembler::notEqual, slow);
112
113 __ ret (0);
114
115 slowcase_entry_pclist[count++] = __ pc();
116 __ bind (slow);
117 address slow_case_addr = NULL;
118 switch (type) {
119 case T_BOOLEAN: slow_case_addr = jni_GetBooleanField_addr(); break;
120 case T_BYTE: slow_case_addr = jni_GetByteField_addr(); break;
121 case T_CHAR: slow_case_addr = jni_GetCharField_addr(); break;
122 case T_SHORT: slow_case_addr = jni_GetShortField_addr(); break;
123 case T_INT: slow_case_addr = jni_GetIntField_addr(); break;
124 case T_LONG: slow_case_addr = jni_GetLongField_addr(); break;
125 default: break;
126 }
127 // tail call
128 __ jump (ExternalAddress(slow_case_addr));
129
130 __ flush ();
131
132 return fast_entry;
133 }
134
135 address JNI_FastGetField::generate_fast_get_boolean_field() {
136 return generate_fast_get_int_field0(T_BOOLEAN);
137 }
138
139 address JNI_FastGetField::generate_fast_get_byte_field() {
140 return generate_fast_get_int_field0(T_BYTE);
141 }
142
143 address JNI_FastGetField::generate_fast_get_char_field() {
144 return generate_fast_get_int_field0(T_CHAR);
145 }
199
200 if (os::is_MP()) {
201 __ lea(rcounter_addr, counter);
202 __ movdq (rax, xmm0);
203 // counter address is data dependent on xmm0.
204 __ xorptr(rcounter_addr, rax);
205 __ xorptr(rcounter_addr, rax);
206 __ cmpl (rcounter, Address(rcounter_addr, 0));
207 } else {
208 __ cmp32 (rcounter, counter);
209 }
210 __ jcc (Assembler::notEqual, slow);
211
212 __ ret (0);
213
214 slowcase_entry_pclist[count++] = __ pc();
215 __ bind (slow);
216 address slow_case_addr = NULL;
217 switch (type) {
218 case T_FLOAT: slow_case_addr = jni_GetFloatField_addr(); break;
219 case T_DOUBLE: slow_case_addr = jni_GetDoubleField_addr(); break;
220 default: break;
221 }
222 // tail call
223 __ jump (ExternalAddress(slow_case_addr));
224
225 __ flush ();
226
227 return fast_entry;
228 }
229
230 address JNI_FastGetField::generate_fast_get_float_field() {
231 return generate_fast_get_float_field0(T_FLOAT);
232 }
233
234 address JNI_FastGetField::generate_fast_get_double_field() {
235 return generate_fast_get_float_field0(T_DOUBLE);
236 }
|