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