diff --git a/rtl/i386/i386.inc b/rtl/i386/i386.inc index 5a769962fa..67d7a4e63e 100644 --- a/rtl/i386/i386.inc +++ b/rtl/i386/i386.inc @@ -1095,7 +1095,6 @@ end; {**************************************************************************** Str() ****************************************************************************} -{$ifdef disabled} {$define FPC_SYSTEM_HAS_INT_STR_LONGWORD} {$define FPC_SYSTEM_HAS_INT_STR_LONGINT} @@ -1105,6 +1104,7 @@ label str_int_shortcut; procedure int_str(l:longword;out s:string);assembler;nostackframe; asm + pushl %esi pushl %edi pushl %ebx mov %edx,%edi @@ -1121,6 +1121,7 @@ const digits:array[0..9] of cardinal=(0,10,100,1000,10000, 100000000,1000000000); asm + push %esi push %edi push %ebx movl %edx,%edi @@ -1131,6 +1132,7 @@ asm subl %edx,%eax negl %edx str_int_shortcut: + movl %ecx,%esi {Calculate amount of digits in ecx.} xorl %ecx,%ecx bsrl %eax,%ecx @@ -1138,9 +1140,15 @@ str_int_shortcut: imul $1233,%ecx shr $12,%ecx {$ifdef FPC_PIC} - call fpc_geteipasebx + call .Lpic +.Lpic: + pop %ebx + {$ifdef darwin} + movl digits-.LPIC(%ebx),%ebx + {$else} addl $_GLOBAL_OFFSET_TABLE_,%ebx movl digits@GOT(%ebx),%ebx + {$endif} cmpl (%ebx,%ecx,4),%eax {$else} cmpl digits(,%ecx,4),%eax @@ -1153,8 +1161,26 @@ str_int_shortcut: movb $45,%bh {movb $'-,%bh Not supported by our ATT reader.} movw %bx,(%edi) addl %edx,%edi + subl %edx,%esi + + {Skip digits beyond string length.} + subl %ecx,%esi + jae .Lwrite_out + movl %eax,%edx +.Lloop_skip: + movl $0xcccccccd,%eax {Divide by 10 using mul+shr} + {Pre-add '0'} + leal 48(%edx),%ebx {leal $'0(,%edx),%ebx Not supported by our ATT reader.} + mull %edx + shrl $3,%edx + decl %ecx + jz .Ldone {If (l<0) and (high(s)=1) this jump is taken.} + incl %esi + jnz .Lloop_skip + movl %edx,%eax {Write out digits.} +.Lwrite_out: movl %eax,%edx .Lloop: movl $0xcccccccd,%eax {Divide by 10 using mul+shr} @@ -1168,10 +1194,11 @@ str_int_shortcut: movb %bl,(%edi,%ecx) decl %ecx jnz .Lloop +.Ldone: popl %ebx popl %edi + popl %esi end; -{$endif} {**************************************************************************** Bounds Check ****************************************************************************}