1 /** @file 2 Integer Arithmetic Run-time support functions for GCC. 3 The integer arithmetic routines are used on platforms that don't provide 4 hardware support for arithmetic operations on some modes.. 5 6 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR> 7 This program and the accompanying materials are licensed and made available 8 under the terms and conditions of the BSD License which accompanies this 9 distribution. The full text of the license may be found at 10 http://opensource.org/licenses/bsd-license. 11 12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 14 15 **/ 16 #include <Uefi.h> 17 #include <Library/DebugLib.h> 18 #include <sys/EfiCdefs.h> 19 20 #include <Library/BaseLib.h> 21 22 // Shift Datum left by Count bits. 23 // =========================================================================== 24 int __ashlsi3(int Datum, int Count) 25 { 26 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 27 return (int) LShiftU64 ((UINT64)Datum, (UINTN)Count); 28 } 29 30 long __ashldi3(long Datum, int Count) 31 { 32 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 33 return (long) LShiftU64 ((UINT64)Datum, (UINTN)Count); 34 } 35 36 long long __ashlti3(long long Datum, int Count) 37 { 38 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 39 return (long long) LShiftU64 ((UINT64)Datum, (UINTN)Count); 40 } 41 42 // Arithmetically shift Datum right by Count bits. 43 // =========================================================================== 44 int __ashrsi3(int Datum, int Count) 45 { 46 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 47 return (int) ARShiftU64 ((UINT64) Datum, (UINTN)Count); 48 } 49 50 long __ashrdi3(long Datum, int Count) 51 { 52 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 53 return (long) ARShiftU64 ((UINT64) Datum, (UINTN)Count); 54 } 55 56 long long __ashrti3(long long Datum, int Count) 57 { 58 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 59 return (long long) ARShiftU64 ((UINT64) Datum, (UINTN)Count); 60 } 61 62 // Return the quotient of the signed division of Dividend and Divisor 63 // =========================================================================== 64 int __divsi3(int Dividend, int Divisor) 65 { 66 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 67 return (int) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, NULL); 68 } 69 70 INT64 __divdi3(INT64 Dividend, INT64 Divisor) 71 { 72 INT64 Quotient; 73 74 Quotient = DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, NULL); 75 DEBUG((DEBUG_INFO, "%a: %Ld / %Ld = %Ld\n", __func__, Dividend, Divisor, Quotient)); 76 77 return Quotient; 78 } 79 80 long long __divti3(long long Dividend, long long Divisor) 81 { 82 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 83 return (long long) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, NULL); 84 } 85 86 // Logically shift Datum right by Count bits 87 // =========================================================================== 88 int __lshrsi3(int Datum, int Count) 89 { 90 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 91 return (int) RShiftU64 ((UINT64) Datum, (UINTN)Count); 92 } 93 94 long __lshrdi3(int Datum, int Count) 95 { 96 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 97 return (long) RShiftU64 ((UINT64) Datum, (UINTN)Count); 98 } 99 100 long long __lshrti3(int Datum, int Count) 101 { 102 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 103 return (long long) RShiftU64 ((UINT64) Datum, (UINTN)Count); 104 } 105 106 // Return the remainder of the signed division of Dividend and Divisor 107 // =========================================================================== 108 int __modsi3(int Dividend, int Divisor) 109 { 110 INT64 Remainder; 111 112 (void) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, &Remainder); 113 DEBUG((DEBUG_INFO, "modsi3: %d %% %d = %d\n", Dividend, Divisor, (int)Remainder)); 114 115 return (int) Remainder; 116 } 117 118 INT64 __moddi3(INT64 Dividend, INT64 Divisor) 119 { 120 INT64 Remainder; 121 122 (void) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, &Remainder); 123 DEBUG((DEBUG_INFO, "moddi3: %Ld %% %Ld = %Ld\n", (INT64)Dividend, (INT64)Divisor, Remainder)); 124 125 return Remainder; 126 } 127 128 long long __modti3(long long Dividend, long long Divisor) 129 { 130 INT64 Remainder; 131 132 (void) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, &Remainder); 133 DEBUG((DEBUG_INFO, "modti3: %Ld %% %Ld = %Ld\n", (INT64)Dividend, (INT64)Divisor, Remainder)); 134 135 return (long long) Remainder; 136 } 137 138 // These functions return the product of the Multiplicand and Multiplier. 139 // =========================================================================== 140 long long __multi3(long long Multiplicand, long long Multiplier) 141 { 142 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 143 return (long long) MultS64x64 ((INT64)Multiplicand, (INT64)Multiplier); 144 } 145 146 // Return the quotient of the unsigned division of a and b. 147 // =========================================================================== 148 unsigned int __udivsi3(unsigned int Dividend, unsigned int Divisor) 149 { 150 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 151 return (int) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, NULL); 152 } 153 154 unsigned long __udivdi3(unsigned long Dividend, unsigned long Divisor) 155 { 156 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 157 return (long) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, NULL); 158 } 159 160 unsigned long long __udivti3(unsigned long long Dividend, unsigned long long Divisor) 161 { 162 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 163 return (long long) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, NULL); 164 } 165 166 // =========================================================================== 167 unsigned int __umodsi3(unsigned int Dividend, unsigned int Divisor) 168 { 169 UINT64 Remainder; 170 171 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 172 (void) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, &Remainder); 173 174 return (unsigned int) Remainder; 175 } 176 177 unsigned long __umoddi3(unsigned long Dividend, unsigned long Divisor) 178 { 179 UINT64 Remainder; 180 181 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 182 (void) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, &Remainder); 183 184 return (unsigned long) Remainder; 185 } 186 187 unsigned long long __umodti3(unsigned long long Dividend, unsigned long long Divisor) 188 { 189 UINT64 Remainder; 190 191 DEBUG((DEBUG_INFO, "%a:\n", __func__)); 192 (void) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, &Remainder); 193 194 return (unsigned long long) Remainder; 195 } 196