diff options
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/builder.cc | 20 | ||||
| -rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 31 | ||||
| -rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 29 | ||||
| -rw-r--r-- | compiler/optimizing/code_generator_x86_64.cc | 29 |
4 files changed, 71 insertions, 38 deletions
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 1188ec0948..4d575cbdcf 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -793,6 +793,16 @@ bool HGraphBuilder::AnalyzeDexInstruction(const Instruction& instruction, uint32 break; } + case Instruction::MUL_FLOAT: { + Binop_23x<HMul>(instruction, Primitive::kPrimFloat); + break; + } + + case Instruction::MUL_DOUBLE: { + Binop_23x<HMul>(instruction, Primitive::kPrimDouble); + break; + } + case Instruction::ADD_LONG_2ADDR: { Binop_12x<HAdd>(instruction, Primitive::kPrimLong); break; @@ -828,6 +838,16 @@ bool HGraphBuilder::AnalyzeDexInstruction(const Instruction& instruction, uint32 break; } + case Instruction::MUL_FLOAT_2ADDR: { + Binop_12x<HMul>(instruction, Primitive::kPrimFloat); + break; + } + + case Instruction::MUL_DOUBLE_2ADDR: { + Binop_12x<HMul>(instruction, Primitive::kPrimDouble); + break; + } + case Instruction::ADD_INT_LIT16: { Binop_22s<HAdd>(instruction, false); break; diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 792ff45cf5..7ed802ec7b 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -1219,15 +1219,16 @@ void LocationsBuilderARM::VisitMul(HMul* mul) { break; } - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); + case Primitive::kPrimFloat: + case Primitive::kPrimDouble: { + locations->SetInAt(0, Location::RequiresFpuRegister()); + locations->SetInAt(1, Location::RequiresFpuRegister()); + locations->SetOut(Location::RequiresFpuRegister()); break; + } default: - LOG(FATAL) << "Unimplemented mul type " << mul->GetResultType(); + LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); } } @@ -1271,15 +1272,21 @@ void InstructionCodeGeneratorARM::VisitMul(HMul* mul) { __ add(out_hi, out_hi, ShifterOperand(IP)); break; } - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); + + case Primitive::kPrimFloat: { + __ vmuls(FromDToLowS(out.As<DRegister>()), + FromDToLowS(first.As<DRegister>()), + FromDToLowS(second.As<DRegister>())); break; + } + + case Primitive::kPrimDouble: { + __ vmuld(out.As<DRegister>(), first.As<DRegister>(), second.As<DRegister>()); + break; + } default: - LOG(FATAL) << "Unimplemented mul type " << mul->GetResultType(); + LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); } } diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index acf410367b..5f01265b85 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -1212,16 +1212,16 @@ void LocationsBuilderX86::VisitMul(HMul* mul) { locations->AddTemp(Location::RegisterLocation(EDX)); break; } - - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); + case Primitive::kPrimFloat: + case Primitive::kPrimDouble: { + locations->SetInAt(0, Location::RequiresFpuRegister()); + locations->SetInAt(1, Location::RequiresFpuRegister()); + locations->SetOut(Location::SameAsFirstInput()); break; + } default: - LOG(FATAL) << "Unimplemented mul type " << mul->GetResultType(); + LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); } } @@ -1283,15 +1283,18 @@ void InstructionCodeGeneratorX86::VisitMul(HMul* mul) { break; } - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); + case Primitive::kPrimFloat: { + __ mulss(first.As<XmmRegister>(), second.As<XmmRegister>()); break; + } + + case Primitive::kPrimDouble: { + __ mulsd(first.As<XmmRegister>(), second.As<XmmRegister>()); + break; + } default: - LOG(FATAL) << "Unimplemented mul type " << mul->GetResultType(); + LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); } } diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index 58dda16d2d..38a40dc7de 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -1166,16 +1166,16 @@ void LocationsBuilderX86_64::VisitMul(HMul* mul) { locations->SetOut(Location::SameAsFirstInput()); break; } - - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); + case Primitive::kPrimFloat: + case Primitive::kPrimDouble: { + locations->SetInAt(0, Location::RequiresFpuRegister()); + locations->SetInAt(1, Location::RequiresFpuRegister()); + locations->SetOut(Location::SameAsFirstInput()); break; + } default: - LOG(FATAL) << "Unimplemented mul type " << mul->GetResultType(); + LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); } } @@ -1202,15 +1202,18 @@ void InstructionCodeGeneratorX86_64::VisitMul(HMul* mul) { break; } - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); + case Primitive::kPrimFloat: { + __ mulss(first.As<XmmRegister>(), second.As<XmmRegister>()); break; + } + + case Primitive::kPrimDouble: { + __ mulsd(first.As<XmmRegister>(), second.As<XmmRegister>()); + break; + } default: - LOG(FATAL) << "Unimplemented mul type " << mul->GetResultType(); + LOG(FATAL) << "Unexpected mul type " << mul->GetResultType(); } } |