aboutsummaryrefslogtreecommitdiff
path: root/contrib/compiler-rt
diff options
context:
space:
mode:
authorMarius Strobl <marius@FreeBSD.org>2012-05-13 05:08:13 +0000
committerMarius Strobl <marius@FreeBSD.org>2012-05-13 05:08:13 +0000
commit2040613422afc879a6279af57313be40d7f8f0bc (patch)
treea542ae9840f8982bddb0d25db38297691e0ae0e1 /contrib/compiler-rt
parentedaa25bdaeb7f6d797f88ec6857b9269b72a92fe (diff)
downloadsrc-2040613422afc879a6279af57313be40d7f8f0bc.tar.gz
src-2040613422afc879a6279af57313be40d7f8f0bc.zip
- 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. Unfortunately, this still doesn't make libcompiler_rt a viable replacement for libgcc on sparc64 though as once installed instead, buildworld times increase by nearly 60% (which isn't related to these assembler functions).
Notes
Notes: svn path=/head/; revision=235388
Diffstat (limited to 'contrib/compiler-rt')
-rw-r--r--contrib/compiler-rt/lib/sparc64/divmod.m438
1 files changed, 18 insertions, 20 deletions
diff --git a/contrib/compiler-rt/lib/sparc64/divmod.m4 b/contrib/compiler-rt/lib/sparc64/divmod.m4
index 63381995fa36..9150a2ed8263 100644
--- a/contrib/compiler-rt/lib/sparc64/divmod.m4
+++ b/contrib/compiler-rt/lib/sparc64/divmod.m4
@@ -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