Sparc V8

余生颓废 提交于 2020-02-03 15:57:55

Sparc V8

为什么LD指令区分signed和unsigned,而ST指令不区分

LD指令有LDSB,LDSU是因为从内存加载到寄存器时,若是负数需要高位符号位扩充1。而ST指令不需要。见下面解释,p91

The load integer instructions copy a byte, a halfword, or a word from memory into r[rd]. A fetched byte or halfword is right-justified in destination register r[rd]; it is either sign-extended or zero-filled on the left, depending on whether or not the opcode specifies a signed or unsigned operation, respectively.

 subcc等同于cmp

SUBcc和目的寄存器(rd=0)一起常用于有符号或无符号整数的比较,因为我们知道,比较指令(如CMP)在任何架构的机器中最终都是进行减法运算,如果结果为0,则表示两数相等。

在v8手册里,subcc是cmp指令的实际指令

关于分支转移指令有一个分支延迟时隙

因为sparc使用了PC和nPC的机制,即nPC->PC, nPC+4->nPC。

因此,在执行branch指令时,PC=branch地址,nPC=branch+4(即branch下一条指令的地址)。

执行完branch后,nPC->PC=branch下一条指令的地址, nPC=branch目标地址。

下面是一个解释

2.分支指令延时间隙(Branch delay slot), SPARC用两个程序指针PC和nPC,来保持指令执行的轨迹。PC持有下一条要执行的指令的地址;第二个程序指针,nPC持有PC的下一个值。通常,SPARC在每一条指令执行结束时更新当前程序指针,更新时,用nPC的值代替PC的值,nPC的值则是“其原值+4”。当它执行一个转移指令时,SPARC分配nPC的值给PC,然后更新nPC的值。如果跳转发生,nPC被分配一个用指令声明的目标(地址)值;否则,nPC的值是自增4的。也就是说,跳转指令发生时,一时并没改变PC的值到目标地址,它只能执行原nPC给的下一条指令(这就产生了跳转间隙)。

    3.在跳转指令的延时间隙里不方便放有用的指令的情形时,SPARC提供 了“nop”复合指令。nop的执行,它不改变任何寄存器或内存的值。然而,它的作用是导致处理器执行更多的指令,比如,增加所需执行程序的时间。

    4.用加后缀",a"来声明跳转间隙无效。如果条件分支指令没有发生,则跳转间隙中的指令无效。如 bg ,a top。


这里讲的延时间隙是很牛的东东

在Sparc汇编中经常看到,所以要花点时间:

test.c:

    int temp;

    int x = 0;

    int y = 0x9;

    int z = 0x42;


    temp = y;

    while(temp > 0)

    {  

        x = x+z;

        temp = temp-1;

    }

简单地转换,这里用到nop指令放到“分支指令延时间隙(Branch delay slot)”中。

    .data

    x: .word 0

    y: .word 0x9

    z: .word 0x42


    .text

    start: set y, %r1

    ld [%r1],%r2

    set z, %r1

    ld [%r1],%r3

    mov %r0,%r4



    add %r2, 1, %r2

    ba test

    nop !here, Branch delay slot

    top: add %r4, %r3, %r4

    test: subcc %r2, 1, %r2

    bg top

    nop !here, Branch delay slot


    set x,%r1

    st %r4,[%r1] !store x

    end: ta 0

    在上面,分支指令bg top,当发生跳转时,处理器并没有马上执行跳转,而是要执行完nop这条分支指令延时间隙中的指令后,才转移到top:处。

    Ok,在“分支指令延时间隙(Branch delay slot)”中用有用的指令。

    .data

    ......

    .text

    start: set y,%r1

    ld [%r1],%r2

    set z,%r1

    ld [%r1],%r3

    mov %r0,%r4



    add %r2, 1, %r2

    top: subcc %r2, 1, %r2

    bg,a top

    add %r4, %r3, %r4


    set x, %r1

    st %r4,[%r1]

    end: ta 0

    分支指令bg,a top,当发生跳转时,处理器并没有马上执行跳转,而是要执行完“add %r4, %r3, %r4”这条分支指令延时间隙中的指令后,才转移到top:处。而且,当跳转条件不满足时,分支指令延时间隙中的指令无效。
View Code

 

 

 

参考资料:

https://blog.csdn.net/macrossdzh/article/details/8168473

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!