AArch64架构的b.nv(branch never,分支从不跳转)总是会跳转(等效于b.al)
我正在研究一个基于AArch64的 Neoverse N3 CPU,发现每当执行 b.nv 时,条件实际上总是成立(跳转总会发生)。这段代码是在Linux的内核模块中、在EL1下执行。
有人遇到过这种情况吗?我可能哪里做错了?
我的代码片段:
b.nv target_label
b exit_label
target_label:
brk #0
exit_label:
这段代码本应顺利运行,但我只能执行到 brk #0 指令。
当然,当我把 b.nv 改成 b.al 时,也能到达 brk #0 指令。
解决方案
在阅读此处的伪代码后:
// ConditionHolds()
// ================
// Return TRUE iff COND currently holds
func ConditionHolds(cond : bits(4)) => boolean
begin
// Evaluate base condition.
var result : boolean;
case cond[3:1] of
when ‘000’ => result = (PSTATE.Z == ‘1’); // EQ or NE
when ‘001’ => result = (PSTATE.C == ‘1’); // CS or CC
when ‘010’ => result = (PSTATE.N == ‘1’); // MI or PL
when ‘011’ => result = (PSTATE.V == ‘1’); // VS or VC
when ‘100’ => result = (PSTATE.C == ‘1’ && PSTATE.Z == ‘0’); // HI or LS
when ‘101’ => result = (PSTATE.N == PSTATE.V); // GE or LT
when ‘110’ => result = (PSTATE.N == PSTATE.V && PSTATE.Z == ‘0’); // GT or LE
when ‘111’ => result = TRUE; // AL
end;
// Condition flag values in the set ‘111x’ indicate always true
// Otherwise, invert condition if necessary.
if cond[0] == ‘1’ && cond != ‘1111’ then
result = !result;
end;
return result;
end;
从这一行可以看出:
if cond[0] == ‘1’ && cond != ‘1111’ then
nv (0b1111) 条件在设计上有不同的处理,暗示它的行为像al (0b1110) 条件一样,总是被执行。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。