@@ -101,8 +101,26 @@ def handle_assign(func, module, builder, stmt, map_sym_tab, local_sym_tab):
101
101
102
102
def handle_expr (func , module , builder , expr , local_sym_tab , map_sym_tab ):
103
103
"""Handle expression statements in the function body."""
104
+ print (f"Handling expression: { ast .dump (expr )} " )
105
+
106
+ if isinstance (expr , ast .Name ):
107
+ if expr .id in local_sym_tab :
108
+ var = local_sym_tab [expr .id ]
109
+ val = builder .load (var )
110
+ return val
111
+ else :
112
+ print (f"Undefined variable { expr .id } " )
113
+ return None
114
+ elif isinstance (expr , ast .Constant ):
115
+ if isinstance (expr .value , int ):
116
+ return ir .Constant (ir .IntType (64 ), expr .value )
117
+ elif isinstance (expr .value , bool ):
118
+ return ir .Constant (ir .IntType (1 ), int (expr .value ))
119
+ else :
120
+ print ("Unsupported constant type" )
121
+ return None
122
+
104
123
call = expr .value
105
- print (f"Handling expression: { ast .dump (call )} " )
106
124
if isinstance (call , ast .Call ):
107
125
if isinstance (call .func , ast .Name ):
108
126
# check for helpers first
@@ -154,6 +172,42 @@ def handle_cond(func, module, builder, cond, local_sym_tab, map_sym_tab):
154
172
else :
155
173
print (f"Undefined variable { cond .id } in condition" )
156
174
return None
175
+ elif isinstance (cond , ast .Compare ):
176
+ lhs = handle_expr (func , module , builder , cond .left ,
177
+ local_sym_tab , map_sym_tab )
178
+ if len (cond .ops ) != 1 or len (cond .comparators ) != 1 :
179
+ print ("Unsupported complex comparison" )
180
+ return None
181
+ rhs = handle_expr (func , module , builder ,
182
+ cond .comparators [0 ], local_sym_tab , map_sym_tab )
183
+ op = cond .ops [0 ]
184
+
185
+ if lhs .type != rhs .type :
186
+ if isinstance (lhs .type , ir .IntType ) and isinstance (rhs .type , ir .IntType ):
187
+ # Extend the smaller type to the larger type
188
+ if lhs .type .width < rhs .type .width :
189
+ lhs = builder .sext (lhs , rhs .type )
190
+ elif lhs .type .width > rhs .type .width :
191
+ rhs = builder .sext (rhs , lhs .type )
192
+ else :
193
+ print ("Type mismatch in comparison" )
194
+ return None
195
+
196
+ if isinstance (op , ast .Eq ):
197
+ return builder .icmp_signed ("==" , lhs , rhs )
198
+ elif isinstance (op , ast .NotEq ):
199
+ return builder .icmp_signed ("!=" , lhs , rhs )
200
+ elif isinstance (op , ast .Lt ):
201
+ return builder .icmp_signed ("<" , lhs , rhs )
202
+ elif isinstance (op , ast .LtE ):
203
+ return builder .icmp_signed ("<=" , lhs , rhs )
204
+ elif isinstance (op , ast .Gt ):
205
+ return builder .icmp_signed (">" , lhs , rhs )
206
+ elif isinstance (op , ast .GtE ):
207
+ return builder .icmp_signed (">=" , lhs , rhs )
208
+ else :
209
+ print ("Unsupported comparison operator" )
210
+ return None
157
211
else :
158
212
print ("Unsupported condition expression" )
159
213
return None
0 commit comments