c8cc07a61c
These rely on the hilarious BSR and BSF instructions on x64. ARMv8 has an instruction that does something similar: count leading zeros. Unfortunately, their semantics differ in a few important ways: - BSR and BSF, when given a zero input, set the zero flag and have undefined output. CLZ outputs 64. - BSR and BSF return the index (starting from 0 at the LSB) of the most- or least-significant 1 bit. CLZ does what it says: count leading zeros. Bottom line, there has to be some bit trickery somewhere to fit the two instructions into the same interface. I kept the x64 implementations the same and put all the nastiness in the ARM implementations to make them match, since obviously the perf of the ARM implementations doesn't matter yet.
58 linhas
1.6 KiB
C++
58 linhas
1.6 KiB
C++
/*
|
|
+----------------------------------------------------------------------+
|
|
| HipHop for PHP |
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| http://www.php.net/license/3_01.txt |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#include "util/bitops.h"
|
|
#include <gtest/gtest.h>
|
|
|
|
namespace HPHP {
|
|
|
|
TEST(BitopsTest, FfsNonzero) {
|
|
int64_t out;
|
|
int64_t one = 1;
|
|
bool res;
|
|
for (int i = 0; i < 63; i++) {
|
|
res = ffs64(one << i, out);
|
|
EXPECT_TRUE(res);
|
|
EXPECT_EQ(i, out);
|
|
}
|
|
}
|
|
|
|
TEST(BitopsTest, FlsNonzero) {
|
|
int64_t out;
|
|
int64_t one = 1;
|
|
bool res;
|
|
for (int i = 0; i < 63; i++) {
|
|
res = fls64(one << i, out);
|
|
EXPECT_TRUE(res);
|
|
EXPECT_EQ(i, out);
|
|
}
|
|
}
|
|
|
|
TEST(BitopsTest, FfsZero) {
|
|
int64_t zero = 0;
|
|
int64_t out;
|
|
EXPECT_FALSE(ffs64(zero, out));
|
|
}
|
|
|
|
TEST(BitopsTest, FlsZero) {
|
|
int64_t zero = 0;
|
|
int64_t out;
|
|
EXPECT_FALSE(fls64(zero, out));
|
|
}
|
|
|
|
}
|
|
|