#casting on assignment

1 messages · Page 1 of 1 (latest)

lost olive
#

I can't make a casted copy of the slice as it should be passed by reference

#

currently

static void scale_accum_twice(digit_t *restrict accum1,
                              digit_t *restrict accum2, digit_t const *const a,
                              dbdgt_t const scale1, dbdgt_t const scale2,
                              size_t const ndigits) {
  dbdgt_t carry1 = 0;
  dbdgt_t carry2 = 0;
  for (size_t offset = 0; offset < ndigits; ++offset) {
    dbdgt_t const adig = a[offset];

    dbdgt_t const acc1 = ((dbdgt_t)accum1[offset]) + adig * scale1 + carry1;
    accum1[offset] = (digit_t)acc1;
    carry1 = acc1 >> DIGIT_BIT;

    dbdgt_t const acc2 = ((dbdgt_t)accum2[offset]) + adig * scale2 + carry2;
    accum2[offset] = (digit_t)acc2;
    carry2 = acc2 >> DIGIT_BIT;
  }
  *(dbdgt_t *)&accum1[ndigits] += carry1;
  *(dbdgt_t *)&accum2[ndigits] += carry2;
}
fn scale_accum_twice(accum1: []digit_t, accum2: []digit_t, a: []const digit_t, scale1: dbdgt_t, scale2: dbdgt_t, ndigits: usize) void {
    var carry1: dbdgt_t = 0;
    var carry2: dbdgt_t = 0;
    var offset: usize = 0;
    while (offset < ndigits) : (offset += 1) {
        const adig: dbdgt_t = a[offset];

        const acc1 = @as(dbdgt_t, @intCast(accum1[offset])) + adig * scale1 + carry1;
        accum1[offset] = @intCast(acc1);
        carry1 = acc1 >> DIGIT_BIT;

        const acc2 = @as(dbdgt_t, @intCast(accum2[offset])) + adig * scale2 + carry2;
        accum2[offset] = @intCast(acc2);
        carry2 = acc2 >> DIGIT_BIT;
    }
    accum1[ndigits] += carry1;
    accum2[ndigits] += carry2;
}
src/implementations/fastexp.zig:64:24: error: expected type 'u64', found 'u128'
    accum1[ndigits] += carry1;
swift pecan
#

i think you would need the accum1 buffer aligned to what u128 is aligned to, then @as(*dbdgt_t, @ptrCast(&accum1[ndigits])).* += carry1 should work.