From a2cfc24091d247b1ebd130dc43dcf18be403fcaf Mon Sep 17 00:00:00 2001 From: lyken Date: Mon, 8 Jul 2024 14:11:15 +0800 Subject: [PATCH] core: cargo fmt --- nac3core/src/codegen/irrt/mod.rs | 5 +- nac3core/src/codegen/numpy.rs | 500 +++++++++++++++---------------- 2 files changed, 253 insertions(+), 252 deletions(-) diff --git a/nac3core/src/codegen/irrt/mod.rs b/nac3core/src/codegen/irrt/mod.rs index 032537b0..edc7f07e 100644 --- a/nac3core/src/codegen/irrt/mod.rs +++ b/nac3core/src/codegen/irrt/mod.rs @@ -2,7 +2,8 @@ use crate::typecheck::typedef::Type; use super::{ classes::{ - ArrayLikeIndexer, ArrayLikeValue, ArraySliceValue, ListValue, NDArrayValue, NpArrayValue, TypedArrayLikeAdapter, UntypedArrayLikeAccessor + ArrayLikeIndexer, ArrayLikeValue, ArraySliceValue, ListValue, NDArrayValue, NpArrayValue, + TypedArrayLikeAdapter, UntypedArrayLikeAccessor, }, llvm_intrinsics, CodeGenContext, CodeGenerator, }; @@ -935,4 +936,4 @@ fn call_ndarray_strides_from_shape<'ctx, G, Index>( dst_strides: PointerValue<'ctx>, ) -> IntValue<'ctx> { todo!() -} \ No newline at end of file +} diff --git a/nac3core/src/codegen/numpy.rs b/nac3core/src/codegen/numpy.rs index 9724f6f2..cb2a6495 100644 --- a/nac3core/src/codegen/numpy.rs +++ b/nac3core/src/codegen/numpy.rs @@ -41,20 +41,20 @@ use nac3parser::ast::{Operator, StrRef}; // elem_ty: Type, // ) -> Result, String> { // let ndarray_ty = make_ndarray_ty(&mut ctx.unifier, &ctx.primitives, Some(elem_ty), None); -// +// // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let llvm_ndarray_t = ctx // .get_llvm_type(generator, ndarray_ty) // .into_pointer_type() // .get_element_type() // .into_struct_type(); -// +// // let ndarray = generator.gen_var_alloc(ctx, llvm_ndarray_t.into(), None)?; -// +// // Ok(NDArrayValue::from_ptr_val(ndarray, llvm_usize, None)) // } -// +// // /// Creates an `NDArray` instance from a dynamic shape. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -80,7 +80,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String>, // { // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // // Assert that all dimensions are non-negative // let shape_len = shape_len_fn(generator, ctx, shape)?; // gen_for_callback_incrementing( @@ -91,7 +91,7 @@ use nac3parser::ast::{Operator, StrRef}; // |generator, ctx, _, i| { // let shape_dim = shape_data_fn(generator, ctx, shape, i)?; // debug_assert!(shape_dim.get_type().get_bit_width() <= llvm_usize.get_bit_width()); -// +// // let shape_dim_gez = ctx // .builder // .build_int_compare( @@ -101,7 +101,7 @@ use nac3parser::ast::{Operator, StrRef}; // "", // ) // .unwrap(); -// +// // ctx.make_assert( // generator, // shape_dim_gez, @@ -110,22 +110,22 @@ use nac3parser::ast::{Operator, StrRef}; // [None, None, None], // ctx.current_loc, // ); -// +// // // TODO: Disallow dim_sz > u32_MAX -// +// // Ok(()) // }, // llvm_usize.const_int(1, false), // )?; -// +// // let ndarray = create_ndarray_uninitialized(generator, ctx, elem_ty)?; -// +// // let num_dims = shape_len_fn(generator, ctx, shape)?; // ndarray.store_ndims(ctx, generator, num_dims); -// +// // let ndarray_num_dims = ndarray.load_ndims(ctx); // ndarray.create_dim_sizes(ctx, llvm_usize, ndarray_num_dims); -// +// // // Copy the dimension sizes from shape to ndarray.dims // let shape_len = shape_len_fn(generator, ctx, shape)?; // gen_for_callback_incrementing( @@ -137,22 +137,22 @@ use nac3parser::ast::{Operator, StrRef}; // let shape_dim = shape_data_fn(generator, ctx, shape, i)?; // debug_assert!(shape_dim.get_type().get_bit_width() <= llvm_usize.get_bit_width()); // let shape_dim = ctx.builder.build_int_z_extend(shape_dim, llvm_usize, "").unwrap(); -// +// // let ndarray_pdim = // unsafe { ndarray.dim_sizes().ptr_offset_unchecked(ctx, generator, &i, None) }; -// +// // ctx.builder.build_store(ndarray_pdim, shape_dim).unwrap(); -// +// // Ok(()) // }, // llvm_usize.const_int(1, false), // )?; -// +// // let ndarray = ndarray_init_data(generator, ctx, elem_ty, ndarray); -// +// // Ok(ndarray) // } -// +// // /// Creates an `NDArray` instance from a constant shape. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -164,14 +164,14 @@ use nac3parser::ast::{Operator, StrRef}; // shape: &[IntValue<'ctx>], // ) -> Result, String> { // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // for &shape_dim in shape { // let shape_dim = ctx.builder.build_int_z_extend(shape_dim, llvm_usize, "").unwrap(); // let shape_dim_gez = ctx // .builder // .build_int_compare(IntPredicate::SGE, shape_dim, llvm_usize.const_zero(), "") // .unwrap(); -// +// // ctx.make_assert( // generator, // shape_dim_gez, @@ -180,18 +180,18 @@ use nac3parser::ast::{Operator, StrRef}; // [None, None, None], // ctx.current_loc, // ); -// +// // // TODO: Disallow dim_sz > u32_MAX // } -// +// // let ndarray = create_ndarray_uninitialized(generator, ctx, elem_ty)?; -// +// // let num_dims = llvm_usize.const_int(shape.len() as u64, false); // ndarray.store_ndims(ctx, generator, num_dims); -// +// // let ndarray_num_dims = ndarray.load_ndims(ctx); // ndarray.create_dim_sizes(ctx, llvm_usize, ndarray_num_dims); -// +// // for (i, &shape_dim) in shape.iter().enumerate() { // let shape_dim = ctx.builder.build_int_z_extend(shape_dim, llvm_usize, "").unwrap(); // let ndarray_dim = unsafe { @@ -202,15 +202,15 @@ use nac3parser::ast::{Operator, StrRef}; // None, // ) // }; -// +// // ctx.builder.build_store(ndarray_dim, shape_dim).unwrap(); // } -// +// // let ndarray = ndarray_init_data(generator, ctx, elem_ty, ndarray); -// +// // Ok(ndarray) // } -// +// // /// Initializes the `data` field of [`NDArrayValue`] based on the `ndims` and `dim_sz` fields. // fn ndarray_init_data<'ctx, G: CodeGenerator + ?Sized>( // generator: &mut G, @@ -220,7 +220,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> NDArrayValue<'ctx> { // let llvm_ndarray_data_t = ctx.get_llvm_type(generator, elem_ty).as_basic_type_enum(); // assert!(llvm_ndarray_data_t.is_sized()); -// +// // let ndarray_num_elems = call_ndarray_calc_size( // generator, // ctx, @@ -228,10 +228,10 @@ use nac3parser::ast::{Operator, StrRef}; // (None, None), // ); // ndarray.create_data(ctx, llvm_ndarray_data_t, ndarray_num_elems); -// +// // ndarray // } -// +// // fn ndarray_zero_value<'ctx, G: CodeGenerator + ?Sized>( // generator: &mut G, // ctx: &mut CodeGenContext<'ctx, '_>, @@ -257,7 +257,7 @@ use nac3parser::ast::{Operator, StrRef}; // unreachable!() // } // } -// +// // fn ndarray_one_value<'ctx, G: CodeGenerator + ?Sized>( // generator: &mut G, // ctx: &mut CodeGenContext<'ctx, '_>, @@ -285,7 +285,7 @@ use nac3parser::ast::{Operator, StrRef}; // unreachable!() // } // } -// +// // /// LLVM-typed implementation for generating the implementation for constructing an `NDArray`. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -307,13 +307,13 @@ use nac3parser::ast::{Operator, StrRef}; // shape: BasicValueEnum<'ctx>, // ) -> Result, String> { // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // match shape { // BasicValueEnum::PointerValue(shape_list_ptr) // if ListValue::is_instance(shape_list_ptr, llvm_usize).is_ok() => // { // // 1. A list of ints; e.g., `np.empty([600, 800, 3])` -// +// // let shape_list = ListValue::from_ptr_val(shape_list_ptr, llvm_usize, None); // create_ndarray_dyn_shape( // generator, @@ -329,10 +329,10 @@ use nac3parser::ast::{Operator, StrRef}; // BasicValueEnum::StructValue(shape_tuple) => { // // 2. A tuple of ints; e.g., `np.empty((600, 800, 3))` // // Read [`codegen::expr::gen_expr`] to see how `nac3core` translates a Python tuple into LLVM. -// +// // // Get the length/size of the tuple, which also happens to be the value of `ndims`. // let ndims = shape_tuple.get_type().count_fields(); -// +// // let mut shape = Vec::with_capacity(ndims as usize); // for dim_i in 0..ndims { // let dim = ctx @@ -340,20 +340,20 @@ use nac3parser::ast::{Operator, StrRef}; // .build_extract_value(shape_tuple, dim_i, format!("dim{dim_i}").as_str()) // .unwrap() // .into_int_value(); -// +// // shape.push(dim); // } // create_ndarray_const_shape(generator, ctx, elem_ty, shape.as_slice()) // } // BasicValueEnum::IntValue(shape_int) => { // // 3. A scalar int; e.g., `np.empty(3)`, this is functionally equivalent to `np.empty([3])` -// +// // create_ndarray_const_shape(generator, ctx, elem_ty, &[shape_int]) // } // _ => unreachable!(), // } // } -// +// // /// Generates LLVM IR for populating the entire `NDArray` using a lambda with its flattened index as // /// its input. // fn ndarray_fill_flattened<'ctx, 'a, G, ValueFn>( @@ -371,14 +371,14 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String>, // { // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let ndarray_num_elems = call_ndarray_calc_size( // generator, // ctx, // &ndarray.dim_sizes().as_slice_value(ctx, generator), // (None, None), // ); -// +// // gen_for_callback_incrementing( // generator, // ctx, @@ -386,16 +386,16 @@ use nac3parser::ast::{Operator, StrRef}; // (ndarray_num_elems, false), // |generator, ctx, _, i| { // let elem = unsafe { ndarray.data().ptr_offset_unchecked(ctx, generator, &i, None) }; -// +// // let value = value_fn(generator, ctx, i)?; // ctx.builder.build_store(elem, value).unwrap(); -// +// // Ok(()) // }, // llvm_usize.const_int(1, false), // ) // } -// +// // /// Generates LLVM IR for populating the entire `NDArray` using a lambda with the dimension-indices // /// as its input. // fn ndarray_fill_indexed<'ctx, 'a, G, ValueFn>( @@ -414,11 +414,11 @@ use nac3parser::ast::{Operator, StrRef}; // { // ndarray_fill_flattened(generator, ctx, ndarray, |generator, ctx, idx| { // let indices = call_ndarray_calc_nd_indices(generator, ctx, idx, ndarray); -// +// // value_fn(generator, ctx, &indices) // }) // } -// +// // fn ndarray_fill_mapping<'ctx, 'a, G, MapFn>( // generator: &mut G, // ctx: &mut CodeGenContext<'ctx, 'a>, @@ -436,11 +436,11 @@ use nac3parser::ast::{Operator, StrRef}; // { // ndarray_fill_flattened(generator, ctx, dest, |generator, ctx, i| { // let elem = unsafe { src.data().get_unchecked(ctx, generator, &i, None) }; -// +// // map_fn(generator, ctx, elem) // }) // } -// +// // /// Generates the LLVM IR for checking whether the source `ndarray` can be broadcast to the shape of // /// the target `ndarray`. // fn ndarray_assert_is_broadcastable<'ctx, G: CodeGenerator + ?Sized>( @@ -451,7 +451,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) { // let array_ndims = source.load_ndims(ctx); // let broadcast_size = target.load_ndims(ctx); -// +// // ctx.make_assert( // generator, // ctx.builder.build_int_compare(IntPredicate::ULE, array_ndims, broadcast_size, "").unwrap(), @@ -461,7 +461,7 @@ use nac3parser::ast::{Operator, StrRef}; // ctx.current_loc, // ); // } -// +// // /// Generates the LLVM IR for populating the entire `NDArray` from two `ndarray` or scalar value // /// with broadcast-compatible shapes. // fn ndarray_broadcast_fill<'ctx, 'a, G, ValueFn>( @@ -481,53 +481,53 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String>, // { // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let (lhs_val, lhs_scalar) = lhs; // let (rhs_val, rhs_scalar) = rhs; -// +// // assert!( // !(lhs_scalar && rhs_scalar), // "One of the operands must be a ndarray instance: `{}`, `{}`", // lhs_val.get_type(), // rhs_val.get_type() // ); -// +// // // Assert that all ndarray operands are broadcastable to the target size // if !lhs_scalar { // let lhs_val = NDArrayValue::from_ptr_val(lhs_val.into_pointer_value(), llvm_usize, None); // ndarray_assert_is_broadcastable(generator, ctx, res, lhs_val); // } -// +// // if !rhs_scalar { // let rhs_val = NDArrayValue::from_ptr_val(rhs_val.into_pointer_value(), llvm_usize, None); // ndarray_assert_is_broadcastable(generator, ctx, res, rhs_val); // } -// +// // ndarray_fill_indexed(generator, ctx, res, |generator, ctx, idx| { // let lhs_elem = if lhs_scalar { // lhs_val // } else { // let lhs = NDArrayValue::from_ptr_val(lhs_val.into_pointer_value(), llvm_usize, None); // let lhs_idx = call_ndarray_calc_broadcast_index(generator, ctx, lhs, idx); -// +// // unsafe { lhs.data().get_unchecked(ctx, generator, &lhs_idx, None) } // }; -// +// // let rhs_elem = if rhs_scalar { // rhs_val // } else { // let rhs = NDArrayValue::from_ptr_val(rhs_val.into_pointer_value(), llvm_usize, None); // let rhs_idx = call_ndarray_calc_broadcast_index(generator, ctx, rhs, idx); -// +// // unsafe { rhs.data().get_unchecked(ctx, generator, &rhs_idx, None) } // }; -// +// // value_fn(generator, ctx, (lhs_elem, rhs_elem)) // })?; -// +// // Ok(res) // } -// +// // /// LLVM-typed implementation for generating the implementation for `ndarray.zeros`. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -548,17 +548,17 @@ use nac3parser::ast::{Operator, StrRef}; // ctx.primitives.str, // ]; // assert!(supported_types.iter().any(|supported_ty| ctx.unifier.unioned(*supported_ty, elem_ty))); -// +// // let ndarray = call_ndarray_empty_impl(generator, ctx, elem_ty, shape)?; // ndarray_fill_flattened(generator, ctx, ndarray, |generator, ctx, _| { // let value = ndarray_zero_value(generator, ctx, elem_ty); -// +// // Ok(value) // })?; -// +// // Ok(ndarray) // } -// +// // /// LLVM-typed implementation for generating the implementation for `ndarray.ones`. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -579,17 +579,17 @@ use nac3parser::ast::{Operator, StrRef}; // ctx.primitives.str, // ]; // assert!(supported_types.iter().any(|supported_ty| ctx.unifier.unioned(*supported_ty, elem_ty))); -// +// // let ndarray = call_ndarray_empty_impl(generator, ctx, elem_ty, shape)?; // ndarray_fill_flattened(generator, ctx, ndarray, |generator, ctx, _| { // let value = ndarray_one_value(generator, ctx, elem_ty); -// +// // Ok(value) // })?; -// +// // Ok(ndarray) // } -// +// // /// LLVM-typed implementation for generating the implementation for `ndarray.full`. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -605,9 +605,9 @@ use nac3parser::ast::{Operator, StrRef}; // ndarray_fill_flattened(generator, ctx, ndarray, |generator, ctx, _| { // let value = if fill_value.is_pointer_value() { // let llvm_i1 = ctx.ctx.bool_type(); -// +// // let copy = generator.gen_var_alloc(ctx, fill_value.get_type(), None)?; -// +// // call_memcpy_generic( // ctx, // copy, @@ -615,20 +615,20 @@ use nac3parser::ast::{Operator, StrRef}; // fill_value.get_type().size_of().map(Into::into).unwrap(), // llvm_i1.const_zero(), // ); -// +// // copy.into() // } else if fill_value.is_int_value() || fill_value.is_float_value() { // fill_value // } else { // unreachable!() // }; -// +// // Ok(value) // })?; -// +// // Ok(ndarray) // } -// +// // /// Returns the number of dimensions for a multidimensional list as an [`IntValue`]. // fn llvm_ndlist_get_ndims<'ctx, G: CodeGenerator + ?Sized>( // generator: &G, @@ -636,24 +636,24 @@ use nac3parser::ast::{Operator, StrRef}; // ty: PointerType<'ctx>, // ) -> IntValue<'ctx> { // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let list_ty = ListType::from_type(ty, llvm_usize); // let list_elem_ty = list_ty.element_type(); -// +// // let ndims = llvm_usize.const_int(1, false); // match list_elem_ty { // AnyTypeEnum::PointerType(ptr_ty) if ListType::is_type(ptr_ty, llvm_usize).is_ok() => { // ndims.const_add(llvm_ndlist_get_ndims(generator, ctx, ptr_ty)) // } -// +// // AnyTypeEnum::PointerType(ptr_ty) if NDArrayType::is_type(ptr_ty, llvm_usize).is_ok() => { // todo!("Getting ndims for list[ndarray] not supported") // } -// +// // _ => ndims, // } // } -// +// // /// Returns the number of dimensions for an array-like object as an [`IntValue`]. // fn llvm_arraylike_get_ndims<'ctx, G: CodeGenerator + ?Sized>( // generator: &mut G, @@ -661,20 +661,20 @@ use nac3parser::ast::{Operator, StrRef}; // value: BasicValueEnum<'ctx>, // ) -> IntValue<'ctx> { // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // match value { // BasicValueEnum::PointerValue(v) if NDArrayValue::is_instance(v, llvm_usize).is_ok() => { // NDArrayValue::from_ptr_val(v, llvm_usize, None).load_ndims(ctx) // } -// +// // BasicValueEnum::PointerValue(v) if ListValue::is_instance(v, llvm_usize).is_ok() => { // llvm_ndlist_get_ndims(generator, ctx, v.get_type()) // } -// +// // _ => llvm_usize.const_zero(), // } // } -// +// // /// Flattens and copies the values from a multidimensional list into an [`NDArrayValue`]. // fn ndarray_from_ndlist_impl<'ctx, G: CodeGenerator + ?Sized>( // generator: &mut G, @@ -686,9 +686,9 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result<(), String> { // let llvm_i1 = ctx.ctx.bool_type(); // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let list_elem_ty = src_lst.get_type().element_type(); -// +// // match list_elem_ty { // AnyTypeEnum::PointerType(ptr_ty) if ListType::is_type(ptr_ty, llvm_usize).is_ok() => { // // The stride of elements in this dimension, i.e. the number of elements between arr[i] @@ -699,7 +699,7 @@ use nac3parser::ast::{Operator, StrRef}; // &dst_arr.dim_sizes(), // (Some(llvm_usize.const_int(dim + 1, false)), None), // ); -// +// // gen_for_range_callback( // generator, // ctx, @@ -709,17 +709,17 @@ use nac3parser::ast::{Operator, StrRef}; // |_, _| Ok(llvm_usize.const_int(1, false)), // |generator, ctx, i| { // let offset = ctx.builder.build_int_mul(stride, i, "").unwrap(); -// +// // let dst_ptr = // unsafe { ctx.builder.build_gep(dst_slice_ptr, &[offset], "").unwrap() }; -// +// // let nested_lst_elem = ListValue::from_ptr_val( // unsafe { src_lst.data().get_unchecked(ctx, generator, &i, None) } // .into_pointer_value(), // llvm_usize, // None, // ); -// +// // ndarray_from_ndlist_impl( // generator, // ctx, @@ -728,21 +728,21 @@ use nac3parser::ast::{Operator, StrRef}; // nested_lst_elem, // dim + 1, // )?; -// +// // Ok(()) // }, // )?; // } -// +// // AnyTypeEnum::PointerType(ptr_ty) if NDArrayType::is_type(ptr_ty, llvm_usize).is_ok() => { // todo!("Not implemented for list[ndarray]") // } -// +// // _ => { // let lst_len = src_lst.load_size(ctx, None); // let sizeof_elem = ctx.get_llvm_type(generator, elem_ty).size_of().unwrap(); // let sizeof_elem = ctx.builder.build_int_cast(sizeof_elem, llvm_usize, "").unwrap(); -// +// // let cpy_len = ctx // .builder // .build_int_mul( @@ -751,7 +751,7 @@ use nac3parser::ast::{Operator, StrRef}; // "", // ) // .unwrap(); -// +// // call_memcpy_generic( // ctx, // dst_slice_ptr, @@ -761,10 +761,10 @@ use nac3parser::ast::{Operator, StrRef}; // ); // } // } -// +// // Ok(()) // } -// +// // /// LLVM-typed implementation for `ndarray.array`. // fn call_ndarray_array_impl<'ctx, G: CodeGenerator + ?Sized>( // generator: &mut G, @@ -776,28 +776,28 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // let llvm_i1 = ctx.ctx.bool_type(); // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let ndmin = ctx.builder.build_int_z_extend_or_bit_cast(ndmin, llvm_usize, "").unwrap(); -// +// // // TODO(Derppening): Add assertions for sizes of different dimensions -// +// // // object is not a pointer - 0-dim NDArray // if !object.is_pointer_value() { // let ndarray = create_ndarray_const_shape(generator, ctx, elem_ty, &[])?; -// +// // unsafe { // ndarray.data().set_unchecked(ctx, generator, &llvm_usize.const_zero(), object); // } -// +// // return Ok(ndarray); // } -// +// // let object = object.into_pointer_value(); -// +// // // object is an NDArray instance - copy object unless copy=0 && ndmin < object.ndims // if NDArrayValue::is_instance(object, llvm_usize).is_ok() { // let object = NDArrayValue::from_ptr_val(object, llvm_usize, None); -// +// // let ndarray = gen_if_else_expr_callback( // generator, // ctx, @@ -810,7 +810,7 @@ use nac3parser::ast::{Operator, StrRef}; // .builder // .build_int_compare(IntPredicate::UGT, ndmin, object.load_ndims(ctx), "") // .unwrap(); -// +// // Ok(ctx.builder.build_and(copy_nez, ndmin_gt_ndims, "").unwrap()) // }, // |generator, ctx| { @@ -825,7 +825,7 @@ use nac3parser::ast::{Operator, StrRef}; // .builder // .build_int_compare(IntPredicate::UGT, ndmin, object.load_ndims(ctx), "") // .unwrap(); -// +// // Ok(ctx // .builder // .build_select(ndmin_gt_ndims, ndmin, ndims, "") @@ -837,7 +837,7 @@ use nac3parser::ast::{Operator, StrRef}; // let ndmin = llvm_intrinsics::call_int_umax(ctx, ndims, ndmin, None); // // The number of dimensions to prepend 1's to // let offset = ctx.builder.build_int_sub(ndmin, ndims, "").unwrap(); -// +// // Ok(gen_if_else_expr_callback( // generator, // ctx, @@ -854,7 +854,7 @@ use nac3parser::ast::{Operator, StrRef}; // .unwrap()) // }, // )?; -// +// // ndarray_sliced_copyto_impl( // generator, // ctx, @@ -864,28 +864,28 @@ use nac3parser::ast::{Operator, StrRef}; // 0, // &[], // )?; -// +// // Ok(Some(ndarray.as_base_value())) // }, // |_, _| Ok(Some(object.as_base_value())), // )?; -// +// // return Ok(NDArrayValue::from_ptr_val( // ndarray.map(BasicValueEnum::into_pointer_value).unwrap(), // llvm_usize, // None, // )); // } -// +// // // Remaining case: TList // assert!(ListValue::is_instance(object, llvm_usize).is_ok()); // let object = ListValue::from_ptr_val(object, llvm_usize, None); -// +// // // The number of dimensions to prepend 1's to // let ndims = llvm_ndlist_get_ndims(generator, ctx, object.as_base_value().get_type()); // let ndmin = llvm_intrinsics::call_int_umax(ctx, ndims, ndmin, None); // let offset = ctx.builder.build_int_sub(ndmin, ndims, "").unwrap(); -// +// // let ndarray = create_ndarray_dyn_shape( // generator, // ctx, @@ -895,7 +895,7 @@ use nac3parser::ast::{Operator, StrRef}; // let ndims = llvm_ndlist_get_ndims(generator, ctx, object.as_base_value().get_type()); // let ndmin_gt_ndims = // ctx.builder.build_int_compare(IntPredicate::UGT, ndmin, ndims, "").unwrap(); -// +// // Ok(ctx // .builder // .build_select(ndmin_gt_ndims, ndmin, ndims, "") @@ -917,11 +917,11 @@ use nac3parser::ast::{Operator, StrRef}; // false, // ) // }; -// +// // let llvm_i8 = ctx.ctx.i8_type(); // let llvm_list_i8 = make_llvm_list(llvm_i8.into()); // let llvm_plist_i8 = llvm_list_i8.ptr_type(AddressSpace::default()); -// +// // // Cast list to { i8*, usize } since we only care about the size // let lst = generator // .gen_var_alloc( @@ -938,7 +938,7 @@ use nac3parser::ast::{Operator, StrRef}; // .unwrap(), // ) // .unwrap(); -// +// // let stop = ctx.builder.build_int_sub(idx, offset, "").unwrap(); // gen_for_range_callback( // generator, @@ -950,7 +950,7 @@ use nac3parser::ast::{Operator, StrRef}; // |generator, ctx, _| { // let plist_plist_i8 = make_llvm_list(llvm_plist_i8.into()) // .ptr_type(AddressSpace::default()); -// +// // let this_dim = ctx // .builder // .build_load(lst, "") @@ -959,9 +959,9 @@ use nac3parser::ast::{Operator, StrRef}; // .map(BasicValueEnum::into_pointer_value) // .unwrap(); // let this_dim = ListValue::from_ptr_val(this_dim, llvm_usize, None); -// +// // // TODO: Assert this_dim.sz != 0 -// +// // let next_dim = unsafe { // this_dim.data().get_unchecked( // ctx, @@ -977,11 +977,11 @@ use nac3parser::ast::{Operator, StrRef}; // ctx.builder.build_bitcast(next_dim, llvm_plist_i8, "").unwrap(), // ) // .unwrap(); -// +// // Ok(()) // }, // )?; -// +// // let lst = ListValue::from_ptr_val( // ctx.builder // .build_load(lst, "") @@ -990,7 +990,7 @@ use nac3parser::ast::{Operator, StrRef}; // llvm_usize, // None, // ); -// +// // Ok(Some(lst.load_size(ctx, None))) // }, // )? @@ -998,7 +998,7 @@ use nac3parser::ast::{Operator, StrRef}; // .unwrap()) // }, // )?; -// +// // ndarray_from_ndlist_impl( // generator, // ctx, @@ -1007,10 +1007,10 @@ use nac3parser::ast::{Operator, StrRef}; // object, // 0, // )?; -// +// // Ok(ndarray) // } -// +// // /// LLVM-typed implementation for generating the implementation for `ndarray.eye`. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -1024,12 +1024,12 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // let llvm_i32 = ctx.ctx.i32_type(); // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let nrows = ctx.builder.build_int_z_extend_or_bit_cast(nrows, llvm_usize, "").unwrap(); // let ncols = ctx.builder.build_int_z_extend_or_bit_cast(ncols, llvm_usize, "").unwrap(); -// +// // let ndarray = create_ndarray_const_shape(generator, ctx, elem_ty, &[nrows, ncols])?; -// +// // ndarray_fill_indexed(generator, ctx, ndarray, |generator, ctx, indices| { // let (row, col) = unsafe { // ( @@ -1037,7 +1037,7 @@ use nac3parser::ast::{Operator, StrRef}; // indices.get_typed_unchecked(ctx, generator, &llvm_usize.const_int(1, false), None), // ) // }; -// +// // let col_with_offset = ctx // .builder // .build_int_add( @@ -1048,18 +1048,18 @@ use nac3parser::ast::{Operator, StrRef}; // .unwrap(); // let is_on_diag = // ctx.builder.build_int_compare(IntPredicate::EQ, row, col_with_offset, "").unwrap(); -// +// // let zero = ndarray_zero_value(generator, ctx, elem_ty); // let one = ndarray_one_value(generator, ctx, elem_ty); -// +// // let value = ctx.builder.build_select(is_on_diag, one, zero, "").unwrap(); -// +// // Ok(value) // })?; -// +// // Ok(ndarray) // } -// +// // /// Copies a slice of an [`NDArrayValue`] to another. // /// // /// - `dst_arr`: The [`NDArrayValue`] instance of the destination array. The `ndims` and `dim_sz` @@ -1083,7 +1083,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result<(), String> { // let llvm_i1 = ctx.ctx.bool_type(); // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // // If there are no (remaining) slice expressions, memcpy the entire dimension // if slices.is_empty() { // let stride = call_ndarray_calc_size( @@ -1094,12 +1094,12 @@ use nac3parser::ast::{Operator, StrRef}; // ); // let sizeof_elem = ctx.get_llvm_type(generator, elem_ty).size_of().unwrap(); // let cpy_len = ctx.builder.build_int_mul(stride, sizeof_elem, "").unwrap(); -// +// // call_memcpy_generic(ctx, dst_slice_ptr, src_slice_ptr, cpy_len, llvm_i1.const_zero()); -// +// // return Ok(()); // } -// +// // // The stride of elements in this dimension, i.e. the number of elements between arr[i] and // // arr[i + 1] in this dimension // let src_stride = call_ndarray_calc_size( @@ -1114,15 +1114,15 @@ use nac3parser::ast::{Operator, StrRef}; // &dst_arr.dim_sizes(), // (Some(llvm_usize.const_int(dim + 1, false)), None), // ); -// +// // let (start, stop, step) = slices[0]; // let start = ctx.builder.build_int_s_extend_or_bit_cast(start, llvm_usize, "").unwrap(); // let stop = ctx.builder.build_int_s_extend_or_bit_cast(stop, llvm_usize, "").unwrap(); // let step = ctx.builder.build_int_s_extend_or_bit_cast(step, llvm_usize, "").unwrap(); -// +// // let dst_i_addr = generator.gen_var_alloc(ctx, start.get_type().into(), None).unwrap(); // ctx.builder.build_store(dst_i_addr, start.get_type().const_zero()).unwrap(); -// +// // gen_for_range_callback( // generator, // ctx, @@ -1136,14 +1136,14 @@ use nac3parser::ast::{Operator, StrRef}; // let dst_i = // ctx.builder.build_load(dst_i_addr, "").map(BasicValueEnum::into_int_value).unwrap(); // let dst_data_offset = ctx.builder.build_int_mul(dst_stride, dst_i, "").unwrap(); -// +// // let (src_ptr, dst_ptr) = unsafe { // ( // ctx.builder.build_gep(src_slice_ptr, &[src_data_offset], "").unwrap(), // ctx.builder.build_gep(dst_slice_ptr, &[dst_data_offset], "").unwrap(), // ) // }; -// +// // ndarray_sliced_copyto_impl( // generator, // ctx, @@ -1153,20 +1153,20 @@ use nac3parser::ast::{Operator, StrRef}; // dim + 1, // &slices[1..], // )?; -// +// // let dst_i = // ctx.builder.build_load(dst_i_addr, "").map(BasicValueEnum::into_int_value).unwrap(); // let dst_i_add1 = // ctx.builder.build_int_add(dst_i, llvm_usize.const_int(1, false), "").unwrap(); // ctx.builder.build_store(dst_i_addr, dst_i_add1).unwrap(); -// +// // Ok(()) // }, // )?; -// +// // Ok(()) // } -// +// // /// Copies a [`NDArrayValue`] using slices. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -1181,7 +1181,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // let llvm_i32 = ctx.ctx.i32_type(); // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let ndarray = if slices.is_empty() { // create_ndarray_dyn_shape( // generator, @@ -1196,10 +1196,10 @@ use nac3parser::ast::{Operator, StrRef}; // } else { // let ndarray = create_ndarray_uninitialized(generator, ctx, elem_ty)?; // ndarray.store_ndims(ctx, generator, this.load_ndims(ctx)); -// +// // let ndims = this.load_ndims(ctx); // ndarray.create_dim_sizes(ctx, llvm_usize, ndims); -// +// // // Populate the first slices.len() dimensions by computing the size of each dim slice // for (i, (start, stop, step)) in slices.iter().enumerate() { // // HACK: workaround calculate_len_for_slice_range requiring exclusive stop @@ -1224,11 +1224,11 @@ use nac3parser::ast::{Operator, StrRef}; // ) // .map(BasicValueEnum::into_int_value) // .unwrap(); -// +// // let slice_len = calculate_len_for_slice_range(generator, ctx, *start, stop, *step); // let slice_len = // ctx.builder.build_int_z_extend_or_bit_cast(slice_len, llvm_usize, "").unwrap(); -// +// // unsafe { // ndarray.dim_sizes().set_typed_unchecked( // ctx, @@ -1238,7 +1238,7 @@ use nac3parser::ast::{Operator, StrRef}; // ); // } // } -// +// // // Populate the rest by directly copying the dim size from the source array // gen_for_callback_incrementing( // generator, @@ -1250,16 +1250,16 @@ use nac3parser::ast::{Operator, StrRef}; // let dim_sz = this.dim_sizes().get_typed_unchecked(ctx, generator, &idx, None); // ndarray.dim_sizes().set_typed_unchecked(ctx, generator, &idx, dim_sz); // } -// +// // Ok(()) // }, // llvm_usize.const_int(1, false), // ) // .unwrap(); -// +// // ndarray_init_data(generator, ctx, elem_ty, ndarray) // }; -// +// // ndarray_sliced_copyto_impl( // generator, // ctx, @@ -1269,10 +1269,10 @@ use nac3parser::ast::{Operator, StrRef}; // 0, // slices, // )?; -// +// // Ok(ndarray) // } -// +// // /// LLVM-typed implementation for generating the implementation for `ndarray.copy`. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -1284,7 +1284,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // ndarray_sliced_copy(generator, ctx, elem_ty, this, &[]) // } -// +// // pub fn ndarray_elementwise_unaryop_impl<'ctx, 'a, G, MapFn>( // generator: &mut G, // ctx: &mut CodeGenContext<'ctx, 'a>, @@ -1314,14 +1314,14 @@ use nac3parser::ast::{Operator, StrRef}; // ) // .unwrap() // }); -// +// // ndarray_fill_mapping(generator, ctx, operand, res, |generator, ctx, elem| { // map_fn(generator, ctx, elem) // })?; -// +// // Ok(res) // } -// +// // /// LLVM-typed implementation for computing elementwise binary operations on two input operands. // /// // /// If the operand is a `ndarray`, the broadcast index corresponding to each element in the output @@ -1359,26 +1359,26 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String>, // { // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // let (lhs_val, lhs_scalar) = lhs; // let (rhs_val, rhs_scalar) = rhs; -// +// // assert!( // !(lhs_scalar && rhs_scalar), // "One of the operands must be a ndarray instance: `{}`, `{}`", // lhs_val.get_type(), // rhs_val.get_type() // ); -// +// // let ndarray = res.unwrap_or_else(|| { // if lhs_scalar && rhs_scalar { // let lhs_val = // NDArrayValue::from_ptr_val(lhs_val.into_pointer_value(), llvm_usize, None); // let rhs_val = // NDArrayValue::from_ptr_val(rhs_val.into_pointer_value(), llvm_usize, None); -// +// // let ndarray_dims = call_ndarray_calc_broadcast(generator, ctx, lhs_val, rhs_val); -// +// // create_ndarray_dyn_shape( // generator, // ctx, @@ -1396,7 +1396,7 @@ use nac3parser::ast::{Operator, StrRef}; // llvm_usize, // None, // ); -// +// // create_ndarray_dyn_shape( // generator, // ctx, @@ -1410,14 +1410,14 @@ use nac3parser::ast::{Operator, StrRef}; // .unwrap() // } // }); -// +// // ndarray_broadcast_fill(generator, ctx, ndarray, lhs, rhs, |generator, ctx, elems| { // value_fn(generator, ctx, elems) // })?; -// +// // Ok(ndarray) // } -// +// // /// LLVM-typed implementation for computing matrix multiplication between two 2D `ndarray`s. // /// // /// * `elem_ty` - The element type of the `NDArray`. @@ -1433,11 +1433,11 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // let llvm_i32 = ctx.ctx.i32_type(); // let llvm_usize = generator.get_size_type(ctx.ctx); -// +// // if cfg!(debug_assertions) { // let lhs_ndims = lhs.load_ndims(ctx); // let rhs_ndims = rhs.load_ndims(ctx); -// +// // // lhs.ndims == 2 // ctx.make_assert( // generator, @@ -1449,7 +1449,7 @@ use nac3parser::ast::{Operator, StrRef}; // [None, None, None], // ctx.current_loc, // ); -// +// // // rhs.ndims == 2 // ctx.make_assert( // generator, @@ -1461,7 +1461,7 @@ use nac3parser::ast::{Operator, StrRef}; // [None, None, None], // ctx.current_loc, // ); -// +// // if let Some(res) = res { // let res_ndims = res.load_ndims(ctx); // let res_dim0 = unsafe { @@ -1486,7 +1486,7 @@ use nac3parser::ast::{Operator, StrRef}; // None, // ) // }; -// +// // // res.ndims == 2 // ctx.make_assert( // generator, @@ -1503,7 +1503,7 @@ use nac3parser::ast::{Operator, StrRef}; // [None, None, None], // ctx.current_loc, // ); -// +// // // res.dims[0] == lhs.dims[0] // ctx.make_assert( // generator, @@ -1513,7 +1513,7 @@ use nac3parser::ast::{Operator, StrRef}; // [None, None, None], // ctx.current_loc, // ); -// +// // // res.dims[1] == rhs.dims[0] // ctx.make_assert( // generator, @@ -1525,7 +1525,7 @@ use nac3parser::ast::{Operator, StrRef}; // ); // } // } -// +// // if ctx.registry.llvm_options.opt_level == OptimizationLevel::None { // let lhs_dim1 = unsafe { // lhs.dim_sizes().get_typed_unchecked( @@ -1538,7 +1538,7 @@ use nac3parser::ast::{Operator, StrRef}; // let rhs_dim0 = unsafe { // rhs.dim_sizes().get_typed_unchecked(ctx, generator, &llvm_usize.const_zero(), None) // }; -// +// // // lhs.dims[1] == rhs.dims[0] // ctx.make_assert( // generator, @@ -1549,13 +1549,13 @@ use nac3parser::ast::{Operator, StrRef}; // ctx.current_loc, // ); // } -// +// // let lhs = if res.is_some_and(|res| res.as_base_value() == lhs.as_base_value()) { // ndarray_copy_impl(generator, ctx, elem_ty, lhs)? // } else { // lhs // }; -// +// // let ndarray = res.unwrap_or_else(|| { // create_ndarray_dyn_shape( // generator, @@ -1599,9 +1599,9 @@ use nac3parser::ast::{Operator, StrRef}; // ) // .unwrap() // }); -// +// // let llvm_ndarray_ty = ctx.get_llvm_type(generator, elem_ty); -// +// // ndarray_fill_indexed(generator, ctx, ndarray, |generator, ctx, idx| { // llvm_intrinsics::call_expect( // ctx, @@ -1609,7 +1609,7 @@ use nac3parser::ast::{Operator, StrRef}; // idx.size(ctx, generator), // None, // ); -// +// // let common_dim = { // let lhs_idx1 = unsafe { // lhs.dim_sizes().get_typed_unchecked( @@ -1622,28 +1622,28 @@ use nac3parser::ast::{Operator, StrRef}; // let rhs_idx0 = unsafe { // rhs.dim_sizes().get_typed_unchecked(ctx, generator, &llvm_usize.const_zero(), None) // }; -// +// // let idx = llvm_intrinsics::call_expect(ctx, rhs_idx0, lhs_idx1, None); -// +// // ctx.builder.build_int_truncate(idx, llvm_i32, "").unwrap() // }; -// +// // let idx0 = unsafe { // let idx0 = idx.get_typed_unchecked(ctx, generator, &llvm_usize.const_zero(), None); -// +// // ctx.builder.build_int_truncate(idx0, llvm_i32, "").unwrap() // }; // let idx1 = unsafe { // let idx1 = // idx.get_typed_unchecked(ctx, generator, &llvm_usize.const_int(1, false), None); -// +// // ctx.builder.build_int_truncate(idx1, llvm_i32, "").unwrap() // }; -// +// // let result_addr = generator.gen_var_alloc(ctx, llvm_ndarray_ty, None)?; // let result_identity = ndarray_zero_value(generator, ctx, elem_ty); // ctx.builder.build_store(result_addr, result_identity).unwrap(); -// +// // gen_for_callback_incrementing( // generator, // ctx, @@ -1651,18 +1651,18 @@ use nac3parser::ast::{Operator, StrRef}; // (common_dim, false), // |generator, ctx, _, i| { // let i = ctx.builder.build_int_truncate(i, llvm_i32, "").unwrap(); -// +// // let ab_idx = generator.gen_array_var_alloc( // ctx, // llvm_i32.into(), // llvm_usize.const_int(2, false), // None, // )?; -// +// // let a = unsafe { // ab_idx.set_unchecked(ctx, generator, &llvm_usize.const_zero(), idx0.into()); // ab_idx.set_unchecked(ctx, generator, &llvm_usize.const_int(1, false), i.into()); -// +// // lhs.data().get_unchecked(ctx, generator, &ab_idx, None) // }; // let b = unsafe { @@ -1673,10 +1673,10 @@ use nac3parser::ast::{Operator, StrRef}; // &llvm_usize.const_int(1, false), // idx1.into(), // ); -// +// // rhs.data().get_unchecked(ctx, generator, &ab_idx, None) // }; -// +// // let a_mul_b = gen_binop_expr_with_values( // generator, // ctx, @@ -1687,7 +1687,7 @@ use nac3parser::ast::{Operator, StrRef}; // )? // .unwrap() // .to_basic_value_enum(ctx, generator, elem_ty)?; -// +// // let result = ctx.builder.build_load(result_addr, "").unwrap(); // let result = gen_binop_expr_with_values( // generator, @@ -1700,19 +1700,19 @@ use nac3parser::ast::{Operator, StrRef}; // .unwrap() // .to_basic_value_enum(ctx, generator, elem_ty)?; // ctx.builder.build_store(result_addr, result).unwrap(); -// +// // Ok(()) // }, // llvm_usize.const_int(1, false), // )?; -// +// // let result = ctx.builder.build_load(result_addr, "").unwrap(); // Ok(result) // })?; -// +// // Ok(ndarray) // } -// +// // /// Generates LLVM IR for `ndarray.empty`. // pub fn gen_ndarray_empty<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, @@ -1723,14 +1723,14 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // assert!(obj.is_none()); // assert_eq!(args.len(), 1); -// +// // let shape_ty = fun.0.args[0].ty; // let shape_arg = args[0].1.clone().to_basic_value_enum(context, generator, shape_ty)?; -// +// // call_ndarray_empty_impl(generator, context, context.primitives.float, shape_arg) // .map(NDArrayValue::into) // } -// +// // /// Generates LLVM IR for `ndarray.zeros`. // pub fn gen_ndarray_zeros<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, @@ -1741,14 +1741,14 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // assert!(obj.is_none()); // assert_eq!(args.len(), 1); -// +// // let shape_ty = fun.0.args[0].ty; // let shape_arg = args[0].1.clone().to_basic_value_enum(context, generator, shape_ty)?; -// +// // call_ndarray_zeros_impl(generator, context, context.primitives.float, shape_arg) // .map(NDArrayValue::into) // } -// +// // /// Generates LLVM IR for `ndarray.ones`. // pub fn gen_ndarray_ones<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, @@ -1759,14 +1759,14 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // assert!(obj.is_none()); // assert_eq!(args.len(), 1); -// +// // let shape_ty = fun.0.args[0].ty; // let shape_arg = args[0].1.clone().to_basic_value_enum(context, generator, shape_ty)?; -// +// // call_ndarray_ones_impl(generator, context, context.primitives.float, shape_arg) // .map(NDArrayValue::into) // } -// +// // /// Generates LLVM IR for `ndarray.full`. // pub fn gen_ndarray_full<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, @@ -1777,17 +1777,17 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // assert!(obj.is_none()); // assert_eq!(args.len(), 2); -// +// // let shape_ty = fun.0.args[0].ty; // let shape_arg = args[0].1.clone().to_basic_value_enum(context, generator, shape_ty)?; // let fill_value_ty = fun.0.args[1].ty; // let fill_value_arg = // args[1].1.clone().to_basic_value_enum(context, generator, fill_value_ty)?; -// +// // call_ndarray_full_impl(generator, context, fill_value_ty, shape_arg, fill_value_arg) // .map(NDArrayValue::into) // } -// +// // pub fn gen_ndarray_array<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, // obj: &Option<(Type, ValueEnum<'ctx>)>, @@ -1797,13 +1797,13 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // assert!(obj.is_none()); // assert!(matches!(args.len(), 1..=3)); -// +// // let obj_ty = fun.0.args[0].ty; // let obj_elem_ty = match &*context.unifier.get_ty(obj_ty) { // TypeEnum::TObj { obj_id, .. } if *obj_id == PrimDef::NDArray.id() => { // unpack_ndarray_var_tys(&mut context.unifier, obj_ty).0 // } -// +// // TypeEnum::TObj { obj_id, params, .. } if *obj_id == PrimDef::List.id() => { // let mut ty = *params.iter().next().unwrap().1; // while let TypeEnum::TObj { obj_id, params, .. } = &*context.unifier.get_ty_immutable(ty) @@ -1811,16 +1811,16 @@ use nac3parser::ast::{Operator, StrRef}; // if *obj_id != PrimDef::List.id() { // break; // } -// +// // ty = *params.iter().next().unwrap().1; // } // ty // } -// +// // _ => obj_ty, // }; // let obj_arg = args[0].1.clone().to_basic_value_enum(context, generator, obj_ty)?; -// +// // let copy_arg = if let Some(arg) = // args.iter().find(|arg| arg.0.is_some_and(|name| name == fun.0.args[1].name)) // { @@ -1833,7 +1833,7 @@ use nac3parser::ast::{Operator, StrRef}; // fun.0.args[1].ty, // ) // }; -// +// // let ndmin_arg = if let Some(arg) = // args.iter().find(|arg| arg.0.is_some_and(|name| name == fun.0.args[2].name)) // { @@ -1846,7 +1846,7 @@ use nac3parser::ast::{Operator, StrRef}; // fun.0.args[2].ty, // ) // }; -// +// // call_ndarray_array_impl( // generator, // context, @@ -1857,7 +1857,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) // .map(NDArrayValue::into) // } -// +// // /// Generates LLVM IR for `ndarray.eye`. // pub fn gen_ndarray_eye<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, @@ -1868,10 +1868,10 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // assert!(obj.is_none()); // assert!(matches!(args.len(), 1..=3)); -// +// // let nrows_ty = fun.0.args[0].ty; // let nrows_arg = args[0].1.clone().to_basic_value_enum(context, generator, nrows_ty)?; -// +// // let ncols_ty = fun.0.args[1].ty; // let ncols_arg = if let Some(arg) = // args.iter().find(|arg| arg.0.is_some_and(|name| name == fun.0.args[1].name)) @@ -1880,7 +1880,7 @@ use nac3parser::ast::{Operator, StrRef}; // } else { // args[0].1.clone().to_basic_value_enum(context, generator, nrows_ty) // }?; -// +// // let offset_ty = fun.0.args[2].ty; // let offset_arg = if let Some(arg) = // args.iter().find(|arg| arg.0.is_some_and(|name| name == fun.0.args[2].name)) @@ -1893,7 +1893,7 @@ use nac3parser::ast::{Operator, StrRef}; // offset_ty, // )) // }?; -// +// // call_ndarray_eye_impl( // generator, // context, @@ -1904,7 +1904,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) // .map(NDArrayValue::into) // } -// +// // /// Generates LLVM IR for `ndarray.identity`. // pub fn gen_ndarray_identity<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, @@ -1915,12 +1915,12 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // assert!(obj.is_none()); // assert_eq!(args.len(), 1); -// +// // let llvm_usize = generator.get_size_type(context.ctx); -// +// // let n_ty = fun.0.args[0].ty; // let n_arg = args[0].1.clone().to_basic_value_enum(context, generator, n_ty)?; -// +// // call_ndarray_eye_impl( // generator, // context, @@ -1931,7 +1931,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) // .map(NDArrayValue::into) // } -// +// // /// Generates LLVM IR for `ndarray.copy`. // pub fn gen_ndarray_copy<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, @@ -1942,14 +1942,14 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result, String> { // assert!(obj.is_some()); // assert!(args.is_empty()); -// +// // let llvm_usize = generator.get_size_type(context.ctx); -// +// // let this_ty = obj.as_ref().unwrap().0; // let (this_elem_ty, _) = unpack_ndarray_var_tys(&mut context.unifier, this_ty); // let this_arg = // obj.as_ref().unwrap().1.clone().to_basic_value_enum(context, generator, this_ty)?; -// +// // ndarray_copy_impl( // generator, // context, @@ -1958,7 +1958,7 @@ use nac3parser::ast::{Operator, StrRef}; // ) // .map(NDArrayValue::into) // } -// +// // /// Generates LLVM IR for `ndarray.fill`. // pub fn gen_ndarray_fill<'ctx>( // context: &mut CodeGenContext<'ctx, '_>, @@ -1969,9 +1969,9 @@ use nac3parser::ast::{Operator, StrRef}; // ) -> Result<(), String> { // assert!(obj.is_some()); // assert_eq!(args.len(), 1); -// +// // let llvm_usize = generator.get_size_type(context.ctx); -// +// // let this_ty = obj.as_ref().unwrap().0; // let this_arg = obj // .as_ref() @@ -1982,7 +1982,7 @@ use nac3parser::ast::{Operator, StrRef}; // .into_pointer_value(); // let value_ty = fun.0.args[0].ty; // let value_arg = args[0].1.clone().to_basic_value_enum(context, generator, value_ty)?; -// +// // ndarray_fill_flattened( // generator, // context, @@ -1990,9 +1990,9 @@ use nac3parser::ast::{Operator, StrRef}; // |generator, ctx, _| { // let value = if value_arg.is_pointer_value() { // let llvm_i1 = ctx.ctx.bool_type(); -// +// // let copy = generator.gen_var_alloc(ctx, value_arg.get_type(), None)?; -// +// // call_memcpy_generic( // ctx, // copy, @@ -2000,18 +2000,18 @@ use nac3parser::ast::{Operator, StrRef}; // value_arg.get_type().size_of().map(Into::into).unwrap(), // llvm_i1.const_zero(), // ); -// +// // copy.into() // } else if value_arg.is_int_value() || value_arg.is_float_value() { // value_arg // } else { // unreachable!() // }; -// +// // Ok(value) // }, // )?; -// +// // Ok(()) // } -// \ No newline at end of file +//