From e4e382dc3c62049366197160849d641180a2a1fd Mon Sep 17 00:00:00 2001 From: David Mak Date: Tue, 13 Aug 2024 17:51:26 +0800 Subject: [PATCH] WIP - Constants --- nac3artiq/src/codegen.rs | 58 +++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/nac3artiq/src/codegen.rs b/nac3artiq/src/codegen.rs index 83fa247c..2a4f61e9 100644 --- a/nac3artiq/src/codegen.rs +++ b/nac3artiq/src/codegen.rs @@ -32,7 +32,6 @@ use crate::{symbol_resolver::InnerResolver, timeline::TimeFns}; use inkwell::types::BasicType; use itertools::Itertools; use nac3core::codegen::classes::{ArrayLikeIndexer, ArrayLikeValue, ArraySliceValue, NDArrayType}; -use nac3core::codegen::llvm_intrinsics; use std::{ collections::{hash_map::DefaultHasher, HashMap}, hash::{Hash, Hasher}, @@ -431,7 +430,8 @@ fn gen_rpc_tag( ); buffer.push(b'a'); - buffer.push((ndarray_ndims & 0xFF) as u8); + buffer.push(1u8); + // buffer.push((ndarray_ndims & 0xFF) as u8); gen_rpc_tag(ctx, ndarray_dtype, buffer)?; } _ => return Err(format!("Unsupported type: {:?}", ctx.unifier.stringify(ty))), @@ -578,26 +578,46 @@ fn rpc_codegen_callback_fn<'ctx>( let buffer_size = ctx.builder.build_int_add(dims_buf_sz, data_buf_sz, "").unwrap(); - let buffer = ctx.builder.build_array_alloca(int8, buffer_size, "").unwrap(); + // let buffer = ctx.builder.build_array_alloca(int8, buffer_size, "").unwrap(); + let buffer = ctx.builder.build_array_alloca(int8, size_type.const_int(16, false), "").unwrap(); let buffer = ArraySliceValue::from_ptr_val(buffer, buffer_size, None); - llvm_intrinsics::call_memcpy_generic( - ctx, - buffer.base_ptr(ctx, generator), - llvm_arg.dim_sizes().base_ptr(ctx, generator), - dims_buf_sz, - int1.const_zero(), - ); + for (offset, byte) in [ + /* LSB <-> MSB */ + /* buffer[0] - ndims */ 1u8, 0u8, 0u8, 0u8, + /* buffer[4] - dim[0] */ 1u8, 0u8, 0u8, 0u8, + /* buffer[8] - data[0] */ 128u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8 + ].into_iter().enumerate() + { + let pbuffer = unsafe { + buffer.ptr_offset_unchecked( + ctx, + generator, + &size_type.const_int(offset as u64, false), + None, + ) + }; - let pbuffer_data_begin = - unsafe { buffer.ptr_offset_unchecked(ctx, generator, &dims_buf_sz, None) }; - llvm_intrinsics::call_memcpy_generic( - ctx, - pbuffer_data_begin, - llvm_arg.data().base_ptr(ctx, generator), - data_buf_sz, - int1.const_zero(), - ); + ctx.builder.build_store(pbuffer, int8.const_int(byte as u64, false)).unwrap(); + } + + // llvm_intrinsics::call_memcpy_generic( + // ctx, + // buffer.base_ptr(ctx, generator), + // llvm_arg.dim_sizes().base_ptr(ctx, generator), + // dims_buf_sz, + // int1.const_zero(), + // ); + // + // let pbuffer_data_begin = + // unsafe { buffer.ptr_offset_unchecked(ctx, generator, &dims_buf_sz, None) }; + // llvm_intrinsics::call_memcpy_generic( + // ctx, + // pbuffer_data_begin, + // llvm_arg.data().base_ptr(ctx, generator), + // data_buf_sz, + // int1.const_zero(), + // ); buffer.base_ptr(ctx, generator) } else {