comparison dmd/expression/Util.d @ 53:a8b50ff7f201

ForeachStatement.syntaxCopy SliceExp.syntaxCopy AnonDeclaration.syntaxCopy SwitchStatement.syntaxCopy CaseStatement.syntaxCopy BreakStatement.syntaxCopy ThrowStatement.syntaxCopy NewExp.syntaxCopy DefaultStatement.syntaxCopy AssertExp.syntaxCopy ClassDeclaration.syntaxCopy TypeTypedef.constConv eval_builtin ComplexExp.isConst DVCondition.syntaxCopy OrExp.getIntRange AndExp.getIntRange getMask IntegerExp.getIntRange Type.sizemask CastExp.getIntRange Expression.getIntRange
author korDen
date Sat, 21 Aug 2010 12:15:47 +0400
parents ddae60498573
children 3adbb28755e8
comparison
equal deleted inserted replaced
52:69d078c417c6 53:a8b50ff7f201
1 module dmd.expression.Util; 1 module dmd.expression.Util;
2 2
3 import dmd.Expression; 3 import dmd.Expression;
4 import dmd.Loc; 4 import dmd.Loc;
5 import dmd.BUILTIN; 5 import dmd.RealExp;
6 import dmd.Scope; 6 import dmd.Scope;
7 import dmd.FuncExp; 7 import dmd.FuncExp;
8 import dmd.DelegateExp; 8 import dmd.DelegateExp;
9 import dmd.LINK; 9 import dmd.LINK;
10 import dmd.NullExp; 10 import dmd.NullExp;
32 import dmd.DotIdExp; 32 import dmd.DotIdExp;
33 import dmd.DotVarExp; 33 import dmd.DotVarExp;
34 import dmd.CallExp; 34 import dmd.CallExp;
35 import dmd.TY; 35 import dmd.TY;
36 import dmd.MATCH; 36 import dmd.MATCH;
37 import dmd.BUILTIN;
37 import dmd.TypeFunction; 38 import dmd.TypeFunction;
38 import dmd.declaration.Match; 39 import dmd.declaration.Match;
39 import dmd.ArrayTypes; 40 import dmd.ArrayTypes;
40 import dmd.Declaration; 41 import dmd.Declaration;
41 import dmd.FuncAliasDeclaration; 42 import dmd.FuncAliasDeclaration;
943 /************************************** 944 /**************************************
944 * Evaluate builtin function. 945 * Evaluate builtin function.
945 * Return result: null if cannot evaluate it. 946 * Return result: null if cannot evaluate it.
946 */ 947 */
947 948
949 extern(C) extern real sinl(real);
950 extern(C) extern real cosl(real);
951 extern(C) extern real tanl(real);
952 extern(C) extern real sqrtl(real);
953 extern(C) extern real fabsl(real);
954
948 Expression eval_builtin(BUILTIN builtin, Expressions arguments) 955 Expression eval_builtin(BUILTIN builtin, Expressions arguments)
949 { 956 {
950 assert(false); 957 assert(arguments && arguments.dim);
958 Expression arg0 = cast(Expression)arguments.data[0];
959 Expression e = null;
960 switch (builtin)
961 {
962 case BUILTINsin:
963 if (arg0.op == TOKfloat64)
964 e = new RealExp(Loc(0), sinl(arg0.toReal()), arg0.type);
965 break;
966
967 case BUILTINcos:
968 if (arg0.op == TOKfloat64)
969 e = new RealExp(Loc(0), cosl(arg0.toReal()), arg0.type);
970 break;
971
972 case BUILTINtan:
973 if (arg0.op == TOKfloat64)
974 e = new RealExp(Loc(0), tanl(arg0.toReal()), arg0.type);
975 break;
976
977 case BUILTINsqrt:
978 if (arg0.op == TOKfloat64)
979 e = new RealExp(Loc(0), sqrtl(arg0.toReal()), arg0.type);
980 break;
981
982 case BUILTINfabs:
983 if (arg0.op == TOKfloat64)
984 e = new RealExp(Loc(0), fabsl(arg0.toReal()), arg0.type);
985 break;
986 }
987 return e;
951 } 988 }
952 989
953 Expression fromConstInitializer(int result, Expression e1) 990 Expression fromConstInitializer(int result, Expression e1)
954 { 991 {
955 //printf("fromConstInitializer(result = %x, %s)\n", result, e1.toChars()); 992 //printf("fromConstInitializer(result = %x, %s)\n", result, e1.toChars());
1378 expToCBuffer(buf, hgs, arg, PREC.PREC_assign); 1415 expToCBuffer(buf, hgs, arg, PREC.PREC_assign);
1379 } 1416 }
1380 } 1417 }
1381 } 1418 }
1382 } 1419 }
1420
1421 ulong getMask(ulong v)
1422 {
1423 ulong u = 0;
1424 if (v >= 0x80)
1425 u = 0xFF;
1426 while (u < v)
1427 u = (u << 1) | 1;
1428 return u;
1429 }