SSE 寄存器返回且 SSE 禁用

2024-01-25

我处于以下情况:

  • 我正在为不允许 SSE 指令的内核编写代码
  • 我需要进行浮点运算
  • 我正在针对 x86_64 平台进行编译

这是说明该问题的代码示例:

int
main(int argc, char** argv)
{
    double d = 0.0, dbase;
    uint64_t base_value = 300;

    d = (2200.0 - 1000.0)/(1000.0);
    dbase = d * base_value;
    printf("d = %f, dbase = %f\n", d, dbase);
    base_value = dbase;
    printf("base_value = %llu\n", (long long unsigned)base_value);
    return 0;
}

这是 makefile 中的相关行:

CFLAGS +=   -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow \
            -msoft-float -fno-asynchronous-unwind-tables -fno-omit-frame-pointer

当我运行构建时,我收到此错误:

SSE register return with SSE disabled

(错误指向d和base_value相乘的行)

知道我能做些什么来解决这个问题吗?删除 -mno-sse 不是一个选项,但编译器似乎应该能够生成非 sse 代码来执行乘法。

谢谢 内森


听起来编译器正在发出对库例程的调用来为您执行浮点乘法(可能不使用 SSE),但正在尝试使用 ABI 来进行在 SSE 中传递返回值的调用。显然,这是行不通的。

如果可以在内核中使用浮点,则应该有一个特殊的运行时库来执行软浮点操作,该操作不使用通常的(用户态)参数传递和返回约定。然而,据我所知,BSD内核中不支持浮点。几年前确实是这样。

您可能应该询问 BSD 内核开发电子邮件列表是否可以使用浮点;我怀疑它会给你一个比 SO 更快更明确的答案。

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

SSE 寄存器返回且 SSE 禁用 的相关文章

随机推荐

  • 三个js定义几何轴

    我有一个盒子几何形状 我想定义几何体的前面在哪里 设置一个框 var materialArray materialArray push new THREE MeshBasicMaterial map THREE ImageUtils loa
  • mysql 连接没有键的表

    基本问题 如何连接 2 个表以获得以下输出 Table1 type red blue big small Table2 object cat person chair Output red cat blue cat big cat smal
  • 铸造 boost::units::数量加倍

    我需要将数量的值传递给图书馆进行评估 这升压单位库 http www boost org doc libs 1 52 0 doc html boost units html在 SI 中采用双值 因此升压单位库在确保该要求方面非常有吸引力 但
  • 从 pandas xlsxwriter 打开 Excel (XLSX) 文件时出错

    在 MS Excel 中打开 XLSX 文件时 会出现一个错误对话框 我们发现 filename xlsx 中的某些内容存在问题 单击 是 尝试恢复会产生以下 XML 错误消息
  • 使用 Gson 或 Jackson 将 JSON 字符串展平为 Map

    例如 id 123 name Tom class subject Math teacher Jack 我想要得到Map
  • 为什么这个可编辑组合框中的插入符号超出了范围?

    我正在尝试基于 msdn 示例构建组合框模板 但出现奇怪的错误 更准确地说 如果我在普通组合框中编写长文本 则文本会向左移动 并且我们始终会看到插入符号 然而 在 msdn 示例中 当我编写长文本时 插入符正在移到组合之外 这是它的样子 当
  • 如何开始学习 JavaScript [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在 Linux oracle sunos 等技术支持方面经验丰富 但如果我说脚本 我对 bash 知
  • 如何在 Google 地图 V2 中启用特定路线的路况信息?

    Google 导航仅显示给定路线的交通图层 和GoogleMap setTrafficEnabled true 我会获取整个地图的交通信息 我知道如何从 Google Directions 中绘制路线的折线 但如何仅打开该路线的交通图层 从
  • Spark Cassandra 连接器 - where 子句

    我正在尝试使用 Spark 和 Datastax 发布的新连接器对存储在 cassandra 中的时间序列数据进行一些分析 在我的架构中 分区键是仪表 ID 我只想对特定系列运行 Spark 操作 因此我需要按仪表 ID 进行过滤 然后我想
  • 每当一个或其他字段模型发生变化(每次击键)时,使用 Angular 指令验证密码并确认密码字段

    我目前有一个 Angular 指令 可以验证密码并确认密码字段是否匹配 它在某种程度上有效 当密码不匹配时它确实会抛出错误 但是 在您在两个字段中输入数据之前 它不会引发错误 如何才能在一个字段或另一个字段中输入数据时立即抛出密码不匹配的错
  • 设计视图中底部导航的实时视图不显示图标和菜单资源

    enter image description here 2 2 The bottom navigation view is not showing the icons in it in the live design view of th
  • 如何使用 C# 在 WPF 运行时动态添加文本框控件

    我是 WPF 新手 我想在运行时单击 生成 按钮时为每一行创建 3 个文本框 请帮我 自动创建的文本框 https i stack imgur com 21blt png Code behind private List
  • 如何从 QDialog 的 const 方法显示 QMessageBox?

    我已经子类化了QDialog我创建了一个const方法 因为我想绝对防止修改我的实例 现在 如果发生某个错误 我想使用QMessageBox来显示它 但我不能使用this作为消息框的父级 因为this is const 这是一个遗憾 根据文
  • 在 iOS 中创建 RGB CVOpenGLESTexture

    我正在尝试创建一个3通道 CVOpenGLESTexture in iOS 我可以成功创建一个单通道通过指定纹理kCVPixelFormatType OneComponent8 in CVPixelBufferCreate and GL L
  • 使用 PDFBox 获取文本行的位置

    我正在使用 PDFBox 从 pdf 中提取信息 我当前尝试查找的信息与该行中第一个字符的 x 位置相关 但我找不到任何与如何获取该信息相关的信息 我知道 pdfbox 有一个名为 TextPosition 的类 但我也无法找到如何从 PD
  • VBA Excel制作连续数字数组

    我目前正在使用 VBA for Excel 但实际上只精通 Matlab 对于我的工作来说 出于时间目的 保留在 vba 的内存中 而不是 excel 的工作表 非常重要 我需要做的是创建一个连续整数数组 比如 4000 到 5000 在
  • Vue.js 计算属性在通过事件传递时会失去其反应性

    我有一个Modal我的主应用程序中的组件 每当必须显示模式时 它都会通过事件获取传递的内容 模态内容始终是一个列表 其中包含与每个项目关联的操作 例如 选择 或 删除 Vue component modal data return show
  • JavaScript onHover 事件

    有没有规范的方法来设置JSonHover事件与现有的onmouseover onmouseout和某种计时器 或者当且仅当用户将鼠标悬停在元素上一定时间时触发任意函数的任何方法 像这样的事情怎么样
  • 如何摆脱TListBox垂直滚动限制?

    我已经实现了日志查看器使用TListBox在虚拟模式下 http blog synopse info post 2011 08 20 Enhanced Log viewer 它工作正常 对于我编写的所有代码 按预期显示内容 我什至轻松添加了
  • SSE 寄存器返回且 SSE 禁用

    我处于以下情况 我正在为不允许 SSE 指令的内核编写代码 我需要进行浮点运算 我正在针对 x86 64 平台进行编译 这是说明该问题的代码示例 int main int argc char argv double d 0 0 dbase