Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/CodeGen/src/EmitBuiltinsX64.cpp
2725 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
#include "EmitBuiltinsX64.h"
3
4
#include "Luau/Bytecode.h"
5
6
#include "Luau/AssemblyBuilderX64.h"
7
#include "Luau/IrCallWrapperX64.h"
8
#include "Luau/IrRegAllocX64.h"
9
10
#include "EmitCommonX64.h"
11
#include "NativeState.h"
12
13
#include "lstate.h"
14
15
namespace Luau
16
{
17
namespace CodeGen
18
{
19
namespace X64
20
{
21
22
static void emitBuiltinMathFrexp(IrRegAllocX64& regs, AssemblyBuilderX64& build, int ra, int arg, int nresults)
23
{
24
IrCallWrapperX64 callWrap(regs, build);
25
callWrap.addArgument(SizeX64::xmmword, luauRegValue(arg));
26
callWrap.addArgument(SizeX64::qword, sTemporarySlot);
27
callWrap.call(qword[rNativeContext + offsetof(NativeContext, libm_frexp)]);
28
29
build.vmovsd(luauRegValue(ra), xmm0);
30
build.mov(luauRegTag(ra), LUA_TNUMBER);
31
32
if (nresults > 1)
33
{
34
build.vcvtsi2sd(xmm0, xmm0, dword[sTemporarySlot + 0]);
35
build.vmovsd(luauRegValue(ra + 1), xmm0);
36
build.mov(luauRegTag(ra + 1), LUA_TNUMBER);
37
}
38
}
39
40
static void emitBuiltinMathModf(IrRegAllocX64& regs, AssemblyBuilderX64& build, int ra, int arg, int nresults)
41
{
42
IrCallWrapperX64 callWrap(regs, build);
43
callWrap.addArgument(SizeX64::xmmword, luauRegValue(arg));
44
callWrap.addArgument(SizeX64::qword, sTemporarySlot);
45
callWrap.call(qword[rNativeContext + offsetof(NativeContext, libm_modf)]);
46
47
build.vmovsd(xmm1, qword[sTemporarySlot + 0]);
48
build.vmovsd(luauRegValue(ra), xmm1);
49
build.mov(luauRegTag(ra), LUA_TNUMBER);
50
51
if (nresults > 1)
52
{
53
build.vmovsd(luauRegValue(ra + 1), xmm0);
54
build.mov(luauRegTag(ra + 1), LUA_TNUMBER);
55
}
56
}
57
58
void emitBuiltin(IrRegAllocX64& regs, AssemblyBuilderX64& build, int bfid, int ra, int arg, int nresults)
59
{
60
switch (bfid)
61
{
62
case LBF_MATH_FREXP:
63
CODEGEN_ASSERT(nresults == 1 || nresults == 2);
64
return emitBuiltinMathFrexp(regs, build, ra, arg, nresults);
65
case LBF_MATH_MODF:
66
CODEGEN_ASSERT(nresults == 1 || nresults == 2);
67
return emitBuiltinMathModf(regs, build, ra, arg, nresults);
68
default:
69
CODEGEN_ASSERT(!"Missing x64 lowering");
70
}
71
}
72
73
} // namespace X64
74
} // namespace CodeGen
75
} // namespace Luau
76
77