如何动态地将分支目标提示到 x64 CPU?

2023-12-19

我想知道如何用 C、C++ 或汇编语言为 x64 处理器编写高效的跳转表。输入是预先已知的,但不可能通过算法来预测。假设我可以在输入流中查看尽可能远的位置,有什么方法可以动态地告诉 CPU 下一个分支将转到哪个地址?

本质上,我想以编程方式更新分支目标缓冲区。但我会满足于任何允许我避免刷新管道的情况,如果程序员通过查看数据提前知道下一个分支要去哪里,但处理器无法从过去的模式中确定这一点。

意识到这是一个非常具体的问题,而且我可能无法正确表达它,这里有一些替代措辞:

是否有一个 x64 相当于hbrCell 处理器上的 Branch 提示?

移动装配体有帮助吗cmp比安腾的条件分支更早?

间接跳转的预测目标是否基于寄存器值而不是最后使用的地址?

Thanks!


如果您无法找到确切的答案,那么您也许可以使用返回地址预测器而不是分支目标缓冲区。通用技术称为上下文线程,可以在论文中找到描述上下文线程:一种灵活高效的虚拟机解释器调度技术 http://csng.cs.toronto.edu/publication_files/162/demkea_context.pdf.

您的想法是:如果您能够展望未来足够远,对于决定控制流更改的每个输入,您可以 JIT 编译/发出单个直接call指令到一些可执行内存中。例如,如果您有 10 个输入单位,您将发出 10 次调用。

执行时,此代码将表现良好,因为每个被调用函数的返回地址将保持不变,并且所有调用都是直接的。

顺便说一句,我不是 CPU 架构专家,所以我可能会简化事情,但原则上我认为这应该可行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态地将分支目标提示到 x64 CPU? 的相关文章

  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • 为什么 printf 使用浮点和整数格式说明符打印随机值

    我在64位机器上写了一个简单的代码 int main printf d 2 443 所以 这就是编译器的行为方式 它将识别第二个参数为双精度型 因此它将在堆栈上压入 8 个字节 或者可能只是在调用之间使用寄存器来访问变量 d需要 4 字节整
  • 分支预测器和分支目标缓冲区如何共存?

    我的问题是它们如何在现代 CPU 架构中共存并协同工作 你把它稍微颠倒了 每次获取时 您都会索引到分支预测器 它会告诉您刚刚收到的指令是否will be解码为已采取的分支 如果没有 则获取下一个连续地址 但是 如果您的分支预测器说它将是一个
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • 学习 (N)ASM 的最佳资源是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想学习汇编已经有一段时间了 尽管我之前尝试过几次 但我还没有真正能够超越 Hello world 有
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 对将英特尔傲腾 DC SSD 用作 IMDT 的额外 RAM 感到困惑吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对英特尔傲腾 DC 有点困惑 我希望我的 Optane DC 能够同时充当 DRAM 和存储 一方面 我了解到只有 英特尔傲腾 DC 持
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 如何计算汇编中的内存位移?

    我一直在研究 yasm 汇编语言 并生成了一个包含以下内容的列表文件 我需要帮助理解第一列中的内存位移是如何计算的 提前致谢 1 line 1 1 memory asm 2 section data 3 00000000 04000000
  • 将 XMM 寄存器压入堆栈

    有没有办法将打包双字整数从 XMM 寄存器推送到堆栈 然后在需要时将其弹出 理想情况下 我正在寻找通用寄存器的 PUSH 或 POP 之类的东西 我已经检查了英特尔手册 但我要么错过了命令 要么没有 或者我是否必须将值解压到通用寄存器然后推
  • 为什么 mov %ax, %ds 汇编+反汇编为 mov %eax,%ds,与原来不一致?

    test S text global start start xor ax ax mov ax ds mov ax ss mov ax es mov ax fs mov ax gs 我通过这样做得到了反汇编代码文件 x86 64 elf g
  • x86 asm 图形设置的分辨率高于 640x480?

    我刚刚开始使用汇编语言 感觉像学习新东西 并且遇到了一些问题 到目前为止 我一直在浏览的所有教程都没有回答 或者太旧而无法知道 1 我尝试了一些搜索 也许我只是不知道正确的关键字 但我找不到用于更改屏幕分辨率等的图形模式的更新列表 我发现的
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da

随机推荐

  • Django 信号 - kwargs['update_fields'] 在通过 django admin 进行模型更新时始终为 None

    我的 django 应用程序中有一个信号 我想检查模型中的某个字段是否已更新 以便我可以继续执行某些操作 我的模型看起来像这样 class Product models Model name models CharField max len
  • Auth::attempt() 在 Laravel 5.5 中不起作用

    我的注册表单正在运行 它将用户存储到数据库 但是当用户登录时 Auth attempt 返回 false 这是我的登录代码 我将密码以 sha1 加密形式存储在 db 中 Route post login function creds ar
  • 将 Pip 包传输到 conda

    我目前正在使用一台共享的 Ubuntu 机器 其中有蟒蛇2 7以及通过安装的多个软件包pip python version Python 2 7 12 pip version pip 18 0 from usr local lib pyth
  • 验证十进制数

    我正在阅读一些 csv 文件 其中包含表示十进制数的字符串 我的麻烦是 很多时候我接收使用不同区域设置的文件写入 例如 file1 csv的price列的值为129 13 是小数点分隔符 file1 csv的price列值为129 13 为
  • 如何计算密码学中的对数?

    我正在尝试对字节执行非线性函数来实现 SAFER 该算法需要计算字节的以 45 为底的对数 我不明白如何做到这一点 log45 201 1 39316393 当我将其分配给一个字节时 该值被截断为 1 并且我无法恢复确切的结果 我该怎么处理
  • 为什么这段 Javascript 代码这么慢?

    我有这段 Javascript 代码 在 Internet Explorer 中每次调用大约需要 600 毫秒 在其他浏览器中花费的时间可以忽略不计 var nvs currentTab var nvs zoomfield var nvs
  • 异步目录搜索器 (LDAP)

    我正在活动目录中执行长时间搜索 并且非常想使用 DirectorySearcher Asynchronous True 微软提供的文档很少MSDN http msdn microsoft com en us library system d
  • PHP 类:从被调用的方法访问调用实例

    很抱歉这个奇怪的话题 但我不知道如何用其他方式表达它 我正在尝试从调用类访问方法 就像这个例子一样 class normalClass public function someMethod this method shall access
  • Javascript/vue.js接收json

    我正在尝试在我的 vue js 应用程序中接收 json 如下所示 new Vue el body data role company list created function this getJson methods getJson f
  • 将对象重新放入 ConcurrentHashMap 是否会导致“发生在”内存关系?

    我正在与existing具有 ConcurrentHashMap 形式的对象存储的代码 映射内存储了可供多个线程使用的可变对象 根据设计 没有两个线程会尝试同时修改一个对象 我关心的是线程之间修改的可见性 目前 对象的代码在 setter
  • dojo multipleDefine与mapkitJS和ArcGIS esri-loader的错误

    我不知道在哪里MapkitJS and esri loader在一起有问题 从这里和其他地方的研究来看 似乎可能与另一个包存在命名冲突 这里有一个link https github com Esri esri loader issues 1
  • 在 v7 中使用 setViewCube 更新视图

    如何在 v7 中使用 setViewCube 更新视图 我在 v6 中使用了以下代码 但它在 v7 中不起作用 viewer setViewCube top front 在 v6 到 v7 的迁移指南中 它说 我应该通过扩展来调用它 ext
  • 如何在 UWP 应用中使用依赖注入?

    我在 UWP 应用程序中使用 autofac 在我的App例如 我正在设置依赖项 如下所示 public sealed partial class App private readonly IFacade m facade public A
  • 使用 AVAudioEngine 播放 AVAudioPCMBuffer 中的音频

    我有两节课MicrophoneHandler and AudioPlayer 我已经成功使用AVCaptureSession使用批准的答案窃听麦克风数据here https stackoverflow com questions 33850
  • ServiceStack 返回 JSV 而不是 JSON

    我有一个使用 ServiceStack 创建的服务 最近我更新了 ServiceStack 库 现在我收到的是 JSV 响应而不是 JSON 响应 该请求看起来像 POST http localhost api rest poll crea
  • 如何阻止用户在 XPages 中打开新的浏览器会话

    我有一个前端文档锁定过程 它创建一个包含 UNID 用户名 时间的应用程序范围变量 然后是一个每 30 秒更新此信息的计时器 如果有人尝试打开文档进行编辑 我会检查 使用 UNID 看看其他人是否拥有该文档 如果时间大于 30 秒 我会取消
  • 点击没有 jQuery UI 的 jQuery 弹跳效果

    我找不到仅使用 jQuery 动画来制作 div 弹跳的动画解决方案 类似的东西不起作用 bounce click function this effect bounce times 3 300 我不想使用 jQuery UI 或任何外部插
  • php正则表达式读取选择表单

    我有一个带有选择表单的源文件 其中包含一些选项 如下所示
  • 需要工作但导入不工作

    我有一个 actions js 文件正在导出这样的操作 export var toggleTodo id gt return type TOGGLE TODO id 但是当我使用 es6 import 导入它时出现错误 Uncaught T
  • 如何动态地将分支目标提示到 x64 CPU?

    我想知道如何用 C C 或汇编语言为 x64 处理器编写高效的跳转表 输入是预先已知的 但不可能通过算法来预测 假设我可以在输入流中查看尽可能远的位置 有什么方法可以动态地告诉 CPU 下一个分支将转到哪个地址 本质上 我想以编程方式更新分