1*588cb88cSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 2b35cd988SPalmer Dabbelt /* 3b35cd988SPalmer Dabbelt */ 4b35cd988SPalmer Dabbelt 5b35cd988SPalmer Dabbelt #include <linux/export.h> 6b35cd988SPalmer Dabbelt 74db2b604SChristoph Hellwig #include <linux/libgcc.h> 8b35cd988SPalmer Dabbelt __ashrdi3(long long u,word_type b)9b35cd988SPalmer Dabbeltlong long notrace __ashrdi3(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 = 1..1 or 0..0 */ 22b35cd988SPalmer Dabbelt w.s.high = 23b35cd988SPalmer Dabbelt uu.s.high >> 31; 24b35cd988SPalmer Dabbelt w.s.low = uu.s.high >> -bm; 25b35cd988SPalmer Dabbelt } else { 26b35cd988SPalmer Dabbelt const unsigned int carries = (unsigned int) uu.s.high << bm; 27b35cd988SPalmer Dabbelt 28b35cd988SPalmer Dabbelt w.s.high = uu.s.high >> b; 29b35cd988SPalmer Dabbelt w.s.low = ((unsigned int) uu.s.low >> b) | carries; 30b35cd988SPalmer Dabbelt } 31b35cd988SPalmer Dabbelt 32b35cd988SPalmer Dabbelt return w.ll; 33b35cd988SPalmer Dabbelt } 34b35cd988SPalmer Dabbelt EXPORT_SYMBOL(__ashrdi3); 35