aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_p.h
blob: e06b39c981308ea6146fb327fb9c30d0aa7d87d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#ifndef QV4ISEL_P_H
#define QV4ISEL_P_H

#include "qv4ir_p.h"
#include "qmljs_objects.h"

#include <QtCore/QHash>

namespace QQmlJS {
namespace x86_64 {

class InstructionSelection: protected IR::StmtVisitor
{
public:
    InstructionSelection(IR::Module *module, uchar *code);
    ~InstructionSelection();

    void operator()(IR::Function *function);

protected:
    VM::String *identifier(const QString &s);
    int tempOffset(IR::Temp *t);
    void loadTempAddress(int reg, IR::Temp *t);
    void callActivationProperty(IR::Call *call, IR::Temp *result);
    void callProperty(IR::Call *call, IR::Temp *result);
    void constructActivationProperty(IR::New *call, IR::Temp *result);

    virtual void visitExp(IR::Exp *);
    virtual void visitEnter(IR::Enter *);
    virtual void visitLeave(IR::Leave *);
    virtual void visitMove(IR::Move *);
    virtual void visitJump(IR::Jump *);
    virtual void visitCJump(IR::CJump *);
    virtual void visitRet(IR::Ret *);

private:
    IR::Module *_module;
    IR::Function *_function;
    IR::BasicBlock *_block;
    uchar *_buffer;
    uchar *_code;
    uchar *_codePtr;
    QHash<IR::BasicBlock *, QVector<uchar *> > _patches;
    QHash<IR::BasicBlock *, uchar *> _addrs;
    QHash<QString, VM::String *> _identifiers;
};

} // end of namespace x86_64
} // end of namespace QQmlJS

#endif // QV4ISEL_P_H