L.CASHP¶
说明¶
原子比较交换·一对半字(Compare and Swap pair of Halfword)
本指令执行如下的原子操作:从寄存器SrcL指定的内存位置连续加载两个16位数据,分别与寄存器SrcR0和SrcR1的低16位进行比较,如果相同的话,把寄存器SrcD0和SrcD1的低16位的值存入原内存中。不管前面比较的结果如何,都将从内存读取的两个16位数据无符号扩展后分别写入两个目的寄存器中。
汇编语法¶
汇编符号¶
- SrcL:源寄存器,可以索引全局寄存器R0-R23和前序1-4条输出至T队列或U队列的指令结果。
- SrcR0:源寄存器,可以索引全局寄存器R0-R23和前序1-4条输出至T队列或U队列的指令结果。
- SrcR1:源寄存器,可以索引全局寄存器R0-R23和前序1-4条输出至T队列或U队列的指令结果。
- SrcD0:源寄存器,可以索引全局寄存器R0-R23和前序1-4条输出至T队列或U队列的指令结果。
- SrcD1:源寄存器,可以索引全局寄存器R0-R23和前序1-4条输出至T队列或U队列的指令结果。
- ->:用于指示目的寄存器。
- RegDst0:第一个目的寄存器,可以索引块内T队列和U队列寄存器或者全局寄存器R1-R23。
- RegDst1:第二个目的寄存器,可以索引块内T队列和U队列寄存器或者全局寄存器R1-R23。
- .aq,.rl:内存访问限制,详见原子指令
- .f:指令可选后缀,表示内存访问发生在远端Cache中。
编码格式¶
执行方式¶
- 转换为十进制数:UInt()
- 通用寄存器读写:R[]
- 将数据无符号扩展:ZeroExtend()
integer d0 = UInt(RegDst0);
integer d1 = UInt(RegDst1);
integer m = UInt(SrcL);
integer n0 = UInt(SrcR0);
integer n1 = UInt(SrcR1);
integer p0 = UInt(SrcD0);
integer p1 = UInt(SrcD1);
Atomic {
bits(64) address = R[m, 64];
bits(16) cmpvalue0 = R[n0, 16];
bits(16) cmpvalue1 = R[n1, 16];
bits(16) newvalue0 = R[p0, 16];
bits(16) newvalue1 = R[p1, 16];
bits(32) oldvalue = Mem[address];
bits(32) cmpvalue = (cmpvalue1 << 16) | cmpvalue0;
bits(32) newvalue = (newvalue1 << 16) | newvalue0;
if oldvalue == cmpvalue then
Mem[address] = newvalue;
R[d0, 64] = ZeroExtend(oldvalue[15:0]);
R[d1, 64] = ZeroExtend(oldvalue[31:16]);
}
备注¶
- 本指令要求内存访问地址必须2字节对齐,否则触发地址不对齐异常。
- 本指令属于超长指令扩展,且仅允许在系统块内使用。