1*588cb88cSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 2b35cd988SPalmer Dabbelt /* 3b35cd988SPalmer Dabbelt * lib/lshrdi3.c 4b35cd988SPalmer Dabbelt */ 5b35cd988SPalmer Dabbelt 6b35cd988SPalmer Dabbelt #include <linux/module.h> 74db2b604SChristoph Hellwig #include <linux/libgcc.h> 8b35cd988SPalmer Dabbelt __lshrdi3(long long u,word_type b)9b35cd988SPalmer Dabbeltlong long notrace __lshrdi3(long long u, word_type b) 10b35cd988SPalmer Dabbelt { 11b35cd988SPalmer Dabbelt DWunion uu, w; 12b35cd988SPalmer Dabbelt word_type bm; 13b35cd988SPalmer Dabbelt 14b35cd988SPalmer Dabbelt if (b == 0) 15b35cd988SPalmer Dabbelt return u; 16b35cd988SPalmer Dabbelt 17b35cd988SPalmer Dabbelt uu.ll = u; 18b35cd988SPalmer Dabbelt bm = 32 - b; 19b35cd988SPalmer Dabbelt 20b35cd988SPalmer Dabbelt if (bm <= 0) { 21b35cd988SPalmer Dabbelt w.s.high = 0; 22b35cd988SPalmer Dabbelt w.s.low = (unsigned int) uu.s.high >> -bm; 23b35cd988SPalmer Dabbelt } else { 24b35cd988SPalmer Dabbelt const unsigned int carries = (unsigned int) uu.s.high << bm; 25b35cd988SPalmer Dabbelt 26b35cd988SPalmer Dabbelt w.s.high = (unsigned int) uu.s.high >> b; 27b35cd988SPalmer Dabbelt w.s.low = ((unsigned int) uu.s.low >> b) | carries; 28b35cd988SPalmer Dabbelt } 29b35cd988SPalmer Dabbelt 30b35cd988SPalmer Dabbelt return w.ll; 31b35cd988SPalmer Dabbelt } 32b35cd988SPalmer Dabbelt EXPORT_SYMBOL(__lshrdi3); 33