标准二进制整数运算¶
通常有左源以及右源两个输入的操作对象,一个输出。
- 在Opcode后面加上‘w’表明进行低32bit有符号扩展
- 在Opcode后面加上‘i'表明右源操作对象为立即数
- 对于算术指令,可以在右源寄存器后加上{.sw, .uw, .neg}扩展,’sw‘表示截取该操作数的低32bit做有符号扩展,’uw‘表示截取该操作数的低32bit做无符号扩展,’neg‘表示对该操作数位取反加1
- 对于逻辑逻辑操作, 可以在右源寄存器后加上{.sw, .uw, .not}扩展, ’.not‘表示对该操作数取反。
- 可以在右源寄存器后加上’<<‘, 表示对右源寄存器进行移位操作,左移的数量可能的值为{0, 1,2,3}, 左移0位时代表不做移位,可缺省。
- 当右源操作对象Operand1为立即数时,支持常量值和立即数的取值操作:’%lo(表达式)‘表示获得表达式值的低12bit,’%tpcrel_lo(label)‘表示获得symbol地址相对于label表示TPC偏移值的低12bit, ‘%tprel_lo(symbl)’表是获得TLS变量相对于Thead Pointer寄存器的低12bit
详细的微指令可以参见手册中算术指令这一章节。
汇编示例如下:
¶
add a1,a2, ->t /* LL_GPR的R寄存器a1 + a2, 输出到LL_GPR的T寄存器 */
addi a1,4, ->t /* LL_GPR的R寄存器a1 + 4, 输出到LL_GPR的T寄存器 */
add a1,a2.sw, ->t /* 寄存器a1的值 + 寄存器a2截取寄存器的低32bit做有符号扩展的值, 输出到T寄存器 */
add a1,a2<<1, ->t /* 寄存器a1的值 + 寄存器a2左移一位的值, 输出到T寄存器 */
add a1,a2.sw<<1,->t /* 寄存器a1的值 + a2截取寄存器的低32bit做有符号扩展后左移一位的值, 输出到第二层的T寄存器 */
add a1,a2.sw<<1,->a1 /* 寄存器a1的值 + a2截取寄存器的低32bit做有符号扩展后左移一位的值, 输出到第一层GPR的a1寄存器 */