| // Copyright 2022 Google LLC |
| // |
| // This source code is licensed under the BSD-style license found in the |
| // LICENSE file in the root directory of this source tree. |
| |
| #include <xnnpack/assembler.h> |
| |
| #include <assert.h> |
| |
| #include <xnnpack/allocator.h> |
| |
| namespace xnnpack { |
| |
| AssemblerBase::AssemblerBase(xnn_code_buffer* buf) { |
| byte* buf_start = reinterpret_cast<byte*>(buf->start); |
| buffer_ = buf_start + buf->size; |
| cursor_ = buffer_; |
| top_ = buf_start + buf->capacity; |
| xnn_buffer = buf; |
| } |
| |
| void AssemblerBase::emit32(uint32_t value) { |
| if (error_ != Error::kNoError) { |
| return; |
| } |
| |
| if (cursor_ + sizeof(value) > top_) { |
| error_ = Error::kOutOfMemory; |
| return; |
| } |
| |
| memcpy(cursor_, &value, sizeof(value)); |
| cursor_ += sizeof(value); |
| } |
| |
| |
| void* AssemblerBase::finalize() { |
| if (error_ != Error::kNoError) { |
| return NULL; |
| } |
| xnn_buffer->size += code_size_in_bytes(); |
| return reinterpret_cast<void*>(buffer_); |
| } |
| |
| void AssemblerBase::reset() { |
| xnn_buffer->size -= (cursor_ - buffer_); |
| cursor_ = buffer_; |
| error_ = Error::kNoError; |
| } |
| |
| } // namespace xnnpack |