< prev index next >

src/cpu/x86/vm/jniFastGetField_x86_64.cpp

Print this page
rev 12906 : [mq]: gc_interface


  64   ResourceMark rm;
  65   BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
  66   CodeBuffer cbuf(blob);
  67   MacroAssembler* masm = new MacroAssembler(&cbuf);
  68   address fast_entry = __ pc();
  69 
  70   Label slow;
  71 
  72   ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr());
  73   __ mov32 (rcounter, counter);
  74   __ mov   (robj, c_rarg1);
  75   __ testb (rcounter, 1);
  76   __ jcc (Assembler::notZero, slow);
  77   if (os::is_MP()) {
  78     __ xorptr(robj, rcounter);
  79     __ xorptr(robj, rcounter);                   // obj, since
  80                                                 // robj ^ rcounter ^ rcounter == robj
  81                                                 // robj is data dependent on rcounter.
  82   }
  83 
  84   __ clear_jweak_tag(robj);

  85 
  86   __ movptr(robj, Address(robj, 0));             // *obj
  87   __ mov   (roffset, c_rarg2);
  88   __ shrptr(roffset, 2);                         // offset
  89 
  90   assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
  91   speculative_load_pclist[count] = __ pc();
  92   switch (type) {
  93     case T_BOOLEAN: __ movzbl (rax, Address(robj, roffset, Address::times_1)); break;
  94     case T_BYTE:    __ movsbl (rax, Address(robj, roffset, Address::times_1)); break;
  95     case T_CHAR:    __ movzwl (rax, Address(robj, roffset, Address::times_1)); break;
  96     case T_SHORT:   __ movswl (rax, Address(robj, roffset, Address::times_1)); break;
  97     case T_INT:     __ movl   (rax, Address(robj, roffset, Address::times_1)); break;
  98     case T_LONG:    __ movq   (rax, Address(robj, roffset, Address::times_1)); break;
  99     default:        ShouldNotReachHere();
 100   }
 101 
 102   if (os::is_MP()) {
 103     __ lea(rcounter_addr, counter);
 104     // ca is data dependent on rax.


 165   ResourceMark rm;
 166   BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
 167   CodeBuffer cbuf(blob);
 168   MacroAssembler* masm = new MacroAssembler(&cbuf);
 169   address fast_entry = __ pc();
 170 
 171   Label slow;
 172 
 173   ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr());
 174   __ mov32 (rcounter, counter);
 175   __ mov   (robj, c_rarg1);
 176   __ testb (rcounter, 1);
 177   __ jcc (Assembler::notZero, slow);
 178   if (os::is_MP()) {
 179     __ xorptr(robj, rcounter);
 180     __ xorptr(robj, rcounter);                   // obj, since
 181                                                 // robj ^ rcounter ^ rcounter == robj
 182                                                 // robj is data dependent on rcounter.
 183   }
 184 
 185   __ clear_jweak_tag(robj);

 186 
 187   __ movptr(robj, Address(robj, 0));             // *obj
 188   __ mov   (roffset, c_rarg2);
 189   __ shrptr(roffset, 2);                         // offset
 190 
 191   assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
 192   speculative_load_pclist[count] = __ pc();
 193   switch (type) {
 194     case T_FLOAT:  __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break;
 195     case T_DOUBLE: __ movdbl (xmm0, Address(robj, roffset, Address::times_1)); break;
 196     default:        ShouldNotReachHere();
 197   }
 198 
 199   if (os::is_MP()) {
 200     __ lea(rcounter_addr, counter);
 201     __ movdq (rax, xmm0);
 202     // counter address is data dependent on xmm0.
 203     __ xorptr(rcounter_addr, rax);
 204     __ xorptr(rcounter_addr, rax);
 205     __ cmpl (rcounter, Address(rcounter_addr, 0));




  64   ResourceMark rm;
  65   BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
  66   CodeBuffer cbuf(blob);
  67   MacroAssembler* masm = new MacroAssembler(&cbuf);
  68   address fast_entry = __ pc();
  69 
  70   Label slow;
  71 
  72   ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr());
  73   __ mov32 (rcounter, counter);
  74   __ mov   (robj, c_rarg1);
  75   __ testb (rcounter, 1);
  76   __ jcc (Assembler::notZero, slow);
  77   if (os::is_MP()) {
  78     __ xorptr(robj, rcounter);
  79     __ xorptr(robj, rcounter);                   // obj, since
  80                                                 // robj ^ rcounter ^ rcounter == robj
  81                                                 // robj is data dependent on rcounter.
  82   }
  83 
  84   __ testb(robj, JNIHandles::weak_tag_mask);
  85   __ jcc (Assembler::notZero, slow);
  86 
  87   __ movptr(robj, Address(robj, 0));             // *obj
  88   __ mov   (roffset, c_rarg2);
  89   __ shrptr(roffset, 2);                         // offset
  90 
  91   assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
  92   speculative_load_pclist[count] = __ pc();
  93   switch (type) {
  94     case T_BOOLEAN: __ movzbl (rax, Address(robj, roffset, Address::times_1)); break;
  95     case T_BYTE:    __ movsbl (rax, Address(robj, roffset, Address::times_1)); break;
  96     case T_CHAR:    __ movzwl (rax, Address(robj, roffset, Address::times_1)); break;
  97     case T_SHORT:   __ movswl (rax, Address(robj, roffset, Address::times_1)); break;
  98     case T_INT:     __ movl   (rax, Address(robj, roffset, Address::times_1)); break;
  99     case T_LONG:    __ movq   (rax, Address(robj, roffset, Address::times_1)); break;
 100     default:        ShouldNotReachHere();
 101   }
 102 
 103   if (os::is_MP()) {
 104     __ lea(rcounter_addr, counter);
 105     // ca is data dependent on rax.


 166   ResourceMark rm;
 167   BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
 168   CodeBuffer cbuf(blob);
 169   MacroAssembler* masm = new MacroAssembler(&cbuf);
 170   address fast_entry = __ pc();
 171 
 172   Label slow;
 173 
 174   ExternalAddress counter(SafepointSynchronize::safepoint_counter_addr());
 175   __ mov32 (rcounter, counter);
 176   __ mov   (robj, c_rarg1);
 177   __ testb (rcounter, 1);
 178   __ jcc (Assembler::notZero, slow);
 179   if (os::is_MP()) {
 180     __ xorptr(robj, rcounter);
 181     __ xorptr(robj, rcounter);                   // obj, since
 182                                                 // robj ^ rcounter ^ rcounter == robj
 183                                                 // robj is data dependent on rcounter.
 184   }
 185 
 186   __ testb(robj, JNIHandles::weak_tag_mask);
 187   __ jcc (Assembler::notZero, slow);
 188 
 189   __ movptr(robj, Address(robj, 0));             // *obj
 190   __ mov   (roffset, c_rarg2);
 191   __ shrptr(roffset, 2);                         // offset
 192 
 193   assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
 194   speculative_load_pclist[count] = __ pc();
 195   switch (type) {
 196     case T_FLOAT:  __ movflt (xmm0, Address(robj, roffset, Address::times_1)); break;
 197     case T_DOUBLE: __ movdbl (xmm0, Address(robj, roffset, Address::times_1)); break;
 198     default:        ShouldNotReachHere();
 199   }
 200 
 201   if (os::is_MP()) {
 202     __ lea(rcounter_addr, counter);
 203     __ movdq (rax, xmm0);
 204     // counter address is data dependent on xmm0.
 205     __ xorptr(rcounter_addr, rax);
 206     __ xorptr(rcounter_addr, rax);
 207     __ cmpl (rcounter, Address(rcounter_addr, 0));


< prev index next >