xref: /aosp_15_r20/external/XNNPACK/src/jit/assembler.cc (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
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)14 AssemblerBase::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)22 void 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()37 void* 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()45 void AssemblerBase::reset() {
46   xnn_buffer->size -= (cursor_ - buffer_);
47   cursor_ = buffer_;
48   error_ = Error::kNoError;
49 }
50 
51 }  // namespace xnnpack
52