math.c revision 1.1 1 1.1 jmcneill /* $NetBSD: math.c,v 1.1 2018/08/16 18:17:47 jmcneill Exp $ */
2 1.1 jmcneill
3 1.1 jmcneill /*
4 1.1 jmcneill * Copright (C) 2014 Linaro Ltd.
5 1.1 jmcneill * Author: Ard Biesheuvel <ard.biesheuvel (at) linaro.org>
6 1.1 jmcneill *
7 1.1 jmcneill * Redistribution and use in source and binary forms, with or without
8 1.1 jmcneill * modification, are permitted provided that the following conditions
9 1.1 jmcneill * are met:
10 1.1 jmcneill * 1. Redistributions of source code must retain the above copyright
11 1.1 jmcneill * notice and this list of conditions, without modification.
12 1.1 jmcneill * 2. The name of the author may not be used to endorse or promote products
13 1.1 jmcneill * derived from this software without specific prior written permission.
14 1.1 jmcneill *
15 1.1 jmcneill * Alternatively, this software may be distributed under the terms of the
16 1.1 jmcneill * GNU General Public License as published by the Free Software Foundation;
17 1.1 jmcneill * either version 2 of the License, or (at your option) any later version.
18 1.1 jmcneill */
19 1.1 jmcneill
20 1.1 jmcneill #include "lib.h"
21 1.1 jmcneill
22 1.1 jmcneill UINT64
23 1.1 jmcneill LShiftU64 (
24 1.1 jmcneill IN UINT64 Operand,
25 1.1 jmcneill IN UINTN Count
26 1.1 jmcneill )
27 1.1 jmcneill // Left shift 64bit by 32bit and get a 64bit result
28 1.1 jmcneill {
29 1.1 jmcneill return Operand << Count;
30 1.1 jmcneill }
31 1.1 jmcneill
32 1.1 jmcneill UINT64
33 1.1 jmcneill RShiftU64 (
34 1.1 jmcneill IN UINT64 Operand,
35 1.1 jmcneill IN UINTN Count
36 1.1 jmcneill )
37 1.1 jmcneill // Right shift 64bit by 32bit and get a 64bit result
38 1.1 jmcneill {
39 1.1 jmcneill return Operand >> Count;
40 1.1 jmcneill }
41 1.1 jmcneill
42 1.1 jmcneill
43 1.1 jmcneill UINT64
44 1.1 jmcneill MultU64x32 (
45 1.1 jmcneill IN UINT64 Multiplicand,
46 1.1 jmcneill IN UINTN Multiplier
47 1.1 jmcneill )
48 1.1 jmcneill // Multiple 64bit by 32bit and get a 64bit result
49 1.1 jmcneill {
50 1.1 jmcneill return Multiplicand * Multiplier;
51 1.1 jmcneill }
52 1.1 jmcneill
53 1.1 jmcneill UINT64
54 1.1 jmcneill DivU64x32 (
55 1.1 jmcneill IN UINT64 Dividend,
56 1.1 jmcneill IN UINTN Divisor,
57 1.1 jmcneill OUT UINTN *Remainder OPTIONAL
58 1.1 jmcneill )
59 1.1 jmcneill // divide 64bit by 32bit and get a 64bit result
60 1.1 jmcneill // N.B. only works for 31bit divisors!!
61 1.1 jmcneill {
62 1.1 jmcneill if (Remainder)
63 1.1 jmcneill *Remainder = Dividend % Divisor;
64 1.1 jmcneill return Dividend / Divisor;
65 1.1 jmcneill }
66