< prev index next >

src/cpu/sparc/vm/jniFastGetField_sparc.cpp

Print this page




 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();


< prev index next >