nir: Add opcodes to extract bytes or words.
authorMatt Turner <mattst88@gmail.com>
Thu, 21 Jan 2016 17:09:29 +0000 (09:09 -0800)
committerMatt Turner <mattst88@gmail.com>
Mon, 25 Jan 2016 22:24:07 +0000 (14:24 -0800)
The uint versions zero extend while the int versions sign extend.

src/glsl/nir/nir.h
src/glsl/nir/nir_opcodes.py
src/glsl/nir/nir_opt_algebraic.py

index 111303041709acf203600f00bb45f267e0db25cb..7b39cbb4c12e5464cd377ded599205dce92a0fd5 100644 (file)
@@ -1471,6 +1471,9 @@ typedef struct nir_shader_compiler_options {
    bool lower_pack_half_2x16;
    bool lower_unpack_half_2x16;
 
+   bool lower_extract_byte;
+   bool lower_extract_word;
+
    /**
     * Does the driver support real 32-bit integers?  (Otherwise, integers
     * are simulated by floats.)
index a8bbe1a0b8270312ddaa3c0a11d6db6f903c0c2c..be3cd17193fb52d3079126847111da59c35f3334 100644 (file)
@@ -536,6 +536,15 @@ dst.x = src0.x;
 dst.y = src1.x;
 """)
 
+# Byte extraction
+binop("extract_ubyte", tuint, "", "(uint8_t)(src0 >> (src1 * 8))")
+binop("extract_ibyte", tint, "", "(int8_t)(src0 >> (src1 * 8))")
+
+# Word extraction
+binop("extract_uword", tuint, "", "(uint16_t)(src0 >> (src1 * 16))")
+binop("extract_iword", tint, "", "(int16_t)(src0 >> (src1 * 16))")
+
+
 def triop(name, ty, const_expr):
    opcode(name, 0, ty, [0, 0, 0], [ty, ty, ty], "", const_expr)
 def triop_horiz(name, output_size, src1_size, src2_size, src3_size, const_expr):
index 7745b76f7ce8f11059679a6d8adebca19fc5a514..b761b54cd706199768bce268c357993aa6acc9ae 100644 (file)
@@ -242,6 +242,22 @@ optimizations = [
     ('bcsel', ('ult', 31, 'bits'), 'value',
               ('ubfe', 'value', 'offset', 'bits')),
     'options->lower_bitfield_extract'),
+
+   (('extract_ibyte', a, b),
+    ('ishr', ('ishl', a, ('imul', ('isub', 3, b), 8)), 8),
+    'options->lower_extract_byte'),
+
+   (('extract_ubyte', a, b),
+    ('iand', ('ushr', a, ('imul', b, 8)), 0xff),
+    'options->lower_extract_byte'),
+
+   (('extract_iword', a, b),
+    ('ishr', ('ishl', a, ('imul', ('isub', 1, b), 16)), 16),
+    'options->lower_extract_word'),
+
+   (('extract_uword', a, b),
+    ('iand', ('ushr', a, ('imul', b, 16)), 0xffff),
+    'options->lower_extract_word'),
 ]
 
 # Add optimizations to handle the case where the result of a ternary is