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; }
|