xref: /freebsd-src/sys/libkern/arm/ldivmod_helper.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
146d741dcSAndrew Turner /*
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
38a36da99SPedro F. Giffuni  *
446d741dcSAndrew Turner  * Copyright (C) 2012 Andrew Turner
546d741dcSAndrew Turner  * All rights reserved.
646d741dcSAndrew Turner  *
746d741dcSAndrew Turner  * Redistribution and use in source and binary forms, with or without
846d741dcSAndrew Turner  * modification, are permitted provided that the following conditions
946d741dcSAndrew Turner  * are met:
1046d741dcSAndrew Turner  * 1. Redistributions of source code must retain the above copyright
1146d741dcSAndrew Turner  *    notice, this list of conditions and the following disclaimer.
1246d741dcSAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright
1346d741dcSAndrew Turner  *    notice, this list of conditions and the following disclaimer in the
1446d741dcSAndrew Turner  *    documentation and/or other materials provided with the distribution.
1546d741dcSAndrew Turner  *
1646d741dcSAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1746d741dcSAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1846d741dcSAndrew Turner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1946d741dcSAndrew Turner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2046d741dcSAndrew Turner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2146d741dcSAndrew Turner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2246d741dcSAndrew Turner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2346d741dcSAndrew Turner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2446d741dcSAndrew Turner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2546d741dcSAndrew Turner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2646d741dcSAndrew Turner  * SUCH DAMAGE.
2746d741dcSAndrew Turner  *
2846d741dcSAndrew Turner  */
2946d741dcSAndrew Turner 
3046d741dcSAndrew Turner #include <sys/cdefs.h>
3146d741dcSAndrew Turner #include <libkern/quad.h>
3246d741dcSAndrew Turner 
3346d741dcSAndrew Turner /*
3446d741dcSAndrew Turner  * Helper for __aeabi_ldivmod.
3546d741dcSAndrew Turner  * TODO: __divdi3 calls __qdivrem. We should do the same and use the
3646d741dcSAndrew Turner  * remainder value rather than re-calculating it.
3746d741dcSAndrew Turner  */
3846d741dcSAndrew Turner long long __kern_ldivmod(long long, long long, long long *);
3946d741dcSAndrew Turner 
4046d741dcSAndrew Turner long long
__kern_ldivmod(long long n,long long m,long long * rem)4146d741dcSAndrew Turner __kern_ldivmod(long long n, long long m, long long *rem)
4246d741dcSAndrew Turner {
4346d741dcSAndrew Turner 	long long q;
4446d741dcSAndrew Turner 
4546d741dcSAndrew Turner 	q = __divdi3(n, m);	/* q = n / m */
4646d741dcSAndrew Turner 	*rem = n - m * q;
4746d741dcSAndrew Turner 
4846d741dcSAndrew Turner 	return q;
4946d741dcSAndrew Turner }
50