Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/CodeGen/include/Luau/IrCallWrapperX64.h
2727 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/IrData.h"
6
#include "Luau/OperandX64.h"
7
#include "Luau/RegisterX64.h"
8
9
#include <array>
10
11
// TODO: call wrapper can be used to suggest target registers for ScopedRegX64 to compute data into argument registers directly
12
13
namespace Luau
14
{
15
namespace CodeGen
16
{
17
namespace X64
18
{
19
20
struct IrRegAllocX64;
21
struct ScopedRegX64;
22
23
struct CallArgument
24
{
25
SizeX64 targetSize = SizeX64::none;
26
27
OperandX64 source = noreg;
28
IrOp sourceOp;
29
30
OperandX64 target = noreg;
31
bool candidate = true;
32
};
33
34
class IrCallWrapperX64
35
{
36
public:
37
IrCallWrapperX64(IrRegAllocX64& regs, AssemblyBuilderX64& build, uint32_t instIdx = kInvalidInstIdx);
38
39
void addArgument(SizeX64 targetSize, OperandX64 source, IrOp sourceOp = {});
40
void addArgument(SizeX64 targetSize, ScopedRegX64& scopedReg);
41
42
void call(const OperandX64& func);
43
44
RegisterX64 suggestNextArgumentRegister(SizeX64 size) const;
45
46
IrRegAllocX64& regs;
47
AssemblyBuilderX64& build;
48
uint32_t instIdx = ~0u;
49
50
private:
51
OperandX64 getNextArgumentTarget(SizeX64 size) const;
52
void countRegisterUses();
53
CallArgument* findNonInterferingArgument();
54
bool interferesWithOperand(const OperandX64& op, RegisterX64 reg) const;
55
bool interferesWithActiveSources(const CallArgument& targetArg, int targetArgIndex) const;
56
bool interferesWithActiveTarget(RegisterX64 sourceReg) const;
57
void moveToTarget(CallArgument& arg);
58
void freeSourceRegisters(CallArgument& arg);
59
void renameRegister(RegisterX64& target, RegisterX64 reg, RegisterX64 replacement);
60
void renameSourceRegisters(RegisterX64 reg, RegisterX64 replacement);
61
RegisterX64 findConflictingTarget() const;
62
void renameConflictingRegister(RegisterX64 conflict);
63
64
int getRegisterUses(RegisterX64 reg) const;
65
void addRegisterUse(RegisterX64 reg);
66
void removeRegisterUse(RegisterX64 reg);
67
68
static const int kMaxCallArguments = 6;
69
std::array<CallArgument, kMaxCallArguments> args;
70
int argCount = 0;
71
72
int gprPos = 0;
73
int xmmPos = 0;
74
75
OperandX64 funcOp;
76
77
// Internal counters for remaining register use counts
78
std::array<uint8_t, 16> gprUses;
79
std::array<uint8_t, 16> xmmUses;
80
};
81
82
} // namespace X64
83
} // namespace CodeGen
84
} // namespace Luau
85
86