thumb.isa revision 7113
110915Sandreas.sandberg@arm.com// -*- mode:c++ -*-
210915Sandreas.sandberg@arm.com
310915Sandreas.sandberg@arm.com// Copyright (c) 2010 ARM Limited
410915Sandreas.sandberg@arm.com// All rights reserved
510915Sandreas.sandberg@arm.com//
610915Sandreas.sandberg@arm.com// The license below extends only to copyright in the software and shall
710915Sandreas.sandberg@arm.com// not be construed as granting a license to any other intellectual
810915Sandreas.sandberg@arm.com// property including but not limited to intellectual property relating
910915Sandreas.sandberg@arm.com// to a hardware implementation of the functionality of the software
1010915Sandreas.sandberg@arm.com// licensed hereunder.  You may use the software subject to the license
1110915Sandreas.sandberg@arm.com// terms below provided that you ensure that this notice is replicated
1210915Sandreas.sandberg@arm.com// unmodified and in its entirety in all distributions of the software,
1310915Sandreas.sandberg@arm.com// modified or unmodified, in source code or in binary form.
1410915Sandreas.sandberg@arm.com//
1510915Sandreas.sandberg@arm.com// Copyright (c) 2009 The Regents of The University of Michigan
1610915Sandreas.sandberg@arm.com// All rights reserved.
1710915Sandreas.sandberg@arm.com//
1810915Sandreas.sandberg@arm.com// Redistribution and use in source and binary forms, with or without
1910915Sandreas.sandberg@arm.com// modification, are permitted provided that the following conditions are
2010915Sandreas.sandberg@arm.com// met: redistributions of source code must retain the above copyright
2110915Sandreas.sandberg@arm.com// notice, this list of conditions and the following disclaimer;
2210915Sandreas.sandberg@arm.com// redistributions in binary form must reproduce the above copyright
2310915Sandreas.sandberg@arm.com// notice, this list of conditions and the following disclaimer in the
2410915Sandreas.sandberg@arm.com// documentation and/or other materials provided with the distribution;
2510915Sandreas.sandberg@arm.com// neither the name of the copyright holders nor the names of its
2610915Sandreas.sandberg@arm.com// contributors may be used to endorse or promote products derived from
2710915Sandreas.sandberg@arm.com// this software without specific prior written permission.
2810915Sandreas.sandberg@arm.com//
2910915Sandreas.sandberg@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3010915Sandreas.sandberg@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3110915Sandreas.sandberg@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3210915Sandreas.sandberg@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3310915Sandreas.sandberg@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3410915Sandreas.sandberg@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3510915Sandreas.sandberg@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3610915Sandreas.sandberg@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3710915Sandreas.sandberg@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3810915Sandreas.sandberg@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3910915Sandreas.sandberg@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4010915Sandreas.sandberg@arm.com//
4110915Sandreas.sandberg@arm.com// Authors: Gabe Black
4210915Sandreas.sandberg@arm.com
4310915Sandreas.sandberg@arm.com1: decode BIGTHUMB {
4410915Sandreas.sandberg@arm.com    // 16 bit thumb instructions.
4510915Sandreas.sandberg@arm.com    0: decode TOPCODE_15_13 {
4610915Sandreas.sandberg@arm.com        0x0, 0x1: decode TOPCODE_13_11 {
4710915Sandreas.sandberg@arm.com            0x0: WarnUnimpl::lsl(); //immediate
4810915Sandreas.sandberg@arm.com            0x1: WarnUnimpl::lsr(); //immediate
4910915Sandreas.sandberg@arm.com            0x2: WarnUnimpl::asr(); //immediate
5010915Sandreas.sandberg@arm.com            0x3: decode TOPCODE_10_9 {
5110915Sandreas.sandberg@arm.com                0x0: WarnUnimpl::add(); //register
5210915Sandreas.sandberg@arm.com                0x1: WarnUnimpl::sub(); //register
5310915Sandreas.sandberg@arm.com                0x2: WarnUnimpl::add(); //3 bit immediate
5410915Sandreas.sandberg@arm.com                0x3: WarnUnimpl::sub(); //3 bit immediate
5510915Sandreas.sandberg@arm.com            }
5610915Sandreas.sandberg@arm.com            0x4: WarnUnimpl::mov(); //immediate
5710915Sandreas.sandberg@arm.com            0x5: WarnUnimpl::cmp(); //immediate
5810915Sandreas.sandberg@arm.com            0x6: WarnUnimpl::add(); //8 bit immediate, thumb
5910915Sandreas.sandberg@arm.com            0x7: WarnUnimpl::sub(); //8 bit immediate, thumb
6010915Sandreas.sandberg@arm.com        }
6110915Sandreas.sandberg@arm.com        0x2: decode TOPCODE_12_10 {
6210915Sandreas.sandberg@arm.com            // Data processing
6310915Sandreas.sandberg@arm.com            0x0: decode TOPCODE_9_6 {
6410915Sandreas.sandberg@arm.com                0x0: WarnUnimpl::and(); //register
6510915Sandreas.sandberg@arm.com                0x1: WarnUnimpl::eor(); //register
6610915Sandreas.sandberg@arm.com                0x2: WarnUnimpl::lsl(); //register
6710915Sandreas.sandberg@arm.com                0x3: WarnUnimpl::lsr(); //register
6810915Sandreas.sandberg@arm.com                0x4: WarnUnimpl::asr(); //register
6910915Sandreas.sandberg@arm.com                0x5: WarnUnimpl::adc(); //register
7010915Sandreas.sandberg@arm.com                0x6: WarnUnimpl::sbc(); //register
7110915Sandreas.sandberg@arm.com                0x7: WarnUnimpl::ror(); //register
7210915Sandreas.sandberg@arm.com                0x8: WarnUnimpl::tst(); //register
7310915Sandreas.sandberg@arm.com                0x9: WarnUnimpl::rsb(); //immediate
7410915Sandreas.sandberg@arm.com                0xa: WarnUnimpl::cmp(); //register (high registers)
7510915Sandreas.sandberg@arm.com                0xb: WarnUnimpl::cmn(); //register
7610915Sandreas.sandberg@arm.com                0xc: WarnUnimpl::orr(); //register
7710915Sandreas.sandberg@arm.com                0xd: WarnUnimpl::mul();
7810915Sandreas.sandberg@arm.com                0xe: WarnUnimpl::bic(); //register
7910915Sandreas.sandberg@arm.com                0xf: WarnUnimpl::mvn(); //register
8010915Sandreas.sandberg@arm.com            }
8110915Sandreas.sandberg@arm.com            // Special data instructions and branch and exchange
8210915Sandreas.sandberg@arm.com            0x1: decode TOPCODE_9_6 {
8310915Sandreas.sandberg@arm.com                0x0: WarnUnimpl::add(); //register (low registers)
8410915Sandreas.sandberg@arm.com                0x1, 0x2, 0x3: WarnUnimpl::add(); //register (high registers)
8510915Sandreas.sandberg@arm.com                0x4: WarnUnimpl::unpredictable(); //?
8610915Sandreas.sandberg@arm.com                0x5, 0x6, 0x7: WarnUnimpl::cmp(); //register
8710915Sandreas.sandberg@arm.com                0x8: WarnUnimpl::mov(); //register (low registers)
8810915Sandreas.sandberg@arm.com                0x9, 0xa, 0xb: WarnUnimpl::mov(); //register (high registers)
8910915Sandreas.sandberg@arm.com                0xc, 0xd: WarnUnimpl::bx();
9010915Sandreas.sandberg@arm.com                0xe, 0xf: WarnUnimpl::blx(); //register
9110915Sandreas.sandberg@arm.com            }
9210915Sandreas.sandberg@arm.com            0x2, 0x3: WarnUnimpl::ldr();
9310915Sandreas.sandberg@arm.com            default: decode TOPCODE_11_9 {
9410915Sandreas.sandberg@arm.com                0x0: WarnUnimpl::str(); //register
9510915Sandreas.sandberg@arm.com                0x1: WarnUnimpl::strh(); //register
9610915Sandreas.sandberg@arm.com                0x2: WarnUnimpl::strb(); //register
9710915Sandreas.sandberg@arm.com                0x3: WarnUnimpl::ldrsb(); //register
9810915Sandreas.sandberg@arm.com                0x4: WarnUnimpl::ldr(); //register
9910915Sandreas.sandberg@arm.com                0x5: WarnUnimpl::ldrh(); //register
10010915Sandreas.sandberg@arm.com                0x6: WarnUnimpl::ldrb(); //register
10110915Sandreas.sandberg@arm.com                0x7: WarnUnimpl::ldrsh(); //register
10210915Sandreas.sandberg@arm.com            }
10310915Sandreas.sandberg@arm.com        }
10410915Sandreas.sandberg@arm.com        0x3: decode TOPCODE_12_11 {
10510915Sandreas.sandberg@arm.com            0x0: WarnUnimpl::str(); //immediate, thumb
10610915Sandreas.sandberg@arm.com            0x1: WarnUnimpl::ldr(); //immediate, thumb
10710915Sandreas.sandberg@arm.com            0x2: WarnUnimpl::strb(); //immediate, thumb
10810915Sandreas.sandberg@arm.com            0x3: WarnUnimpl::ldrb(); //immediate, thumb
10910915Sandreas.sandberg@arm.com        }
11010915Sandreas.sandberg@arm.com        0x4: decode TOPCODE_12_11 {
11110915Sandreas.sandberg@arm.com            0x0: WarnUnimpl::strh(); //immediate, thumb
11210915Sandreas.sandberg@arm.com            0x1: WarnUnimpl::ldrh(); //immediate, thumb
11310915Sandreas.sandberg@arm.com            0x2: WarnUnimpl::str(); //immediate, thumb
11410915Sandreas.sandberg@arm.com            0x3: WarnUnimpl::ldr(); //immediate, thumb
11510915Sandreas.sandberg@arm.com        }
11610915Sandreas.sandberg@arm.com        0x5: decode TOPCODE_12_11 {
11710915Sandreas.sandberg@arm.com            0x0: WarnUnimpl::adr();
11810915Sandreas.sandberg@arm.com            0x1: WarnUnimpl::add(); //sp, immediate
11910915Sandreas.sandberg@arm.com            0x2: decode TOPCODE_10_8 {
12010915Sandreas.sandberg@arm.com                0x0: decode TOPCODE_7 {
12110915Sandreas.sandberg@arm.com                    0x0: WarnUnimpl::add(); //sp, immediate
12210915Sandreas.sandberg@arm.com                    0x1: WarnUnimpl::sub(); //sp, immediate
12310915Sandreas.sandberg@arm.com                }
12410915Sandreas.sandberg@arm.com                0x1, 0x3: WarnUnimpl::cbz(); //cbnz too...
12510915Sandreas.sandberg@arm.com                0x2: decode TOPCODE_7_6 {
12610915Sandreas.sandberg@arm.com                    0x0: WarnUnimpl::sxth();
12710915Sandreas.sandberg@arm.com                    0x1: WarnUnimpl::sxtb();
12810915Sandreas.sandberg@arm.com                    0x2: WarnUnimpl::uxth();
12910915Sandreas.sandberg@arm.com                    0x3: WarnUnimpl::uxtb();
13010915Sandreas.sandberg@arm.com                }
13110915Sandreas.sandberg@arm.com                0x4, 0x5: WarnUnimpl::pop();
13210915Sandreas.sandberg@arm.com                0x6: decode TOPCODE_7_5 {
13310915Sandreas.sandberg@arm.com                    0x2: WarnUnimpl::setend();
13410915Sandreas.sandberg@arm.com                    0x3: WarnUnimpl::cps();
13510915Sandreas.sandberg@arm.com                }
13610915Sandreas.sandberg@arm.com            }
13710915Sandreas.sandberg@arm.com            0x3: decode TOPCODE_10_8 {
13810915Sandreas.sandberg@arm.com                0x1, 0x3: WarnUnimpl::cbz(); //cbnz too...
13910915Sandreas.sandberg@arm.com                0x2: decode TOPCODE_7_6 {
140                    0x0: WarnUnimpl::rev();
141                    0x1: WarnUnimpl::rev16();
142                    0x3: WarnUnimpl::revsh();
143                }
144                0x4, 0x5: WarnUnimpl::pop();
145                0x6: WarnUnimpl::bkpt();
146                0x7: decode TOPCODE_3_0 {
147                    0x0: WarnUnimpl::it();
148                    default: decode TOPCODE_7_4 {
149                        0x0: WarnUnimpl::nop();
150                        0x1: WarnUnimpl::yield();
151                        0x2: WarnUnimpl::wfe();
152                        0x3: WarnUnimpl::wfi();
153                        0x4: WarnUnimpl::sev();
154                        default: WarnUnimpl::unallocated_hint();
155                    }
156                }
157            }
158        }
159        0x6: decode TOPCODE_12_11 {
160            0x0: WarnUnimpl::stm(); // also stmia, stmea
161            0x1: WarnUnimpl::ldm(); // also ldmia, ldmea
162            default: decode TOPCODE_11_8 {
163                0xe: WarnUnimpl::undefined(); // permanently undefined
164                0xf: WarnUnimpl::svc(); // formerly swi
165                default: WarnUnimpl::b(); // conditional
166            }
167        }
168        0x7: decode TOPCODE_12_11 {
169            0x0: WarnUnimpl::b(); // unconditional
170        }
171    }
172
173    // 32 bit thumb instructions.
174    1: decode HTOPCODE_12_11 {
175        0x1: decode HTOPCODE_10_9 {
176            0x0: decode HTOPCODE_8_6 {
177                0x0, 0x6: decode HTOPCODE_4 {
178                    0x0: WarnUnimpl::srs();
179                    0x1: WarnUnimpl::rfe();
180                }
181                0x1: decode HTOPCODE_5_4 {
182                    0x0: WarnUnimpl::strex();
183                    0x1: WarnUnimpl::ldrex();
184                    0x2: WarnUnimpl::strd(); // immediate
185                    0x3: decode HTRN {
186                        0xf: WarnUnimpl::ldrd(); // literal
187                        default: WarnUnimpl::ldrd(); // immediate
188                    }
189                }
190                0x2: decode HTOPCODE_4 {
191                    0x0: WarnUnimpl::stm(); // stmia, stmea
192                    0x1: decode HTRN {
193                        0xd: WarnUnimpl::pop();
194                        default: WarnUnimpl::ldm(); // ldmia, ldmfd
195                    }
196                }
197                0x3: decode HTOPCODE_5_4 {
198                    0x0: decode LTOPCODE_7_4 {
199                        0x4: WarnUnimpl::strexb();
200                        0x5: WarnUnimpl::strexh();
201                        0x7: WarnUnimpl::strexd();
202                    }
203                    0x1: decode LTOPCODE_7_4 {
204                        0x0: WarnUnimpl::tbb();
205                        0x1: WarnUnimpl::tbh();
206                        0x4: WarnUnimpl::ldrexb();
207                        0x5: WarnUnimpl::ldrexh();
208                        0x7: WarnUnimpl::ldrexd();
209                    }
210                    0x2: WarnUnimpl::strd(); // immediate
211                    0x3: decode HTRN {
212                        0xf: WarnUnimpl::ldrd(); // literal
213                        default: WarnUnimpl::ldrd(); // immediate
214                    }
215                }
216                0x4: decode HTOPCODE_4 {
217                    0x0: decode HTRN {
218                        0xd: WarnUnimpl::push();
219                        default: WarnUnimpl::stmdb(); // stmfd
220                    }
221                    0x1: WarnUnimpl::ldmdb(); // ldmea
222                }
223                0x5, 0x7: decode HTOPCODE_4 {
224                    0x0: WarnUnimpl::strd(); // immediate
225                    0x1: decode HTRN {
226                        0xf: WarnUnimpl::ldrd(); // literal
227                        default: WarnUnimpl::ldrd(); // immediate
228                    }
229                }
230            }
231            0x1: decode HTOPCODE_8_5 {
232                0x0: decode LTRD {
233                    0xf: decode HTS {
234                        0x1: WarnUnimpl::tst(); // register
235                    }
236                    default: WarnUnimpl::and(); // register
237                }
238                0x1: WarnUnimpl::bic(); // register
239                0x2: decode HTRN {
240                    0xf: WarnUnimpl::mov(); // register
241                    default: WarnUnimpl::orr(); // register
242                }
243                0x3: decode HTRN {
244                    0xf: WarnUnimpl::mvn(); // register
245                    default: WarnUnimpl::orn(); // register
246                }
247                0x4: decode LTRD {
248                    0xf: decode HTS {
249                        0x1: WarnUnimpl::teq(); // register
250                    }
251                    default: WarnUnimpl::eor(); // register
252                }
253                0x6: WarnUnimpl::pkh();
254                0x8: decode LTRD {
255                    0xf: decode HTS {
256                        0x1: WarnUnimpl::cmn(); // register
257                    }
258                    default: WarnUnimpl::add(); // register
259                }
260                0xa: WarnUnimpl::adc(); // register
261                0xb: WarnUnimpl::sbc(); // register
262                0xd: decode LTRD {
263                    0xf: decode HTS {
264                        0x1: WarnUnimpl::cmp(); // register
265                    }
266                    default: WarnUnimpl::sub(); // register
267                }
268                0xe: WarnUnimpl::rsb(); // register
269            }
270            default: decode HTOPCODE_9_8 {
271                0x2: decode LTOPCODE_4 {
272                    0x0: decode LTCOPROC {
273                        0xa, 0xb: decode OPCODE_23_20 {
274##include "vfpdecode.isa"
275                        }
276                        default: WarnUnimpl::cdp(); // cdp2
277                    }
278                    0x1: decode LTCOPROC {
279                        0xa, 0xb: WarnUnimpl::Core_to_extension_transfer();
280                        default: decode HTOPCODE_4 {
281                            0x0: WarnUnimpl::mcr(); // mcr2
282                            0x1: WarnUnimpl::mrc(); // mrc2
283                        }
284                    }
285                }
286                0x3: WarnUnimpl::Advanced_SIMD();
287                default: decode LTCOPROC {
288                    0xa, 0xb: decode HTOPCODE_9_4 {
289                        0x00: WarnUnimpl::undefined();
290                        0x04: WarnUnimpl::mcrr(); // mcrr2
291                        0x05: WarnUnimpl::mrrc(); // mrrc2
292                        0x02, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10,
293                        0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e:
294                            WarnUnimpl::stc(); // stc2
295                        0x03, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x11,
296                        0x13, 0x15, 0x17, 0x19, 0x1b, 0x1d, 0x1f:
297                            decode HTRN {
298                                0xf: WarnUnimpl::ldc(); // ldc2 (literal)
299                                default: WarnUnimpl::ldc(); // ldc2 (immediate)
300                            }
301                    }
302                    default: decode HTOPCODE_9_5 {
303                        0x00: WarnUnimpl::undefined();
304                        0x02: WarnUnimpl::SIMD_VFP_64_bit_core_extension_transfer();
305                        0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
306                        0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f:
307                            WarnUnimpl::Extension_register_load_store_instruction();
308                    }
309                }
310            }
311        }
312        0x2: decode LTOPCODE_15 {
313            0x0: decode HTOPCODE_9 {
314                0x0: decode HTOPCODE_8_5 {
315                    0x0: decode LTRD {
316                        0xf: decode HTS {
317                            0x1: DataModImmOp::tst({{
318                                resTemp = Rn & rotated_imm;
319                            }});
320                        }
321                        default: DataModImmOp::and({{
322                            Rs = resTemp = Rn & rotated_imm;
323                        }});
324                    }
325                    0x1: DataModImmOp::bic({{
326                        Rs = resTemp = Rn & ~rotated_imm;
327                    }});
328                    0x2: decode HTRN {
329                        0xf: DataModImmOp::mov({{
330                            Rs = resTemp = rotated_imm;
331                        }});
332                        default: DataModImmOp::orr({{
333                            Rs = resTemp = Rn | rotated_imm;
334                        }});
335                    }
336                    0x3: decode HTRN {
337                        0xf: DataModImmOp::mvn({{
338                            Rs = resTemp = ~rotated_imm;
339                        }});
340                        default: DataModImmOp::orn({{
341                            Rs = resTemp = Rn | ~rotated_imm;
342                        }});
343                    }
344                    0x4: decode LTRD {
345                        0xf: decode HTS {
346                            0x1: DataModImmOp::teq({{
347                                resTemp = Rn ^ rotated_imm;
348                            }});
349                        }
350                        default: DataModImmOp::eor({{
351                            Rs = resTemp = Rn ^ rotated_imm;
352                        }});
353                    }
354                    0x8: decode LTRD {
355                        0xf: decode HTS {
356                            0x1: DataModImmOp::cmn({{
357                                resTemp = Rn + rotated_imm;
358                            }}, add);
359                        }
360                        default: DataModImmOp::add({{
361                            Rs = resTemp = Rn + rotated_imm;
362                        }}, add);
363                    }
364                    0xa: DataModImmOp::adc({{
365                        Rs = resTemp = Rn + rotated_imm + CondCodes<29:>;
366                    }}, add);
367                    0xb: DataModImmOp::sbc({{
368                        Rs = resTemp = Rn - rotated_imm - !CondCodes<29:>;
369                    }}, sub);
370                    0xd: decode LTRD {
371                        0xf: decode HTS {
372                            0x1: DataModImmOp::cmp({{
373                                resTemp = Rn - rotated_imm;
374                            }}, sub);
375                        }
376                        default: DataModImmOp::sub({{
377                            Rs = resTemp = Rn - rotated_imm;
378                        }}, sub);
379                    }
380                    0xe: DataModImmOp::rsb({{
381                        Rs = resTemp = rotated_imm - Rn;
382                    }}, rsb);
383                }
384                0x1: WarnUnimpl::Data_processing_plain_binary_immediate();
385            }
386            0x1: WarnUnimpl::Branches_and_miscellaneous_control();
387        }
388        0x3: decode HTOPCODE_10_9 {
389            0x0: decode HTOPCODE_4 {
390                0x0: decode HTOPCODE_8 {
391                    0x0: WarnUnimpl::Store_single_data_item();
392                    0x1: WarnUnimpl::Advanced_SIMD_or_structure_load_store();
393                }
394                0x1: decode HTOPCODE_6_5 {
395                    0x0: WarnUnimpl::Load_byte_memory_hints();
396                    0x1: WarnUnimpl::Load_halfword_memory_hints();
397                    0x2: decode HTOPCODE_8 {
398                        0x0: decode HTRN {
399                            0xf: WarnUnimpl::ldr(); // literal A8-122
400                            default: decode HTOPCODE_7 {
401                                0x0: decode LTOPCODE_11_8 {
402                                    0x0: decode LTOPCODE_7_6 {
403                                        0x0: WarnUnimpl::ldr(); // register A8-122
404                                    }
405                                    0x9, 0xb, 0xc, 0xd, 0xf:
406                                        WarnUnimpl::ldr(); // immediate thumb A8-118
407                                    0xe: WarnUnimpl::ldrt(); // A8-176
408                                }
409                                0x1: WarnUnimpl::ldr(); // immediate thumb A8-118
410                            }
411                        }
412                    }
413                    0x3: WarnUnimpl::undefined();
414                }
415            }
416            0x1: decode HTOPCODE_8_7 {
417                0x2: WarnUnimpl::Multiply_multiply_accumulate_and_absolute_difference();
418                0x3: WarnUnimpl::Long_multiply_long_multiply_accumulate_and_divide();
419                default: WarnUnimpl::Data_processing_register();
420            }
421            default: decode HTOPCODE_9_8 {
422                0x2: decode LTOPCODE_4 {
423                    0x0: decode LTCOPROC {
424                        0xa, 0xb: WarnUnimpl::VFP_Inst();
425                        default: WarnUnimpl::cdp(); // cdp2
426                    }
427                    0x1: decode LTCOPROC {
428                        0xa, 0xb: WarnUnimpl::Core_to_extension_transfer();
429                        default: decode HTOPCODE_4 {
430                            0x0: WarnUnimpl::mcr(); // mcr2
431                            0x1: WarnUnimpl::mrc(); // mrc2
432                        }
433                    }
434                }
435                0x3: WarnUnimpl::Advanced_SIMD();
436                default: decode LTCOPROC {
437                    0xa, 0xb: decode HTOPCODE_9_4 {
438                        0x00: WarnUnimpl::undefined();
439                        0x04: WarnUnimpl::mcrr(); // mcrr2
440                        0x05: WarnUnimpl::mrrc(); // mrrc2
441                        0x02, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10,
442                        0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e:
443                            WarnUnimpl::stc(); // stc2
444                        0x03, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x11,
445                        0x13, 0x15, 0x17, 0x19, 0x1b, 0x1d, 0x1f:
446                            decode HTRN {
447                                0xf: WarnUnimpl::ldc(); // ldc2 (literal)
448                                default: WarnUnimpl::ldc(); // ldc2 (immediate)
449                            }
450                    }
451                    default: decode HTOPCODE_9_5 {
452                        0x00: WarnUnimpl::undefined();
453                        0x02: WarnUnimpl::SIMD_VFP_64_bit_core_extension_transfer();
454                        0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
455                        0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f:
456                            WarnUnimpl::Extension_register_load_store_instruction();
457                    }
458                }
459            }
460        }
461    }
462}
463