1 use crate::dsl::{Customization::*, Feature::*, Inst, Length::*, Location::*, TupleType::*}; 2 use crate::dsl::{align, evex, fmt, inst, r, rex, rw, vex, w}; 3 4 #[rustfmt::skip] // Keeps instructions on a single line. 5 pub fn list() -> Vec<Inst> { 6 vec![ 7 // Scalar arithmetic right shifts. 8 inst("sarb", fmt("MC", [rw(rm8), r(cl)]), rex([0xD2]).digit(7), _64b | compat), 9 inst("sarb", fmt("MI", [rw(rm8), r(imm8)]), rex([0xC0]).digit(7).ib(), _64b | compat), 10 inst("sarb", fmt("M1", [rw(rm8)]), rex([0xD0]).digit(7).ib(), _64b | compat).custom(Display), 11 inst("sarw", fmt("MC", [rw(rm16), r(cl)]), rex([0x66, 0xD3]).digit(7), _64b | compat), 12 inst("sarw", fmt("MI", [rw(rm16), r(imm8)]), rex([0x66, 0xC1]).digit(7).ib(), _64b | compat), 13 inst("sarw", fmt("M1", [rw(rm16)]), rex([0x66, 0xD1]).digit(7).ib(), _64b | compat).custom(Display), 14 inst("sarl", fmt("MC", [rw(rm32), r(cl)]), rex([0xD3]).digit(7), _64b | compat), 15 inst("sarl", fmt("MI", [rw(rm32), r(imm8)]), rex([0xC1]).digit(7).ib(), _64b | compat), 16 inst("sarl", fmt("M1", [rw(rm32)]), rex([0xD1]).digit(7).ib(), _64b | compat).custom(Display), 17 inst("sarq", fmt("MC", [rw(rm64), r(cl)]), rex([0xD3]).digit(7).w(), _64b), 18 inst("sarq", fmt("MI", [rw(rm64), r(imm8)]), rex([0xC1]).digit(7).ib().w(), _64b), 19 inst("sarq", fmt("M1", [rw(rm64)]), rex([0xD1]).digit(7).ib().w(), _64b).custom(Display), 20 // Scalar logical left shifts. 21 inst("shlb", fmt("MC", [rw(rm8), r(cl)]), rex([0xD2]).digit(4), _64b | compat), 22 inst("shlb", fmt("MI", [rw(rm8), r(imm8)]), rex([0xC0]).digit(4).ib(), _64b | compat), 23 inst("shlb", fmt("M1", [rw(rm8)]), rex([0xD0]).digit(4).ib(), _64b | compat).custom(Display), 24 inst("shlw", fmt("MC", [rw(rm16), r(cl)]), rex([0x66, 0xD3]).digit(4), _64b | compat), 25 inst("shlw", fmt("MI", [rw(rm16), r(imm8)]), rex([0x66, 0xC1]).digit(4).ib(), _64b | compat), 26 inst("shlw", fmt("M1", [rw(rm16)]), rex([0x66, 0xD1]).digit(4).ib(), _64b | compat).custom(Display), 27 inst("shll", fmt("MC", [rw(rm32), r(cl)]), rex([0xD3]).digit(4), _64b | compat), 28 inst("shll", fmt("MI", [rw(rm32), r(imm8)]), rex([0xC1]).digit(4).ib(), _64b | compat), 29 inst("shll", fmt("M1", [rw(rm32)]), rex([0xD1]).digit(4).ib(), _64b | compat).custom(Display), 30 inst("shlq", fmt("MC", [rw(rm64), r(cl)]), rex([0xD3]).digit(4).w(), _64b), 31 inst("shlq", fmt("MI", [rw(rm64), r(imm8)]), rex([0xC1]).digit(4).ib().w(), _64b), 32 inst("shlq", fmt("M1", [rw(rm64)]), rex([0xD1]).digit(4).ib().w(), _64b).custom(Display), 33 // Scalar logical right shifts. 34 inst("shrb", fmt("MC", [rw(rm8), r(cl)]), rex([0xD2]).digit(5), _64b | compat), 35 inst("shrb", fmt("MI", [rw(rm8), r(imm8)]), rex([0xC0]).digit(5).ib(), _64b | compat), 36 inst("shrb", fmt("M1", [rw(rm8)]), rex([0xD0]).digit(5).ib(), _64b | compat).custom(Display), 37 inst("shrw", fmt("MC", [rw(rm16), r(cl)]), rex([0x66, 0xD3]).digit(5), _64b | compat), 38 inst("shrw", fmt("MI", [rw(rm16), r(imm8)]), rex([0x66, 0xC1]).digit(5).ib(), _64b | compat), 39 inst("shrw", fmt("M1", [rw(rm16)]), rex([0x66, 0xD1]).digit(5).ib(), _64b | compat).custom(Display), 40 inst("shrl", fmt("MC", [rw(rm32), r(cl)]), rex([0xD3]).digit(5), _64b | compat), 41 inst("shrl", fmt("MI", [rw(rm32), r(imm8)]), rex([0xC1]).digit(5).ib(), _64b | compat), 42 inst("shrl", fmt("M1", [rw(rm32)]), rex([0xD1]).digit(5).ib(), _64b | compat).custom(Display), 43 inst("shrq", fmt("MC", [rw(rm64), r(cl)]), rex([0xD3]).digit(5).w(), _64b), 44 inst("shrq", fmt("MI", [rw(rm64), r(imm8)]), rex([0xC1]).digit(5).ib().w(), _64b), 45 inst("shrq", fmt("M1", [rw(rm64)]), rex([0xD1]).digit(5).ib().w(), _64b).custom(Display), 46 inst("rolb", fmt("MC", [rw(rm8), r(cl)]), rex([0xD2]).digit(0), _64b | compat), 47 inst("rolb", fmt("MI", [rw(rm8), r(imm8)]), rex([0xC0]).digit(0).ib(), _64b | compat), 48 inst("rolb", fmt("M1", [rw(rm8)]), rex([0xD0]).digit(0).ib(), _64b | compat).custom(Display), 49 inst("rolw", fmt("MC", [rw(rm16), r(cl)]), rex([0x66, 0xD3]).digit(0), _64b | compat), 50 inst("rolw", fmt("MI", [rw(rm16), r(imm8)]), rex([0x66, 0xC1]).digit(0).ib(), _64b | compat), 51 inst("rolw", fmt("M1", [rw(rm16)]), rex([0x66, 0xD1]).digit(0).ib(), _64b | compat).custom(Display), 52 inst("roll", fmt("MC", [rw(rm32), r(cl)]), rex([0xD3]).digit(0), _64b | compat), 53 inst("roll", fmt("MI", [rw(rm32), r(imm8)]), rex([0xC1]).digit(0).ib(), _64b | compat), 54 inst("roll", fmt("M1", [rw(rm32)]), rex([0xD1]).digit(0).ib(), _64b | compat).custom(Display), 55 inst("rolq", fmt("MC", [rw(rm64), r(cl)]), rex([0xD3]).digit(0).w(), _64b), 56 inst("rolq", fmt("MI", [rw(rm64), r(imm8)]), rex([0xC1]).digit(0).ib().w(), _64b), 57 inst("rolq", fmt("M1", [rw(rm64)]), rex([0xD1]).digit(0).ib().w(), _64b).custom(Display), 58 inst("rorb", fmt("MC", [rw(rm8), r(cl)]), rex([0xD2]).digit(1), _64b | compat), 59 inst("rorb", fmt("MI", [rw(rm8), r(imm8)]), rex([0xC0]).digit(1).ib(), _64b | compat), 60 inst("rorb", fmt("M1", [rw(rm8)]), rex([0xD0]).digit(1).ib(), _64b | compat).custom(Display), 61 inst("rorw", fmt("MC", [rw(rm16), r(cl)]), rex([0x66, 0xD3]).digit(1), _64b | compat), 62 inst("rorw", fmt("MI", [rw(rm16), r(imm8)]), rex([0x66, 0xC1]).digit(1).ib(), _64b | compat), 63 inst("rorw", fmt("M1", [rw(rm16)]), rex([0x66, 0xD1]).digit(1).ib(), _64b | compat).custom(Display), 64 inst("rorl", fmt("MC", [rw(rm32), r(cl)]), rex([0xD3]).digit(1), _64b | compat), 65 inst("rorl", fmt("MI", [rw(rm32), r(imm8)]), rex([0xC1]).digit(1).ib(), _64b | compat), 66 inst("rorl", fmt("M1", [rw(rm32)]), rex([0xD1]).digit(1).ib(), _64b | compat).custom(Display), 67 inst("rorq", fmt("MC", [rw(rm64), r(cl)]), rex([0xD3]).digit(1).w(), _64b), 68 inst("rorq", fmt("MI", [rw(rm64), r(imm8)]), rex([0xC1]).digit(1).ib().w(), _64b), 69 inst("rorq", fmt("M1", [rw(rm64)]), rex([0xD1]).digit(1).ib().w(), _64b).custom(Display), 70 71 inst("shldw", fmt("MRI", [rw(rm16), r(r16), r(imm8)]), rex([0x66, 0x0F, 0xA4]).ib(), _64b | compat), 72 inst("shldw", fmt("MRC", [rw(rm16), r(r16), r(cl)]), rex([0x66, 0x0F, 0xA5]).ib(), _64b | compat), 73 inst("shldl", fmt("MRI", [rw(rm32), r(r32), r(imm8)]), rex([0x0F, 0xA4]).ib(), _64b | compat), 74 inst("shldq", fmt("MRI", [rw(rm64), r(r64), r(imm8)]), rex([0x0F, 0xA4]).ib().w(), _64b), 75 inst("shldl", fmt("MRC", [rw(rm32), r(r32), r(cl)]), rex([0x0F, 0xA5]).ib(), _64b | compat), 76 inst("shldq", fmt("MRC", [rw(rm64), r(r64), r(cl)]), rex([0x0F, 0xA5]).ib().w(), _64b), 77 78 // BMI2 shifts 79 inst("sarxl", fmt("RMV", [w(r32a), r(rm32), r(r32b)]), vex(LZ)._f3()._0f38().w0().op(0xF7), (_64b | compat) & bmi2), 80 inst("shlxl", fmt("RMV", [w(r32a), r(rm32), r(r32b)]), vex(LZ)._66()._0f38().w0().op(0xF7), (_64b | compat) & bmi2), 81 inst("shrxl", fmt("RMV", [w(r32a), r(rm32), r(r32b)]), vex(LZ)._f2()._0f38().w0().op(0xF7), (_64b | compat) & bmi2), 82 inst("sarxq", fmt("RMV", [w(r64a), r(rm64), r(r64b)]), vex(LZ)._f3()._0f38().w1().op(0xF7), _64b & bmi2), 83 inst("shlxq", fmt("RMV", [w(r64a), r(rm64), r(r64b)]), vex(LZ)._66()._0f38().w1().op(0xF7), _64b & bmi2), 84 inst("shrxq", fmt("RMV", [w(r64a), r(rm64), r(r64b)]), vex(LZ)._f2()._0f38().w1().op(0xF7), _64b & bmi2), 85 inst("rorxl", fmt("RMI", [w(r32), r(rm32), r(imm8)]), vex(LZ)._f2()._0f3a().w0().op(0xF0).r().ib(), (_64b | compat) & bmi2), 86 inst("rorxq", fmt("RMI", [w(r64), r(rm64), r(imm8)]), vex(LZ)._f2()._0f3a().w1().op(0xF0).r().ib(), _64b & bmi2), 87 88 // Vector instructions (shift left). 89 inst("psllw", fmt("A", [rw(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xF1]).r(), (_64b | compat) & sse2).alt(avx, "vpsllw_c"), 90 inst("psllw", fmt("B", [rw(xmm1), r(imm8)]), rex([0x66, 0x0F, 0x71]).digit(6).ib(), (_64b | compat) & sse2).alt(avx, "vpsllw_d"), 91 inst("pslld", fmt("A", [rw(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xF2]).r(), (_64b | compat) & sse2).alt(avx, "vpslld_c"), 92 inst("pslld", fmt("B", [rw(xmm1), r(imm8)]), rex([0x66, 0x0F, 0x72]).digit(6).ib(), (_64b | compat) & sse2).alt(avx, "vpslld_d"), 93 inst("psllq", fmt("A", [rw(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xF3]).r(), (_64b | compat) & sse2).alt(avx, "vpsllq_c"), 94 inst("psllq", fmt("B", [rw(xmm1), r(imm8)]), rex([0x66, 0x0F, 0x73]).digit(6).ib(), (_64b | compat) & sse2).alt(avx, "vpsllq_d"), 95 inst("vpsllw", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xF1).r(), (_64b | compat) & avx), 96 inst("vpsllw", fmt("D", [w(xmm1), r(xmm2), r(imm8)]), vex(L128)._66()._0f().op(0x71).digit(6).ib(), (_64b | compat) & avx), 97 inst("vpslld", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xF2).r(), (_64b | compat) & avx), 98 inst("vpslld", fmt("D", [w(xmm1), r(xmm2), r(imm8)]), vex(L128)._66()._0f().op(0x72).digit(6).ib(), (_64b | compat) & avx), 99 inst("vpsllq", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xF3).r(), (_64b | compat) & avx), 100 inst("vpsllq", fmt("D", [w(xmm1), r(xmm2), r(imm8)]), vex(L128)._66()._0f().op(0x73).digit(6).ib(), (_64b | compat) & avx), 101 // FIXME: uncomment once the avx512bw feature is bound 102 // inst("vpsllw", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().wig().op(0xF1).r(), (_64b | compat) & avx512vl & avx512bw), 103 // inst("vpsllw", fmt("E", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, FullMem)._66()._0f().wig().op(0x71).digit(6).ib(), (_64b | compat) & avx512vl & avx512bw), 104 inst("vpslld", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().w0().op(0xF2).r(), (_64b | compat) & avx512vl & avx512f), 105 inst("vpslld", fmt("F", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, Full)._66()._0f().w0().op(0x72).digit(6).ib(), (_64b | compat) & avx512vl & avx512f), 106 inst("vpsllq", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().w1().op(0xF3).r(), (_64b | compat) & avx512vl & avx512f), 107 inst("vpsllq", fmt("F", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, Full)._66()._0f().w1().op(0x73).digit(6).ib(), (_64b | compat) & avx512vl & avx512f), 108 109 // Vector instructions (shift right). 110 inst("psraw", fmt("A", [rw(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xE1]).r(), (_64b | compat) & sse2).alt(avx, "vpsraw_c"), 111 inst("psraw", fmt("B", [rw(xmm1), r(imm8)]), rex([0x66, 0x0F, 0x71]).digit(4).ib(), (_64b | compat) & sse2).alt(avx, "vpsraw_d"), 112 inst("psrad", fmt("A", [rw(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xE2]).r(), (_64b | compat) & sse2).alt(avx, "vpsrad_c"), 113 inst("psrad", fmt("B", [rw(xmm1), r(imm8)]), rex([0x66, 0x0F, 0x72]).digit(4).ib(), (_64b | compat) & sse2).alt(avx, "vpsrad_d"), 114 inst("psrlw", fmt("A", [rw(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xD1]).r(), (_64b | compat) & sse2).alt(avx, "vpsrlw_c"), 115 inst("psrlw", fmt("B", [rw(xmm1), r(imm8)]), rex([0x66, 0x0F, 0x71]).digit(2).ib(), (_64b | compat) & sse2).alt(avx, "vpsrlw_d"), 116 inst("psrld", fmt("A", [rw(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xD2]).r(), (_64b | compat) & sse2).alt(avx, "vpsrld_c"), 117 inst("psrld", fmt("B", [rw(xmm1), r(imm8)]), rex([0x66, 0x0F, 0x72]).digit(2).ib(), (_64b | compat) & sse2).alt(avx, "vpsrld_d"), 118 inst("psrlq", fmt("A", [rw(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xD3]).r(), (_64b | compat) & sse2).alt(avx, "vpsrlq_c"), 119 inst("psrlq", fmt("B", [rw(xmm1), r(imm8)]), rex([0x66, 0x0F, 0x73]).digit(2).ib(), (_64b | compat) & sse2).alt(avx, "vpsrlq_d"), 120 inst("vpsraw", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xE1).r(), (_64b | compat) & avx), 121 inst("vpsraw", fmt("D", [w(xmm1), r(xmm2), r(imm8)]), vex(L128)._66()._0f().op(0x71).digit(4).ib(), (_64b | compat) & avx), 122 inst("vpsrad", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xE2).r(), (_64b | compat) & avx), 123 inst("vpsrad", fmt("D", [w(xmm1), r(xmm2), r(imm8)]), vex(L128)._66()._0f().op(0x72).digit(4).ib(), (_64b | compat) & avx), 124 inst("vpsrlw", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xD1).r(), (_64b | compat) & avx), 125 inst("vpsrlw", fmt("D", [w(xmm1), r(xmm2), r(imm8)]), vex(L128)._66()._0f().op(0x71).digit(2).ib(), (_64b | compat) & avx), 126 inst("vpsrld", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xD2).r(), (_64b | compat) & avx), 127 inst("vpsrld", fmt("D", [w(xmm1), r(xmm2), r(imm8)]), vex(L128)._66()._0f().op(0x72).digit(2).ib(), (_64b | compat) & avx), 128 inst("vpsrlq", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xD3).r(), (_64b | compat) & avx), 129 inst("vpsrlq", fmt("D", [w(xmm1), r(xmm2), r(imm8)]), vex(L128)._66()._0f().op(0x73).digit(2).ib(), (_64b | compat) & avx), 130 // FIXME: uncomment once the avx512bw feature is bound 131 // inst("vpsraw", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().wig().op(0xE1).r(), (_64b | compat) & avx512vl & avx512bw), 132 // inst("vpsraw", fmt("E", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, FullMem)._66()._0f().wig().op(0x71).digit(4).ib(), (_64b | compat) & avx512vl & avx512bw), 133 inst("vpsrad", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().w0().op(0xE2).r(), (_64b | compat) & avx512vl & avx512f), 134 inst("vpsrad", fmt("F", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, Full)._66()._0f().w0().op(0x72).digit(4).ib(), (_64b | compat) & avx512vl & avx512f), 135 inst("vpsraq", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().w1().op(0xE2).r(), (_64b | compat) & avx512vl & avx512f), 136 inst("vpsraq", fmt("F", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, Full)._66()._0f().w1().op(0x72).digit(4).ib(), (_64b | compat) & avx512vl & avx512f), 137 // FIXME: uncomment once the avx512bw feature is bound 138 // inst("vpsrlw", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().wig().op(0xD1).r(), (_64b | compat) & avx512vl & avx512bw), 139 // inst("vpsrlw", fmt("E", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, FullMem)._66()._0f().wig().op(0x71).digit(2).ib(), (_64b | compat) & avx512vl & avx512bw), 140 inst("vpsrld", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().w0().op(0xD2).r(), (_64b | compat) & avx512vl & avx512f), 141 inst("vpsrld", fmt("F", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, Full)._66()._0f().w0().op(0x72).digit(2).ib(), (_64b | compat) & avx512vl & avx512f), 142 inst("vpsrlq", fmt("G", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Mem128)._66()._0f().w1().op(0xD3).r(), (_64b | compat) & avx512vl & avx512f), 143 inst("vpsrlq", fmt("F", [w(xmm1), r(xmm_m128), r(imm8)]), evex(L128, Full)._66()._0f().w1().op(0x73).digit(2).ib(), (_64b | compat) & avx512vl & avx512f), 144 ] 145 } 146