diff options
author | Maxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com> | 2020-09-18 12:20:43 -0400 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2021-10-20 18:19:23 -0400 |
commit | d1c9ca86c191ef92d9bcd1242aeb7eaa35381e6c (patch) | |
tree | 43ca7b474c7be83d01e8dc4663966771c6cdd5ea /ujit_asm.c | |
parent | b8a3f2ed6177c753a35feaa4239a47de0a97ee77 (diff) |
Port print_int, movsx. Implement putself.
Diffstat (limited to 'ujit_asm.c')
-rw-r--r-- | ujit_asm.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/ujit_asm.c b/ujit_asm.c index 55dc517bdb..8a9cc7f287 100644 --- a/ujit_asm.c +++ b/ujit_asm.c @@ -1163,6 +1163,73 @@ void mov(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) } } +/// movsx - Move with sign extension (signed integers) +void movsx(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) +{ + assert (dst.type == OPND_REG); + assert (src.type == OPND_REG || src.type == OPND_MEM); + assert (src.num_bits < dst.num_bits); + + //cb.writeASM("movsx", dst, src); + + if (src.num_bits == 8) + { + cb_write_rm(cb, dst.num_bits == 16, dst.num_bits == 64, dst, src, 0xFF, 2, 0x0F, 0xBE); + } + else if (src.num_bits == 16) + { + cb_write_rm(cb, dst.num_bits == 16, dst.num_bits == 64, dst, src, 0xFF, 2, 0x0F, 0xBF); + } + else if (src.num_bits == 32) + { + cb_write_rm(cb, false, true, dst, src, 0xFF, 1, 0x63); + } + else + { + assert (false); + } +} + +/* +/// movzx - Move with zero extension (unsigned values) +void movzx(codeblock_t* cb, x86opnd_t dst, x86opnd_t src) +{ + cb.writeASM("movzx", dst, src); + + size_t dstSize; + if (dst.isReg) + dstSize = dst.reg.size; + else + assert (false, "movzx dst must be a register"); + + size_t srcSize; + if (src.isReg) + srcSize = src.reg.size; + else if (src.isMem) + srcSize = src.mem.size; + else + assert (false); + + assert ( + srcSize < dstSize, + "movzx: srcSize >= dstSize" + ); + + if (srcSize is 8) + { + cb.writeRMInstr!('r', 0xFF, 0x0F, 0xB6)(dstSize is 16, dstSize is 64, dst, src); + } + else if (srcSize is 16) + { + cb.writeRMInstr!('r', 0xFF, 0x0F, 0xB7)(dstSize is 16, dstSize is 64, dst, src); + } + else + { + assert (false, "invalid src operand size for movxz"); + } +} +*/ + // neg - Integer negation (multiplication by -1) void neg(codeblock_t* cb, x86opnd_t opnd) { |