AArch64架构的b.nv(branch never,分支从不跳转)总是会跳转(等效于b.al)

编程语言 2026-07-10

我正在研究一个基于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 指令。

解决方案

在阅读此处的伪代码后:

https://developer.arm.com/documentation/ddi0487/mb/-Part-J-Architectural-Pseudocode/-Chapter-J1-A-profile-Architecture-Pseudocode/-J1-4-Shared-pseudocode/-J1-4-508-ConditionHolds?lang=en#asl_func_conditionholds_1

// 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章