58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
from __future__ import absolute_import
|
|
from semantics.primitives import prim_to_bv, prim_from_bv, bvsplit, bvconcat,\
|
|
bvadd
|
|
from .instructions import vsplit, vconcat, iadd
|
|
from cdsl.xform import XForm, Rtl
|
|
from cdsl.ast import Var
|
|
from cdsl.typevar import TypeSet
|
|
from cdsl.ti import InTypeset
|
|
import semantics.types # noqa
|
|
|
|
x = Var('x')
|
|
y = Var('y')
|
|
a = Var('a')
|
|
xhi = Var('xhi')
|
|
yhi = Var('yhi')
|
|
ahi = Var('ahi')
|
|
xlo = Var('xlo')
|
|
ylo = Var('ylo')
|
|
alo = Var('alo')
|
|
lo = Var('lo')
|
|
hi = Var('hi')
|
|
bvx = Var('bvx')
|
|
bvy = Var('bvy')
|
|
bva = Var('bva')
|
|
bvlo = Var('bvlo')
|
|
bvhi = Var('bvhi')
|
|
|
|
ScalarTS = TypeSet(lanes=(1, 1), ints=True, floats=True, bools=True)
|
|
|
|
vsplit.set_semantics(
|
|
XForm(Rtl((lo, hi) << vsplit(x)),
|
|
Rtl(bvx << prim_to_bv(x),
|
|
(bvlo, bvhi) << bvsplit(bvx),
|
|
lo << prim_from_bv(bvlo),
|
|
hi << prim_from_bv(bvhi))))
|
|
|
|
vconcat.set_semantics(
|
|
XForm(Rtl(x << vconcat(lo, hi)),
|
|
Rtl(bvlo << prim_to_bv(lo),
|
|
bvhi << prim_to_bv(hi),
|
|
bvx << bvconcat(bvlo, bvhi),
|
|
x << prim_from_bv(bvx))))
|
|
|
|
iadd.set_semantics([
|
|
XForm(Rtl(a << iadd(x, y)),
|
|
Rtl(bvx << prim_to_bv(x),
|
|
bvy << prim_to_bv(y),
|
|
bva << bvadd(bvx, bvy),
|
|
a << prim_from_bv(bva)),
|
|
constraints=[InTypeset(x.get_typevar(), ScalarTS)]),
|
|
XForm(Rtl(a << iadd(x, y)),
|
|
Rtl((xlo, xhi) << vsplit(x),
|
|
(ylo, yhi) << vsplit(y),
|
|
alo << iadd(xlo, ylo),
|
|
ahi << iadd(xhi, yhi),
|
|
a << vconcat(alo, ahi)))
|
|
])
|