- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解现代CPU的工作原理。我专注于RISC-V。分支的类型很少:BEQ
BNE
BLT
BGE
BLTU
BGEU
我使用venus模拟器对此进行了测试,并且我也尝试对其进行模拟,到目前为止,它仍然可以正常工作,但是我不明白分支的计算方式。
根据我的阅读,ALU单元只有一个信号输出-ZERO
(除了其数学输出),只要输出为零,该信号就处于活动状态。但是,我如何确定是否应该仅基于ZERO
输出来确定分支?以及如何计算?
示例代码:
addi t0, zero, 9
addi t1, zero, 10
blt t0, t1, end
end:
BEQ
-减去2个数字,如果
ZERO
处于活动状态,则分支
BNE
-减去2个数字,如果
ZERO
未激活,则分支
BLT
-在这里,我有点困惑;我应该减去然后查看符号位,还是什么?
BGE
/
BGEU
-以及如何区分这些?我应该使用什么数学指令?
最佳答案
是的,ZERO输出为您提供等于/不等于。如果运行速度更快(在部分时钟周期中更早准备)和/或使用更少的功率(更少的晶体管开关),您也可以使用XOR而不是SUB进行相等比较。
有趣的事实:MIPS仅具有eq / ne和有符号比较-反对零条件,所有这些条件都可以快速进行测试,而无需进位传播或任何其他级联位。这很重要,因为它在与解码相同的阶段检查了分支条件,从而减少了分支等待时间。 (因此1个分支延迟插槽隐藏了延迟。)
为什么使用仅输出零的ALU?这使得除完全相等之外的其他比较无法使用。
您需要其他输出来从减法结果中确定GT / GE / LE / LT(及其无符号等效项)。
对于无符号条件,您所需要做的只是零和一个进位/借位(无符号溢出)标志。
结果本身的符号位不足以用于带符号的条件,因为可能发生带符号的溢出:(-1) - (-2)
= +1
:-1 > -2
(符号位清除)但(8位环绕)0x80 - 0x7F = +1
(符号位也清除),但-128 < 127
。仅当与零比较时,数字的符号位才有用。
如果扩大结果(通过对输入进行符号扩展并再做一点加法/加法运算),则将导致有符号溢出成为不可能,因此第33位是直接小于符号的结果。
您还可以从signed_overflow XOR signbit
获得小于符号的结果,而不是实际上加宽+添加。如果RISC-V具有任何用于软件检查签名整数溢出的体系结构方式,则您可能还希望ALU输出用于签名溢出。
可以通过查看进位和从MSB(符号位)中执行进位来计算符号溢出。如果这些不同,则您溢出。即SF =这两个进位的XOR。另请参见http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt,以详细了解2位和4位示例的无符号进位与有符号溢出。
在具有FLAGS寄存器的CPU(例如x86和ARM)中,这些ALU输出实际上进入带有命名位的特殊寄存器中。您可以查看x86 manual for conditional-jump instructions来查看诸如l
(小于符号)或b
(以下未签名)之类的条件名称如何映射到这些标志:
签署条件:jl
(又名RISC-V blt
):如果小于(SF≠ OF
)则跳转。从减法/ cmp中得出的输出符号位不等于溢出标志jle
:小于或等于(ZF=1 or SF≠ OF
)时跳转。jge
(又名RISC-V bge
):如果大于或等于(SF=OF
),则跳转。jg
(又名RISC-V bgt
):如果较大,则跳短(ZF=0 and SF=OF
)。
如果您决定让ALU只是产生一个“小于符号”输出,而不是单独的SF和OF输出,那很好。 SF==OF
就是!(SF != OF)
。
(x86还为同一操作码提供了一些助记词同义词,例如jl
= jnge
。“只有” 16个FLAGS谓词,包括单独的OF=0
(测试溢出,而不是比较结果)和奇偶校验标志。您只关心实际的有符号/无符号比较条件。)
如果您通过一些示例案例进行思考,例如测试INT_MAX > INT_MIN
,您将了解这些条件为何有意义,就像我上面为8位数字显示的示例一样。
未签名:jb
(又名RISC-V bltu
):如果低于(CF=1
),则跳转。那只是测试进位标志。jae
(又名RISC-V bgeu
):如果大于或等于(CF=0
),则跳短。ja
(又名RISC-V bgtu
):如果高于(CF=0 and ZF=0
),则跳短。
(请注意,x86减法设置CF =借位输出,因此1 - 2
设置CF = 1。其他一些ISA(例如ARM)会反转进位标志以进行减法。在实现RISC-V时,这将全部在CPU内部,而不是体系结构对软件可见)。
我不知道RISC-V是否实际上具有所有这些不同的分支条件,但是x86确实具有。
实现有符号或无符号比较器可能比进行减法更简单。
但是,如果您已经有一个加/减ALU并希望使用它,那么您可能只希望它生成“进位”和“小于符号”输出以及零。
这样,您就不需要单独的符号标志输出,也不需要获取整数结果的MSB。这只是ALU内部一个额外的XOR门,可以将这两件事结合在一起。
关于cpu - RISCV:如何计算分支指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57452447/
我正在尝试在现有指令的基础上构建一个新指令,但我在我的过程中停止了。加载页面时,我面临以下错误: Multiple directives [directive#1, directive#2] aski
我是 angularjs 世界的新手,我只需要在数字类型的输入中输入从 1 到 10 的数字。不使用 HTML5 的 min 和 max 属性 我在 Jquery 中找到了一个示例,能否帮我将其转换为
我想使用 ionic与 Material 设计。我被困在使用带有自定义 CSS 的 ionic 指令和 angular-material 之间。 我读过使用 ionic 指令我们得到了很多高效的特性,
我创建了以下代码: var node = document.getElementById('TreeList'); var keys = Object.keys(model[0]); var trac
在 AngularJs 中没有提供 ng-enabled 指令。是否有任何适当的理由不在框架中提供该指令,因为当您可以使用 ng- 时,我们同时拥有 ng-show 和 ng-hide隐藏来实现我们的
我最近制作的程序有问题。基本上,它是 John Conway 人生游戏的简单版本,但它运行不正常。问题出在读取单元格及其邻居的状态并决定该单元格的 future 状态的代码中。这是代码的一部分(有点长
Dockerfile reference关于 FROM 指令的内容如下: FROM can appear multiple times within a single Dockerfile in or
我一直在尝试理解指令中孤立作用域和继承作用域之间的区别。这是我准备让自己理解的一个例子: HTML Inside isolated scope directive: {{m
知道如何从指令内部访问属性值吗? angular.module('portal.directives', []) .directive('languageFlag', ['$r
我正在通过将 c 程序与其等价的汇编程序进行比较来学习汇编。 这是代码。 .file "ex3.c" .section .rodata .LC0: .string "I am %d
我正在尝试写一个 Jenkinsfile并行执行一系列步骤。目标是拥有两个 agents (又名。 nodes )。一个应该进行 Windows 构建,另一个应该进行 linux 构建。但是,我不希望
我想知道为什么指令 FYL2XP1在 x86 架构上精确计算数学公式 y · log2(x + 1)。 这个公式有什么特别之处? 最佳答案 y操作数通常是编译时常量,暂时忘记 x + 1 . 自 lo
这个问题已经有答案了: Parameterize an SQL IN clause (41 个回答) 已关闭 8 年前。 第一个声明: Select GroupMember FROM Group 结果
我从 this question fork 并编辑了一个 plunker 我想做的是在数据加载后更新/填充 SELECT 元素(组合框),但有些事情不对劲。我检索数据,它位于 SELECT 元素的范围
我想创建一个简单的 markdown 指令,它接受元素中的一些内容,解析它并用 html 替换它。 所以这样: #Heading 或这个(其中 $scope.heading = '#Heading';
我对 Ansible 还很陌生,对于我对 local_action 指令的理解有一个简单的问题。 这是否意味着该命令完全在本地执行?假设你有这样的东西: local_action: command w
我有以下 HTML: ... ... 以及以下指令: myApp.directive('specialInput', ['$timeout', function($timeout)
如何在 .htaccess 中创建 Apache 指令强制文件 .mp4和 .pdf去下载?目前它们出现在浏览器窗口中。相反,我希望出现一个下载文件对话框。 最佳答案 将以下内容添加到 .htacce
我的问题是关于 C 中的 fork() 指令。我有以下程序: void main(){ int result, status; result = fork(); if(result=
我想要一个类似于 ng-model 的属性指令。我只想另外将一个输入字段值绑定(bind)到一个范围变量(只是在一个方向输入字段 ->范围变量)。所以我刚刚尝试了这个指令,但无论如何我都无法调用该指令
我是一名优秀的程序员,十分优秀!