@@ -25,6 +25,10 @@ config PCI_TESTDEV
default y if TEST_DEVICES
depends on PCI
+config MEMACCESS_TESTDEV
+ bool
+ default y if TEST_DEVICES
+
config EDU
bool
default y if TEST_DEVICES
new file mode 100644
@@ -0,0 +1,197 @@
+/*
+ * QEMU memory access test device
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright (c) 2024 IGEL Co., Ltd.
+ * Author: Tomoyuki HIROSE <tomoyuki.hirose@igel.co.jp>
+ */
+/*
+ * This device is used to test memory acccess, like:
+ *
+ * qemu-system-x86_64 -device memaccess-testdev,address=0x10000000
+ */
+
+#include "qemu/osdep.h"
+#include "exec/address-spaces.h"
+#include "exec/memory.h"
+#include "hw/qdev-core.h"
+#include "hw/qdev-properties.h"
+#include "qapi/error.h"
+#include "qemu/typedefs.h"
+#include "qom/object.h"
+
+#include "hw/misc/memaccess-testdev.h"
+
+typedef struct MrOpsList {
+ const char *name;
+ const MemoryRegionOps *ops_array;
+ const size_t ops_array_len;
+ const size_t offset_idx;
+} MrOpsList;
+
+static void testdev_init_memory_region(MemoryRegion *mr,
+ Object *owner,
+ const MemoryRegionOps *ops,
+ void *opaque,
+ const char *name,
+ uint64_t size,
+ MemoryRegion *container,
+ hwaddr container_offset)
+{
+ memory_region_init_io(mr, owner, ops, opaque, name, size);
+ memory_region_add_subregion(container, container_offset, mr);
+}
+
+static void testdev_init_from_mr_ops_list(MemAccessTestDev *testdev,
+ const MrOpsList *l)
+{
+ for (size_t i = 0; i < l->ops_array_len; i++) {
+ g_autofree gchar *name = g_strdup_printf("%s-%ld", l->name, i);
+ testdev_init_memory_region(&testdev->memory_regions[l->offset_idx + i],
+ OBJECT(testdev), &l->ops_array[i],
+ testdev->mr_data[l->offset_idx + i],
+ name,
+ MEMACCESS_TESTDEV_REGION_SIZE,
+ &testdev->container,
+ MEMACCESS_TESTDEV_REGION_SIZE *
+ (l->offset_idx + i));
+ }
+}
+
+#define _DEFINE_MR_OPS_LIST(_n, _a, _l, _o) \
+ { \
+ .name = (_n), \
+ .ops_array = (_a), \
+ .ops_array_len = (_l), \
+ .offset_idx = (_o), \
+ }
+
+static const MrOpsList mr_ops_list[] = {
+ _DEFINE_MR_OPS_LIST("little-b-valid",
+ ops_list_little_b_valid,
+ N_OPS_LIST_LITTLE_B_VALID,
+ OFF_IDX_OPS_LIST_LITTLE_B_VALID),
+ _DEFINE_MR_OPS_LIST("little-b-invalid",
+ ops_list_little_b_invalid,
+ N_OPS_LIST_LITTLE_B_INVALID,
+ OFF_IDX_OPS_LIST_LITTLE_B_INVALID),
+ _DEFINE_MR_OPS_LIST("little-w-valid",
+ ops_list_little_w_valid,
+ N_OPS_LIST_LITTLE_W_VALID,
+ OFF_IDX_OPS_LIST_LITTLE_W_VALID),
+ _DEFINE_MR_OPS_LIST("little-w-invalid",
+ ops_list_little_w_invalid,
+ N_OPS_LIST_LITTLE_W_INVALID,
+ OFF_IDX_OPS_LIST_LITTLE_W_INVALID),
+ _DEFINE_MR_OPS_LIST("little-l-valid",
+ ops_list_little_l_valid,
+ N_OPS_LIST_LITTLE_L_VALID,
+ OFF_IDX_OPS_LIST_LITTLE_L_VALID),
+ _DEFINE_MR_OPS_LIST("little-l-invalid",
+ ops_list_little_l_invalid,
+ N_OPS_LIST_LITTLE_L_INVALID,
+ OFF_IDX_OPS_LIST_LITTLE_L_INVALID),
+ _DEFINE_MR_OPS_LIST("little-q-valid",
+ ops_list_little_q_valid,
+ N_OPS_LIST_LITTLE_Q_VALID,
+ OFF_IDX_OPS_LIST_LITTLE_Q_VALID),
+ _DEFINE_MR_OPS_LIST("little-q-invalid",
+ ops_list_little_q_invalid,
+ N_OPS_LIST_LITTLE_Q_INVALID,
+ OFF_IDX_OPS_LIST_LITTLE_Q_INVALID),
+ _DEFINE_MR_OPS_LIST("big-b-valid",
+ ops_list_big_b_valid,
+ N_OPS_LIST_BIG_B_VALID,
+ OFF_IDX_OPS_LIST_BIG_B_VALID),
+ _DEFINE_MR_OPS_LIST("big-b-invalid",
+ ops_list_big_b_invalid,
+ N_OPS_LIST_BIG_B_INVALID,
+ OFF_IDX_OPS_LIST_BIG_B_INVALID),
+ _DEFINE_MR_OPS_LIST("big-w-valid",
+ ops_list_big_w_valid,
+ N_OPS_LIST_BIG_W_VALID,
+ OFF_IDX_OPS_LIST_BIG_W_VALID),
+ _DEFINE_MR_OPS_LIST("big-w-invalid",
+ ops_list_big_w_invalid,
+ N_OPS_LIST_BIG_W_INVALID,
+ OFF_IDX_OPS_LIST_BIG_W_INVALID),
+ _DEFINE_MR_OPS_LIST("big-l-valid",
+ ops_list_big_l_valid,
+ N_OPS_LIST_LITTLE_L_VALID,
+ OFF_IDX_OPS_LIST_BIG_L_VALID),
+ _DEFINE_MR_OPS_LIST("big-l-invalid",
+ ops_list_big_l_invalid,
+ N_OPS_LIST_BIG_L_INVALID,
+ OFF_IDX_OPS_LIST_BIG_L_INVALID),
+ _DEFINE_MR_OPS_LIST("big-q-valid",
+ ops_list_big_q_valid,
+ N_OPS_LIST_BIG_Q_VALID,
+ OFF_IDX_OPS_LIST_BIG_Q_VALID),
+ _DEFINE_MR_OPS_LIST("big-q-invalid",
+ ops_list_big_q_invalid,
+ N_OPS_LIST_BIG_Q_INVALID,
+ OFF_IDX_OPS_LIST_BIG_Q_INVALID),
+};
+#define N_MR_OPS_LIST (sizeof(mr_ops_list) / sizeof(MrOpsList))
+
+static void init_testdev(MemAccessTestDev *testdev)
+{
+ memory_region_init(&testdev->container, OBJECT(testdev), "memtest-regions",
+ MEMACCESS_TESTDEV_REGION_SIZE * N_OPS_LIST);
+ testdev->mr_data = g_malloc(MEMACCESS_TESTDEV_MR_DATA_SIZE);
+
+ for (size_t i = 0; i < N_MR_OPS_LIST; i++) {
+ testdev_init_from_mr_ops_list(testdev, &mr_ops_list[i]);
+ }
+
+ memory_region_add_subregion(get_system_memory(), testdev->base,
+ &testdev->container);
+}
+
+static void memaccess_testdev_realize(DeviceState *dev, Error **errp)
+{
+ MemAccessTestDev *d = MEM_ACCESS_TEST_DEV(dev);
+
+ if (d->base == UINT64_MAX) {
+ error_setg(errp, "base address is not assigned");
+ return;
+ }
+
+ init_testdev(d);
+}
+
+static void memaccess_testdev_unrealize(DeviceState *dev)
+{
+ MemAccessTestDev *d = MEM_ACCESS_TEST_DEV(dev);
+ g_free(d->mr_data);
+}
+
+static Property memaccess_testdev_props[] = {
+ DEFINE_PROP_UINT64("address", MemAccessTestDev, base, UINT64_MAX),
+ DEFINE_PROP_END_OF_LIST(),
+};
+
+static void memaccess_testdev_class_init(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+
+ dc->realize = memaccess_testdev_realize;
+ dc->unrealize = memaccess_testdev_unrealize;
+ device_class_set_props(dc, memaccess_testdev_props);
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+}
+
+static const TypeInfo memaccess_testdev_info = {
+ .name = TYPE_MEM_ACCESS_TEST_DEV,
+ .parent = TYPE_DEVICE,
+ .instance_size = sizeof(MemAccessTestDev),
+ .class_init = memaccess_testdev_class_init,
+};
+
+static void memaccess_testdev_register_types(void)
+{
+ type_register_static(&memaccess_testdev_info);
+}
+
+type_init(memaccess_testdev_register_types)
@@ -4,6 +4,7 @@ system_ss.add(when: 'CONFIG_FW_CFG_DMA', if_true: files('vmcoreinfo.c'))
system_ss.add(when: 'CONFIG_ISA_DEBUG', if_true: files('debugexit.c'))
system_ss.add(when: 'CONFIG_ISA_TESTDEV', if_true: files('pc-testdev.c'))
system_ss.add(when: 'CONFIG_PCI_TESTDEV', if_true: files('pci-testdev.c'))
+system_ss.add(when: 'CONFIG_MEMACCESS_TESTDEV', if_true: files('memaccess-testdev.c'))
system_ss.add(when: 'CONFIG_UNIMP', if_true: files('unimp.c'))
system_ss.add(when: 'CONFIG_EMPTY_SLOT', if_true: files('empty_slot.c'))
system_ss.add(when: 'CONFIG_LED', if_true: files('led.c'))
new file mode 100644
@@ -0,0 +1,42 @@
+/*
+ * QEMU memory access test device header
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright (c) 2024 IGEL Co., Ltd.
+ * Author: Tomoyuki HIROSE <tomoyuki.hirose@igel.co.jp>
+ */
+
+#ifndef HW_MISC_MEMACCESS_TESTDEV_H
+#define HW_MISC_MEMACCESS_TESTDEV_H
+
+#include "qemu/osdep.h"
+#include "exec/memory.h"
+#include "hw/qdev-core.h"
+
+#define TYPE_MEM_ACCESS_TEST_DEV "memaccess-testdev"
+
+#include "hw/misc/memaccess-testdev.h.inc"
+
+typedef uint8_t MrData[MEMACCESS_TESTDEV_REGION_SIZE];
+#define MEMACCESS_TESTDEV_MR_DATA_SIZE (sizeof(MrData) * N_OPS_LIST)
+
+typedef DeviceClass MemAccessTestDevClass;
+typedef struct MemAccessTestDev {
+ /* Private */
+ DeviceState parent_obj;
+ /* Public */
+ MemoryRegion container;
+ MemoryRegion memory_regions[N_OPS_LIST]; /* test memory regions */
+ uint64_t base; /* map base address */
+ MrData *mr_data; /* memory region data array */
+} MemAccessTestDev;
+
+#define MEM_ACCESS_TEST_DEV_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(MemAccessTestDevClass, obj, TYPE_MEM_ACCESS_TEST_DEV)
+#define MEM_ACCESS_TEST_DEV_CLASS(klass) \
+ OBJECT_CLASS_CHECK(MemAccessTestDevClass, klass, TYPE_MEM_ACCESS_TEST_DEV)
+#define MEM_ACCESS_TEST_DEV(obj) \
+ OBJECT_CHECK(MemAccessTestDev, obj, TYPE_MEM_ACCESS_TEST_DEV)
+
+#endif
new file mode 100644
@@ -0,0 +1,1864 @@
+/*
+ * QEMU memory access test device functions
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright (c) 2024 IGEL Co., Ltd.
+ * Author: Tomoyuki HIROSE <tomoyuki.hirose@igel.co.jp>
+ */
+
+#ifndef HW_MISC_MEMACCESS_TESTDEV_H_INC
+#define HW_MISC_MEMACCESS_TESTDEV_H_INC
+
+#include "qemu/osdep.h"
+#include "exec/memory.h"
+
+#define MEMACCESS_TESTDEV_REGION_SIZE (32)
+
+static uint64_t memaccess_testdev_read_little(void *opaque, hwaddr addr,
+ unsigned int size)
+{
+ g_assert(addr + size < MEMACCESS_TESTDEV_REGION_SIZE);
+ void *s = (uint8_t *)opaque + addr;
+ return ldn_le_p(s, size);
+}
+
+static void memaccess_testdev_write_little(void *opaque, hwaddr addr,
+ uint64_t data, unsigned int size)
+{
+ g_assert(addr + size < MEMACCESS_TESTDEV_REGION_SIZE);
+ void *d = (uint8_t *)opaque + addr;
+ stn_le_p(d, size, data);
+}
+
+static uint64_t memaccess_testdev_read_big(void *opaque, hwaddr addr,
+ unsigned int size)
+{
+ g_assert(addr + size < MEMACCESS_TESTDEV_REGION_SIZE);
+ void *s = (uint8_t *)opaque + addr;
+ return ldn_be_p(s, size);
+}
+
+static void memaccess_testdev_write_big(void *opaque, hwaddr addr,
+ uint64_t data, unsigned int size)
+{
+ g_assert(addr + size < MEMACCESS_TESTDEV_REGION_SIZE);
+ void *d = (uint8_t *)opaque + addr;
+ stn_be_p(d, size, data);
+}
+
+#define __JOIN6(a, b, c, d, e, f) __JOIN6_AGAIN(a, b, c, d, e, f)
+#define __JOIN6_AGAIN(a, b, c, d, e, f) a##b##c##d##e##f
+#define __JOIN2(a, b) __JOIN2_AGAIN(a, b)
+#define __JOIN2_AGAIN(a, b) a##b
+#define __STR(x) __STR_AGAIN(x)
+#define __STR_AGAIN(x) #x
+
+#define NAME_OPS_LITTLE(valid_max, valid_min, valid_unaligned, \
+ impl_max, impl_min, impl_unaligned) \
+ __JOIN2(ops_little, \
+ __JOIN6(valid_max, valid_min, valid_unaligned, \
+ impl_max, impl_min, impl_unaligned))
+
+#define NAME_OPS_BIG(valid_max, valid_min, valid_unaligned, \
+ impl_max, impl_min, impl_unaligned) \
+ __JOIN2(ops_big, \
+ __JOIN6(valid_max, valid_min, valid_unaligned, \
+ impl_max, impl_min, impl_unaligned))
+
+#define GEN_OPS_LITTLE(valid_max, \
+ valid_min, \
+ valid_unaligned, \
+ impl_max, \
+ impl_min, \
+ impl_unaligned) \
+ static const MemoryRegionOps \
+ NAME_OPS_LITTLE(valid_max, valid_min, valid_unaligned, \
+ impl_max, impl_min, impl_unaligned) \
+ = { \
+ .read = memaccess_testdev_read_little, \
+ .write = memaccess_testdev_write_little, \
+ .endianness = DEVICE_LITTLE_ENDIAN, \
+ .valid = { \
+ .max_access_size = valid_max, \
+ .min_access_size = valid_min, \
+ .unaligned = valid_unaligned, \
+ }, \
+ .impl = { \
+ .max_access_size = impl_max, \
+ .min_access_size = impl_min, \
+ .unaligned = impl_unaligned, \
+ }, \
+ };
+
+#define GEN_OPS_BIG(valid_max, \
+ valid_min, \
+ valid_unaligned, \
+ impl_max, \
+ impl_min, \
+ impl_unaligned) \
+ static const MemoryRegionOps \
+ NAME_OPS_BIG(valid_max, valid_min, valid_unaligned, \
+ impl_max, impl_min, impl_unaligned) \
+ = { \
+ .read = memaccess_testdev_read_big, \
+ .write = memaccess_testdev_write_big, \
+ .endianness = DEVICE_BIG_ENDIAN, \
+ .valid = { \
+ .max_access_size = valid_max, \
+ .min_access_size = valid_min, \
+ .unaligned = valid_unaligned, \
+ }, \
+ .impl = { \
+ .max_access_size = impl_max, \
+ .min_access_size = impl_min, \
+ .unaligned = impl_unaligned, \
+ }, \
+ };
+
+GEN_OPS_LITTLE(1, 1, true, 1, 1, true)
+GEN_OPS_LITTLE(1, 1, true, 2, 1, true)
+GEN_OPS_LITTLE(1, 1, true, 4, 1, true)
+GEN_OPS_LITTLE(1, 1, true, 8, 1, true)
+GEN_OPS_LITTLE(1, 1, true, 2, 2, true)
+GEN_OPS_LITTLE(1, 1, true, 4, 2, true)
+GEN_OPS_LITTLE(1, 1, true, 8, 2, true)
+GEN_OPS_LITTLE(1, 1, true, 4, 4, true)
+GEN_OPS_LITTLE(1, 1, true, 8, 4, true)
+GEN_OPS_LITTLE(1, 1, true, 8, 8, true)
+GEN_OPS_LITTLE(1, 1, true, 1, 1, false)
+GEN_OPS_LITTLE(1, 1, true, 2, 1, false)
+GEN_OPS_LITTLE(1, 1, true, 4, 1, false)
+GEN_OPS_LITTLE(1, 1, true, 8, 1, false)
+GEN_OPS_LITTLE(1, 1, true, 2, 2, false)
+GEN_OPS_LITTLE(1, 1, true, 4, 2, false)
+GEN_OPS_LITTLE(1, 1, true, 8, 2, false)
+GEN_OPS_LITTLE(1, 1, true, 4, 4, false)
+GEN_OPS_LITTLE(1, 1, true, 8, 4, false)
+GEN_OPS_LITTLE(1, 1, true, 8, 8, false)
+GEN_OPS_LITTLE(2, 1, true, 1, 1, true)
+GEN_OPS_LITTLE(2, 1, true, 2, 1, true)
+GEN_OPS_LITTLE(2, 1, true, 4, 1, true)
+GEN_OPS_LITTLE(2, 1, true, 8, 1, true)
+GEN_OPS_LITTLE(2, 1, true, 2, 2, true)
+GEN_OPS_LITTLE(2, 1, true, 4, 2, true)
+GEN_OPS_LITTLE(2, 1, true, 8, 2, true)
+GEN_OPS_LITTLE(2, 1, true, 4, 4, true)
+GEN_OPS_LITTLE(2, 1, true, 8, 4, true)
+GEN_OPS_LITTLE(2, 1, true, 8, 8, true)
+GEN_OPS_LITTLE(2, 1, true, 1, 1, false)
+GEN_OPS_LITTLE(2, 1, true, 2, 1, false)
+GEN_OPS_LITTLE(2, 1, true, 4, 1, false)
+GEN_OPS_LITTLE(2, 1, true, 8, 1, false)
+GEN_OPS_LITTLE(2, 1, true, 2, 2, false)
+GEN_OPS_LITTLE(2, 1, true, 4, 2, false)
+GEN_OPS_LITTLE(2, 1, true, 8, 2, false)
+GEN_OPS_LITTLE(2, 1, true, 4, 4, false)
+GEN_OPS_LITTLE(2, 1, true, 8, 4, false)
+GEN_OPS_LITTLE(2, 1, true, 8, 8, false)
+GEN_OPS_LITTLE(4, 1, true, 1, 1, true)
+GEN_OPS_LITTLE(4, 1, true, 2, 1, true)
+GEN_OPS_LITTLE(4, 1, true, 4, 1, true)
+GEN_OPS_LITTLE(4, 1, true, 8, 1, true)
+GEN_OPS_LITTLE(4, 1, true, 2, 2, true)
+GEN_OPS_LITTLE(4, 1, true, 4, 2, true)
+GEN_OPS_LITTLE(4, 1, true, 8, 2, true)
+GEN_OPS_LITTLE(4, 1, true, 4, 4, true)
+GEN_OPS_LITTLE(4, 1, true, 8, 4, true)
+GEN_OPS_LITTLE(4, 1, true, 8, 8, true)
+GEN_OPS_LITTLE(4, 1, true, 1, 1, false)
+GEN_OPS_LITTLE(4, 1, true, 2, 1, false)
+GEN_OPS_LITTLE(4, 1, true, 4, 1, false)
+GEN_OPS_LITTLE(4, 1, true, 8, 1, false)
+GEN_OPS_LITTLE(4, 1, true, 2, 2, false)
+GEN_OPS_LITTLE(4, 1, true, 4, 2, false)
+GEN_OPS_LITTLE(4, 1, true, 8, 2, false)
+GEN_OPS_LITTLE(4, 1, true, 4, 4, false)
+GEN_OPS_LITTLE(4, 1, true, 8, 4, false)
+GEN_OPS_LITTLE(4, 1, true, 8, 8, false)
+GEN_OPS_LITTLE(8, 1, true, 1, 1, true)
+GEN_OPS_LITTLE(8, 1, true, 2, 1, true)
+GEN_OPS_LITTLE(8, 1, true, 4, 1, true)
+GEN_OPS_LITTLE(8, 1, true, 8, 1, true)
+GEN_OPS_LITTLE(8, 1, true, 2, 2, true)
+GEN_OPS_LITTLE(8, 1, true, 4, 2, true)
+GEN_OPS_LITTLE(8, 1, true, 8, 2, true)
+GEN_OPS_LITTLE(8, 1, true, 4, 4, true)
+GEN_OPS_LITTLE(8, 1, true, 8, 4, true)
+GEN_OPS_LITTLE(8, 1, true, 8, 8, true)
+GEN_OPS_LITTLE(8, 1, true, 1, 1, false)
+GEN_OPS_LITTLE(8, 1, true, 2, 1, false)
+GEN_OPS_LITTLE(8, 1, true, 4, 1, false)
+GEN_OPS_LITTLE(8, 1, true, 8, 1, false)
+GEN_OPS_LITTLE(8, 1, true, 2, 2, false)
+GEN_OPS_LITTLE(8, 1, true, 4, 2, false)
+GEN_OPS_LITTLE(8, 1, true, 8, 2, false)
+GEN_OPS_LITTLE(8, 1, true, 4, 4, false)
+GEN_OPS_LITTLE(8, 1, true, 8, 4, false)
+GEN_OPS_LITTLE(8, 1, true, 8, 8, false)
+GEN_OPS_LITTLE(2, 2, true, 1, 1, true)
+GEN_OPS_LITTLE(2, 2, true, 2, 1, true)
+GEN_OPS_LITTLE(2, 2, true, 4, 1, true)
+GEN_OPS_LITTLE(2, 2, true, 8, 1, true)
+GEN_OPS_LITTLE(2, 2, true, 2, 2, true)
+GEN_OPS_LITTLE(2, 2, true, 4, 2, true)
+GEN_OPS_LITTLE(2, 2, true, 8, 2, true)
+GEN_OPS_LITTLE(2, 2, true, 4, 4, true)
+GEN_OPS_LITTLE(2, 2, true, 8, 4, true)
+GEN_OPS_LITTLE(2, 2, true, 8, 8, true)
+GEN_OPS_LITTLE(2, 2, true, 1, 1, false)
+GEN_OPS_LITTLE(2, 2, true, 2, 1, false)
+GEN_OPS_LITTLE(2, 2, true, 4, 1, false)
+GEN_OPS_LITTLE(2, 2, true, 8, 1, false)
+GEN_OPS_LITTLE(2, 2, true, 2, 2, false)
+GEN_OPS_LITTLE(2, 2, true, 4, 2, false)
+GEN_OPS_LITTLE(2, 2, true, 8, 2, false)
+GEN_OPS_LITTLE(2, 2, true, 4, 4, false)
+GEN_OPS_LITTLE(2, 2, true, 8, 4, false)
+GEN_OPS_LITTLE(2, 2, true, 8, 8, false)
+GEN_OPS_LITTLE(4, 2, true, 1, 1, true)
+GEN_OPS_LITTLE(4, 2, true, 2, 1, true)
+GEN_OPS_LITTLE(4, 2, true, 4, 1, true)
+GEN_OPS_LITTLE(4, 2, true, 8, 1, true)
+GEN_OPS_LITTLE(4, 2, true, 2, 2, true)
+GEN_OPS_LITTLE(4, 2, true, 4, 2, true)
+GEN_OPS_LITTLE(4, 2, true, 8, 2, true)
+GEN_OPS_LITTLE(4, 2, true, 4, 4, true)
+GEN_OPS_LITTLE(4, 2, true, 8, 4, true)
+GEN_OPS_LITTLE(4, 2, true, 8, 8, true)
+GEN_OPS_LITTLE(4, 2, true, 1, 1, false)
+GEN_OPS_LITTLE(4, 2, true, 2, 1, false)
+GEN_OPS_LITTLE(4, 2, true, 4, 1, false)
+GEN_OPS_LITTLE(4, 2, true, 8, 1, false)
+GEN_OPS_LITTLE(4, 2, true, 2, 2, false)
+GEN_OPS_LITTLE(4, 2, true, 4, 2, false)
+GEN_OPS_LITTLE(4, 2, true, 8, 2, false)
+GEN_OPS_LITTLE(4, 2, true, 4, 4, false)
+GEN_OPS_LITTLE(4, 2, true, 8, 4, false)
+GEN_OPS_LITTLE(4, 2, true, 8, 8, false)
+GEN_OPS_LITTLE(8, 2, true, 1, 1, true)
+GEN_OPS_LITTLE(8, 2, true, 2, 1, true)
+GEN_OPS_LITTLE(8, 2, true, 4, 1, true)
+GEN_OPS_LITTLE(8, 2, true, 8, 1, true)
+GEN_OPS_LITTLE(8, 2, true, 2, 2, true)
+GEN_OPS_LITTLE(8, 2, true, 4, 2, true)
+GEN_OPS_LITTLE(8, 2, true, 8, 2, true)
+GEN_OPS_LITTLE(8, 2, true, 4, 4, true)
+GEN_OPS_LITTLE(8, 2, true, 8, 4, true)
+GEN_OPS_LITTLE(8, 2, true, 8, 8, true)
+GEN_OPS_LITTLE(8, 2, true, 1, 1, false)
+GEN_OPS_LITTLE(8, 2, true, 2, 1, false)
+GEN_OPS_LITTLE(8, 2, true, 4, 1, false)
+GEN_OPS_LITTLE(8, 2, true, 8, 1, false)
+GEN_OPS_LITTLE(8, 2, true, 2, 2, false)
+GEN_OPS_LITTLE(8, 2, true, 4, 2, false)
+GEN_OPS_LITTLE(8, 2, true, 8, 2, false)
+GEN_OPS_LITTLE(8, 2, true, 4, 4, false)
+GEN_OPS_LITTLE(8, 2, true, 8, 4, false)
+GEN_OPS_LITTLE(8, 2, true, 8, 8, false)
+GEN_OPS_LITTLE(4, 4, true, 1, 1, true)
+GEN_OPS_LITTLE(4, 4, true, 2, 1, true)
+GEN_OPS_LITTLE(4, 4, true, 4, 1, true)
+GEN_OPS_LITTLE(4, 4, true, 8, 1, true)
+GEN_OPS_LITTLE(4, 4, true, 2, 2, true)
+GEN_OPS_LITTLE(4, 4, true, 4, 2, true)
+GEN_OPS_LITTLE(4, 4, true, 8, 2, true)
+GEN_OPS_LITTLE(4, 4, true, 4, 4, true)
+GEN_OPS_LITTLE(4, 4, true, 8, 4, true)
+GEN_OPS_LITTLE(4, 4, true, 8, 8, true)
+GEN_OPS_LITTLE(4, 4, true, 1, 1, false)
+GEN_OPS_LITTLE(4, 4, true, 2, 1, false)
+GEN_OPS_LITTLE(4, 4, true, 4, 1, false)
+GEN_OPS_LITTLE(4, 4, true, 8, 1, false)
+GEN_OPS_LITTLE(4, 4, true, 2, 2, false)
+GEN_OPS_LITTLE(4, 4, true, 4, 2, false)
+GEN_OPS_LITTLE(4, 4, true, 8, 2, false)
+GEN_OPS_LITTLE(4, 4, true, 4, 4, false)
+GEN_OPS_LITTLE(4, 4, true, 8, 4, false)
+GEN_OPS_LITTLE(4, 4, true, 8, 8, false)
+GEN_OPS_LITTLE(8, 4, true, 1, 1, true)
+GEN_OPS_LITTLE(8, 4, true, 2, 1, true)
+GEN_OPS_LITTLE(8, 4, true, 4, 1, true)
+GEN_OPS_LITTLE(8, 4, true, 8, 1, true)
+GEN_OPS_LITTLE(8, 4, true, 2, 2, true)
+GEN_OPS_LITTLE(8, 4, true, 4, 2, true)
+GEN_OPS_LITTLE(8, 4, true, 8, 2, true)
+GEN_OPS_LITTLE(8, 4, true, 4, 4, true)
+GEN_OPS_LITTLE(8, 4, true, 8, 4, true)
+GEN_OPS_LITTLE(8, 4, true, 8, 8, true)
+GEN_OPS_LITTLE(8, 4, true, 1, 1, false)
+GEN_OPS_LITTLE(8, 4, true, 2, 1, false)
+GEN_OPS_LITTLE(8, 4, true, 4, 1, false)
+GEN_OPS_LITTLE(8, 4, true, 8, 1, false)
+GEN_OPS_LITTLE(8, 4, true, 2, 2, false)
+GEN_OPS_LITTLE(8, 4, true, 4, 2, false)
+GEN_OPS_LITTLE(8, 4, true, 8, 2, false)
+GEN_OPS_LITTLE(8, 4, true, 4, 4, false)
+GEN_OPS_LITTLE(8, 4, true, 8, 4, false)
+GEN_OPS_LITTLE(8, 4, true, 8, 8, false)
+GEN_OPS_LITTLE(8, 8, true, 1, 1, true)
+GEN_OPS_LITTLE(8, 8, true, 2, 1, true)
+GEN_OPS_LITTLE(8, 8, true, 4, 1, true)
+GEN_OPS_LITTLE(8, 8, true, 8, 1, true)
+GEN_OPS_LITTLE(8, 8, true, 2, 2, true)
+GEN_OPS_LITTLE(8, 8, true, 4, 2, true)
+GEN_OPS_LITTLE(8, 8, true, 8, 2, true)
+GEN_OPS_LITTLE(8, 8, true, 4, 4, true)
+GEN_OPS_LITTLE(8, 8, true, 8, 4, true)
+GEN_OPS_LITTLE(8, 8, true, 8, 8, true)
+GEN_OPS_LITTLE(8, 8, true, 1, 1, false)
+GEN_OPS_LITTLE(8, 8, true, 2, 1, false)
+GEN_OPS_LITTLE(8, 8, true, 4, 1, false)
+GEN_OPS_LITTLE(8, 8, true, 8, 1, false)
+GEN_OPS_LITTLE(8, 8, true, 2, 2, false)
+GEN_OPS_LITTLE(8, 8, true, 4, 2, false)
+GEN_OPS_LITTLE(8, 8, true, 8, 2, false)
+GEN_OPS_LITTLE(8, 8, true, 4, 4, false)
+GEN_OPS_LITTLE(8, 8, true, 8, 4, false)
+GEN_OPS_LITTLE(8, 8, true, 8, 8, false)
+GEN_OPS_LITTLE(1, 1, false, 1, 1, true)
+GEN_OPS_LITTLE(1, 1, false, 2, 1, true)
+GEN_OPS_LITTLE(1, 1, false, 4, 1, true)
+GEN_OPS_LITTLE(1, 1, false, 8, 1, true)
+GEN_OPS_LITTLE(1, 1, false, 2, 2, true)
+GEN_OPS_LITTLE(1, 1, false, 4, 2, true)
+GEN_OPS_LITTLE(1, 1, false, 8, 2, true)
+GEN_OPS_LITTLE(1, 1, false, 4, 4, true)
+GEN_OPS_LITTLE(1, 1, false, 8, 4, true)
+GEN_OPS_LITTLE(1, 1, false, 8, 8, true)
+GEN_OPS_LITTLE(1, 1, false, 1, 1, false)
+GEN_OPS_LITTLE(1, 1, false, 2, 1, false)
+GEN_OPS_LITTLE(1, 1, false, 4, 1, false)
+GEN_OPS_LITTLE(1, 1, false, 8, 1, false)
+GEN_OPS_LITTLE(1, 1, false, 2, 2, false)
+GEN_OPS_LITTLE(1, 1, false, 4, 2, false)
+GEN_OPS_LITTLE(1, 1, false, 8, 2, false)
+GEN_OPS_LITTLE(1, 1, false, 4, 4, false)
+GEN_OPS_LITTLE(1, 1, false, 8, 4, false)
+GEN_OPS_LITTLE(1, 1, false, 8, 8, false)
+GEN_OPS_LITTLE(2, 1, false, 1, 1, true)
+GEN_OPS_LITTLE(2, 1, false, 2, 1, true)
+GEN_OPS_LITTLE(2, 1, false, 4, 1, true)
+GEN_OPS_LITTLE(2, 1, false, 8, 1, true)
+GEN_OPS_LITTLE(2, 1, false, 2, 2, true)
+GEN_OPS_LITTLE(2, 1, false, 4, 2, true)
+GEN_OPS_LITTLE(2, 1, false, 8, 2, true)
+GEN_OPS_LITTLE(2, 1, false, 4, 4, true)
+GEN_OPS_LITTLE(2, 1, false, 8, 4, true)
+GEN_OPS_LITTLE(2, 1, false, 8, 8, true)
+GEN_OPS_LITTLE(2, 1, false, 1, 1, false)
+GEN_OPS_LITTLE(2, 1, false, 2, 1, false)
+GEN_OPS_LITTLE(2, 1, false, 4, 1, false)
+GEN_OPS_LITTLE(2, 1, false, 8, 1, false)
+GEN_OPS_LITTLE(2, 1, false, 2, 2, false)
+GEN_OPS_LITTLE(2, 1, false, 4, 2, false)
+GEN_OPS_LITTLE(2, 1, false, 8, 2, false)
+GEN_OPS_LITTLE(2, 1, false, 4, 4, false)
+GEN_OPS_LITTLE(2, 1, false, 8, 4, false)
+GEN_OPS_LITTLE(2, 1, false, 8, 8, false)
+GEN_OPS_LITTLE(4, 1, false, 1, 1, true)
+GEN_OPS_LITTLE(4, 1, false, 2, 1, true)
+GEN_OPS_LITTLE(4, 1, false, 4, 1, true)
+GEN_OPS_LITTLE(4, 1, false, 8, 1, true)
+GEN_OPS_LITTLE(4, 1, false, 2, 2, true)
+GEN_OPS_LITTLE(4, 1, false, 4, 2, true)
+GEN_OPS_LITTLE(4, 1, false, 8, 2, true)
+GEN_OPS_LITTLE(4, 1, false, 4, 4, true)
+GEN_OPS_LITTLE(4, 1, false, 8, 4, true)
+GEN_OPS_LITTLE(4, 1, false, 8, 8, true)
+GEN_OPS_LITTLE(4, 1, false, 1, 1, false)
+GEN_OPS_LITTLE(4, 1, false, 2, 1, false)
+GEN_OPS_LITTLE(4, 1, false, 4, 1, false)
+GEN_OPS_LITTLE(4, 1, false, 8, 1, false)
+GEN_OPS_LITTLE(4, 1, false, 2, 2, false)
+GEN_OPS_LITTLE(4, 1, false, 4, 2, false)
+GEN_OPS_LITTLE(4, 1, false, 8, 2, false)
+GEN_OPS_LITTLE(4, 1, false, 4, 4, false)
+GEN_OPS_LITTLE(4, 1, false, 8, 4, false)
+GEN_OPS_LITTLE(4, 1, false, 8, 8, false)
+GEN_OPS_LITTLE(8, 1, false, 1, 1, true)
+GEN_OPS_LITTLE(8, 1, false, 2, 1, true)
+GEN_OPS_LITTLE(8, 1, false, 4, 1, true)
+GEN_OPS_LITTLE(8, 1, false, 8, 1, true)
+GEN_OPS_LITTLE(8, 1, false, 2, 2, true)
+GEN_OPS_LITTLE(8, 1, false, 4, 2, true)
+GEN_OPS_LITTLE(8, 1, false, 8, 2, true)
+GEN_OPS_LITTLE(8, 1, false, 4, 4, true)
+GEN_OPS_LITTLE(8, 1, false, 8, 4, true)
+GEN_OPS_LITTLE(8, 1, false, 8, 8, true)
+GEN_OPS_LITTLE(8, 1, false, 1, 1, false)
+GEN_OPS_LITTLE(8, 1, false, 2, 1, false)
+GEN_OPS_LITTLE(8, 1, false, 4, 1, false)
+GEN_OPS_LITTLE(8, 1, false, 8, 1, false)
+GEN_OPS_LITTLE(8, 1, false, 2, 2, false)
+GEN_OPS_LITTLE(8, 1, false, 4, 2, false)
+GEN_OPS_LITTLE(8, 1, false, 8, 2, false)
+GEN_OPS_LITTLE(8, 1, false, 4, 4, false)
+GEN_OPS_LITTLE(8, 1, false, 8, 4, false)
+GEN_OPS_LITTLE(8, 1, false, 8, 8, false)
+GEN_OPS_LITTLE(2, 2, false, 1, 1, true)
+GEN_OPS_LITTLE(2, 2, false, 2, 1, true)
+GEN_OPS_LITTLE(2, 2, false, 4, 1, true)
+GEN_OPS_LITTLE(2, 2, false, 8, 1, true)
+GEN_OPS_LITTLE(2, 2, false, 2, 2, true)
+GEN_OPS_LITTLE(2, 2, false, 4, 2, true)
+GEN_OPS_LITTLE(2, 2, false, 8, 2, true)
+GEN_OPS_LITTLE(2, 2, false, 4, 4, true)
+GEN_OPS_LITTLE(2, 2, false, 8, 4, true)
+GEN_OPS_LITTLE(2, 2, false, 8, 8, true)
+GEN_OPS_LITTLE(2, 2, false, 1, 1, false)
+GEN_OPS_LITTLE(2, 2, false, 2, 1, false)
+GEN_OPS_LITTLE(2, 2, false, 4, 1, false)
+GEN_OPS_LITTLE(2, 2, false, 8, 1, false)
+GEN_OPS_LITTLE(2, 2, false, 2, 2, false)
+GEN_OPS_LITTLE(2, 2, false, 4, 2, false)
+GEN_OPS_LITTLE(2, 2, false, 8, 2, false)
+GEN_OPS_LITTLE(2, 2, false, 4, 4, false)
+GEN_OPS_LITTLE(2, 2, false, 8, 4, false)
+GEN_OPS_LITTLE(2, 2, false, 8, 8, false)
+GEN_OPS_LITTLE(4, 2, false, 1, 1, true)
+GEN_OPS_LITTLE(4, 2, false, 2, 1, true)
+GEN_OPS_LITTLE(4, 2, false, 4, 1, true)
+GEN_OPS_LITTLE(4, 2, false, 8, 1, true)
+GEN_OPS_LITTLE(4, 2, false, 2, 2, true)
+GEN_OPS_LITTLE(4, 2, false, 4, 2, true)
+GEN_OPS_LITTLE(4, 2, false, 8, 2, true)
+GEN_OPS_LITTLE(4, 2, false, 4, 4, true)
+GEN_OPS_LITTLE(4, 2, false, 8, 4, true)
+GEN_OPS_LITTLE(4, 2, false, 8, 8, true)
+GEN_OPS_LITTLE(4, 2, false, 1, 1, false)
+GEN_OPS_LITTLE(4, 2, false, 2, 1, false)
+GEN_OPS_LITTLE(4, 2, false, 4, 1, false)
+GEN_OPS_LITTLE(4, 2, false, 8, 1, false)
+GEN_OPS_LITTLE(4, 2, false, 2, 2, false)
+GEN_OPS_LITTLE(4, 2, false, 4, 2, false)
+GEN_OPS_LITTLE(4, 2, false, 8, 2, false)
+GEN_OPS_LITTLE(4, 2, false, 4, 4, false)
+GEN_OPS_LITTLE(4, 2, false, 8, 4, false)
+GEN_OPS_LITTLE(4, 2, false, 8, 8, false)
+GEN_OPS_LITTLE(8, 2, false, 1, 1, true)
+GEN_OPS_LITTLE(8, 2, false, 2, 1, true)
+GEN_OPS_LITTLE(8, 2, false, 4, 1, true)
+GEN_OPS_LITTLE(8, 2, false, 8, 1, true)
+GEN_OPS_LITTLE(8, 2, false, 2, 2, true)
+GEN_OPS_LITTLE(8, 2, false, 4, 2, true)
+GEN_OPS_LITTLE(8, 2, false, 8, 2, true)
+GEN_OPS_LITTLE(8, 2, false, 4, 4, true)
+GEN_OPS_LITTLE(8, 2, false, 8, 4, true)
+GEN_OPS_LITTLE(8, 2, false, 8, 8, true)
+GEN_OPS_LITTLE(8, 2, false, 1, 1, false)
+GEN_OPS_LITTLE(8, 2, false, 2, 1, false)
+GEN_OPS_LITTLE(8, 2, false, 4, 1, false)
+GEN_OPS_LITTLE(8, 2, false, 8, 1, false)
+GEN_OPS_LITTLE(8, 2, false, 2, 2, false)
+GEN_OPS_LITTLE(8, 2, false, 4, 2, false)
+GEN_OPS_LITTLE(8, 2, false, 8, 2, false)
+GEN_OPS_LITTLE(8, 2, false, 4, 4, false)
+GEN_OPS_LITTLE(8, 2, false, 8, 4, false)
+GEN_OPS_LITTLE(8, 2, false, 8, 8, false)
+GEN_OPS_LITTLE(4, 4, false, 1, 1, true)
+GEN_OPS_LITTLE(4, 4, false, 2, 1, true)
+GEN_OPS_LITTLE(4, 4, false, 4, 1, true)
+GEN_OPS_LITTLE(4, 4, false, 8, 1, true)
+GEN_OPS_LITTLE(4, 4, false, 2, 2, true)
+GEN_OPS_LITTLE(4, 4, false, 4, 2, true)
+GEN_OPS_LITTLE(4, 4, false, 8, 2, true)
+GEN_OPS_LITTLE(4, 4, false, 4, 4, true)
+GEN_OPS_LITTLE(4, 4, false, 8, 4, true)
+GEN_OPS_LITTLE(4, 4, false, 8, 8, true)
+GEN_OPS_LITTLE(4, 4, false, 1, 1, false)
+GEN_OPS_LITTLE(4, 4, false, 2, 1, false)
+GEN_OPS_LITTLE(4, 4, false, 4, 1, false)
+GEN_OPS_LITTLE(4, 4, false, 8, 1, false)
+GEN_OPS_LITTLE(4, 4, false, 2, 2, false)
+GEN_OPS_LITTLE(4, 4, false, 4, 2, false)
+GEN_OPS_LITTLE(4, 4, false, 8, 2, false)
+GEN_OPS_LITTLE(4, 4, false, 4, 4, false)
+GEN_OPS_LITTLE(4, 4, false, 8, 4, false)
+GEN_OPS_LITTLE(4, 4, false, 8, 8, false)
+GEN_OPS_LITTLE(8, 4, false, 1, 1, true)
+GEN_OPS_LITTLE(8, 4, false, 2, 1, true)
+GEN_OPS_LITTLE(8, 4, false, 4, 1, true)
+GEN_OPS_LITTLE(8, 4, false, 8, 1, true)
+GEN_OPS_LITTLE(8, 4, false, 2, 2, true)
+GEN_OPS_LITTLE(8, 4, false, 4, 2, true)
+GEN_OPS_LITTLE(8, 4, false, 8, 2, true)
+GEN_OPS_LITTLE(8, 4, false, 4, 4, true)
+GEN_OPS_LITTLE(8, 4, false, 8, 4, true)
+GEN_OPS_LITTLE(8, 4, false, 8, 8, true)
+GEN_OPS_LITTLE(8, 4, false, 1, 1, false)
+GEN_OPS_LITTLE(8, 4, false, 2, 1, false)
+GEN_OPS_LITTLE(8, 4, false, 4, 1, false)
+GEN_OPS_LITTLE(8, 4, false, 8, 1, false)
+GEN_OPS_LITTLE(8, 4, false, 2, 2, false)
+GEN_OPS_LITTLE(8, 4, false, 4, 2, false)
+GEN_OPS_LITTLE(8, 4, false, 8, 2, false)
+GEN_OPS_LITTLE(8, 4, false, 4, 4, false)
+GEN_OPS_LITTLE(8, 4, false, 8, 4, false)
+GEN_OPS_LITTLE(8, 4, false, 8, 8, false)
+GEN_OPS_LITTLE(8, 8, false, 1, 1, true)
+GEN_OPS_LITTLE(8, 8, false, 2, 1, true)
+GEN_OPS_LITTLE(8, 8, false, 4, 1, true)
+GEN_OPS_LITTLE(8, 8, false, 8, 1, true)
+GEN_OPS_LITTLE(8, 8, false, 2, 2, true)
+GEN_OPS_LITTLE(8, 8, false, 4, 2, true)
+GEN_OPS_LITTLE(8, 8, false, 8, 2, true)
+GEN_OPS_LITTLE(8, 8, false, 4, 4, true)
+GEN_OPS_LITTLE(8, 8, false, 8, 4, true)
+GEN_OPS_LITTLE(8, 8, false, 8, 8, true)
+GEN_OPS_LITTLE(8, 8, false, 1, 1, false)
+GEN_OPS_LITTLE(8, 8, false, 2, 1, false)
+GEN_OPS_LITTLE(8, 8, false, 4, 1, false)
+GEN_OPS_LITTLE(8, 8, false, 8, 1, false)
+GEN_OPS_LITTLE(8, 8, false, 2, 2, false)
+GEN_OPS_LITTLE(8, 8, false, 4, 2, false)
+GEN_OPS_LITTLE(8, 8, false, 8, 2, false)
+GEN_OPS_LITTLE(8, 8, false, 4, 4, false)
+GEN_OPS_LITTLE(8, 8, false, 8, 4, false)
+GEN_OPS_LITTLE(8, 8, false, 8, 8, false)
+
+GEN_OPS_BIG(1, 1, true, 1, 1, true)
+GEN_OPS_BIG(1, 1, true, 2, 1, true)
+GEN_OPS_BIG(1, 1, true, 4, 1, true)
+GEN_OPS_BIG(1, 1, true, 8, 1, true)
+GEN_OPS_BIG(1, 1, true, 2, 2, true)
+GEN_OPS_BIG(1, 1, true, 4, 2, true)
+GEN_OPS_BIG(1, 1, true, 8, 2, true)
+GEN_OPS_BIG(1, 1, true, 4, 4, true)
+GEN_OPS_BIG(1, 1, true, 8, 4, true)
+GEN_OPS_BIG(1, 1, true, 8, 8, true)
+GEN_OPS_BIG(1, 1, true, 1, 1, false)
+GEN_OPS_BIG(1, 1, true, 2, 1, false)
+GEN_OPS_BIG(1, 1, true, 4, 1, false)
+GEN_OPS_BIG(1, 1, true, 8, 1, false)
+GEN_OPS_BIG(1, 1, true, 2, 2, false)
+GEN_OPS_BIG(1, 1, true, 4, 2, false)
+GEN_OPS_BIG(1, 1, true, 8, 2, false)
+GEN_OPS_BIG(1, 1, true, 4, 4, false)
+GEN_OPS_BIG(1, 1, true, 8, 4, false)
+GEN_OPS_BIG(1, 1, true, 8, 8, false)
+GEN_OPS_BIG(2, 1, true, 1, 1, true)
+GEN_OPS_BIG(2, 1, true, 2, 1, true)
+GEN_OPS_BIG(2, 1, true, 4, 1, true)
+GEN_OPS_BIG(2, 1, true, 8, 1, true)
+GEN_OPS_BIG(2, 1, true, 2, 2, true)
+GEN_OPS_BIG(2, 1, true, 4, 2, true)
+GEN_OPS_BIG(2, 1, true, 8, 2, true)
+GEN_OPS_BIG(2, 1, true, 4, 4, true)
+GEN_OPS_BIG(2, 1, true, 8, 4, true)
+GEN_OPS_BIG(2, 1, true, 8, 8, true)
+GEN_OPS_BIG(2, 1, true, 1, 1, false)
+GEN_OPS_BIG(2, 1, true, 2, 1, false)
+GEN_OPS_BIG(2, 1, true, 4, 1, false)
+GEN_OPS_BIG(2, 1, true, 8, 1, false)
+GEN_OPS_BIG(2, 1, true, 2, 2, false)
+GEN_OPS_BIG(2, 1, true, 4, 2, false)
+GEN_OPS_BIG(2, 1, true, 8, 2, false)
+GEN_OPS_BIG(2, 1, true, 4, 4, false)
+GEN_OPS_BIG(2, 1, true, 8, 4, false)
+GEN_OPS_BIG(2, 1, true, 8, 8, false)
+GEN_OPS_BIG(4, 1, true, 1, 1, true)
+GEN_OPS_BIG(4, 1, true, 2, 1, true)
+GEN_OPS_BIG(4, 1, true, 4, 1, true)
+GEN_OPS_BIG(4, 1, true, 8, 1, true)
+GEN_OPS_BIG(4, 1, true, 2, 2, true)
+GEN_OPS_BIG(4, 1, true, 4, 2, true)
+GEN_OPS_BIG(4, 1, true, 8, 2, true)
+GEN_OPS_BIG(4, 1, true, 4, 4, true)
+GEN_OPS_BIG(4, 1, true, 8, 4, true)
+GEN_OPS_BIG(4, 1, true, 8, 8, true)
+GEN_OPS_BIG(4, 1, true, 1, 1, false)
+GEN_OPS_BIG(4, 1, true, 2, 1, false)
+GEN_OPS_BIG(4, 1, true, 4, 1, false)
+GEN_OPS_BIG(4, 1, true, 8, 1, false)
+GEN_OPS_BIG(4, 1, true, 2, 2, false)
+GEN_OPS_BIG(4, 1, true, 4, 2, false)
+GEN_OPS_BIG(4, 1, true, 8, 2, false)
+GEN_OPS_BIG(4, 1, true, 4, 4, false)
+GEN_OPS_BIG(4, 1, true, 8, 4, false)
+GEN_OPS_BIG(4, 1, true, 8, 8, false)
+GEN_OPS_BIG(8, 1, true, 1, 1, true)
+GEN_OPS_BIG(8, 1, true, 2, 1, true)
+GEN_OPS_BIG(8, 1, true, 4, 1, true)
+GEN_OPS_BIG(8, 1, true, 8, 1, true)
+GEN_OPS_BIG(8, 1, true, 2, 2, true)
+GEN_OPS_BIG(8, 1, true, 4, 2, true)
+GEN_OPS_BIG(8, 1, true, 8, 2, true)
+GEN_OPS_BIG(8, 1, true, 4, 4, true)
+GEN_OPS_BIG(8, 1, true, 8, 4, true)
+GEN_OPS_BIG(8, 1, true, 8, 8, true)
+GEN_OPS_BIG(8, 1, true, 1, 1, false)
+GEN_OPS_BIG(8, 1, true, 2, 1, false)
+GEN_OPS_BIG(8, 1, true, 4, 1, false)
+GEN_OPS_BIG(8, 1, true, 8, 1, false)
+GEN_OPS_BIG(8, 1, true, 2, 2, false)
+GEN_OPS_BIG(8, 1, true, 4, 2, false)
+GEN_OPS_BIG(8, 1, true, 8, 2, false)
+GEN_OPS_BIG(8, 1, true, 4, 4, false)
+GEN_OPS_BIG(8, 1, true, 8, 4, false)
+GEN_OPS_BIG(8, 1, true, 8, 8, false)
+GEN_OPS_BIG(2, 2, true, 1, 1, true)
+GEN_OPS_BIG(2, 2, true, 2, 1, true)
+GEN_OPS_BIG(2, 2, true, 4, 1, true)
+GEN_OPS_BIG(2, 2, true, 8, 1, true)
+GEN_OPS_BIG(2, 2, true, 2, 2, true)
+GEN_OPS_BIG(2, 2, true, 4, 2, true)
+GEN_OPS_BIG(2, 2, true, 8, 2, true)
+GEN_OPS_BIG(2, 2, true, 4, 4, true)
+GEN_OPS_BIG(2, 2, true, 8, 4, true)
+GEN_OPS_BIG(2, 2, true, 8, 8, true)
+GEN_OPS_BIG(2, 2, true, 1, 1, false)
+GEN_OPS_BIG(2, 2, true, 2, 1, false)
+GEN_OPS_BIG(2, 2, true, 4, 1, false)
+GEN_OPS_BIG(2, 2, true, 8, 1, false)
+GEN_OPS_BIG(2, 2, true, 2, 2, false)
+GEN_OPS_BIG(2, 2, true, 4, 2, false)
+GEN_OPS_BIG(2, 2, true, 8, 2, false)
+GEN_OPS_BIG(2, 2, true, 4, 4, false)
+GEN_OPS_BIG(2, 2, true, 8, 4, false)
+GEN_OPS_BIG(2, 2, true, 8, 8, false)
+GEN_OPS_BIG(4, 2, true, 1, 1, true)
+GEN_OPS_BIG(4, 2, true, 2, 1, true)
+GEN_OPS_BIG(4, 2, true, 4, 1, true)
+GEN_OPS_BIG(4, 2, true, 8, 1, true)
+GEN_OPS_BIG(4, 2, true, 2, 2, true)
+GEN_OPS_BIG(4, 2, true, 4, 2, true)
+GEN_OPS_BIG(4, 2, true, 8, 2, true)
+GEN_OPS_BIG(4, 2, true, 4, 4, true)
+GEN_OPS_BIG(4, 2, true, 8, 4, true)
+GEN_OPS_BIG(4, 2, true, 8, 8, true)
+GEN_OPS_BIG(4, 2, true, 1, 1, false)
+GEN_OPS_BIG(4, 2, true, 2, 1, false)
+GEN_OPS_BIG(4, 2, true, 4, 1, false)
+GEN_OPS_BIG(4, 2, true, 8, 1, false)
+GEN_OPS_BIG(4, 2, true, 2, 2, false)
+GEN_OPS_BIG(4, 2, true, 4, 2, false)
+GEN_OPS_BIG(4, 2, true, 8, 2, false)
+GEN_OPS_BIG(4, 2, true, 4, 4, false)
+GEN_OPS_BIG(4, 2, true, 8, 4, false)
+GEN_OPS_BIG(4, 2, true, 8, 8, false)
+GEN_OPS_BIG(8, 2, true, 1, 1, true)
+GEN_OPS_BIG(8, 2, true, 2, 1, true)
+GEN_OPS_BIG(8, 2, true, 4, 1, true)
+GEN_OPS_BIG(8, 2, true, 8, 1, true)
+GEN_OPS_BIG(8, 2, true, 2, 2, true)
+GEN_OPS_BIG(8, 2, true, 4, 2, true)
+GEN_OPS_BIG(8, 2, true, 8, 2, true)
+GEN_OPS_BIG(8, 2, true, 4, 4, true)
+GEN_OPS_BIG(8, 2, true, 8, 4, true)
+GEN_OPS_BIG(8, 2, true, 8, 8, true)
+GEN_OPS_BIG(8, 2, true, 1, 1, false)
+GEN_OPS_BIG(8, 2, true, 2, 1, false)
+GEN_OPS_BIG(8, 2, true, 4, 1, false)
+GEN_OPS_BIG(8, 2, true, 8, 1, false)
+GEN_OPS_BIG(8, 2, true, 2, 2, false)
+GEN_OPS_BIG(8, 2, true, 4, 2, false)
+GEN_OPS_BIG(8, 2, true, 8, 2, false)
+GEN_OPS_BIG(8, 2, true, 4, 4, false)
+GEN_OPS_BIG(8, 2, true, 8, 4, false)
+GEN_OPS_BIG(8, 2, true, 8, 8, false)
+GEN_OPS_BIG(4, 4, true, 1, 1, true)
+GEN_OPS_BIG(4, 4, true, 2, 1, true)
+GEN_OPS_BIG(4, 4, true, 4, 1, true)
+GEN_OPS_BIG(4, 4, true, 8, 1, true)
+GEN_OPS_BIG(4, 4, true, 2, 2, true)
+GEN_OPS_BIG(4, 4, true, 4, 2, true)
+GEN_OPS_BIG(4, 4, true, 8, 2, true)
+GEN_OPS_BIG(4, 4, true, 4, 4, true)
+GEN_OPS_BIG(4, 4, true, 8, 4, true)
+GEN_OPS_BIG(4, 4, true, 8, 8, true)
+GEN_OPS_BIG(4, 4, true, 1, 1, false)
+GEN_OPS_BIG(4, 4, true, 2, 1, false)
+GEN_OPS_BIG(4, 4, true, 4, 1, false)
+GEN_OPS_BIG(4, 4, true, 8, 1, false)
+GEN_OPS_BIG(4, 4, true, 2, 2, false)
+GEN_OPS_BIG(4, 4, true, 4, 2, false)
+GEN_OPS_BIG(4, 4, true, 8, 2, false)
+GEN_OPS_BIG(4, 4, true, 4, 4, false)
+GEN_OPS_BIG(4, 4, true, 8, 4, false)
+GEN_OPS_BIG(4, 4, true, 8, 8, false)
+GEN_OPS_BIG(8, 4, true, 1, 1, true)
+GEN_OPS_BIG(8, 4, true, 2, 1, true)
+GEN_OPS_BIG(8, 4, true, 4, 1, true)
+GEN_OPS_BIG(8, 4, true, 8, 1, true)
+GEN_OPS_BIG(8, 4, true, 2, 2, true)
+GEN_OPS_BIG(8, 4, true, 4, 2, true)
+GEN_OPS_BIG(8, 4, true, 8, 2, true)
+GEN_OPS_BIG(8, 4, true, 4, 4, true)
+GEN_OPS_BIG(8, 4, true, 8, 4, true)
+GEN_OPS_BIG(8, 4, true, 8, 8, true)
+GEN_OPS_BIG(8, 4, true, 1, 1, false)
+GEN_OPS_BIG(8, 4, true, 2, 1, false)
+GEN_OPS_BIG(8, 4, true, 4, 1, false)
+GEN_OPS_BIG(8, 4, true, 8, 1, false)
+GEN_OPS_BIG(8, 4, true, 2, 2, false)
+GEN_OPS_BIG(8, 4, true, 4, 2, false)
+GEN_OPS_BIG(8, 4, true, 8, 2, false)
+GEN_OPS_BIG(8, 4, true, 4, 4, false)
+GEN_OPS_BIG(8, 4, true, 8, 4, false)
+GEN_OPS_BIG(8, 4, true, 8, 8, false)
+GEN_OPS_BIG(8, 8, true, 1, 1, true)
+GEN_OPS_BIG(8, 8, true, 2, 1, true)
+GEN_OPS_BIG(8, 8, true, 4, 1, true)
+GEN_OPS_BIG(8, 8, true, 8, 1, true)
+GEN_OPS_BIG(8, 8, true, 2, 2, true)
+GEN_OPS_BIG(8, 8, true, 4, 2, true)
+GEN_OPS_BIG(8, 8, true, 8, 2, true)
+GEN_OPS_BIG(8, 8, true, 4, 4, true)
+GEN_OPS_BIG(8, 8, true, 8, 4, true)
+GEN_OPS_BIG(8, 8, true, 8, 8, true)
+GEN_OPS_BIG(8, 8, true, 1, 1, false)
+GEN_OPS_BIG(8, 8, true, 2, 1, false)
+GEN_OPS_BIG(8, 8, true, 4, 1, false)
+GEN_OPS_BIG(8, 8, true, 8, 1, false)
+GEN_OPS_BIG(8, 8, true, 2, 2, false)
+GEN_OPS_BIG(8, 8, true, 4, 2, false)
+GEN_OPS_BIG(8, 8, true, 8, 2, false)
+GEN_OPS_BIG(8, 8, true, 4, 4, false)
+GEN_OPS_BIG(8, 8, true, 8, 4, false)
+GEN_OPS_BIG(8, 8, true, 8, 8, false)
+GEN_OPS_BIG(1, 1, false, 1, 1, true)
+GEN_OPS_BIG(1, 1, false, 2, 1, true)
+GEN_OPS_BIG(1, 1, false, 4, 1, true)
+GEN_OPS_BIG(1, 1, false, 8, 1, true)
+GEN_OPS_BIG(1, 1, false, 2, 2, true)
+GEN_OPS_BIG(1, 1, false, 4, 2, true)
+GEN_OPS_BIG(1, 1, false, 8, 2, true)
+GEN_OPS_BIG(1, 1, false, 4, 4, true)
+GEN_OPS_BIG(1, 1, false, 8, 4, true)
+GEN_OPS_BIG(1, 1, false, 8, 8, true)
+GEN_OPS_BIG(1, 1, false, 1, 1, false)
+GEN_OPS_BIG(1, 1, false, 2, 1, false)
+GEN_OPS_BIG(1, 1, false, 4, 1, false)
+GEN_OPS_BIG(1, 1, false, 8, 1, false)
+GEN_OPS_BIG(1, 1, false, 2, 2, false)
+GEN_OPS_BIG(1, 1, false, 4, 2, false)
+GEN_OPS_BIG(1, 1, false, 8, 2, false)
+GEN_OPS_BIG(1, 1, false, 4, 4, false)
+GEN_OPS_BIG(1, 1, false, 8, 4, false)
+GEN_OPS_BIG(1, 1, false, 8, 8, false)
+GEN_OPS_BIG(2, 1, false, 1, 1, true)
+GEN_OPS_BIG(2, 1, false, 2, 1, true)
+GEN_OPS_BIG(2, 1, false, 4, 1, true)
+GEN_OPS_BIG(2, 1, false, 8, 1, true)
+GEN_OPS_BIG(2, 1, false, 2, 2, true)
+GEN_OPS_BIG(2, 1, false, 4, 2, true)
+GEN_OPS_BIG(2, 1, false, 8, 2, true)
+GEN_OPS_BIG(2, 1, false, 4, 4, true)
+GEN_OPS_BIG(2, 1, false, 8, 4, true)
+GEN_OPS_BIG(2, 1, false, 8, 8, true)
+GEN_OPS_BIG(2, 1, false, 1, 1, false)
+GEN_OPS_BIG(2, 1, false, 2, 1, false)
+GEN_OPS_BIG(2, 1, false, 4, 1, false)
+GEN_OPS_BIG(2, 1, false, 8, 1, false)
+GEN_OPS_BIG(2, 1, false, 2, 2, false)
+GEN_OPS_BIG(2, 1, false, 4, 2, false)
+GEN_OPS_BIG(2, 1, false, 8, 2, false)
+GEN_OPS_BIG(2, 1, false, 4, 4, false)
+GEN_OPS_BIG(2, 1, false, 8, 4, false)
+GEN_OPS_BIG(2, 1, false, 8, 8, false)
+GEN_OPS_BIG(4, 1, false, 1, 1, true)
+GEN_OPS_BIG(4, 1, false, 2, 1, true)
+GEN_OPS_BIG(4, 1, false, 4, 1, true)
+GEN_OPS_BIG(4, 1, false, 8, 1, true)
+GEN_OPS_BIG(4, 1, false, 2, 2, true)
+GEN_OPS_BIG(4, 1, false, 4, 2, true)
+GEN_OPS_BIG(4, 1, false, 8, 2, true)
+GEN_OPS_BIG(4, 1, false, 4, 4, true)
+GEN_OPS_BIG(4, 1, false, 8, 4, true)
+GEN_OPS_BIG(4, 1, false, 8, 8, true)
+GEN_OPS_BIG(4, 1, false, 1, 1, false)
+GEN_OPS_BIG(4, 1, false, 2, 1, false)
+GEN_OPS_BIG(4, 1, false, 4, 1, false)
+GEN_OPS_BIG(4, 1, false, 8, 1, false)
+GEN_OPS_BIG(4, 1, false, 2, 2, false)
+GEN_OPS_BIG(4, 1, false, 4, 2, false)
+GEN_OPS_BIG(4, 1, false, 8, 2, false)
+GEN_OPS_BIG(4, 1, false, 4, 4, false)
+GEN_OPS_BIG(4, 1, false, 8, 4, false)
+GEN_OPS_BIG(4, 1, false, 8, 8, false)
+GEN_OPS_BIG(8, 1, false, 1, 1, true)
+GEN_OPS_BIG(8, 1, false, 2, 1, true)
+GEN_OPS_BIG(8, 1, false, 4, 1, true)
+GEN_OPS_BIG(8, 1, false, 8, 1, true)
+GEN_OPS_BIG(8, 1, false, 2, 2, true)
+GEN_OPS_BIG(8, 1, false, 4, 2, true)
+GEN_OPS_BIG(8, 1, false, 8, 2, true)
+GEN_OPS_BIG(8, 1, false, 4, 4, true)
+GEN_OPS_BIG(8, 1, false, 8, 4, true)
+GEN_OPS_BIG(8, 1, false, 8, 8, true)
+GEN_OPS_BIG(8, 1, false, 1, 1, false)
+GEN_OPS_BIG(8, 1, false, 2, 1, false)
+GEN_OPS_BIG(8, 1, false, 4, 1, false)
+GEN_OPS_BIG(8, 1, false, 8, 1, false)
+GEN_OPS_BIG(8, 1, false, 2, 2, false)
+GEN_OPS_BIG(8, 1, false, 4, 2, false)
+GEN_OPS_BIG(8, 1, false, 8, 2, false)
+GEN_OPS_BIG(8, 1, false, 4, 4, false)
+GEN_OPS_BIG(8, 1, false, 8, 4, false)
+GEN_OPS_BIG(8, 1, false, 8, 8, false)
+GEN_OPS_BIG(2, 2, false, 1, 1, true)
+GEN_OPS_BIG(2, 2, false, 2, 1, true)
+GEN_OPS_BIG(2, 2, false, 4, 1, true)
+GEN_OPS_BIG(2, 2, false, 8, 1, true)
+GEN_OPS_BIG(2, 2, false, 2, 2, true)
+GEN_OPS_BIG(2, 2, false, 4, 2, true)
+GEN_OPS_BIG(2, 2, false, 8, 2, true)
+GEN_OPS_BIG(2, 2, false, 4, 4, true)
+GEN_OPS_BIG(2, 2, false, 8, 4, true)
+GEN_OPS_BIG(2, 2, false, 8, 8, true)
+GEN_OPS_BIG(2, 2, false, 1, 1, false)
+GEN_OPS_BIG(2, 2, false, 2, 1, false)
+GEN_OPS_BIG(2, 2, false, 4, 1, false)
+GEN_OPS_BIG(2, 2, false, 8, 1, false)
+GEN_OPS_BIG(2, 2, false, 2, 2, false)
+GEN_OPS_BIG(2, 2, false, 4, 2, false)
+GEN_OPS_BIG(2, 2, false, 8, 2, false)
+GEN_OPS_BIG(2, 2, false, 4, 4, false)
+GEN_OPS_BIG(2, 2, false, 8, 4, false)
+GEN_OPS_BIG(2, 2, false, 8, 8, false)
+GEN_OPS_BIG(4, 2, false, 1, 1, true)
+GEN_OPS_BIG(4, 2, false, 2, 1, true)
+GEN_OPS_BIG(4, 2, false, 4, 1, true)
+GEN_OPS_BIG(4, 2, false, 8, 1, true)
+GEN_OPS_BIG(4, 2, false, 2, 2, true)
+GEN_OPS_BIG(4, 2, false, 4, 2, true)
+GEN_OPS_BIG(4, 2, false, 8, 2, true)
+GEN_OPS_BIG(4, 2, false, 4, 4, true)
+GEN_OPS_BIG(4, 2, false, 8, 4, true)
+GEN_OPS_BIG(4, 2, false, 8, 8, true)
+GEN_OPS_BIG(4, 2, false, 1, 1, false)
+GEN_OPS_BIG(4, 2, false, 2, 1, false)
+GEN_OPS_BIG(4, 2, false, 4, 1, false)
+GEN_OPS_BIG(4, 2, false, 8, 1, false)
+GEN_OPS_BIG(4, 2, false, 2, 2, false)
+GEN_OPS_BIG(4, 2, false, 4, 2, false)
+GEN_OPS_BIG(4, 2, false, 8, 2, false)
+GEN_OPS_BIG(4, 2, false, 4, 4, false)
+GEN_OPS_BIG(4, 2, false, 8, 4, false)
+GEN_OPS_BIG(4, 2, false, 8, 8, false)
+GEN_OPS_BIG(8, 2, false, 1, 1, true)
+GEN_OPS_BIG(8, 2, false, 2, 1, true)
+GEN_OPS_BIG(8, 2, false, 4, 1, true)
+GEN_OPS_BIG(8, 2, false, 8, 1, true)
+GEN_OPS_BIG(8, 2, false, 2, 2, true)
+GEN_OPS_BIG(8, 2, false, 4, 2, true)
+GEN_OPS_BIG(8, 2, false, 8, 2, true)
+GEN_OPS_BIG(8, 2, false, 4, 4, true)
+GEN_OPS_BIG(8, 2, false, 8, 4, true)
+GEN_OPS_BIG(8, 2, false, 8, 8, true)
+GEN_OPS_BIG(8, 2, false, 1, 1, false)
+GEN_OPS_BIG(8, 2, false, 2, 1, false)
+GEN_OPS_BIG(8, 2, false, 4, 1, false)
+GEN_OPS_BIG(8, 2, false, 8, 1, false)
+GEN_OPS_BIG(8, 2, false, 2, 2, false)
+GEN_OPS_BIG(8, 2, false, 4, 2, false)
+GEN_OPS_BIG(8, 2, false, 8, 2, false)
+GEN_OPS_BIG(8, 2, false, 4, 4, false)
+GEN_OPS_BIG(8, 2, false, 8, 4, false)
+GEN_OPS_BIG(8, 2, false, 8, 8, false)
+GEN_OPS_BIG(4, 4, false, 1, 1, true)
+GEN_OPS_BIG(4, 4, false, 2, 1, true)
+GEN_OPS_BIG(4, 4, false, 4, 1, true)
+GEN_OPS_BIG(4, 4, false, 8, 1, true)
+GEN_OPS_BIG(4, 4, false, 2, 2, true)
+GEN_OPS_BIG(4, 4, false, 4, 2, true)
+GEN_OPS_BIG(4, 4, false, 8, 2, true)
+GEN_OPS_BIG(4, 4, false, 4, 4, true)
+GEN_OPS_BIG(4, 4, false, 8, 4, true)
+GEN_OPS_BIG(4, 4, false, 8, 8, true)
+GEN_OPS_BIG(4, 4, false, 1, 1, false)
+GEN_OPS_BIG(4, 4, false, 2, 1, false)
+GEN_OPS_BIG(4, 4, false, 4, 1, false)
+GEN_OPS_BIG(4, 4, false, 8, 1, false)
+GEN_OPS_BIG(4, 4, false, 2, 2, false)
+GEN_OPS_BIG(4, 4, false, 4, 2, false)
+GEN_OPS_BIG(4, 4, false, 8, 2, false)
+GEN_OPS_BIG(4, 4, false, 4, 4, false)
+GEN_OPS_BIG(4, 4, false, 8, 4, false)
+GEN_OPS_BIG(4, 4, false, 8, 8, false)
+GEN_OPS_BIG(8, 4, false, 1, 1, true)
+GEN_OPS_BIG(8, 4, false, 2, 1, true)
+GEN_OPS_BIG(8, 4, false, 4, 1, true)
+GEN_OPS_BIG(8, 4, false, 8, 1, true)
+GEN_OPS_BIG(8, 4, false, 2, 2, true)
+GEN_OPS_BIG(8, 4, false, 4, 2, true)
+GEN_OPS_BIG(8, 4, false, 8, 2, true)
+GEN_OPS_BIG(8, 4, false, 4, 4, true)
+GEN_OPS_BIG(8, 4, false, 8, 4, true)
+GEN_OPS_BIG(8, 4, false, 8, 8, true)
+GEN_OPS_BIG(8, 4, false, 1, 1, false)
+GEN_OPS_BIG(8, 4, false, 2, 1, false)
+GEN_OPS_BIG(8, 4, false, 4, 1, false)
+GEN_OPS_BIG(8, 4, false, 8, 1, false)
+GEN_OPS_BIG(8, 4, false, 2, 2, false)
+GEN_OPS_BIG(8, 4, false, 4, 2, false)
+GEN_OPS_BIG(8, 4, false, 8, 2, false)
+GEN_OPS_BIG(8, 4, false, 4, 4, false)
+GEN_OPS_BIG(8, 4, false, 8, 4, false)
+GEN_OPS_BIG(8, 4, false, 8, 8, false)
+GEN_OPS_BIG(8, 8, false, 1, 1, true)
+GEN_OPS_BIG(8, 8, false, 2, 1, true)
+GEN_OPS_BIG(8, 8, false, 4, 1, true)
+GEN_OPS_BIG(8, 8, false, 8, 1, true)
+GEN_OPS_BIG(8, 8, false, 2, 2, true)
+GEN_OPS_BIG(8, 8, false, 4, 2, true)
+GEN_OPS_BIG(8, 8, false, 8, 2, true)
+GEN_OPS_BIG(8, 8, false, 4, 4, true)
+GEN_OPS_BIG(8, 8, false, 8, 4, true)
+GEN_OPS_BIG(8, 8, false, 8, 8, true)
+GEN_OPS_BIG(8, 8, false, 1, 1, false)
+GEN_OPS_BIG(8, 8, false, 2, 1, false)
+GEN_OPS_BIG(8, 8, false, 4, 1, false)
+GEN_OPS_BIG(8, 8, false, 8, 1, false)
+GEN_OPS_BIG(8, 8, false, 2, 2, false)
+GEN_OPS_BIG(8, 8, false, 4, 2, false)
+GEN_OPS_BIG(8, 8, false, 8, 2, false)
+GEN_OPS_BIG(8, 8, false, 4, 4, false)
+GEN_OPS_BIG(8, 8, false, 8, 4, false)
+GEN_OPS_BIG(8, 8, false, 8, 8, false)
+
+const MemoryRegionOps ops_list_little_b_valid[] = {
+ NAME_OPS_LITTLE(1, 1, true, 1, 1, true),
+ NAME_OPS_LITTLE(1, 1, true, 2, 1, true),
+ NAME_OPS_LITTLE(1, 1, true, 4, 1, true),
+ NAME_OPS_LITTLE(1, 1, true, 8, 1, true),
+ NAME_OPS_LITTLE(1, 1, true, 2, 2, true),
+ NAME_OPS_LITTLE(1, 1, true, 4, 2, true),
+ NAME_OPS_LITTLE(1, 1, true, 8, 2, true),
+ NAME_OPS_LITTLE(1, 1, true, 4, 4, true),
+ NAME_OPS_LITTLE(1, 1, true, 8, 4, true),
+ NAME_OPS_LITTLE(1, 1, true, 8, 8, true),
+ NAME_OPS_LITTLE(1, 1, true, 1, 1, false),
+ NAME_OPS_LITTLE(1, 1, true, 2, 1, false),
+ NAME_OPS_LITTLE(1, 1, true, 4, 1, false),
+ NAME_OPS_LITTLE(1, 1, true, 8, 1, false),
+ NAME_OPS_LITTLE(1, 1, true, 2, 2, false),
+ NAME_OPS_LITTLE(1, 1, true, 4, 2, false),
+ NAME_OPS_LITTLE(1, 1, true, 8, 2, false),
+ NAME_OPS_LITTLE(1, 1, true, 4, 4, false),
+ NAME_OPS_LITTLE(1, 1, true, 8, 4, false),
+ NAME_OPS_LITTLE(1, 1, true, 8, 8, false),
+ NAME_OPS_LITTLE(2, 1, true, 1, 1, true),
+ NAME_OPS_LITTLE(2, 1, true, 2, 1, true),
+ NAME_OPS_LITTLE(2, 1, true, 4, 1, true),
+ NAME_OPS_LITTLE(2, 1, true, 8, 1, true),
+ NAME_OPS_LITTLE(2, 1, true, 2, 2, true),
+ NAME_OPS_LITTLE(2, 1, true, 4, 2, true),
+ NAME_OPS_LITTLE(2, 1, true, 8, 2, true),
+ NAME_OPS_LITTLE(2, 1, true, 4, 4, true),
+ NAME_OPS_LITTLE(2, 1, true, 8, 4, true),
+ NAME_OPS_LITTLE(2, 1, true, 8, 8, true),
+ NAME_OPS_LITTLE(2, 1, true, 1, 1, false),
+ NAME_OPS_LITTLE(2, 1, true, 2, 1, false),
+ NAME_OPS_LITTLE(2, 1, true, 4, 1, false),
+ NAME_OPS_LITTLE(2, 1, true, 8, 1, false),
+ NAME_OPS_LITTLE(2, 1, true, 2, 2, false),
+ NAME_OPS_LITTLE(2, 1, true, 4, 2, false),
+ NAME_OPS_LITTLE(2, 1, true, 8, 2, false),
+ NAME_OPS_LITTLE(2, 1, true, 4, 4, false),
+ NAME_OPS_LITTLE(2, 1, true, 8, 4, false),
+ NAME_OPS_LITTLE(2, 1, true, 8, 8, false),
+ NAME_OPS_LITTLE(4, 1, true, 1, 1, true),
+ NAME_OPS_LITTLE(4, 1, true, 2, 1, true),
+ NAME_OPS_LITTLE(4, 1, true, 4, 1, true),
+ NAME_OPS_LITTLE(4, 1, true, 8, 1, true),
+ NAME_OPS_LITTLE(4, 1, true, 2, 2, true),
+ NAME_OPS_LITTLE(4, 1, true, 4, 2, true),
+ NAME_OPS_LITTLE(4, 1, true, 8, 2, true),
+ NAME_OPS_LITTLE(4, 1, true, 4, 4, true),
+ NAME_OPS_LITTLE(4, 1, true, 8, 4, true),
+ NAME_OPS_LITTLE(4, 1, true, 8, 8, true),
+ NAME_OPS_LITTLE(4, 1, true, 1, 1, false),
+ NAME_OPS_LITTLE(4, 1, true, 2, 1, false),
+ NAME_OPS_LITTLE(4, 1, true, 4, 1, false),
+ NAME_OPS_LITTLE(4, 1, true, 8, 1, false),
+ NAME_OPS_LITTLE(4, 1, true, 2, 2, false),
+ NAME_OPS_LITTLE(4, 1, true, 4, 2, false),
+ NAME_OPS_LITTLE(4, 1, true, 8, 2, false),
+ NAME_OPS_LITTLE(4, 1, true, 4, 4, false),
+ NAME_OPS_LITTLE(4, 1, true, 8, 4, false),
+ NAME_OPS_LITTLE(4, 1, true, 8, 8, false),
+ NAME_OPS_LITTLE(8, 1, true, 1, 1, true),
+ NAME_OPS_LITTLE(8, 1, true, 2, 1, true),
+ NAME_OPS_LITTLE(8, 1, true, 4, 1, true),
+ NAME_OPS_LITTLE(8, 1, true, 8, 1, true),
+ NAME_OPS_LITTLE(8, 1, true, 2, 2, true),
+ NAME_OPS_LITTLE(8, 1, true, 4, 2, true),
+ NAME_OPS_LITTLE(8, 1, true, 8, 2, true),
+ NAME_OPS_LITTLE(8, 1, true, 4, 4, true),
+ NAME_OPS_LITTLE(8, 1, true, 8, 4, true),
+ NAME_OPS_LITTLE(8, 1, true, 8, 8, true),
+ NAME_OPS_LITTLE(8, 1, true, 1, 1, false),
+ NAME_OPS_LITTLE(8, 1, true, 2, 1, false),
+ NAME_OPS_LITTLE(8, 1, true, 4, 1, false),
+ NAME_OPS_LITTLE(8, 1, true, 8, 1, false),
+ NAME_OPS_LITTLE(8, 1, true, 2, 2, false),
+ NAME_OPS_LITTLE(8, 1, true, 4, 2, false),
+ NAME_OPS_LITTLE(8, 1, true, 8, 2, false),
+ NAME_OPS_LITTLE(8, 1, true, 4, 4, false),
+ NAME_OPS_LITTLE(8, 1, true, 8, 4, false),
+ NAME_OPS_LITTLE(8, 1, true, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_little_b_invalid[] = {
+ NAME_OPS_LITTLE(1, 1, false, 1, 1, true),
+ NAME_OPS_LITTLE(1, 1, false, 2, 1, true),
+ NAME_OPS_LITTLE(1, 1, false, 4, 1, true),
+ NAME_OPS_LITTLE(1, 1, false, 8, 1, true),
+ NAME_OPS_LITTLE(1, 1, false, 2, 2, true),
+ NAME_OPS_LITTLE(1, 1, false, 4, 2, true),
+ NAME_OPS_LITTLE(1, 1, false, 8, 2, true),
+ NAME_OPS_LITTLE(1, 1, false, 4, 4, true),
+ NAME_OPS_LITTLE(1, 1, false, 8, 4, true),
+ NAME_OPS_LITTLE(1, 1, false, 8, 8, true),
+ NAME_OPS_LITTLE(1, 1, false, 1, 1, false),
+ NAME_OPS_LITTLE(1, 1, false, 2, 1, false),
+ NAME_OPS_LITTLE(1, 1, false, 4, 1, false),
+ NAME_OPS_LITTLE(1, 1, false, 8, 1, false),
+ NAME_OPS_LITTLE(1, 1, false, 2, 2, false),
+ NAME_OPS_LITTLE(1, 1, false, 4, 2, false),
+ NAME_OPS_LITTLE(1, 1, false, 8, 2, false),
+ NAME_OPS_LITTLE(1, 1, false, 4, 4, false),
+ NAME_OPS_LITTLE(1, 1, false, 8, 4, false),
+ NAME_OPS_LITTLE(1, 1, false, 8, 8, false),
+ NAME_OPS_LITTLE(2, 1, false, 1, 1, true),
+ NAME_OPS_LITTLE(2, 1, false, 2, 1, true),
+ NAME_OPS_LITTLE(2, 1, false, 4, 1, true),
+ NAME_OPS_LITTLE(2, 1, false, 8, 1, true),
+ NAME_OPS_LITTLE(2, 1, false, 2, 2, true),
+ NAME_OPS_LITTLE(2, 1, false, 4, 2, true),
+ NAME_OPS_LITTLE(2, 1, false, 8, 2, true),
+ NAME_OPS_LITTLE(2, 1, false, 4, 4, true),
+ NAME_OPS_LITTLE(2, 1, false, 8, 4, true),
+ NAME_OPS_LITTLE(2, 1, false, 8, 8, true),
+ NAME_OPS_LITTLE(2, 1, false, 1, 1, false),
+ NAME_OPS_LITTLE(2, 1, false, 2, 1, false),
+ NAME_OPS_LITTLE(2, 1, false, 4, 1, false),
+ NAME_OPS_LITTLE(2, 1, false, 8, 1, false),
+ NAME_OPS_LITTLE(2, 1, false, 2, 2, false),
+ NAME_OPS_LITTLE(2, 1, false, 4, 2, false),
+ NAME_OPS_LITTLE(2, 1, false, 8, 2, false),
+ NAME_OPS_LITTLE(2, 1, false, 4, 4, false),
+ NAME_OPS_LITTLE(2, 1, false, 8, 4, false),
+ NAME_OPS_LITTLE(2, 1, false, 8, 8, false),
+ NAME_OPS_LITTLE(4, 1, false, 1, 1, true),
+ NAME_OPS_LITTLE(4, 1, false, 2, 1, true),
+ NAME_OPS_LITTLE(4, 1, false, 4, 1, true),
+ NAME_OPS_LITTLE(4, 1, false, 8, 1, true),
+ NAME_OPS_LITTLE(4, 1, false, 2, 2, true),
+ NAME_OPS_LITTLE(4, 1, false, 4, 2, true),
+ NAME_OPS_LITTLE(4, 1, false, 8, 2, true),
+ NAME_OPS_LITTLE(4, 1, false, 4, 4, true),
+ NAME_OPS_LITTLE(4, 1, false, 8, 4, true),
+ NAME_OPS_LITTLE(4, 1, false, 8, 8, true),
+ NAME_OPS_LITTLE(4, 1, false, 1, 1, false),
+ NAME_OPS_LITTLE(4, 1, false, 2, 1, false),
+ NAME_OPS_LITTLE(4, 1, false, 4, 1, false),
+ NAME_OPS_LITTLE(4, 1, false, 8, 1, false),
+ NAME_OPS_LITTLE(4, 1, false, 2, 2, false),
+ NAME_OPS_LITTLE(4, 1, false, 4, 2, false),
+ NAME_OPS_LITTLE(4, 1, false, 8, 2, false),
+ NAME_OPS_LITTLE(4, 1, false, 4, 4, false),
+ NAME_OPS_LITTLE(4, 1, false, 8, 4, false),
+ NAME_OPS_LITTLE(4, 1, false, 8, 8, false),
+ NAME_OPS_LITTLE(8, 1, false, 1, 1, true),
+ NAME_OPS_LITTLE(8, 1, false, 2, 1, true),
+ NAME_OPS_LITTLE(8, 1, false, 4, 1, true),
+ NAME_OPS_LITTLE(8, 1, false, 8, 1, true),
+ NAME_OPS_LITTLE(8, 1, false, 2, 2, true),
+ NAME_OPS_LITTLE(8, 1, false, 4, 2, true),
+ NAME_OPS_LITTLE(8, 1, false, 8, 2, true),
+ NAME_OPS_LITTLE(8, 1, false, 4, 4, true),
+ NAME_OPS_LITTLE(8, 1, false, 8, 4, true),
+ NAME_OPS_LITTLE(8, 1, false, 8, 8, true),
+ NAME_OPS_LITTLE(8, 1, false, 1, 1, false),
+ NAME_OPS_LITTLE(8, 1, false, 2, 1, false),
+ NAME_OPS_LITTLE(8, 1, false, 4, 1, false),
+ NAME_OPS_LITTLE(8, 1, false, 8, 1, false),
+ NAME_OPS_LITTLE(8, 1, false, 2, 2, false),
+ NAME_OPS_LITTLE(8, 1, false, 4, 2, false),
+ NAME_OPS_LITTLE(8, 1, false, 8, 2, false),
+ NAME_OPS_LITTLE(8, 1, false, 4, 4, false),
+ NAME_OPS_LITTLE(8, 1, false, 8, 4, false),
+ NAME_OPS_LITTLE(8, 1, false, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_little_w_valid[] = {
+ NAME_OPS_LITTLE(2, 2, true, 1, 1, true),
+ NAME_OPS_LITTLE(2, 2, true, 2, 1, true),
+ NAME_OPS_LITTLE(2, 2, true, 4, 1, true),
+ NAME_OPS_LITTLE(2, 2, true, 8, 1, true),
+ NAME_OPS_LITTLE(2, 2, true, 2, 2, true),
+ NAME_OPS_LITTLE(2, 2, true, 4, 2, true),
+ NAME_OPS_LITTLE(2, 2, true, 8, 2, true),
+ NAME_OPS_LITTLE(2, 2, true, 4, 4, true),
+ NAME_OPS_LITTLE(2, 2, true, 8, 4, true),
+ NAME_OPS_LITTLE(2, 2, true, 8, 8, true),
+ NAME_OPS_LITTLE(2, 2, true, 1, 1, false),
+ NAME_OPS_LITTLE(2, 2, true, 2, 1, false),
+ NAME_OPS_LITTLE(2, 2, true, 4, 1, false),
+ NAME_OPS_LITTLE(2, 2, true, 8, 1, false),
+ NAME_OPS_LITTLE(2, 2, true, 2, 2, false),
+ NAME_OPS_LITTLE(2, 2, true, 4, 2, false),
+ NAME_OPS_LITTLE(2, 2, true, 8, 2, false),
+ NAME_OPS_LITTLE(2, 2, true, 4, 4, false),
+ NAME_OPS_LITTLE(2, 2, true, 8, 4, false),
+ NAME_OPS_LITTLE(2, 2, true, 8, 8, false),
+ NAME_OPS_LITTLE(4, 2, true, 1, 1, true),
+ NAME_OPS_LITTLE(4, 2, true, 2, 1, true),
+ NAME_OPS_LITTLE(4, 2, true, 4, 1, true),
+ NAME_OPS_LITTLE(4, 2, true, 8, 1, true),
+ NAME_OPS_LITTLE(4, 2, true, 2, 2, true),
+ NAME_OPS_LITTLE(4, 2, true, 4, 2, true),
+ NAME_OPS_LITTLE(4, 2, true, 8, 2, true),
+ NAME_OPS_LITTLE(4, 2, true, 4, 4, true),
+ NAME_OPS_LITTLE(4, 2, true, 8, 4, true),
+ NAME_OPS_LITTLE(4, 2, true, 8, 8, true),
+ NAME_OPS_LITTLE(4, 2, true, 1, 1, false),
+ NAME_OPS_LITTLE(4, 2, true, 2, 1, false),
+ NAME_OPS_LITTLE(4, 2, true, 4, 1, false),
+ NAME_OPS_LITTLE(4, 2, true, 8, 1, false),
+ NAME_OPS_LITTLE(4, 2, true, 2, 2, false),
+ NAME_OPS_LITTLE(4, 2, true, 4, 2, false),
+ NAME_OPS_LITTLE(4, 2, true, 8, 2, false),
+ NAME_OPS_LITTLE(4, 2, true, 4, 4, false),
+ NAME_OPS_LITTLE(4, 2, true, 8, 4, false),
+ NAME_OPS_LITTLE(4, 2, true, 8, 8, false),
+ NAME_OPS_LITTLE(8, 2, true, 1, 1, true),
+ NAME_OPS_LITTLE(8, 2, true, 2, 1, true),
+ NAME_OPS_LITTLE(8, 2, true, 4, 1, true),
+ NAME_OPS_LITTLE(8, 2, true, 8, 1, true),
+ NAME_OPS_LITTLE(8, 2, true, 2, 2, true),
+ NAME_OPS_LITTLE(8, 2, true, 4, 2, true),
+ NAME_OPS_LITTLE(8, 2, true, 8, 2, true),
+ NAME_OPS_LITTLE(8, 2, true, 4, 4, true),
+ NAME_OPS_LITTLE(8, 2, true, 8, 4, true),
+ NAME_OPS_LITTLE(8, 2, true, 8, 8, true),
+ NAME_OPS_LITTLE(8, 2, true, 1, 1, false),
+ NAME_OPS_LITTLE(8, 2, true, 2, 1, false),
+ NAME_OPS_LITTLE(8, 2, true, 4, 1, false),
+ NAME_OPS_LITTLE(8, 2, true, 8, 1, false),
+ NAME_OPS_LITTLE(8, 2, true, 2, 2, false),
+ NAME_OPS_LITTLE(8, 2, true, 4, 2, false),
+ NAME_OPS_LITTLE(8, 2, true, 8, 2, false),
+ NAME_OPS_LITTLE(8, 2, true, 4, 4, false),
+ NAME_OPS_LITTLE(8, 2, true, 8, 4, false),
+ NAME_OPS_LITTLE(8, 2, true, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_little_w_invalid[] = {
+ NAME_OPS_LITTLE(2, 2, false, 1, 1, true),
+ NAME_OPS_LITTLE(2, 2, false, 2, 1, true),
+ NAME_OPS_LITTLE(2, 2, false, 4, 1, true),
+ NAME_OPS_LITTLE(2, 2, false, 8, 1, true),
+ NAME_OPS_LITTLE(2, 2, false, 2, 2, true),
+ NAME_OPS_LITTLE(2, 2, false, 4, 2, true),
+ NAME_OPS_LITTLE(2, 2, false, 8, 2, true),
+ NAME_OPS_LITTLE(2, 2, false, 4, 4, true),
+ NAME_OPS_LITTLE(2, 2, false, 8, 4, true),
+ NAME_OPS_LITTLE(2, 2, false, 8, 8, true),
+ NAME_OPS_LITTLE(2, 2, false, 1, 1, false),
+ NAME_OPS_LITTLE(2, 2, false, 2, 1, false),
+ NAME_OPS_LITTLE(2, 2, false, 4, 1, false),
+ NAME_OPS_LITTLE(2, 2, false, 8, 1, false),
+ NAME_OPS_LITTLE(2, 2, false, 2, 2, false),
+ NAME_OPS_LITTLE(2, 2, false, 4, 2, false),
+ NAME_OPS_LITTLE(2, 2, false, 8, 2, false),
+ NAME_OPS_LITTLE(2, 2, false, 4, 4, false),
+ NAME_OPS_LITTLE(2, 2, false, 8, 4, false),
+ NAME_OPS_LITTLE(2, 2, false, 8, 8, false),
+ NAME_OPS_LITTLE(4, 2, false, 1, 1, true),
+ NAME_OPS_LITTLE(4, 2, false, 2, 1, true),
+ NAME_OPS_LITTLE(4, 2, false, 4, 1, true),
+ NAME_OPS_LITTLE(4, 2, false, 8, 1, true),
+ NAME_OPS_LITTLE(4, 2, false, 2, 2, true),
+ NAME_OPS_LITTLE(4, 2, false, 4, 2, true),
+ NAME_OPS_LITTLE(4, 2, false, 8, 2, true),
+ NAME_OPS_LITTLE(4, 2, false, 4, 4, true),
+ NAME_OPS_LITTLE(4, 2, false, 8, 4, true),
+ NAME_OPS_LITTLE(4, 2, false, 8, 8, true),
+ NAME_OPS_LITTLE(4, 2, false, 1, 1, false),
+ NAME_OPS_LITTLE(4, 2, false, 2, 1, false),
+ NAME_OPS_LITTLE(4, 2, false, 4, 1, false),
+ NAME_OPS_LITTLE(4, 2, false, 8, 1, false),
+ NAME_OPS_LITTLE(4, 2, false, 2, 2, false),
+ NAME_OPS_LITTLE(4, 2, false, 4, 2, false),
+ NAME_OPS_LITTLE(4, 2, false, 8, 2, false),
+ NAME_OPS_LITTLE(4, 2, false, 4, 4, false),
+ NAME_OPS_LITTLE(4, 2, false, 8, 4, false),
+ NAME_OPS_LITTLE(4, 2, false, 8, 8, false),
+ NAME_OPS_LITTLE(8, 2, false, 1, 1, true),
+ NAME_OPS_LITTLE(8, 2, false, 2, 1, true),
+ NAME_OPS_LITTLE(8, 2, false, 4, 1, true),
+ NAME_OPS_LITTLE(8, 2, false, 8, 1, true),
+ NAME_OPS_LITTLE(8, 2, false, 2, 2, true),
+ NAME_OPS_LITTLE(8, 2, false, 4, 2, true),
+ NAME_OPS_LITTLE(8, 2, false, 8, 2, true),
+ NAME_OPS_LITTLE(8, 2, false, 4, 4, true),
+ NAME_OPS_LITTLE(8, 2, false, 8, 4, true),
+ NAME_OPS_LITTLE(8, 2, false, 8, 8, true),
+ NAME_OPS_LITTLE(8, 2, false, 1, 1, false),
+ NAME_OPS_LITTLE(8, 2, false, 2, 1, false),
+ NAME_OPS_LITTLE(8, 2, false, 4, 1, false),
+ NAME_OPS_LITTLE(8, 2, false, 8, 1, false),
+ NAME_OPS_LITTLE(8, 2, false, 2, 2, false),
+ NAME_OPS_LITTLE(8, 2, false, 4, 2, false),
+ NAME_OPS_LITTLE(8, 2, false, 8, 2, false),
+ NAME_OPS_LITTLE(8, 2, false, 4, 4, false),
+ NAME_OPS_LITTLE(8, 2, false, 8, 4, false),
+ NAME_OPS_LITTLE(8, 2, false, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_little_l_valid[] = {
+ NAME_OPS_LITTLE(4, 4, true, 1, 1, true),
+ NAME_OPS_LITTLE(4, 4, true, 2, 1, true),
+ NAME_OPS_LITTLE(4, 4, true, 4, 1, true),
+ NAME_OPS_LITTLE(4, 4, true, 8, 1, true),
+ NAME_OPS_LITTLE(4, 4, true, 2, 2, true),
+ NAME_OPS_LITTLE(4, 4, true, 4, 2, true),
+ NAME_OPS_LITTLE(4, 4, true, 8, 2, true),
+ NAME_OPS_LITTLE(4, 4, true, 4, 4, true),
+ NAME_OPS_LITTLE(4, 4, true, 8, 4, true),
+ NAME_OPS_LITTLE(4, 4, true, 8, 8, true),
+ NAME_OPS_LITTLE(4, 4, true, 1, 1, false),
+ NAME_OPS_LITTLE(4, 4, true, 2, 1, false),
+ NAME_OPS_LITTLE(4, 4, true, 4, 1, false),
+ NAME_OPS_LITTLE(4, 4, true, 8, 1, false),
+ NAME_OPS_LITTLE(4, 4, true, 2, 2, false),
+ NAME_OPS_LITTLE(4, 4, true, 4, 2, false),
+ NAME_OPS_LITTLE(4, 4, true, 8, 2, false),
+ NAME_OPS_LITTLE(4, 4, true, 4, 4, false),
+ NAME_OPS_LITTLE(4, 4, true, 8, 4, false),
+ NAME_OPS_LITTLE(4, 4, true, 8, 8, false),
+ NAME_OPS_LITTLE(8, 4, true, 1, 1, true),
+ NAME_OPS_LITTLE(8, 4, true, 2, 1, true),
+ NAME_OPS_LITTLE(8, 4, true, 4, 1, true),
+ NAME_OPS_LITTLE(8, 4, true, 8, 1, true),
+ NAME_OPS_LITTLE(8, 4, true, 2, 2, true),
+ NAME_OPS_LITTLE(8, 4, true, 4, 2, true),
+ NAME_OPS_LITTLE(8, 4, true, 8, 2, true),
+ NAME_OPS_LITTLE(8, 4, true, 4, 4, true),
+ NAME_OPS_LITTLE(8, 4, true, 8, 4, true),
+ NAME_OPS_LITTLE(8, 4, true, 8, 8, true),
+ NAME_OPS_LITTLE(8, 4, true, 1, 1, false),
+ NAME_OPS_LITTLE(8, 4, true, 2, 1, false),
+ NAME_OPS_LITTLE(8, 4, true, 4, 1, false),
+ NAME_OPS_LITTLE(8, 4, true, 8, 1, false),
+ NAME_OPS_LITTLE(8, 4, true, 2, 2, false),
+ NAME_OPS_LITTLE(8, 4, true, 4, 2, false),
+ NAME_OPS_LITTLE(8, 4, true, 8, 2, false),
+ NAME_OPS_LITTLE(8, 4, true, 4, 4, false),
+ NAME_OPS_LITTLE(8, 4, true, 8, 4, false),
+ NAME_OPS_LITTLE(8, 4, true, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_little_l_invalid[] = {
+ NAME_OPS_LITTLE(4, 4, false, 1, 1, true),
+ NAME_OPS_LITTLE(4, 4, false, 2, 1, true),
+ NAME_OPS_LITTLE(4, 4, false, 4, 1, true),
+ NAME_OPS_LITTLE(4, 4, false, 8, 1, true),
+ NAME_OPS_LITTLE(4, 4, false, 2, 2, true),
+ NAME_OPS_LITTLE(4, 4, false, 4, 2, true),
+ NAME_OPS_LITTLE(4, 4, false, 8, 2, true),
+ NAME_OPS_LITTLE(4, 4, false, 4, 4, true),
+ NAME_OPS_LITTLE(4, 4, false, 8, 4, true),
+ NAME_OPS_LITTLE(4, 4, false, 8, 8, true),
+ NAME_OPS_LITTLE(4, 4, false, 1, 1, false),
+ NAME_OPS_LITTLE(4, 4, false, 2, 1, false),
+ NAME_OPS_LITTLE(4, 4, false, 4, 1, false),
+ NAME_OPS_LITTLE(4, 4, false, 8, 1, false),
+ NAME_OPS_LITTLE(4, 4, false, 2, 2, false),
+ NAME_OPS_LITTLE(4, 4, false, 4, 2, false),
+ NAME_OPS_LITTLE(4, 4, false, 8, 2, false),
+ NAME_OPS_LITTLE(4, 4, false, 4, 4, false),
+ NAME_OPS_LITTLE(4, 4, false, 8, 4, false),
+ NAME_OPS_LITTLE(4, 4, false, 8, 8, false),
+ NAME_OPS_LITTLE(8, 4, false, 1, 1, true),
+ NAME_OPS_LITTLE(8, 4, false, 2, 1, true),
+ NAME_OPS_LITTLE(8, 4, false, 4, 1, true),
+ NAME_OPS_LITTLE(8, 4, false, 8, 1, true),
+ NAME_OPS_LITTLE(8, 4, false, 2, 2, true),
+ NAME_OPS_LITTLE(8, 4, false, 4, 2, true),
+ NAME_OPS_LITTLE(8, 4, false, 8, 2, true),
+ NAME_OPS_LITTLE(8, 4, false, 4, 4, true),
+ NAME_OPS_LITTLE(8, 4, false, 8, 4, true),
+ NAME_OPS_LITTLE(8, 4, false, 8, 8, true),
+ NAME_OPS_LITTLE(8, 4, false, 1, 1, false),
+ NAME_OPS_LITTLE(8, 4, false, 2, 1, false),
+ NAME_OPS_LITTLE(8, 4, false, 4, 1, false),
+ NAME_OPS_LITTLE(8, 4, false, 8, 1, false),
+ NAME_OPS_LITTLE(8, 4, false, 2, 2, false),
+ NAME_OPS_LITTLE(8, 4, false, 4, 2, false),
+ NAME_OPS_LITTLE(8, 4, false, 8, 2, false),
+ NAME_OPS_LITTLE(8, 4, false, 4, 4, false),
+ NAME_OPS_LITTLE(8, 4, false, 8, 4, false),
+ NAME_OPS_LITTLE(8, 4, false, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_little_q_valid[] = {
+ NAME_OPS_LITTLE(8, 8, true, 1, 1, true),
+ NAME_OPS_LITTLE(8, 8, true, 2, 1, true),
+ NAME_OPS_LITTLE(8, 8, true, 4, 1, true),
+ NAME_OPS_LITTLE(8, 8, true, 8, 1, true),
+ NAME_OPS_LITTLE(8, 8, true, 2, 2, true),
+ NAME_OPS_LITTLE(8, 8, true, 4, 2, true),
+ NAME_OPS_LITTLE(8, 8, true, 8, 2, true),
+ NAME_OPS_LITTLE(8, 8, true, 4, 4, true),
+ NAME_OPS_LITTLE(8, 8, true, 8, 4, true),
+ NAME_OPS_LITTLE(8, 8, true, 8, 8, true),
+ NAME_OPS_LITTLE(8, 8, true, 1, 1, false),
+ NAME_OPS_LITTLE(8, 8, true, 2, 1, false),
+ NAME_OPS_LITTLE(8, 8, true, 4, 1, false),
+ NAME_OPS_LITTLE(8, 8, true, 8, 1, false),
+ NAME_OPS_LITTLE(8, 8, true, 2, 2, false),
+ NAME_OPS_LITTLE(8, 8, true, 4, 2, false),
+ NAME_OPS_LITTLE(8, 8, true, 8, 2, false),
+ NAME_OPS_LITTLE(8, 8, true, 4, 4, false),
+ NAME_OPS_LITTLE(8, 8, true, 8, 4, false),
+ NAME_OPS_LITTLE(8, 8, true, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_little_q_invalid[] = {
+ NAME_OPS_LITTLE(8, 8, false, 1, 1, true),
+ NAME_OPS_LITTLE(8, 8, false, 2, 1, true),
+ NAME_OPS_LITTLE(8, 8, false, 4, 1, true),
+ NAME_OPS_LITTLE(8, 8, false, 8, 1, true),
+ NAME_OPS_LITTLE(8, 8, false, 2, 2, true),
+ NAME_OPS_LITTLE(8, 8, false, 4, 2, true),
+ NAME_OPS_LITTLE(8, 8, false, 8, 2, true),
+ NAME_OPS_LITTLE(8, 8, false, 4, 4, true),
+ NAME_OPS_LITTLE(8, 8, false, 8, 4, true),
+ NAME_OPS_LITTLE(8, 8, false, 8, 8, true),
+ NAME_OPS_LITTLE(8, 8, false, 1, 1, false),
+ NAME_OPS_LITTLE(8, 8, false, 2, 1, false),
+ NAME_OPS_LITTLE(8, 8, false, 4, 1, false),
+ NAME_OPS_LITTLE(8, 8, false, 8, 1, false),
+ NAME_OPS_LITTLE(8, 8, false, 2, 2, false),
+ NAME_OPS_LITTLE(8, 8, false, 4, 2, false),
+ NAME_OPS_LITTLE(8, 8, false, 8, 2, false),
+ NAME_OPS_LITTLE(8, 8, false, 4, 4, false),
+ NAME_OPS_LITTLE(8, 8, false, 8, 4, false),
+ NAME_OPS_LITTLE(8, 8, false, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_big_b_valid[] = {
+ NAME_OPS_BIG(1, 1, true, 1, 1, true),
+ NAME_OPS_BIG(1, 1, true, 2, 1, true),
+ NAME_OPS_BIG(1, 1, true, 4, 1, true),
+ NAME_OPS_BIG(1, 1, true, 8, 1, true),
+ NAME_OPS_BIG(1, 1, true, 2, 2, true),
+ NAME_OPS_BIG(1, 1, true, 4, 2, true),
+ NAME_OPS_BIG(1, 1, true, 8, 2, true),
+ NAME_OPS_BIG(1, 1, true, 4, 4, true),
+ NAME_OPS_BIG(1, 1, true, 8, 4, true),
+ NAME_OPS_BIG(1, 1, true, 8, 8, true),
+ NAME_OPS_BIG(1, 1, true, 1, 1, false),
+ NAME_OPS_BIG(1, 1, true, 2, 1, false),
+ NAME_OPS_BIG(1, 1, true, 4, 1, false),
+ NAME_OPS_BIG(1, 1, true, 8, 1, false),
+ NAME_OPS_BIG(1, 1, true, 2, 2, false),
+ NAME_OPS_BIG(1, 1, true, 4, 2, false),
+ NAME_OPS_BIG(1, 1, true, 8, 2, false),
+ NAME_OPS_BIG(1, 1, true, 4, 4, false),
+ NAME_OPS_BIG(1, 1, true, 8, 4, false),
+ NAME_OPS_BIG(1, 1, true, 8, 8, false),
+ NAME_OPS_BIG(2, 1, true, 1, 1, true),
+ NAME_OPS_BIG(2, 1, true, 2, 1, true),
+ NAME_OPS_BIG(2, 1, true, 4, 1, true),
+ NAME_OPS_BIG(2, 1, true, 8, 1, true),
+ NAME_OPS_BIG(2, 1, true, 2, 2, true),
+ NAME_OPS_BIG(2, 1, true, 4, 2, true),
+ NAME_OPS_BIG(2, 1, true, 8, 2, true),
+ NAME_OPS_BIG(2, 1, true, 4, 4, true),
+ NAME_OPS_BIG(2, 1, true, 8, 4, true),
+ NAME_OPS_BIG(2, 1, true, 8, 8, true),
+ NAME_OPS_BIG(2, 1, true, 1, 1, false),
+ NAME_OPS_BIG(2, 1, true, 2, 1, false),
+ NAME_OPS_BIG(2, 1, true, 4, 1, false),
+ NAME_OPS_BIG(2, 1, true, 8, 1, false),
+ NAME_OPS_BIG(2, 1, true, 2, 2, false),
+ NAME_OPS_BIG(2, 1, true, 4, 2, false),
+ NAME_OPS_BIG(2, 1, true, 8, 2, false),
+ NAME_OPS_BIG(2, 1, true, 4, 4, false),
+ NAME_OPS_BIG(2, 1, true, 8, 4, false),
+ NAME_OPS_BIG(2, 1, true, 8, 8, false),
+ NAME_OPS_BIG(4, 1, true, 1, 1, true),
+ NAME_OPS_BIG(4, 1, true, 2, 1, true),
+ NAME_OPS_BIG(4, 1, true, 4, 1, true),
+ NAME_OPS_BIG(4, 1, true, 8, 1, true),
+ NAME_OPS_BIG(4, 1, true, 2, 2, true),
+ NAME_OPS_BIG(4, 1, true, 4, 2, true),
+ NAME_OPS_BIG(4, 1, true, 8, 2, true),
+ NAME_OPS_BIG(4, 1, true, 4, 4, true),
+ NAME_OPS_BIG(4, 1, true, 8, 4, true),
+ NAME_OPS_BIG(4, 1, true, 8, 8, true),
+ NAME_OPS_BIG(4, 1, true, 1, 1, false),
+ NAME_OPS_BIG(4, 1, true, 2, 1, false),
+ NAME_OPS_BIG(4, 1, true, 4, 1, false),
+ NAME_OPS_BIG(4, 1, true, 8, 1, false),
+ NAME_OPS_BIG(4, 1, true, 2, 2, false),
+ NAME_OPS_BIG(4, 1, true, 4, 2, false),
+ NAME_OPS_BIG(4, 1, true, 8, 2, false),
+ NAME_OPS_BIG(4, 1, true, 4, 4, false),
+ NAME_OPS_BIG(4, 1, true, 8, 4, false),
+ NAME_OPS_BIG(4, 1, true, 8, 8, false),
+ NAME_OPS_BIG(8, 1, true, 1, 1, true),
+ NAME_OPS_BIG(8, 1, true, 2, 1, true),
+ NAME_OPS_BIG(8, 1, true, 4, 1, true),
+ NAME_OPS_BIG(8, 1, true, 8, 1, true),
+ NAME_OPS_BIG(8, 1, true, 2, 2, true),
+ NAME_OPS_BIG(8, 1, true, 4, 2, true),
+ NAME_OPS_BIG(8, 1, true, 8, 2, true),
+ NAME_OPS_BIG(8, 1, true, 4, 4, true),
+ NAME_OPS_BIG(8, 1, true, 8, 4, true),
+ NAME_OPS_BIG(8, 1, true, 8, 8, true),
+ NAME_OPS_BIG(8, 1, true, 1, 1, false),
+ NAME_OPS_BIG(8, 1, true, 2, 1, false),
+ NAME_OPS_BIG(8, 1, true, 4, 1, false),
+ NAME_OPS_BIG(8, 1, true, 8, 1, false),
+ NAME_OPS_BIG(8, 1, true, 2, 2, false),
+ NAME_OPS_BIG(8, 1, true, 4, 2, false),
+ NAME_OPS_BIG(8, 1, true, 8, 2, false),
+ NAME_OPS_BIG(8, 1, true, 4, 4, false),
+ NAME_OPS_BIG(8, 1, true, 8, 4, false),
+ NAME_OPS_BIG(8, 1, true, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_big_b_invalid[] = {
+ NAME_OPS_BIG(1, 1, false, 1, 1, true),
+ NAME_OPS_BIG(1, 1, false, 2, 1, true),
+ NAME_OPS_BIG(1, 1, false, 4, 1, true),
+ NAME_OPS_BIG(1, 1, false, 8, 1, true),
+ NAME_OPS_BIG(1, 1, false, 2, 2, true),
+ NAME_OPS_BIG(1, 1, false, 4, 2, true),
+ NAME_OPS_BIG(1, 1, false, 8, 2, true),
+ NAME_OPS_BIG(1, 1, false, 4, 4, true),
+ NAME_OPS_BIG(1, 1, false, 8, 4, true),
+ NAME_OPS_BIG(1, 1, false, 8, 8, true),
+ NAME_OPS_BIG(1, 1, false, 1, 1, false),
+ NAME_OPS_BIG(1, 1, false, 2, 1, false),
+ NAME_OPS_BIG(1, 1, false, 4, 1, false),
+ NAME_OPS_BIG(1, 1, false, 8, 1, false),
+ NAME_OPS_BIG(1, 1, false, 2, 2, false),
+ NAME_OPS_BIG(1, 1, false, 4, 2, false),
+ NAME_OPS_BIG(1, 1, false, 8, 2, false),
+ NAME_OPS_BIG(1, 1, false, 4, 4, false),
+ NAME_OPS_BIG(1, 1, false, 8, 4, false),
+ NAME_OPS_BIG(1, 1, false, 8, 8, false),
+ NAME_OPS_BIG(2, 1, false, 1, 1, true),
+ NAME_OPS_BIG(2, 1, false, 2, 1, true),
+ NAME_OPS_BIG(2, 1, false, 4, 1, true),
+ NAME_OPS_BIG(2, 1, false, 8, 1, true),
+ NAME_OPS_BIG(2, 1, false, 2, 2, true),
+ NAME_OPS_BIG(2, 1, false, 4, 2, true),
+ NAME_OPS_BIG(2, 1, false, 8, 2, true),
+ NAME_OPS_BIG(2, 1, false, 4, 4, true),
+ NAME_OPS_BIG(2, 1, false, 8, 4, true),
+ NAME_OPS_BIG(2, 1, false, 8, 8, true),
+ NAME_OPS_BIG(2, 1, false, 1, 1, false),
+ NAME_OPS_BIG(2, 1, false, 2, 1, false),
+ NAME_OPS_BIG(2, 1, false, 4, 1, false),
+ NAME_OPS_BIG(2, 1, false, 8, 1, false),
+ NAME_OPS_BIG(2, 1, false, 2, 2, false),
+ NAME_OPS_BIG(2, 1, false, 4, 2, false),
+ NAME_OPS_BIG(2, 1, false, 8, 2, false),
+ NAME_OPS_BIG(2, 1, false, 4, 4, false),
+ NAME_OPS_BIG(2, 1, false, 8, 4, false),
+ NAME_OPS_BIG(2, 1, false, 8, 8, false),
+ NAME_OPS_BIG(4, 1, false, 1, 1, true),
+ NAME_OPS_BIG(4, 1, false, 2, 1, true),
+ NAME_OPS_BIG(4, 1, false, 4, 1, true),
+ NAME_OPS_BIG(4, 1, false, 8, 1, true),
+ NAME_OPS_BIG(4, 1, false, 2, 2, true),
+ NAME_OPS_BIG(4, 1, false, 4, 2, true),
+ NAME_OPS_BIG(4, 1, false, 8, 2, true),
+ NAME_OPS_BIG(4, 1, false, 4, 4, true),
+ NAME_OPS_BIG(4, 1, false, 8, 4, true),
+ NAME_OPS_BIG(4, 1, false, 8, 8, true),
+ NAME_OPS_BIG(4, 1, false, 1, 1, false),
+ NAME_OPS_BIG(4, 1, false, 2, 1, false),
+ NAME_OPS_BIG(4, 1, false, 4, 1, false),
+ NAME_OPS_BIG(4, 1, false, 8, 1, false),
+ NAME_OPS_BIG(4, 1, false, 2, 2, false),
+ NAME_OPS_BIG(4, 1, false, 4, 2, false),
+ NAME_OPS_BIG(4, 1, false, 8, 2, false),
+ NAME_OPS_BIG(4, 1, false, 4, 4, false),
+ NAME_OPS_BIG(4, 1, false, 8, 4, false),
+ NAME_OPS_BIG(4, 1, false, 8, 8, false),
+ NAME_OPS_BIG(8, 1, false, 1, 1, true),
+ NAME_OPS_BIG(8, 1, false, 2, 1, true),
+ NAME_OPS_BIG(8, 1, false, 4, 1, true),
+ NAME_OPS_BIG(8, 1, false, 8, 1, true),
+ NAME_OPS_BIG(8, 1, false, 2, 2, true),
+ NAME_OPS_BIG(8, 1, false, 4, 2, true),
+ NAME_OPS_BIG(8, 1, false, 8, 2, true),
+ NAME_OPS_BIG(8, 1, false, 4, 4, true),
+ NAME_OPS_BIG(8, 1, false, 8, 4, true),
+ NAME_OPS_BIG(8, 1, false, 8, 8, true),
+ NAME_OPS_BIG(8, 1, false, 1, 1, false),
+ NAME_OPS_BIG(8, 1, false, 2, 1, false),
+ NAME_OPS_BIG(8, 1, false, 4, 1, false),
+ NAME_OPS_BIG(8, 1, false, 8, 1, false),
+ NAME_OPS_BIG(8, 1, false, 2, 2, false),
+ NAME_OPS_BIG(8, 1, false, 4, 2, false),
+ NAME_OPS_BIG(8, 1, false, 8, 2, false),
+ NAME_OPS_BIG(8, 1, false, 4, 4, false),
+ NAME_OPS_BIG(8, 1, false, 8, 4, false),
+ NAME_OPS_BIG(8, 1, false, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_big_w_valid[] = {
+ NAME_OPS_BIG(2, 2, true, 1, 1, true),
+ NAME_OPS_BIG(2, 2, true, 2, 1, true),
+ NAME_OPS_BIG(2, 2, true, 4, 1, true),
+ NAME_OPS_BIG(2, 2, true, 8, 1, true),
+ NAME_OPS_BIG(2, 2, true, 2, 2, true),
+ NAME_OPS_BIG(2, 2, true, 4, 2, true),
+ NAME_OPS_BIG(2, 2, true, 8, 2, true),
+ NAME_OPS_BIG(2, 2, true, 4, 4, true),
+ NAME_OPS_BIG(2, 2, true, 8, 4, true),
+ NAME_OPS_BIG(2, 2, true, 8, 8, true),
+ NAME_OPS_BIG(2, 2, true, 1, 1, false),
+ NAME_OPS_BIG(2, 2, true, 2, 1, false),
+ NAME_OPS_BIG(2, 2, true, 4, 1, false),
+ NAME_OPS_BIG(2, 2, true, 8, 1, false),
+ NAME_OPS_BIG(2, 2, true, 2, 2, false),
+ NAME_OPS_BIG(2, 2, true, 4, 2, false),
+ NAME_OPS_BIG(2, 2, true, 8, 2, false),
+ NAME_OPS_BIG(2, 2, true, 4, 4, false),
+ NAME_OPS_BIG(2, 2, true, 8, 4, false),
+ NAME_OPS_BIG(2, 2, true, 8, 8, false),
+ NAME_OPS_BIG(4, 2, true, 1, 1, true),
+ NAME_OPS_BIG(4, 2, true, 2, 1, true),
+ NAME_OPS_BIG(4, 2, true, 4, 1, true),
+ NAME_OPS_BIG(4, 2, true, 8, 1, true),
+ NAME_OPS_BIG(4, 2, true, 2, 2, true),
+ NAME_OPS_BIG(4, 2, true, 4, 2, true),
+ NAME_OPS_BIG(4, 2, true, 8, 2, true),
+ NAME_OPS_BIG(4, 2, true, 4, 4, true),
+ NAME_OPS_BIG(4, 2, true, 8, 4, true),
+ NAME_OPS_BIG(4, 2, true, 8, 8, true),
+ NAME_OPS_BIG(4, 2, true, 1, 1, false),
+ NAME_OPS_BIG(4, 2, true, 2, 1, false),
+ NAME_OPS_BIG(4, 2, true, 4, 1, false),
+ NAME_OPS_BIG(4, 2, true, 8, 1, false),
+ NAME_OPS_BIG(4, 2, true, 2, 2, false),
+ NAME_OPS_BIG(4, 2, true, 4, 2, false),
+ NAME_OPS_BIG(4, 2, true, 8, 2, false),
+ NAME_OPS_BIG(4, 2, true, 4, 4, false),
+ NAME_OPS_BIG(4, 2, true, 8, 4, false),
+ NAME_OPS_BIG(4, 2, true, 8, 8, false),
+ NAME_OPS_BIG(8, 2, true, 1, 1, true),
+ NAME_OPS_BIG(8, 2, true, 2, 1, true),
+ NAME_OPS_BIG(8, 2, true, 4, 1, true),
+ NAME_OPS_BIG(8, 2, true, 8, 1, true),
+ NAME_OPS_BIG(8, 2, true, 2, 2, true),
+ NAME_OPS_BIG(8, 2, true, 4, 2, true),
+ NAME_OPS_BIG(8, 2, true, 8, 2, true),
+ NAME_OPS_BIG(8, 2, true, 4, 4, true),
+ NAME_OPS_BIG(8, 2, true, 8, 4, true),
+ NAME_OPS_BIG(8, 2, true, 8, 8, true),
+ NAME_OPS_BIG(8, 2, true, 1, 1, false),
+ NAME_OPS_BIG(8, 2, true, 2, 1, false),
+ NAME_OPS_BIG(8, 2, true, 4, 1, false),
+ NAME_OPS_BIG(8, 2, true, 8, 1, false),
+ NAME_OPS_BIG(8, 2, true, 2, 2, false),
+ NAME_OPS_BIG(8, 2, true, 4, 2, false),
+ NAME_OPS_BIG(8, 2, true, 8, 2, false),
+ NAME_OPS_BIG(8, 2, true, 4, 4, false),
+ NAME_OPS_BIG(8, 2, true, 8, 4, false),
+ NAME_OPS_BIG(8, 2, true, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_big_w_invalid[] = {
+ NAME_OPS_BIG(2, 2, false, 1, 1, true),
+ NAME_OPS_BIG(2, 2, false, 2, 1, true),
+ NAME_OPS_BIG(2, 2, false, 4, 1, true),
+ NAME_OPS_BIG(2, 2, false, 8, 1, true),
+ NAME_OPS_BIG(2, 2, false, 2, 2, true),
+ NAME_OPS_BIG(2, 2, false, 4, 2, true),
+ NAME_OPS_BIG(2, 2, false, 8, 2, true),
+ NAME_OPS_BIG(2, 2, false, 4, 4, true),
+ NAME_OPS_BIG(2, 2, false, 8, 4, true),
+ NAME_OPS_BIG(2, 2, false, 8, 8, true),
+ NAME_OPS_BIG(2, 2, false, 1, 1, false),
+ NAME_OPS_BIG(2, 2, false, 2, 1, false),
+ NAME_OPS_BIG(2, 2, false, 4, 1, false),
+ NAME_OPS_BIG(2, 2, false, 8, 1, false),
+ NAME_OPS_BIG(2, 2, false, 2, 2, false),
+ NAME_OPS_BIG(2, 2, false, 4, 2, false),
+ NAME_OPS_BIG(2, 2, false, 8, 2, false),
+ NAME_OPS_BIG(2, 2, false, 4, 4, false),
+ NAME_OPS_BIG(2, 2, false, 8, 4, false),
+ NAME_OPS_BIG(2, 2, false, 8, 8, false),
+ NAME_OPS_BIG(4, 2, false, 1, 1, true),
+ NAME_OPS_BIG(4, 2, false, 2, 1, true),
+ NAME_OPS_BIG(4, 2, false, 4, 1, true),
+ NAME_OPS_BIG(4, 2, false, 8, 1, true),
+ NAME_OPS_BIG(4, 2, false, 2, 2, true),
+ NAME_OPS_BIG(4, 2, false, 4, 2, true),
+ NAME_OPS_BIG(4, 2, false, 8, 2, true),
+ NAME_OPS_BIG(4, 2, false, 4, 4, true),
+ NAME_OPS_BIG(4, 2, false, 8, 4, true),
+ NAME_OPS_BIG(4, 2, false, 8, 8, true),
+ NAME_OPS_BIG(4, 2, false, 1, 1, false),
+ NAME_OPS_BIG(4, 2, false, 2, 1, false),
+ NAME_OPS_BIG(4, 2, false, 4, 1, false),
+ NAME_OPS_BIG(4, 2, false, 8, 1, false),
+ NAME_OPS_BIG(4, 2, false, 2, 2, false),
+ NAME_OPS_BIG(4, 2, false, 4, 2, false),
+ NAME_OPS_BIG(4, 2, false, 8, 2, false),
+ NAME_OPS_BIG(4, 2, false, 4, 4, false),
+ NAME_OPS_BIG(4, 2, false, 8, 4, false),
+ NAME_OPS_BIG(4, 2, false, 8, 8, false),
+ NAME_OPS_BIG(8, 2, false, 1, 1, true),
+ NAME_OPS_BIG(8, 2, false, 2, 1, true),
+ NAME_OPS_BIG(8, 2, false, 4, 1, true),
+ NAME_OPS_BIG(8, 2, false, 8, 1, true),
+ NAME_OPS_BIG(8, 2, false, 2, 2, true),
+ NAME_OPS_BIG(8, 2, false, 4, 2, true),
+ NAME_OPS_BIG(8, 2, false, 8, 2, true),
+ NAME_OPS_BIG(8, 2, false, 4, 4, true),
+ NAME_OPS_BIG(8, 2, false, 8, 4, true),
+ NAME_OPS_BIG(8, 2, false, 8, 8, true),
+ NAME_OPS_BIG(8, 2, false, 1, 1, false),
+ NAME_OPS_BIG(8, 2, false, 2, 1, false),
+ NAME_OPS_BIG(8, 2, false, 4, 1, false),
+ NAME_OPS_BIG(8, 2, false, 8, 1, false),
+ NAME_OPS_BIG(8, 2, false, 2, 2, false),
+ NAME_OPS_BIG(8, 2, false, 4, 2, false),
+ NAME_OPS_BIG(8, 2, false, 8, 2, false),
+ NAME_OPS_BIG(8, 2, false, 4, 4, false),
+ NAME_OPS_BIG(8, 2, false, 8, 4, false),
+ NAME_OPS_BIG(8, 2, false, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_big_l_valid[] = {
+ NAME_OPS_BIG(4, 4, true, 1, 1, true),
+ NAME_OPS_BIG(4, 4, true, 2, 1, true),
+ NAME_OPS_BIG(4, 4, true, 4, 1, true),
+ NAME_OPS_BIG(4, 4, true, 8, 1, true),
+ NAME_OPS_BIG(4, 4, true, 2, 2, true),
+ NAME_OPS_BIG(4, 4, true, 4, 2, true),
+ NAME_OPS_BIG(4, 4, true, 8, 2, true),
+ NAME_OPS_BIG(4, 4, true, 4, 4, true),
+ NAME_OPS_BIG(4, 4, true, 8, 4, true),
+ NAME_OPS_BIG(4, 4, true, 8, 8, true),
+ NAME_OPS_BIG(4, 4, true, 1, 1, false),
+ NAME_OPS_BIG(4, 4, true, 2, 1, false),
+ NAME_OPS_BIG(4, 4, true, 4, 1, false),
+ NAME_OPS_BIG(4, 4, true, 8, 1, false),
+ NAME_OPS_BIG(4, 4, true, 2, 2, false),
+ NAME_OPS_BIG(4, 4, true, 4, 2, false),
+ NAME_OPS_BIG(4, 4, true, 8, 2, false),
+ NAME_OPS_BIG(4, 4, true, 4, 4, false),
+ NAME_OPS_BIG(4, 4, true, 8, 4, false),
+ NAME_OPS_BIG(4, 4, true, 8, 8, false),
+ NAME_OPS_BIG(8, 4, true, 1, 1, true),
+ NAME_OPS_BIG(8, 4, true, 2, 1, true),
+ NAME_OPS_BIG(8, 4, true, 4, 1, true),
+ NAME_OPS_BIG(8, 4, true, 8, 1, true),
+ NAME_OPS_BIG(8, 4, true, 2, 2, true),
+ NAME_OPS_BIG(8, 4, true, 4, 2, true),
+ NAME_OPS_BIG(8, 4, true, 8, 2, true),
+ NAME_OPS_BIG(8, 4, true, 4, 4, true),
+ NAME_OPS_BIG(8, 4, true, 8, 4, true),
+ NAME_OPS_BIG(8, 4, true, 8, 8, true),
+ NAME_OPS_BIG(8, 4, true, 1, 1, false),
+ NAME_OPS_BIG(8, 4, true, 2, 1, false),
+ NAME_OPS_BIG(8, 4, true, 4, 1, false),
+ NAME_OPS_BIG(8, 4, true, 8, 1, false),
+ NAME_OPS_BIG(8, 4, true, 2, 2, false),
+ NAME_OPS_BIG(8, 4, true, 4, 2, false),
+ NAME_OPS_BIG(8, 4, true, 8, 2, false),
+ NAME_OPS_BIG(8, 4, true, 4, 4, false),
+ NAME_OPS_BIG(8, 4, true, 8, 4, false),
+ NAME_OPS_BIG(8, 4, true, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_big_l_invalid[] = {
+ NAME_OPS_BIG(4, 4, false, 1, 1, true),
+ NAME_OPS_BIG(4, 4, false, 2, 1, true),
+ NAME_OPS_BIG(4, 4, false, 4, 1, true),
+ NAME_OPS_BIG(4, 4, false, 8, 1, true),
+ NAME_OPS_BIG(4, 4, false, 2, 2, true),
+ NAME_OPS_BIG(4, 4, false, 4, 2, true),
+ NAME_OPS_BIG(4, 4, false, 8, 2, true),
+ NAME_OPS_BIG(4, 4, false, 4, 4, true),
+ NAME_OPS_BIG(4, 4, false, 8, 4, true),
+ NAME_OPS_BIG(4, 4, false, 8, 8, true),
+ NAME_OPS_BIG(4, 4, false, 1, 1, false),
+ NAME_OPS_BIG(4, 4, false, 2, 1, false),
+ NAME_OPS_BIG(4, 4, false, 4, 1, false),
+ NAME_OPS_BIG(4, 4, false, 8, 1, false),
+ NAME_OPS_BIG(4, 4, false, 2, 2, false),
+ NAME_OPS_BIG(4, 4, false, 4, 2, false),
+ NAME_OPS_BIG(4, 4, false, 8, 2, false),
+ NAME_OPS_BIG(4, 4, false, 4, 4, false),
+ NAME_OPS_BIG(4, 4, false, 8, 4, false),
+ NAME_OPS_BIG(4, 4, false, 8, 8, false),
+ NAME_OPS_BIG(8, 4, false, 1, 1, true),
+ NAME_OPS_BIG(8, 4, false, 2, 1, true),
+ NAME_OPS_BIG(8, 4, false, 4, 1, true),
+ NAME_OPS_BIG(8, 4, false, 8, 1, true),
+ NAME_OPS_BIG(8, 4, false, 2, 2, true),
+ NAME_OPS_BIG(8, 4, false, 4, 2, true),
+ NAME_OPS_BIG(8, 4, false, 8, 2, true),
+ NAME_OPS_BIG(8, 4, false, 4, 4, true),
+ NAME_OPS_BIG(8, 4, false, 8, 4, true),
+ NAME_OPS_BIG(8, 4, false, 8, 8, true),
+ NAME_OPS_BIG(8, 4, false, 1, 1, false),
+ NAME_OPS_BIG(8, 4, false, 2, 1, false),
+ NAME_OPS_BIG(8, 4, false, 4, 1, false),
+ NAME_OPS_BIG(8, 4, false, 8, 1, false),
+ NAME_OPS_BIG(8, 4, false, 2, 2, false),
+ NAME_OPS_BIG(8, 4, false, 4, 2, false),
+ NAME_OPS_BIG(8, 4, false, 8, 2, false),
+ NAME_OPS_BIG(8, 4, false, 4, 4, false),
+ NAME_OPS_BIG(8, 4, false, 8, 4, false),
+ NAME_OPS_BIG(8, 4, false, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_big_q_valid[] = {
+ NAME_OPS_BIG(8, 8, true, 1, 1, true),
+ NAME_OPS_BIG(8, 8, true, 2, 1, true),
+ NAME_OPS_BIG(8, 8, true, 4, 1, true),
+ NAME_OPS_BIG(8, 8, true, 8, 1, true),
+ NAME_OPS_BIG(8, 8, true, 2, 2, true),
+ NAME_OPS_BIG(8, 8, true, 4, 2, true),
+ NAME_OPS_BIG(8, 8, true, 8, 2, true),
+ NAME_OPS_BIG(8, 8, true, 4, 4, true),
+ NAME_OPS_BIG(8, 8, true, 8, 4, true),
+ NAME_OPS_BIG(8, 8, true, 8, 8, true),
+ NAME_OPS_BIG(8, 8, true, 1, 1, false),
+ NAME_OPS_BIG(8, 8, true, 2, 1, false),
+ NAME_OPS_BIG(8, 8, true, 4, 1, false),
+ NAME_OPS_BIG(8, 8, true, 8, 1, false),
+ NAME_OPS_BIG(8, 8, true, 2, 2, false),
+ NAME_OPS_BIG(8, 8, true, 4, 2, false),
+ NAME_OPS_BIG(8, 8, true, 8, 2, false),
+ NAME_OPS_BIG(8, 8, true, 4, 4, false),
+ NAME_OPS_BIG(8, 8, true, 8, 4, false),
+ NAME_OPS_BIG(8, 8, true, 8, 8, false),
+};
+
+const MemoryRegionOps ops_list_big_q_invalid[] = {
+ NAME_OPS_BIG(8, 8, false, 1, 1, true),
+ NAME_OPS_BIG(8, 8, false, 2, 1, true),
+ NAME_OPS_BIG(8, 8, false, 4, 1, true),
+ NAME_OPS_BIG(8, 8, false, 8, 1, true),
+ NAME_OPS_BIG(8, 8, false, 2, 2, true),
+ NAME_OPS_BIG(8, 8, false, 4, 2, true),
+ NAME_OPS_BIG(8, 8, false, 8, 2, true),
+ NAME_OPS_BIG(8, 8, false, 4, 4, true),
+ NAME_OPS_BIG(8, 8, false, 8, 4, true),
+ NAME_OPS_BIG(8, 8, false, 8, 8, true),
+ NAME_OPS_BIG(8, 8, false, 1, 1, false),
+ NAME_OPS_BIG(8, 8, false, 2, 1, false),
+ NAME_OPS_BIG(8, 8, false, 4, 1, false),
+ NAME_OPS_BIG(8, 8, false, 8, 1, false),
+ NAME_OPS_BIG(8, 8, false, 2, 2, false),
+ NAME_OPS_BIG(8, 8, false, 4, 2, false),
+ NAME_OPS_BIG(8, 8, false, 8, 2, false),
+ NAME_OPS_BIG(8, 8, false, 4, 4, false),
+ NAME_OPS_BIG(8, 8, false, 8, 4, false),
+ NAME_OPS_BIG(8, 8, false, 8, 8, false),
+};
+
+#define N_OPS_LIST_LITTLE_B_VALID \
+ (sizeof(ops_list_little_b_valid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_LITTLE_W_VALID \
+ (sizeof(ops_list_little_w_valid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_LITTLE_L_VALID \
+ (sizeof(ops_list_little_l_valid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_LITTLE_Q_VALID \
+ (sizeof(ops_list_little_q_valid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_LITTLE_B_INVALID \
+ (sizeof(ops_list_little_b_invalid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_LITTLE_W_INVALID \
+ (sizeof(ops_list_little_w_invalid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_LITTLE_L_INVALID \
+ (sizeof(ops_list_little_l_invalid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_LITTLE_Q_INVALID \
+ (sizeof(ops_list_little_q_invalid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_BIG_B_VALID \
+ (sizeof(ops_list_big_b_valid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_BIG_W_VALID \
+ (sizeof(ops_list_big_w_valid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_BIG_L_VALID \
+ (sizeof(ops_list_big_l_valid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_BIG_Q_VALID \
+ (sizeof(ops_list_big_q_valid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_BIG_B_INVALID \
+ (sizeof(ops_list_big_b_invalid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_BIG_W_INVALID \
+ (sizeof(ops_list_big_w_invalid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_BIG_L_INVALID \
+ (sizeof(ops_list_big_l_invalid) / sizeof(MemoryRegionOps))
+#define N_OPS_LIST_BIG_Q_INVALID \
+ (sizeof(ops_list_big_q_invalid) / sizeof(MemoryRegionOps))
+
+#define N_OPS_LIST \
+ (N_OPS_LIST_LITTLE_B_VALID + \
+ N_OPS_LIST_LITTLE_B_INVALID + \
+ N_OPS_LIST_LITTLE_W_VALID + \
+ N_OPS_LIST_LITTLE_W_INVALID + \
+ N_OPS_LIST_LITTLE_L_VALID + \
+ N_OPS_LIST_LITTLE_L_INVALID + \
+ N_OPS_LIST_LITTLE_Q_VALID + \
+ N_OPS_LIST_LITTLE_Q_INVALID + \
+ N_OPS_LIST_BIG_B_VALID + \
+ N_OPS_LIST_BIG_B_INVALID + \
+ N_OPS_LIST_BIG_W_VALID + \
+ N_OPS_LIST_BIG_W_INVALID + \
+ N_OPS_LIST_BIG_L_VALID + \
+ N_OPS_LIST_BIG_L_INVALID + \
+ N_OPS_LIST_BIG_Q_VALID + \
+ N_OPS_LIST_BIG_Q_INVALID)
+
+#define OFF_IDX_OPS_LIST_LITTLE_B_VALID \
+ (0)
+#define OFF_IDX_OPS_LIST_LITTLE_B_INVALID \
+ (OFF_IDX_OPS_LIST_LITTLE_B_VALID + N_OPS_LIST_LITTLE_B_VALID)
+#define OFF_IDX_OPS_LIST_LITTLE_W_VALID \
+ (OFF_IDX_OPS_LIST_LITTLE_B_INVALID + N_OPS_LIST_LITTLE_B_INVALID)
+#define OFF_IDX_OPS_LIST_LITTLE_W_INVALID \
+ (OFF_IDX_OPS_LIST_LITTLE_W_VALID + N_OPS_LIST_LITTLE_W_VALID)
+#define OFF_IDX_OPS_LIST_LITTLE_L_VALID \
+ (OFF_IDX_OPS_LIST_LITTLE_W_INVALID + N_OPS_LIST_LITTLE_W_INVALID)
+#define OFF_IDX_OPS_LIST_LITTLE_L_INVALID \
+ (OFF_IDX_OPS_LIST_LITTLE_L_VALID + N_OPS_LIST_LITTLE_L_VALID)
+#define OFF_IDX_OPS_LIST_LITTLE_Q_VALID \
+ (OFF_IDX_OPS_LIST_LITTLE_L_INVALID + N_OPS_LIST_LITTLE_L_INVALID)
+#define OFF_IDX_OPS_LIST_LITTLE_Q_INVALID \
+ (OFF_IDX_OPS_LIST_LITTLE_Q_VALID + N_OPS_LIST_LITTLE_Q_VALID)
+#define OFF_IDX_OPS_LIST_BIG_B_VALID \
+ (OFF_IDX_OPS_LIST_LITTLE_Q_INVALID + N_OPS_LIST_LITTLE_Q_INVALID)
+#define OFF_IDX_OPS_LIST_BIG_B_INVALID \
+ (OFF_IDX_OPS_LIST_BIG_B_VALID + N_OPS_LIST_BIG_B_VALID)
+#define OFF_IDX_OPS_LIST_BIG_W_VALID \
+ (OFF_IDX_OPS_LIST_BIG_B_INVALID + N_OPS_LIST_BIG_B_INVALID)
+#define OFF_IDX_OPS_LIST_BIG_W_INVALID \
+ (OFF_IDX_OPS_LIST_BIG_W_VALID + N_OPS_LIST_BIG_W_VALID)
+#define OFF_IDX_OPS_LIST_BIG_L_VALID \
+ (OFF_IDX_OPS_LIST_BIG_W_INVALID + N_OPS_LIST_BIG_W_INVALID)
+#define OFF_IDX_OPS_LIST_BIG_L_INVALID \
+ (OFF_IDX_OPS_LIST_BIG_L_VALID + N_OPS_LIST_BIG_L_VALID)
+#define OFF_IDX_OPS_LIST_BIG_Q_VALID \
+ (OFF_IDX_OPS_LIST_BIG_L_INVALID + N_OPS_LIST_BIG_L_INVALID)
+#define OFF_IDX_OPS_LIST_BIG_Q_INVALID \
+ (OFF_IDX_OPS_LIST_BIG_Q_VALID + N_OPS_LIST_BIG_Q_VALID)
+
+#undef GEN_OPS_LITTLE
+#undef GEN_OPS_BIG
+#undef NAME_OPS_LITTLE
+#undef NAME_OPS_BIG
+#undef __JOIN2
+#undef __JOIN2_AGAIN
+#undef __JOIN6
+#undef __JOIN6_AGAIN
+#undef __STR
+#undef __STR_AGAIN
+
+#endif
This commit adds a test device for checking memory access. The test device generates memory regions that covers all the parameter patterns. With this device, we can check the handling of reading/writing the MemoryRegion is correct. Signed-off-by: Tomoyuki HIROSE <tomoyuki.hirose@igel.co.jp> --- hw/misc/Kconfig | 4 + hw/misc/memaccess-testdev.c | 197 +++ hw/misc/meson.build | 1 + include/hw/misc/memaccess-testdev.h | 42 + include/hw/misc/memaccess-testdev.h.inc | 1864 +++++++++++++++++++++++ 5 files changed, 2108 insertions(+) create mode 100644 hw/misc/memaccess-testdev.c create mode 100644 include/hw/misc/memaccess-testdev.h create mode 100644 include/hw/misc/memaccess-testdev.h.inc