// Copyright 2016, VIXL authors
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//   * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//   * Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//   * Neither the name of ARM Limited nor the names of its contributors may be
//     used to endorse or promote products derived from this software without
//     specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// Data type description shared by test case descriptions.

{
  // List of operand types. They describe what can be passed to the assembler to
  // encode an instruction.
  //
  //   - name: Identifier for the operand. It allows test case descriptions to
  //           refer to it.
  //   - type: C++ type used by VIXL to represent this operand.
  //   - variants: List of variant this operand can take.
  //   - default: Which variant to use by default.
  "operands": [
    {
      "identifier": "Condition",
      "type": "Condition",
      "variants": [
        "eq",
        "ne",
        "cs",
        "cc",
        "mi",
        "pl",
        "vs",
        "vc",
        "hi",
        "ls",
        "ge",
        "lt",
        "gt",
        "le",
        "al"
      ],
      "default": "al"
    },
    {
      "identifier": "Always",
      "type": "Condition",
      "variants": [
        "al"
      ],
      "default": "al"
    },
    {
      "identifier": "NotAlways",
      "type": "Condition",
      "variants": [
        "eq",
        "ne",
        "cs",
        "cc",
        "mi",
        "pl",
        "vs",
        "vc",
        "hi",
        "ls",
        "ge",
        "lt",
        "gt",
        "le"
      ],
      "default": "eq"
    },
    {
      "identifier": "AllRegisters",
      "type": "Register",
      "variants": [
        "r0",
        "r1",
        "r2",
        "r3",
        "r4",
        "r5",
        "r6",
        "r7",
        "r8",
        "r9",
        "r10",
        "r11",
        "r12",
        "r13",
        "r14",
        "r15"
      ],
      "default": "r0"
    },
    {
      "identifier": "AllRegistersButPC",
      "type": "Register",
      "variants": [
        "r0",
        "r1",
        "r2",
        "r3",
        "r4",
        "r5",
        "r6",
        "r7",
        "r8",
        "r9",
        "r10",
        "r11",
        "r12",
        "r13",
        "r14"
      ],
      "default": "r0"
    },
    {
      "identifier": "LowRegisters",
      "type": "Register",
      "variants": [
        "r0",
        "r1",
        "r2",
        "r3",
        "r4",
        "r5",
        "r6",
        "r7"
      ],
      "default": "r0"
    },
    {
      "identifier": "RegisterPC",
      "type": "Register",
      "variants": [
        "pc"
      ],
      "default": "pc"
    },
    {
      "identifier": "RegisterSP",
      "type": "Register",
      "variants": [
        "sp"
      ],
      "default": "sp"
    },
    {
      "identifier": "A32ModifiedImmediate",
      "type": "uint32_t",
      "variants": [
        "0x00000000",
        "0x000000ff",
        "0xc000003f",
        "0xf000000f",
        "0xfc000003",
        "0xff000000",
        "0x3fc00000",
        "0x0ff00000",
        "0x03fc0000",
        "0x00ff0000",
        "0x003fc000",
        "0x000ff000",
        "0x0003fc00",
        "0x0000ff00",
        "0x00003fc0",
        "0x00000ff0",
        "0x000003fc",
        "0x000000ab",
        "0xc000002a",
        "0xb000000a",
        "0xac000002",
        "0xab000000",
        "0x2ac00000",
        "0x0ab00000",
        "0x02ac0000",
        "0x00ab0000",
        "0x002ac000",
        "0x000ab000",
        "0x0002ac00",
        "0x0000ab00",
        "0x00002ac0",
        "0x00000ab0",
        "0x000002ac"
      ],
      "default": "0x000000ab"
    },
    {
      "identifier": "T32ModifiedImmediate",
      "type": "uint32_t",
      "variants": [
        "0x000001fe",
        "0x000003fc",
        "0x000007f8",
        "0x00000ff0",
        "0x00001fe0",
        "0x00003fc0",
        "0x00007f80",
        "0x0000ff00",
        "0x0001fe00",
        "0x0003fc00",
        "0x0007f800",
        "0x000ff000",
        "0x001fe000",
        "0x003fc000",
        "0x007f8000",
        "0x00ff0000",
        "0x01fe0000",
        "0x03fc0000",
        "0x07f80000",
        "0x0ff00000",
        "0x1fe00000",
        "0x3fc00000",
        "0x7f800000",
        "0xff000000",
        "0x000000ff",
        "0x00ff00ff",
        "0xff00ff00",
        "0xffffffff",
        "0x00000156",
        "0x000002ac",
        "0x00000558",
        "0x00000ab0",
        "0x00001560",
        "0x00002ac0",
        "0x00005580",
        "0x0000ab00",
        "0x00015600",
        "0x0002ac00",
        "0x00055800",
        "0x000ab000",
        "0x00156000",
        "0x002ac000",
        "0x00558000",
        "0x00ab0000",
        "0x01560000",
        "0x02ac0000",
        "0x05580000",
        "0x0ab00000",
        "0x15600000",
        "0x2ac00000",
        "0x55800000",
        "0xab000000",
        "0x000000ab",
        "0x00ab00ab",
        "0xab00ab00",
        "0xabababab"
      ],
      "default": "0xabababab"
    },
    {
      "identifier": "Imm16",
      "type": "uint32_t",
      "variants": [
        "0x0000",
        "0x0001",
        "0x0002",
        "0x0020",
        "0x007d",
        "0x007e",
        "0x007f",
        "0x7ffd",
        "0x7ffe",
        "0x7fff",
        "0x3333",
        "0x5555",
        "0xaaaa",
        "0xcccc",
        "0x8000",
        "0x8001",
        "0x8002",
        "0x8003",
        "0xff80",
        "0xff81",
        "0xff82",
        "0xff83",
        "0xffe0",
        "0xfffd",
        "0xfffe",
        "0xffff"
      ],
      "default": "0x0"
    },
    {
      "identifier": "Imm8x4",
      "type": "uint32_t",
      "variants": [
        "0x0",
        "0x4",
        "0x8",
        "0xc",
        "0x10",
        "0x14",
        "0x18",
        "0x1c",
        "0x20",
        "0x24",
        "0x28",
        "0x2c",
        "0x30",
        "0x34",
        "0x38",
        "0x3c",
        "0x40",
        "0x44",
        "0x48",
        "0x4c",
        "0x50",
        "0x54",
        "0x58",
        "0x5c",
        "0x60",
        "0x64",
        "0x68",
        "0x6c",
        "0x70",
        "0x74",
        "0x78",
        "0x7c",
        "0x80",
        "0x84",
        "0x88",
        "0x8c",
        "0x90",
        "0x94",
        "0x98",
        "0x9c",
        "0xa0",
        "0xa4",
        "0xa8",
        "0xac",
        "0xb0",
        "0xb4",
        "0xb8",
        "0xbc",
        "0xc0",
        "0xc4",
        "0xc8",
        "0xcc",
        "0xd0",
        "0xd4",
        "0xd8",
        "0xdc",
        "0xe0",
        "0xe4",
        "0xe8",
        "0xec",
        "0xf0",
        "0xf4",
        "0xf8",
        "0xfc",
        "0x100",
        "0x104",
        "0x108",
        "0x10c",
        "0x110",
        "0x114",
        "0x118",
        "0x11c",
        "0x120",
        "0x124",
        "0x128",
        "0x12c",
        "0x130",
        "0x134",
        "0x138",
        "0x13c",
        "0x140",
        "0x144",
        "0x148",
        "0x14c",
        "0x150",
        "0x154",
        "0x158",
        "0x15c",
        "0x160",
        "0x164",
        "0x168",
        "0x16c",
        "0x170",
        "0x174",
        "0x178",
        "0x17c",
        "0x180",
        "0x184",
        "0x188",
        "0x18c",
        "0x190",
        "0x194",
        "0x198",
        "0x19c",
        "0x1a0",
        "0x1a4",
        "0x1a8",
        "0x1ac",
        "0x1b0",
        "0x1b4",
        "0x1b8",
        "0x1bc",
        "0x1c0",
        "0x1c4",
        "0x1c8",
        "0x1cc",
        "0x1d0",
        "0x1d4",
        "0x1d8",
        "0x1dc",
        "0x1e0",
        "0x1e4",
        "0x1e8",
        "0x1ec",
        "0x1f0",
        "0x1f4",
        "0x1f8",
        "0x1fc",
        "0x200",
        "0x204",
        "0x208",
        "0x20c",
        "0x210",
        "0x214",
        "0x218",
        "0x21c",
        "0x220",
        "0x224",
        "0x228",
        "0x22c",
        "0x230",
        "0x234",
        "0x238",
        "0x23c",
        "0x240",
        "0x244",
        "0x248",
        "0x24c",
        "0x250",
        "0x254",
        "0x258",
        "0x25c",
        "0x260",
        "0x264",
        "0x268",
        "0x26c",
        "0x270",
        "0x274",
        "0x278",
        "0x27c",
        "0x280",
        "0x284",
        "0x288",
        "0x28c",
        "0x290",
        "0x294",
        "0x298",
        "0x29c",
        "0x2a0",
        "0x2a4",
        "0x2a8",
        "0x2ac",
        "0x2b0",
        "0x2b4",
        "0x2b8",
        "0x2bc",
        "0x2c0",
        "0x2c4",
        "0x2c8",
        "0x2cc",
        "0x2d0",
        "0x2d4",
        "0x2d8",
        "0x2dc",
        "0x2e0",
        "0x2e4",
        "0x2e8",
        "0x2ec",
        "0x2f0",
        "0x2f4",
        "0x2f8",
        "0x2fc",
        "0x300",
        "0x304",
        "0x308",
        "0x30c",
        "0x310",
        "0x314",
        "0x318",
        "0x31c",
        "0x320",
        "0x324",
        "0x328",
        "0x32c",
        "0x330",
        "0x334",
        "0x338",
        "0x33c",
        "0x340",
        "0x344",
        "0x348",
        "0x34c",
        "0x350",
        "0x354",
        "0x358",
        "0x35c",
        "0x360",
        "0x364",
        "0x368",
        "0x36c",
        "0x370",
        "0x374",
        "0x378",
        "0x37c",
        "0x380",
        "0x384",
        "0x388",
        "0x38c",
        "0x390",
        "0x394",
        "0x398",
        "0x39c",
        "0x3a0",
        "0x3a4",
        "0x3a8",
        "0x3ac",
        "0x3b0",
        "0x3b4",
        "0x3b8",
        "0x3bc",
        "0x3c0",
        "0x3c4",
        "0x3c8",
        "0x3cc",
        "0x3d0",
        "0x3d4",
        "0x3d8",
        "0x3dc",
        "0x3e0",
        "0x3e4",
        "0x3e8",
        "0x3ec",
        "0x3f0",
        "0x3f4",
        "0x3f8",
        "0x3fc"
      ],
      "default": "0x3d4"
    },
    {
      "identifier": "Imm7x4",
      "type": "uint32_t",
      "variants": [
        "0x0",
        "0x4",
        "0x8",
        "0xc",
        "0x10",
        "0x14",
        "0x18",
        "0x1c",
        "0x20",
        "0x24",
        "0x28",
        "0x2c",
        "0x30",
        "0x34",
        "0x38",
        "0x3c",
        "0x40",
        "0x44",
        "0x48",
        "0x4c",
        "0x50",
        "0x54",
        "0x58",
        "0x5c",
        "0x60",
        "0x64",
        "0x68",
        "0x6c",
        "0x70",
        "0x74",
        "0x78",
        "0x7c",
        "0x80",
        "0x84",
        "0x88",
        "0x8c",
        "0x90",
        "0x94",
        "0x98",
        "0x9c",
        "0xa0",
        "0xa4",
        "0xa8",
        "0xac",
        "0xb0",
        "0xb4",
        "0xb8",
        "0xbc",
        "0xc0",
        "0xc4",
        "0xc8",
        "0xcc",
        "0xd0",
        "0xd4",
        "0xd8",
        "0xdc",
        "0xe0",
        "0xe4",
        "0xe8",
        "0xec",
        "0xf0",
        "0xf4",
        "0xf8",
        "0xfc",
        "0x100",
        "0x104",
        "0x108",
        "0x10c",
        "0x110",
        "0x114",
        "0x118",
        "0x11c",
        "0x120",
        "0x124",
        "0x128",
        "0x12c",
        "0x130",
        "0x134",
        "0x138",
        "0x13c",
        "0x140",
        "0x144",
        "0x148",
        "0x14c",
        "0x150",
        "0x154",
        "0x158",
        "0x15c",
        "0x160",
        "0x164",
        "0x168",
        "0x16c",
        "0x170",
        "0x174",
        "0x178",
        "0x17c",
        "0x180",
        "0x184",
        "0x188",
        "0x18c",
        "0x190",
        "0x194",
        "0x198",
        "0x19c",
        "0x1a0",
        "0x1a4",
        "0x1a8",
        "0x1ac",
        "0x1b0",
        "0x1b4",
        "0x1b8",
        "0x1bc",
        "0x1c0",
        "0x1c4",
        "0x1c8",
        "0x1cc",
        "0x1d0",
        "0x1d4",
        "0x1d8",
        "0x1dc",
        "0x1e0",
        "0x1e4",
        "0x1e8",
        "0x1ec",
        "0x1f0",
        "0x1f4",
        "0x1f8",
        "0x1fc"
      ],
      "default": "0x1d4"
    },
    {
      "identifier": "Shift",
      "type": "ShiftType",
      "variants": [
        "LSL",
        "LSR",
        "ASR",
        "ROR"
      ],
      "default": "LSL"
    },
    {
      "identifier": "Shift1To31",
      "type": "ShiftType",
      "variants": [
        "LSL",
        "ROR"
      ],
      "default": "LSL"
    },
    {
      "identifier": "Shift1To32",
      "type": "ShiftType",
      "variants": [
        "LSR",
        "ASR"
      ],
      "default": "LSR"
    },
    {
      "identifier": "ShiftROR",
      "type": "ShiftType",
      "variants": [
        "ROR"
      ],
      "default": "ROR"
    },
    {
      "identifier": "ShiftAmount1To31",
      "type": "uint32_t",
      "variants": [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12",
        "13",
        "14",
        "15",
        "16",
        "17",
        "18",
        "19",
        "20",
        "21",
        "22",
        "23",
        "24",
        "25",
        "26",
        "27",
        "28",
        "29",
        "30",
        "31"
      ],
      "default": "1"
    },
    {
      "identifier": "ShiftAmount1To32",
      "type": "uint32_t",
      "variants": [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12",
        "13",
        "14",
        "15",
        "16",
        "17",
        "18",
        "19",
        "20",
        "21",
        "22",
        "23",
        "24",
        "25",
        "26",
        "27",
        "28",
        "29",
        "30",
        "31",
        "32"
      ],
      "default": "1"
    },
    // Some instructions have a rotation amount restricted to "0",
    // "8", "16" and "24".
    {
      "identifier": "ShiftRotationAmountX8",
      "type": "uint32_t",
      "variants": [
        "0",
        "8",
        "16",
        "24"
      ],
      "default": "0"
    },
    {
      "identifier": "Sign",
      "type": "Sign",
      "variants": [
        "plus",
        "minus"
      ],
      "default": "plus"
    },
    {
      "identifier": "OffsetLowerThan256",
      "type": "int32_t",
      "variants": [
        "0",
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12",
        "13",
        "14",
        "15",
        "16",
        "17",
        "18",
        "19",
        "20",
        "21",
        "22",
        "23",
        "24",
        "25",
        "26",
        "27",
        "28",
        "29",
        "30",
        "31",
        "32",
        "33",
        "34",
        "35",
        "36",
        "37",
        "38",
        "39",
        "40",
        "41",
        "42",
        "43",
        "44",
        "45",
        "46",
        "47",
        "48",
        "49",
        "50",
        "51",
        "52",
        "53",
        "54",
        "55",
        "56",
        "57",
        "58",
        "59",
        "60",
        "61",
        "62",
        "63",
        "64",
        "65",
        "66",
        "67",
        "68",
        "69",
        "70",
        "71",
        "72",
        "73",
        "74",
        "75",
        "76",
        "77",
        "78",
        "79",
        "80",
        "81",
        "82",
        "83",
        "84",
        "85",
        "86",
        "87",
        "88",
        "89",
        "90",
        "91",
        "92",
        "93",
        "94",
        "95",
        "96",
        "97",
        "98",
        "99",
        "100",
        "101",
        "102",
        "103",
        "104",
        "105",
        "106",
        "107",
        "108",
        "109",
        "110",
        "111",
        "112",
        "113",
        "114",
        "115",
        "116",
        "117",
        "118",
        "119",
        "120",
        "121",
        "122",
        "123",
        "124",
        "125",
        "126",
        "127",
        "128",
        "129",
        "130",
        "131",
        "132",
        "133",
        "134",
        "135",
        "136",
        "137",
        "138",
        "139",
        "140",
        "141",
        "142",
        "143",
        "144",
        "145",
        "146",
        "147",
        "148",
        "149",
        "150",
        "151",
        "152",
        "153",
        "154",
        "155",
        "156",
        "157",
        "158",
        "159",
        "160",
        "161",
        "162",
        "163",
        "164",
        "165",
        "166",
        "167",
        "168",
        "169",
        "170",
        "171",
        "172",
        "173",
        "174",
        "175",
        "176",
        "177",
        "178",
        "179",
        "180",
        "181",
        "182",
        "183",
        "184",
        "185",
        "186",
        "187",
        "188",
        "189",
        "190",
        "191",
        "192",
        "193",
        "194",
        "195",
        "196",
        "197",
        "198",
        "199",
        "200",
        "201",
        "202",
        "203",
        "204",
        "205",
        "206",
        "207",
        "208",
        "209",
        "210",
        "211",
        "212",
        "213",
        "214",
        "215",
        "216",
        "217",
        "218",
        "219",
        "220",
        "221",
        "222",
        "223",
        "224",
        "225",
        "226",
        "227",
        "228",
        "229",
        "230",
        "231",
        "232",
        "233",
        "234",
        "235",
        "236",
        "237",
        "238",
        "239",
        "240",
        "241",
        "242",
        "243",
        "244",
        "245",
        "246",
        "247",
        "248",
        "249",
        "250",
        "251",
        "252",
        "253",
        "254",
        "255"
      ],
      "default": "0"
    },
    {
      "identifier": "OffsetLowerThan4096",
      "type": "int32_t",
      // These variants are a random sample of 500 integers out of all integers
      // from 1 to 4094 (included). We've added 0 and 4095 explicitely.
      "variants": [
        "0",
        "4095",
        "2",
        "4",
        "19",
        "22",
        "47",
        "48",
        "53",
        "55",
        "57",
        "70",
        "72",
        "83",
        "98",
        "106",
        "132",
        "136",
        "138",
        "180",
        "188",
        "192",
        "198",
        "199",
        "200",
        "210",
        "213",
        "216",
        "227",
        "233",
        "251",
        "263",
        "264",
        "270",
        "282",
        "306",
        "322",
        "342",
        "348",
        "358",
        "362",
        "365",
        "371",
        "386",
        "398",
        "421",
        "429",
        "441",
        "459",
        "462",
        "470",
        "478",
        "479",
        "481",
        "484",
        "490",
        "496",
        "510",
        "513",
        "517",
        "523",
        "524",
        "525",
        "542",
        "547",
        "565",
        "580",
        "582",
        "595",
        "601",
        "606",
        "612",
        "618",
        "624",
        "662",
        "663",
        "669",
        "670",
        "672",
        "674",
        "678",
        "679",
        "685",
        "688",
        "689",
        "704",
        "712",
        "719",
        "732",
        "766",
        "770",
        "774",
        "778",
        "783",
        "791",
        "794",
        "796",
        "797",
        "806",
        "811",
        "828",
        "831",
        "837",
        "844",
        "850",
        "871",
        "872",
        "875",
        "893",
        "915",
        "932",
        "955",
        "958",
        "960",
        "964",
        "969",
        "970",
        "977",
        "988",
        "997",
        "998",
        "999",
        "1009",
        "1017",
        "1027",
        "1035",
        "1043",
        "1050",
        "1066",
        "1079",
        "1097",
        "1099",
        "1116",
        "1135",
        "1159",
        "1168",
        "1171",
        "1175",
        "1186",
        "1198",
        "1231",
        "1234",
        "1241",
        "1246",
        "1261",
        "1266",
        "1274",
        "1295",
        "1309",
        "1323",
        "1348",
        "1357",
        "1359",
        "1372",
        "1374",
        "1377",
        "1389",
        "1390",
        "1394",
        "1399",
        "1407",
        "1428",
        "1437",
        "1438",
        "1445",
        "1455",
        "1458",
        "1459",
        "1472",
        "1475",
        "1479",
        "1485",
        "1498",
        "1505",
        "1506",
        "1526",
        "1527",
        "1536",
        "1537",
        "1542",
        "1551",
        "1556",
        "1567",
        "1585",
        "1601",
        "1610",
        "1635",
        "1642",
        "1651",
        "1652",
        "1655",
        "1660",
        "1665",
        "1666",
        "1677",
        "1687",
        "1695",
        "1699",
        "1712",
        "1732",
        "1736",
        "1740",
        "1750",
        "1759",
        "1769",
        "1804",
        "1808",
        "1823",
        "1824",
        "1835",
        "1845",
        "1848",
        "1859",
        "1860",
        "1867",
        "1870",
        "1872",
        "1887",
        "1892",
        "1896",
        "1899",
        "1916",
        "1922",
        "1924",
        "1934",
        "1948",
        "1961",
        "1967",
        "1975",
        "1981",
        "1991",
        "1999",
        "2011",
        "2012",
        "2016",
        "2021",
        "2023",
        "2025",
        "2026",
        "2036",
        "2038",
        "2040",
        "2044",
        "2046",
        "2047",
        "2052",
        "2069",
        "2072",
        "2086",
        "2091",
        "2098",
        "2119",
        "2124",
        "2137",
        "2139",
        "2175",
        "2180",
        "2183",
        "2202",
        "2208",
        "2217",
        "2224",
        "2233",
        "2240",
        "2245",
        "2247",
        "2254",
        "2281",
        "2290",
        "2311",
        "2314",
        "2323",
        "2326",
        "2338",
        "2345",
        "2358",
        "2359",
        "2365",
        "2366",
        "2374",
        "2381",
        "2395",
        "2402",
        "2403",
        "2427",
        "2442",
        "2451",
        "2453",
        "2454",
        "2462",
        "2464",
        "2475",
        "2483",
        "2490",
        "2507",
        "2519",
        "2523",
        "2532",
        "2535",
        "2541",
        "2545",
        "2546",
        "2559",
        "2582",
        "2588",
        "2590",
        "2591",
        "2617",
        "2619",
        "2627",
        "2628",
        "2642",
        "2650",
        "2651",
        "2662",
        "2665",
        "2669",
        "2677",
        "2689",
        "2690",
        "2695",
        "2701",
        "2703",
        "2710",
        "2718",
        "2721",
        "2726",
        "2728",
        "2749",
        "2768",
        "2775",
        "2792",
        "2794",
        "2796",
        "2797",
        "2799",
        "2800",
        "2810",
        "2813",
        "2821",
        "2839",
        "2849",
        "2864",
        "2866",
        "2892",
        "2901",
        "2906",
        "2929",
        "2933",
        "2944",
        "2945",
        "2946",
        "2948",
        "2963",
        "2976",
        "2978",
        "2982",
        "2984",
        "2994",
        "2999",
        "3002",
        "3003",
        "3007",
        "3008",
        "3015",
        "3028",
        "3034",
        "3039",
        "3041",
        "3057",
        "3063",
        "3069",
        "3071",
        "3072",
        "3076",
        "3078",
        "3079",
        "3082",
        "3088",
        "3094",
        "3099",
        "3105",
        "3109",
        "3117",
        "3136",
        "3138",
        "3139",
        "3142",
        "3157",
        "3162",
        "3170",
        "3194",
        "3195",
        "3209",
        "3221",
        "3239",
        "3254",
        "3256",
        "3266",
        "3282",
        "3287",
        "3308",
        "3313",
        "3325",
        "3343",
        "3344",
        "3366",
        "3384",
        "3391",
        "3397",
        "3399",
        "3405",
        "3413",
        "3417",
        "3425",
        "3438",
        "3439",
        "3443",
        "3449",
        "3450",
        "3472",
        "3481",
        "3487",
        "3491",
        "3504",
        "3517",
        "3522",
        "3529",
        "3541",
        "3544",
        "3548",
        "3564",
        "3566",
        "3570",
        "3572",
        "3583",
        "3585",
        "3597",
        "3603",
        "3607",
        "3608",
        "3610",
        "3625",
        "3626",
        "3633",
        "3636",
        "3638",
        "3652",
        "3659",
        "3660",
        "3662",
        "3663",
        "3685",
        "3688",
        "3696",
        "3702",
        "3714",
        "3717",
        "3728",
        "3739",
        "3743",
        "3752",
        "3765",
        "3771",
        "3772",
        "3774",
        "3787",
        "3802",
        "3811",
        "3821",
        "3856",
        "3865",
        "3867",
        "3870",
        "3871",
        "3880",
        "3899",
        "3907",
        "3914",
        "3918",
        "3921",
        "3949",
        "3952",
        "3963",
        "3975",
        "3978",
        "3986",
        "3989",
        "3994",
        "4018",
        "4037",
        "4046",
        "4056",
        "4058",
        "4065",
        "4076",
        "4079",
        "4082",
        "4090",
        "4091",
        "4092",
        "4093"
      ],
      "default": "0"
    },
    {
      "identifier": "AddressingMode",
      "type": "AddrMode",
      "variants": [
        "Offset",
        "PreIndex",
        "PostIndex"
      ],
      "default": "Offset"
    },
    {
      "identifier": "DataTypeFloat",
      "type": "DataType",
      "variants": [
        "F16",
        "F32",
        "F64"
      ],
      "default": "F32"
    },
    {
      "identifier": "DRegister",
      "type": "DRegister",
      "variants": [
        "d0",
        "d1",
        "d2",
        "d3",
        "d4",
        "d5",
        "d6",
        "d7",
        "d8",
        "d9",
        "d10",
        "d11",
        "d12",
        "d13",
        "d14",
        "d15",
        "d16",
        "d17",
        "d18",
        "d19",
        "d20",
        "d21",
        "d22",
        "d23",
        "d24",
        "d25",
        "d26",
        "d27",
        "d28",
        "d29",
        "d30",
        "d31"
      ],
      "default": "d0"
    }
  ],
  // List of input types. They describe what can be fed to an instruction at
  // runtime.
  //
  //   - name: Identifer for the input. It allows test case descriptions to refer
  //           to it.
  //   - type: Python type associated with this input, implemented as a subclass
  //           of `test_generator.data_types.Inputs`. There should be a Python
  //           class for every input type.
  //   - values: List of possible values.
  //   - default: Value to use by default.
  "inputs": [
    {
      "identifier": "NZCV",
      "type": "NZCV",
      "values": [
        "NFlag",
        "ZFlag",
        "CFlag",
        "VFlag",
        "NZFlag",
        "NCFlag",
        "NVFlag",
        "ZCFlag",
        "ZVFlag",
        "CVFlag",
        "NZCFlag",
        "NZVFlag",
        "NCVFlag",
        "ZCVFlag",
        "NZCVFlag"
      ],
      "default": "NoFlag"
    },
    // TODO: Consider having a seperate list for inputs for which we are only
    // interested in recording the value after the instruction has executed.
    // This applies to `Q` and `GE`.
    {
      "identifier": "Q",
      "type": "Q",
      "values": [
        "NoFlag",
        "QFlag"
      ],
      "default": "NoFlag"
    },
    {
      "identifier": "GE",
      "type": "GE",
      "values": [
        "NoFlag",
        "GE01Flag",
        "GE02Flag",
        "GE03Flag",
        "GE12Flag",
        "GE13Flag",
        "GE23Flag",
        "GE012Flag",
        "GE013Flag",
        "GE023Flag",
        "GE123Flag",
        "GE0123Flag"
      ],
      "default": "NoFlag"
    },
    {
      "identifier": "FPSCR",
      "type": "FPSCR",
      "values": [
        "0x0"
      ],
      "default": "0x0"
    },
    {
      "identifier": "Register",
      "type": "Register",
      "values": [
        "0x00000000",
        "0x00000001",
        "0x00000002",
        "0x00000020",
        "0x0000007d",
        "0x0000007e",
        "0x0000007f",
        "0x00007ffd",
        "0x00007ffe",
        "0x00007fff",
        "0x33333333",
        "0x55555555",
        "0x7ffffffd",
        "0x7ffffffe",
        "0x7fffffff",
        "0x80000000",
        "0x80000001",
        "0xaaaaaaaa",
        "0xcccccccc",
        "0xffff8000",
        "0xffff8001",
        "0xffff8002",
        "0xffff8003",
        "0xffffff80",
        "0xffffff81",
        "0xffffff82",
        "0xffffff83",
        "0xffffffe0",
        "0xfffffffd",
        "0xfffffffe",
        "0xffffffff"
      ],
      "default": "0xabababab"
    },
    {
      "identifier": "RegisterOffsetLowerThan4096",
      "type": "Register",
      // These values are a random sample of 500 integers out of all integers
      // from 1 to 4094 (included). We've added 0 and 4095 explicitely.
      "values": [
        "0",
        "4095",
        "2",
        "4",
        "19",
        "22",
        "47",
        "48",
        "53",
        "55",
        "57",
        "70",
        "72",
        "83",
        "98",
        "106",
        "132",
        "136",
        "138",
        "180",
        "188",
        "192",
        "198",
        "199",
        "200",
        "210",
        "213",
        "216",
        "227",
        "233",
        "251",
        "263",
        "264",
        "270",
        "282",
        "306",
        "322",
        "342",
        "348",
        "358",
        "362",
        "365",
        "371",
        "386",
        "398",
        "421",
        "429",
        "441",
        "459",
        "462",
        "470",
        "478",
        "479",
        "481",
        "484",
        "490",
        "496",
        "510",
        "513",
        "517",
        "523",
        "524",
        "525",
        "542",
        "547",
        "565",
        "580",
        "582",
        "595",
        "601",
        "606",
        "612",
        "618",
        "624",
        "662",
        "663",
        "669",
        "670",
        "672",
        "674",
        "678",
        "679",
        "685",
        "688",
        "689",
        "704",
        "712",
        "719",
        "732",
        "766",
        "770",
        "774",
        "778",
        "783",
        "791",
        "794",
        "796",
        "797",
        "806",
        "811",
        "828",
        "831",
        "837",
        "844",
        "850",
        "871",
        "872",
        "875",
        "893",
        "915",
        "932",
        "955",
        "958",
        "960",
        "964",
        "969",
        "970",
        "977",
        "988",
        "997",
        "998",
        "999",
        "1009",
        "1017",
        "1027",
        "1035",
        "1043",
        "1050",
        "1066",
        "1079",
        "1097",
        "1099",
        "1116",
        "1135",
        "1159",
        "1168",
        "1171",
        "1175",
        "1186",
        "1198",
        "1231",
        "1234",
        "1241",
        "1246",
        "1261",
        "1266",
        "1274",
        "1295",
        "1309",
        "1323",
        "1348",
        "1357",
        "1359",
        "1372",
        "1374",
        "1377",
        "1389",
        "1390",
        "1394",
        "1399",
        "1407",
        "1428",
        "1437",
        "1438",
        "1445",
        "1455",
        "1458",
        "1459",
        "1472",
        "1475",
        "1479",
        "1485",
        "1498",
        "1505",
        "1506",
        "1526",
        "1527",
        "1536",
        "1537",
        "1542",
        "1551",
        "1556",
        "1567",
        "1585",
        "1601",
        "1610",
        "1635",
        "1642",
        "1651",
        "1652",
        "1655",
        "1660",
        "1665",
        "1666",
        "1677",
        "1687",
        "1695",
        "1699",
        "1712",
        "1732",
        "1736",
        "1740",
        "1750",
        "1759",
        "1769",
        "1804",
        "1808",
        "1823",
        "1824",
        "1835",
        "1845",
        "1848",
        "1859",
        "1860",
        "1867",
        "1870",
        "1872",
        "1887",
        "1892",
        "1896",
        "1899",
        "1916",
        "1922",
        "1924",
        "1934",
        "1948",
        "1961",
        "1967",
        "1975",
        "1981",
        "1991",
        "1999",
        "2011",
        "2012",
        "2016",
        "2021",
        "2023",
        "2025",
        "2026",
        "2036",
        "2038",
        "2040",
        "2044",
        "2046",
        "2047",
        "2052",
        "2069",
        "2072",
        "2086",
        "2091",
        "2098",
        "2119",
        "2124",
        "2137",
        "2139",
        "2175",
        "2180",
        "2183",
        "2202",
        "2208",
        "2217",
        "2224",
        "2233",
        "2240",
        "2245",
        "2247",
        "2254",
        "2281",
        "2290",
        "2311",
        "2314",
        "2323",
        "2326",
        "2338",
        "2345",
        "2358",
        "2359",
        "2365",
        "2366",
        "2374",
        "2381",
        "2395",
        "2402",
        "2403",
        "2427",
        "2442",
        "2451",
        "2453",
        "2454",
        "2462",
        "2464",
        "2475",
        "2483",
        "2490",
        "2507",
        "2519",
        "2523",
        "2532",
        "2535",
        "2541",
        "2545",
        "2546",
        "2559",
        "2582",
        "2588",
        "2590",
        "2591",
        "2617",
        "2619",
        "2627",
        "2628",
        "2642",
        "2650",
        "2651",
        "2662",
        "2665",
        "2669",
        "2677",
        "2689",
        "2690",
        "2695",
        "2701",
        "2703",
        "2710",
        "2718",
        "2721",
        "2726",
        "2728",
        "2749",
        "2768",
        "2775",
        "2792",
        "2794",
        "2796",
        "2797",
        "2799",
        "2800",
        "2810",
        "2813",
        "2821",
        "2839",
        "2849",
        "2864",
        "2866",
        "2892",
        "2901",
        "2906",
        "2929",
        "2933",
        "2944",
        "2945",
        "2946",
        "2948",
        "2963",
        "2976",
        "2978",
        "2982",
        "2984",
        "2994",
        "2999",
        "3002",
        "3003",
        "3007",
        "3008",
        "3015",
        "3028",
        "3034",
        "3039",
        "3041",
        "3057",
        "3063",
        "3069",
        "3071",
        "3072",
        "3076",
        "3078",
        "3079",
        "3082",
        "3088",
        "3094",
        "3099",
        "3105",
        "3109",
        "3117",
        "3136",
        "3138",
        "3139",
        "3142",
        "3157",
        "3162",
        "3170",
        "3194",
        "3195",
        "3209",
        "3221",
        "3239",
        "3254",
        "3256",
        "3266",
        "3282",
        "3287",
        "3308",
        "3313",
        "3325",
        "3343",
        "3344",
        "3366",
        "3384",
        "3391",
        "3397",
        "3399",
        "3405",
        "3413",
        "3417",
        "3425",
        "3438",
        "3439",
        "3443",
        "3449",
        "3450",
        "3472",
        "3481",
        "3487",
        "3491",
        "3504",
        "3517",
        "3522",
        "3529",
        "3541",
        "3544",
        "3548",
        "3564",
        "3566",
        "3570",
        "3572",
        "3583",
        "3585",
        "3597",
        "3603",
        "3607",
        "3608",
        "3610",
        "3625",
        "3626",
        "3633",
        "3636",
        "3638",
        "3652",
        "3659",
        "3660",
        "3662",
        "3663",
        "3685",
        "3688",
        "3696",
        "3702",
        "3714",
        "3717",
        "3728",
        "3739",
        "3743",
        "3752",
        "3765",
        "3771",
        "3772",
        "3774",
        "3787",
        "3802",
        "3811",
        "3821",
        "3856",
        "3865",
        "3867",
        "3870",
        "3871",
        "3880",
        "3899",
        "3907",
        "3914",
        "3918",
        "3921",
        "3949",
        "3952",
        "3963",
        "3975",
        "3978",
        "3986",
        "3989",
        "3994",
        "4018",
        "4037",
        "4046",
        "4056",
        "4058",
        "4065",
        "4076",
        "4079",
        "4082",
        "4090",
        "4091",
        "4092",
        "4093"
      ],
      "default": "0"
    },
    {
      "identifier": "RegisterShift",
      "type": "Register",
      "values": [
        "0",
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12",
        "13",
        "14",
        "15",
        "16",
        "17",
        "18",
        "19",
        "20",
        "21",
        "22",
        "23",
        "24",
        "25",
        "26",
        "27",
        "28",
        "29",
        "30",
        "31",
        "32"
      ],
      "default": "0"
    },
    {
      "identifier": "DRegisterF64",
      "type": "DRegisterF64",
      "values": [
        // Simple values.
        "0x0000000000000000",   // 0.0
        "0x0010000000000000",   // The smallest normal value.
        "0x3fdfffffffffffff",   // The value just below 0.5.
        "0x3fe0000000000000",   // 0.5
        "0x3fe0000000000001",   // The value just above 0.5.
        "0x3fefffffffffffff",   // The value just below 1.0.
        "0x3ff0000000000000",   // 1.0
        "0x3ff0000000000001",   // The value just above 1.0.
        "0x3ff8000000000000",   // 1.5
        "0x4024000000000000",   // 10
        "0x7fefffffffffffff",   // The largest finite value.

        // Infinity.
        "0x7ff0000000000000",

        // NaNs.
        //  - Quiet NaNs
        "0x7ff923456789abcd",
        "0x7ff8000000000000",
        //  - Signalling NaNs
        "0x7ff123456789abcd",
        "0x7ff0000000000000",

        // Subnormals.
        //  - A recognisable bit pattern.
        "0x000123456789abcd",
        //  - The largest subnormal value.
        "0x000fffffffffffff",
        //  - The smallest subnormal value.
        "0x0000000000000001",

        // The same values again, but negated.
        "0x8000000000000000",
        "0x8010000000000000",
        "0xbfdfffffffffffff",
        "0xbfe0000000000000",
        "0xbfe0000000000001",
        "0xbfefffffffffffff",
        "0xbff0000000000000",
        "0xbff0000000000001",
        "0xbff8000000000000",
        "0xc024000000000000",
        "0xffefffffffffffff",
        "0xfff0000000000000",
        "0xfff923456789abcd",
        "0xfff8000000000000",
        "0xfff123456789abcd",
        "0xfff0000000000000",
        "0x800123456789abcd",
        "0x800fffffffffffff",
        "0x8000000000000001"
      ],
      "default": "0x0000000000000000"
    },
    {
      "identifier": "MemOperand",
      "type": "MemOperand",
      // MemOperand inputs are represented by an offset and a 32 bit word placed
      // in memory.
      // The word will be placed into a scratch buffer and we will compute the
      // address of the base register according to what the `MemOperand` does.
      // The offset is used to record the value of the base register.
      "values": [
        "{0, 0x77777777}",
        "{0, 0x55555555}",
        "{0, 0x0badbeef}",
        "{0, 0x0cabba9e}"
      ],
      "default": "{0, 0x77777777}"
    }
  ]
}
