X87: [turbofan] Turn Math.clz32 into an inlinable builtin.
authorchunyang.dai <chunyang.dai@intel.com>
Wed, 25 Mar 2015 06:41:10 +0000 (23:41 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 25 Mar 2015 06:41:25 +0000 (06:41 +0000)
port 3aa206b86560da94f895625186295bf07a0301d8 (r27329)

original commit message:

BUG=

Review URL: https://codereview.chromium.org/1022523005

Cr-Commit-Position: refs/heads/master@{#27429}

src/x87/lithium-codegen-x87.cc
src/x87/macro-assembler-x87.cc
src/x87/macro-assembler-x87.h

index 80ab9ba6e948c16d2f8b9db31054ebaa6cb50d5c..05944f9f49964b3d7cd39ad31a94442695d88b55 100644 (file)
@@ -4265,14 +4265,8 @@ void LCodeGen::DoMathLog(LMathLog* instr) {
 void LCodeGen::DoMathClz32(LMathClz32* instr) {
   Register input = ToRegister(instr->value());
   Register result = ToRegister(instr->result());
-  Label not_zero_input;
-  __ bsr(result, input);
 
-  __ j(not_zero, &not_zero_input);
-  __ Move(result, Immediate(63));  // 63^31 == 32
-
-  __ bind(&not_zero_input);
-  __ xor_(result, Immediate(31));  // for x in [0..31], 31^x == 31-x.
+  __ Lzcnt(result, input);
 }
 
 
index fc067348e4626ee2e6dd5b2f19a00c03e96af995..b6befebf67ecefe251a4b0446143f17775136898 100644 (file)
@@ -2355,6 +2355,17 @@ void MacroAssembler::Move(const Operand& dst, const Immediate& x) {
 }
 
 
+void MacroAssembler::Lzcnt(Register dst, const Operand& src) {
+  // TODO(intel): Add support for LZCNT (with ABM/BMI1).
+  Label not_zero_src;
+  bsr(dst, src);
+  j(not_zero, &not_zero_src, Label::kNear);
+  Move(dst, Immediate(63));  // 63^31 == 32
+  bind(&not_zero_src);
+  xor_(dst, Immediate(31));  // for x in [0..31], 31^x == 31-x.
+}
+
+
 void MacroAssembler::SetCounter(StatsCounter* counter, int value) {
   if (FLAG_native_code_counters && counter->Enabled()) {
     mov(Operand::StaticVariable(ExternalReference(counter)), Immediate(value));
index 061709be9c050efb6ff5578ad47b22bc4d58b56b..e801bf52f80958c2d9982d3984c1fb59f57a769f 100644 (file)
@@ -776,6 +776,9 @@ class MacroAssembler: public Assembler {
   void Push(Register src) { push(src); }
   void Pop(Register dst) { pop(dst); }
 
+  void Lzcnt(Register dst, Register src) { Lzcnt(dst, Operand(src)); }
+  void Lzcnt(Register dst, const Operand& src);
+
   // Emit call to the code we are currently generating.
   void CallSelf() {
     Handle<Code> self(reinterpret_cast<Code**>(CodeObject().location()));