gpt4 book ai didi

javascript - OOL(越界)代码

转载 作者:行者123 更新时间:2023-12-01 03:21:47 26 4
gpt4 key购买 nike

什么是 OOL(越界)代码?我在 ION 编译器中找到了它,但无法理解发生了什么。

bool CodeGeneratorShared::generateOutOfLineCode() {
for (size_t i = 0; i < outOfLineCode_.length(); i++) {
// Add native => bytecode mapping entries for OOL sites.
// Not enabled on asm.js yet since asm doesn't contain bytecode mappings.
if (!gen->compilingAsmJS()) {
if (!addNativeToBytecodeEntry(outOfLineCode_[i]->bytecodeSite()))
return false;
}

if (!gen->alloc().ensureBallast())
return false;

JitSpew(JitSpew_Codegen, "# Emitting out of line code");

masm.setFramePushed(outOfLineCode_[i]->framePushed());
lastPC_ = outOfLineCode_[i]->pc();
outOfLineCode_[i]->bind(&masm);

outOfLineCode_[i]->generate(this);
}

return !masm.oom();
}

我尝试使用谷歌查找有关它的信息,但没有成功。也许你可以告诉我它是什么?谢谢:)

最佳答案

我查看了源代码,似乎这里的“out of line”是指在正常代码/函数之后生成的代码。

参见例如CodeGenerator::generate 基本上看起来像这样:

generateProlog();
generateBody();
generateEpilog();
generateOutOfLineCode();

因此,代码结束后会生成外线代码。这通常用于异常控制流,并将调用去优化、抛出异常等的代码保留在指令缓存和“正常”程序代码之外。

假设我们有一个函数 int f(int a, int b) { return a/b; } 并且语言语义强制我们在除数为 0 时抛出异常。这是伪汇编中的代码:

  cmp b, 0
jump-if-not-zero lbl1
call throw_exception

lbl1:
div c, a, b
ret c

可以看到正常的程序流程需要跳过抛出异常的代码。通常 b 在几乎所有情况下都不为零,因此这看起来有点浪费。通过外行代码,我们可以生成更高效的代码:

  cmp b, 0
jump-if-zero out-of-line1
div c, a, b
ret c

out-of-line1:
call throw_exception

这里我们只跳转到零值,这应该是很少见的。 cmpdiv 指令也彼此更接近,这有利于指令缓存的使用。

在我的 JIT 中,我正在生成用于空指针异常抛出、失败断言等的行外代码。JS 和 IonMonkey 可能将其用于不同的操作。我发现的一个外线代码示例是 WASM 的 OutOfLineTruncateF32OrF64ToI32 类,它扩展了所有外线代码的基类 OutOfLineCode

还有一个好处是,IonMonkey 中的外线代码可以使用字段 rejoin 跳回正常代码流。

关于javascript - OOL(越界)代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45136308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com