我正在使用某些Tensilica处理器,但我不了解规范化过程。
NSA-标准化班次金额
用法:NSA at, as
NSA计算左移量,该量将对地址寄存器as
的二进制补码内容进行归一化,并将该量(在0到31之间)写入地址寄存器at
。
[如果as
包含0或-1,则NSA返回31。使用SSL和SLL将NSA结果左移的as
产生最小值,除非as
包含0,否则第31位和第30位不同。
因此,基本上NSA会计算移位量值(0 ... 31)并写入at
寄存器。
问题是如何计算,这意味着从as
标准化两个补码值是什么意思?
这不是浮点指令。在as
中可以是32位(31 +符号)的有符号值]
感谢您的澄清,
编辑:应该是这样(感谢彼得·科德斯)
0x00000004 4 _______ number
|
0 0 0 0 0 0 0 1|
0000 0000 0000 0000 0000 0000 0000 0100
<--------------------------------> |
NSA = 28 bits |________ sign
0x00000003 3 ______ number
|
0 0 0 0 0 0 0 1 |
0000 0000 0000 0000 0000 0000 0000 0011
<---------------------------------->|
NSA = 29 bits |_______ sign
0x00000002 2 ______ number
|
0 0 0 0 0 0 0 1 |
0000 0000 0000 0000 0000 0000 0000 0010
<---------------------------------->|
NSA = 29 bits |_______ sign
0x00000001 1 _____ number
|
0 0 0 0 0 0 0 1 |
0000 0000 0000 0000 0000 0000 0000 0001
<----------------------------------->|
NSA = 30 bits |______ sign
0xFFFFFFFF 0 NSA = 31
0xFFFFFFFF -1 NSA = 31
0xFFFFFFFE -2 _____ number
|
F F F F F F F E |
1111 1111 1111 1111 1111 1111 1111 1110
<----------------------------------->|
NSA = 30 bits |______ sign
0xFFFFFFFD -3 ______ number
|
F F F F F F F D |
1111 1111 1111 1111 1111 1111 1111 1101
<---------------------------------->|
NSA = 29 bits |_______ sign
0xFFFFFFFC -4 ______ number
|
F F F F F F F C |
1111 1111 1111 1111 1111 1111 1111 1100
<---------------------------------->|
NSA = 29 bits |_______ sign
0xFFFFFFFB -5 _______ number
|
F F F F F F F B|
1111 1111 1111 1111 1111 1111 1111 1011
<--------------------------------> |
NSA = 28 bits |________ sign
类似于计数前导零的声音,除了它计数有多少个前导位都具有相同的值,并产生结果-1。
或者换一种说法,它计算符号位的多少位[[以下与符号位的值相同。(因此不属于符号的significant位的一部分伪代码将此位扫描表示为二进制搜索,但内部实现可以是任何东西。
-2^31 .. 2^31-1
的整个范围,而不会溢出。因此,x << NSA(x)
的结果将处于-2^31 .. -(2^30+1)
或2^30 .. 2^31-1
这两个范围之一。 (如文档所述,向左移位该值会导致符号位与下一位不同的值。除了0
或-1
的输入是特殊情况。)大概正常情况是对多个输入值使用相同的归一化偏移值?
浮点数通常始终具有其尾数集的最高有效位,实际上,该位通常没有显式存储。给定一些数学运算的原始结果,NSA会为您提供移动尾数以再次将其恢复为正常形式的金额。 (您还可以将指数调整相同的数量,以便浮点数仍代表正确的值。)