diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2015-02-04 09:45:14 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-02-04 09:45:14 +0000 |
commit | f4b24f7ea507ff41db39154a1e6a681a582e224a (patch) | |
tree | ed70e8d35e91dd93d9dd5130ab88d6453dd4b6f3 /compiler/optimizing | |
parent | 6bc17805d2df2678de186e3b4c3e2f959a48555f (diff) | |
parent | 3e6a3bf797e49b7f449256455c7e522e888687d8 (diff) | |
download | art-f4b24f7ea507ff41db39154a1e6a681a582e224a.tar.gz art-f4b24f7ea507ff41db39154a1e6a681a582e224a.tar.bz2 art-f4b24f7ea507ff41db39154a1e6a681a582e224a.zip |
Merge "ART: Change x86 long param ABI (Quick/JNI/Opt)"
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 42 | ||||
-rw-r--r-- | compiler/optimizing/locations.h | 28 |
2 files changed, 1 insertions, 69 deletions
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index c840793743..98f93a418a 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -535,9 +535,6 @@ Location InvokeDexCallingConventionVisitor::GetNextLocation(Primitive::Type type X86ManagedRegister pair = X86ManagedRegister::FromRegisterPair( calling_convention.GetRegisterPairAt(index)); return Location::RegisterPairLocation(pair.AsRegisterPairLow(), pair.AsRegisterPairHigh()); - } else if (index + 1 == calling_convention.GetNumberOfRegisters()) { - // stack_index_ is the right offset for the memory. - return Location::QuickParameter(index, stack_index_ - 2); } else { return Location::DoubleStackSlot(calling_convention.GetStackOffsetOf(stack_index_ - 2)); } @@ -629,16 +626,6 @@ void CodeGeneratorX86::Move64(Location destination, Location source) { Location::RegisterLocation(destination.AsRegisterPairLow<Register>())); } else if (source.IsFpuRegister()) { LOG(FATAL) << "Unimplemented"; - } else if (source.IsQuickParameter()) { - uint16_t register_index = source.GetQuickParameterRegisterIndex(); - uint16_t stack_index = source.GetQuickParameterStackIndex(); - InvokeDexCallingConvention calling_convention; - EmitParallelMoves( - Location::RegisterLocation(calling_convention.GetRegisterAt(register_index)), - Location::RegisterLocation(destination.AsRegisterPairLow<Register>()), - Location::StackSlot( - calling_convention.GetStackOffsetOf(stack_index + 1) + GetFrameSize()), - Location::RegisterLocation(destination.AsRegisterPairHigh<Register>())); } else { // No conflict possible, so just do the moves. DCHECK(source.IsDoubleStackSlot()); @@ -646,23 +633,6 @@ void CodeGeneratorX86::Move64(Location destination, Location source) { __ movl(destination.AsRegisterPairHigh<Register>(), Address(ESP, source.GetHighStackIndex(kX86WordSize))); } - } else if (destination.IsQuickParameter()) { - InvokeDexCallingConvention calling_convention; - uint16_t register_index = destination.GetQuickParameterRegisterIndex(); - uint16_t stack_index = destination.GetQuickParameterStackIndex(); - if (source.IsRegisterPair()) { - LOG(FATAL) << "Unimplemented"; - } else if (source.IsFpuRegister()) { - LOG(FATAL) << "Unimplemented"; - } else { - DCHECK(source.IsDoubleStackSlot()); - EmitParallelMoves( - Location::StackSlot(source.GetStackIndex()), - Location::StackSlot(calling_convention.GetStackOffsetOf(stack_index)), - Location::StackSlot(source.GetHighStackIndex(kX86WordSize)), - Location::StackSlot(calling_convention.GetStackOffsetOf(stack_index + 1))); - __ movl(calling_convention.GetRegisterAt(register_index), Address(ESP, source.GetStackIndex())); - } } else if (destination.IsFpuRegister()) { if (source.IsFpuRegister()) { __ movaps(destination.AsFpuRegister<XmmRegister>(), source.AsFpuRegister<XmmRegister>()); @@ -678,18 +648,6 @@ void CodeGeneratorX86::Move64(Location destination, Location source) { __ movl(Address(ESP, destination.GetStackIndex()), source.AsRegisterPairLow<Register>()); __ movl(Address(ESP, destination.GetHighStackIndex(kX86WordSize)), source.AsRegisterPairHigh<Register>()); - } else if (source.IsQuickParameter()) { - // No conflict possible, so just do the move. - InvokeDexCallingConvention calling_convention; - uint16_t register_index = source.GetQuickParameterRegisterIndex(); - uint16_t stack_index = source.GetQuickParameterStackIndex(); - // Just move the low part. The only time a source is a quick parameter is - // when moving the parameter to its stack locations. And the (Java) caller - // of this method has already done that. - __ movl(Address(ESP, destination.GetStackIndex()), - calling_convention.GetRegisterAt(register_index)); - DCHECK_EQ(calling_convention.GetStackOffsetOf(stack_index + 1) + GetFrameSize(), - static_cast<size_t>(destination.GetHighStackIndex(kX86WordSize))); } else if (source.IsFpuRegister()) { __ movsd(Address(ESP, destination.GetStackIndex()), source.AsFpuRegister<XmmRegister>()); } else { diff --git a/compiler/optimizing/locations.h b/compiler/optimizing/locations.h index 68e3a30969..bf27c5cf7a 100644 --- a/compiler/optimizing/locations.h +++ b/compiler/optimizing/locations.h @@ -62,17 +62,11 @@ class Location : public ValueObject { // We do not use the value 9 because it conflicts with kLocationConstantMask. kDoNotUse9 = 9, - // On 32bits architectures, quick can pass a long where the - // low bits are in the last parameter register, and the high - // bits are in a stack slot. The kQuickParameter kind is for - // handling this special case. - kQuickParameter = 10, - // Unallocated location represents a location that is not fixed and can be // allocated by a register allocator. Each unallocated location has // a policy that specifies what kind of location is suitable. Payload // contains register allocation policy. - kUnallocated = 11, + kUnallocated = 10, }; Location() : value_(kInvalid) { @@ -82,7 +76,6 @@ class Location : public ValueObject { static_assert((kStackSlot & kLocationConstantMask) != kConstant, "TagError"); static_assert((kDoubleStackSlot & kLocationConstantMask) != kConstant, "TagError"); static_assert((kRegister & kLocationConstantMask) != kConstant, "TagError"); - static_assert((kQuickParameter & kLocationConstantMask) != kConstant, "TagError"); static_assert((kFpuRegister & kLocationConstantMask) != kConstant, "TagError"); static_assert((kRegisterPair & kLocationConstantMask) != kConstant, "TagError"); static_assert((kFpuRegisterPair & kLocationConstantMask) != kConstant, "TagError"); @@ -267,24 +260,6 @@ class Location : public ValueObject { return GetPayload() - kStackIndexBias + word_size; } - static Location QuickParameter(uint16_t register_index, uint16_t stack_index) { - return Location(kQuickParameter, register_index << 16 | stack_index); - } - - uint32_t GetQuickParameterRegisterIndex() const { - DCHECK(IsQuickParameter()); - return GetPayload() >> 16; - } - - uint32_t GetQuickParameterStackIndex() const { - DCHECK(IsQuickParameter()); - return GetPayload() & 0xFFFF; - } - - bool IsQuickParameter() const { - return GetKind() == kQuickParameter; - } - Kind GetKind() const { return IsConstant() ? kConstant : KindField::Decode(value_); } @@ -299,7 +274,6 @@ class Location : public ValueObject { case kRegister: return "R"; case kStackSlot: return "S"; case kDoubleStackSlot: return "DS"; - case kQuickParameter: return "Q"; case kUnallocated: return "U"; case kConstant: return "C"; case kFpuRegister: return "F"; |