Interested in Implementation of Big Integers (u256, u1024, u3141, etc.)

You’re absolutely right! (for all intents and purposes this is a joke please don’t ban me)

Anyways, changing the program to this:

const std = @import("std");

pub noinline fn foobarbaz(x: u1024, y: u1024) u1024 {
    return x + y;
}

pub fn main(process: std.process.Init) !void {
    var stdin_buffer: [1024]u8 = undefined;
    var stdin_reader = std.Io.File.stdin().reader(process.io, &stdin_buffer);

    var in = try stdin_reader.interface.takeDelimiterExclusive('\n');
    stdin_reader.interface.toss(1);
    const x = try std.fmt.parseInt(u1024, in, 10);
    in = try stdin_reader.interface.takeDelimiterExclusive('\n');
    stdin_reader.interface.toss(1);
    const y = try std.fmt.parseInt(u1024, in, 10);

    std.debug.print("{}\n", .{foobarbaz(x, y)});
}

(reading from stdin ripped straight from Right way to read user input from stdin in zig 0.15.2 )
and looking at the assembly I see:

main.foobarbaz:
	.cfi_startproc
	push	rbp
	.cfi_def_cfa_offset 16
	.cfi_offset rbp, -16
	mov	rbp, rsp
	.cfi_def_cfa_register rbp
	add	rsi, qword ptr [rbp + 104]
	mov	rax, rdi
	adc	rdx, qword ptr [rbp + 112]
	adc	rcx, qword ptr [rbp + 120]
	adc	r8, qword ptr [rbp + 128]
	mov	qword ptr [rdi + 16], rcx
	mov	rcx, qword ptr [rbp + 144]
	mov	qword ptr [rdi + 8], rdx
	mov	qword ptr [rdi], rsi
	mov	rsi, qword ptr [rbp + 152]
	mov	rdx, qword ptr [rbp + 160]
	adc	r9, qword ptr [rbp + 136]
	mov	qword ptr [rdi + 24], r8
	adc	rcx, qword ptr [rbp + 16]
	mov	qword ptr [rdi + 32], r9
	adc	rsi, qword ptr [rbp + 24]
	mov	qword ptr [rdi + 40], rcx
	adc	rdx, qword ptr [rbp + 32]
	mov	qword ptr [rdi + 48], rsi
	mov	rsi, qword ptr [rbp + 168]
	adc	rsi, qword ptr [rbp + 40]
	mov	qword ptr [rdi + 56], rdx
	mov	rdx, qword ptr [rbp + 176]
	adc	rdx, qword ptr [rbp + 48]
	mov	qword ptr [rdi + 64], rsi
	mov	rsi, qword ptr [rbp + 184]
	adc	rsi, qword ptr [rbp + 56]
	mov	qword ptr [rdi + 72], rdx
	mov	rdx, qword ptr [rbp + 192]
	adc	rdx, qword ptr [rbp + 64]
	mov	qword ptr [rdi + 80], rsi
	mov	rsi, qword ptr [rbp + 200]
	adc	rsi, qword ptr [rbp + 72]
	mov	qword ptr [rdi + 88], rdx
	mov	rdx, qword ptr [rbp + 208]
	adc	rdx, qword ptr [rbp + 80]
	mov	qword ptr [rdi + 96], rsi
	mov	rsi, qword ptr [rbp + 216]
	adc	rsi, qword ptr [rbp + 88]
	mov	qword ptr [rdi + 104], rdx
	mov	rdx, qword ptr [rbp + 224]
	adc	rdx, qword ptr [rbp + 96]
	mov	qword ptr [rdi + 112], rsi
	mov	qword ptr [rdi + 120], rdx
	pop	rbp
	.cfi_def_cfa rsp, 8
	ret

Which looks more approachable. I think I should go sleep now but I’ll try to understand what this does tomorrow. Thanks!

1 Like