Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/CodeGen/src/IrLoweringX64.h
2725 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
#pragma once
3
4
#include "Luau/AssemblyBuilderX64.h"
5
#include "Luau/DenseHash.h"
6
#include "Luau/IrData.h"
7
#include "Luau/IrRegAllocX64.h"
8
9
#include "IrValueLocationTracking.h"
10
11
#include <vector>
12
13
struct Proto;
14
15
namespace Luau
16
{
17
namespace CodeGen
18
{
19
20
struct ModuleHelpers;
21
struct AssemblyOptions;
22
struct LoweringStats;
23
enum class CodeGenCounter : unsigned;
24
25
namespace X64
26
{
27
28
struct IrLoweringX64
29
{
30
IrLoweringX64(AssemblyBuilderX64& build, ModuleHelpers& helpers, IrFunction& function, LoweringStats* stats);
31
32
void lowerInst(IrInst& inst, uint32_t index, const IrBlock& next);
33
void startBlock(const IrBlock& curr);
34
void finishBlock(const IrBlock& curr, const IrBlock& next);
35
void finishFunction();
36
37
bool hasError() const;
38
39
bool isFallthroughBlock(const IrBlock& target, const IrBlock& next);
40
void jumpOrFallthrough(IrBlock& target, const IrBlock& next);
41
42
Label& getTargetLabel(IrOp op, Label& fresh);
43
void finalizeTargetLabel(IrOp op, Label& fresh);
44
45
void jumpOrAbortOnUndef(ConditionX64 cond, IrOp target, const IrBlock& next);
46
void jumpOrAbortOnUndef(IrOp target, const IrBlock& next);
47
48
void storeFloat(OperandX64 dst, IrOp src);
49
void storeDoubleAsFloat(OperandX64 dst, IrOp src);
50
void checkSafeEnv(IrOp target, const IrBlock& next);
51
52
void allocAndIncrementCounterAt(CodeGenCounter kind, uint32_t pcpos);
53
void incrementCounterAt(size_t offset);
54
55
// Operand data lookup helpers
56
OperandX64 memRegDoubleOp(IrOp op);
57
OperandX64 memRegFloatOp(IrOp op);
58
OperandX64 memRegUintOp(IrOp op);
59
OperandX64 memRegIntOp(IrOp op);
60
OperandX64 memRegTagOp(IrOp op);
61
RegisterX64 regOp(IrOp op);
62
OperandX64 bufferAddrOp(IrOp bufferOp, IrOp indexOp, uint8_t tag);
63
RegisterX64 vecOp(IrOp op, ScopedRegX64& tmp);
64
65
IrConst constOp(IrOp op) const;
66
uint8_t tagOp(IrOp op) const;
67
int intOp(IrOp op) const;
68
unsigned uintOp(IrOp op) const;
69
unsigned importOp(IrOp op) const;
70
double doubleOp(IrOp op) const;
71
72
IrBlock& blockOp(IrOp op) const;
73
Label& labelOp(IrOp op) const;
74
75
OperandX64 vectorAndMaskOp();
76
77
struct InterruptHandler
78
{
79
Label self;
80
unsigned int pcpos;
81
Label next;
82
};
83
84
struct ExitHandler
85
{
86
Label self;
87
unsigned int pcpos;
88
};
89
90
AssemblyBuilderX64& build;
91
ModuleHelpers& helpers;
92
93
IrFunction& function;
94
LoweringStats* stats = nullptr;
95
96
IrRegAllocX64 regs;
97
98
IrValueLocationTracking valueTracker;
99
100
std::vector<InterruptHandler> interruptHandlers;
101
std::vector<ExitHandler> exitHandlers;
102
DenseHashMap<uint32_t, uint32_t> exitHandlerMap;
103
104
OperandX64 vectorAndMask = noreg;
105
OperandX64 vectorOrMask = noreg;
106
};
107
108
} // namespace X64
109
} // namespace CodeGen
110
} // namespace Luau
111
112