Skip to content

X86

x86

RemoveRedundantDS_Mov

Bases: RewritePattern

Source code in xdsl/transforms/canonicalization_patterns/x86.py
14
15
16
17
18
class RemoveRedundantDS_Mov(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: x86.DS_MovOp, rewriter: PatternRewriter) -> None:
        if op.destination.type == op.source.type and op.destination.type.is_allocated:
            rewriter.replace_op(op, (), (op.source,))

match_and_rewrite(op: x86.DS_MovOp, rewriter: PatternRewriter) -> None

Source code in xdsl/transforms/canonicalization_patterns/x86.py
15
16
17
18
@op_type_rewrite_pattern
def match_and_rewrite(self, op: x86.DS_MovOp, rewriter: PatternRewriter) -> None:
    if op.destination.type == op.source.type and op.destination.type.is_allocated:
        rewriter.replace_op(op, (), (op.source,))

RS_Add_Zero

Bases: RewritePattern

Source code in xdsl/transforms/canonicalization_patterns/x86.py
21
22
23
24
25
26
27
28
class RS_Add_Zero(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: x86.RS_AddOp, rewriter: PatternRewriter) -> None:
        if (
            value := get_constant_value(op.source)
        ) is not None and value.value.data == 0:
            # The register would be updated in-place, so no need to move
            rewriter.replace_op(op, (), (op.register_in,))

match_and_rewrite(op: x86.RS_AddOp, rewriter: PatternRewriter) -> None

Source code in xdsl/transforms/canonicalization_patterns/x86.py
22
23
24
25
26
27
28
@op_type_rewrite_pattern
def match_and_rewrite(self, op: x86.RS_AddOp, rewriter: PatternRewriter) -> None:
    if (
        value := get_constant_value(op.source)
    ) is not None and value.value.data == 0:
        # The register would be updated in-place, so no need to move
        rewriter.replace_op(op, (), (op.register_in,))

MS_Operation_ConstantOffset

Bases: RewritePattern

Source code in xdsl/transforms/canonicalization_patterns/x86.py
31
32
33
34
35
36
37
38
39
40
41
42
class MS_Operation_ConstantOffset(RewritePattern):
    def match_and_rewrite(self, op: Operation, rewriter: PatternRewriter) -> None:
        if (
            isinstance(op, x86.ops.MS_Operation)
            and isinstance(add_op := op.memory.owner, x86.RS_AddOp)
            and ((value := get_constant_value(add_op.source)) is not None)
            # The addition is in-place, so we have to get the original value
            and isinstance(mov_op := add_op.register_in.owner, x86.DS_MovOp)
        ):
            op = cast(x86.ops.MS_Operation[X86RegisterType, X86RegisterType], op)
            new_offset = op.memory_offset.value.data + value.value.data
            rewriter.replace_op(op, type(op)(mov_op.source, op.source, new_offset))

match_and_rewrite(op: Operation, rewriter: PatternRewriter) -> None

Source code in xdsl/transforms/canonicalization_patterns/x86.py
32
33
34
35
36
37
38
39
40
41
42
def match_and_rewrite(self, op: Operation, rewriter: PatternRewriter) -> None:
    if (
        isinstance(op, x86.ops.MS_Operation)
        and isinstance(add_op := op.memory.owner, x86.RS_AddOp)
        and ((value := get_constant_value(add_op.source)) is not None)
        # The addition is in-place, so we have to get the original value
        and isinstance(mov_op := add_op.register_in.owner, x86.DS_MovOp)
    ):
        op = cast(x86.ops.MS_Operation[X86RegisterType, X86RegisterType], op)
        new_offset = op.memory_offset.value.data + value.value.data
        rewriter.replace_op(op, type(op)(mov_op.source, op.source, new_offset))

DM_Operation_ConstantOffset

Bases: RewritePattern

Source code in xdsl/transforms/canonicalization_patterns/x86.py
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class DM_Operation_ConstantOffset(RewritePattern):
    def match_and_rewrite(self, op: Operation, rewriter: PatternRewriter) -> None:
        if (
            isinstance(op, x86.ops.DM_Operation)
            and isinstance(add_op := op.memory.owner, x86.RS_AddOp)
            and ((value := get_constant_value(add_op.source)) is not None)
            # The addition is in-place, so we have to get the original value
            and isinstance(mov_op := add_op.register_in.owner, x86.DS_MovOp)
        ):
            op = cast(x86.ops.DM_Operation[X86RegisterType, X86RegisterType], op)
            new_offset = op.memory_offset.value.data + value.value.data
            rewriter.replace_op(
                op, type(op)(mov_op.source, new_offset, destination=op.destination.type)
            )

match_and_rewrite(op: Operation, rewriter: PatternRewriter) -> None

Source code in xdsl/transforms/canonicalization_patterns/x86.py
46
47
48
49
50
51
52
53
54
55
56
57
58
def match_and_rewrite(self, op: Operation, rewriter: PatternRewriter) -> None:
    if (
        isinstance(op, x86.ops.DM_Operation)
        and isinstance(add_op := op.memory.owner, x86.RS_AddOp)
        and ((value := get_constant_value(add_op.source)) is not None)
        # The addition is in-place, so we have to get the original value
        and isinstance(mov_op := add_op.register_in.owner, x86.DS_MovOp)
    ):
        op = cast(x86.ops.DM_Operation[X86RegisterType, X86RegisterType], op)
        new_offset = op.memory_offset.value.data + value.value.data
        rewriter.replace_op(
            op, type(op)(mov_op.source, new_offset, destination=op.destination.type)
        )

get_constant_value(value: SSAValue) -> IntegerAttr | None

Source code in xdsl/transforms/canonicalization_patterns/x86.py
61
62
63
64
65
66
67
68
69
def get_constant_value(value: SSAValue) -> IntegerAttr | None:
    if not isinstance(value, OpResult):
        return

    if isinstance(value.op, x86.DS_MovOp):
        return get_constant_value(value.op.source)

    if isinstance(value.op, x86.DI_MovOp):
        return value.op.immediate