@@ -1285,6 +1285,97 @@ def uadd8(ir, instr, a, b, c):
1285
1285
return e , []
1286
1286
1287
1287
1288
+ def uadd16 (ir , instr , a , b , c ):
1289
+ e = []
1290
+ sums = []
1291
+ ges = []
1292
+ for i in range (0 , 32 , 16 ):
1293
+ sums .append (b [i :i + 16 ] + c [i :i + 16 ])
1294
+ ges .append ((b [i :i + 16 ].zeroExtend (17 ) + c [i :i + 16 ].zeroExtend (17 ))[16 :17 ])
1295
+
1296
+ e .append (ExprAssign (a , ExprCompose (* sums )))
1297
+
1298
+ for i , value in enumerate (ges ):
1299
+ e .append (ExprAssign (ge_regs [2 * i ], value ))
1300
+ e .append (ExprAssign (ge_regs [2 * i + 1 ], value ))
1301
+ return e , []
1302
+
1303
+
1304
+ def uaddsubx (ir , instr , a , b , c ):
1305
+ e = []
1306
+ sums = []
1307
+ ges = []
1308
+
1309
+
1310
+ part1 , part2 = b [16 :32 ], c [0 :16 ]
1311
+ sums .append (part1 + part2 )
1312
+ ges .append ((part1 .zeroExtend (17 ) + part2 .zeroExtend (17 ))[16 :17 ])
1313
+
1314
+ part1 , part2 = b [0 :16 ], c [16 :32 ]
1315
+ sums .append (part1 - part2 )
1316
+ ges .append (ExprOp ("FLAG_SIGN_SUB" , part1 , part2 ))
1317
+
1318
+ e .append (ExprAssign (a , ExprCompose (* sums [::- 1 ])))
1319
+
1320
+ for i , value in enumerate (ges [::- 1 ]):
1321
+ e .append (ExprAssign (ge_regs [2 * i ], value ))
1322
+ e .append (ExprAssign (ge_regs [2 * i + 1 ], value ))
1323
+ return e , []
1324
+
1325
+
1326
+ def sadd8 (ir , instr , a , b , c ):
1327
+ e = []
1328
+ sums = []
1329
+ ges = []
1330
+ for i in range (0 , 32 , 8 ):
1331
+ sums .append (b [i :i + 8 ] + c [i :i + 8 ])
1332
+ ges .append (ExprOp ("FLAG_SIGN_SUB" , ExprInt (0 , 9 ), b [i :i + 8 ].signExtend (9 ) + c [i :i + 8 ].signExtend (9 )))
1333
+
1334
+ e .append (ExprAssign (a , ExprCompose (* sums )))
1335
+
1336
+ for i , value in enumerate (ges ):
1337
+ e .append (ExprAssign (ge_regs [i ], value ))
1338
+ return e , []
1339
+
1340
+
1341
+ def sadd16 (ir , instr , a , b , c ):
1342
+ e = []
1343
+ sums = []
1344
+ ges = []
1345
+ for i in range (0 , 32 , 16 ):
1346
+ sums .append (b [i :i + 16 ] + c [i :i + 16 ])
1347
+ ges .append (ExprOp ("FLAG_SIGN_SUB" , ExprInt (0 , 17 ), b [i :i + 16 ].signExtend (17 ) + c [i :i + 16 ].signExtend (17 )))
1348
+
1349
+ e .append (ExprAssign (a , ExprCompose (* sums )))
1350
+
1351
+ for i , value in enumerate (ges ):
1352
+ e .append (ExprAssign (ge_regs [2 * i ], value ))
1353
+ e .append (ExprAssign (ge_regs [2 * i + 1 ], value ))
1354
+ return e , []
1355
+
1356
+
1357
+ def saddsubx (ir , instr , a , b , c ):
1358
+ e = []
1359
+ sums = []
1360
+ ges = []
1361
+
1362
+
1363
+ part1 , part2 = b [16 :32 ], c [0 :16 ]
1364
+ sums .append (part1 + part2 )
1365
+ ges .append (ExprOp ("FLAG_SIGN_SUB" , ExprInt (0 , 17 ), part1 .signExtend (17 ) + part2 .signExtend (17 )))
1366
+
1367
+ part1 , part2 = b [0 :16 ], c [16 :32 ]
1368
+ sums .append (part1 - part2 )
1369
+ ges .append (~ ExprOp ("FLAG_SIGN_SUB" , part1 , part2 ))
1370
+
1371
+ e .append (ExprAssign (a , ExprCompose (* sums [::- 1 ])))
1372
+
1373
+ for i , value in enumerate (ges [::- 1 ]):
1374
+ e .append (ExprAssign (ge_regs [2 * i ], value ))
1375
+ e .append (ExprAssign (ge_regs [2 * i + 1 ], value ))
1376
+ return e , []
1377
+
1378
+
1288
1379
def sel (ir , instr , a , b , c ):
1289
1380
e = []
1290
1381
cond = nf ^ of ^ ExprInt (1 , 1 )
@@ -1641,6 +1732,11 @@ def add_condition_expr(ir, instr, cond, instr_ir, extra_ir):
1641
1732
'smlatb' : smlatb ,
1642
1733
'smlatt' : smlatt ,
1643
1734
'uadd8' : uadd8 ,
1735
+ 'uadd16' : uadd16 ,
1736
+ 'uaddsubx' : uaddsubx ,
1737
+ 'sadd8' : sadd8 ,
1738
+ 'sadd16' : sadd16 ,
1739
+ 'saddsubx' : saddsubx ,
1644
1740
'sel' : sel ,
1645
1741
}
1646
1742
0 commit comments