From 8092f4c334db547ced59d6f439b558dad35e1ab2 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Fri, 14 Jun 2024 09:23:32 +0200 Subject: commit for once --- .../40_diagonal_elements.c | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 3/8_array_allocation_and_access/40_diagonal_elements.c (limited to '3/8_array_allocation_and_access/40_diagonal_elements.c') diff --git a/3/8_array_allocation_and_access/40_diagonal_elements.c b/3/8_array_allocation_and_access/40_diagonal_elements.c new file mode 100644 index 0000000..ab541db --- /dev/null +++ b/3/8_array_allocation_and_access/40_diagonal_elements.c @@ -0,0 +1,48 @@ +// A in rdi, val in rsi +// fix_set_diag: +// movl $0, %eax +// .L13 +// movl %esi, (%rdi, %rax) +// addq $68, %rax +// cmpq $1088, %rax +// jne .L13 +// rep; ret +#include +#define N 16 +typedef int fix_matrix[N][N]; + +void fix_set_diag(fix_matrix A, int val) { + long i; + for (i = 0; i < N; i++) { + A[i][i] = val; + } +} + +void fix_set_diag_opt(fix_matrix A, int val) { + int *Aptr = &A[0][0]; + int *Aend = &A[N][N]; + do { + *Aptr = val; + Aptr += N; // Next row + Aptr ++; // Next column + } while (Aptr != Aend); +} + +int main(void) { + int i, j; + fix_matrix A; + for (i=0; i < N; i++) { + for (j=0; j < N; j++) { + A[i][j] = 0; + } + } + + i, j = 0, 0; + fix_set_diag_opt(A, 1); + for (i=0; i < N; i++) { + for (j=0; j < N; j++) { + printf("%ld", A[i][j]); + } + printf("\n"); + } +} -- cgit v1.2.3