5576 Register var_size_in_bytes,
5577 int con_size_in_bytes,
5578 Register t1,
5579 Register t2,
5580 Label& slow_case) {
5581 assert_different_registers(obj, t1, t2);
5582 assert_different_registers(obj, var_size_in_bytes, t1);
5583 Register end = t2;
5584 Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
5585
5586 verify_tlab();
5587
5588 NOT_LP64(get_thread(thread));
5589
5590 movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
5591 if (var_size_in_bytes == noreg) {
5592 lea(end, Address(obj, con_size_in_bytes));
5593 } else {
5594 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
5595 }
5596 cmpptr(end, Address(thread, JavaThread::tlab_end_offset()));
5597 jcc(Assembler::above, slow_case);
5598
5599 // update the tlab top pointer
5600 movptr(Address(thread, JavaThread::tlab_top_offset()), end);
5601
5602 // recover var_size_in_bytes if necessary
5603 if (var_size_in_bytes == end) {
5604 subptr(var_size_in_bytes, obj);
5605 }
5606 verify_tlab();
5607 }
5608
5609 // Preserves the contents of address, destroys the contents length_in_bytes and temp.
5610 void MacroAssembler::zero_memory(Register address, Register length_in_bytes, int offset_in_bytes, Register temp) {
5611 assert(address != length_in_bytes && address != temp && temp != length_in_bytes, "registers must be different");
5612 assert((offset_in_bytes & (BytesPerWord - 1)) == 0, "offset must be a multiple of BytesPerWord");
5613 Label done;
5614
5615 testptr(length_in_bytes, length_in_bytes);
5616 jcc(Assembler::zero, done);
6144 }
6145
6146 void MacroAssembler::verify_tlab() {
6147 #ifdef ASSERT
6148 if (UseTLAB && VerifyOops) {
6149 Label next, ok;
6150 Register t1 = rsi;
6151 Register thread_reg = NOT_LP64(rbx) LP64_ONLY(r15_thread);
6152
6153 push(t1);
6154 NOT_LP64(push(thread_reg));
6155 NOT_LP64(get_thread(thread_reg));
6156
6157 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
6158 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
6159 jcc(Assembler::aboveEqual, next);
6160 STOP("assert(top >= start)");
6161 should_not_reach_here();
6162
6163 bind(next);
6164 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_end_offset())));
6165 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
6166 jcc(Assembler::aboveEqual, ok);
6167 STOP("assert(top <= end)");
6168 should_not_reach_here();
6169
6170 bind(ok);
6171 NOT_LP64(pop(thread_reg));
6172 pop(t1);
6173 }
6174 #endif
6175 }
6176
6177 class ControlWord {
6178 public:
6179 int32_t _value;
6180
6181 int rounding_control() const { return (_value >> 10) & 3 ; }
6182 int precision_control() const { return (_value >> 8) & 3 ; }
6183 bool precision() const { return ((_value >> 5) & 1) != 0; }
6184 bool underflow() const { return ((_value >> 4) & 1) != 0; }
|
5576 Register var_size_in_bytes,
5577 int con_size_in_bytes,
5578 Register t1,
5579 Register t2,
5580 Label& slow_case) {
5581 assert_different_registers(obj, t1, t2);
5582 assert_different_registers(obj, var_size_in_bytes, t1);
5583 Register end = t2;
5584 Register thread = NOT_LP64(t1) LP64_ONLY(r15_thread);
5585
5586 verify_tlab();
5587
5588 NOT_LP64(get_thread(thread));
5589
5590 movptr(obj, Address(thread, JavaThread::tlab_top_offset()));
5591 if (var_size_in_bytes == noreg) {
5592 lea(end, Address(obj, con_size_in_bytes));
5593 } else {
5594 lea(end, Address(obj, var_size_in_bytes, Address::times_1));
5595 }
5596 cmpptr(end, Address(thread, JavaThread::tlab_fast_path_end_offset()));
5597 jcc(Assembler::above, slow_case);
5598
5599 // update the tlab top pointer
5600 movptr(Address(thread, JavaThread::tlab_top_offset()), end);
5601
5602 // recover var_size_in_bytes if necessary
5603 if (var_size_in_bytes == end) {
5604 subptr(var_size_in_bytes, obj);
5605 }
5606 verify_tlab();
5607 }
5608
5609 // Preserves the contents of address, destroys the contents length_in_bytes and temp.
5610 void MacroAssembler::zero_memory(Register address, Register length_in_bytes, int offset_in_bytes, Register temp) {
5611 assert(address != length_in_bytes && address != temp && temp != length_in_bytes, "registers must be different");
5612 assert((offset_in_bytes & (BytesPerWord - 1)) == 0, "offset must be a multiple of BytesPerWord");
5613 Label done;
5614
5615 testptr(length_in_bytes, length_in_bytes);
5616 jcc(Assembler::zero, done);
6144 }
6145
6146 void MacroAssembler::verify_tlab() {
6147 #ifdef ASSERT
6148 if (UseTLAB && VerifyOops) {
6149 Label next, ok;
6150 Register t1 = rsi;
6151 Register thread_reg = NOT_LP64(rbx) LP64_ONLY(r15_thread);
6152
6153 push(t1);
6154 NOT_LP64(push(thread_reg));
6155 NOT_LP64(get_thread(thread_reg));
6156
6157 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
6158 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_start_offset())));
6159 jcc(Assembler::aboveEqual, next);
6160 STOP("assert(top >= start)");
6161 should_not_reach_here();
6162
6163 bind(next);
6164 movptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_fast_path_end_offset())));
6165 cmpptr(t1, Address(thread_reg, in_bytes(JavaThread::tlab_top_offset())));
6166 jcc(Assembler::aboveEqual, ok);
6167 STOP("assert(top <= end)");
6168 should_not_reach_here();
6169
6170 bind(ok);
6171 NOT_LP64(pop(thread_reg));
6172 pop(t1);
6173 }
6174 #endif
6175 }
6176
6177 class ControlWord {
6178 public:
6179 int32_t _value;
6180
6181 int rounding_control() const { return (_value >> 10) & 3 ; }
6182 int precision_control() const { return (_value >> 8) & 3 ; }
6183 bool precision() const { return ((_value >> 5) & 1) != 0; }
6184 bool underflow() const { return ((_value >> 4) & 1) != 0; }
|