Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sparc/sparc Move the installation of v8 specific .m...



details:   https://anonhg.NetBSD.org/src/rev/db4088f4eb86
branches:  trunk
changeset: 539879:db4088f4eb86
user:      pk <pk%NetBSD.org@localhost>
date:      Thu Nov 28 15:32:15 2002 +0000

description:
Move the installation of v8 specific .mul/.div functions into a separate
routine to be called when we're sure the CPU is actually sparc version 8.

diffstat:

 sys/arch/sparc/sparc/locore.s |  150 ++++++++++++++++++++++-------------------
 1 files changed, 81 insertions(+), 69 deletions(-)

diffs (185 lines):

diff -r e40f0f43d774 -r db4088f4eb86 sys/arch/sparc/sparc/locore.s
--- a/sys/arch/sparc/sparc/locore.s     Thu Nov 28 15:29:53 2002 +0000
+++ b/sys/arch/sparc/sparc/locore.s     Thu Nov 28 15:32:15 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: locore.s,v 1.163 2002/11/27 16:08:34 pk Exp $  */
+/*     $NetBSD: locore.s,v 1.164 2002/11/28 15:32:15 pk Exp $  */
 
 /*
  * Copyright (c) 1996 Paul Kranenburg
@@ -3803,7 +3803,7 @@
        beq     3f
         nop
        cmp     %g4, CPU_SUN4D
-       bne     5f
+       bne     4f
 
 3:
        /*
@@ -3854,8 +3854,7 @@
 
        sta     %o3, [%g0] ASI_SRMMU    ! restore mmu-sreg
        wr      %o4, 0x0, %psr          ! restore psr
-       !b,a    startmap_done
-       b,a     4f
+       b,a     startmap_done
 
        /*
         * The following is generic and should work on all
@@ -3874,71 +3873,6 @@
        sta     %l4, [%o1] ASI_BYPASS
        !b,a    startmap_done
 4:
-#define        OVERWRITE(rtn, v8_rtn, len) \
-       set     v8_rtn, %o0; \
-       set     rtn, %o1; \
-       call    _C_LABEL(bcopy); \
-        mov    len, %o2
-
-       OVERWRITE(.mul, v8_smul, v8_smul_len)
-       OVERWRITE(.umul, v8_umul, v8_umul_len)
-       OVERWRITE(.div, v8_sdiv, v8_sdiv_len)
-       OVERWRITE(.udiv, v8_udiv, v8_udiv_len)
-       OVERWRITE(.rem, v8_srem, v8_srem_len)
-       OVERWRITE(.urem, v8_urem, v8_urem_len)
-
-#undef OVERWRITE
-
-       b,a     startmap_done
-
-/*
- * V8 multiply and divide routines, to be copied over the code
- * for the V6/V7 routines.  Seems a shame to spend the call, but....
- * Note: while .umul and .smul return a 64-bit result in %o1%o0,
- * gcc only really cares about the low 32 bits in %o0.  This is
- * really just gcc output, cleaned up a bit.
- */
-v8_smul:
-       retl
-        smul   %o0, %o1, %o0
-v8_smul_len = .-v8_smul
-v8_umul:
-       retl
-        umul   %o0, %o1, %o0
-!v8_umul_len = 2 * 4
-v8_umul_len = .-v8_umul
-v8_sdiv:
-       sra     %o0, 31, %g2
-       wr      %g2, 0, %y
-       nop; nop; nop
-       retl
-        sdiv   %o0, %o1, %o0
-v8_sdiv_len = .-v8_sdiv
-v8_udiv:
-       wr      %g0, 0, %y
-       nop; nop; nop
-       retl
-        udiv   %o0, %o1, %o0
-v8_udiv_len = .-v8_udiv
-v8_srem:
-       sra     %o0, 31, %g3
-       wr      %g3, 0, %y
-       nop; nop; nop
-       sdiv    %o0, %o1, %g2
-       smul    %g2, %o1, %g2
-       retl
-        sub    %o0, %g2, %o0
-v8_srem_len = .-v8_srem
-v8_urem:
-       wr      %g0, 0, %y
-       nop; nop; nop
-       udiv    %o0, %o1, %g2
-       smul    %g2, %o1, %g2
-       retl
-        sub    %o0, %g2, %o0
-v8_urem_len = .-v8_urem
-
-5:
 #endif /* SUN4M || SUN4D */
        ! botch! We should blow up.
 
@@ -4137,6 +4071,84 @@
         clr    %o0                     ! our frame arg is ignored
        /*NOTREACHED*/
 
+#if defined(SUN4M)
+       .globl  _C_LABEL(sparc_v8_muldiv)
+_C_LABEL(sparc_v8_muldiv):
+       save    %sp, -CCFSZ, %sp
+
+#define        OVERWRITE(rtn, v8_rtn, len)     \
+       set     v8_rtn, %o0;            \
+       set     rtn, %o1;               \
+       call    _C_LABEL(bcopy);        \
+        mov    len, %o2;               \
+       /* now flush the insn cache */  \
+       set     rtn, %o0;               \
+        mov    len, %o1;               \
+0:                                     \
+       flush   %o0;                    \
+       subcc   %o1, 8, %o1;            \
+       bgu     0b;                     \
+        add    %o0, 8, %o0;            \
+
+       OVERWRITE(.mul, v8_smul, v8_smul_len)
+       OVERWRITE(.umul, v8_umul, v8_umul_len)
+       OVERWRITE(.div, v8_sdiv, v8_sdiv_len)
+       OVERWRITE(.udiv, v8_udiv, v8_udiv_len)
+       OVERWRITE(.rem, v8_srem, v8_srem_len)
+       OVERWRITE(.urem, v8_urem, v8_urem_len)
+#undef OVERWRITE
+       ret
+        restore
+
+/*
+ * V8 multiply and divide routines, to be copied over the code
+ * for the V6/V7 routines.  Seems a shame to spend the call, but....
+ * Note: while .umul and .smul return a 64-bit result in %o1%o0,
+ * gcc only really cares about the low 32 bits in %o0.  This is
+ * really just gcc output, cleaned up a bit.
+ */
+v8_smul:
+       retl
+        smul   %o0, %o1, %o0
+v8_smul_len = .-v8_smul
+v8_umul:
+       retl
+        umul   %o0, %o1, %o0
+!v8_umul_len = 2 * 4
+v8_umul_len = .-v8_umul
+v8_sdiv:
+       sra     %o0, 31, %g2
+       wr      %g2, 0, %y
+       nop; nop; nop
+       retl
+        sdiv   %o0, %o1, %o0
+v8_sdiv_len = .-v8_sdiv
+v8_udiv:
+       wr      %g0, 0, %y
+       nop; nop; nop
+       retl
+        udiv   %o0, %o1, %o0
+v8_udiv_len = .-v8_udiv
+v8_srem:
+       sra     %o0, 31, %g3
+       wr      %g3, 0, %y
+       nop; nop; nop
+       sdiv    %o0, %o1, %g2
+       smul    %g2, %o1, %g2
+       retl
+        sub    %o0, %g2, %o0
+v8_srem_len = .-v8_srem
+v8_urem:
+       wr      %g0, 0, %y
+       nop; nop; nop
+       udiv    %o0, %o1, %g2
+       smul    %g2, %o1, %g2
+       retl
+        sub    %o0, %g2, %o0
+v8_urem_len = .-v8_urem
+
+#endif /* SUN4M */
+
 #if defined(MULTIPROCESSOR)
        /*
         * Entry point for non-boot CPUs in MP systems.



Home | Main Index | Thread Index | Old Index