1 1.1 jmcneill /* $NetBSD: math.c,v 1.1.1.1 2021/09/30 18:50:09 jmcneill Exp $ */ 2 1.1 jmcneill 3 1.1 jmcneill // SPDX-License-Identifier: BSD-2-Clause-Patent 4 1.1 jmcneill /* 5 1.1 jmcneill * This code is based on EDK II MdePkg/Library/BaseLib/Math64.c 6 1.1 jmcneill * Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved. 7 1.1 jmcneill */ 8 1.1 jmcneill 9 1.1 jmcneill #include "lib.h" 10 1.1 jmcneill 11 1.1 jmcneill /** 12 1.1 jmcneill * LShiftU64() - left shift 13 1.1 jmcneill */ 14 1.1 jmcneill UINT64 15 1.1 jmcneill LShiftU64 ( 16 1.1 jmcneill IN UINT64 Operand, 17 1.1 jmcneill IN UINTN Count 18 1.1 jmcneill ) 19 1.1 jmcneill { 20 1.1 jmcneill return Operand << Count; 21 1.1 jmcneill } 22 1.1 jmcneill 23 1.1 jmcneill /** 24 1.1 jmcneill * RShiftU64() - right shift 25 1.1 jmcneill */ 26 1.1 jmcneill UINT64 27 1.1 jmcneill RShiftU64 ( 28 1.1 jmcneill IN UINT64 Operand, 29 1.1 jmcneill IN UINTN Count 30 1.1 jmcneill ) 31 1.1 jmcneill { 32 1.1 jmcneill return Operand >> Count; 33 1.1 jmcneill } 34 1.1 jmcneill 35 1.1 jmcneill /** 36 1.1 jmcneill * MultU64x32() - multiply 37 1.1 jmcneill */ 38 1.1 jmcneill UINT64 39 1.1 jmcneill MultU64x32 ( 40 1.1 jmcneill IN UINT64 Multiplicand, 41 1.1 jmcneill IN UINTN Multiplier 42 1.1 jmcneill ) 43 1.1 jmcneill { 44 1.1 jmcneill return Multiplicand * Multiplier; 45 1.1 jmcneill } 46 1.1 jmcneill 47 1.1 jmcneill /** 48 1.1 jmcneill * DivU64x32() - divide 49 1.1 jmcneill */ 50 1.1 jmcneill UINT64 51 1.1 jmcneill DivU64x32 ( 52 1.1 jmcneill IN UINT64 Dividend, 53 1.1 jmcneill IN UINTN Divisor, 54 1.1 jmcneill OUT UINTN *Remainder OPTIONAL 55 1.1 jmcneill ) 56 1.1 jmcneill { 57 1.1 jmcneill ASSERT(Divisor != 0); 58 1.1 jmcneill 59 1.1 jmcneill if (Remainder) { 60 1.1 jmcneill *Remainder = Dividend % Divisor; 61 1.1 jmcneill } 62 1.1 jmcneill 63 1.1 jmcneill return Dividend / Divisor; 64 1.1 jmcneill } 65