0
|
1 module dmd.expression.shift_optimize;
|
|
2
|
114
|
3 import dmd.common;
|
0
|
4 import dmd.Expression;
|
|
5 import dmd.BinExp;
|
|
6 import dmd.Type;
|
|
7 import dmd.IntegerExp;
|
|
8
|
|
9 Expression shift_optimize(int result, BinExp e, Expression function(Type, Expression, Expression) shift)
|
|
10 {
|
|
11 Expression ex = e;
|
|
12
|
|
13 e.e1 = e.e1.optimize(result);
|
|
14 e.e2 = e.e2.optimize(result);
|
|
15
|
|
16 if (e.e2.isConst() == 1)
|
|
17 {
|
|
18 long i2 = e.e2.toInteger();
|
|
19 ulong sz = e.e1.type.size() * 8;
|
|
20
|
|
21 if (i2 < 0 || i2 > sz)
|
|
22 {
|
|
23 e.error("shift by %jd is outside the range 0..%zu", i2, sz);
|
|
24 e.e2 = new IntegerExp(0);
|
|
25 }
|
|
26
|
|
27 if (e.e1.isConst() == 1) {
|
|
28 ex = shift(e.type, e.e1, e.e2);
|
|
29 }
|
|
30 }
|
|
31
|
|
32 return ex;
|
|
33 } |