OSDN Git Service

Revert "Add x86 inlined abs method for float/double"
authorVladimir Marko <vmarko@google.com>
Tue, 17 Jun 2014 17:56:50 +0000 (17:56 +0000)
committerVladimir Marko <vmarko@google.com>
Tue, 17 Jun 2014 18:02:28 +0000 (19:02 +0100)
This reverts commit e88b89ad1d1a583daf205c7a387ba13f549f95f1.

Change-Id: I2ba21b7442ba3696482d45001e6bd32e8baf9d1f

compiler/dex/quick/dex_file_method_inliner.cc
compiler/dex/quick/dex_file_method_inliner.h
compiler/dex/quick/mir_to_lir.h
compiler/dex/quick/x86/codegen_x86.h
compiler/dex/quick/x86/fp_x86.cc
compiler/dex/quick/x86/utility_x86.cc

index 3f9379c..6397208 100644 (file)
@@ -292,14 +292,10 @@ bool DexFileMethodInliner::AnalyseMethodCode(verifier::MethodVerifier* verifier)
   return success && AddInlineMethod(verifier->GetMethodReference().dex_method_index, method);
 }
 
-bool DexFileMethodInliner::IsIntrinsic(uint32_t method_index, InlineMethod* intrinsic) {
+bool DexFileMethodInliner::IsIntrinsic(uint32_t method_index) {
   ReaderMutexLock mu(Thread::Current(), lock_);
   auto it = inline_methods_.find(method_index);
-  bool res = (it != inline_methods_.end() && (it->second.flags & kInlineIntrinsic) != 0);
-  if (res && intrinsic != nullptr) {
-    *intrinsic = it->second;
-  }
-  return res;
+  return it != inline_methods_.end() && (it->second.flags & kInlineIntrinsic) != 0;
 }
 
 bool DexFileMethodInliner::GenIntrinsic(Mir2Lir* backend, CallInfo* info) {
index 70693c2..c03f89c 100644 (file)
@@ -67,7 +67,7 @@ class DexFileMethodInliner {
     /**
      * Check whether a particular method index corresponds to an intrinsic function.
      */
-    bool IsIntrinsic(uint32_t method_index, InlineMethod* intrinsic) LOCKS_EXCLUDED(lock_);
+    bool IsIntrinsic(uint32_t method_index) LOCKS_EXCLUDED(lock_);
 
     /**
      * Generate code for an intrinsic function invocation.
index ca65432..9155677 100644 (file)
@@ -953,8 +953,8 @@ class Mir2Lir : public Backend {
     bool GenInlinedReverseBytes(CallInfo* info, OpSize size);
     bool GenInlinedAbsInt(CallInfo* info);
     virtual bool GenInlinedAbsLong(CallInfo* info);
-    virtual bool GenInlinedAbsFloat(CallInfo* info);
-    virtual bool GenInlinedAbsDouble(CallInfo* info);
+    bool GenInlinedAbsFloat(CallInfo* info);
+    bool GenInlinedAbsDouble(CallInfo* info);
     bool GenInlinedFloatCvt(CallInfo* info);
     bool GenInlinedDoubleCvt(CallInfo* info);
     virtual bool GenInlinedIndexOf(CallInfo* info, bool zero_based);
index d482e58..d874aaa 100644 (file)
@@ -155,8 +155,6 @@ class X86Mir2Lir : public Mir2Lir {
   bool GenInlinedCas(CallInfo* info, bool is_long, bool is_object);
   bool GenInlinedMinMaxInt(CallInfo* info, bool is_min);
   bool GenInlinedSqrt(CallInfo* info);
-  bool GenInlinedAbsFloat(CallInfo* info) OVERRIDE;
-  bool GenInlinedAbsDouble(CallInfo* info) OVERRIDE;
   bool GenInlinedPeek(CallInfo* info, OpSize size);
   bool GenInlinedPoke(CallInfo* info, OpSize size);
   void GenNotLong(RegLocation rl_dest, RegLocation rl_src);
@@ -798,14 +796,6 @@ class X86Mir2Lir : public Mir2Lir {
    */
   void AnalyzeDoubleUse(RegLocation rl_use);
 
-  /*
-   * @brief Analyze one invoke-static MIR instruction
-   * @param opcode MIR instruction opcode.
-   * @param bb Basic block containing instruction.
-   * @param mir Instruction to analyze.
-   */
-  void AnalyzeInvokeStatic(int opcode, BasicBlock * bb, MIR *mir);
-
   bool Gen64Bit() const  { return gen64bit_; }
 
   // Information derived from analysis of MIR
index 2a1b7dd..458f9c6 100644 (file)
@@ -587,97 +587,5 @@ bool X86Mir2Lir::GenInlinedSqrt(CallInfo* info) {
   return true;
 }
 
-bool X86Mir2Lir::GenInlinedAbsFloat(CallInfo* info) {
-  // Get the argument
-  RegLocation rl_src = info->args[0];
-
-  // Get the inlined intrinsic target virtual register
-  RegLocation rl_dest = InlineTarget(info);
-
-  // Get the virtual register number
-  int v_src_reg = mir_graph_->SRegToVReg(rl_src.s_reg_low);
-  int v_dst_reg = mir_graph_->SRegToVReg(rl_dest.s_reg_low);
-
-  // if argument is the same as inlined intrinsic target
-  if (v_src_reg == v_dst_reg) {
-    rl_src = UpdateLoc(rl_src);
-
-    // if argument is in the physical register
-    if (rl_src.location == kLocPhysReg) {
-      rl_src = LoadValue(rl_src, kCoreReg);
-      OpRegImm(kOpAnd, rl_src.reg, 0x7fffffff);
-      StoreValue(rl_dest, rl_src);
-      return true;
-    }
-    // the argument is in memory
-    DCHECK((rl_src.location == kLocDalvikFrame) ||
-         (rl_src.location == kLocCompilerTemp));
-
-    // Operate directly into memory.
-    int displacement = SRegOffset(rl_dest.s_reg_low);
-    ScopedMemRefType mem_ref_type(this, ResourceMask::kDalvikReg);
-    LIR *lir = NewLIR3(kX86And32MI, TargetReg(kSp).GetReg(), displacement, 0x7fffffff);
-    AnnotateDalvikRegAccess(lir, displacement >> 2, false /*is_load */, false /* is_64bit */);
-    AnnotateDalvikRegAccess(lir, displacement >> 2, true /* is_load */, false /* is_64bit*/);
-    return true;
-  } else {
-    rl_src = LoadValue(rl_src, kCoreReg);
-    RegLocation rl_result = EvalLoc(rl_dest, kCoreReg, true);
-    OpRegRegImm(kOpAnd, rl_result.reg, rl_src.reg, 0x7fffffff);
-    StoreValue(rl_dest, rl_result);
-    return true;
-  }
-}
-
-bool X86Mir2Lir::GenInlinedAbsDouble(CallInfo* info) {
-  RegLocation rl_src = info->args[0];
-  RegLocation rl_dest = InlineTargetWide(info);
-  int v_src_reg = mir_graph_->SRegToVReg(rl_src.s_reg_low);
-  int v_dst_reg = mir_graph_->SRegToVReg(rl_dest.s_reg_low);
-  rl_src = UpdateLocWide(rl_src);
-
-  // if argument is in the physical XMM register
-  if (rl_src.location == kLocPhysReg && rl_src.reg.IsFloat()) {
-    RegLocation rl_result = EvalLoc(rl_dest, kFPReg, true);
-    if (rl_result.reg != rl_src.reg) {
-      LoadConstantWide(rl_result.reg, 0x7fffffffffffffff);
-      NewLIR2(kX86PandRR, rl_result.reg.GetReg(), rl_src.reg.GetReg());
-    } else {
-      RegStorage sign_mask = AllocTempDouble();
-      LoadConstantWide(sign_mask, 0x7fffffffffffffff);
-      NewLIR2(kX86PandRR, rl_result.reg.GetReg(), sign_mask.GetReg());
-      FreeTemp(sign_mask);
-    }
-    StoreValueWide(rl_dest, rl_result);
-    return true;
-  } else if (v_src_reg == v_dst_reg) {
-    // if argument is the same as inlined intrinsic target
-    // if argument is in the physical register
-    if (rl_src.location == kLocPhysReg) {
-      rl_src = LoadValueWide(rl_src, kCoreReg);
-      OpRegImm(kOpAnd, rl_src.reg.GetHigh(), 0x7fffffff);
-      StoreValueWide(rl_dest, rl_src);
-      return true;
-    }
-    // the argument is in memory
-    DCHECK((rl_src.location == kLocDalvikFrame) ||
-           (rl_src.location == kLocCompilerTemp));
-
-    // Operate directly into memory.
-    int displacement = SRegOffset(rl_dest.s_reg_low);
-    ScopedMemRefType mem_ref_type(this, ResourceMask::kDalvikReg);
-    LIR *lir = NewLIR3(kX86And32MI, TargetReg(kSp).GetReg(), displacement  + HIWORD_OFFSET, 0x7fffffff);
-    AnnotateDalvikRegAccess(lir, (displacement + HIWORD_OFFSET) >> 2, true /* is_load */, true /* is_64bit*/);
-    AnnotateDalvikRegAccess(lir, (displacement + HIWORD_OFFSET) >> 2, false /*is_load */, true /* is_64bit */);
-    return true;
-  } else {
-    rl_src = LoadValueWide(rl_src, kCoreReg);
-    RegLocation rl_result = EvalLoc(rl_dest, kCoreReg, true);
-    OpRegCopyWide(rl_result.reg, rl_src.reg);
-    OpRegImm(kOpAnd, rl_result.reg.GetHigh(), 0x7fffffff);
-    StoreValueWide(rl_dest, rl_result);
-    return true;
-  }
-}
 
 }  // namespace art
index 46e877f..b93e3e8 100644 (file)
@@ -18,8 +18,6 @@
 #include "dex/quick/mir_to_lir-inl.h"
 #include "dex/dataflow_iterator-inl.h"
 #include "x86_lir.h"
-#include "dex/quick/dex_file_method_inliner.h"
-#include "dex/quick/dex_file_to_method_inliner_map.h"
 
 namespace art {
 
@@ -955,9 +953,6 @@ void X86Mir2Lir::AnalyzeMIR(int opcode, BasicBlock * bb, MIR *mir) {
     case Instruction::PACKED_SWITCH:
       store_method_addr_ = true;
       break;
-    case Instruction::INVOKE_STATIC:
-      AnalyzeInvokeStatic(opcode, bb, mir);
-      break;
     default:
       // Other instructions are not interesting yet.
       break;
@@ -1025,22 +1020,4 @@ RegLocation X86Mir2Lir::UpdateLocWideTyped(RegLocation loc, int reg_class) {
   DCHECK(CheckCorePoolSanity());
   return loc;
 }
-
-void X86Mir2Lir::AnalyzeInvokeStatic(int opcode, BasicBlock * bb, MIR *mir) {
-  uint32_t index = mir->dalvikInsn.vB;
-  if (!(mir->optimization_flags & MIR_INLINED)) {
-    DCHECK(cu_->compiler_driver->GetMethodInlinerMap() != nullptr);
-    InlineMethod method;
-    if (cu_->compiler_driver->GetMethodInlinerMap()->GetMethodInliner(cu_->dex_file)
-        ->IsIntrinsic(index, &method)) {
-      switch (method.opcode) {
-        case kIntrinsicAbsDouble:
-          store_method_addr_ = true;
-          break;
-        default:
-          break;
-      }
-    }
-  }
-}
 }  // namespace art