thumb.isa revision 7126:0f3f378d2b7f
113821Sgabeblack@google.com// -*- mode:c++ -*-
213821Sgabeblack@google.com
313821Sgabeblack@google.com// Copyright (c) 2010 ARM Limited
413821Sgabeblack@google.com// All rights reserved
513821Sgabeblack@google.com//
613821Sgabeblack@google.com// The license below extends only to copyright in the software and shall
713821Sgabeblack@google.com// not be construed as granting a license to any other intellectual
813821Sgabeblack@google.com// property including but not limited to intellectual property relating
913821Sgabeblack@google.com// to a hardware implementation of the functionality of the software
1013821Sgabeblack@google.com// licensed hereunder.  You may use the software subject to the license
1113821Sgabeblack@google.com// terms below provided that you ensure that this notice is replicated
1213821Sgabeblack@google.com// unmodified and in its entirety in all distributions of the software,
1313821Sgabeblack@google.com// modified or unmodified, in source code or in binary form.
1413821Sgabeblack@google.com//
1513821Sgabeblack@google.com// Copyright (c) 2009 The Regents of The University of Michigan
1613821Sgabeblack@google.com// All rights reserved.
1713821Sgabeblack@google.com//
1813821Sgabeblack@google.com// Redistribution and use in source and binary forms, with or without
1913821Sgabeblack@google.com// modification, are permitted provided that the following conditions are
2013821Sgabeblack@google.com// met: redistributions of source code must retain the above copyright
2113821Sgabeblack@google.com// notice, this list of conditions and the following disclaimer;
2213821Sgabeblack@google.com// redistributions in binary form must reproduce the above copyright
2313821Sgabeblack@google.com// notice, this list of conditions and the following disclaimer in the
2413821Sgabeblack@google.com// documentation and/or other materials provided with the distribution;
2513821Sgabeblack@google.com// neither the name of the copyright holders nor the names of its
2613821Sgabeblack@google.com// contributors may be used to endorse or promote products derived from
2713821Sgabeblack@google.com// this software without specific prior written permission.
2813821Sgabeblack@google.com//
2913821Sgabeblack@google.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3013821Sgabeblack@google.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3113821Sgabeblack@google.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3213821Sgabeblack@google.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3313821Sgabeblack@google.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3413821Sgabeblack@google.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3513821Sgabeblack@google.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3613821Sgabeblack@google.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3713821Sgabeblack@google.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3813821Sgabeblack@google.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3913821Sgabeblack@google.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4013821Sgabeblack@google.com//
4113821Sgabeblack@google.com// Authors: Gabe Black
4213821Sgabeblack@google.com
4313821Sgabeblack@google.com1: decode BIGTHUMB {
4413821Sgabeblack@google.com    // 16 bit thumb instructions.
4513821Sgabeblack@google.com    0: decode TOPCODE_15_13 {
4613821Sgabeblack@google.com        0x0, 0x1: decode TOPCODE_13_11 {
4713821Sgabeblack@google.com            0x0: WarnUnimpl::lsl(); //immediate
4813821Sgabeblack@google.com            0x1: WarnUnimpl::lsr(); //immediate
4913821Sgabeblack@google.com            0x2: WarnUnimpl::asr(); //immediate
5013821Sgabeblack@google.com            0x3: decode TOPCODE_10_9 {
5113821Sgabeblack@google.com                0x0: WarnUnimpl::add(); //register
5213821Sgabeblack@google.com                0x1: WarnUnimpl::sub(); //register
5313821Sgabeblack@google.com                0x2: WarnUnimpl::add(); //3 bit immediate
5413821Sgabeblack@google.com                0x3: WarnUnimpl::sub(); //3 bit immediate
5513821Sgabeblack@google.com            }
5613821Sgabeblack@google.com            0x4: WarnUnimpl::mov(); //immediate
5713821Sgabeblack@google.com            0x5: WarnUnimpl::cmp(); //immediate
5813821Sgabeblack@google.com            0x6: WarnUnimpl::add(); //8 bit immediate, thumb
5913821Sgabeblack@google.com            0x7: WarnUnimpl::sub(); //8 bit immediate, thumb
6013821Sgabeblack@google.com        }
6113821Sgabeblack@google.com        0x2: decode TOPCODE_12_10 {
6213821Sgabeblack@google.com            // Data processing
6313821Sgabeblack@google.com            0x0: decode TOPCODE_9_6 {
6413821Sgabeblack@google.com                0x0: WarnUnimpl::and(); //register
6513821Sgabeblack@google.com                0x1: WarnUnimpl::eor(); //register
6613823Sgabeblack@google.com                0x2: WarnUnimpl::lsl(); //register
6713823Sgabeblack@google.com                0x3: WarnUnimpl::lsr(); //register
6813821Sgabeblack@google.com                0x4: WarnUnimpl::asr(); //register
6913821Sgabeblack@google.com                0x5: WarnUnimpl::adc(); //register
7013821Sgabeblack@google.com                0x6: WarnUnimpl::sbc(); //register
7113821Sgabeblack@google.com                0x7: WarnUnimpl::ror(); //register
7213821Sgabeblack@google.com                0x8: WarnUnimpl::tst(); //register
7313821Sgabeblack@google.com                0x9: WarnUnimpl::rsb(); //immediate
7413821Sgabeblack@google.com                0xa: WarnUnimpl::cmp(); //register (high registers)
7513821Sgabeblack@google.com                0xb: WarnUnimpl::cmn(); //register
7613821Sgabeblack@google.com                0xc: WarnUnimpl::orr(); //register
7713821Sgabeblack@google.com                0xd: WarnUnimpl::mul();
7813821Sgabeblack@google.com                0xe: WarnUnimpl::bic(); //register
7913821Sgabeblack@google.com                0xf: WarnUnimpl::mvn(); //register
8013821Sgabeblack@google.com            }
8113821Sgabeblack@google.com            // Special data instructions and branch and exchange
8213821Sgabeblack@google.com            0x1: decode TOPCODE_9_6 {
8313821Sgabeblack@google.com                0x0: WarnUnimpl::add(); //register (low registers)
8413821Sgabeblack@google.com                0x1, 0x2, 0x3: WarnUnimpl::add(); //register (high registers)
8513821Sgabeblack@google.com                0x4: WarnUnimpl::unpredictable(); //?
8613821Sgabeblack@google.com                0x5, 0x6, 0x7: WarnUnimpl::cmp(); //register
8713821Sgabeblack@google.com                0x8: WarnUnimpl::mov(); //register (low registers)
8813821Sgabeblack@google.com                0x9, 0xa, 0xb: WarnUnimpl::mov(); //register (high registers)
8913821Sgabeblack@google.com                0xc, 0xd: WarnUnimpl::bx();
9013821Sgabeblack@google.com                0xe, 0xf: WarnUnimpl::blx(); //register
9113821Sgabeblack@google.com            }
9213821Sgabeblack@google.com            0x2, 0x3: Thumb16MemLit::thumb16MemLit();
9313821Sgabeblack@google.com            default: Thumb16MemReg::thumb16MemReg();
9413821Sgabeblack@google.com        }
9513821Sgabeblack@google.com        0x3, 0x4: Thumb16MemImm::thumb16MemImm();
9613821Sgabeblack@google.com        0x5: decode TOPCODE_12_11 {
9713821Sgabeblack@google.com            0x0: WarnUnimpl::adr();
9813821Sgabeblack@google.com            0x1: WarnUnimpl::add(); //sp, immediate
9913821Sgabeblack@google.com            0x2: decode TOPCODE_10_8 {
10013821Sgabeblack@google.com                0x0: decode TOPCODE_7 {
10113821Sgabeblack@google.com                    0x0: WarnUnimpl::add(); //sp, immediate
10213821Sgabeblack@google.com                    0x1: WarnUnimpl::sub(); //sp, immediate
10313821Sgabeblack@google.com                }
10413821Sgabeblack@google.com                0x1, 0x3: WarnUnimpl::cbz(); //cbnz too...
10513821Sgabeblack@google.com                0x2: decode TOPCODE_7_6 {
10613821Sgabeblack@google.com                    0x0: WarnUnimpl::sxth();
10713821Sgabeblack@google.com                    0x1: WarnUnimpl::sxtb();
10813821Sgabeblack@google.com                    0x2: WarnUnimpl::uxth();
10913821Sgabeblack@google.com                    0x3: WarnUnimpl::uxtb();
11013821Sgabeblack@google.com                }
11113823Sgabeblack@google.com                0x4, 0x5: WarnUnimpl::pop();
11213821Sgabeblack@google.com                0x6: decode TOPCODE_7_5 {
11313823Sgabeblack@google.com                    0x2: WarnUnimpl::setend();
11413823Sgabeblack@google.com                    0x3: WarnUnimpl::cps();
11513821Sgabeblack@google.com                }
11613821Sgabeblack@google.com            }
11713821Sgabeblack@google.com            0x3: decode TOPCODE_10_8 {
11813821Sgabeblack@google.com                0x1, 0x3: WarnUnimpl::cbz(); //cbnz too...
11913821Sgabeblack@google.com                0x2: decode TOPCODE_7_6 {
12013821Sgabeblack@google.com                    0x0: WarnUnimpl::rev();
12113821Sgabeblack@google.com                    0x1: WarnUnimpl::rev16();
12213821Sgabeblack@google.com                    0x3: WarnUnimpl::revsh();
12313821Sgabeblack@google.com                }
12413821Sgabeblack@google.com                0x4, 0x5: WarnUnimpl::pop();
12513821Sgabeblack@google.com                0x6: WarnUnimpl::bkpt();
12613821Sgabeblack@google.com                0x7: decode TOPCODE_3_0 {
12713821Sgabeblack@google.com                    0x0: WarnUnimpl::it();
12813821Sgabeblack@google.com                    default: decode TOPCODE_7_4 {
12913821Sgabeblack@google.com                        0x0: WarnUnimpl::nop();
13013821Sgabeblack@google.com                        0x1: WarnUnimpl::yield();
13113821Sgabeblack@google.com                        0x2: WarnUnimpl::wfe();
13213821Sgabeblack@google.com                        0x3: WarnUnimpl::wfi();
13313821Sgabeblack@google.com                        0x4: WarnUnimpl::sev();
13413821Sgabeblack@google.com                        default: WarnUnimpl::unallocated_hint();
13513821Sgabeblack@google.com                    }
13613821Sgabeblack@google.com                }
13713821Sgabeblack@google.com            }
13813821Sgabeblack@google.com        }
13913821Sgabeblack@google.com        0x6: decode TOPCODE_12_11 {
14013821Sgabeblack@google.com            0x0: WarnUnimpl::stm(); // also stmia, stmea
14113821Sgabeblack@google.com            0x1: WarnUnimpl::ldm(); // also ldmia, ldmea
14213821Sgabeblack@google.com            default: decode TOPCODE_11_8 {
14313821Sgabeblack@google.com                0xe: WarnUnimpl::undefined(); // permanently undefined
14413821Sgabeblack@google.com                0xf: WarnUnimpl::svc(); // formerly swi
14513821Sgabeblack@google.com                default: WarnUnimpl::b(); // conditional
14613821Sgabeblack@google.com            }
14713821Sgabeblack@google.com        }
14813821Sgabeblack@google.com        0x7: decode TOPCODE_12_11 {
14913821Sgabeblack@google.com            0x0: WarnUnimpl::b(); // unconditional
15013821Sgabeblack@google.com        }
15113821Sgabeblack@google.com    }
15213821Sgabeblack@google.com
15313821Sgabeblack@google.com    // 32 bit thumb instructions.
15413821Sgabeblack@google.com    1: decode HTOPCODE_12_11 {
15513821Sgabeblack@google.com        0x1: decode HTOPCODE_10_9 {
15613821Sgabeblack@google.com            0x0: decode HTOPCODE_8_6 {
15713821Sgabeblack@google.com                0x0, 0x6: decode HTOPCODE_4 {
15813821Sgabeblack@google.com                    0x0: WarnUnimpl::srs();
15913821Sgabeblack@google.com                    0x1: WarnUnimpl::rfe();
16013821Sgabeblack@google.com                }
16113821Sgabeblack@google.com                0x1: decode HTOPCODE_5_4 {
16213821Sgabeblack@google.com                    0x0: WarnUnimpl::strex();
16313821Sgabeblack@google.com                    0x1: WarnUnimpl::ldrex();
16413821Sgabeblack@google.com                    0x2: WarnUnimpl::strd(); // immediate
16513821Sgabeblack@google.com                    0x3: decode HTRN {
16613821Sgabeblack@google.com                        0xf: WarnUnimpl::ldrd(); // literal
16713821Sgabeblack@google.com                        default: WarnUnimpl::ldrd(); // immediate
16813821Sgabeblack@google.com                    }
16913821Sgabeblack@google.com                }
17013823Sgabeblack@google.com                0x2: decode HTOPCODE_4 {
17113821Sgabeblack@google.com                    0x0: WarnUnimpl::stm(); // stmia, stmea
17213823Sgabeblack@google.com                    0x1: decode HTRN {
17313821Sgabeblack@google.com                        0xd: WarnUnimpl::pop();
17413821Sgabeblack@google.com                        default: WarnUnimpl::ldm(); // ldmia, ldmfd
17513821Sgabeblack@google.com                    }
17613821Sgabeblack@google.com                }
17713821Sgabeblack@google.com                0x3: decode HTOPCODE_5_4 {
17813821Sgabeblack@google.com                    0x0: decode LTOPCODE_7_4 {
17913821Sgabeblack@google.com                        0x4: WarnUnimpl::strexb();
18013821Sgabeblack@google.com                        0x5: WarnUnimpl::strexh();
18113821Sgabeblack@google.com                        0x7: WarnUnimpl::strexd();
18213821Sgabeblack@google.com                    }
18313821Sgabeblack@google.com                    0x1: decode LTOPCODE_7_4 {
18413821Sgabeblack@google.com                        0x0: WarnUnimpl::tbb();
18513821Sgabeblack@google.com                        0x1: WarnUnimpl::tbh();
18613821Sgabeblack@google.com                        0x4: WarnUnimpl::ldrexb();
18713821Sgabeblack@google.com                        0x5: WarnUnimpl::ldrexh();
18813821Sgabeblack@google.com                        0x7: WarnUnimpl::ldrexd();
18913821Sgabeblack@google.com                    }
19013821Sgabeblack@google.com                    0x2: WarnUnimpl::strd(); // immediate
19113821Sgabeblack@google.com                    0x3: decode HTRN {
19213821Sgabeblack@google.com                        0xf: WarnUnimpl::ldrd(); // literal
19313821Sgabeblack@google.com                        default: WarnUnimpl::ldrd(); // immediate
19413821Sgabeblack@google.com                    }
19513821Sgabeblack@google.com                }
19613821Sgabeblack@google.com                0x4: decode HTOPCODE_4 {
19713821Sgabeblack@google.com                    0x0: decode HTRN {
19813821Sgabeblack@google.com                        0xd: WarnUnimpl::push();
19913821Sgabeblack@google.com                        default: WarnUnimpl::stmdb(); // stmfd
20013821Sgabeblack@google.com                    }
20113821Sgabeblack@google.com                    0x1: WarnUnimpl::ldmdb(); // ldmea
20213821Sgabeblack@google.com                }
20313821Sgabeblack@google.com                0x5, 0x7: decode HTOPCODE_4 {
20413821Sgabeblack@google.com                    0x0: WarnUnimpl::strd(); // immediate
20513821Sgabeblack@google.com                    0x1: decode HTRN {
20613821Sgabeblack@google.com                        0xf: WarnUnimpl::ldrd(); // literal
20713821Sgabeblack@google.com                        default: WarnUnimpl::ldrd(); // immediate
20813821Sgabeblack@google.com                    }
20913821Sgabeblack@google.com                }
21013821Sgabeblack@google.com            }
21113821Sgabeblack@google.com            0x1: decode HTOPCODE_8_5 {
21213821Sgabeblack@google.com                0x0: decode LTRD {
21313823Sgabeblack@google.com                    0xf: decode HTS {
21413821Sgabeblack@google.com                        0x1: WarnUnimpl::tst(); // register
21513823Sgabeblack@google.com                    }
21613821Sgabeblack@google.com                    default: WarnUnimpl::and(); // register
21713821Sgabeblack@google.com                }
21813821Sgabeblack@google.com                0x1: WarnUnimpl::bic(); // register
21913821Sgabeblack@google.com                0x2: decode HTRN {
22013821Sgabeblack@google.com                    0xf: WarnUnimpl::mov(); // register
22113821Sgabeblack@google.com                    default: WarnUnimpl::orr(); // register
22213821Sgabeblack@google.com                }
22313823Sgabeblack@google.com                0x3: decode HTRN {
22413821Sgabeblack@google.com                    0xf: WarnUnimpl::mvn(); // register
22513823Sgabeblack@google.com                    default: WarnUnimpl::orn(); // register
22613821Sgabeblack@google.com                }
22713821Sgabeblack@google.com                0x4: decode LTRD {
22813821Sgabeblack@google.com                    0xf: decode HTS {
22913821Sgabeblack@google.com                        0x1: WarnUnimpl::teq(); // register
23013821Sgabeblack@google.com                    }
23113821Sgabeblack@google.com                    default: WarnUnimpl::eor(); // register
23213821Sgabeblack@google.com                }
23313821Sgabeblack@google.com                0x6: WarnUnimpl::pkh();
23413821Sgabeblack@google.com                0x8: decode LTRD {
23513821Sgabeblack@google.com                    0xf: decode HTS {
23613821Sgabeblack@google.com                        0x1: WarnUnimpl::cmn(); // register
23713821Sgabeblack@google.com                    }
23813821Sgabeblack@google.com                    default: WarnUnimpl::add(); // register
23913821Sgabeblack@google.com                }
24013821Sgabeblack@google.com                0xa: WarnUnimpl::adc(); // register
24113821Sgabeblack@google.com                0xb: WarnUnimpl::sbc(); // register
24213821Sgabeblack@google.com                0xd: decode LTRD {
24313821Sgabeblack@google.com                    0xf: decode HTS {
24413821Sgabeblack@google.com                        0x1: WarnUnimpl::cmp(); // register
24513821Sgabeblack@google.com                    }
24613821Sgabeblack@google.com                    default: WarnUnimpl::sub(); // register
24713821Sgabeblack@google.com                }
24813821Sgabeblack@google.com                0xe: WarnUnimpl::rsb(); // register
24913821Sgabeblack@google.com            }
25013821Sgabeblack@google.com            default: decode HTOPCODE_9_8 {
25113821Sgabeblack@google.com                0x2: decode LTOPCODE_4 {
25213821Sgabeblack@google.com                    0x0: decode LTCOPROC {
25313821Sgabeblack@google.com                        0xa, 0xb: decode OPCODE_23_20 {
25413821Sgabeblack@google.com##include "vfp.isa"
25513821Sgabeblack@google.com                        }
25613821Sgabeblack@google.com                        default: WarnUnimpl::cdp(); // cdp2
25713821Sgabeblack@google.com                    }
25813821Sgabeblack@google.com                    0x1: decode LTCOPROC {
25913821Sgabeblack@google.com                        0xa, 0xb: WarnUnimpl::Core_to_extension_transfer();
26013821Sgabeblack@google.com                        default: decode HTOPCODE_4 {
26113821Sgabeblack@google.com                            0x0: WarnUnimpl::mcr(); // mcr2
26213821Sgabeblack@google.com                            0x1: WarnUnimpl::mrc(); // mrc2
26313821Sgabeblack@google.com                        }
26413821Sgabeblack@google.com                    }
26513821Sgabeblack@google.com                }
26613821Sgabeblack@google.com                0x3: WarnUnimpl::Advanced_SIMD();
26713821Sgabeblack@google.com                default: decode LTCOPROC {
26813821Sgabeblack@google.com                    0xa, 0xb: decode HTOPCODE_9_4 {
26913821Sgabeblack@google.com                        0x00: WarnUnimpl::undefined();
27013821Sgabeblack@google.com                        0x04: WarnUnimpl::mcrr(); // mcrr2
27113821Sgabeblack@google.com                        0x05: WarnUnimpl::mrrc(); // mrrc2
27213821Sgabeblack@google.com                        0x02, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10,
27313821Sgabeblack@google.com                        0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e:
27413821Sgabeblack@google.com                            WarnUnimpl::stc(); // stc2
27513821Sgabeblack@google.com                        0x03, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x11,
27613821Sgabeblack@google.com                        0x13, 0x15, 0x17, 0x19, 0x1b, 0x1d, 0x1f:
27713821Sgabeblack@google.com                            decode HTRN {
27813821Sgabeblack@google.com                                0xf: WarnUnimpl::ldc(); // ldc2 (literal)
27913821Sgabeblack@google.com                                default: WarnUnimpl::ldc(); // ldc2 (immediate)
28013821Sgabeblack@google.com                            }
28113821Sgabeblack@google.com                    }
28213821Sgabeblack@google.com                    default: decode HTOPCODE_9_5 {
28313821Sgabeblack@google.com                        0x00: WarnUnimpl::undefined();
28413821Sgabeblack@google.com                        0x02: WarnUnimpl::SIMD_VFP_64_bit_core_extension_transfer();
28513821Sgabeblack@google.com                        0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
28613821Sgabeblack@google.com                        0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f:
28713821Sgabeblack@google.com                            WarnUnimpl::Extension_register_load_store_instruction();
28813821Sgabeblack@google.com                    }
28913821Sgabeblack@google.com                }
29013821Sgabeblack@google.com            }
29113821Sgabeblack@google.com        }
29213821Sgabeblack@google.com        0x2: decode LTOPCODE_15 {
29313821Sgabeblack@google.com            0x0: decode HTOPCODE_9 {
29413821Sgabeblack@google.com                0x0: decode HTOPCODE_8_5 {
29513821Sgabeblack@google.com                    0x0: decode LTRD {
29613821Sgabeblack@google.com                        0xf: decode HTS {
29713821Sgabeblack@google.com                            0x1: DataModImmOp::tst({{
29813821Sgabeblack@google.com                                resTemp = Rn & rotated_imm;
29913821Sgabeblack@google.com                            }});
30013821Sgabeblack@google.com                        }
30113821Sgabeblack@google.com                        default: DataModImmOp::and({{
30213821Sgabeblack@google.com                            Rs = resTemp = Rn & rotated_imm;
30313821Sgabeblack@google.com                        }});
30413821Sgabeblack@google.com                    }
30513821Sgabeblack@google.com                    0x1: DataModImmOp::bic({{
30613821Sgabeblack@google.com                        Rs = resTemp = Rn & ~rotated_imm;
30713821Sgabeblack@google.com                    }});
30813821Sgabeblack@google.com                    0x2: decode HTRN {
30913821Sgabeblack@google.com                        0xf: DataModImmOp::mov({{
31013821Sgabeblack@google.com                            Rs = resTemp = rotated_imm;
31113821Sgabeblack@google.com                        }});
31213821Sgabeblack@google.com                        default: DataModImmOp::orr({{
31313821Sgabeblack@google.com                            Rs = resTemp = Rn | rotated_imm;
31413821Sgabeblack@google.com                        }});
31513821Sgabeblack@google.com                    }
31613821Sgabeblack@google.com                    0x3: decode HTRN {
31713821Sgabeblack@google.com                        0xf: DataModImmOp::mvn({{
31813821Sgabeblack@google.com                            Rs = resTemp = ~rotated_imm;
31913823Sgabeblack@google.com                        }});
32013821Sgabeblack@google.com                        default: DataModImmOp::orn({{
32113823Sgabeblack@google.com                            Rs = resTemp = Rn | ~rotated_imm;
32213821Sgabeblack@google.com                        }});
32313821Sgabeblack@google.com                    }
32413821Sgabeblack@google.com                    0x4: decode LTRD {
32513821Sgabeblack@google.com                        0xf: decode HTS {
32613821Sgabeblack@google.com                            0x1: DataModImmOp::teq({{
32713821Sgabeblack@google.com                                resTemp = Rn ^ rotated_imm;
32813821Sgabeblack@google.com                            }});
32913823Sgabeblack@google.com                        }
33013821Sgabeblack@google.com                        default: DataModImmOp::eor({{
33113823Sgabeblack@google.com                            Rs = resTemp = Rn ^ rotated_imm;
33213821Sgabeblack@google.com                        }});
33313821Sgabeblack@google.com                    }
33413821Sgabeblack@google.com                    0x8: decode LTRD {
33513821Sgabeblack@google.com                        0xf: decode HTS {
33613823Sgabeblack@google.com                            0x1: DataModImmOp::cmn({{
33713821Sgabeblack@google.com                                resTemp = Rn + rotated_imm;
33813823Sgabeblack@google.com                            }}, add);
33913821Sgabeblack@google.com                        }
34013821Sgabeblack@google.com                        default: DataModImmOp::add({{
34113821Sgabeblack@google.com                            Rs = resTemp = Rn + rotated_imm;
34213821Sgabeblack@google.com                        }}, add);
34313821Sgabeblack@google.com                    }
34413821Sgabeblack@google.com                    0xa: DataModImmOp::adc({{
34513821Sgabeblack@google.com                        Rs = resTemp = Rn + rotated_imm + CondCodes<29:>;
34613821Sgabeblack@google.com                    }}, add);
34713821Sgabeblack@google.com                    0xb: DataModImmOp::sbc({{
34813821Sgabeblack@google.com                        Rs = resTemp = Rn - rotated_imm - !CondCodes<29:>;
34913821Sgabeblack@google.com                    }}, sub);
35013821Sgabeblack@google.com                    0xd: decode LTRD {
35113821Sgabeblack@google.com                        0xf: decode HTS {
35213821Sgabeblack@google.com                            0x1: DataModImmOp::cmp({{
35313821Sgabeblack@google.com                                resTemp = Rn - rotated_imm;
35413821Sgabeblack@google.com                            }}, sub);
35513821Sgabeblack@google.com                        }
35613821Sgabeblack@google.com                        default: DataModImmOp::sub({{
35713821Sgabeblack@google.com                            Rs = resTemp = Rn - rotated_imm;
35813821Sgabeblack@google.com                        }}, sub);
35913821Sgabeblack@google.com                    }
36013823Sgabeblack@google.com                    0xe: DataModImmOp::rsb({{
36113821Sgabeblack@google.com                        Rs = resTemp = rotated_imm - Rn;
36213823Sgabeblack@google.com                    }}, rsb);
36313821Sgabeblack@google.com                }
36413821Sgabeblack@google.com                0x1: WarnUnimpl::Data_processing_plain_binary_immediate();
36513821Sgabeblack@google.com            }
36613821Sgabeblack@google.com            0x1: WarnUnimpl::Branches_and_miscellaneous_control();
36713821Sgabeblack@google.com        }
36813821Sgabeblack@google.com        0x3: decode HTOPCODE_10_9 {
36913821Sgabeblack@google.com            0x0: decode HTOPCODE_4 {
37013821Sgabeblack@google.com                0x0: decode HTOPCODE_8 {
37113821Sgabeblack@google.com                    0x0: Thumb32StoreSingle::thumb32StoreSingle();
37213821Sgabeblack@google.com                    0x1: WarnUnimpl::Advanced_SIMD_or_structure_load_store();
37313821Sgabeblack@google.com                }
37413821Sgabeblack@google.com                0x1: decode HTOPCODE_6_5 {
37513821Sgabeblack@google.com                    0x0: WarnUnimpl::Load_byte_memory_hints();
37613821Sgabeblack@google.com                    0x1: WarnUnimpl::Load_halfword_memory_hints();
37713821Sgabeblack@google.com                    0x2: Thumb32LoadWord::thumb32LoadWord();
37813821Sgabeblack@google.com                    0x3: WarnUnimpl::undefined();
37913821Sgabeblack@google.com                }
38013821Sgabeblack@google.com            }
38113821Sgabeblack@google.com            0x1: decode HTOPCODE_8_7 {
38213821Sgabeblack@google.com                0x2: WarnUnimpl::Multiply_multiply_accumulate_and_absolute_difference();
38313823Sgabeblack@google.com                0x3: WarnUnimpl::Long_multiply_long_multiply_accumulate_and_divide();
38413821Sgabeblack@google.com                default: WarnUnimpl::Data_processing_register();
38513823Sgabeblack@google.com            }
38613821Sgabeblack@google.com            default: decode HTOPCODE_9_8 {
38713821Sgabeblack@google.com                0x2: decode LTOPCODE_4 {
38813821Sgabeblack@google.com                    0x0: decode LTCOPROC {
38913821Sgabeblack@google.com                        0xa, 0xb: WarnUnimpl::VFP_Inst();
39013821Sgabeblack@google.com                        default: WarnUnimpl::cdp(); // cdp2
39113821Sgabeblack@google.com                    }
39213821Sgabeblack@google.com                    0x1: decode LTCOPROC {
39313821Sgabeblack@google.com                        0xa, 0xb: WarnUnimpl::Core_to_extension_transfer();
39413821Sgabeblack@google.com                        default: decode HTOPCODE_4 {
39513821Sgabeblack@google.com                            0x0: WarnUnimpl::mcr(); // mcr2
39613823Sgabeblack@google.com                            0x1: WarnUnimpl::mrc(); // mrc2
39713823Sgabeblack@google.com                        }
39813821Sgabeblack@google.com                    }
39913823Sgabeblack@google.com                }
40013821Sgabeblack@google.com                0x3: WarnUnimpl::Advanced_SIMD();
40113821Sgabeblack@google.com                default: decode LTCOPROC {
40213821Sgabeblack@google.com                    0xa, 0xb: decode HTOPCODE_9_4 {
40313821Sgabeblack@google.com                        0x00: WarnUnimpl::undefined();
40413821Sgabeblack@google.com                        0x04: WarnUnimpl::mcrr(); // mcrr2
40513821Sgabeblack@google.com                        0x05: WarnUnimpl::mrrc(); // mrrc2
40613821Sgabeblack@google.com                        0x02, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10,
40713821Sgabeblack@google.com                        0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e:
40813823Sgabeblack@google.com                            WarnUnimpl::stc(); // stc2
40913821Sgabeblack@google.com                        0x03, 0x07, 0x09, 0x0b, 0x0d, 0x0f, 0x11,
41013823Sgabeblack@google.com                        0x13, 0x15, 0x17, 0x19, 0x1b, 0x1d, 0x1f:
41113821Sgabeblack@google.com                            decode HTRN {
41213821Sgabeblack@google.com                                0xf: WarnUnimpl::ldc(); // ldc2 (literal)
41313821Sgabeblack@google.com                                default: WarnUnimpl::ldc(); // ldc2 (immediate)
41413821Sgabeblack@google.com                            }
41513821Sgabeblack@google.com                    }
41613821Sgabeblack@google.com                    default: decode HTOPCODE_9_5 {
41713821Sgabeblack@google.com                        0x00: WarnUnimpl::undefined();
41813821Sgabeblack@google.com                        0x02: WarnUnimpl::SIMD_VFP_64_bit_core_extension_transfer();
41913821Sgabeblack@google.com                        0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
42013823Sgabeblack@google.com                        0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f:
42113821Sgabeblack@google.com                            WarnUnimpl::Extension_register_load_store_instruction();
42213823Sgabeblack@google.com                    }
42313821Sgabeblack@google.com                }
42413821Sgabeblack@google.com            }
42513821Sgabeblack@google.com        }
42613821Sgabeblack@google.com    }
42713821Sgabeblack@google.com}
42813821Sgabeblack@google.com