From 3cd03fc149dc058ee03cd7bc36dad46157b01097 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 18 Nov 2017 23:49:37 +1100 Subject: get rid of branches in cout_leading_zeros and ount_leading_ones (nw) --- src/osd/eigccppc.h | 3 +-- src/osd/eigccx86.h | 30 ++++++++++++++---------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/osd/eigccppc.h b/src/osd/eigccppc.h index 7c322299e3c..7f932eb1e88 100644 --- a/src/osd/eigccppc.h +++ b/src/osd/eigccppc.h @@ -275,10 +275,9 @@ _count_leading_ones(uint32_t value) uint32_t result; __asm__ ( - " not %[result], %[value] \n" " cntlzw %[result], %[result] \n" : [result] "=r" (result) /* result can be in any register */ - : [value] "r" (value) /* 'value' can be in any register */ + : [value] "r" (~value) /* 'value' can be in any register */ ); return result; diff --git a/src/osd/eigccx86.h b/src/osd/eigccx86.h index 363daba5f5f..b67b646451e 100644 --- a/src/osd/eigccx86.h +++ b/src/osd/eigccx86.h @@ -472,13 +472,13 @@ _count_leading_zeros(uint32_t value) { uint32_t result; __asm__ ( - " bsrl %[value], %[result] ;" - " jnz 1f ;" - " movl $63, %[result] ;" - "1: xorl $31, %[result] ;" - : [result] "=r" (result) // result can be in any register - : [value] "rm" (value) // 'value' can be register or memory - : "cc" // clobbers condition codes + " bsrl %[value], %[result] ;" + " cmovzl %[bias], %[result] ;" + " xorl $31, %[result] ;" + : [result] "=&r" (result) // result can be in any register + : [value] "rm" (value) // 'value' can be register or memory + , [bias] "rm" (uint32_t(63)) // 'bias' can be register or memory + : "cc" // clobbers condition codes ); return result; } @@ -495,15 +495,13 @@ _count_leading_ones(uint32_t value) { uint32_t result; __asm__ ( - " movl %[value], %[result] ;" - " notl %[result] ;" - " bsrl %[result], %[result] ;" - " jnz 1f ;" - " movl $63, %[result] ;" - "1: xorl $31, %[result] ;" - : [result] "=r" (result) // result can be in any register - : [value] "rmi" (value) // 'value' can be register, memory or immediate - : "cc" // clobbers condition codes + " bsrl %[value], %[result] ;" + " cmovzl %[bias], %[result] ;" + " xorl $31, %[result] ;" + : [result] "=&r" (result) // result can be in any register + : [value] "rm" (~value) // 'value' can be register or memory + , [bias] "rm" (uint32_t(63)) // 'bias' can be register or memory + : "cc" // clobbers condition codes ); return result; } -- cgit v1.2.3