hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
changeset 1374 4c24294029a9
parent 371 1aacedc9db7c
child 1388 3677f5f3d66b
equal deleted inserted replaced
615:570062d730b2 1374:4c24294029a9
  1150   //     count    -  element count
  1150   //     count    -  element count
  1151   //
  1151   //
  1152   //     Destroy no registers!
  1152   //     Destroy no registers!
  1153   //
  1153   //
  1154   void  gen_write_ref_array_pre_barrier(Register addr, Register count) {
  1154   void  gen_write_ref_array_pre_barrier(Register addr, Register count) {
  1155 #if 0 // G1 - only
       
  1156     assert_different_registers(addr, c_rarg1);
       
  1157     assert_different_registers(count, c_rarg0);
       
  1158     BarrierSet* bs = Universe::heap()->barrier_set();
  1155     BarrierSet* bs = Universe::heap()->barrier_set();
  1159     switch (bs->kind()) {
  1156     switch (bs->kind()) {
  1160       case BarrierSet::G1SATBCT:
  1157       case BarrierSet::G1SATBCT:
  1161       case BarrierSet::G1SATBCTLogging:
  1158       case BarrierSet::G1SATBCTLogging:
  1162         {
  1159         {
  1163           __ pushaq();                      // push registers
  1160           __ pushaq();                      // push registers
  1164           __ movq(c_rarg0, addr);
  1161           if (count == c_rarg0) {
  1165           __ movq(c_rarg1, count);
  1162             if (addr == c_rarg1) {
  1166           __ call(RuntimeAddress(BarrierSet::static_write_ref_array_pre));
  1163               // exactly backwards!!
       
  1164               __ xchgq(c_rarg1, c_rarg0);
       
  1165             } else {
       
  1166               __ movq(c_rarg1, count);
       
  1167               __ movq(c_rarg0, addr);
       
  1168             }
       
  1169 
       
  1170           } else {
       
  1171             __ movq(c_rarg0, addr);
       
  1172             __ movq(c_rarg1, count);
       
  1173           }
       
  1174           __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre)));
  1167           __ popaq();
  1175           __ popaq();
  1168         }
  1176         }
  1169         break;
  1177         break;
  1170       case BarrierSet::CardTableModRef:
  1178       case BarrierSet::CardTableModRef:
  1171       case BarrierSet::CardTableExtension:
  1179       case BarrierSet::CardTableExtension:
  1172       case BarrierSet::ModRef:
  1180       case BarrierSet::ModRef:
  1173         break;
  1181         break;
  1174       default      :
  1182       default:
  1175         ShouldNotReachHere();
  1183         ShouldNotReachHere();
  1176 
  1184 
  1177     }
  1185     }
  1178 #endif // 0 G1 - only
       
  1179   }
  1186   }
  1180 
  1187 
  1181   //
  1188   //
  1182   // Generate code for an array write post barrier
  1189   // Generate code for an array write post barrier
  1183   //
  1190   //
  1190   //  The ending address is inclusive.
  1197   //  The ending address is inclusive.
  1191   void  gen_write_ref_array_post_barrier(Register start, Register end, Register scratch) {
  1198   void  gen_write_ref_array_post_barrier(Register start, Register end, Register scratch) {
  1192     assert_different_registers(start, end, scratch);
  1199     assert_different_registers(start, end, scratch);
  1193     BarrierSet* bs = Universe::heap()->barrier_set();
  1200     BarrierSet* bs = Universe::heap()->barrier_set();
  1194     switch (bs->kind()) {
  1201     switch (bs->kind()) {
  1195 #if 0 // G1 - only
       
  1196       case BarrierSet::G1SATBCT:
  1202       case BarrierSet::G1SATBCT:
  1197       case BarrierSet::G1SATBCTLogging:
  1203       case BarrierSet::G1SATBCTLogging:
  1198 
  1204 
  1199         {
  1205         {
  1200           __ pushaq();                      // push registers (overkill)
  1206           __ pushaq();                      // push registers (overkill)
  1203           __ leaq(scratch, Address(end, wordSize));
  1209           __ leaq(scratch, Address(end, wordSize));
  1204           __ subq(scratch, start);
  1210           __ subq(scratch, start);
  1205           __ shrq(scratch, LogBytesPerWord);
  1211           __ shrq(scratch, LogBytesPerWord);
  1206           __ movq(c_rarg0, start);
  1212           __ movq(c_rarg0, start);
  1207           __ movq(c_rarg1, scratch);
  1213           __ movq(c_rarg1, scratch);
  1208           __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post));
  1214           __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post)));
  1209           __ popaq();
  1215           __ popaq();
  1210         }
  1216         }
  1211         break;
  1217         break;
  1212 #endif // 0 G1 - only
       
  1213       case BarrierSet::CardTableModRef:
  1218       case BarrierSet::CardTableModRef:
  1214       case BarrierSet::CardTableExtension:
  1219       case BarrierSet::CardTableExtension:
  1215         {
  1220         {
  1216           CardTableModRefBS* ct = (CardTableModRefBS*)bs;
  1221           CardTableModRefBS* ct = (CardTableModRefBS*)bs;
  1217           assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
  1222           assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
  1228         __ BIND(L_loop);
  1233         __ BIND(L_loop);
  1229           __ movb(Address(start, count, Address::times_1), 0);
  1234           __ movb(Address(start, count, Address::times_1), 0);
  1230           __ decrementq(count);
  1235           __ decrementq(count);
  1231           __ jcc(Assembler::greaterEqual, L_loop);
  1236           __ jcc(Assembler::greaterEqual, L_loop);
  1232         }
  1237         }
  1233       }
  1238         break;
  1234    }
  1239       default:
       
  1240         ShouldNotReachHere();
       
  1241 
       
  1242     }
       
  1243   }
  1235 
  1244 
  1236   // Copy big chunks forward
  1245   // Copy big chunks forward
  1237   //
  1246   //
  1238   // Inputs:
  1247   // Inputs:
  1239   //   end_from     - source arrays end address
  1248   //   end_from     - source arrays end address