diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2014-11-06 15:15:31 +0000 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2014-11-07 13:54:29 +0000 |
commit | 52e832b1278449e62d9eb502d54d5ff18f8606ed (patch) | |
tree | 14db2240db9d0cec5551f8588a5901bd1bc081fe /compiler/optimizing/code_generator_arm.cc | |
parent | eb71b3fc2a18ac649dc3743f4ec28f781932030a (diff) |
Support floats and doubles in fields.
Change-Id: I19832106633405403f0461b3fe13b268abe39db3
Diffstat (limited to 'compiler/optimizing/code_generator_arm.cc')
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 64 |
1 files changed, 48 insertions, 16 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index fef7f0e80f..a031ce3389 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -1826,10 +1826,18 @@ void InstructionCodeGeneratorARM::VisitInstanceFieldSet(HInstanceFieldSet* instr break; } - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - LOG(FATAL) << "Unimplemented register type " << field_type; - UNREACHABLE(); + case Primitive::kPrimFloat: { + SRegister value = locations->InAt(1).As<SRegister>(); + __ StoreSToOffset(value, obj, offset); + break; + } + + case Primitive::kPrimDouble: { + DRegister value = FromLowSToD(locations->InAt(1).AsFpuRegisterPairLow<SRegister>()); + __ StoreDToOffset(value, obj, offset); + break; + } + case Primitive::kPrimVoid: LOG(FATAL) << "Unreachable type " << field_type; UNREACHABLE(); @@ -1887,10 +1895,18 @@ void InstructionCodeGeneratorARM::VisitInstanceFieldGet(HInstanceFieldGet* instr break; } - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - LOG(FATAL) << "Unimplemented register type " << instruction->GetType(); - UNREACHABLE(); + case Primitive::kPrimFloat: { + SRegister out = locations->Out().As<SRegister>(); + __ LoadSFromOffset(out, obj, offset); + break; + } + + case Primitive::kPrimDouble: { + DRegister out = FromLowSToD(locations->Out().AsFpuRegisterPairLow<SRegister>()); + __ LoadDFromOffset(out, obj, offset); + break; + } + case Primitive::kPrimVoid: LOG(FATAL) << "Unreachable type " << instruction->GetType(); UNREACHABLE(); @@ -2424,10 +2440,18 @@ void InstructionCodeGeneratorARM::VisitStaticFieldGet(HStaticFieldGet* instructi break; } - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - LOG(FATAL) << "Unimplemented register type " << instruction->GetType(); - UNREACHABLE(); + case Primitive::kPrimFloat: { + SRegister out = locations->Out().As<SRegister>(); + __ LoadSFromOffset(out, cls, offset); + break; + } + + case Primitive::kPrimDouble: { + DRegister out = FromLowSToD(locations->Out().AsFpuRegisterPairLow<SRegister>()); + __ LoadDFromOffset(out, cls, offset); + break; + } + case Primitive::kPrimVoid: LOG(FATAL) << "Unreachable type " << instruction->GetType(); UNREACHABLE(); @@ -2486,10 +2510,18 @@ void InstructionCodeGeneratorARM::VisitStaticFieldSet(HStaticFieldSet* instructi break; } - case Primitive::kPrimFloat: - case Primitive::kPrimDouble: - LOG(FATAL) << "Unimplemented register type " << field_type; - UNREACHABLE(); + case Primitive::kPrimFloat: { + SRegister value = locations->InAt(1).As<SRegister>(); + __ StoreSToOffset(value, cls, offset); + break; + } + + case Primitive::kPrimDouble: { + DRegister value = FromLowSToD(locations->InAt(1).AsFpuRegisterPairLow<SRegister>()); + __ StoreDToOffset(value, cls, offset); + break; + } + case Primitive::kPrimVoid: LOG(FATAL) << "Unreachable type " << field_type; UNREACHABLE(); |