@@ -78,14 +78,15 @@ pub fn findByMnemonic(
7878 ),
7979 .x86_64 = > false ,
8080 },
81- inline .@"invpcid 64bit" , .@"rdpid 64bit" = > | tag | switch (target .cpu .arch ) {
81+ inline .@"invpcid 64bit" , .@"rdpid 64bit" , .@"prefetchi 64bit" = > | tag | switch (target .cpu .arch ) {
8282 else = > unreachable ,
8383 .x86 = > false ,
8484 .x86_64 = > std .Target .x86 .featureSetHas (
8585 target .cpu .features ,
8686 @field (std .Target .x86 .Feature , @tagName (tag )[0 .. @tagName (tag ).len - " 64bit" .len ]),
8787 ),
8888 },
89+ .prefetch = > std .Target .x86 .featureSetHasAny (target .cpu .features , .{ .sse , .prfchw , .prefetchi , .prefetchwt1 }),
8990 inline else = > | tag | has_features : {
9091 comptime var feature_it = std .mem .splitScalar (u8 , @tagName (tag ), ' ' );
9192 comptime var features : []const std.Target.x86.Feature = &.{};
@@ -375,6 +376,7 @@ pub const Mnemonic = enum {
375376 orps ,
376377 pextrw , pinsrw ,
377378 pmaxsw , pmaxub , pminsw , pminub , pmovmskb ,
379+ prefetchit0 , prefetchit1 , prefetchnta , prefetcht0 , prefetcht1 , prefetcht2 , prefetchw , prefetchwt1 ,
378380 shufps ,
379381 sqrtps , sqrtss ,
380382 stmxcsr ,
@@ -562,8 +564,7 @@ pub const Op = enum {
562564 r32_m8 , r32_m16 , r64_m16 ,
563565 m8 , m16 , m32 , m64 , m80 , m128 , m256 ,
564566 rel8 , rel16 , rel32 ,
565- m ,
566- moffs ,
567+ m , moffs , mrip8 ,
567568 sreg ,
568569 st0 , st , mm , mm_m64 ,
569570 xmm0 , xmm , xmm_m8 , xmm_m16 , xmm_m32 , xmm_m64 , xmm_m128 ,
@@ -617,7 +618,7 @@ pub const Op = enum {
617618
618619 .mem = > | mem | switch (mem ) {
619620 .moffs = > .moffs ,
620- .sib , .rip = > switch (mem .bitSize (target )) {
621+ .sib = > switch (mem .bitSize (target )) {
621622 0 = > .m ,
622623 8 = > .m8 ,
623624 16 = > .m16 ,
@@ -628,6 +629,16 @@ pub const Op = enum {
628629 256 = > .m256 ,
629630 else = > unreachable ,
630631 },
632+ .rip = > switch (mem .bitSize (target )) {
633+ 0 , 8 = > .mrip8 ,
634+ 16 = > .m16 ,
635+ 32 = > .m32 ,
636+ 64 = > .m64 ,
637+ 80 = > .m80 ,
638+ 128 = > .m128 ,
639+ 256 = > .m256 ,
640+ else = > unreachable ,
641+ },
631642 },
632643
633644 .imm = > | imm | switch (imm ) {
@@ -680,7 +691,7 @@ pub const Op = enum {
680691
681692 pub fn immBitSize (op : Op ) u64 {
682693 return switch (op ) {
683- .none , .moffs , .m , .sreg = > unreachable ,
694+ .none , .m , . moffs , .mrip8 , .sreg = > unreachable ,
684695 .al , .cl , .dx , .rip , .eip , .ip , .r8 , .rm8 , .r32_m8 = > unreachable ,
685696 .ax , .r16 , .rm16 = > unreachable ,
686697 .eax , .r32 , .rm32 , .r32_m16 = > unreachable ,
@@ -700,7 +711,7 @@ pub const Op = enum {
700711
701712 pub fn regBitSize (op : Op ) u64 {
702713 return switch (op ) {
703- .none , .moffs , .m , .sreg = > unreachable ,
714+ .none , .m , . moffs , .mrip8 , .sreg = > unreachable ,
704715 .unity , .imm8 , .imm8s , .imm16 , .imm16s , .imm32 , .imm32s , .imm64 = > unreachable ,
705716 .rel8 , .rel16 , .rel32 = > unreachable ,
706717 .m8 , .m16 , .m32 , .m64 , .m80 , .m128 , .m256 = > unreachable ,
@@ -716,13 +727,13 @@ pub const Op = enum {
716727
717728 pub fn memBitSize (op : Op ) u64 {
718729 return switch (op ) {
719- .none , .moffs , .m , .sreg = > unreachable ,
730+ .none , .m , .moffs , .sreg = > unreachable ,
720731 .unity , .imm8 , .imm8s , .imm16 , .imm16s , .imm32 , .imm32s , .imm64 = > unreachable ,
721732 .rel8 , .rel16 , .rel32 = > unreachable ,
722733 .al , .cl , .r8 , .ax , .dx , .ip , .r16 , .eax , .eip , .r32 , .rax , .rip , .r64 = > unreachable ,
723734 .st0 , .st , .mm , .xmm0 , .xmm , .ymm = > unreachable ,
724735 .cr , .dr = > unreachable ,
725- .m8 , .rm8 , .r32_m8 , .xmm_m8 = > 8 ,
736+ .mrip8 , . m8 , .rm8 , .r32_m8 , .xmm_m8 = > 8 ,
726737 .m16 , .rm16 , .r32_m16 , .r64_m16 , .xmm_m16 = > 16 ,
727738 .m32 , .rm32 , .xmm_m32 = > 32 ,
728739 .m64 , .rm64 , .mm_m64 , .xmm_m64 = > 64 ,
@@ -783,7 +794,7 @@ pub const Op = enum {
783794 .rm8 , .rm16 , .rm32 , .rm64 ,
784795 .r32_m8 , .r32_m16 , .r64_m16 ,
785796 .m8 , .m16 , .m32 , .m64 , .m80 , .m128 , .m256 ,
786- .m ,
797+ .m , .moffs , .mrip8 ,
787798 .mm_m64 ,
788799 .xmm_m8 , .xmm_m16 , .xmm_m32 , .xmm_m64 , .xmm_m128 ,
789800 .ymm_m256 ,
@@ -821,11 +832,7 @@ pub const Op = enum {
821832 /// Given an operand `op` checks if `target` is a subset for the purposes of the encoding.
822833 pub fn isSubset (op : Op , target : Op ) bool {
823834 switch (op ) {
824- .moffs , .sreg = > return op == target ,
825- .none = > switch (target ) {
826- .none = > return true ,
827- else = > return false ,
828- },
835+ .none , .m , .moffs , .sreg = > return op == target ,
829836 else = > {
830837 if (op .isRegister () and target .isRegister ()) {
831838 return switch (target .toReg ()) {
@@ -836,6 +843,7 @@ pub const Op = enum {
836843 if (op .isMemory () and target .isMemory ()) {
837844 switch (target ) {
838845 .m = > return true ,
846+ .moffs , .mrip8 = > return op == target ,
839847 else = > return op .memBitSize () == target .memBitSize (),
840848 }
841849 }
@@ -962,6 +970,10 @@ pub const Feature = enum {
962970 @"pclmul avx" ,
963971 pku ,
964972 popcnt ,
973+ prefetch ,
974+ @"prefetchi 64bit" ,
975+ prefetchwt1 ,
976+ prfchw ,
965977 rdrnd ,
966978 rdseed ,
967979 @"rdpid 32bit" ,
@@ -1002,7 +1014,7 @@ fn estimateInstructionLength(prefix: Prefix, encoding: Encoding, ops: []const Op
10021014}
10031015
10041016const mnemonic_to_encodings_map = init : {
1005- @setEvalBranchQuota (5_700 );
1017+ @setEvalBranchQuota (5_800 );
10061018 const mnemonic_count = @typeInfo (Mnemonic ).@"enum" .fields .len ;
10071019 var mnemonic_map : [mnemonic_count ][]Data = @splat (&.{});
10081020 const encodings = @import ("encodings.zig" );
0 commit comments