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