#include <linux/export.h>
18
19#include <linux/libgcc.h>
20
21long long notrace __ashldi3(long long u, word_type b)
22{
23 DWunion uu, w;
24 word_type bm;
25
26 if (b == 0)
27 return u;
28
29 uu.ll = u;
30 bm = 32 - b;
31
32 if (bm <= 0) {
33 w.s.low = 0;
34 w.s.high = (unsigned int) uu.s.low << -bm;
35 } else {
36 const unsigned int carries = (unsigned int) uu.s.low >> bm;
37
38 w.s.low = (unsigned int) uu.s.low << b;
39 w.s.high = ((unsigned int) uu.s.high << b) | carries;
40 }
41
42 return w.ll;
43}
44EXPORT_SYMBOL(__ashldi3);
本文主要用于实现long long类型的数据的左移操作,对于32位机器来说,则是对64位数进行左移操作(然后分成2个32位数的移位,最后将结果整合)
ashrdi3.c类似,只是向右移动