xref: /rk3399_ARM-atf/lib/compiler-rt/builtins/lshrdi3.c (revision 9900d4eb06605c6ff79801c4371445d245b7b2fb)
1*8a6a9560SDaniel Boulby //===-- lshrdi3.c - Implement __lshrdi3 -----------------------------------===//
2*8a6a9560SDaniel Boulby //
3*8a6a9560SDaniel Boulby // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*8a6a9560SDaniel Boulby // See https://llvm.org/LICENSE.txt for license information.
5*8a6a9560SDaniel Boulby // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*8a6a9560SDaniel Boulby //
7*8a6a9560SDaniel Boulby //===----------------------------------------------------------------------===//
8*8a6a9560SDaniel Boulby //
9*8a6a9560SDaniel Boulby // This file implements __lshrdi3 for the compiler_rt library.
10*8a6a9560SDaniel Boulby //
11*8a6a9560SDaniel Boulby //===----------------------------------------------------------------------===//
12638d2b51SSandrine Bailleux 
13638d2b51SSandrine Bailleux #include "int_lib.h"
14638d2b51SSandrine Bailleux 
15*8a6a9560SDaniel Boulby // Returns: logical a >> b
16638d2b51SSandrine Bailleux 
17*8a6a9560SDaniel Boulby // Precondition:  0 <= b < bits_in_dword
18638d2b51SSandrine Bailleux 
__lshrdi3(di_int a,int b)19*8a6a9560SDaniel Boulby COMPILER_RT_ABI di_int __lshrdi3(di_int a, int b) {
20638d2b51SSandrine Bailleux   const int bits_in_word = (int)(sizeof(si_int) * CHAR_BIT);
21638d2b51SSandrine Bailleux   udwords input;
22638d2b51SSandrine Bailleux   udwords result;
23638d2b51SSandrine Bailleux   input.all = a;
24*8a6a9560SDaniel Boulby   if (b & bits_in_word) /* bits_in_word <= b < bits_in_dword */ {
25638d2b51SSandrine Bailleux     result.s.high = 0;
26638d2b51SSandrine Bailleux     result.s.low = input.s.high >> (b - bits_in_word);
27*8a6a9560SDaniel Boulby   } else /* 0 <= b < bits_in_word */ {
28638d2b51SSandrine Bailleux     if (b == 0)
29638d2b51SSandrine Bailleux       return a;
30638d2b51SSandrine Bailleux     result.s.high = input.s.high >> b;
31638d2b51SSandrine Bailleux     result.s.low = (input.s.high << (bits_in_word - b)) | (input.s.low >> b);
32638d2b51SSandrine Bailleux   }
33638d2b51SSandrine Bailleux   return result.all;
34638d2b51SSandrine Bailleux }
35638d2b51SSandrine Bailleux 
36638d2b51SSandrine Bailleux #if defined(__ARM_EABI__)
37*8a6a9560SDaniel Boulby COMPILER_RT_ALIAS(__lshrdi3, __aeabi_llsr)
38638d2b51SSandrine Bailleux #endif
39