Skip to content

Convert ptr to x86

convert_ptr_to_x86

PtrAddToX86 dataclass

Bases: RewritePattern

Source code in xdsl/backend/x86/lowering/convert_ptr_to_x86.py
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@dataclass
class PtrAddToX86(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: ptr.PtrAddOp, rewriter: PatternRewriter):
        x86_reg_type = x86.registers.UNALLOCATED_GENERAL

        rewriter.replace_op(
            op,
            [
                ptr_cast_op := UnrealizedConversionCastOp.get(
                    (op.addr,), (x86_reg_type,)
                ),
                offset_cast_op := UnrealizedConversionCastOp.get(
                    (op.offset,), (x86_reg_type,)
                ),
                ptr_mv_op := x86.DS_MovOp(
                    ptr_cast_op, destination=x86.registers.UNALLOCATED_GENERAL
                ),
                add_op := x86.RS_AddOp(
                    ptr_mv_op.destination, offset_cast_op, register_out=x86_reg_type
                ),
                UnrealizedConversionCastOp.get(
                    (add_op.register_out,), (ptr.PtrType(),)
                ),
            ],
        )

__init__() -> None

match_and_rewrite(op: ptr.PtrAddOp, rewriter: PatternRewriter)

Source code in xdsl/backend/x86/lowering/convert_ptr_to_x86.py
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@op_type_rewrite_pattern
def match_and_rewrite(self, op: ptr.PtrAddOp, rewriter: PatternRewriter):
    x86_reg_type = x86.registers.UNALLOCATED_GENERAL

    rewriter.replace_op(
        op,
        [
            ptr_cast_op := UnrealizedConversionCastOp.get(
                (op.addr,), (x86_reg_type,)
            ),
            offset_cast_op := UnrealizedConversionCastOp.get(
                (op.offset,), (x86_reg_type,)
            ),
            ptr_mv_op := x86.DS_MovOp(
                ptr_cast_op, destination=x86.registers.UNALLOCATED_GENERAL
            ),
            add_op := x86.RS_AddOp(
                ptr_mv_op.destination, offset_cast_op, register_out=x86_reg_type
            ),
            UnrealizedConversionCastOp.get(
                (add_op.register_out,), (ptr.PtrType(),)
            ),
        ],
    )

PtrStoreToX86 dataclass

Bases: RewritePattern

Source code in xdsl/backend/x86/lowering/convert_ptr_to_x86.py
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
@dataclass
class PtrStoreToX86(RewritePattern):
    arch: Arch

    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: ptr.StoreOp, rewriter: PatternRewriter):
        value_type = op.value.type
        # Pointer casts
        addr_cast_op, x86_ptr = UnrealizedConversionCastOp.cast_one(
            op.addr, x86.registers.UNALLOCATED_GENERAL
        )
        if isa(value_type, VectorType[FixedBitwidthType]):
            x86_vect_type = self.arch.register_type_for_type(value_type)
            cast_op, x86_data = UnrealizedConversionCastOp.cast_one(
                op.value, x86_vect_type.unallocated()
            )
            # Choose the x86 vector instruction according to the
            # abstract vector element size
            match value_type.get_element_type().bitwidth:
                case 16:
                    raise DiagnosticException(
                        "Half-precision floating point vector load is not implemented yet."
                    )
                case 32:
                    mov = x86.ops.MS_VmovupsOp
                case 64:
                    mov = x86.ops.MS_VmovapdOp
                case _:
                    raise DiagnosticException(
                        "Float precision must be half, single or double."
                    )
            mov_op = mov(x86_ptr, x86_data, memory_offset=0)
        else:
            cast_op, x86_data = UnrealizedConversionCastOp.cast_one(
                op.value, x86.registers.UNALLOCATED_GENERAL
            )
            mov_op = x86.MS_MovOp(x86_ptr, x86_data, memory_offset=0)

        rewriter.replace_op(op, [addr_cast_op, cast_op, mov_op])

arch: Arch instance-attribute

__init__(arch: Arch) -> None

match_and_rewrite(op: ptr.StoreOp, rewriter: PatternRewriter)

Source code in xdsl/backend/x86/lowering/convert_ptr_to_x86.py
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
@op_type_rewrite_pattern
def match_and_rewrite(self, op: ptr.StoreOp, rewriter: PatternRewriter):
    value_type = op.value.type
    # Pointer casts
    addr_cast_op, x86_ptr = UnrealizedConversionCastOp.cast_one(
        op.addr, x86.registers.UNALLOCATED_GENERAL
    )
    if isa(value_type, VectorType[FixedBitwidthType]):
        x86_vect_type = self.arch.register_type_for_type(value_type)
        cast_op, x86_data = UnrealizedConversionCastOp.cast_one(
            op.value, x86_vect_type.unallocated()
        )
        # Choose the x86 vector instruction according to the
        # abstract vector element size
        match value_type.get_element_type().bitwidth:
            case 16:
                raise DiagnosticException(
                    "Half-precision floating point vector load is not implemented yet."
                )
            case 32:
                mov = x86.ops.MS_VmovupsOp
            case 64:
                mov = x86.ops.MS_VmovapdOp
            case _:
                raise DiagnosticException(
                    "Float precision must be half, single or double."
                )
        mov_op = mov(x86_ptr, x86_data, memory_offset=0)
    else:
        cast_op, x86_data = UnrealizedConversionCastOp.cast_one(
            op.value, x86.registers.UNALLOCATED_GENERAL
        )
        mov_op = x86.MS_MovOp(x86_ptr, x86_data, memory_offset=0)

    rewriter.replace_op(op, [addr_cast_op, cast_op, mov_op])

PtrLoadToX86 dataclass

Bases: RewritePattern

Source code in xdsl/backend/x86/lowering/convert_ptr_to_x86.py
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
@dataclass
class PtrLoadToX86(RewritePattern):
    arch: Arch

    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: ptr.LoadOp, rewriter: PatternRewriter):
        # Pointer cast
        x86_reg_type = x86.registers.UNALLOCATED_GENERAL
        cast_op, addr_x86 = UnrealizedConversionCastOp.cast_one(op.addr, x86_reg_type)

        value_type = op.res.type
        if isa(value_type, VectorType[FixedBitwidthType]):
            # Choose the x86 vector instruction according to the
            # abstract vector element size
            match value_type.get_element_type().bitwidth:
                case 16:
                    raise DiagnosticException(
                        "Half-precision floating point vector load is not implemented yet."
                    )
                case 32:
                    mov = x86.ops.DM_VmovupsOp
                case 64:
                    mov = x86.ops.DM_VmovupdOp
                case _:
                    raise DiagnosticException(
                        "Float precision must be half, single or double."
                    )
            mov_op = mov(
                addr_x86,
                memory_offset=0,
                destination=self.arch.register_type_for_type(value_type).unallocated(),
            )
        else:
            mov_op = x86.DM_MovOp(
                addr_x86, memory_offset=0, destination=x86.registers.UNALLOCATED_GENERAL
            )

        res_cast_op = UnrealizedConversionCastOp.get(mov_op.results, (value_type,))
        rewriter.replace_op(op, [cast_op, mov_op, res_cast_op])

arch: Arch instance-attribute

__init__(arch: Arch) -> None

match_and_rewrite(op: ptr.LoadOp, rewriter: PatternRewriter)

Source code in xdsl/backend/x86/lowering/convert_ptr_to_x86.py
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
@op_type_rewrite_pattern
def match_and_rewrite(self, op: ptr.LoadOp, rewriter: PatternRewriter):
    # Pointer cast
    x86_reg_type = x86.registers.UNALLOCATED_GENERAL
    cast_op, addr_x86 = UnrealizedConversionCastOp.cast_one(op.addr, x86_reg_type)

    value_type = op.res.type
    if isa(value_type, VectorType[FixedBitwidthType]):
        # Choose the x86 vector instruction according to the
        # abstract vector element size
        match value_type.get_element_type().bitwidth:
            case 16:
                raise DiagnosticException(
                    "Half-precision floating point vector load is not implemented yet."
                )
            case 32:
                mov = x86.ops.DM_VmovupsOp
            case 64:
                mov = x86.ops.DM_VmovupdOp
            case _:
                raise DiagnosticException(
                    "Float precision must be half, single or double."
                )
        mov_op = mov(
            addr_x86,
            memory_offset=0,
            destination=self.arch.register_type_for_type(value_type).unallocated(),
        )
    else:
        mov_op = x86.DM_MovOp(
            addr_x86, memory_offset=0, destination=x86.registers.UNALLOCATED_GENERAL
        )

    res_cast_op = UnrealizedConversionCastOp.get(mov_op.results, (value_type,))
    rewriter.replace_op(op, [cast_op, mov_op, res_cast_op])

ConvertPtrToX86Pass dataclass

Bases: ModulePass

Source code in xdsl/backend/x86/lowering/convert_ptr_to_x86.py
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
@dataclass(frozen=True)
class ConvertPtrToX86Pass(ModulePass):
    name = "convert-ptr-to-x86"

    arch: str

    def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
        arch = Arch.arch_for_name(self.arch)
        PatternRewriteWalker(
            GreedyRewritePatternApplier(
                [
                    PtrLoadToX86(arch),
                    PtrStoreToX86(arch),
                    PtrAddToX86(),
                ]
            ),
            apply_recursively=False,
        ).rewrite_module(op)

name = 'convert-ptr-to-x86' class-attribute instance-attribute

arch: str instance-attribute

__init__(arch: str) -> None

apply(ctx: Context, op: builtin.ModuleOp) -> None

Source code in xdsl/backend/x86/lowering/convert_ptr_to_x86.py
139
140
141
142
143
144
145
146
147
148
149
150
def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
    arch = Arch.arch_for_name(self.arch)
    PatternRewriteWalker(
        GreedyRewritePatternApplier(
            [
                PtrLoadToX86(arch),
                PtrStoreToX86(arch),
                PtrAddToX86(),
            ]
        ),
        apply_recursively=False,
    ).rewrite_module(op)