Browse Source

+ introduce x86-64 microarchitecture levels for cpu and fpu flags

florian 1 year ago
parent
commit
ae465fa8dc
2 changed files with 70 additions and 22 deletions
  1. 4 0
      compiler/x86/agx86nsm.pas
  2. 66 22
      compiler/x86_64/cpuinfo.pas

+ 4 - 0
compiler/x86/agx86nsm.pas

@@ -108,15 +108,19 @@ interface
 {$if defined(x86_64)}
 {$if defined(x86_64)}
         'ia64',        // cpu_none
         'ia64',        // cpu_none
         'x64',         // cpu_athlon64
         'x64',         // cpu_athlon64
+        'x64',         // cpu_x86_64_v1
         'ia64',        // cpu_core_i
         'ia64',        // cpu_core_i
+        'ia64',        // cpu_x86_64_v2
         'ia64',        // cpu_bobcat
         'ia64',        // cpu_bobcat
         'ia64',        // cpu_core_avx
         'ia64',        // cpu_core_avx
         'ia64',        // cpu_jaguar
         'ia64',        // cpu_jaguar
         'ia64',        // cpu_piledriver
         'ia64',        // cpu_piledriver
         'ia64',        // cpu_excavator
         'ia64',        // cpu_excavator
         'ia64',        // cpu_core_avx2
         'ia64',        // cpu_core_avx2
+        'ia64',        // cpu_x86_64_v3
         'ia64',        // cpu_zen
         'ia64',        // cpu_zen
         'ia64',        // cpu_zen2
         'ia64',        // cpu_zen2
+        'ia64',        // cpu_x86_64_v4
         'ia64',        // cpu_icelake
         'ia64',        // cpu_icelake
         'ia64',        // cpu_icelake_client
         'ia64',        // cpu_icelake_client
         'ia64',        // cpu_icelake_server
         'ia64',        // cpu_icelake_server

+ 66 - 22
compiler/x86_64/cpuinfo.pas

@@ -45,7 +45,9 @@ Type
 
 
    tcputype =
    tcputype =
       (cpu_none,
       (cpu_none,
+       cpu_x86_64_v1,
        cpu_athlon64,
        cpu_athlon64,
+       cpu_x86_64_v2,
        cpu_core_i,
        cpu_core_i,
        cpu_bobcat,
        cpu_bobcat,
        cpu_core_avx,
        cpu_core_avx,
@@ -53,8 +55,10 @@ Type
        cpu_piledriver,
        cpu_piledriver,
        cpu_excavator,
        cpu_excavator,
        cpu_core_avx2,
        cpu_core_avx2,
+       cpu_x86_64_v3,
        cpu_zen,
        cpu_zen,
        cpu_zen2,
        cpu_zen2,
+       cpu_x86_64_v4,
        cpu_icelake,
        cpu_icelake,
        cpu_icelake_client,
        cpu_icelake_client,
        cpu_icelake_server,
        cpu_icelake_server,
@@ -65,14 +69,18 @@ Type
      (fpu_none,
      (fpu_none,
 //      fpu_soft,  { generic }
 //      fpu_soft,  { generic }
       fpu_sse64,
       fpu_sse64,
+      fpu_x86_64_v1,
       fpu_sse3,
       fpu_sse3,
       fpu_ssse3,
       fpu_ssse3,
       fpu_sse41,
       fpu_sse41,
       fpu_sse42,
       fpu_sse42,
+      fpu_x86_64_v2,
       fpu_avx,
       fpu_avx,
       fpu_fma,
       fpu_fma,
       fpu_avx2,
       fpu_avx2,
-      fpu_avx512f
+      fpu_x86_64_v3,
+      fpu_avx512f,
+      fpu_x86_64_v4
      );
      );
 
 
    tcontrollertype =
    tcontrollertype =
@@ -124,46 +132,58 @@ Const
 
 
    cputypestr : array[tcputype] of string[16] = ('',
    cputypestr : array[tcputype] of string[16] = ('',
      'ATHLON64',
      'ATHLON64',
+     'X86-64-V1',
      'COREI',
      'COREI',
+     'X86-64-V2',
      'BOBCAT',
      'BOBCAT',
      'COREAVX',
      'COREAVX',
      'JAGUAR',
      'JAGUAR',
      'PILEDRIVER',
      'PILEDRIVER',
      'EXCAVATOR',
      'EXCAVATOR',
      'COREAVX2',
      'COREAVX2',
+     'X86-64-V3',
      'ZEN',
      'ZEN',
      'ZEN2',
      'ZEN2',
+     'X86-64-V4',
      'ICELAKE',
      'ICELAKE',
      'ICELAKE-CLIENT',
      'ICELAKE-CLIENT',
      'ICELAKE-SERVER',
      'ICELAKE-SERVER',
      'ZEN3'
      'ZEN3'
    );
    );
 
 
-   fputypestr : array[tfputype] of string[7] = (
+   fputypestr : array[tfputype] of string[9] = (
      'NONE',
      'NONE',
 //     'SOFT',
 //     'SOFT',
      'SSE64',
      'SSE64',
+     'X86-64-V1',
      'SSE3',
      'SSE3',
      'SSSE3',
      'SSSE3',
      'SSE41',
      'SSE41',
      'SSE42',
      'SSE42',
+     'X86-64-V1',
      'AVX',
      'AVX',
      'FMA',
      'FMA',
      'AVX2',
      'AVX2',
-     'AVX512F'
+     'X86-64-V3',
+     'AVX512F',
+     'X86-64-V1'
    );
    );
 
 
-   fputypestrllvm : array[tfputype] of string[7] = ('',
+   fputypestrllvm : array[tfputype] of string[9] = ('',
 //     'SOFT',
 //     'SOFT',
      '',
      '',
+     'x86-64-v1',
      'sse3',
      'sse3',
      'ssse3',
      'ssse3',
      'sse4.1',
      'sse4.1',
      'sse4.2',
      'sse4.2',
+     'x86-64-v2',
      'avx',
      'avx',
      'fma',
      'fma',
      'avx2',
      'avx2',
-     'avx512f'
+     'x86-64-v3',
+     'avx512f',
+     'x86-64-v1'
    );
    );
 
 
    sse_singlescalar = [fpu_sse64..fpu_avx512f];
    sse_singlescalar = [fpu_sse64..fpu_avx512f];
@@ -192,9 +212,6 @@ type
        CPUX86_HAS_CMOV,         { CMOVcc instructions are available }
        CPUX86_HAS_CMOV,         { CMOVcc instructions are available }
        CPUX86_HAS_SSEUNIT,      { SSE instructions are available }
        CPUX86_HAS_SSEUNIT,      { SSE instructions are available }
        CPUX86_HAS_SSE2,         { SSE2 instructions are available }
        CPUX86_HAS_SSE2,         { SSE2 instructions are available }
-       CPUX86_HAS_SSE4_1,       { SSE 4.1 instructions are available }
-       CPUX86_HAS_SSE4_2,       { SSE 4.2 instructions are available }
-       CPUX86_HAS_SSSE3,        { SSSE3 instructions are available }
        CPUX86_HAS_BMI1,         { BMI1 instructions are available }
        CPUX86_HAS_BMI1,         { BMI1 instructions are available }
        CPUX86_HAS_BMI2,         { BMI2 instructions are available }
        CPUX86_HAS_BMI2,         { BMI2 instructions are available }
        CPUX86_HAS_CMPXCHG16B,   { CMPXCHG16B is available }
        CPUX86_HAS_CMPXCHG16B,   { CMPXCHG16B is available }
@@ -207,7 +224,11 @@ type
       );
       );
 
 
    tfpuflags =
    tfpuflags =
-      (FPUX86_HAS_AVXUNIT,
+      (FPUX86_HAS_SSE3,
+       FPUX86_HAS_SSE4_1,
+       FPUX86_HAS_SSE4_2,
+       FPUX86_HAS_SSSE3,
+       FPUX86_HAS_AVXUNIT,
        FPUX86_HAS_FMA,
        FPUX86_HAS_FMA,
        FPUX86_HAS_FMA4,
        FPUX86_HAS_FMA4,
        FPUX86_HAS_F16C,
        FPUX86_HAS_F16C,
@@ -236,49 +257,72 @@ type
       );
       );
 
 
  const
  const
+   cpu_x86_64_v1_flags = [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2];
+   cpu_x86_64_v2_flags = cpu_x86_64_v1_flags+[CPUX86_HAS_CMPXCHG16B,CPUX86_HAS_LAHF_SAHF,CPUX86_HAS_POPCNT];
+   cpu_x86_64_v3_flags = cpu_x86_64_v2_flags+[CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE,CPUX86_HAS_OSXSAVE]; { most is in the fpu flags here }
+   cpu_x86_64_v4_flags = cpu_x86_64_v3_flags; { most is in the fpu flags here }
+
    cpu_capabilities : array[tcputype] of set of tcpuflags = (
    cpu_capabilities : array[tcputype] of set of tcpuflags = (
      { cpu_none      } [],
      { cpu_none      } [],
-     { Athlon64      } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2],
-     { cpu_core_i    } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT],
+     { Athlon64      } cpu_x86_64_v1_flags,
+     { x86_64-v1     } cpu_x86_64_v1_flags,
+     { cpu_core_i    } cpu_x86_64_v1_flags+[CPUX86_HAS_POPCNT],
+     { x86_64-v2     } cpu_x86_64_v2_flags,
      { cpu_bobcat    } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_LZCNT],
      { cpu_bobcat    } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_LZCNT],
      { cpu_core_avx  } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT],
      { cpu_core_avx  } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT],
      { cpu_jaguar    } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_jaguar    } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_piledriver} [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_piledriver} [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_excavator } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_excavator } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
-     { cpu_core_avx2 } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
+     { cpu_core_avx2 } cpu_x86_64_v3_flags,
+     { x86_64-v3     } cpu_x86_64_v3_flags,
      { cpu_zen       } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_zen       } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_zen2      } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_zen2      } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
+     { x86_64-v4     } cpu_x86_64_v4_flags,
      { cpu_icelake   } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_icelake   } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_icelake_client } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_icelake_client } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_icelake_server } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_icelake_server } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE],
      { cpu_zen3      } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE]
      { cpu_zen3      } [CPUX86_HAS_BSWAP,CPUX86_HAS_BTX,CPUX86_HAS_CMOV,CPUX86_HAS_SSEUNIT,CPUX86_HAS_SSE2,CPUX86_HAS_POPCNT,CPUX86_HAS_BMI1,CPUX86_HAS_BMI2,CPUX86_HAS_LZCNT,CPUX86_HAS_MOVBE]
    );
    );
 
 
+   fpu_x86_64_v1_flags = [];
+   fpu_x86_64_v2_flags = fpu_x86_64_v1_flags+[FPUX86_HAS_SSE3,FPUX86_HAS_SSE4_1,FPUX86_HAS_SSE4_2,FPUX86_HAS_SSSE3];
+   fpu_x86_64_v3_flags = fpu_x86_64_v2_flags+[FPUX86_HAS_AVXUNIT,FPUX86_HAS_FMA,FPUX86_HAS_F16C,FPUX86_HAS_AVX2];
+   fpu_x86_64_v4_flags = fpu_x86_64_v3_flags;
+
    fpu_capabilities : array[tfputype] of set of tfpuflags = (
    fpu_capabilities : array[tfputype] of set of tfpuflags = (
-      { fpu_none     } [],
-      { fpu_sse64    } [],
-      { fpu_sse3     } [],
-      { fpu_ssse3    } [],
-      { fpu_sse41    } [],
-      { fpu_sse42    } [],
-      { fpu_avx      } [FPUX86_HAS_AVXUNIT],
-      { fpu_fma      } [FPUX86_HAS_AVXUNIT,FPUX86_HAS_FMA],
-      { fpu_avx2     } [FPUX86_HAS_AVXUNIT,FPUX86_HAS_FMA,FPUX86_HAS_AVX2],
-      { fpu_avx512   } [FPUX86_HAS_AVXUNIT,FPUX86_HAS_FMA,FPUX86_HAS_AVX2,FPUX86_HAS_32MMREGS,FPUX86_HAS_AVX512F,FPUX86_HAS_AVX512VL,FPUX86_HAS_AVX512DQ]
+      { fpu_none      }  [],
+      { fpu_sse64     }  [],
+      { fpu_x86_64_v1 }  fpu_x86_64_v1_flags,
+      { fpu_sse3      }  fpu_x86_64_v1_flags+[FPUX86_HAS_SSE3],
+      { fpu_ssse3     }  fpu_x86_64_v1_flags+[FPUX86_HAS_SSE3,FPUX86_HAS_SSSE3],
+      { fpu_sse41     }  fpu_x86_64_v1_flags+[FPUX86_HAS_SSE3,FPUX86_HAS_SSE4_1],
+      { fpu_sse42     }  fpu_x86_64_v1_flags+[FPUX86_HAS_SSE3,FPUX86_HAS_SSE4_1,FPUX86_HAS_SSE4_2],
+      { fpu_x86_64_v2 }  fpu_x86_64_v2_flags,
+      { fpu_avx       }  fpu_x86_64_v2_flags+[FPUX86_HAS_AVXUNIT],
+      { fpu_fma       }  fpu_x86_64_v2_flags+[FPUX86_HAS_AVXUNIT,FPUX86_HAS_FMA],
+      { fpu_avx2      }  fpu_x86_64_v2_flags+[FPUX86_HAS_AVXUNIT,FPUX86_HAS_FMA,FPUX86_HAS_AVX2],
+      { fpu_x86_64_v3 }  fpu_x86_64_v3_flags,
+      { fpu_avx512f   }  fpu_x86_64_v3_flags+[FPUX86_HAS_32MMREGS,FPUX86_HAS_AVX512F,FPUX86_HAS_AVX512VL,FPUX86_HAS_AVX512DQ],
+      { fpu_x86_64_v4 }  fpu_x86_64_v4_flags
+
    );
    );
 
 
    cpu_optimization_hints : array[TCPUType] of set of TCPUOptimizeFlags = (
    cpu_optimization_hints : array[TCPUType] of set of TCPUOptimizeFlags = (
       { cpu_none      } [],
       { cpu_none      } [],
       { cpu_Athlon64  } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_Athlon64  } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
+      { cpu_x86_64-v1 } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_core_i    } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_core_i    } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
+      { cpu_x86_64-v2 } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_bobcat    } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_bobcat    } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_core_avx  } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG], { From Sandy Bridge up to Ice Lake, complex LEA instructions are much slower }
       { cpu_core_avx  } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG], { From Sandy Bridge up to Ice Lake, complex LEA instructions are much slower }
       { cpu_jaguar    } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_jaguar    } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_piledriver} [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_piledriver} [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_excavator } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_excavator } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_core_avx2 } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT],
       { cpu_core_avx2 } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT],
+      { cpu_x86_64-v3 } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT],
       { cpu_zen       } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_zen       } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_zen2      } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_zen2      } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_3COMP_ADDR],
+      { cpu_x86_64-v4 } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_icelake   } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_icelake   } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_icelake_client } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_icelake_client } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_icelake_server } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT,CPUX86_HINT_FAST_3COMP_ADDR],
       { cpu_icelake_server } [CPUX86_HINT_FAST_BT_REG_IMM,CPUX86_HINT_FAST_BTX_REG_IMM,CPUX86_HINT_FAST_BT_MEM_IMM,CPUX86_HINT_FAST_XCHG,CPUX86_HINT_FAST_PDEP_PEXT,CPUX86_HINT_FAST_3COMP_ADDR],