Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into mishka.local:/home/my/mysql-4.1
This commit is contained in:
commit
00e7404821
@ -17,6 +17,15 @@ select 9223372036854775808+1;
|
|||||||
select -(0-3),round(-(0-3)), round(9999999999999999999);
|
select -(0-3),round(-(0-3)), round(9999999999999999999);
|
||||||
-(0-3) round(-(0-3)) round(9999999999999999999)
|
-(0-3) round(-(0-3)) round(9999999999999999999)
|
||||||
3 3 10000000000000000000
|
3 3 10000000000000000000
|
||||||
|
select 1,11,101,1001,10001,100001,1000001,10000001,100000001,1000000001,10000000001,100000000001,1000000000001,10000000000001,100000000000001,1000000000000001,10000000000000001,100000000000000001,1000000000000000001,10000000000000000001;
|
||||||
|
1 11 101 1001 10001 100001 1000001 10000001 100000001 1000000001 10000000001 100000000001 1000000000001 10000000000001 100000000000001 1000000000000001 10000000000000001 100000000000000001 1000000000000000001 10000000000000000001
|
||||||
|
1 11 101 1001 10001 100001 1000001 10000001 100000001 1000000001 10000000001 100000000001 1000000000001 10000000000001 100000000000001 1000000000000001 10000000000000001 100000000000000001 1000000000000000001 10000000000000000001
|
||||||
|
select -1,-11,-101,-1001,-10001,-100001,-1000001,-10000001,-100000001,-1000000001,-10000000001,-100000000001,-1000000000001,-10000000000001,-100000000000001,-1000000000000001,-10000000000000001,-100000000000000001,-1000000000000000001,-10000000000000000001;
|
||||||
|
-1 -11 -101 -1001 -10001 -100001 -1000001 -10000001 -100000001 -1000000001 -10000000001 -100000000001 -1000000000001 -10000000000001 -100000000000001 -1000000000000001 -10000000000000001 -100000000000000001 -1000000000000000001 -10000000000000000001
|
||||||
|
-1 -11 -101 -1001 -10001 -100001 -1000001 -10000001 -100000001 -1000000001 -10000000001 -100000000001 -1000000000001 -10000000000001 -100000000000001 -1000000000000001 -10000000000000001 -100000000000000001 -1000000000000000001 -10000000000000000000
|
||||||
|
select conv(1,10,16),conv((1<<2)-1,10,16),conv((1<<10)-2,10,16),conv((1<<16)-3,10,16),conv((1<<25)-4,10,16),conv((1<<31)-5,10,16),conv((1<<36)-6,10,16),conv((1<<47)-7,10,16),conv((1<<48)-8,10,16),conv((1<<55)-9,10,16),conv((1<<56)-10,10,16),conv((1<<63)-11,10,16);
|
||||||
|
conv(1,10,16) conv((1<<2)-1,10,16) conv((1<<10)-2,10,16) conv((1<<16)-3,10,16) conv((1<<25)-4,10,16) conv((1<<31)-5,10,16) conv((1<<36)-6,10,16) conv((1<<47)-7,10,16) conv((1<<48)-8,10,16) conv((1<<55)-9,10,16) conv((1<<56)-10,10,16) conv((1<<63)-11,10,16)
|
||||||
|
1 3 3FE FFFD 1FFFFFC 7FFFFFFB FFFFFFFFA 7FFFFFFFFFF9 FFFFFFFFFFF8 7FFFFFFFFFFFF7 FFFFFFFFFFFFF6 7FFFFFFFFFFFFFF5
|
||||||
create table t1 (a bigint unsigned not null, primary key(a));
|
create table t1 (a bigint unsigned not null, primary key(a));
|
||||||
insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612);
|
insert into t1 values (18446744073709551615), (0xFFFFFFFFFFFFFFFE), (18446744073709551613), (18446744073709551612);
|
||||||
select * from t1;
|
select * from t1;
|
||||||
|
@ -14,6 +14,9 @@ select +9999999999999999999,-9999999999999999999;
|
|||||||
select cast(9223372036854775808 as unsigned)+1;
|
select cast(9223372036854775808 as unsigned)+1;
|
||||||
select 9223372036854775808+1;
|
select 9223372036854775808+1;
|
||||||
select -(0-3),round(-(0-3)), round(9999999999999999999);
|
select -(0-3),round(-(0-3)), round(9999999999999999999);
|
||||||
|
select 1,11,101,1001,10001,100001,1000001,10000001,100000001,1000000001,10000000001,100000000001,1000000000001,10000000000001,100000000000001,1000000000000001,10000000000000001,100000000000000001,1000000000000000001,10000000000000000001;
|
||||||
|
select -1,-11,-101,-1001,-10001,-100001,-1000001,-10000001,-100000001,-1000000001,-10000000001,-100000000001,-1000000000001,-10000000000001,-100000000000001,-1000000000000001,-10000000000000001,-100000000000000001,-1000000000000000001,-10000000000000000001;
|
||||||
|
select conv(1,10,16),conv((1<<2)-1,10,16),conv((1<<10)-2,10,16),conv((1<<16)-3,10,16),conv((1<<25)-4,10,16),conv((1<<31)-5,10,16),conv((1<<36)-6,10,16),conv((1<<47)-7,10,16),conv((1<<48)-8,10,16),conv((1<<55)-9,10,16),conv((1<<56)-10,10,16),conv((1<<63)-11,10,16);
|
||||||
|
|
||||||
#
|
#
|
||||||
# In 3.23 we have to disable the test of column to bigint as
|
# In 3.23 we have to disable the test of column to bigint as
|
||||||
|
@ -23,7 +23,7 @@ pkglib_LIBRARIES = libmystrings.a
|
|||||||
# Exact one of ASSEMBLER_X
|
# Exact one of ASSEMBLER_X
|
||||||
if ASSEMBLER_x86
|
if ASSEMBLER_x86
|
||||||
ASRCS = strings-x86.s longlong2str-x86.s my_strtoll10-x86.s
|
ASRCS = strings-x86.s longlong2str-x86.s my_strtoll10-x86.s
|
||||||
CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c strtod.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-cp932.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-ucs2.c ctype-uca.c ctype-win1250ch.c ctype-bin.c ctype-latin1.c my_vsnprintf.c xml.c ctype-extra.c
|
CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c strtod.c bcmp.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-cp932.c ctype-czech.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-ucs2.c ctype-uca.c ctype-win1250ch.c ctype-bin.c ctype-latin1.c my_vsnprintf.c xml.c ctype-extra.c longlong2str_asm.c
|
||||||
else
|
else
|
||||||
if ASSEMBLER_sparc32
|
if ASSEMBLER_sparc32
|
||||||
# These file MUST all be on the same line!! Otherwise automake
|
# These file MUST all be on the same line!! Otherwise automake
|
||||||
@ -46,7 +46,7 @@ EXTRA_DIST = ctype-big5.c ctype-cp932.c ctype-czech.c ctype-euc_kr.c ctype-win1
|
|||||||
ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-utf8.c \
|
ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-utf8.c \
|
||||||
ctype-ucs2.c ctype-uca.c ctype-tis620.c ctype-ujis.c \
|
ctype-ucs2.c ctype-uca.c ctype-tis620.c ctype-ujis.c \
|
||||||
xml.c strto.c strings-x86.s \
|
xml.c strto.c strings-x86.s \
|
||||||
longlong2str.c longlong2str-x86.s \
|
longlong2str.c longlong2str-x86.s longlong2str_asm.c \
|
||||||
my_strtoll10.c my_strtoll10-x86.s \
|
my_strtoll10.c my_strtoll10-x86.s \
|
||||||
strxmov.c bmove_upp.c strappend.c strcont.c strend.c \
|
strxmov.c bmove_upp.c strappend.c strcont.c strend.c \
|
||||||
strfill.c strcend.c is_prefix.c strstr.c strinstr.c \
|
strfill.c strcend.c is_prefix.c strstr.c strinstr.c \
|
||||||
|
@ -16,26 +16,26 @@
|
|||||||
# Optimized longlong2str function for Intel 80x86 (gcc/gas syntax)
|
# Optimized longlong2str function for Intel 80x86 (gcc/gas syntax)
|
||||||
# Some set sequences are optimized for pentuimpro II
|
# Some set sequences are optimized for pentuimpro II
|
||||||
|
|
||||||
.file "longlong2str.s"
|
.file "longlong2str-x86.s"
|
||||||
.version "1.01"
|
.version "1.02"
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
|
|
||||||
.globl longlong2str
|
.globl longlong2str_with_dig_vector
|
||||||
.type longlong2str,@function
|
.type longlong2str_with_dig_vector,@function
|
||||||
|
|
||||||
longlong2str:
|
longlong2str_with_dig_vector:
|
||||||
subl $80,%esp
|
subl $80,%esp
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
pushl %esi
|
pushl %esi
|
||||||
pushl %edi
|
pushl %edi
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
movl 100(%esp),%esi # Lower part of val
|
movl 100(%esp),%esi # Lower part of val
|
||||||
movl 104(%esp),%ebp # Higher part of val
|
|
||||||
movl 108(%esp),%edi # get dst
|
|
||||||
movl 112(%esp),%ebx # Radix
|
movl 112(%esp),%ebx # Radix
|
||||||
|
movl 104(%esp),%ebp # Higher part of val
|
||||||
movl %ebx,%eax
|
movl %ebx,%eax
|
||||||
|
movl 108(%esp),%edi # get dst
|
||||||
testl %eax,%eax
|
testl %eax,%eax
|
||||||
jge .L144
|
jge .L144
|
||||||
|
|
||||||
@ -69,6 +69,8 @@ longlong2str:
|
|||||||
|
|
||||||
.L150:
|
.L150:
|
||||||
leal 92(%esp),%ecx # End of buffer
|
leal 92(%esp),%ecx # End of buffer
|
||||||
|
movl %edi, 108(%esp) # Store possible modified dest
|
||||||
|
movl 116(%esp), %edi # dig_vec_upper
|
||||||
jmp .L155
|
jmp .L155
|
||||||
.align 4
|
.align 4
|
||||||
|
|
||||||
@ -83,7 +85,7 @@ longlong2str:
|
|||||||
divl %ebx
|
divl %ebx
|
||||||
decl %ecx
|
decl %ecx
|
||||||
movl %eax,%esi # quotent in ebp:esi
|
movl %eax,%esi # quotent in ebp:esi
|
||||||
movb _dig_vec_upper(%edx),%al # al is faster than dl
|
movb (%edx,%edi),%al # al is faster than dl
|
||||||
movb %al,(%ecx) # store value in buff
|
movb %al,(%ecx) # store value in buff
|
||||||
.align 4
|
.align 4
|
||||||
.L155:
|
.L155:
|
||||||
@ -91,20 +93,22 @@ longlong2str:
|
|||||||
ja .L153
|
ja .L153
|
||||||
testl %esi,%esi # rest value
|
testl %esi,%esi # rest value
|
||||||
jl .L153
|
jl .L153
|
||||||
je .L10_mov # Ready
|
je .L160 # Ready
|
||||||
movl %esi,%eax
|
movl %esi,%eax
|
||||||
movl $_dig_vec_upper,%ebp
|
|
||||||
.align 4
|
.align 4
|
||||||
|
|
||||||
.L154: # Do rest with integer precision
|
.L154: # Do rest with integer precision
|
||||||
cltd
|
cltd
|
||||||
divl %ebx
|
divl %ebx
|
||||||
decl %ecx
|
decl %ecx
|
||||||
movb (%edx,%ebp),%dl # bh is always zero as ebx=radix < 36
|
movb (%edx,%edi),%dl # bh is always zero as ebx=radix < 36
|
||||||
testl %eax,%eax
|
testl %eax,%eax
|
||||||
movb %dl,(%ecx)
|
movb %dl,(%ecx)
|
||||||
jne .L154
|
jne .L154
|
||||||
|
|
||||||
|
.L160:
|
||||||
|
movl 108(%esp),%edi # get dst
|
||||||
|
|
||||||
.L10_mov:
|
.L10_mov:
|
||||||
movl %ecx,%esi
|
movl %ecx,%esi
|
||||||
leal 92(%esp),%ecx # End of buffer
|
leal 92(%esp),%ecx # End of buffer
|
||||||
@ -129,7 +133,7 @@ longlong2str:
|
|||||||
jmp .L165
|
jmp .L165
|
||||||
|
|
||||||
.Lfe3:
|
.Lfe3:
|
||||||
.size longlong2str,.Lfe3-longlong2str
|
.size longlong2str_with_dig_vector,.Lfe3-longlong2str_with_dig_vector
|
||||||
|
|
||||||
#
|
#
|
||||||
# This is almost equal to the above, except that we can do the final
|
# This is almost equal to the above, except that we can do the final
|
||||||
@ -137,9 +141,6 @@ longlong2str:
|
|||||||
#
|
#
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.Ltmp:
|
|
||||||
.long 0xcccccccd
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
.globl longlong10_to_str
|
.globl longlong10_to_str
|
||||||
.type longlong10_to_str,@function
|
.type longlong10_to_str,@function
|
||||||
@ -202,8 +203,8 @@ longlong10_to_str:
|
|||||||
|
|
||||||
# The following code uses some tricks to change division by 10 to
|
# The following code uses some tricks to change division by 10 to
|
||||||
# multiplication and shifts
|
# multiplication and shifts
|
||||||
movl .Ltmp,%esi # set %esi to 0xcccccccd
|
movl $0xcccccccd,%esi
|
||||||
|
|
||||||
.L10_40:
|
.L10_40:
|
||||||
movl %ebx,%eax
|
movl %ebx,%eax
|
||||||
mull %esi
|
mull %esi
|
||||||
|
33
strings/longlong2str_asm.c
Normal file
33
strings/longlong2str_asm.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* Copyright (C) 2000 MySQL AB
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wrapper for longlong2str.s
|
||||||
|
|
||||||
|
We need this because the assembler code can't access the local variable
|
||||||
|
_dig_vector in a portable manner.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <my_global.h>
|
||||||
|
#include "m_string.h"
|
||||||
|
|
||||||
|
extern char *longlong2str_with_dig_vector(longlong val,char *dst,int radix,
|
||||||
|
const char *dig_vector);
|
||||||
|
|
||||||
|
char *longlong2str(longlong val,char *dst,int radix)
|
||||||
|
{
|
||||||
|
return longlong2str_with_dig_vector(val, dst, radix, _dig_vec_upper);
|
||||||
|
}
|
@ -17,21 +17,8 @@
|
|||||||
# For documentation, check my_strtoll.c
|
# For documentation, check my_strtoll.c
|
||||||
|
|
||||||
.file "my_strtoll10-x86.s"
|
.file "my_strtoll10-x86.s"
|
||||||
.version "01.01"
|
.version "01.02"
|
||||||
.data
|
|
||||||
.align 32
|
|
||||||
.type lfactor,@object
|
|
||||||
.size lfactor,36
|
|
||||||
lfactor:
|
|
||||||
.long 1
|
|
||||||
.long 10
|
|
||||||
.long 100
|
|
||||||
.long 1000
|
|
||||||
.long 10000
|
|
||||||
.long 100000
|
|
||||||
.long 1000000
|
|
||||||
.long 10000000
|
|
||||||
.long 100000000
|
|
||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
|
|
||||||
@ -209,14 +196,16 @@ my_strtoll10:
|
|||||||
jne .L500
|
jne .L500
|
||||||
cmpl -36(%ebp),%esi # Test if string is less than 18 digits
|
cmpl -36(%ebp),%esi # Test if string is less than 18 digits
|
||||||
jne .Lend_i_and_j
|
jne .Lend_i_and_j
|
||||||
jmp .Lend3 # 18 digit string
|
.L499:
|
||||||
|
movl $1000000000,%eax
|
||||||
|
jmp .Lgot_factor # 18 digit string
|
||||||
|
|
||||||
# Handle the possible next to last digit and store in ecx
|
# Handle the possible next to last digit and store in ecx
|
||||||
.L500:
|
.L500:
|
||||||
movb (%esi),%al
|
movb (%esi),%al
|
||||||
addb $-48,%al
|
addb $-48,%al
|
||||||
cmpb $9,%al
|
cmpb $9,%al
|
||||||
ja .Lend3
|
ja .L499 # 18 digit string
|
||||||
|
|
||||||
incl %esi
|
incl %esi
|
||||||
movzbl %al,%ecx
|
movzbl %al,%ecx
|
||||||
@ -315,14 +304,41 @@ my_strtoll10:
|
|||||||
.Lend_i_and_j:
|
.Lend_i_and_j:
|
||||||
movl %esi,%ecx
|
movl %esi,%ecx
|
||||||
subl -12(%ebp),%ecx # ecx= number of digits in second part
|
subl -12(%ebp),%ecx # ecx= number of digits in second part
|
||||||
movl lfactor(,%ecx,4),%eax
|
|
||||||
jmp .L523
|
|
||||||
|
|
||||||
# Return -8(%ebp) * $1000000000 + edi
|
# Calculate %eax= 10 ** %cl, where %cl <= 8
|
||||||
|
# With an array one could do this with:
|
||||||
|
# movl 10_factor_table(,%ecx,4),%eax
|
||||||
|
# We calculate the table here to avoid problems in
|
||||||
|
# position independent code (gcc -pic)
|
||||||
|
|
||||||
|
cmpb $3,%cl
|
||||||
|
ja .L4_to_8
|
||||||
|
movl $1000, %eax
|
||||||
|
je .Lgot_factor # %cl=3, eax= 1000
|
||||||
|
movl $10, %eax
|
||||||
|
cmpb $1,%cl # %cl is here 0 - 2
|
||||||
|
je .Lgot_factor # %cl=1, eax= 10
|
||||||
|
movl $100, %eax
|
||||||
|
ja .Lgot_factor # %cl=2, eax=100
|
||||||
|
movl $1, %eax
|
||||||
|
jmp .Lgot_factor # %cl=0, eax=1
|
||||||
|
|
||||||
|
.L4_to_8: # %cl is here 4-8
|
||||||
|
cmpb $5,%cl
|
||||||
|
movl $100000, %eax
|
||||||
|
je .Lgot_factor # %cl=5, eax=100000
|
||||||
|
movl $10000, %eax
|
||||||
|
jbe .Lgot_factor # %cl=4, eax=10000
|
||||||
|
movl $10000000, %eax
|
||||||
|
cmpb $7,%cl
|
||||||
|
je .Lgot_factor # %cl=7, eax=10000000
|
||||||
|
movl $100000000, %eax
|
||||||
|
ja .Lgot_factor # %cl=8, eax=100000000
|
||||||
|
movl $1000000, %eax # %cl=6, eax=1000000
|
||||||
|
|
||||||
|
# Return -8(%ebp) * %eax + edi
|
||||||
.p2align 4,,7
|
.p2align 4,,7
|
||||||
.Lend3:
|
.Lgot_factor:
|
||||||
movl $1000000000,%eax
|
|
||||||
.L523:
|
|
||||||
mull -8(%ebp)
|
mull -8(%ebp)
|
||||||
addl %edi,%eax
|
addl %edi,%eax
|
||||||
adcl $0,%edx
|
adcl $0,%edx
|
||||||
|
Loading…
x
Reference in New Issue
Block a user