OSDN Git Service

* config/vax/vax.h (TARGET_BSD_DIVMOD): New macro. Set to 1.
authormacro <macro@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Jul 2009 01:23:54 +0000 (01:23 +0000)
committermacro <macro@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Jul 2009 01:23:54 +0000 (01:23 +0000)
* config/vax/linux.h (TARGET_BSD_DIVMOD): New macro.  Redefine the
to 0.
* config/vax/vax.c (vax_init_libfuncs): Only redefine udiv_optab
and umod_optab if TARGET_BSD_DIVMOD.
* config/vax/lib1funcs.asm: New file.
* config/vax/t-linux: New file.
* config.gcc (vax-*-linux*): Set tmake_file to vax/t-linux.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149128 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config.gcc
gcc/config/vax/lib1funcs.asm [new file with mode: 0644]
gcc/config/vax/linux.h
gcc/config/vax/t-linux [new file with mode: 0644]
gcc/config/vax/vax.c
gcc/config/vax/vax.h

index 8d0688b..0b58daf 100644 (file)
@@ -1,3 +1,14 @@
+2009-07-01  Maciej W. Rozycki  <macro@linux-mips.org>
+
+       * config/vax/vax.h (TARGET_BSD_DIVMOD): New macro.  Set to 1.
+       * config/vax/linux.h (TARGET_BSD_DIVMOD): New macro.  Redefine the
+       to 0.
+       * config/vax/vax.c (vax_init_libfuncs): Only redefine udiv_optab
+       and umod_optab if TARGET_BSD_DIVMOD.
+       * config/vax/lib1funcs.asm: New file.
+       * config/vax/t-linux: New file.
+       * config.gcc (vax-*-linux*): Set tmake_file to vax/t-linux.
+
 2009-06-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/40566
index e578737..fe345c1 100644 (file)
@@ -2439,6 +2439,7 @@ v850-*-*)
        ;;
 vax-*-linux*)
        tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h vax/elf.h vax/linux.h"
+       tmake_file=vax/t-linux
        ;;
 vax-*-netbsdelf*)
        tm_file="${tm_file} elfos.h netbsd.h netbsd-elf.h vax/elf.h vax/netbsd-elf.h"
diff --git a/gcc/config/vax/lib1funcs.asm b/gcc/config/vax/lib1funcs.asm
new file mode 100644 (file)
index 0000000..1d57b56
--- /dev/null
@@ -0,0 +1,92 @@
+/* Copyright (C) 2009 Free Software Foundation, Inc.
+   This file is part of GCC.
+   Contributed by Maciej W. Rozycki <macro@linux-mips.org>.
+
+   This file 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 3, or (at your option) any
+   later version.
+
+   This file 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.
+
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifdef L_udivsi3
+       .text
+       .globl  __udivsi3
+       .type   __udivsi3, @function
+__udivsi3:
+       .word   0
+       movl    8(%ap), %r1
+       blss    0f                      /* Check bit #31 of divisor.  */
+       movl    4(%ap), %r2
+       blss    1f                      /* Check bit #31 of dividend.  */
+
+       /* Both zero, do a standard division.  */
+
+       divl3   %r1, %r2, %r0
+       ret
+
+       /* MSB of divisor set, only 1 or 0 may result.  */
+0:
+       decl    %r1
+       clrl    %r0
+       cmpl    %r1, 4(%ap)
+       adwc    $0, %r0
+       ret
+
+       /* MSB of dividend set, do an extended division.  */
+1:
+       clrl    %r3
+       ediv    %r1, %r2, %r0, %r3
+       ret
+       .size   __udivsi3, . - __udivsi3
+       .previous
+#endif
+
+#ifdef L_umodsi3
+       .text
+       .globl  __umodsi3
+       .type   __umodsi3, @function
+__umodsi3:
+       .word   0
+       movl    8(%ap), %r1
+       blss    0f                      /* Check bit #31 of divisor.  */
+       movl    4(%ap), %r2
+       blss    1f                      /* Check bit #31 of dividend.  */
+
+       /* Both zero, do a standard division.  */
+
+       divl3   %r1, %r2, %r0
+       mull2   %r0, %r1
+       subl3   %r1, %r2, %r0
+       ret
+
+       /* MSB of divisor set, subtract the divisor at most once.  */
+0:
+       movl    4(%ap), %r2
+       clrl    %r0
+       cmpl    %r2, %r1
+       sbwc    $0, %r0
+       bicl2   %r0, %r1
+       subl3   %r1, %r2, %r0
+       ret
+
+       /* MSB of dividend set, do an extended division.  */
+1:
+       clrl    %r3
+       ediv    %r1, %r2, %r3, %r0
+       ret
+       .size   __umodsi3, . - __umodsi3
+       .previous
+#endif
index c8e50cd..1087069 100644 (file)
@@ -37,6 +37,10 @@ along with GCC; see the file COPYING3.  If not see
 #undef TARGET_DEFAULT
 #define TARGET_DEFAULT (MASK_QMATH | MASK_G_FLOAT)
 
+/* Use standard names for udiv and umod libgcc calls.  */
+#undef TARGET_BSD_DIVMOD
+#define TARGET_BSD_DIVMOD 0
+
 #undef CPP_SPEC
 #define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
 
diff --git a/gcc/config/vax/t-linux b/gcc/config/vax/t-linux
new file mode 100644 (file)
index 0000000..9af1edb
--- /dev/null
@@ -0,0 +1,2 @@
+LIB1ASMSRC = vax/lib1funcs.asm
+LIB1ASMFUNCS = _udivsi3 _umodsi3
index d0543da..4dfaa2e 100644 (file)
@@ -175,8 +175,11 @@ vax_file_start (void)
 static void
 vax_init_libfuncs (void)
 {
-  set_optab_libfunc (udiv_optab, SImode, TARGET_ELF ? "*__udiv" : "*udiv");
-  set_optab_libfunc (umod_optab, SImode, TARGET_ELF ? "*__urem" : "*urem");
+  if (TARGET_BSD_DIVMOD)
+    {
+      set_optab_libfunc (udiv_optab, SImode, TARGET_ELF ? "*__udiv" : "*udiv");
+      set_optab_libfunc (umod_optab, SImode, TARGET_ELF ? "*__urem" : "*urem");
+    }
 }
 
 /* This is like nonimmediate_operand with a restriction on the type of MEM.  */
index 4ff2d54..0ac7ba5 100644 (file)
@@ -63,6 +63,9 @@ along with GCC; see the file COPYING3.  If not see
 /* Nonzero if ELF.  Redefined by vax/elf.h.  */
 #define TARGET_ELF 0
 
+/* Use BSD names for udiv and umod libgcc calls.  */
+#define TARGET_BSD_DIVMOD 1
+
 /* Default target_flags if no switches specified.  */
 
 #ifndef TARGET_DEFAULT