规范化一个二补数

Normalizing a two complement number

我正在研究一些 Tensilica 处理器,但我不了解规范化过程。

NSA - 归一化偏移量

用法:
NSA at, as

NSA 计算将地址寄存器 as 的二进制补码内容归一化的左移量,并将该量(在 0 到 31 范围内)写入地址寄存器 at

如果 as 包含 0 或 -1,NSA returns 31。使用 SSL 和 SLL 将 as 左移 NSA 结果产生最小值,其中位 31 和30 不同,除非 as 包含 0。

所以基本上 NSA 计算移位量值 (0...31) 并写入 at 寄存器。

问题是它是如何计算的,从as归一化两个补码值是什么意思?

这不是浮点指令。 在 as 中可以是 32 位的有符号值(31 + 符号)

感谢您的澄清,

编辑:应该是这样的(感谢 Peter Cordes)

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。

或者换句话说,它计算符号位下方有多少位与符号位具有相同的值。 (因此不是输入的 重要 数字的一部分。)伪代码将此位扫描表示为二进制搜索,但内部实现可以是任何东西。


左移该数量将 "normalize" 使用 -2^31 .. 2^31-1 的整个范围的值,而不会溢出。所以 x << NSA(x) 的结果将在 2 个范围 -2^31 .. -(2^30+1)2^30 .. 2^31-1 之一。 (正如文档所说,左移该数量会导致符号位与下面的位不同的值。除了 0-1 的输入是一种特殊情况。)

大概正常的用例是对多个输入值使用相同的归一化移位值?

虽然严格来说这不是浮点指令,但它的主要用途可能是实现软件浮点运算。

浮点数通常总是具有其尾数集的最高有效位,事实上该位通常未明确存储。给定一些数学运算的原始结果,NSA 会为您提供移动尾数的数量,以便再次以正常形式获得它。 (您还可以将指数调整相同的量,以便浮点数仍然代表正确的值。)