|
| 1 | +use crate::dsl::{align, fmt, implicit, inst, r, rex, rw, sxl, sxq, sxw, w}; |
| 2 | +use crate::dsl::{Feature::*, Inst, Location::*}; |
| 3 | + |
| 4 | +#[rustfmt::skip] // Keeps instructions on a single line. |
| 5 | +pub fn list() -> Vec<Inst> { |
| 6 | + vec![ |
| 7 | + // Multiply unsigned; low bits in `rax`, high bits in `rdx`. |
| 8 | + inst("mulb", fmt("M", [rw(implicit(ax)), r(rm8)]), rex(0xF6).digit(4), _64b | compat), |
| 9 | + inst("mulw", fmt("M", [rw(implicit(ax)), w(implicit(dx)), r(rm16)]), rex([0x66, 0xF7]).digit(4), _64b | compat), |
| 10 | + inst("mull", fmt("M", [rw(implicit(eax)), w(implicit(edx)), r(rm32)]), rex(0xF7).digit(4), _64b | compat), |
| 11 | + inst("mulq", fmt("M", [rw(implicit(rax)), w(implicit(rdx)), r(rm64)]), rex(0xF7).w().digit(4), _64b), |
| 12 | + // Multiply signed; low bits in `rax`, high bits in `rdx`. |
| 13 | + inst("imulb", fmt("M", [rw(implicit(ax)), r(rm8)]), rex(0xF6).digit(5), _64b | compat), |
| 14 | + inst("imulw", fmt("M", [rw(implicit(ax)), w(implicit(dx)), r(rm16)]), rex([0x66, 0xF7]).digit(5), _64b | compat), |
| 15 | + inst("imull", fmt("M", [rw(implicit(eax)), w(implicit(edx)), r(rm32)]), rex(0xF7).digit(5), _64b | compat), |
| 16 | + inst("imulq", fmt("M", [rw(implicit(rax)), w(implicit(rdx)), r(rm64)]), rex(0xF7).w().digit(5), _64b), |
| 17 | + inst("imulw", fmt("RM", [rw(r16), r(rm16)]), rex([0x66, 0x0F, 0xAF]), _64b | compat), |
| 18 | + inst("imull", fmt("RM", [rw(r32), r(rm32)]), rex([0x0F, 0xAF]), _64b | compat), |
| 19 | + inst("imulq", fmt("RM", [rw(r64), r(rm64)]), rex([0x0F, 0xAF]).w(), _64b), |
| 20 | + inst("imulw", fmt("RMI_SXB", [w(r16), r(rm16), sxw(imm8)]), rex([0x66, 0x6B]).ib(), _64b | compat), |
| 21 | + inst("imull", fmt("RMI_SXB", [w(r32), r(rm32), sxl(imm8)]), rex(0x6B).ib(), _64b | compat), |
| 22 | + inst("imulq", fmt("RMI_SXB", [w(r64), r(rm64), sxq(imm8)]), rex(0x6B).w().ib(), _64b), |
| 23 | + inst("imulw", fmt("RMI", [w(r16), r(rm16), r(imm16)]), rex([0x66, 0x69]).iw(), _64b | compat), |
| 24 | + inst("imull", fmt("RMI", [w(r32), r(rm32), r(imm32)]), rex(0x69).id(), _64b | compat), |
| 25 | + inst("imulq", fmt("RMI_SXL", [w(r64), r(rm64), sxq(imm32)]), rex(0x69).w().id(), _64b), |
| 26 | + // Vector instructions. |
| 27 | + inst("mulss", fmt("A", [rw(xmm), r(xmm_m32)]), rex([0xF3, 0x0F, 0x59]).r(), _64b | compat | sse), |
| 28 | + inst("mulsd", fmt("A", [rw(xmm), r(xmm_m64)]), rex([0xF2, 0x0F, 0x59]).r(), _64b | compat | sse2), |
| 29 | + inst("mulps", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x0F, 0x59]).r(), _64b | compat | sse), |
| 30 | + inst("mulpd", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x59]).r(), _64b | compat | sse2), |
| 31 | + inst("pmuldq", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x28]).r(), _64b | compat | sse41), |
| 32 | + inst("pmulhrsw", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x0B]).r(), _64b | compat | ssse3), |
| 33 | + inst("pmulhuw", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xE4]).r(), _64b | compat | sse2), |
| 34 | + inst("pmulhw", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xE5]).r(), _64b | compat | sse2), |
| 35 | + inst("pmulld", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x40]).r(), _64b | compat | sse41), |
| 36 | + inst("pmullw", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xD5]).r(), _64b | compat | sse2), |
| 37 | + inst("pmuludq", fmt("A", [rw(xmm), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xF4]).r(), _64b | compat | sse2), |
| 38 | + ] |
| 39 | +} |
0 commit comments