规范化一个二补数
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 会为您提供移动尾数的数量,以便再次以正常形式获得它。 (您还可以将指数调整相同的量,以便浮点数仍然代表正确的值。)
我正在研究一些 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 会为您提供移动尾数的数量,以便再次以正常形式获得它。 (您还可以将指数调整相同的量,以便浮点数仍然代表正确的值。)