public Emitter arrset(MethodBase setter) { setter.IsArraySetter().AssertTrue(); var n_dims = setter.Paramc() - 1; var value = pop_expr(); var indices = 0.UpTo(n_dims - 1).Select(_ => _stk.Pop()).Reverse().ToReadOnly(); var arr = pop_arr(); indices.ForEach(idx => _stk.Push(idx)); calc_offset(arr, n_dims); var el_t = arr.Node.Type().GetElementType(); var r_offset = (Reg)pop_expr(); _ptx.Add(new st{ss = arr.Space, type = el_t, a = r_offset, b = value}); return this; }
public Emitter arrget(MethodBase getter) { getter.IsArrayGetter().AssertTrue(); var n_dims = getter.Paramc(); var indices = 0.UpTo(n_dims - 1).Select(_ => _stk.Pop()).Reverse().ToReadOnly(); var arr = pop_arr(); indices.ForEach(idx => _stk.Push(idx)); calc_offset(arr, n_dims); var el_t = arr.Node.Type().GetElementType(); var d = def_local(el_t); var r_offset = (Reg)pop_expr(); _ptx.Add(new ld{ss = arr.Space, type = el_t, d = d, a = r_offset}); push(d); return this; }