| Index: src/arm64/decoder-arm64-inl.h
|
| diff --git a/src/arm64/decoder-arm64-inl.h b/src/arm64/decoder-arm64-inl.h
|
| index 6718bd3d6899942216f547f51be6066b0d6f7d87..2405f8783000751dbc5f030772d36ff7486bfe6f 100644
|
| --- a/src/arm64/decoder-arm64-inl.h
|
| +++ b/src/arm64/decoder-arm64-inl.h
|
| @@ -213,11 +213,6 @@ void Decoder<V>::DecodeLoadStore(Instruction* instr) {
|
| (instr->Bits(27, 24) == 0xC) ||
|
| (instr->Bits(27, 24) == 0xD) );
|
|
|
| - if ((instr->Bit(28) == 0) && (instr->Bit(29) == 0) && (instr->Bit(26) == 1)) {
|
| - DecodeNEONLoadStore(instr);
|
| - return;
|
| - }
|
| -
|
| if (instr->Bit(24) == 0) {
|
| if (instr->Bit(28) == 0) {
|
| if (instr->Bit(29) == 0) {
|
| @@ -231,6 +226,8 @@ void Decoder<V>::DecodeLoadStore(Instruction* instr) {
|
| } else {
|
| V::VisitLoadStoreAcquireRelease(instr);
|
| }
|
| + } else {
|
| + DecodeAdvSIMDLoadStore(instr);
|
| }
|
| } else {
|
| if ((instr->Bits(31, 30) == 0x3) ||
|
| @@ -516,14 +513,16 @@ void Decoder<V>::DecodeFP(Instruction* instr) {
|
| (instr->Bits(27, 24) == 0xF) );
|
|
|
| if (instr->Bit(28) == 0) {
|
| - DecodeNEONVectorDataProcessing(instr);
|
| + DecodeAdvSIMDDataProcessing(instr);
|
| } else {
|
| - if (instr->Bits(31, 30) == 0x3) {
|
| + if (instr->Bit(29) == 1) {
|
| V::VisitUnallocated(instr);
|
| - } else if (instr->Bits(31, 30) == 0x1) {
|
| - DecodeNEONScalarDataProcessing(instr);
|
| } else {
|
| - if (instr->Bit(29) == 0) {
|
| + if (instr->Bits(31, 30) == 0x3) {
|
| + V::VisitUnallocated(instr);
|
| + } else if (instr->Bits(31, 30) == 0x1) {
|
| + DecodeAdvSIMDDataProcessing(instr);
|
| + } else {
|
| if (instr->Bit(24) == 0) {
|
| if (instr->Bit(21) == 0) {
|
| if ((instr->Bit(23) == 1) ||
|
| @@ -630,190 +629,25 @@ void Decoder<V>::DecodeFP(Instruction* instr) {
|
| V::VisitFPDataProcessing3Source(instr);
|
| }
|
| }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| }
|
| }
|
| }
|
| }
|
|
|
| -template <typename V>
|
| -void Decoder<V>::DecodeNEONLoadStore(Instruction* instr) {
|
| - DCHECK(instr->Bits(29, 25) == 0x6);
|
| - if (instr->Bit(31) == 0) {
|
| - if ((instr->Bit(24) == 0) && (instr->Bit(21) == 1)) {
|
| - V::VisitUnallocated(instr);
|
| - return;
|
| - }
|
|
|
| - if (instr->Bit(23) == 0) {
|
| - if (instr->Bits(20, 16) == 0) {
|
| - if (instr->Bit(24) == 0) {
|
| - V::VisitNEONLoadStoreMultiStruct(instr);
|
| - } else {
|
| - V::VisitNEONLoadStoreSingleStruct(instr);
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - } else {
|
| - if (instr->Bit(24) == 0) {
|
| - V::VisitNEONLoadStoreMultiStructPostIndex(instr);
|
| - } else {
|
| - V::VisitNEONLoadStoreSingleStructPostIndex(instr);
|
| - }
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| +template<typename V>
|
| +void Decoder<V>::DecodeAdvSIMDLoadStore(Instruction* instr) {
|
| + // TODO(all): Implement Advanced SIMD load/store instruction decode.
|
| + DCHECK(instr->Bits(29, 25) == 0x6);
|
| + V::VisitUnimplemented(instr);
|
| }
|
|
|
| -template <typename V>
|
| -void Decoder<V>::DecodeNEONVectorDataProcessing(Instruction* instr) {
|
| - DCHECK(instr->Bits(28, 25) == 0x7);
|
| - if (instr->Bit(31) == 0) {
|
| - if (instr->Bit(24) == 0) {
|
| - if (instr->Bit(21) == 0) {
|
| - if (instr->Bit(15) == 0) {
|
| - if (instr->Bit(10) == 0) {
|
| - if (instr->Bit(29) == 0) {
|
| - if (instr->Bit(11) == 0) {
|
| - V::VisitNEONTable(instr);
|
| - } else {
|
| - V::VisitNEONPerm(instr);
|
| - }
|
| - } else {
|
| - V::VisitNEONExtract(instr);
|
| - }
|
| - } else {
|
| - if (instr->Bits(23, 22) == 0) {
|
| - V::VisitNEONCopy(instr);
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - } else {
|
| - if (instr->Bit(10) == 0) {
|
| - if (instr->Bit(11) == 0) {
|
| - V::VisitNEON3Different(instr);
|
| - } else {
|
| - if (instr->Bits(18, 17) == 0) {
|
| - if (instr->Bit(20) == 0) {
|
| - if (instr->Bit(19) == 0) {
|
| - V::VisitNEON2RegMisc(instr);
|
| - } else {
|
| - if (instr->Bits(30, 29) == 0x2) {
|
| - V::VisitUnallocated(instr);
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - } else {
|
| - if (instr->Bit(19) == 0) {
|
| - V::VisitNEONAcrossLanes(instr);
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - } else {
|
| - V::VisitNEON3Same(instr);
|
| - }
|
| - }
|
| - } else {
|
| - if (instr->Bit(10) == 0) {
|
| - V::VisitNEONByIndexedElement(instr);
|
| - } else {
|
| - if (instr->Bit(23) == 0) {
|
| - if (instr->Bits(22, 19) == 0) {
|
| - V::VisitNEONModifiedImmediate(instr);
|
| - } else {
|
| - V::VisitNEONShiftImmediate(instr);
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| -}
|
|
|
| -template <typename V>
|
| -void Decoder<V>::DecodeNEONScalarDataProcessing(Instruction* instr) {
|
| - DCHECK(instr->Bits(28, 25) == 0xF);
|
| - if (instr->Bit(24) == 0) {
|
| - if (instr->Bit(21) == 0) {
|
| - if (instr->Bit(15) == 0) {
|
| - if (instr->Bit(10) == 0) {
|
| - if (instr->Bit(29) == 0) {
|
| - if (instr->Bit(11) == 0) {
|
| - V::VisitUnallocated(instr);
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - } else {
|
| - if (instr->Bits(23, 22) == 0) {
|
| - V::VisitNEONScalarCopy(instr);
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - } else {
|
| - if (instr->Bit(10) == 0) {
|
| - if (instr->Bit(11) == 0) {
|
| - V::VisitNEONScalar3Diff(instr);
|
| - } else {
|
| - if (instr->Bits(18, 17) == 0) {
|
| - if (instr->Bit(20) == 0) {
|
| - if (instr->Bit(19) == 0) {
|
| - V::VisitNEONScalar2RegMisc(instr);
|
| - } else {
|
| - if (instr->Bit(29) == 0) {
|
| - V::VisitUnallocated(instr);
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - } else {
|
| - if (instr->Bit(19) == 0) {
|
| - V::VisitNEONScalarPairwise(instr);
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - } else {
|
| - V::VisitNEONScalar3Same(instr);
|
| - }
|
| - }
|
| - } else {
|
| - if (instr->Bit(10) == 0) {
|
| - V::VisitNEONScalarByIndexedElement(instr);
|
| - } else {
|
| - if (instr->Bit(23) == 0) {
|
| - V::VisitNEONScalarShiftImmediate(instr);
|
| - } else {
|
| - V::VisitUnallocated(instr);
|
| - }
|
| - }
|
| - }
|
| +template<typename V>
|
| +void Decoder<V>::DecodeAdvSIMDDataProcessing(Instruction* instr) {
|
| + // TODO(all): Implement Advanced SIMD data processing instruction decode.
|
| + DCHECK(instr->Bits(27, 25) == 0x7);
|
| + V::VisitUnimplemented(instr);
|
| }
|
|
|
|
|
|
|