这是我正在处理的内核的一些 SASS 代码片段(对于 sm52 目标,在调试模式下编译):
/*0028*/ ISETP.GE.U32.AND P0, PT, R1, R0, PT; /* 0x5b6c038000070107 */
/*0030*/ @P0 BRA 0x40; /* 0xe24000000080000f */
/*0038*/ BPT.TRAP 0x1; /* 0xe3a00000001000c0 */
/* 0x007fbc0321e01fef */
/*0048*/ IADD R2, R1, RZ; /* 0x5c1000000ff70102 */
/*0050*/ I2I.U32.U32 R2, R2; /* 0x5ce0000000270a02 */
/*0058*/ MOV R2, R2; /* 0x5c98078000270002 */
/* 0x007fbc03fde01fef */
/*0068*/ MOV R3, RZ; /* 0x5c9807800ff70003 */
/*0070*/ MOV R2, R2; /* 0x5c98078000270002 */
/*0078*/ MOV R3, R3; /* 0x5c98078000370003 */
/* 0x007fbc03fde01fef */
/*0088*/ MOV R4, R2; /* 0x5c98078000270004 */
/*0090*/ MOV R5, R3; /* 0x5c98078000370005 */
/*0098*/ MOV R2, c[0x0][0x4]; /* 0x4c98078000170002 */
/* 0x007fbc03fde01fef */
/*00a8*/ MOV R3, RZ; /* 0x5c9807800ff70003 */
/*00b0*/ LOP.OR R2, R4, R2; /* 0x5c47020000270402 */
/*00b8*/ LOP.OR R3, R5, R3; /* 0x5c47020000370503 */
我注意到不止几个“将寄存器 Rn 的内容移动到寄存器 Rn”形式的指令——这看起来没有意义。我知道在没有启用调试信息的情况下进行编译并且进行优化时,我没有得到这些说明。但是,即使在调试模式下——它们为什么在那里?他们的目的是什么?AFAIK,在编译 CPU 代码进行调试时,您不会得到这些指令。