* sysdeps/alpha/Makefile <gnulib> (sysdep_routines): Merge divrem
[glibc.git] / sysdeps / alpha / divl.S
blob33fa1187d9ebba7274ad470bd97863dd521c0783
1 /* Copyright (C) 2004 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
19 #include "div_libc.h"
21 /* 32-bit signed int divide.  This is not a normal C function.  Argument
22    registers are t10 and t11, the result goes in t12.  Only t12 and AT may
23    be clobbered.
25    The FPU can handle all input values except zero.  Whee!  */
27 #ifndef EXTEND
28 #define EXTEND(S,D)     sextl S, D
29 #endif
31         .text
32         .align  4
33         .globl  __divl
34         .type   __divl, @function
35         .usepv  __divl, no
37         cfi_startproc
38         cfi_return_column (RA)
39 __divl:
40         lda     sp, -FRAME(sp)
41         cfi_def_cfa_offset (FRAME)
42         CALL_MCOUNT
43         stt     $f0, 0(sp)
44         stt     $f1, 8(sp)
45         beq     Y, DIVBYZERO
46         cfi_rel_offset ($f0, 0)
47         cfi_rel_offset ($f1, 8)
49         EXTEND  (X, RV)
50         EXTEND  (Y, AT)
51         stq     RV, 16(sp)
52         stq     AT, 24(sp)
54         ldt     $f0, 16(sp)
55         ldt     $f1, 24(sp)
56         cvtqt   $f0, $f0
57         cvtqt   $f1, $f1
59         divt/c  $f0, $f1, $f0
60         cvttq/c $f0, $f0
61         stt     $f0, 16(sp)
62         ldt     $f0, 0(sp)
64         ldt     $f1, 8(sp)
65         ldl     RV, 16(sp)
66         lda     sp, FRAME(sp)
67         cfi_restore ($f0)
68         cfi_restore ($f1)
69         cfi_def_cfa_offset (0)
70         ret     $31, (RA), 1
72         cfi_endproc
73         .size   __divl, .-__divl
75         DO_DIVBYZERO