src/cpu/sparc/vm/templateTable_sparc.cpp

Print this page




  45 static void do_oop_store(InterpreterMacroAssembler* _masm,
  46                          Register base,
  47                          Register index,
  48                          int offset,
  49                          Register val,
  50                          Register tmp,
  51                          BarrierSet::Name barrier,
  52                          bool precise) {
  53   assert(tmp != val && tmp != base && tmp != index, "register collision");
  54   assert(index == noreg || offset == 0, "only one offset");
  55   switch (barrier) {
  56 #ifndef SERIALGC
  57     case BarrierSet::G1SATBCT:
  58     case BarrierSet::G1SATBCTLogging:
  59       {
  60         // Load and record the previous value.
  61         __ g1_write_barrier_pre(base, index, offset,
  62                                 noreg /* pre_val */,
  63                                 tmp, true /*preserve_o_regs*/);
  64 







  65         if (index == noreg ) {
  66           assert(Assembler::is_simm13(offset), "fix this code");
  67           __ store_heap_oop(val, base, offset);
  68         } else {
  69           __ store_heap_oop(val, base, index);
  70         }
  71 
  72         // No need for post barrier if storing NULL
  73         if (val != G0) {
  74           if (precise) {
  75             if (index == noreg) {
  76               __ add(base, offset, base);
  77             } else {
  78               __ add(base, index, base);
  79             }
  80           }
  81           __ g1_write_barrier_post(base, val, tmp);
  82         }
  83       }
  84       break;
  85 #endif // SERIALGC
  86     case BarrierSet::CardTableModRef:
  87     case BarrierSet::CardTableExtension:
  88       {
  89         if (index == noreg ) {
  90           assert(Assembler::is_simm13(offset), "fix this code");
  91           __ store_heap_oop(val, base, offset);
  92         } else {
  93           __ store_heap_oop(val, base, index);
  94         }
  95         // No need for post barrier if storing NULL
  96         if (val != G0) {
  97           if (precise) {
  98             if (index == noreg) {
  99               __ add(base, offset, base);
 100             } else {
 101               __ add(base, index, base);




  45 static void do_oop_store(InterpreterMacroAssembler* _masm,
  46                          Register base,
  47                          Register index,
  48                          int offset,
  49                          Register val,
  50                          Register tmp,
  51                          BarrierSet::Name barrier,
  52                          bool precise) {
  53   assert(tmp != val && tmp != base && tmp != index, "register collision");
  54   assert(index == noreg || offset == 0, "only one offset");
  55   switch (barrier) {
  56 #ifndef SERIALGC
  57     case BarrierSet::G1SATBCT:
  58     case BarrierSet::G1SATBCTLogging:
  59       {
  60         // Load and record the previous value.
  61         __ g1_write_barrier_pre(base, index, offset,
  62                                 noreg /* pre_val */,
  63                                 tmp, true /*preserve_o_regs*/);
  64 
  65         // G1 barrier needs uncompressed oop for region cross check.
  66         Register new_val = val;
  67         if (UseCompressedOops && val != G0) {
  68           new_val = tmp;
  69           __ mov(val, new_val);
  70         }
  71 
  72         if (index == noreg ) {
  73           assert(Assembler::is_simm13(offset), "fix this code");
  74           __ store_heap_oop(val, base, offset);
  75         } else {
  76           __ store_heap_oop(val, base, index);
  77         }
  78 
  79         // No need for post barrier if storing NULL
  80         if (val != G0) {
  81           if (precise) {
  82             if (index == noreg) {
  83               __ add(base, offset, base);
  84             } else {
  85               __ add(base, index, base);
  86             }
  87           }
  88           __ g1_write_barrier_post(base, new_val, tmp);
  89         }
  90       }
  91       break;
  92 #endif // SERIALGC
  93     case BarrierSet::CardTableModRef:
  94     case BarrierSet::CardTableExtension:
  95       {
  96         if (index == noreg ) {
  97           assert(Assembler::is_simm13(offset), "fix this code");
  98           __ store_heap_oop(val, base, offset);
  99         } else {
 100           __ store_heap_oop(val, base, index);
 101         }
 102         // No need for post barrier if storing NULL
 103         if (val != G0) {
 104           if (precise) {
 105             if (index == noreg) {
 106               __ add(base, offset, base);
 107             } else {
 108               __ add(base, index, base);