diff options
| author | 2014-11-25 20:56:51 +0000 | |
|---|---|---|
| committer | 2014-11-26 16:49:23 +0000 | |
| commit | fd861249f31ab360c12dd1ffb131d50f02b0bfc6 (patch) | |
| tree | 1765db2b26337f8e96616ebfb769c95d7b421ad2 /compiler/optimizing/builder.cc | |
| parent | fef1680241e85532919ecfaf42855d31ddb69361 (diff) | |
[optimizing compiler] Add CMP{L,G}_{FLOAT,DOUBLE}
- adds float comparison for arm, x86, x86_64 backends.
- adds ucomis{s,d} assembly to x86 and x86_64.
Change-Id: I232d2b6e9ecf373beb5cc63698dd97a658ff9c83
Diffstat (limited to 'compiler/optimizing/builder.cc')
| -rw-r--r-- | compiler/optimizing/builder.cc | 31 | 
1 files changed, 30 insertions, 1 deletions
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index b261460690..1be6e00938 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -313,6 +313,15 @@ void HGraphBuilder::Binop_23x_shift(const Instruction& instruction,    UpdateLocal(instruction.VRegA(), current_block_->GetLastInstruction());  } +void HGraphBuilder::Binop_23x_cmp(const Instruction& instruction, +                                  Primitive::Type type, +                                  HCompare::Bias bias) { +  HInstruction* first = LoadLocal(instruction.VRegB(), type); +  HInstruction* second = LoadLocal(instruction.VRegC(), type); +  current_block_->AddInstruction(new (arena_) HCompare(type, first, second, bias)); +  UpdateLocal(instruction.VRegA(), current_block_->GetLastInstruction()); +} +  template<typename T>  void HGraphBuilder::Binop_12x(const Instruction& instruction, Primitive::Type type) {    HInstruction* first = LoadLocal(instruction.VRegA(), type); @@ -1492,7 +1501,27 @@ bool HGraphBuilder::AnalyzeDexInstruction(const Instruction& instruction, uint32        break;      case Instruction::CMP_LONG: { -      Binop_23x<HCompare>(instruction, Primitive::kPrimLong); +      Binop_23x_cmp(instruction, Primitive::kPrimLong, HCompare::kNoBias); +      break; +    } + +    case Instruction::CMPG_FLOAT: { +      Binop_23x_cmp(instruction, Primitive::kPrimFloat, HCompare::kGtBias); +      break; +    } + +    case Instruction::CMPG_DOUBLE: { +      Binop_23x_cmp(instruction, Primitive::kPrimDouble, HCompare::kGtBias); +      break; +    } + +    case Instruction::CMPL_FLOAT: { +      Binop_23x_cmp(instruction, Primitive::kPrimFloat, HCompare::kLtBias); +      break; +    } + +    case Instruction::CMPL_DOUBLE: { +      Binop_23x_cmp(instruction, Primitive::kPrimDouble, HCompare::kLtBias);        break;      }  |