summaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-11-07 12:15:22 -0600
committerJason Ekstrand <[email protected]>2018-12-05 15:02:06 -0600
commit03571a7a6c6d0d4df9409a75fe93c925ec045670 (patch)
tree7abaf3732f05059e7660e20c04a2640775d660eb /src/compiler
parenta0ae12ca91a45f81897e774019cde9bd081f03a0 (diff)
nir/opcodes: Pull in the type helpers from constant_expressions
While we're at it, we rework them a bit to all use regular expressions and assert more. Reviewed-by: Connor Abbott <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/nir/nir_constant_expressions.py25
-rw-r--r--src/compiler/nir/nir_opcodes.py34
-rw-r--r--src/compiler/nir/nir_opcodes_c.py11
3 files changed, 35 insertions, 35 deletions
diff --git a/src/compiler/nir/nir_constant_expressions.py b/src/compiler/nir/nir_constant_expressions.py
index 118af9f7818..0cd4ffcf558 100644
--- a/src/compiler/nir/nir_constant_expressions.py
+++ b/src/compiler/nir/nir_constant_expressions.py
@@ -1,23 +1,8 @@
from __future__ import print_function
import re
-
-type_split_re = re.compile(r'(?P<type>[a-z]+)(?P<bits>\d+)')
-
-def type_has_size(type_):
- return type_[-1:].isdigit()
-
-def type_size(type_):
- assert type_has_size(type_)
- return int(type_split_re.match(type_).group('bits'))
-
-def type_sizes(type_):
- if type_has_size(type_):
- return [type_size(type_)]
- elif type_ == 'float':
- return [16, 32, 64]
- else:
- return [8, 16, 32, 64]
+from nir_opcodes import opcodes
+from nir_opcodes import type_has_size, type_size, type_sizes, type_base_type
def type_add_size(type_, size):
if type_has_size(type_):
@@ -44,10 +29,7 @@ def get_const_field(type_):
elif type_ == "float16":
return "u16"
else:
- m = type_split_re.match(type_)
- if not m:
- raise Exception(str(type_))
- return m.group('type')[0] + m.group('bits')
+ return type_base_type(type_)[0] + str(type_size(type_))
template = """\
/*
@@ -429,7 +411,6 @@ nir_eval_const_opcode(nir_op op, unsigned num_components,
}
}"""
-from nir_opcodes import opcodes
from mako.template import Template
print(Template(template).render(opcodes=opcodes, type_sizes=type_sizes,
diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py
index 4ef4ecc6f22..d69d09d30ce 100644
--- a/src/compiler/nir/nir_opcodes.py
+++ b/src/compiler/nir/nir_opcodes.py
@@ -23,6 +23,7 @@
# Authors:
# Connor Abbott ([email protected])
+import re
# Class that represents all the information we have about the opcode
# NOTE: this must be kept in sync with nir_op_info
@@ -99,6 +100,33 @@ tint64 = "int64"
tuint64 = "uint64"
tfloat64 = "float64"
+_TYPE_SPLIT_RE = re.compile(r'(?P<type>int|uint|float|bool)(?P<bits>\d+)?')
+
+def type_has_size(type_):
+ m = _TYPE_SPLIT_RE.match(type_)
+ assert m is not None, 'Invalid NIR type string: "{}"'.format(type_)
+ return m.group('bits') is not None
+
+def type_size(type_):
+ m = _TYPE_SPLIT_RE.match(type_)
+ assert m is not None, 'Invalid NIR type string: "{}"'.format(type_)
+ assert m.group('bits') is not None, \
+ 'NIR type string has no bit size: "{}"'.format(type_)
+ return int(m.group('bits'))
+
+def type_sizes(type_):
+ if type_has_size(type_):
+ return [type_size(type_)]
+ elif type_ == 'float':
+ return [16, 32, 64]
+ else:
+ return [8, 16, 32, 64]
+
+def type_base_type(type_):
+ m = _TYPE_SPLIT_RE.match(type_)
+ assert m is not None, 'Invalid NIR type string: "{}"'.format(type_)
+ return m.group('type')
+
commutative = "commutative "
associative = "associative "
@@ -175,11 +203,7 @@ for src_t in [tint, tuint, tfloat]:
dst_types = [tint, tuint, tfloat]
for dst_t in dst_types:
- if dst_t == tfloat:
- bit_sizes = [16, 32, 64]
- else:
- bit_sizes = [8, 16, 32, 64]
- for bit_size in bit_sizes:
+ for bit_size in type_sizes(dst_t):
if bit_size == 16 and dst_t == tfloat and src_t == tfloat:
rnd_modes = ['_rtne', '_rtz', '']
for rnd_mode in rnd_modes:
diff --git a/src/compiler/nir/nir_opcodes_c.py b/src/compiler/nir/nir_opcodes_c.py
index 8bfcda6d719..9e3c06b8634 100644
--- a/src/compiler/nir/nir_opcodes_c.py
+++ b/src/compiler/nir/nir_opcodes_c.py
@@ -25,7 +25,7 @@
from __future__ import print_function
-from nir_opcodes import opcodes
+from nir_opcodes import opcodes, type_sizes
from mako.template import Template
template = Template("""
@@ -64,12 +64,7 @@ nir_type_conversion_op(nir_alu_type src, nir_alu_type dst, nir_rounding_mode rnd
% endif
% endif
switch (dst_bit_size) {
-% if dst_t == 'float':
-<% bit_sizes = [16, 32, 64] %>
-% else:
-<% bit_sizes = [8, 16, 32, 64] %>
-% endif
-% for dst_bits in bit_sizes:
+% for dst_bits in type_sizes(dst_t):
case ${dst_bits}:
% if src_t == 'float' and dst_t == 'float' and dst_bits == 16:
switch(rnd) {
@@ -137,4 +132,4 @@ const nir_op_info nir_op_infos[nir_num_opcodes] = {
};
""")
-print(template.render(opcodes=opcodes))
+print(template.render(opcodes=opcodes, type_sizes=type_sizes))