< prev index next >

src/hotspot/cpu/sparc/templateTable_sparc.cpp

G1BarrierSet_merge

37 #include "utilities/macros.hpp"                                                                                                      
38 
39 #define __ _masm->                                                                                                                   
40 
41 // Misc helpers                                                                                                                      
42 
43 // Do an oop store like *(base + index + offset) = val                                                                               
44 // index can be noreg,                                                                                                               
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 #if INCLUDE_ALL_GCS                                                                                                                  
57     case BarrierSet::G1SATBCTLogging:                                                                                                
58       {                                                                                                                              
59         // Load and record the previous value.                                                                                       
60         __ g1_write_barrier_pre(base, index, offset,                                                                                 
61                                 noreg /* pre_val */,                                                                                 
62                                 tmp, true /*preserve_o_regs*/);                                                                      
63 
64         // G1 barrier needs uncompressed oop for region cross check.                                                                 
65         Register new_val = val;                                                                                                      
66         if (UseCompressedOops && val != G0) {                                                                                        
67           new_val = tmp;                                                                                                             
68           __ mov(val, new_val);                                                                                                      
69         }                                                                                                                            
70 
71         if (index == noreg ) {                                                                                                       
72           assert(Assembler::is_simm13(offset), "fix this code");                                                                     
73           __ store_heap_oop(val, base, offset);                                                                                      
74         } else {                                                                                                                     
75           __ store_heap_oop(val, base, index);                                                                                       
76         }                                                                                                                            

37 #include "utilities/macros.hpp"
38 
39 #define __ _masm->
40 
41 // Misc helpers
42 
43 // Do an oop store like *(base + index + offset) = val
44 // index can be noreg,
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 #if INCLUDE_ALL_GCS
57     case BarrierSet::G1BarrierSet:
58       {
59         // Load and record the previous value.
60         __ g1_write_barrier_pre(base, index, offset,
61                                 noreg /* pre_val */,
62                                 tmp, true /*preserve_o_regs*/);
63 
64         // G1 barrier needs uncompressed oop for region cross check.
65         Register new_val = val;
66         if (UseCompressedOops && val != G0) {
67           new_val = tmp;
68           __ mov(val, new_val);
69         }
70 
71         if (index == noreg ) {
72           assert(Assembler::is_simm13(offset), "fix this code");
73           __ store_heap_oop(val, base, offset);
74         } else {
75           __ store_heap_oop(val, base, index);
76         }
< prev index next >