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