< prev index next >

src/hotspot/cpu/x86/macroAssembler_x86.cpp

Print this page
rev 49643 : [mq]: heap8
rev 49649 : [mq]: heap14


5577                                    Register var_size_in_bytes,
5578                                    int con_size_in_bytes,
5579                                    Register t1,
5580                                    Register t2,
5581                                    Label& slow_case) {
5582   assert_different_registers(obj, t1, t2);
5583   assert_different_registers(obj, var_size_in_bytes, t1);
5584   Register end = t2;
5585   Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
5586 
5587   verify_tlab();
5588 
5589   NOT_LP64(get_thread(thread));
5590 
5591   movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
5592   if (var_size_in_bytes == noreg) {
5593     lea(end, Address(obj, con_size_in_bytes));
5594   } else {
5595     lea(end, Address(obj, var_size_in_bytes, Address::times_1));
5596   }
5597   cmpptr(end, Address(thread, JavaThread::tlab_current_end_offset()));
5598   jcc(Assembler::above, slow_case);
5599 
5600   // update the tlab top pointer
5601   movptr(Address(thread, JavaThread::tlab_top_offset()), end);
5602 
5603   // recover var_size_in_bytes if necessary
5604   if (var_size_in_bytes == end) {
5605     subptr(var_size_in_bytes, obj);
5606   }
5607   verify_tlab();
5608 }
5609 
5610 // Preserves the contents of address, destroys the contents length_in_bytes and temp.
5611 void MacroAssembler::zero_memory(Register address, Register length_in_bytes, int offset_in_bytes, Register temp) {
5612   assert(address != length_in_bytes && address != temp && temp != length_in_bytes, "registers must be different");
5613   assert((offset_in_bytes & (BytesPerWord - 1)) == 0, "offset must be a multiple of BytesPerWord");
5614   Label done;
5615 
5616   testptr(length_in_bytes, length_in_bytes);
5617   jcc(Assembler::zero, done);


6145 }
6146 
6147 void MacroAssembler::verify_tlab() {
6148 #ifdef ASSERT
6149   if (UseTLAB && VerifyOops) {
6150     Label next, ok;
6151     Register t1 = rsi;
6152     Register thread_reg = NOT_LP64(rbx) LP64_ONLY(r15_thread);
6153 
6154     push(t1);
6155     NOT_LP64(push(thread_reg));
6156     NOT_LP64(get_thread(thread_reg));
6157 
6158     movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
6159     cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
6160     jcc(Assembler::aboveEqual, next);
6161     STOP("assert(top >= start)");
6162     should_not_reach_here();
6163 
6164     bind(next);
6165     movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_current_end_offset())));
6166     cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
6167     jcc(Assembler::aboveEqual, ok);
6168     STOP("assert(top <= end)");
6169     should_not_reach_here();
6170 
6171     bind(ok);
6172     NOT_LP64(pop(thread_reg));
6173     pop(t1);
6174   }
6175 #endif
6176 }
6177 
6178 class ControlWord {
6179  public:
6180   int32_t _value;
6181 
6182   int  rounding_control() const        { return  (_value >> 10) & 3      ; }
6183   int  precision_control() const       { return  (_value >>  8) & 3      ; }
6184   bool precision() const               { return ((_value >>  5) & 1) != 0; }
6185   bool underflow() const               { return ((_value >>  4) & 1) != 0; }




5577                                    Register var_size_in_bytes,
5578                                    int con_size_in_bytes,
5579                                    Register t1,
5580                                    Register t2,
5581                                    Label& slow_case) {
5582   assert_different_registers(obj, t1, t2);
5583   assert_different_registers(obj, var_size_in_bytes, t1);
5584   Register end = t2;
5585   Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
5586 
5587   verify_tlab();
5588 
5589   NOT_LP64(get_thread(thread));
5590 
5591   movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
5592   if (var_size_in_bytes == noreg) {
5593     lea(end, Address(obj, con_size_in_bytes));
5594   } else {
5595     lea(end, Address(obj, var_size_in_bytes, Address::times_1));
5596   }
5597   cmpptr(end, Address(thread, JavaThread::tlab_fast_path_end_offset()));
5598   jcc(Assembler::above, slow_case);
5599 
5600   // update the tlab top pointer
5601   movptr(Address(thread, JavaThread::tlab_top_offset()), end);
5602 
5603   // recover var_size_in_bytes if necessary
5604   if (var_size_in_bytes == end) {
5605     subptr(var_size_in_bytes, obj);
5606   }
5607   verify_tlab();
5608 }
5609 
5610 // Preserves the contents of address, destroys the contents length_in_bytes and temp.
5611 void MacroAssembler::zero_memory(Register address, Register length_in_bytes, int offset_in_bytes, Register temp) {
5612   assert(address != length_in_bytes && address != temp && temp != length_in_bytes, "registers must be different");
5613   assert((offset_in_bytes & (BytesPerWord - 1)) == 0, "offset must be a multiple of BytesPerWord");
5614   Label done;
5615 
5616   testptr(length_in_bytes, length_in_bytes);
5617   jcc(Assembler::zero, done);


6145 }
6146 
6147 void MacroAssembler::verify_tlab() {
6148 #ifdef ASSERT
6149   if (UseTLAB && VerifyOops) {
6150     Label next, ok;
6151     Register t1 = rsi;
6152     Register thread_reg = NOT_LP64(rbx) LP64_ONLY(r15_thread);
6153 
6154     push(t1);
6155     NOT_LP64(push(thread_reg));
6156     NOT_LP64(get_thread(thread_reg));
6157 
6158     movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
6159     cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
6160     jcc(Assembler::aboveEqual, next);
6161     STOP("assert(top >= start)");
6162     should_not_reach_here();
6163 
6164     bind(next);
6165     movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_fast_path_end_offset())));
6166     cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
6167     jcc(Assembler::aboveEqual, ok);
6168     STOP("assert(top <= end)");
6169     should_not_reach_here();
6170 
6171     bind(ok);
6172     NOT_LP64(pop(thread_reg));
6173     pop(t1);
6174   }
6175 #endif
6176 }
6177 
6178 class ControlWord {
6179  public:
6180   int32_t _value;
6181 
6182   int  rounding_control() const        { return  (_value >> 10) & 3      ; }
6183   int  precision_control() const       { return  (_value >>  8) & 3      ; }
6184   bool precision() const               { return ((_value >>  5) & 1) != 0; }
6185   bool underflow() const               { return ((_value >>  4) & 1) != 0; }


< prev index next >