1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2015, Linaro Limited 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright notice, 13 * this list of conditions and the following disclaimer in the documentation 14 * and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 union dword { 30 unsigned long long dw; 31 unsigned long w[2]; 32 }; 33 34 long long __aeabi_llsl(long long a, int shift); 35 long long __aeabi_llsl(long long a, int shift) 36 { 37 union dword dword = { .dw = a }; 38 unsigned long hi = dword.w[1]; 39 unsigned long lo = dword.w[0]; 40 41 if (shift >= 32) { 42 hi = lo << (shift - 32); 43 lo = 0; 44 } else if (shift > 0) { 45 hi = (hi << shift) | (lo >> (32 - shift)); 46 lo = lo << shift; 47 } 48 49 dword.w[1] = hi; 50 dword.w[0] = lo; 51 return dword.dw; 52 } 53 54 long long __aeabi_llsr(long long a, int shift); 55 long long __aeabi_llsr(long long a, int shift) 56 { 57 union dword dword = { .dw = a }; 58 unsigned long hi = dword.w[1]; 59 unsigned long lo = dword.w[0]; 60 61 if (shift >= 32) { 62 lo = hi >> (shift - 32); 63 hi = 0; 64 } else if (shift > 0) { 65 lo = (lo >> shift) | (hi << (32 - shift)); 66 hi = hi >> shift; 67 } 68 69 dword.w[1] = hi; 70 dword.w[0] = lo; 71 return dword.dw; 72 } 73