""" Supplementary instruction definitions for Intel. This module defines additional instructions that are useful only to the Intel target ISA. """ from cdsl.operands import Operand from cdsl.typevar import TypeVar from cdsl.instructions import Instruction, InstructionGroup GROUP = InstructionGroup("x86", "Intel-specific instruction set") iWord = TypeVar('iWord', 'A scalar integer machine word', ints=(32, 64)) nlo = Operand('nlo', iWord, doc='Low part of numerator') nhi = Operand('nhi', iWord, doc='High part of numerator') d = Operand('d', iWord, doc='Denominator') q = Operand('q', iWord, doc='Quotient') r = Operand('r', iWord, doc='Remainder') udivmodx = Instruction('x86_udivmodx', r""" Extended unsigned division. Concatenate the bits in `nhi` and `nlo` to form the numerator. Interpret the bits as an unsigned number and divide by the unsigned denominator `d`. Trap when `d` is zero or if the quotient is larger than the range of the output. Return both quotient and remainder.
from cdsl.xform import Rtl from semantics.primitives import bv_from_imm64, bvite import base.formats # noqa GROUP = InstructionGroup("primitive_macros", "Semantic macros instruction set") AnyBV = TypeVar('AnyBV', bitvecs=True, doc="") x = Var('x') y = Var('y') imm = Var('imm') a = Var('a') # # Bool-to-bv1 # BV1 = TypeVar("BV1", bitvecs=(1, 1), doc="") bv1_op = Operand('bv1_op', BV1, doc="") cond_op = Operand("cond", b1, doc="") bool2bv = Instruction('bool2bv', r"""Convert a b1 value to a 1-bit BV""", ins=cond_op, outs=bv1_op) v1 = Var('v1') v2 = Var('v2') bvone = Var('bvone') bvzero = Var('bvzero') bool2bv.set_semantics( v1 << bool2bv(v2), Rtl(bvone << bv_from_imm64(imm64(1)), bvzero << bv_from_imm64(imm64(0)), v1 << bvite(v2, bvone, bvzero)))
from base.types import b1 from base.immediates import imm64 import base.formats # noqa GROUP = InstructionGroup("primitive", "Primitive instruction set") BV = TypeVar('BV', 'A bitvector type.', bitvecs=True) BV1 = TypeVar('BV1', 'A single bit bitvector.', bitvecs=(1, 1)) Real = TypeVar('Real', 'Any real type.', ints=True, floats=True, bools=True, simd=True) x = Operand('x', BV, doc="A semantic value X") y = Operand('x', BV, doc="A semantic value Y (same width as X)") a = Operand('a', BV, doc="A semantic value A (same width as X)") cond = Operand('b', TypeVar.singleton(b1), doc='A b1 value') real = Operand('real', Real, doc="A real cranelift value") fromReal = Operand('fromReal', Real.to_bitvec(), doc="A real cranelift value converted to a BV") # # BV Conversion/Materialization # prim_to_bv = Instruction('prim_to_bv', r""" Convert an SSA Value to a flat bitvector
This module defines additional instructions that are useful only to the Intel target ISA. """ from base.types import iflags from cdsl.operands import Operand from cdsl.typevar import TypeVar from cdsl.instructions import Instruction, InstructionGroup GROUP = InstructionGroup("x86", "Intel-specific instruction set") iWord = TypeVar('iWord', 'A scalar integer machine word', ints=(32, 64)) nlo = Operand('nlo', iWord, doc='Low part of numerator') nhi = Operand('nhi', iWord, doc='High part of numerator') d = Operand('d', iWord, doc='Denominator') q = Operand('q', iWord, doc='Quotient') r = Operand('r', iWord, doc='Remainder') udivmodx = Instruction( 'x86_udivmodx', r""" Extended unsigned division. Concatenate the bits in `nhi` and `nlo` to form the numerator. Interpret the bits as an unsigned number and divide by the unsigned denominator `d`. Trap when `d` is zero or if the quotient is larger than the range of the output. Return both quotient and remainder.
floats=True, bools=True, scalars=False, simd=True) Any = TypeVar('Any', 'Any integer, float, or boolean scalar or vector type', ints=True, floats=True, bools=True, scalars=True, simd=True) # # Control flow # c = Operand('c', Testable, doc='Controlling value to test') EBB = Operand('EBB', entities.ebb, doc='Destination extended basic block') args = Operand('args', VARIABLE_ARGS, doc='EBB arguments') jump = Instruction('jump', r""" Jump. Unconditionally jump to an extended basic block, passing the specified EBB arguments. The number and types of arguments must match the destination EBB. """, ins=(EBB, args), is_terminator=True) brz = Instruction('brz',