1 // Copyright 2022 Google LLC 2 // 3 // This source code is licensed under the BSD-style license found in the 4 // LICENSE file in the root directory of this source tree. 5 6 #include <xnnpack/assembler.h> 7 8 #include <assert.h> 9 10 #include <xnnpack/allocator.h> 11 12 namespace xnnpack { 13 AssemblerBase(xnn_code_buffer * buf)14AssemblerBase::AssemblerBase(xnn_code_buffer* buf) { 15 byte* buf_start = reinterpret_cast<byte*>(buf->start); 16 buffer_ = buf_start + buf->size; 17 cursor_ = buffer_; 18 top_ = buf_start + buf->capacity; 19 xnn_buffer = buf; 20 } 21 emit32(uint32_t value)22void AssemblerBase::emit32(uint32_t value) { 23 if (error_ != Error::kNoError) { 24 return; 25 } 26 27 if (cursor_ + sizeof(value) > top_) { 28 error_ = Error::kOutOfMemory; 29 return; 30 } 31 32 memcpy(cursor_, &value, sizeof(value)); 33 cursor_ += sizeof(value); 34 } 35 36 finalize()37void* AssemblerBase::finalize() { 38 if (error_ != Error::kNoError) { 39 return NULL; 40 } 41 xnn_buffer->size += code_size_in_bytes(); 42 return reinterpret_cast<void*>(buffer_); 43 } 44 reset()45void AssemblerBase::reset() { 46 xnn_buffer->size -= (cursor_ - buffer_); 47 cursor_ = buffer_; 48 error_ = Error::kNoError; 49 } 50 51 } // namespace xnnpack 52