Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / ast / src / cpp / analysis / InttypeAnalyzer.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #include "AnalysisVisitor.hxx"
17 #include "analyzers/InttypeAnalyzer.hxx"
18 #include "tools.hxx"
19 #include "double.hxx"
20
21 namespace analysis
22 {
23 bool InttypeAnalyzer::analyze(AnalysisVisitor & visitor, const unsigned int lhs, ast::CallExp & e)
24 {
25     if (lhs != 1)
26     {
27         return false;
28     }
29
30     const ast::exps_t args = e.getArgs();
31     if (args.size() != 1)
32     {
33         return false;
34     }
35
36     ast::Exp * arg = args.back();
37     arg->accept(visitor);
38     TIType & typ = visitor.getResult().getType();
39     double code;
40     switch (typ.type)
41     {
42         case TIType::EMPTY :
43         case TIType::DOUBLE :
44             code = 0;
45             break;
46         case TIType::INT8 :
47             code = 1;
48             break;
49         case TIType::INT16 :
50             code = 2;
51             break;
52         case TIType::INT32 :
53             code = 4;
54             break;
55         case TIType::INT64 :
56             code = 8;
57             break;
58         case TIType::UINT8 :
59             code = 11;
60             break;
61         case TIType::UINT16 :
62             code = 12;
63             break;
64         case TIType::UINT32 :
65             code = 14;
66             break;
67         case TIType::UINT64 :
68             code = 18;
69             break;
70         default :
71             code = -1;
72     }
73
74     if (code != -1)
75     {
76         TIType type(visitor.getGVN(), TIType::DOUBLE);
77         Result & res = e.getDecorator().setResult(type);
78         res.getConstant() = visitor.getGVN().getValue(code);
79         e.getDecorator().setCall("inttype");
80         visitor.setResult(res);
81         return true;
82     }
83     else
84     {
85         return false;
86     }
87 }
88 }