Is it possible to replicate this C behavior?
*(dbdgt_t *)&accum1[ndigits] += carry1;
considering
accum1: []digit_t ([]u64)
carry1: dbdgt_t (u128)
1 messages · Page 1 of 1 (latest)
Is it possible to replicate this C behavior?
*(dbdgt_t *)&accum1[ndigits] += carry1;
considering
accum1: []digit_t ([]u64)
carry1: dbdgt_t (u128)
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;
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.