Improve printf() : Less jumps (cmovX), removal of finish_L/rbx mod

This commit is contained in:
2025-06-25 20:48:53 +02:00
parent cef713db14
commit 9d904555eb

View File

@ -65,7 +65,7 @@ printf:
cmp byte [rdi], 0x0
je .finish
cmp r14, bufferLength-1
je .finish_L
je .finish
cmp byte [rdi], '%'
je .replaceArg
mov r12b, byte [rdi]
@ -94,34 +94,23 @@ printf:
;--- %d ---;
.rep_d:
cmp r10, 0
je .rep_d_rsi
cmove rdi, rsi
je .convertInt
cmp r10, 1
je .rep_d_rdx
cmove rdi, rdx
je .convertInt
cmp r10, 2
je .rep_d_rcx
cmove rdi, rcx
je .convertInt
cmp r10, 3
je .rep_d_r8
cmove rdi, r8
je .convertInt
cmp r10, 4
je .rep_d_r9
cmove rdi, r9
je .convertInt
;get from stack
mov rdi, qword [rbp + 16 + (r10-5)*8]
jmp .convertInt
.rep_d_rsi:
mov rdi, rsi
jmp .convertInt
.rep_d_rdx:
mov rdi, rdx
jmp .convertInt
.rep_d_rcx:
mov rdi, rcx
jmp .convertInt
.rep_d_r8:
mov rdi, r8
jmp .convertInt
.rep_d_r9:
mov rdi, r9
.convertInt:
lea rsi, [rel printfNBuff]
@ -148,82 +137,61 @@ printf:
;--- %c ---;
.rep_c:
cmp r10, 0
je .rep_c_rsi
cmove rdi, rsi
je .charToStr
cmp r10, 1
je .rep_c_rdx
cmove rdi, rdx
je .charToStr
cmp r10, 2
je .rep_c_rcx
cmove rdi, rcx
je .charToStr
cmp r10, 3
je .rep_c_r8
cmove rdi, r8
je .charToStr
cmp r10, 4
je .rep_c_r9
cmove rdi, r9
je .charToStr
;get from stack
mov rdi, qword [rbp + 16 + (r10-5)*8]
jmp .charToStr
.rep_c_rsi:
mov rdi, rsi
jmp .charToStr
.rep_c_rdx:
mov rdi, rdx
jmp .charToStr
.rep_c_rcx:
mov rdi, rcx
jmp .charToStr
.rep_c_r8:
mov rdi, r8
jmp .charToStr
.rep_c_r9:
mov rdi, r9
jmp .charToStr
.charToStr:
mov [printfNBuff], dil
inc r14
cmp r14, bufferLength-1
je .finish_L
je .finish
mov dil, 0
mov [printfNBuff+1], dil
inc r14
cmp r14, bufferLength-1
je .finish_L
je .finish
lea rsi, [rel printfNBuff]
jmp .insertLoop
;--- %s ---;
.rep_s:
cmp r10, 0
je .insertLoop ;nothing to do, rsi already correct
je .insertLoop
cmp r10, 1
je .rep_s_rdx
cmove rsi, rdx
je .insertLoop
cmp r10, 2
je .rep_s_rcx
cmove rsi, rcx
je .insertLoop
cmp r10, 3
je .rep_s_r8
cmove rsi, r8
je .insertLoop
cmp r10, 4
je .rep_s_r9
cmove rsi, r9
je .insertLoop
;get from stack
mov rsi, qword [rbp + 16 + (r10-5)*8]
jmp .insertLoop
.rep_s_rdx:
mov rsi, rdx
jmp .insertLoop
.rep_s_rcx:
mov rsi, rcx
jmp .insertLoop
.rep_s_r8:
mov rsi, r8
jmp .insertLoop
.rep_s_r9:
mov rsi, r9
;--- Move fetched data to buffer ---;
.insertLoop:
cmp r14, bufferLength-1
je .finish_L
je .finish
cmp byte [rsi], 0x0
je .s0f
mov r12b, byte [rsi]
@ -242,9 +210,6 @@ printf:
inc r11
jmp .makeStr
.finish_L:
mov rbx, 1
.finish:
mov byte [r11], 0x0
lea rdi, [rel printfBuff]