diff options
Diffstat (limited to 'compiler/optimizing/code_generator_x86.cc')
-rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 64 |
1 files changed, 48 insertions, 16 deletions
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 127ddbeab1..54a12fdee0 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -1844,10 +1844,18 @@ void InstructionCodeGeneratorX86::VisitInstanceFieldSet(HInstanceFieldSet* instr break; } - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - LOG(FATAL) << "Unimplemented register type " << field_type; - UNREACHABLE(); + case Primitive::kPrimFloat: { + XmmRegister value = locations->InAt(1).As<XmmRegister>(); + __ movss(Address(obj, offset), value); + break; + } + + case Primitive::kPrimDouble: { + XmmRegister value = locations->InAt(1).As<XmmRegister>(); + __ movsd(Address(obj, offset), value); + break; + } + case Primitive::kPrimVoid: LOG(FATAL) << "Unreachable type " << field_type; UNREACHABLE(); @@ -1917,10 +1925,18 @@ void InstructionCodeGeneratorX86::VisitInstanceFieldGet(HInstanceFieldGet* instr break; } - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - LOG(FATAL) << "Unimplemented register type " << instruction->GetType(); - UNREACHABLE(); + case Primitive::kPrimFloat: { + XmmRegister out = locations->Out().As<XmmRegister>(); + __ movss(out, Address(obj, offset)); + break; + } + + case Primitive::kPrimDouble: { + XmmRegister out = locations->Out().As<XmmRegister>(); + __ movsd(out, Address(obj, offset)); + break; + } + case Primitive::kPrimVoid: LOG(FATAL) << "Unreachable type " << instruction->GetType(); UNREACHABLE(); @@ -2508,10 +2524,18 @@ void InstructionCodeGeneratorX86::VisitStaticFieldGet(HStaticFieldGet* instructi break; } - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - LOG(FATAL) << "Unimplemented register type " << instruction->GetType(); - UNREACHABLE(); + case Primitive::kPrimFloat: { + XmmRegister out = locations->Out().As<XmmRegister>(); + __ movss(out, Address(cls, offset)); + break; + } + + case Primitive::kPrimDouble: { + XmmRegister out = locations->Out().As<XmmRegister>(); + __ movsd(out, Address(cls, offset)); + break; + } + case Primitive::kPrimVoid: LOG(FATAL) << "Unreachable type " << instruction->GetType(); UNREACHABLE(); @@ -2583,10 +2607,18 @@ void InstructionCodeGeneratorX86::VisitStaticFieldSet(HStaticFieldSet* instructi break; } - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - LOG(FATAL) << "Unimplemented register type " << field_type; - UNREACHABLE(); + case Primitive::kPrimFloat: { + XmmRegister value = locations->InAt(1).As<XmmRegister>(); + __ movss(Address(cls, offset), value); + break; + } + + case Primitive::kPrimDouble: { + XmmRegister value = locations->InAt(1).As<XmmRegister>(); + __ movsd(Address(cls, offset), value); + break; + } + case Primitive::kPrimVoid: LOG(FATAL) << "Unreachable type " << field_type; UNREACHABLE(); |