为什么分支目标缓冲区会影响函数调用的返回? [WinMIPS64]

问题描述 投票:2回答:1

我正在为大学编写一些MIPS代码,以了解函数中的函数如何工作,并且起初一切正常。我正在使用WinMIP64 simulator

然后,在我打开BTB之后,一切都崩溃了(它陷入了第二个函数的无限循环中。)>

我一直在发疯,直到意识到这是因为BTB(其中一个功能中有b,我想减少因此而出现的某些Branch Taken Stalls)。当我关闭它时,一切再次正常。

我包括以下一些代码。

.data
tabla:  .byte 1,4,5
res:    .space 3 
cont:   .word 3
num:    .word 0

.text

       daddi $a0, $0, tabla  # offset element table
       daddi $a1, $0, res    # offset results table
       lb $a2, cont($0)      # $a2 = 3 (array size)
       daddi $sp, $0, 0x400  # $sp = 0x400
       jal dobles            # $ra = 0x14
       sd $v1, num($0)       # offset element count
       halt

dobles:                      #first function 

       daddi $sp, $sp, -8    # make space in stack $sp = 0x3f8
       sd $ra, 0($sp)        # 0x3f8 = $ra (0x14) 

loop:
       lb $s0, 0($a0)        # saving element from table in $s0
       daddi $a0, $a0, 1     # add 1 byte displacement to $a0  

       daddi $sp, $sp, -8    # $sp = 0x3f0
       sd $s0, 0($sp)        # 0x3f0 = tabla element 

       jal multi             # $ra = 0x38 
       sb $v0, 0($a1)        # saving result to res
       daddi $a1, $a1, 1     # displacement + 1 byte 

       daddi $a2, $a2, -1    # counter -1 
       bnez $a2, loop        # loop till counter is 0 

       ld $ra, 0($sp)        # load $ra from stack
       daddi $sp, $sp, 8     
       jr $ra 

multi:                       # second function
       ld $t0, 0($sp)        # load element from stack
       daddi $sp, $sp, 8     
       daddi $v1, $v1, 1     # count numer of elements
       dadd $v0, $t0, $t0    # element * 2
       jr $ra 

为什么会这样?对函数的调用是否会对缓冲区产生某种影响(我认为这只是用于分支)?如果打开了BTB,是否可以在函数内调用函数而不会出现问题?如果要在函数中使用BTB和函数调用,我需要更改什么?

这不在我们的程序中,所以我在这里问。

我正在为大学编写一些MIPS代码,以了解函数中的函数如何工作,并且起初一切正常。我正在使用WinMIP64模拟器。然后,在我打开BTB之后,...

assembly mips mips64
1个回答
2
投票

BTB是分支预测结构。它对正确性的影响为零,仅对性能有影响。在架构上不可见。

© www.soinside.com 2019 - 2024. All rights reserved.