Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / bl / lib / ecc / src / BL_CKEcc.cc
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T2 Processor File: BL_CKEcc.cc
// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
//
// The above named program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// The above named program is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this work; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
// ========== Copyright Header End ============================================
/************************************************************************
**
** Copyright (C) 2006, Sun Microsystems, Inc.
**
** Sun considers its source code as an unpublished, proprietary
** trade secret and it is available only under strict license provisions.
** This copyright notice is placed here only to protect Sun in the event
** the source is deemed a published work. Disassembly, decompilation,
** or other means of reducing the object code to human readable form
** is prohibited by the license agreement under which this code is
** provided to the user or company in possession of this copy.
**
*************************************************************************/
#include "BL_CKEcc.h"
using namespace std;
const int BL_CKEccFile::syndrome[1024][2] =
{
{0,0},
/* 1 */
{0x1101, 0x1011}, {0x2109, 0x9012}, {0x310e, 0xe013}, {0x410d, 0xd014},
{0x510b, 0xb015}, {0x6107, 0x7016}, {0x7106, 0x6017}, {0x810f, 0xf018},
{0x9102, 0x2019}, {0xa10c, 0xc01a}, {0xb105, 0x501b}, {0xc10a, 0xa01c},
{0xd104, 0x401d}, {0xe103, 0x301e}, {0xf108, 0x801f}, {0x1011, 0x1101},
{0x2019, 0x9102}, {0x301e, 0xe103}, {0x401d, 0xd104}, {0x501b, 0xb105},
{0x6017, 0x7106}, {0x7016, 0x6107}, {0x801f, 0xf108}, {0x9012, 0x2109},
{0xa01c, 0xc10a}, {0xb015, 0x510b}, {0xc01a, 0xa10c}, {0xd014, 0x410d},
{0xe013, 0x310e}, {0xf018, 0x810f}, {0x0111, 0x1110}, {0x1110, 0x0111},
/* 2 */
{0x2202, 0x2022}, {0x4201, 0x1024}, {0x620f, 0xf026}, {0x8209, 0x9028},
{0xa205, 0x502a}, {0xc20e, 0xe02c}, {0xe20c, 0xc02e}, {0x320d, 0xd023},
{0x1204, 0x4021}, {0x720b, 0xb027}, {0x520a, 0xa025}, {0xb207, 0x702b},
{0x9208, 0x8029}, {0xf206, 0x602f}, {0xd203, 0x302d}, {0x2022, 0x2202},
{0x4021, 0x1204}, {0x602f, 0xf206}, {0x8029, 0x9208}, {0xa025, 0x520a},
{0xc02e, 0xe20c}, {0xe02c, 0xc20e}, {0x302d, 0xd203}, {0x1024, 0x4201},
{0x702b, 0xb207}, {0x502a, 0xa205}, {0xb027, 0x720b}, {0x9028, 0x8209},
{0xf026, 0x620f}, {0xd023, 0x320d}, {0x0222, 0x2220}, {0x2220, 0x0222},
/* 3 */
{0x3303, 0x3033}, {0x6308, 0x8036}, {0x5301, 0x1035}, {0xc304, 0x403c},
{0xf30e, 0xe03f}, {0xa309, 0x903a}, {0x930a, 0xa039}, {0xb302, 0x203b},
{0x8306, 0x6038}, {0xd307, 0x703d}, {0xe30f, 0xf03e}, {0x730d, 0xd037},
{0x430c, 0xc034}, {0x1305, 0x5031}, {0x230b, 0xb032}, {0x3033, 0x3303},
{0x6038, 0x8306}, {0x5031, 0x1305}, {0xc034, 0x430c}, {0xf03e, 0xe30f},
{0xa039, 0x930a}, {0x903a, 0xa309}, {0xb032, 0x230b}, {0x8036, 0x6308},
{0xd037, 0x730d}, {0xe03f, 0xf30e}, {0x703d, 0xd307}, {0x403c, 0xc304},
{0x1035, 0x5301}, {0x203b, 0xb302}, {0x0333, 0x3330}, {0x3330, 0x0333},
/* 4 */
{0x4404, 0x4044}, {0x8402, 0x2048}, {0xc40d, 0xd04c}, {0x3401, 0x1043},
{0x740a, 0xa047}, {0xb40f, 0xf04b}, {0xf40b, 0xb04f}, {0x6409, 0x9046},
{0x2408, 0x8042}, {0xe405, 0x504e}, {0xa407, 0x704a}, {0x540e, 0xe045},
{0x1403, 0x3041}, {0xd40c, 0xc04d}, {0x9406, 0x6049}, {0x4044, 0x4404},
{0x8042, 0x2408}, {0xc04d, 0xd40c}, {0x3041, 0x1403}, {0x704a, 0xa407},
{0xb04f, 0xf40b}, {0xf04b, 0xb40f}, {0x6049, 0x9406}, {0x2048, 0x8402},
{0xe045, 0x540e}, {0xa047, 0x740a}, {0x504e, 0xe405}, {0x1043, 0x3401},
{0xd04c, 0xc40d}, {0x9046, 0x6409}, {0x0444, 0x4440}, {0x4440, 0x0444},
/* 5 */
{0x5505, 0x5055}, {0xa50b, 0xb05a}, {0xf503, 0x305f}, {0x750c, 0xc057},
{0x2501, 0x1052}, {0xd508, 0x805d}, {0x850d, 0xd058}, {0xe506, 0x605e},
{0xb50a, 0xa05b}, {0x4509, 0x9054}, {0x1502, 0x2051}, {0x9504, 0x4059},
{0xc507, 0x705c}, {0x350f, 0xf053}, {0x650e, 0xe056}, {0x5055, 0x5505},
{0xa05b, 0xb50a}, {0xf053, 0x350f}, {0x705c, 0xc507}, {0x2051, 0x1502},
{0xd058, 0x850d}, {0x805d, 0xd508}, {0xe056, 0x650e}, {0xb05a, 0xa50b},
{0x4059, 0x9504}, {0x1052, 0x2501}, {0x9054, 0x4509}, {0xc057, 0x750c},
{0x305f, 0xf503}, {0x605e, 0xe506}, {0x0555, 0x5550}, {0x5550, 0x0555},
/* 6 */
{0x6606, 0x6066}, {0xc603, 0x306c}, {0xa602, 0x206a}, {0xb608, 0x806b},
{0xd60f, 0xf06d}, {0x7601, 0x1067}, {0x1607, 0x7061}, {0x5604, 0x4065},
{0x360c, 0xc063}, {0x960e, 0xe069}, {0xf60d, 0xd06f}, {0xe609, 0x906e},
{0x860b, 0xb068}, {0x260a, 0xa062}, {0x4605, 0x5064}, {0x6066, 0x6606},
{0xc063, 0x360c}, {0xa062, 0x260a}, {0xb068, 0x860b}, {0xd06f, 0xf60d},
{0x7061, 0x1607}, {0x1067, 0x7601}, {0x5064, 0x4605}, {0x306c, 0xc603},
{0x906e, 0xe609}, {0xf06d, 0xd60f}, {0xe069, 0x960e}, {0x806b, 0xb608},
{0x206a, 0xa602}, {0x4065, 0x5604}, {0x0666, 0x6660}, {0x6660, 0x0666},
/* 7 */
{0x7707, 0x7077}, {0xe70a, 0xa07e}, {0x970c, 0xc079}, {0xf705, 0x507f},
{0x8704, 0x4078}, {0x1706, 0x6071}, {0x6701, 0x1076}, {0xd70b, 0xb07d},
{0xa70e, 0xe07a}, {0x3702, 0x2073}, {0x4708, 0x8074}, {0x2703, 0x3072},
{0x570f, 0xf075}, {0xc709, 0x907c}, {0xb70d, 0xd07b}, {0x7077, 0x7707},
{0xe07a, 0xa70e}, {0x907c, 0xc709}, {0xf075, 0x570f}, {0x8074, 0x4708},
{0x1076, 0x6701}, {0x6071, 0x1706}, {0xd07b, 0xb70d}, {0xa07e, 0xe70a},
{0x3072, 0x2703}, {0x4078, 0x8704}, {0x2073, 0x3702}, {0x507f, 0xf705},
{0xc079, 0x970c}, {0xb07d, 0xd70b}, {0x0777, 0x7770}, {0x7770, 0x0777},
/* 8 */
{0x8808, 0x8088}, {0x3804, 0x4083}, {0xb809, 0x908b}, {0x6802, 0x2086},
{0xe807, 0x708e}, {0x580d, 0xd085}, {0xd805, 0x508d}, {0xc801, 0x108c},
{0x4803, 0x3084}, {0xf80a, 0xa08f}, {0x780e, 0xe087}, {0xa80f, 0xf08a},
{0x2806, 0x6082}, {0x980b, 0xb089}, {0x180c, 0xc081}, {0x8088, 0x8808},
{0x3084, 0x4803}, {0xb089, 0x980b}, {0x6082, 0x2806}, {0xe087, 0x780e},
{0x508d, 0xd805}, {0xd085, 0x580d}, {0xc081, 0x180c}, {0x4083, 0x3804},
{0xf08a, 0xa80f}, {0x708e, 0xe807}, {0xa08f, 0xf80a}, {0x2086, 0x6802},
{0x908b, 0xb809}, {0x108c, 0xc801}, {0x0888, 0x8880}, {0x8880, 0x0888},
/* 9 */
{0x9909, 0x9099}, {0x190d, 0xd091}, {0x8907, 0x7098}, {0x290f, 0xf092},
{0xb90c, 0xc09b}, {0x390a, 0xa093}, {0xa903, 0x309a}, {0x490e, 0xe094},
{0xd901, 0x109d}, {0x5906, 0x6095}, {0xc90b, 0xb09c}, {0x6905, 0x5096},
{0xf902, 0x209f}, {0x7908, 0x8097}, {0xe904, 0x409e}, {0x9099, 0x9909},
{0x109d, 0xd901}, {0x8097, 0x7908}, {0x209f, 0xf902}, {0xb09c, 0xc90b},
{0x309a, 0xa903}, {0xa093, 0x390a}, {0x409e, 0xe904}, {0xd091, 0x190d},
{0x5096, 0x6905}, {0xc09b, 0xb90c}, {0x6095, 0x5906}, {0xf092, 0x290f},
{0x7098, 0x8907}, {0xe094, 0x490e}, {0x0999, 0x9990}, {0x9990, 0x0999},
/* A */
{0xaa0a, 0xa0aa}, {0x7a05, 0x50a7}, {0xda06, 0x60ad},
{0xea0b, 0xb0ae}, {0x4a02, 0x20a4}, {0x9a03, 0x30a9},
{0x3a09, 0x90a3}, {0xfa0c, 0xc0af}, {0x5a07, 0x70a5},
{0x8a01, 0x10a8}, {0x2a04, 0x40a2}, {0x1a08, 0x80a1},
{0xba0e, 0xe0ab}, {0x6a0d, 0xd0a6}, {0xca0f, 0xf0ac},
{0xa0aa, 0xaa0a}, {0x70a5, 0x5a07}, {0xd0a6, 0x6a0d},
{0xe0ab, 0xba0e}, {0x40a2, 0x2a04}, {0x90a3, 0x3a09},
{0x30a9, 0x9a03}, {0xf0ac, 0xca0f}, {0x50a7, 0x7a05},
{0x80a1, 0x1a08}, {0x20a4, 0x4a02}, {0x10a8, 0x8a01},
{0xb0ae, 0xea0b}, {0x60ad, 0xda06}, {0xc0af, 0xfa0c},
{0x0aaa, 0xaaa0}, {0xaaa0, 0x0aaa},
/* B */
{0xbb0b, 0xb0bb}, {0x5b0c, 0xc0b5}, {0xeb08, 0x80be},
{0xab06, 0x60ba}, {0x1b09, 0x90b1}, {0xfb04, 0x40bf},
{0x4b0f, 0xf0b4}, {0x7b03, 0x30b7}, {0xcb05, 0x50bc},
{0x2b0d, 0xd0b2}, {0x9b01, 0x10b9}, {0xdb02, 0x20bd},
{0x6b0a, 0xa0b6}, {0x8b0e, 0xe0b8}, {0x3b07, 0x70b3},
{0xb0bb, 0xbb0b}, {0x50bc, 0xcb05}, {0xe0b8, 0x8b0e},
{0xa0b6, 0x6b0a}, {0x10b9, 0x9b01}, {0xf0b4, 0x4b0f},
{0x40bf, 0xfb04}, {0x70b3, 0x3b07}, {0xc0b5, 0x5b0c},
{0x20bd, 0xdb02}, {0x90b1, 0x1b09}, {0xd0b2, 0x2b0d},
{0x60ba, 0xab06}, {0x80be, 0xeb08}, {0x30b7, 0x7b03},
{0x0bbb, 0xbbb0}, {0xbbb0, 0x0bbb},
/* C */
{0xcc0c, 0xc0cc}, {0xbc06, 0x60cb}, {0x7c04, 0x40c7},
{0x5c03, 0x30c5}, {0x9c0d, 0xd0c9}, {0xec02, 0x20ce},
{0x2c0e, 0xe0c2}, {0xac08, 0x80ca}, {0x6c0b, 0xb0c6},
{0x1c0f, 0xf0c1}, {0xdc09, 0x90cd}, {0xfc01, 0x10cf},
{0x3c05, 0x50c3}, {0x4c07, 0x70c4}, {0x8c0a, 0xa0c8},
{0xc0cc, 0xcc0c}, {0xb0c6, 0x6c0b}, {0x70c4, 0x4c07},
{0x50c3, 0x3c05}, {0x90cd, 0xdc09}, {0xe0c2, 0x2c0e},
{0x20ce, 0xec02}, {0xa0c8, 0x8c0a}, {0x60cb, 0xbc06},
{0x10cf, 0xfc01}, {0xd0c9, 0x9c0d}, {0xf0c1, 0x1c0f},
{0x30c5, 0x5c03}, {0x40c7, 0x7c04}, {0x80ca, 0xac08},
{0x0ccc, 0xccc0}, {0xccc0, 0x0ccc},
/* D */
{0xdd0d, 0xd0dd}, {0x9d0f, 0xf0d9}, {0x4d0a, 0xa0d4},
{0x1d0e, 0xe0d1}, {0xcd06, 0x60dc}, {0x8d05, 0x50d8},
{0x5d08, 0x80d5}, {0x2d07, 0x70d2}, {0xfd09, 0x90df},
{0xbd03, 0x30db}, {0x6d0c, 0xc0d6}, {0x3d0b, 0xb0d3},
{0xed01, 0x10de}, {0xad04, 0x40da}, {0x7d02, 0x20d7},
{0xd0dd, 0xdd0d}, {0x90df, 0xfd09}, {0x40da, 0xad04},
{0x10de, 0xed01}, {0xc0d6, 0x6d0c}, {0x80d5, 0x5d08},
{0x50d8, 0x8d05}, {0x20d7, 0x7d02}, {0xf0d9, 0x9d0f},
{0xb0d3, 0x3d0b}, {0x60dc, 0xcd06}, {0x30db, 0xbd03},
{0xe0d1, 0x1d0e}, {0xa0d4, 0x4d0a}, {0x70d2, 0x2d07},
{0x0ddd, 0xddd0}, {0xddd0, 0x0ddd},
/* E */
{0xee0e, 0xe0ee}, {0xfe07, 0x70ef}, {0x1e0b, 0xb0e1},
{0xde0a, 0xa0ed}, {0x3e08, 0x80e3}, {0x2e0c, 0xc0e2},
{0xce02, 0x20ec}, {0x9e05, 0x50e9}, {0x7e0f, 0xf0e7},
{0x6e04, 0x40e6}, {0x8e03, 0x30e8}, {0x4e06, 0x60e4},
{0xae0d, 0xd0ea}, {0xbe01, 0x10eb}, {0x5e09, 0x90e5},
{0xe0ee, 0xee0e}, {0xf0e7, 0x7e0f}, {0x10eb, 0xbe01},
{0xd0ea, 0xae0d}, {0x30e8, 0x8e03}, {0x20ec, 0xce02},
{0xc0e2, 0x2e0c}, {0x90e5, 0x5e09}, {0x70ef, 0xfe07},
{0x60e4, 0x4e06}, {0x80e3, 0x3e08}, {0x40e6, 0x6e04},
{0xa0ed, 0xde0a}, {0xb0e1, 0x1e0b}, {0x50e9, 0x9e05},
{0x0eee, 0xeee0}, {0xeee0, 0x0eee},
/* F */
{0xff0f, 0xf0ff}, {0xdf0e, 0xe0fd}, {0x2f05, 0x50f2},
{0x9f07, 0x70f9}, {0x6f03, 0x30f6}, {0x4f0b, 0xb0f4},
{0xbf04, 0x40fb}, {0x1f0a, 0xa0f1}, {0xef0d, 0xd0fe},
{0xcf08, 0x80fc}, {0x3f06, 0x60f3}, {0x8f0c, 0xc0f8},
{0x7f09, 0x90f7}, {0x5f02, 0x20f5}, {0xaf01, 0x10fa},
{0xf0ff, 0xff0f}, {0xd0fe, 0xef0d}, {0x20f5, 0x5f02},
{0x90f7, 0x7f09}, {0x60f3, 0x3f06}, {0x40fb, 0xbf04},
{0xb0f4, 0x4f0b}, {0x10fa, 0xaf01}, {0xe0fd, 0xdf0e},
{0xc0f8, 0x8f0c}, {0x30f6, 0x6f03}, {0x80fc, 0xcf08},
{0x70f9, 0x9f07}, {0x50f2, 0x2f05}, {0xa0f1, 0x1f0a},
{0x0fff, 0xfff0}, {0xfff0, 0x0fff},
/* */
{0x0111, 0x1110}, {0x0222, 0x2220}, {0x0333, 0x3330},
{0x0444, 0x4440}, {0x0555, 0x5550}, {0x0666, 0x6660},
{0x0777, 0x7770}, {0x0888, 0x8880}, {0x0999, 0x9990},
{0x0aaa, 0xaaa0}, {0x0bbb, 0xbbb0}, {0x0ccc, 0xccc0},
{0x0ddd, 0xddd0}, {0x0eee, 0xeee0}, {0x0fff, 0xfff0},
{0x0000, 0x0000},
{0x1110, 0x0111}, {0x2220, 0x0222}, {0x3330, 0x0333},
{0x4440, 0x0444}, {0x5550, 0x0555}, {0x6660, 0x0666},
{0x7770, 0x0777}, {0x8880, 0x0888}, {0x9990, 0x0999},
{0xaaa0, 0x0aaa}, {0xbbb0, 0x0bbb}, {0xccc0, 0x0ccc},
{0xddd0, 0x0ddd}, {0xeee0, 0x0eee}, {0xfff0, 0x0fff},
{0x0000, 0x0000},
{0x1011, 0x1101}, {0x2022, 0x2202}, {0x3033, 0x3303},
{0x4044, 0x4404}, {0x5055, 0x5505}, {0x6066, 0x6606},
{0x7077, 0x7707}, {0x8088, 0x8808}, {0x9099, 0x9909},
{0xa0aa, 0xaa0a}, {0xb0bb, 0xbb0b}, {0xc0cc, 0xcc0c},
{0xd0dd, 0xdd0d}, {0xe0ee, 0xee0e}, {0xf0ff, 0xff0f},
{0x0000, 0x0000},
{0x1000, 0x0001}, {0x2000, 0x0002}, {0x3000, 0x0003},
{0x4000, 0x0004}, {0x5000, 0x0005}, {0x6000, 0x0006},
{0x7000, 0x0007}, {0x8000, 0x0008}, {0x9000, 0x0009},
{0xa000, 0x000a}, {0xb000, 0x000b}, {0xc000, 0x000c},
{0xd000, 0x000d}, {0xe000, 0x000e}, {0xf000, 0x000f},
{0x0000, 0x0000},
{0x0100, 0x0010}, {0x0200, 0x0020}, {0x0300, 0x0030},
{0x0400, 0x0040}, {0x0500, 0x0050}, {0x0600, 0x0060},
{0x0700, 0x0070}, {0x0800, 0x0080}, {0x0900, 0x0090},
{0x0a00, 0x00a0}, {0x0b00, 0x00b0}, {0x0c00, 0x00c0},
{0x0d00, 0x00d0}, {0x0e00, 0x00e0}, {0x0f00, 0x00f0},
{0x0000, 0x0000},
{0x0010, 0x0100}, {0x0020, 0x0200}, {0x0030, 0x0300},
{0x0040, 0x0400}, {0x0050, 0x0500}, {0x0060, 0x0600},
{0x0070, 0x0700}, {0x0080, 0x0800}, {0x0090, 0x0900},
{0x00a0, 0x0a00}, {0x00b0, 0x0b00}, {0x00c0, 0x0c00},
{0x00d0, 0x0d00}, {0x00e0, 0x0e00}, {0x00f0, 0x0f00},
{0x0000, 0x0000},
{0x0001, 0x1000}, {0x0002, 0x2000}, {0x0003, 0x3000},
{0x0004, 0x4000}, {0x0005, 0x5000}, {0x0006, 0x6000},
{0x0007, 0x7000}, {0x0008, 0x8000}, {0x0009, 0x9000},
{0x000a, 0xa000}, {0x000b, 0xb000}, {0x000c, 0xc000},
{0x000d, 0xd000}, {0x000e, 0xe000}, {0x000f, 0xf000},
{0x0000, 0x0000},
{0xa854, 0x458a}, {0x0612, 0x2160}, {0x033c, 0xc330},
{0x06be, 0xeb60}, {0x0b06, 0x60b0}, {0x0c7c, 0xc7c0},
{0x0dd3, 0x3dd0}, {0x0dee, 0xeed0}, {0x0faa, 0xaaf0},
{0x12c7, 0x7c21}, {0x13ae, 0xea31}, {0x15ee, 0xee51},
{0x1676, 0x6761}, {0x1688, 0x8861}, {0x180e, 0xe081},
{0x18b4, 0x4b81},
};
const unsigned long long BL_CKEccFile::synd_exp_data [1024][2] =
{
/* word 0, word 1*/
{0x0000000000000000, 0x0000000000000000},
/* Addr N Addr N+8 */
{0x0000000000000000, 0x0000000000000001},
{0x0000000000000000, 0x0000000000000010},
{0x0000000000000000, 0x0000000000000100},
{0x0000000000000000, 0x0000000000001000},
{0x0000000000000000, 0x0000000000010000},
{0x0000000000000000, 0x0000000000100000},
{0x0000000000000000, 0x0000000001000000},
{0x0000000000000000, 0x0000000010000000},
{0x0000000000000000, 0x0000000100000000},
{0x0000000000000000, 0x0000001000000000},
{0x0000000000000000, 0x0000010000000000},
{0x0000000000000000, 0x0000100000000000},
{0x0000000000000000, 0x0001000000000000},
{0x0000000000000000, 0x0010000000000000},
{0x0000000000000000, 0x0100000000000000},
{0x0000000000000000, 0x1000000000000000},
{0x0000000000000001, 0x0000000000000000},
{0x0000000000000010, 0x0000000000000000},
{0x0000000000000100, 0x0000000000000000},
{0x0000000000001000, 0x0000000000000000},
{0x0000000000010000, 0x0000000000000000},
{0x0000000000100000, 0x0000000000000000},
{0x0000000001000000, 0x0000000000000000},
{0x0000000010000000, 0x0000000000000000},
{0x0000000100000000, 0x0000000000000000},
{0x0000001000000000, 0x0000000000000000},
{0x0000010000000000, 0x0000000000000000},
{0x0000100000000000, 0x0000000000000000},
{0x0001000000000000, 0x0000000000000000},
{0x0010000000000000, 0x0000000000000000},
{0x0100000000000000, 0x0000000000000000},
{0x1000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000002},
{0x0000000000000000, 0x0000000000000020},
{0x0000000000000000, 0x0000000000000200},
{0x0000000000000000, 0x0000000000002000},
{0x0000000000000000, 0x0000000000020000},
{0x0000000000000000, 0x0000000000200000},
{0x0000000000000000, 0x0000000002000000},
{0x0000000000000000, 0x0000000020000000},
{0x0000000000000000, 0x0000000200000000},
{0x0000000000000000, 0x0000002000000000},
{0x0000000000000000, 0x0000020000000000},
{0x0000000000000000, 0x0000200000000000},
{0x0000000000000000, 0x0002000000000000},
{0x0000000000000000, 0x0020000000000000},
{0x0000000000000000, 0x0200000000000000},
{0x0000000000000000, 0x2000000000000000},
{0x0000000000000002, 0x0000000000000000},
{0x0000000000000020, 0x0000000000000000},
{0x0000000000000200, 0x0000000000000000},
{0x0000000000002000, 0x0000000000000000},
{0x0000000000020000, 0x0000000000000000},
{0x0000000000200000, 0x0000000000000000},
{0x0000000002000000, 0x0000000000000000},
{0x0000000020000000, 0x0000000000000000},
{0x0000000200000000, 0x0000000000000000},
{0x0000002000000000, 0x0000000000000000},
{0x0000020000000000, 0x0000000000000000},
{0x0000200000000000, 0x0000000000000000},
{0x0002000000000000, 0x0000000000000000},
{0x0020000000000000, 0x0000000000000000},
{0x0200000000000000, 0x0000000000000000},
{0x2000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000003},
{0x0000000000000000, 0x0000000000000030},
{0x0000000000000000, 0x0000000000000300},
{0x0000000000000000, 0x0000000000003000},
{0x0000000000000000, 0x0000000000030000},
{0x0000000000000000, 0x0000000000300000},
{0x0000000000000000, 0x0000000003000000},
{0x0000000000000000, 0x0000000030000000},
{0x0000000000000000, 0x0000000300000000},
{0x0000000000000000, 0x0000003000000000},
{0x0000000000000000, 0x0000030000000000},
{0x0000000000000000, 0x0000300000000000},
{0x0000000000000000, 0x0003000000000000},
{0x0000000000000000, 0x0030000000000000},
{0x0000000000000000, 0x0300000000000000},
{0x0000000000000000, 0x3000000000000000},
{0x0000000000000003, 0x0000000000000000},
{0x0000000000000030, 0x0000000000000000},
{0x0000000000000300, 0x0000000000000000},
{0x0000000000003000, 0x0000000000000000},
{0x0000000000030000, 0x0000000000000000},
{0x0000000000300000, 0x0000000000000000},
{0x0000000003000000, 0x0000000000000000},
{0x0000000030000000, 0x0000000000000000},
{0x0000000300000000, 0x0000000000000000},
{0x0000003000000000, 0x0000000000000000},
{0x0000030000000000, 0x0000000000000000},
{0x0000300000000000, 0x0000000000000000},
{0x0003000000000000, 0x0000000000000000},
{0x0030000000000000, 0x0000000000000000},
{0x0300000000000000, 0x0000000000000000},
{0x3000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000004},
{0x0000000000000000, 0x0000000000000040},
{0x0000000000000000, 0x0000000000000400},
{0x0000000000000000, 0x0000000000004000},
{0x0000000000000000, 0x0000000000040000},
{0x0000000000000000, 0x0000000000400000},
{0x0000000000000000, 0x0000000004000000},
{0x0000000000000000, 0x0000000040000000},
{0x0000000000000000, 0x0000000400000000},
{0x0000000000000000, 0x0000004000000000},
{0x0000000000000000, 0x0000040000000000},
{0x0000000000000000, 0x0000400000000000},
{0x0000000000000000, 0x0004000000000000},
{0x0000000000000000, 0x0040000000000000},
{0x0000000000000000, 0x0400000000000000},
{0x0000000000000000, 0x4000000000000000},
{0x0000000000000004, 0x0000000000000000},
{0x0000000000000040, 0x0000000000000000},
{0x0000000000000400, 0x0000000000000000},
{0x0000000000004000, 0x0000000000000000},
{0x0000000000040000, 0x0000000000000000},
{0x0000000000400000, 0x0000000000000000},
{0x0000000004000000, 0x0000000000000000},
{0x0000000040000000, 0x0000000000000000},
{0x0000000400000000, 0x0000000000000000},
{0x0000004000000000, 0x0000000000000000},
{0x0000040000000000, 0x0000000000000000},
{0x0000400000000000, 0x0000000000000000},
{0x0004000000000000, 0x0000000000000000},
{0x0040000000000000, 0x0000000000000000},
{0x0400000000000000, 0x0000000000000000},
{0x4000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000005},
{0x0000000000000000, 0x0000000000000050},
{0x0000000000000000, 0x0000000000000500},
{0x0000000000000000, 0x0000000000005000},
{0x0000000000000000, 0x0000000000050000},
{0x0000000000000000, 0x0000000000500000},
{0x0000000000000000, 0x0000000005000000},
{0x0000000000000000, 0x0000000050000000},
{0x0000000000000000, 0x0000000500000000},
{0x0000000000000000, 0x0000005000000000},
{0x0000000000000000, 0x0000050000000000},
{0x0000000000000000, 0x0000500000000000},
{0x0000000000000000, 0x0005000000000000},
{0x0000000000000000, 0x0050000000000000},
{0x0000000000000000, 0x0500000000000000},
{0x0000000000000000, 0x5000000000000000},
{0x0000000000000005, 0x0000000000000000},
{0x0000000000000050, 0x0000000000000000},
{0x0000000000000500, 0x0000000000000000},
{0x0000000000005000, 0x0000000000000000},
{0x0000000000050000, 0x0000000000000000},
{0x0000000000500000, 0x0000000000000000},
{0x0000000005000000, 0x0000000000000000},
{0x0000000050000000, 0x0000000000000000},
{0x0000000500000000, 0x0000000000000000},
{0x0000005000000000, 0x0000000000000000},
{0x0000050000000000, 0x0000000000000000},
{0x0000500000000000, 0x0000000000000000},
{0x0005000000000000, 0x0000000000000000},
{0x0050000000000000, 0x0000000000000000},
{0x0500000000000000, 0x0000000000000000},
{0x5000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000006},
{0x0000000000000000, 0x0000000000000060},
{0x0000000000000000, 0x0000000000000600},
{0x0000000000000000, 0x0000000000006000},
{0x0000000000000000, 0x0000000000060000},
{0x0000000000000000, 0x0000000000600000},
{0x0000000000000000, 0x0000000006000000},
{0x0000000000000000, 0x0000000060000000},
{0x0000000000000000, 0x0000000600000000},
{0x0000000000000000, 0x0000006000000000},
{0x0000000000000000, 0x0000060000000000},
{0x0000000000000000, 0x0000600000000000},
{0x0000000000000000, 0x0006000000000000},
{0x0000000000000000, 0x0060000000000000},
{0x0000000000000000, 0x0600000000000000},
{0x0000000000000000, 0x6000000000000000},
{0x0000000000000006, 0x0000000000000000},
{0x0000000000000060, 0x0000000000000000},
{0x0000000000000600, 0x0000000000000000},
{0x0000000000006000, 0x0000000000000000},
{0x0000000000060000, 0x0000000000000000},
{0x0000000000600000, 0x0000000000000000},
{0x0000000006000000, 0x0000000000000000},
{0x0000000060000000, 0x0000000000000000},
{0x0000000600000000, 0x0000000000000000},
{0x0000006000000000, 0x0000000000000000},
{0x0000060000000000, 0x0000000000000000},
{0x0000600000000000, 0x0000000000000000},
{0x0006000000000000, 0x0000000000000000},
{0x0060000000000000, 0x0000000000000000},
{0x0600000000000000, 0x0000000000000000},
{0x6000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000007},
{0x0000000000000000, 0x0000000000000070},
{0x0000000000000000, 0x0000000000000700},
{0x0000000000000000, 0x0000000000007000},
{0x0000000000000000, 0x0000000000070000},
{0x0000000000000000, 0x0000000000700000},
{0x0000000000000000, 0x0000000007000000},
{0x0000000000000000, 0x0000000070000000},
{0x0000000000000000, 0x0000000700000000},
{0x0000000000000000, 0x0000007000000000},
{0x0000000000000000, 0x0000070000000000},
{0x0000000000000000, 0x0000700000000000},
{0x0000000000000000, 0x0007000000000000},
{0x0000000000000000, 0x0070000000000000},
{0x0000000000000000, 0x0700000000000000},
{0x0000000000000000, 0x7000000000000000},
{0x0000000000000007, 0x0000000000000000},
{0x0000000000000070, 0x0000000000000000},
{0x0000000000000700, 0x0000000000000000},
{0x0000000000007000, 0x0000000000000000},
{0x0000000000070000, 0x0000000000000000},
{0x0000000000700000, 0x0000000000000000},
{0x0000000007000000, 0x0000000000000000},
{0x0000000070000000, 0x0000000000000000},
{0x0000000700000000, 0x0000000000000000},
{0x0000007000000000, 0x0000000000000000},
{0x0000070000000000, 0x0000000000000000},
{0x0000700000000000, 0x0000000000000000},
{0x0007000000000000, 0x0000000000000000},
{0x0070000000000000, 0x0000000000000000},
{0x0700000000000000, 0x0000000000000000},
{0x7000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000008},
{0x0000000000000000, 0x0000000000000080},
{0x0000000000000000, 0x0000000000000800},
{0x0000000000000000, 0x0000000000008000},
{0x0000000000000000, 0x0000000000080000},
{0x0000000000000000, 0x0000000000800000},
{0x0000000000000000, 0x0000000008000000},
{0x0000000000000000, 0x0000000080000000},
{0x0000000000000000, 0x0000000800000000},
{0x0000000000000000, 0x0000008000000000},
{0x0000000000000000, 0x0000080000000000},
{0x0000000000000000, 0x0000800000000000},
{0x0000000000000000, 0x0008000000000000},
{0x0000000000000000, 0x0080000000000000},
{0x0000000000000000, 0x0800000000000000},
{0x0000000000000000, 0x8000000000000000},
{0x0000000000000008, 0x0000000000000000},
{0x0000000000000080, 0x0000000000000000},
{0x0000000000000800, 0x0000000000000000},
{0x0000000000008000, 0x0000000000000000},
{0x0000000000080000, 0x0000000000000000},
{0x0000000000800000, 0x0000000000000000},
{0x0000000008000000, 0x0000000000000000},
{0x0000000080000000, 0x0000000000000000},
{0x0000000800000000, 0x0000000000000000},
{0x0000008000000000, 0x0000000000000000},
{0x0000080000000000, 0x0000000000000000},
{0x0000800000000000, 0x0000000000000000},
{0x0008000000000000, 0x0000000000000000},
{0x0080000000000000, 0x0000000000000000},
{0x0800000000000000, 0x0000000000000000},
{0x8000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000009},
{0x0000000000000000, 0x0000000000000090},
{0x0000000000000000, 0x0000000000000900},
{0x0000000000000000, 0x0000000000009000},
{0x0000000000000000, 0x0000000000090000},
{0x0000000000000000, 0x0000000000900000},
{0x0000000000000000, 0x0000000009000000},
{0x0000000000000000, 0x0000000090000000},
{0x0000000000000000, 0x0000000900000000},
{0x0000000000000000, 0x0000009000000000},
{0x0000000000000000, 0x0000090000000000},
{0x0000000000000000, 0x0000900000000000},
{0x0000000000000000, 0x0009000000000000},
{0x0000000000000000, 0x0090000000000000},
{0x0000000000000000, 0x0900000000000000},
{0x0000000000000000, 0x9000000000000000},
{0x0000000000000009, 0x0000000000000000},
{0x0000000000000090, 0x0000000000000000},
{0x0000000000000900, 0x0000000000000000},
{0x0000000000009000, 0x0000000000000000},
{0x0000000000090000, 0x0000000000000000},
{0x0000000000900000, 0x0000000000000000},
{0x0000000009000000, 0x0000000000000000},
{0x0000000090000000, 0x0000000000000000},
{0x0000000900000000, 0x0000000000000000},
{0x0000009000000000, 0x0000000000000000},
{0x0000090000000000, 0x0000000000000000},
{0x0000900000000000, 0x0000000000000000},
{0x0009000000000000, 0x0000000000000000},
{0x0090000000000000, 0x0000000000000000},
{0x0900000000000000, 0x0000000000000000},
{0x9000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x000000000000000a},
{0x0000000000000000, 0x00000000000000a0},
{0x0000000000000000, 0x0000000000000a00},
{0x0000000000000000, 0x000000000000a000},
{0x0000000000000000, 0x00000000000a0000},
{0x0000000000000000, 0x0000000000a00000},
{0x0000000000000000, 0x000000000a000000},
{0x0000000000000000, 0x00000000a0000000},
{0x0000000000000000, 0x0000000a00000000},
{0x0000000000000000, 0x000000a000000000},
{0x0000000000000000, 0x00000a0000000000},
{0x0000000000000000, 0x0000a00000000000},
{0x0000000000000000, 0x000a000000000000},
{0x0000000000000000, 0x00a0000000000000},
{0x0000000000000000, 0x0a00000000000000},
{0x0000000000000000, 0xa000000000000000},
{0x000000000000000a, 0x0000000000000000},
{0x00000000000000a0, 0x0000000000000000},
{0x0000000000000a00, 0x0000000000000000},
{0x000000000000a000, 0x0000000000000000},
{0x00000000000a0000, 0x0000000000000000},
{0x0000000000a00000, 0x0000000000000000},
{0x000000000a000000, 0x0000000000000000},
{0x00000000a0000000, 0x0000000000000000},
{0x0000000a00000000, 0x0000000000000000},
{0x000000a000000000, 0x0000000000000000},
{0x00000a0000000000, 0x0000000000000000},
{0x0000a00000000000, 0x0000000000000000},
{0x000a000000000000, 0x0000000000000000},
{0x00a0000000000000, 0x0000000000000000},
{0x0a00000000000000, 0x0000000000000000},
{0xa000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x000000000000000b},
{0x0000000000000000, 0x00000000000000b0},
{0x0000000000000000, 0x0000000000000b00},
{0x0000000000000000, 0x000000000000b000},
{0x0000000000000000, 0x00000000000b0000},
{0x0000000000000000, 0x0000000000b00000},
{0x0000000000000000, 0x000000000b000000},
{0x0000000000000000, 0x00000000b0000000},
{0x0000000000000000, 0x0000000b00000000},
{0x0000000000000000, 0x000000b000000000},
{0x0000000000000000, 0x00000b0000000000},
{0x0000000000000000, 0x0000b00000000000},
{0x0000000000000000, 0x000b000000000000},
{0x0000000000000000, 0x00b0000000000000},
{0x0000000000000000, 0x0b00000000000000},
{0x0000000000000000, 0xb000000000000000},
{0x000000000000000b, 0x0000000000000000},
{0x00000000000000b0, 0x0000000000000000},
{0x0000000000000b00, 0x0000000000000000},
{0x000000000000b000, 0x0000000000000000},
{0x00000000000b0000, 0x0000000000000000},
{0x0000000000b00000, 0x0000000000000000},
{0x000000000b000000, 0x0000000000000000},
{0x00000000b0000000, 0x0000000000000000},
{0x0000000b00000000, 0x0000000000000000},
{0x000000b000000000, 0x0000000000000000},
{0x00000b0000000000, 0x0000000000000000},
{0x0000b00000000000, 0x0000000000000000},
{0x000b000000000000, 0x0000000000000000},
{0x00b0000000000000, 0x0000000000000000},
{0x0b00000000000000, 0x0000000000000000},
{0xb000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x000000000000000c},
{0x0000000000000000, 0x00000000000000c0},
{0x0000000000000000, 0x0000000000000c00},
{0x0000000000000000, 0x000000000000c000},
{0x0000000000000000, 0x00000000000c0000},
{0x0000000000000000, 0x0000000000c00000},
{0x0000000000000000, 0x000000000c000000},
{0x0000000000000000, 0x00000000c0000000},
{0x0000000000000000, 0x0000000c00000000},
{0x0000000000000000, 0x000000c000000000},
{0x0000000000000000, 0x00000c0000000000},
{0x0000000000000000, 0x0000c00000000000},
{0x0000000000000000, 0x000c000000000000},
{0x0000000000000000, 0x00c0000000000000},
{0x0000000000000000, 0x0c00000000000000},
{0x0000000000000000, 0xc000000000000000},
{0x000000000000000c, 0x0000000000000000},
{0x00000000000000c0, 0x0000000000000000},
{0x0000000000000c00, 0x0000000000000000},
{0x000000000000c000, 0x0000000000000000},
{0x00000000000c0000, 0x0000000000000000},
{0x0000000000c00000, 0x0000000000000000},
{0x000000000c000000, 0x0000000000000000},
{0x00000000c0000000, 0x0000000000000000},
{0x0000000c00000000, 0x0000000000000000},
{0x000000c000000000, 0x0000000000000000},
{0x00000c0000000000, 0x0000000000000000},
{0x0000c00000000000, 0x0000000000000000},
{0x000c000000000000, 0x0000000000000000},
{0x00c0000000000000, 0x0000000000000000},
{0x0c00000000000000, 0x0000000000000000},
{0xc000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x000000000000000d},
{0x0000000000000000, 0x00000000000000d0},
{0x0000000000000000, 0x0000000000000d00},
{0x0000000000000000, 0x000000000000d000},
{0x0000000000000000, 0x00000000000d0000},
{0x0000000000000000, 0x0000000000d00000},
{0x0000000000000000, 0x000000000d000000},
{0x0000000000000000, 0x00000000d0000000},
{0x0000000000000000, 0x0000000d00000000},
{0x0000000000000000, 0x000000d000000000},
{0x0000000000000000, 0x00000d0000000000},
{0x0000000000000000, 0x0000d00000000000},
{0x0000000000000000, 0x000d000000000000},
{0x0000000000000000, 0x00d0000000000000},
{0x0000000000000000, 0x0d00000000000000},
{0x0000000000000000, 0xd000000000000000},
{0x000000000000000d, 0x0000000000000000},
{0x00000000000000d0, 0x0000000000000000},
{0x0000000000000d00, 0x0000000000000000},
{0x000000000000d000, 0x0000000000000000},
{0x00000000000d0000, 0x0000000000000000},
{0x0000000000d00000, 0x0000000000000000},
{0x000000000d000000, 0x0000000000000000},
{0x00000000d0000000, 0x0000000000000000},
{0x0000000d00000000, 0x0000000000000000},
{0x000000d000000000, 0x0000000000000000},
{0x00000d0000000000, 0x0000000000000000},
{0x0000d00000000000, 0x0000000000000000},
{0x000d000000000000, 0x0000000000000000},
{0x00d0000000000000, 0x0000000000000000},
{0x0d00000000000000, 0x0000000000000000},
{0xd000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x000000000000000e},
{0x0000000000000000, 0x00000000000000e0},
{0x0000000000000000, 0x0000000000000e00},
{0x0000000000000000, 0x000000000000e000},
{0x0000000000000000, 0x00000000000e0000},
{0x0000000000000000, 0x0000000000e00000},
{0x0000000000000000, 0x000000000e000000},
{0x0000000000000000, 0x00000000e0000000},
{0x0000000000000000, 0x0000000e00000000},
{0x0000000000000000, 0x000000e000000000},
{0x0000000000000000, 0x00000e0000000000},
{0x0000000000000000, 0x0000e00000000000},
{0x0000000000000000, 0x000e000000000000},
{0x0000000000000000, 0x00e0000000000000},
{0x0000000000000000, 0x0e00000000000000},
{0x0000000000000000, 0xe000000000000000},
{0x000000000000000e, 0x0000000000000000},
{0x00000000000000e0, 0x0000000000000000},
{0x0000000000000e00, 0x0000000000000000},
{0x000000000000e000, 0x0000000000000000},
{0x00000000000e0000, 0x0000000000000000},
{0x0000000000e00000, 0x0000000000000000},
{0x000000000e000000, 0x0000000000000000},
{0x00000000e0000000, 0x0000000000000000},
{0x0000000e00000000, 0x0000000000000000},
{0x000000e000000000, 0x0000000000000000},
{0x00000e0000000000, 0x0000000000000000},
{0x0000e00000000000, 0x0000000000000000},
{0x000e000000000000, 0x0000000000000000},
{0x00e0000000000000, 0x0000000000000000},
{0x0e00000000000000, 0x0000000000000000},
{0xe000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x000000000000000f},
{0x0000000000000000, 0x00000000000000f0},
{0x0000000000000000, 0x0000000000000f00},
{0x0000000000000000, 0x000000000000f000},
{0x0000000000000000, 0x00000000000f0000},
{0x0000000000000000, 0x0000000000f00000},
{0x0000000000000000, 0x000000000f000000},
{0x0000000000000000, 0x00000000f0000000},
{0x0000000000000000, 0x0000000f00000000},
{0x0000000000000000, 0x000000f000000000},
{0x0000000000000000, 0x00000f0000000000},
{0x0000000000000000, 0x0000f00000000000},
{0x0000000000000000, 0x000f000000000000},
{0x0000000000000000, 0x00f0000000000000},
{0x0000000000000000, 0x0f00000000000000},
{0x0000000000000000, 0xf000000000000000},
{0x000000000000000f, 0x0000000000000000},
{0x00000000000000f0, 0x0000000000000000},
{0x0000000000000f00, 0x0000000000000000},
{0x000000000000f000, 0x0000000000000000},
{0x00000000000f0000, 0x0000000000000000},
{0x0000000000f00000, 0x0000000000000000},
{0x000000000f000000, 0x0000000000000000},
{0x00000000f0000000, 0x0000000000000000},
{0x0000000f00000000, 0x0000000000000000},
{0x000000f000000000, 0x0000000000000000},
{0x00000f0000000000, 0x0000000000000000},
{0x0000f00000000000, 0x0000000000000000},
{0x000f000000000000, 0x0000000000000000},
{0x00f0000000000000, 0x0000000000000000},
{0x0f00000000000000, 0x0000000000000000},
{0xf000000000000000, 0x0000000000000000},
{0x0100000000000000, 0x0000000000000000},
{0x0200000000000000, 0x0000000000000000},
{0x0300000000000000, 0x0000000000000000},
{0x0400000000000000, 0x0000000000000000},
{0x0500000000000000, 0x0000000000000000},
{0x0600000000000000, 0x0000000000000000},
{0x0700000000000000, 0x0000000000000000},
{0x0800000000000000, 0x0000000000000000},
{0x0900000000000000, 0x0000000000000000},
{0x0a00000000000000, 0x0000000000000000},
{0x0b00000000000000, 0x0000000000000000},
{0x0c00000000000000, 0x0000000000000000},
{0x0d00000000000000, 0x0000000000000000},
{0x0e00000000000000, 0x0000000000000000},
{0x0f00000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x1000000000000000, 0x0000000000000000},
{0x2000000000000000, 0x0000000000000000},
{0x3000000000000000, 0x0000000000000000},
{0x4000000000000000, 0x0000000000000000},
{0x5000000000000000, 0x0000000000000000},
{0x6000000000000000, 0x0000000000000000},
{0x7000000000000000, 0x0000000000000000},
{0x8000000000000000, 0x0000000000000000},
{0x9000000000000000, 0x0000000000000000},
{0xa000000000000000, 0x0000000000000000},
{0xb000000000000000, 0x0000000000000000},
{0xc000000000000000, 0x0000000000000000},
{0xd000000000000000, 0x0000000000000000},
{0xe000000000000000, 0x0000000000000000},
{0xf000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x1000000000000000},
{0x0000000000000000, 0x2000000000000000},
{0x0000000000000000, 0x3000000000000000},
{0x0000000000000000, 0x4000000000000000},
{0x0000000000000000, 0x5000000000000000},
{0x0000000000000000, 0x6000000000000000},
{0x0000000000000000, 0x7000000000000000},
{0x0000000000000000, 0x8000000000000000},
{0x0000000000000000, 0x9000000000000000},
{0x0000000000000000, 0xa000000000000000},
{0x0000000000000000, 0xb000000000000000},
{0x0000000000000000, 0xc000000000000000},
{0x0000000000000000, 0xd000000000000000},
{0x0000000000000000, 0xe000000000000000},
{0x0000000000000000, 0xf000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
{0x0000000000000000, 0x0000000000000000},
};
const unsigned char BL_CKEccFile::galois[16][16] =
{
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
/* 0 */ { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
/* 1 */ { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, },
/* 2 */ { 0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x3, 0x1, 0x7, 0x5, 0xb, 0x9, 0xf, 0xd, },
/* 3 */ { 0x0, 0x3, 0x6, 0x5, 0xc, 0xf, 0xa, 0x9, 0xb, 0x8, 0xd, 0xe, 0x7, 0x4, 0x1, 0x2, },
/* 4 */ { 0x0, 0x4, 0x8, 0xc, 0x3, 0x7, 0xb, 0xf, 0x6, 0x2, 0xe, 0xa, 0x5, 0x1, 0xd, 0x9, },
/* 5 */ { 0x0, 0x5, 0xa, 0xf, 0x7, 0x2, 0xd, 0x8, 0xe, 0xb, 0x4, 0x1, 0x9, 0xc, 0x3, 0x6, },
/* 6 */ { 0x0, 0x6, 0xc, 0xa, 0xb, 0xd, 0x7, 0x1, 0x5, 0x3, 0x9, 0xf, 0xe, 0x8, 0x2, 0x4, },
/* 7 */ { 0x0, 0x7, 0xe, 0x9, 0xf, 0x8, 0x1, 0x6, 0xd, 0xa, 0x3, 0x4, 0x2, 0x5, 0xc, 0xb, },
/* 8 */ { 0x0, 0x8, 0x3, 0xb, 0x6, 0xe, 0x5, 0xd, 0xc, 0x4, 0xf, 0x7, 0xa, 0x2, 0x9, 0x1, },
/* 9 */ { 0x0, 0x9, 0x1, 0x8, 0x2, 0xb, 0x3, 0xa, 0x4, 0xd, 0x5, 0xc, 0x6, 0xf, 0x7, 0xe, },
/* a */ { 0x0, 0xa, 0x7, 0xd, 0xe, 0x4, 0x9, 0x3, 0xf, 0x5, 0x8, 0x2, 0x1, 0xb, 0x6, 0xc, },
/* b */ { 0x0, 0xb, 0x5, 0xe, 0xa, 0x1, 0xf, 0x4, 0x7, 0xc, 0x2, 0x9, 0xd, 0x6, 0x8, 0x3, },
/* c */ { 0x0, 0xc, 0xb, 0x7, 0x5, 0x9, 0xe, 0x2, 0xa, 0x6, 0x1, 0xd, 0xf, 0x3, 0x4, 0x8, },
/* d */ { 0x0, 0xd, 0x9, 0x4, 0x1, 0xc, 0x8, 0x5, 0x2, 0xf, 0xb, 0x6, 0x3, 0xe, 0xa, 0x7, },
/* e */ { 0x0, 0xe, 0xf, 0x1, 0xd, 0x3, 0x2, 0xc, 0x9, 0x7, 0x6, 0x8, 0x4, 0xa, 0xb, 0x5, },
/* f */ { 0x0, 0xf, 0xd, 0x2, 0x9, 0x6, 0x4, 0xb, 0x1, 0xe, 0xc, 0x3, 0x8, 0x7, 0x5, 0xa, },
};
const struct BL_CKEccFile::mulfact BL_CKEccFile::nibbles[] =
{
// good
{ 0x1, 0 }, /* nib0 */
{ 0x2, 1 },
{ 0x3, 2 },
{ 0x4, 3 },
{ 0x5, 4 },
{ 0x6, 5 },
{ 0x7, 6 },
{ 0x8, 7 },
{ 0x9, 8 },
{ 0xa, 9 },
{ 0xb, 10 },
{ 0xc, 11 },
{ 0xd, 12 },
{ 0xe, 13 },
{ 0xf, 14 },
{ 0x1, 15 },
{ 0x2, 16 },
{ 0x3, 17 },
{ 0x4, 18 },
{ 0x5, 19 },
{ 0x6, 20 },
{ 0x7, 21 },
{ 0x8, 22 },
{ 0x9, 23 },
{ 0xa, 24 },
{ 0xb, 25 },
{ 0xc, 26 },
{ 0xd, 27 },
{ 0xe, 28 },
{ 0xf, 29 },
{ 0x1, 31 },
{ 0x0, 0 },/* end of table */
{ 0x1, 0 }, /* nib1 */
{ 0x1, 1 },
{ 0x1, 2 },
{ 0x1, 3 },
{ 0x1, 4 },
{ 0x1, 5 },
{ 0x1, 6 },
{ 0x1, 7 },
{ 0x1, 8 },
{ 0x1, 9 },
{ 0x1, 10 },
{ 0x1, 11 },
{ 0x1, 12 },
{ 0x1, 13 },
{ 0x1, 14 },
{ 0x1, 30 },
{ 0x1, 31 },
{ 0x0, 0 },/* end of table */
{ 0x1, 15 }, /* nib2 */
{ 0x1, 16 },
{ 0x1, 17 },
{ 0x1, 18 },
{ 0x1, 19 },
{ 0x1, 20 },
{ 0x1, 21 },
{ 0x1, 22 },
{ 0x1, 23 },
{ 0x1, 24 },
{ 0x1, 25 },
{ 0x1, 26 },
{ 0x1, 27 },
{ 0x1, 28 },
{ 0x1, 29 },
{ 0x1, 30 },
{ 0x1, 31 },
{ 0x0, 0 },/* end of subtable */
{ 0x1, 0 }, /* nib3 */
{ 0x9, 1 },
{ 0xe, 2 },
{ 0xd, 3 },
{ 0xb, 4 },
{ 0x7, 5 },
{ 0x6, 6 },
{ 0xf, 7 },
{ 0x2, 8 },
{ 0xc, 9 },
{ 0x5, 10 },
{ 0xa, 11 },
{ 0x4, 12 },
{ 0x3, 13 },
{ 0x8, 14 },
{ 0x1, 15 },
{ 0x9, 16 },
{ 0xe, 17 },
{ 0xd, 18 },
{ 0xb, 19 },
{ 0x7, 20 },
{ 0x6, 21 },
{ 0xf, 22 },
{ 0x2, 23 },
{ 0xc, 24 },
{ 0x5, 25 },
{ 0xa, 26 },
{ 0x4, 27 },
{ 0x3, 28 },
{ 0x8, 29 },
{ 0x1, 30 },
{ 0x0, 0 },/* end of subtable */
{ 0x0, 0 } /* end of table */
};
BL_CKEccFile::BL_CKEccFile() {}
// Destructor definition
BL_CKEccFile::~BL_CKEccFile() {}
uint32_t BL_CKEccFile::generateChipkillECC(ChipKillLine line)
{
unsigned long long data[2];
data[0] = line.msdw;
data[1] = line.lsdw;
const struct mulfact *nibs = nibbles;
unsigned check = 0;
for (nibs = nibbles; nibs->mult; )
{
do
{
unsigned long long d;
d = data[nibs->nibble_num < 16];
d >>= ((nibs->nibble_num & 0xf)*4);
d &= 0xf;
check ^= galois[nibs->mult][d];
nibs++;
}
while (nibs->mult);
nibs++;
if (nibs->mult)
{
check <<= 4;
}
}
return check;
}