@@ -58,6 +58,134 @@ struct Keccak256OpLowering : public OpRewritePattern<yul::Keccak256Op> {
5858 }
5959};
6060
61+ struct DivOpLowering : public OpRewritePattern <yul::DivOp> {
62+ using OpRewritePattern<yul::DivOp>::OpRewritePattern;
63+
64+ LogicalResult matchAndRewrite (yul::DivOp op,
65+ PatternRewriter &r) const override {
66+ evm::Builder evmB (r, op.getLoc ());
67+
68+ r.replaceOpWithNewOp <LLVM::IntrCallOp>(
69+ op, llvm::Intrinsic::evm_div,
70+ /* resTy=*/ r.getIntegerType (256 ),
71+ /* ins=*/ ValueRange{op.getDividend (), op.getDivisor ()}, " evm.div" );
72+
73+ return success ();
74+ }
75+ };
76+
77+ struct SDivOpLowering : public OpRewritePattern <yul::SDivOp> {
78+ using OpRewritePattern<yul::SDivOp>::OpRewritePattern;
79+
80+ LogicalResult matchAndRewrite (yul::SDivOp op,
81+ PatternRewriter &r) const override {
82+ evm::Builder evmB (r, op.getLoc ());
83+
84+ r.replaceOpWithNewOp <LLVM::IntrCallOp>(
85+ op, llvm::Intrinsic::evm_sdiv,
86+ /* resTy=*/ r.getIntegerType (256 ),
87+ /* ins=*/ ValueRange{op.getDividend (), op.getDivisor ()}, " evm.sdiv" );
88+
89+ return success ();
90+ }
91+ };
92+
93+ struct ModOpLowering : public OpRewritePattern <yul::ModOp> {
94+ using OpRewritePattern<yul::ModOp>::OpRewritePattern;
95+
96+ LogicalResult matchAndRewrite (yul::ModOp op,
97+ PatternRewriter &r) const override {
98+ evm::Builder evmB (r, op.getLoc ());
99+
100+ r.replaceOpWithNewOp <LLVM::IntrCallOp>(
101+ op, llvm::Intrinsic::evm_mod,
102+ /* resTy=*/ r.getIntegerType (256 ),
103+ /* ins=*/ ValueRange{op.getValue (), op.getMod ()}, " evm.mod" );
104+
105+ return success ();
106+ }
107+ };
108+
109+ struct SModOpLowering : public OpRewritePattern <yul::SModOp> {
110+ using OpRewritePattern<yul::SModOp>::OpRewritePattern;
111+
112+ LogicalResult matchAndRewrite (yul::SModOp op,
113+ PatternRewriter &r) const override {
114+ evm::Builder evmB (r, op.getLoc ());
115+
116+ r.replaceOpWithNewOp <LLVM::IntrCallOp>(
117+ op, llvm::Intrinsic::evm_smod,
118+ /* resTy=*/ r.getIntegerType (256 ),
119+ /* ins=*/ ValueRange{op.getValue (), op.getMod ()}, " evm.smod" );
120+
121+ return success ();
122+ }
123+ };
124+
125+ struct ShlOpLowering : public OpRewritePattern <yul::ShlOp> {
126+ using OpRewritePattern<yul::ShlOp>::OpRewritePattern;
127+
128+ LogicalResult matchAndRewrite (yul::ShlOp op,
129+ PatternRewriter &r) const override {
130+ evm::Builder evmB (r, op.getLoc ());
131+
132+ r.replaceOpWithNewOp <LLVM::IntrCallOp>(
133+ op, llvm::Intrinsic::evm_shl,
134+ /* resTy=*/ r.getIntegerType (256 ),
135+ /* ins=*/ ValueRange{op.getShift (), op.getVal ()}, " evm.shl" );
136+
137+ return success ();
138+ }
139+ };
140+
141+ struct ShrOpLowering : public OpRewritePattern <yul::ShrOp> {
142+ using OpRewritePattern<yul::ShrOp>::OpRewritePattern;
143+
144+ LogicalResult matchAndRewrite (yul::ShrOp op,
145+ PatternRewriter &r) const override {
146+ evm::Builder evmB (r, op.getLoc ());
147+
148+ r.replaceOpWithNewOp <LLVM::IntrCallOp>(
149+ op, llvm::Intrinsic::evm_shr,
150+ /* resTy=*/ r.getIntegerType (256 ),
151+ /* ins=*/ ValueRange{op.getShift (), op.getVal ()}, " evm.shr" );
152+
153+ return success ();
154+ }
155+ };
156+
157+ struct SarOpLowering : public OpRewritePattern <yul::SarOp> {
158+ using OpRewritePattern<yul::SarOp>::OpRewritePattern;
159+
160+ LogicalResult matchAndRewrite (yul::SarOp op,
161+ PatternRewriter &r) const override {
162+ evm::Builder evmB (r, op.getLoc ());
163+
164+ r.replaceOpWithNewOp <LLVM::IntrCallOp>(
165+ op, llvm::Intrinsic::evm_sar,
166+ /* resTy=*/ r.getIntegerType (256 ),
167+ /* ins=*/ ValueRange{op.getShift (), op.getVal ()}, " evm.sar" );
168+
169+ return success ();
170+ }
171+ };
172+
173+ struct ExpOpLowering : public OpRewritePattern <yul::ExpOp> {
174+ using OpRewritePattern<yul::ExpOp>::OpRewritePattern;
175+
176+ LogicalResult matchAndRewrite (yul::ExpOp op,
177+ PatternRewriter &r) const override {
178+ evm::Builder evmB (r, op.getLoc ());
179+
180+ r.replaceOpWithNewOp <LLVM::IntrCallOp>(
181+ op, llvm::Intrinsic::evm_exp,
182+ /* resTy=*/ r.getIntegerType (256 ),
183+ /* ins=*/ ValueRange{op.getBase (), op.getExp ()}, " evm.exp" );
184+
185+ return success ();
186+ }
187+ };
188+
61189struct LogOpLowering : public OpRewritePattern <yul::LogOp> {
62190 using OpRewritePattern<yul::LogOp>::OpRewritePattern;
63191
@@ -725,6 +853,14 @@ void evm::populateYulPats(RewritePatternSet &pats) {
725853 // clang-format off
726854 UpdFreePtrOpLowering,
727855 Keccak256OpLowering,
856+ DivOpLowering,
857+ SDivOpLowering,
858+ ModOpLowering,
859+ SModOpLowering,
860+ ShlOpLowering,
861+ ShrOpLowering,
862+ SarOpLowering,
863+ ExpOpLowering,
728864 LogOpLowering,
729865 AddressOpLowering,
730866 CallerOpLowering,
0 commit comments