[x64] Generate test reg,reg instead of cmp reg,0.
authorBenedikt Meurer <bmeurer@chromium.org>
Thu, 19 Feb 2015 07:45:35 +0000 (08:45 +0100)
committerBenedikt Meurer <bmeurer@chromium.org>
Thu, 19 Feb 2015 07:45:52 +0000 (07:45 +0000)
The instruction sequence is shorter and saves decoding bandwidth.

R=svenpanne@chromium.org

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

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

src/compiler/x64/code-generator-x64.cc

index 973bbd1ef06bb794d153701c380eeae63b2c4057..8966fff01c60fe73d9737410bfa604a17aa138e4 100644 (file)
@@ -210,6 +210,27 @@ class OutOfLineTruncateDoubleToI FINAL : public OutOfLineCode {
   } while (0)
 
 
+#define ASSEMBLE_CMP(cmp_instr, test_instr)                      \
+  do {                                                           \
+    if (HasImmediateInput(instr, 1)) {                           \
+      if (instr->InputAt(0)->IsRegister()) {                     \
+        if (i.InputInt32(1) == 0) {                              \
+          __ test_instr(i.InputRegister(0), i.InputRegister(0)); \
+        } else {                                                 \
+          __ cmp_instr(i.InputRegister(0), i.InputImmediate(1)); \
+        }                                                        \
+      } else {                                                   \
+        __ cmp_instr(i.InputOperand(0), i.InputImmediate(1));    \
+      }                                                          \
+    } else {                                                     \
+      if (instr->InputAt(1)->IsRegister()) {                     \
+        __ cmp_instr(i.InputRegister(0), i.InputRegister(1));    \
+      } else {                                                   \
+        __ cmp_instr(i.InputRegister(0), i.InputOperand(1));     \
+      }                                                          \
+    }                                                            \
+  } while (0)
+
 #define ASSEMBLE_MULT(asm_instr)                              \
   do {                                                        \
     if (HasImmediateInput(instr, 1)) {                        \
@@ -588,10 +609,10 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
       ASSEMBLE_BINOP(andq);
       break;
     case kX64Cmp32:
-      ASSEMBLE_BINOP(cmpl);
+      ASSEMBLE_CMP(cmpl, testl);
       break;
     case kX64Cmp:
-      ASSEMBLE_BINOP(cmpq);
+      ASSEMBLE_CMP(cmpq, testq);
       break;
     case kX64Test32:
       ASSEMBLE_BINOP(testl);