svn commit: r236002 - stable/9/contrib/compiler-rt/lib/sparc64
Marius Strobl
marius at FreeBSD.org
Fri May 25 15:15:26 UTC 2012
Author: marius
Date: Fri May 25 15:15:25 2012
New Revision: 236002
URL: http://svn.freebsd.org/changeset/base/236002
Log:
MFC: r235388
- Get rid of debugging support in order to get rid of the V8-specific C
compiler frame size used there so this whole thing is V8/V9-agnostic.
- Use 32-bit function alignment as GCC does when using UltraSPARC I or
higher optimizations.
- Don't waste delay slots when possible.
Modified:
stable/9/contrib/compiler-rt/lib/sparc64/divmod.m4
Directory Properties:
stable/9/contrib/compiler-rt/ (props changed)
Modified: stable/9/contrib/compiler-rt/lib/sparc64/divmod.m4
==============================================================================
--- stable/9/contrib/compiler-rt/lib/sparc64/divmod.m4 Fri May 25 15:14:22 2012 (r236001)
+++ stable/9/contrib/compiler-rt/lib/sparc64/divmod.m4 Fri May 25 15:15:25 2012 (r236002)
@@ -59,9 +59,6 @@ define(SC,`%g2')
#include "../assembly.h"
-.text
- .align 4
-
define(DEVELOP_QUOTIENT_BITS,
` !depth $1, accumulated bits $2
bl L.$1.eval(TWOSUPN+$2)
@@ -84,12 +81,14 @@ L.$1.eval(TWOSUPN+$2):
ifelse( $1, 1, `9:')
')
ifelse( ANSWER, `quotient', `
+.text
+ .align 32
DEFINE_COMPILERRT_FUNCTION(__udivsi3)
- save %sp,-64,%sp ! do this for debugging
b divide
mov 0,SIGN ! result always nonnegative
+.text
+ .align 32
DEFINE_COMPILERRT_FUNCTION(__divsi3)
- save %sp,-64,%sp ! do this for debugging
orcc divisor,dividend,%g0 ! are either dividend or divisor negative
bge divide ! if not, skip this junk
xor divisor,dividend,SIGN ! record sign of result in sign of SIGN
@@ -104,12 +103,14 @@ DEFINE_COMPILERRT_FUNCTION(__divsi3)
neg dividend
! FALL THROUGH
',`
+.text
+ .align 32
DEFINE_COMPILERRT_FUNCTION(__umodsi3)
- save %sp,-64,%sp ! do this for debugging
b divide
mov 0,SIGN ! result always nonnegative
+.text
+ .align 32
DEFINE_COMPILERRT_FUNCTION(__modsi3)
- save %sp,-64,%sp ! do this for debugging
orcc divisor,dividend,%g0 ! are either dividend or divisor negative
bge divide ! if not, skip this junk
mov dividend,SIGN ! record sign of result in sign of SIGN
@@ -184,8 +185,8 @@ do_single_div:
nop
sub R,V,R
mov 1,Q
- b end_single_divloop
- nop
+ b,a end_single_divloop
+ ! EMPTY
single_divloop:
sll Q,1,Q
bl 1f
@@ -202,8 +203,8 @@ single_divloop:
deccc SC
bge single_divloop
tst R
- b end_regular_divide
- nop
+ b,a end_regular_divide
+ ! EMPTY
not_really_big:
1:
@@ -224,9 +225,8 @@ end_regular_divide:
deccc ITER
bge divloop
tst R
- bge got_result
- nop
- ! non-restoring fixup here
+ bl,a got_result
+ ! non-restoring fixup if remainder < 0, otherwise annulled
ifelse( ANSWER, `quotient',
` dec Q
',` add R,divisor,R
@@ -234,13 +234,11 @@ ifelse( ANSWER, `quotient',
got_result:
tst SIGN
- bge 1f
- restore
- ! answer < 0
- retl ! leaf-routine return
+ bl,a 1f
+ ! negate for answer < 0, otherwise annulled
ifelse( ANSWER, `quotient',
-` neg %o2,%o0 ! quotient <- -Q
-',` neg %o3,%o0 ! remainder <- -R
+` neg %o2,%o2 ! Q <- -Q
+',` neg %o3,%o3 ! R <- -R
')
1:
retl ! leaf-routine return
More information about the svn-src-stable-9
mailing list