Version 2.13.0-75.0.dev
Merge commit '1a83a454dd71ce5b183758d140aa0765eb2819be' into 'dev'
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 21149ef..79eff28 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -881,6 +881,9 @@
void clz(Register rd, Register rn) {
EmitMiscDP1Source(CLZ, rd, rn, kEightBytes);
}
+ void clzw(Register rd, Register rn) {
+ EmitMiscDP1Source(CLZ, rd, rn, kFourBytes);
+ }
// Reverse bits.
void rbit(Register rd, Register rn) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index f4b0afb..62129c2 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -1279,6 +1279,44 @@
EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
}
+ASSEMBLER_TEST_GENERATE(Clzw, assembler) {
+ Label error;
+
+ __ clzw(R1, ZR);
+ __ cmp(R1, Operand(32));
+ __ b(&error, NE);
+ __ LoadImmediate(R2, 42);
+ __ clzw(R2, R2);
+ __ cmp(R2, Operand(26));
+ __ b(&error, NE);
+ __ LoadImmediate(R0, -1);
+ __ clzw(R1, R0);
+ __ cmp(R1, Operand(0));
+ __ b(&error, NE);
+ __ add(R0, ZR, Operand(R0, LSR, 35));
+ __ clzw(R1, R0);
+ __ cmp(R1, Operand(3));
+ __ b(&error, NE);
+ __ LoadImmediate(R0, 0xFFFFFFFF0FFFFFFF);
+ __ clzw(R1, R0);
+ __ cmp(R1, Operand(4));
+ __ b(&error, NE);
+ __ LoadImmediate(R0, 0xFFFFFFFF);
+ __ clzw(R1, R0);
+ __ cmp(R1, Operand(0));
+ __ b(&error, NE);
+ __ mov(R0, ZR);
+ __ ret();
+ __ Bind(&error);
+ __ LoadImmediate(R0, 1);
+ __ ret();
+}
+
+ASSEMBLER_TEST_RUN(Clzw, test) {
+ typedef int64_t (*Int64Return)() DART_UNUSED;
+ EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+}
+
ASSEMBLER_TEST_GENERATE(Rbit, assembler) {
const int64_t immediate = 0x0000000000000015;
__ LoadImmediate(R0, immediate);
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 63d9e07..11cf428 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -2573,19 +2573,11 @@
switch (op) {
case 4: {
// Format(instr, "clz'sf 'rd, 'rn");
- int64_t rd_val = 0;
- int64_t rn_val = (instr->SFField() == 1) ? rn_val64 : rn_val32;
- if (rn_val != 0) {
- while (rn_val > 0) {
- rd_val++;
- rn_val <<= 1;
- }
- } else {
- rd_val = (instr->SFField() == 1) ? 64 : 32;
- }
if (instr->SFField() == 1) {
+ const uint64_t rd_val = Utils::CountLeadingZeros64(rn_val64);
set_register(instr, rd, rd_val, R31IsZR);
} else {
+ const uint32_t rd_val = Utils::CountLeadingZeros32(rn_val32);
set_wregister(rd, rd_val, R31IsZR);
}
break;
diff --git a/tools/VERSION b/tools/VERSION
index 836aaa1..d068d72 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 13
PATCH 0
-PRERELEASE 74
+PRERELEASE 75
PRERELEASE_PATCH 0
\ No newline at end of file