133 address JNI_FastGetField::generate_fast_get_long_field() { 134 const char *name = "jni_fast_GetLongField"; 135 ResourceMark rm; 136 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE*wordSize); 137 CodeBuffer cbuf(blob); 138 MacroAssembler* masm = new MacroAssembler(&cbuf); 139 address fast_entry = __ pc(); 140 141 Label label1, label2; 142 143 AddressLiteral cnt_addrlit(SafepointSynchronize::safepoint_counter_addr()); 144 __ sethi (cnt_addrlit, G3); 145 Address cnt_addr(G3, cnt_addrlit.low10()); 146 __ ld (cnt_addr, G4); 147 __ andcc (G4, 1, G0); 148 __ br (Assembler::notZero, false, Assembler::pn, label1); 149 __ delayed()->srl (O2, 2, O4); 150 __ ld_ptr (O1, 0, O5); 151 __ add (O5, O4, O5); 152 153 #ifndef _LP64 154 assert(count < LIST_CAPACITY-1, "LIST_CAPACITY too small"); 155 speculative_load_pclist[count++] = __ pc(); 156 __ ld (O5, 0, G2); 157 158 speculative_load_pclist[count] = __ pc(); 159 __ ld (O5, 4, O3); 160 #else 161 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); 162 speculative_load_pclist[count] = __ pc(); 163 __ ldx (O5, 0, O3); 164 #endif 165 166 __ ld (cnt_addr, G1); 167 __ cmp (G1, G4); 168 __ br (Assembler::notEqual, false, Assembler::pn, label2); 169 __ delayed()->mov (O7, G1); 170 171 #ifndef _LP64 172 __ mov (G2, O0); 173 __ retl (); 174 __ delayed()->mov (O3, O1); 175 #else 176 __ retl (); 177 __ delayed()->mov (O3, O0); 178 #endif 179 180 #ifndef _LP64 181 slowcase_entry_pclist[count-1] = __ pc(); 182 slowcase_entry_pclist[count++] = __ pc() ; 183 #else 184 slowcase_entry_pclist[count++] = __ pc(); 185 #endif 186 187 __ bind (label1); 188 __ mov (O7, G1); 189 190 address slow_case_addr = jni_GetLongField_addr(); 191 __ bind (label2); 192 __ call (slow_case_addr, relocInfo::none); 193 __ delayed()->mov (G1, O7); 194 195 __ flush (); 196 197 return fast_entry; 198 } 199 200 address JNI_FastGetField::generate_fast_get_float_field0(BasicType type) { 201 const char *name; 202 switch (type) { 203 case T_FLOAT: name = "jni_fast_GetFloatField"; break; 204 case T_DOUBLE: name = "jni_fast_GetDoubleField"; break; 205 default: ShouldNotReachHere(); | 133 address JNI_FastGetField::generate_fast_get_long_field() { 134 const char *name = "jni_fast_GetLongField"; 135 ResourceMark rm; 136 BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE*wordSize); 137 CodeBuffer cbuf(blob); 138 MacroAssembler* masm = new MacroAssembler(&cbuf); 139 address fast_entry = __ pc(); 140 141 Label label1, label2; 142 143 AddressLiteral cnt_addrlit(SafepointSynchronize::safepoint_counter_addr()); 144 __ sethi (cnt_addrlit, G3); 145 Address cnt_addr(G3, cnt_addrlit.low10()); 146 __ ld (cnt_addr, G4); 147 __ andcc (G4, 1, G0); 148 __ br (Assembler::notZero, false, Assembler::pn, label1); 149 __ delayed()->srl (O2, 2, O4); 150 __ ld_ptr (O1, 0, O5); 151 __ add (O5, O4, O5); 152 153 assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); 154 speculative_load_pclist[count] = __ pc(); 155 __ ldx (O5, 0, O3); 156 157 __ ld (cnt_addr, G1); 158 __ cmp (G1, G4); 159 __ br (Assembler::notEqual, false, Assembler::pn, label2); 160 __ delayed()->mov (O7, G1); 161 162 __ retl (); 163 __ delayed()->mov (O3, O0); 164 165 slowcase_entry_pclist[count++] = __ pc(); 166 167 __ bind (label1); 168 __ mov (O7, G1); 169 170 address slow_case_addr = jni_GetLongField_addr(); 171 __ bind (label2); 172 __ call (slow_case_addr, relocInfo::none); 173 __ delayed()->mov (G1, O7); 174 175 __ flush (); 176 177 return fast_entry; 178 } 179 180 address JNI_FastGetField::generate_fast_get_float_field0(BasicType type) { 181 const char *name; 182 switch (type) { 183 case T_FLOAT: name = "jni_fast_GetFloatField"; break; 184 case T_DOUBLE: name = "jni_fast_GetDoubleField"; break; 185 default: ShouldNotReachHere(); |