* Send a `movswl offset(%rsp),%r64' instruction. */
| 1342 | * Send a `movswl offset(%rsp),%r64' instruction. |
| 1343 | */ |
| 1344 | void sendMovFromStack16ToR64(FILE *out, int32_t offset, int regno) |
| 1345 | { |
| 1346 | const uint8_t REX[] = |
| 1347 | {0x48, 0x48, 0x48, 0x48, 0x4c, 0x4c, 0x00, |
| 1348 | 0x48, 0x4c, 0x4c, 0x48, 0x48, 0x4c, 0x4c, 0x4c, 0x4c, 0x48}; |
| 1349 | const uint8_t MODRM_0[] = |
| 1350 | {0x3c, 0x34, 0x14, 0x0c, 0x04, 0x0c, 0x00, |
| 1351 | 0x04, 0x14, 0x1c, 0x1c, 0x2c, 0x24, 0x2c, 0x34, 0x3c, 0x24}; |
| 1352 | const uint8_t MODRM_8[] = |
| 1353 | {0x7c, 0x74, 0x54, 0x4c, 0x44, 0x4c, 0x00, |
| 1354 | 0x44, 0x54, 0x5c, 0x5c, 0x6c, 0x64, 0x6c, 0x74, 0x7c, 0x64}; |
| 1355 | const uint8_t MODRM_32[] = |
| 1356 | {0xbc, 0xb4, 0x94, 0x8c, 0x84, 0x8c, 0x00, |
| 1357 | 0x84, 0x94, 0x9c, 0x9c, 0xac, 0xa4, 0xac, 0xb4, 0xbc, 0xa4}; |
| 1358 | |
| 1359 | if (offset == 0) |
| 1360 | fprintf(out, "%u,%u,%u,%u,%u,", |
| 1361 | REX[regno], 0x0f, 0xbf, MODRM_0[regno], 0x24); |
| 1362 | else if (offset >= INT8_MIN && offset <= INT8_MAX) |
| 1363 | fprintf(out, "%u,%u,%u,%u,%u,{\"int8\":%d},", |
| 1364 | REX[regno], 0x0f, 0xbf, MODRM_8[regno], 0x24, offset); |
| 1365 | else |
| 1366 | fprintf(out, "%u,%u,%u,%u,%u,{\"int32\":%d},", |
| 1367 | REX[regno], 0x0f, 0xbf, MODRM_32[regno], 0x24, offset); |
| 1368 | } |
| 1369 | |
| 1370 | /* |
| 1371 | * Send a `movzbl offset(%rsp),%r64' instruction. |
no test coverage detected