mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-19 04:58:08 +02:00
Many instruction sets (Intel, Apple, NVIDIA) implement bitwise operations with a single general instruction that takes a lookup table in sum-of-products (minterms) form. Working with these tables manually is a bit gnarly, and multiple backends need to do this. This adds common code for representing such lookup tables with 2- or 3-sources, with a rich set of helpers for building, inspecting, and manipulating the LUTs. Eventually, we may want to introduce a nir_op_bitop3 instruction to NIR to build common code for fusing boolean expression trees into lookup tables. That NIR pass will presumably use the helpers here. NAK already has this abstraction internally (in Rust). Possibly NAK will be able to drop (or cut down) that code once we handle this in NIR. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37200>
271 lines
7.6 KiB
C
271 lines
7.6 KiB
C
/*
|
|
* Copyright 2020 Intel Corporation
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
/*
|
|
* This table was generated by an offline tool in the following manner:
|
|
* for each function value, we generated a tree of all expressions that evaluate
|
|
* to that function. Then we normalized, simplified, and pruned the tree to take
|
|
* the first minimal size expression.
|
|
*
|
|
* https://github.com/intel/intel-graphics-compiler/blob/eb7d24be2244c6e2225d7b33eefcd6ec62b6f80e/visa/iga/IGALibrary/api/iga_bxml_enums.cpp
|
|
*/
|
|
const char *util_lut3_to_str[256] = {
|
|
[0x00] = "zeros",
|
|
[0x01] = "~a & ~b & ~c",
|
|
[0x02] = "a & ~b & ~c",
|
|
[0x03] = "~b & ~c",
|
|
[0x04] = "~a & b & ~c",
|
|
[0x05] = "~a & ~c",
|
|
[0x06] = "(a ^ b) & ~c",
|
|
[0x07] = "(~a | ~b) & ~c",
|
|
[0x08] = "a & b & ~c",
|
|
[0x09] = "(a ^ ~b) & ~c",
|
|
[0x0A] = "a & ~c",
|
|
[0x0B] = "(a | ~b) & ~c",
|
|
[0x0C] = "b & ~c",
|
|
[0x0D] = "(~a | b) & ~c",
|
|
[0x0E] = "(a | b) & ~c",
|
|
[0x0F] = "~c",
|
|
[0x10] = "~a & ~b & c",
|
|
[0x11] = "~a & ~b",
|
|
[0x12] = "(a ^ c) & ~b",
|
|
[0x13] = "(~a | ~c) & ~b",
|
|
[0x14] = "~a & (b ^ c)",
|
|
[0x15] = "~a & (~b | ~c)",
|
|
[0x16] = "a ^ (a & b | b ^ c)",
|
|
[0x17] = "~a & ~b | (~a | ~b) & ~c",
|
|
[0x18] = "(a ^ c) & (b ^ c)",
|
|
[0x19] = "a ^ (a & c | ~b)",
|
|
[0x1A] = "a ^ (a | ~b) & c",
|
|
[0x1B] = "a & ~c | ~a & ~b",
|
|
[0x1C] = "(a & c | b) ^ c",
|
|
[0x1D] = "~a & ~b | b & ~c",
|
|
[0x1E] = "(a | b) ^ c",
|
|
[0x1F] = "~a & ~b | ~c",
|
|
[0x20] = "a & ~b & c",
|
|
[0x21] = "(a ^ ~c) & ~b",
|
|
[0x22] = "a & ~b",
|
|
[0x23] = "(a | ~c) & ~b",
|
|
[0x24] = "(a ^ b) & (b ^ c)",
|
|
[0x25] = "a ^ (a & b | ~c)",
|
|
[0x26] = "a ^ (a | ~c) & b",
|
|
[0x27] = "a & ~b | ~a & ~c",
|
|
[0x28] = "a & (b ^ c)",
|
|
[0x29] = "a ^ (a | ~b) & (b ^ ~c)",
|
|
[0x2A] = "a & (~b | ~c)",
|
|
[0x2B] = "a & ~b | (a | ~b) & ~c",
|
|
[0x2C] = "(~a & c | b) ^ c",
|
|
[0x2D] = "(~a | b) ^ c",
|
|
[0x2E] = "a & ~b | b & ~c",
|
|
[0x2F] = "a & ~b | ~c",
|
|
[0x30] = "~b & c",
|
|
[0x31] = "(~a | c) & ~b",
|
|
[0x32] = "(a | c) & ~b",
|
|
[0x33] = "~b",
|
|
[0x34] = "(a & b | c) ^ b",
|
|
[0x35] = "~a & ~c | ~b & c",
|
|
[0x36] = "(a | c) ^ b",
|
|
[0x37] = "~a & ~c | ~b",
|
|
[0x38] = "(~a & b | c) ^ b",
|
|
[0x39] = "(~a | c) ^ b",
|
|
[0x3A] = "a & ~c | ~b & c",
|
|
[0x3B] = "a & ~c | ~b",
|
|
[0x3C] = "b ^ c",
|
|
[0x3D] = "~a & ~b | b ^ c",
|
|
[0x3E] = "a & ~b | b ^ c",
|
|
[0x3F] = "~b | ~c",
|
|
[0x40] = "~a & b & c",
|
|
[0x41] = "~a & (b ^ ~c)",
|
|
[0x42] = "(a ^ b) & (b ^ ~c)",
|
|
[0x43] = "(a & b | ~c) ^ b",
|
|
[0x44] = "~a & b",
|
|
[0x45] = "~a & (b | ~c)",
|
|
[0x46] = "a ^ (a & c | b)",
|
|
[0x47] = "~a & b | ~b & ~c",
|
|
[0x48] = "(a ^ c) & b",
|
|
[0x49] = "a ^ (a & c | b ^ ~c)",
|
|
[0x4A] = "a ^ (a | b) & c",
|
|
[0x4B] = "(a | ~b) ^ c",
|
|
[0x4C] = "(~a | ~c) & b",
|
|
[0x4D] = "~a & b | (~a | b) & ~c",
|
|
[0x4E] = "a & ~c | ~a & b",
|
|
[0x4F] = "~a & b | ~c",
|
|
[0x50] = "~a & c",
|
|
[0x51] = "~a & (~b | c)",
|
|
[0x52] = "a ^ (a & b | c)",
|
|
[0x53] = "~a & c | ~b & ~c",
|
|
[0x54] = "~a & (b | c)",
|
|
[0x55] = "~a",
|
|
[0x56] = "a ^ (b | c)",
|
|
[0x57] = "~a | ~b & ~c",
|
|
[0x58] = "a ^ (a & ~b | c)",
|
|
[0x59] = "a ^ (~b | c)",
|
|
[0x5A] = "a ^ c",
|
|
[0x5B] = "a ^ c | ~a & ~b",
|
|
[0x5C] = "~a & c | b & ~c",
|
|
[0x5D] = "~a | b & ~c",
|
|
[0x5E] = "a ^ c | b & ~c",
|
|
[0x5F] = "~a | ~c",
|
|
[0x60] = "(a ^ b) & c",
|
|
[0x61] = "a ^ (a & b | b ^ ~c)",
|
|
[0x62] = "a ^ (a | c) & b",
|
|
[0x63] = "(a | ~c) ^ b",
|
|
[0x64] = "a ^ (a & ~c | b)",
|
|
[0x65] = "a ^ (b | ~c)",
|
|
[0x66] = "a ^ b",
|
|
[0x67] = "a ^ b | ~a & ~c",
|
|
[0x68] = "a ^ (a | b) & (b ^ ~c)",
|
|
[0x69] = "a ^ b ^ ~c",
|
|
[0x6A] = "a ^ b & c",
|
|
[0x6B] = "a ^ b & c | ~b & ~c",
|
|
[0x6C] = "(~a | ~c) ^ ~b",
|
|
[0x6D] = "a ^ (b | ~c) | b & ~c",
|
|
[0x6E] = "a ^ b | a & ~c",
|
|
[0x6F] = "a ^ b | ~c",
|
|
[0x70] = "(~a | ~b) & c",
|
|
[0x71] = "~a & c | (~a | c) & ~b",
|
|
[0x72] = "a & ~b | ~a & c",
|
|
[0x73] = "~a & c | ~b",
|
|
[0x74] = "~a & b | ~b & c",
|
|
[0x75] = "~a | ~b & c",
|
|
[0x76] = "a ^ b | ~a & c",
|
|
[0x77] = "~a | ~b",
|
|
[0x78] = "(~a | ~b) ^ ~c",
|
|
[0x79] = "a ^ (~b | c) | ~b & c",
|
|
[0x7A] = "a ^ c | a & ~b",
|
|
[0x7B] = "a ^ c | ~b",
|
|
[0x7C] = "~a & b | b ^ c",
|
|
[0x7D] = "~a | b ^ c",
|
|
[0x7E] = "a ^ b | b ^ c",
|
|
[0x7F] = "~a | ~b | ~c",
|
|
[0x80] = "a & b & c",
|
|
[0x81] = "(a ^ ~b) & (b ^ ~c)",
|
|
[0x82] = "a & (b ^ ~c)",
|
|
[0x83] = "(~a & b | ~c) ^ b",
|
|
[0x84] = "(a ^ ~c) & b",
|
|
[0x85] = "a ^ (a & ~b | ~c)",
|
|
[0x86] = "a ^ (a | b) & (b ^ c)",
|
|
[0x87] = "(~a | ~b) ^ c",
|
|
[0x88] = "a & b",
|
|
[0x89] = "a ^ (a | ~c) & ~b",
|
|
[0x8A] = "a & (b | ~c)",
|
|
[0x8B] = "a & b | ~b & ~c",
|
|
[0x8C] = "(a | ~c) & b",
|
|
[0x8D] = "a & b | ~a & ~c",
|
|
[0x8E] = "a & b | (a | b) & ~c",
|
|
[0x8F] = "a & b | ~c",
|
|
[0x90] = "(a ^ ~b) & c",
|
|
[0x91] = "a ^ (a & ~c | ~b)",
|
|
[0x92] = "a ^ (a | c) & (b ^ c)",
|
|
[0x93] = "(~a | ~c) ^ b",
|
|
[0x94] = "a ^ (a & ~b | b ^ c)",
|
|
[0x95] = "a ^ (~b | ~c)",
|
|
[0x96] = "a ^ b ^ c",
|
|
[0x97] = "a ^ (~b | ~c) | ~b & ~c",
|
|
[0x98] = "a ^ (a | c) & ~b",
|
|
[0x99] = "a ^ ~b",
|
|
[0x9A] = "a ^ ~b & c",
|
|
[0x9B] = "a ^ ~b | a & ~c",
|
|
[0x9C] = "(a | ~c) ^ ~b",
|
|
[0x9D] = "a ^ ~b | b & ~c",
|
|
[0x9E] = "a ^ ~b & c | b & ~c",
|
|
[0x9F] = "a ^ ~b | ~c",
|
|
[0xA0] = "a & c",
|
|
[0xA1] = "a ^ (a | ~b) & ~c",
|
|
[0xA2] = "a & (~b | c)",
|
|
[0xA3] = "a & c | ~b & ~c",
|
|
[0xA4] = "a ^ (a | b) & ~c",
|
|
[0xA5] = "a ^ ~c",
|
|
[0xA6] = "a ^ b & ~c",
|
|
[0xA7] = "a ^ ~c | a & ~b",
|
|
[0xA8] = "a & (b | c)",
|
|
[0xA9] = "a ^ ~b & ~c",
|
|
[0xAA] = "a",
|
|
[0xAB] = "a | ~b & ~c",
|
|
[0xAC] = "a & c | b & ~c",
|
|
[0xAD] = "a ^ ~c | a & b",
|
|
[0xAE] = "a | b & ~c",
|
|
[0xAF] = "a | ~c",
|
|
[0xB0] = "(a | ~b) & c",
|
|
[0xB1] = "a & c | ~a & ~b",
|
|
[0xB2] = "a & c | (a | c) & ~b",
|
|
[0xB3] = "a & c | ~b",
|
|
[0xB4] = "(a | ~b) ^ ~c",
|
|
[0xB5] = "a ^ ~c | ~a & ~b",
|
|
[0xB6] = "a ^ b & ~c | ~b & c",
|
|
[0xB7] = "a ^ ~c | ~b",
|
|
[0xB8] = "a & b | ~b & c",
|
|
[0xB9] = "a ^ ~b | a & c",
|
|
[0xBA] = "a | ~b & c",
|
|
[0xBB] = "a | ~b",
|
|
[0xBC] = "a & b | b ^ c",
|
|
[0xBD] = "a ^ ~b | b ^ c",
|
|
[0xBE] = "a | b ^ c",
|
|
[0xBF] = "a | ~b | ~c",
|
|
[0xC0] = "b & c",
|
|
[0xC1] = "(a & ~b | c) ^ ~b",
|
|
[0xC2] = "(~a & ~b | c) ^ ~b",
|
|
[0xC3] = "b ^ ~c",
|
|
[0xC4] = "(~a | c) & b",
|
|
[0xC5] = "~a & ~c | b & c",
|
|
[0xC6] = "(~a | c) ^ ~b",
|
|
[0xC7] = "~a & b | b ^ ~c",
|
|
[0xC8] = "(a | c) & b",
|
|
[0xC9] = "(a | c) ^ ~b",
|
|
[0xCA] = "a & ~c | b & c",
|
|
[0xCB] = "a & b | b ^ ~c",
|
|
[0xCC] = "b",
|
|
[0xCD] = "~a & ~c | b",
|
|
[0xCE] = "a & ~c | b",
|
|
[0xCF] = "b | ~c",
|
|
[0xD0] = "(~a | b) & c",
|
|
[0xD1] = "~a & ~b | b & c",
|
|
[0xD2] = "(~a | b) ^ ~c",
|
|
[0xD3] = "~a & c | b ^ ~c",
|
|
[0xD4] = "~a & b | (~a | b) & c",
|
|
[0xD5] = "~a | b & c",
|
|
[0xD6] = "a ^ (b | c) | b & c",
|
|
[0xD7] = "~a | b ^ ~c",
|
|
[0xD8] = "a & b | ~a & c",
|
|
[0xD9] = "a ^ ~b | b & c",
|
|
[0xDA] = "a ^ c | a & b",
|
|
[0xDB] = "a ^ c | b ^ ~c",
|
|
[0xDC] = "~a & c | b",
|
|
[0xDD] = "~a | b",
|
|
[0xDE] = "a ^ c | b",
|
|
[0xDF] = "~a | b | ~c",
|
|
[0xE0] = "(a | b) & c",
|
|
[0xE1] = "(a | b) ^ ~c",
|
|
[0xE2] = "a & ~b | b & c",
|
|
[0xE3] = "a & c | b ^ ~c",
|
|
[0xE4] = "a & c | ~a & b",
|
|
[0xE5] = "a ^ ~c | b & c",
|
|
[0xE6] = "a ^ b | a & c",
|
|
[0xE7] = "a ^ b | b ^ ~c",
|
|
[0xE8] = "a & b | (a | b) & c",
|
|
[0xE9] = "a ^ ~b & ~c | b & c",
|
|
[0xEA] = "a | b & c",
|
|
[0xEB] = "a | b ^ ~c",
|
|
[0xEC] = "a & c | b",
|
|
[0xED] = "a ^ ~c | b",
|
|
[0xEE] = "a | b",
|
|
[0xEF] = "a | b | ~c",
|
|
[0xF0] = "c",
|
|
[0xF1] = "~a & ~b | c",
|
|
[0xF2] = "a & ~b | c",
|
|
[0xF3] = "~b | c",
|
|
[0xF4] = "~a & b | c",
|
|
[0xF5] = "~a | c",
|
|
[0xF6] = "a ^ b | c",
|
|
[0xF7] = "~a | ~b | c",
|
|
[0xF8] = "a & b | c",
|
|
[0xF9] = "a ^ ~b | c",
|
|
[0xFA] = "a | c",
|
|
[0xFB] = "a | ~b | c",
|
|
[0xFC] = "b | c",
|
|
[0xFD] = "~a | b | c",
|
|
[0xFE] = "a | b | c",
|
|
[0xFF] = "ones",
|
|
};
|