1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_ARM64_DECODER_ARM64_INL_H_ 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_ARM64_DECODER_ARM64_INL_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/decoder-arm64.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/globals.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Top-level instruction decode function. 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::Decode(Instruction *instr) { 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bits(28, 27) == 0) { 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->Bits(27, 24)) { 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 0: PC relative addressing. 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x0: DecodePCRelAddressing(instr); break; 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 1: Add/sub immediate. 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x1: DecodeAddSubImmediate(instr); break; 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A: Logical shifted register. 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Add/sub with carry. 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conditional compare register. 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conditional compare immediate. 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conditional select. 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Data processing 1 source. 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Data processing 2 source. 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // B: Add/sub shifted register. 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Add/sub extended register. 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Data processing 3 source. 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0xA: 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0xB: DecodeDataProcessing(instr); break; 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 2: Logical immediate. 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Move wide immediate. 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x2: DecodeLogical(instr); break; 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 3: Bitfield. 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Extract. 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x3: DecodeBitfieldExtract(instr); break; 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 4: Unconditional branch immediate. 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Exception generation. 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Compare and branch immediate. 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 5: Compare and branch immediate. 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conditional branch. 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // System. 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 6,7: Unconditional branch. 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Test and branch immediate. 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x4: 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x5: 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x6: 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x7: DecodeBranchSystemException(instr); break; 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 8,9: Load/store register pair post-index. 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Load register literal. 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Load/store register unscaled immediate. 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Load/store register immediate post-index. 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Load/store register immediate pre-index. 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Load/store register offset. 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // C,D: Load/store register pair offset. 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Load/store register pair pre-index. 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Load/store register unsigned immediate. 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Advanced SIMD. 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x8: 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0x9: 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0xC: 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0xD: DecodeLoadStore(instr); break; 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // E: FP fixed point conversion. 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FP integer conversion. 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FP data processing 1 source. 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FP compare. 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FP immediate. 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FP data processing 2 source. 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FP conditional compare. 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FP conditional select. 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Advanced SIMD. 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // F: FP data processing 3 source. 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Advanced SIMD. 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0xE: 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0xF: DecodeFP(instr); break; 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodePCRelAddressing(Instruction* instr) { 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->Bits(27, 24) == 0x0); 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We know bit 28 is set, as <b28:b27> = 0 is filtered out at the top level 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // decode. 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->Bit(28) == 0x1); 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitPCRelAddressing(instr); 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeBranchSystemException(Instruction* instr) { 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((instr->Bits(27, 24) == 0x4) || 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(27, 24) == 0x5) || 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(27, 24) == 0x6) || 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(27, 24) == 0x7) ); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->Bits(31, 29)) { 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0: 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 4: { 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnconditionalBranch(instr); 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 5: { 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(25) == 0) { 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitCompareBranch(instr); 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitTestBranch(instr); 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: { 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(25) == 0) { 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bit(24) == 0x1) || 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x01000010) == 0x00000010)) { 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitConditionalBranch(instr); 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 6: { 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(25) == 0) { 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(24) == 0) { 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(4, 2) != 0) || 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00E0001D) == 0x00200001) || 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00E0001D) == 0x00400001) || 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00E0001E) == 0x00200002) || 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00E0001E) == 0x00400002) || 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00E0001C) == 0x00600000) || 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00E0001C) == 0x00800000) || 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00E0001F) == 0x00A00000) || 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00C0001C) == 0x00C00000)) { 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitException(instr); 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bits(23, 22) == 0) { 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Instr masked_003FF0E0 = instr->Mask(0x003FF0E0); 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(21, 19) == 0x4) || 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_003FF0E0 == 0x00033000) || 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_003FF0E0 == 0x003FF020) || 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_003FF0E0 == 0x003FF060) || 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_003FF0E0 == 0x003FF0E0) || 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00388000) == 0x00008000) || 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x0038E000) == 0x00000000) || 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x0039E000) == 0x00002000) || 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x003AE000) == 0x00002000) || 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x003CE000) == 0x00042000) || 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x003FFFC0) == 0x000320C0) || 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x003FF100) == 0x00032100) || 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x003FF200) == 0x00032200) || 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x003FF400) == 0x00032400) || 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x003FF800) == 0x00032800) || 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x0038F000) == 0x00005000) || 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x0038E000) == 0x00006000)) { 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitSystem(instr); 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bit(24) == 0x1) || 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(20, 16) != 0x1F) || 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(15, 10) != 0) || 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(4, 0) != 0) || 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(24, 21) == 0x3) || 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(24, 22) == 0x3)) { 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnconditionalBranchToRegister(instr); 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 7: { 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeLoadStore(Instruction* instr) { 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((instr->Bits(27, 24) == 0x8) || 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(27, 24) == 0x9) || 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(27, 24) == 0xC) || 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(27, 24) == 0xD) ); 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(24) == 0) { 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(28) == 0) { 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(29) == 0) { 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(26) == 0) { 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(all): VisitLoadStoreExclusive. 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnimplemented(instr); 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DecodeAdvSIMDLoadStore(instr); 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(31, 30) == 0x3) || 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xC4400000) == 0x40000000)) { 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(23) == 0) { 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0xC4400000) == 0xC0400000) { 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Nontemporals are unimplemented. 235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V::VisitUnimplemented(instr); 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadStorePairPostIndex(instr); 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(29) == 0) { 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0xC4000000) == 0xC4000000) { 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadLiteral(instr); 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Mask(0x84C00000) == 0x80C00000) || 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x44800000) == 0x44800000) || 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x84800000) == 0x84800000)) { 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(21) == 0) { 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->Bits(11, 10)) { 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0: { 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadStoreUnscaledOffset(instr); 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: { 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0xC4C00000) == 0xC0800000) { 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadStorePostIndex(instr); 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: { 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(all): VisitLoadStoreRegisterOffsetUnpriv. 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnimplemented(instr); 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: { 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0xC4C00000) == 0xC0800000) { 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadStorePreIndex(instr); 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bits(11, 10) == 0x2) { 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(14) == 0) { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadStoreRegisterOffset(instr); 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(28) == 0) { 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(29) == 0) { 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(31, 30) == 0x3) || 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xC4400000) == 0x40000000)) { 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(23) == 0) { 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadStorePairOffset(instr); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadStorePairPreIndex(instr); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(29) == 0) { 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Mask(0x84C00000) == 0x80C00000) || 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x44800000) == 0x44800000) || 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x84800000) == 0x84800000)) { 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLoadStoreUnsignedOffset(instr); 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeLogical(Instruction* instr) { 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->Bits(27, 24) == 0x2); 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0x80400000) == 0x00400000) { 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(23) == 0) { 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLogicalImmediate(instr); 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bits(30, 29) == 0x1) { 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitMoveWideImmediate(instr); 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeBitfieldExtract(Instruction* instr) { 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->Bits(27, 24) == 0x3); 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Mask(0x80400000) == 0x80000000) || 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x80400000) == 0x00400000) || 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x80008000) == 0x00008000)) { 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->Bit(23) == 0) { 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Mask(0x80200000) == 0x00200000) || 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x60000000) == 0x60000000)) { 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitBitfield(instr); 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Mask(0x60200000) == 0x00200000) || 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x60000000) != 0x00000000)) { 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitExtract(instr); 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeAddSubImmediate(Instruction* instr) { 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->Bits(27, 24) == 0x1); 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(23) == 1) { 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitAddSubImmediate(instr); 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeDataProcessing(Instruction* instr) { 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((instr->Bits(27, 24) == 0xA) || 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(27, 24) == 0xB) ); 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(24) == 0) { 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(28) == 0) { 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0x80008000) == 0x00008000) { 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitLogicalShifted(instr); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->Bits(23, 21)) { 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 0: { 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0x0000FC00) != 0) { 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitAddSubWithCarry(instr); 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: { 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bit(29) == 0) || 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00000410) != 0)) { 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(11) == 0) { 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitConditionalCompareRegister(instr); 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitConditionalCompareImmediate(instr); 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 4: { 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0x20000800) != 0x00000000) { 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitConditionalSelect(instr); 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 6: { 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(29) == 0x1) { 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(30) == 0) { 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bit(15) == 0x1) || 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(15, 11) == 0) || 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(15, 12) == 0x1) || 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(15, 12) == 0x3) || 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(15, 13) == 0x3) || 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x8000EC00) == 0x00004C00) || 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x8000E800) == 0x80004000) || 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x8000E400) == 0x80004000)) { 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitDataProcessing2Source(instr); 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bit(13) == 1) || 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(20, 16) != 0) || 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(15, 14) != 0) || 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA01FFC00) == 0x00000C00) || 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x201FF800) == 0x00001800)) { 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitDataProcessing1Source(instr); 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 5: 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 7: V::VisitUnallocated(instr); break; 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(28) == 0) { 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(21) == 0) { 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(23, 22) == 0x3) || 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x80008000) == 0x00008000)) { 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitAddSubShifted(instr); 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Mask(0x00C00000) != 0x00000000) || 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00001400) == 0x00001400) || 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00001800) == 0x00001800)) { 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitAddSubExtended(instr); 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bit(30) == 0x1) || 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(30, 29) == 0x1) || 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xE0600000) == 0x00200000) || 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xE0608000) == 0x00400000) || 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x60608000) == 0x00408000) || 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x60E00000) == 0x00E00000) || 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x60E00000) == 0x00800000) || 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x60E00000) == 0x00600000)) { 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitDataProcessing3Source(instr); 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeFP(Instruction* instr) { 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((instr->Bits(27, 24) == 0xE) || 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(27, 24) == 0xF) ); 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(28) == 0) { 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DecodeAdvSIMDDataProcessing(instr); 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(29) == 1) { 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bits(31, 30) == 0x3) { 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->Bits(31, 30) == 0x1) { 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DecodeAdvSIMDDataProcessing(instr); 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(24) == 0) { 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bit(21) == 0) { 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bit(23) == 1) || 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bit(18) == 1) || 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x80008000) == 0x00000000) || 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x000E0000) == 0x00000000) || 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x000E0000) == 0x000A0000) || 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00160000) == 0x00000000) || 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00160000) == 0x00120000)) { 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPFixedPointConvert(instr); 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Bits(15, 10) == 32) { 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->Bits(15, 10) == 0) { 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(23, 22) == 0x3) || 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x000E0000) == 0x000A0000) || 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x000E0000) == 0x000C0000) || 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00160000) == 0x00120000) || 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00160000) == 0x00140000) || 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x20C40000) == 0x00800000) || 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x20C60000) == 0x00840000) || 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0C60000) == 0x80060000) || 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0C60000) == 0x00860000) || 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0C60000) == 0x00460000) || 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0CE0000) == 0x80860000) || 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0CE0000) == 0x804E0000) || 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0CE0000) == 0x000E0000) || 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0D60000) == 0x00160000) || 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0D60000) == 0x80560000) || 551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0D60000) == 0x80960000)) { 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPIntegerConvert(instr); 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->Bits(14, 10) == 16) { 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Instr masked_A0DF8000 = instr->Mask(0xA0DF8000); 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Mask(0x80180000) != 0) || 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_A0DF8000 == 0x00020000) || 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_A0DF8000 == 0x00030000) || 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_A0DF8000 == 0x00068000) || 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_A0DF8000 == 0x00428000) || 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_A0DF8000 == 0x00430000) || 564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (masked_A0DF8000 == 0x00468000) || 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0D80000) == 0x00800000) || 566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0DE0000) == 0x00C00000) || 567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0DF0000) == 0x00C30000) || 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0xA0DC0000) == 0x00C40000)) { 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPDataProcessing1Source(instr); 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->Bits(13, 10) == 8) { 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(15, 14) != 0) || 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Bits(2, 0) != 0) || 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x80800000) != 0x00000000)) { 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPCompare(instr); 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->Bits(12, 10) == 4) { 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(9, 5) != 0) || 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x80800000) != 0x00000000)) { 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPImmediate(instr); 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0x80800000) != 0x00000000) { 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->Bits(11, 10)) { 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 1: { 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPConditionalCompare(instr); 595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 2: { 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->Bits(15, 14) == 0x3) || 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x00009000) == 0x00009000) || 600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->Mask(0x0000A000) == 0x0000A000)) { 601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPDataProcessing2Source(instr); 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case 3: { 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPConditionalSelect(instr); 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: UNREACHABLE(); 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bit 30 == 1 has been handled earlier. 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->Bit(30) == 0); 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Mask(0xA0800000) != 0) { 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnallocated(instr); 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitFPDataProcessing3Source(instr); 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeAdvSIMDLoadStore(Instruction* instr) { 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(all): Implement Advanced SIMD load/store instruction decode. 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->Bits(29, 25) == 0x6); 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnimplemented(instr); 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename V> 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Decoder<V>::DecodeAdvSIMDDataProcessing(Instruction* instr) { 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(all): Implement Advanced SIMD data processing instruction decode. 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->Bits(27, 25) == 0x7); 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V::VisitUnimplemented(instr); 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_ARM64_DECODER_ARM64_INL_H_ 651