/* Copyright (C) 2004-2014 Free Software Foundation, Inc.
   Contributed by Richard Henderson  <rth@twiddle.net>
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library.  If not, see
   <http://www.gnu.org/licenses/>.  */

#include "div_libc.h"

/* 32-bit signed int remainder.  This is not a normal C function.  Argument
   registers are t10 and t11, the result goes in t12.  Only t12 and AT may
   be clobbered.

   The FPU can handle the division for all input values except zero.
   All we have to do is compute the remainder via multiply-and-subtract.

   The FPCR save/restore is due to the fact that the EV6 _will_ set FPCR_INE
   for cvttq/c even without /sui being set.  It will not, however, properly
   raise the exception, so we don't have to worry about FPCR_INED being clear
   and so dying by SIGFPE.  */

#ifndef EXTEND
#define EXTEND(S,D)	sextl S, D
#endif

	.text
	.align	4
	.globl	__reml
	.type	__reml, @funcnoplt
	.usepv	__reml, no

	cfi_startproc
	cfi_return_column (RA)
__reml:
	lda	sp, -FRAME(sp)
	cfi_def_cfa_offset (FRAME)
	CALL_MCOUNT
	stt	$f0, 0(sp)
	excb
	beq	Y, DIVBYZERO

	stt	$f1, 8(sp)
	stt	$f2, 16(sp)
	cfi_rel_offset ($f0, 0)
	cfi_rel_offset ($f1, 8)
	cfi_rel_offset ($f2, 16)
	mf_fpcr	$f2

	EXTEND	(X, RV)
	EXTEND	(Y, AT)
	_ITOFT2	RV, $f0, 24, AT, $f1, 32
	cvtqt	$f0, $f0
	cvtqt	$f1, $f1
	divt/c	$f0, $f1, $f0
	cvttq/c	$f0, $f0
	excb
	mt_fpcr	$f2
	_FTOIT	$f0, RV, 24

	ldt	$f0, 0(sp)
	mull	RV, Y, RV
	ldt	$f1, 8(sp)
	ldt	$f2, 16(sp)
	lda	sp, FRAME(sp)
	cfi_restore ($f0)
	cfi_restore ($f1)
	cfi_restore ($f2)
	cfi_def_cfa_offset (0)
	subl	X, RV, RV
	ret	$31, (RA), 1

	cfi_endproc
	.size	__reml, .-__reml

	DO_DIVBYZERO
