printf(): Fetch args smarter (fetch from memory, slower, but also less opcodes/compares, and convenient for future;less repeatability)

This commit is contained in:
2025-06-29 12:08:19 +02:00
parent 8ab78baa35
commit 9ea889dd12
2 changed files with 20 additions and 45 deletions

View File

@ -54,6 +54,7 @@ section .rodata
section .bss
printfBuff resb bufferLength
printfNBuff resb 32
printfArgs resq 8*5
section .text
global print
global puts
@ -94,6 +95,12 @@ printf:
push r14 ;current index of printfBuff
push r15 ;where to return after flush
mov [printfArgs], rsi
mov [printfArgs+8], rdx
mov [printfArgs+16], rcx
mov [printfArgs+24], r8
mov [printfArgs+32], r9
xor r10, r10
xor r14, r14
lea r11, [rel printfBuff]
@ -131,22 +138,11 @@ printf:
;--- %d ---;
.rep_d:
cmp r10, 0
cmove rdi, rsi
je .convertInt
cmp r10, 1
cmove rdi, rdx
je .convertInt
cmp r10, 2
cmove rdi, rcx
je .convertInt
cmp r10, 3
cmove rdi, r8
je .convertInt
cmp r10, 4
cmove rdi, r9
je .convertInt
ja .d_fromStack
mov rdi, [printfArgs + r10*8]
jmp .convertInt
.d_fromStack:
mov rdi, qword [rbp + 16 + (r10-5)*8]
.convertInt:
@ -171,22 +167,11 @@ printf:
;--- %c ---;
.rep_c:
cmp r10, 0
cmove rdi, rsi
je .charToStr
cmp r10, 1
cmove rdi, rdx
je .charToStr
cmp r10, 2
cmove rdi, rcx
je .charToStr
cmp r10, 3
cmove rdi, r8
je .charToStr
cmp r10, 4
cmove rdi, r9
je .charToStr
ja .c_fromStack
mov rdi, [printfArgs + r10*8]
jmp .charToStr
.c_fromStack:
mov rdi, qword [rbp + 16 + (r10-5)*8]
.charToStr:
@ -198,21 +183,11 @@ printf:
;--- %s ---;
.rep_s:
cmp r10, 0
je .insertLoop
cmp r10, 1
cmove rsi, rdx
je .insertLoop
cmp r10, 2
cmove rsi, rcx
je .insertLoop
cmp r10, 3
cmove rsi, r8
je .insertLoop
cmp r10, 4
cmove rsi, r9
je .insertLoop
ja .s_fromStack
mov rsi, [printfArgs + r10*8]
jmp .insertLoop
.s_fromStack:
mov rsi, qword [rbp + 16 + (r10-5)*8]
;--- Move fetched data to buffer ---;

View File

@ -252,7 +252,7 @@ _start:
push 0
push tS6
push tS5
push qword [num4]
push qword [rel num4]
call printf
add rsp, 8*8
mov rsi, rax