diff --git a/i386-asm.h b/i386-asm.h index 16ed5116..0f99b286 100644 --- a/i386-asm.h +++ b/i386-asm.h @@ -75,6 +75,9 @@ ALT(DEF_ASM_OP2(btcw, 0x0fba, 7, OPC_MODRM | OPC_WLX, OPT_IM8, OPT_REGW | OPT_EA ALT(DEF_ASM_OP2(popcntw, 0xf30fb8, 0, OPC_MODRM | OPC_WLX, OPT_REGW | OPT_EA, OPT_REGW)) +ALT(DEF_ASM_OP2(tzcntw, 0xf30fbc, 0, OPC_MODRM | OPC_WLX, OPT_REGW | OPT_EA, OPT_REGW)) +ALT(DEF_ASM_OP2(lzcntw, 0xf30fbd, 0, OPC_MODRM | OPC_WLX, OPT_REGW | OPT_EA, OPT_REGW)) + /* prefixes */ DEF_ASM_OP0(wait, 0x9b) DEF_ASM_OP0(fwait, 0x9b) diff --git a/i386-tok.h b/i386-tok.h index 3145aa63..29071059 100644 --- a/i386-tok.h +++ b/i386-tok.h @@ -269,6 +269,8 @@ DEF_WLX(btr) DEF_WLX(btc) DEF_WLX(popcnt) + DEF_WLX(tzcnt) + DEF_WLX(lzcnt) DEF_WLX(lar) DEF_WLX(lsl) diff --git a/tests/asmtest.S b/tests/asmtest.S index a2b5d095..7f31ce59 100644 --- a/tests/asmtest.S +++ b/tests/asmtest.S @@ -766,7 +766,29 @@ int $0x10 popcnt %rbx, %rdi popcntq %rcx, %r8 #endif - + + lzcnt %cx, %ax + lzcntw %cx, %ax + lzcnt %edx, %ebx + lzcntl 8(%edi), %ecx +#ifdef __x86_64__ + lzcnt %rdi, %rdx + lzcntq %r12, %r15 + lzcnt 0x40(%rcx), %r11 + lzcntq (%r8), %rsi +#endif + + tzcnt %cx, %ax + tzcntw %cx, %ax + tzcnt %edx, %ebx + tzcntl -24(%edi), %ecx +#ifdef __x86_64__ + tzcnt %rbp, %rdx + tzcntq %rax, %r15 + tzcnt -8(%rbp), %rcx + tzcntq (%r8), %r12 +#endif + #ifdef __i386__ boundl %edx, 0x10000 boundw %bx, 0x1000 diff --git a/x86_64-asm.h b/x86_64-asm.h index 53b0d30d..339e1dfb 100644 --- a/x86_64-asm.h +++ b/x86_64-asm.h @@ -83,6 +83,9 @@ ALT(DEF_ASM_OP2(btcw, 0x0fba, 7, OPC_MODRM | OPC_WLX, OPT_IM8, OPT_REGW | OPT_EA ALT(DEF_ASM_OP2(popcntw, 0xf30fb8, 0, OPC_MODRM | OPC_WLX, OPT_REGW | OPT_EA, OPT_REGW)) +ALT(DEF_ASM_OP2(tzcntw, 0xf30fbc, 0, OPC_MODRM | OPC_WLX, OPT_REGW | OPT_EA, OPT_REGW)) +ALT(DEF_ASM_OP2(lzcntw, 0xf30fbd, 0, OPC_MODRM | OPC_WLX, OPT_REGW | OPT_EA, OPT_REGW)) + /* prefixes */ DEF_ASM_OP0(lock, 0xf0) DEF_ASM_OP0(rep, 0xf3)