summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/i386/ltostr.S
blob: ddf85a4f698a0fbb34c7f8f711f6723dd2169e8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
   Copyright (C) 2002 Thomas M. Ogrisegg 

   __ltostr.S -- convert an integer into a string

 %eax = dividend
 %ebx = divisor
 %ecx = size of output-buffer
 %edi = output-buffer
 %ebp = if uppercase is set, then %ebp is 'A'-10 else %ebp is 'a'-10

*/

.text
.globl __ltostr
__ltostr:
	pushl %esi
	pushl %edi		# destination
	pushl %ebp
	pushl %ebx
	movl %esp, %eax
	movl 0x14(%eax), %edi
	movl 0x18(%eax), %ecx	# size
	movl 0x20(%eax), %ebx	# divisor
	movl 0x1c(%eax), %eax	# dividend
	decl %ecx
	movl %ecx, %esi
	movl $('A'-0xa), %ebp
	xorl %edx, %edx		# must be 0 -- used by idiv
	cmpl $0x0, 36(%esp)	# check for uppercase
	jnz .Lnext
	addl $0x20, %ebp	# set lowercase
.Lnext:
	idiv %ebx, %eax
	cmpb $0x9, %dl
	jg .Lnext2
	addb $'0', %dl
	jmp .Lstos
.Lnext2:
	addl %ebp, %edx
.Lstos:
	movb %dl, (%edi, %ecx)
	xorl %edx, %edx
	decl %ecx
	jz .Lout
	orl %eax, %eax
	jnz .Lnext
.Lout:
	cld
	movl %esi, %ebx
	leal 1(%edi, %ecx), %esi
	subl %ebx, %ecx
	negl %ecx
	movl %ecx, %eax
	repnz movsb
	movb $0x0, (%edi)
	popl %ebx
	popl %ebp
	popl %edi
	popl %esi
	ret
.size __ltostr, . - __ltostr