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 <xnnpack/allocator.h> 9 10 namespace xnnpack { 11 AssemblerBase(xnn_code_buffer * buf)12AssemblerBase::AssemblerBase(xnn_code_buffer* buf) { 13 buffer_ = reinterpret_cast<byte*>(buf->code); 14 cursor_ = buffer_; 15 top_ = buffer_ + buf->capacity; 16 xnn_buffer = buf; 17 } 18 emit32(uint32_t value)19void AssemblerBase::emit32(uint32_t value) { 20 if (error_ != Error::kNoError) { 21 return; 22 } 23 24 if (cursor_ + sizeof(value) > top_) { 25 error_ = Error::kOutOfMemory; 26 return; 27 } 28 29 memcpy(cursor_, &value, sizeof(value)); 30 cursor_ += sizeof(value); 31 } 32 33 finalize()34void* AssemblerBase::finalize() { 35 xnn_buffer->size = code_size_in_bytes(); 36 if (xnn_finalize_code_memory(xnn_buffer) != xnn_status_success) { 37 error_ = Error::kFinalizeCodeMemoryFail; 38 } 39 return reinterpret_cast<void*>(buffer_); 40 } 41 reset()42void AssemblerBase::reset() { 43 cursor_ = buffer_; 44 error_ = Error::kNoError; 45 } 46 47 } // namespace xnnpack 48