@@ -1285,6 +1285,160 @@ 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
+
1379
+
1380
+ def q_tpl (ir , instr , is_sub , dst_size , a , b , c ):
1381
+ e = []
1382
+ sums = []
1383
+
1384
+ median = 1 << (dst_size - 1 )
1385
+
1386
+ min_int = ExprInt (- median , dst_size )
1387
+ max_int = ExprInt (median - 1 , dst_size )
1388
+
1389
+ test_min_int = min_int .signExtend (dst_size + 1 )
1390
+ test_max_int = max_int .signExtend (dst_size + 1 )
1391
+
1392
+ for i in range (0 , a .size , dst_size ):
1393
+ src1 = b [i :i + dst_size ].signExtend (dst_size + 1 )
1394
+ src2 = c [i :i + dst_size ].signExtend (dst_size + 1 )
1395
+ if is_sub :
1396
+ src2 = - src2
1397
+ res = src1 + src2
1398
+ value = res [:dst_size ]
1399
+ res_sat = ExprCond (
1400
+ ExprOp (
1401
+ TOK_INF_EQUAL_SIGNED ,
1402
+ res ,
1403
+ test_min_int
1404
+ ),
1405
+ min_int ,
1406
+ ExprCond (
1407
+ ExprOp (
1408
+ TOK_INF_SIGNED ,
1409
+ res ,
1410
+ test_max_int
1411
+ ),
1412
+ value ,
1413
+ max_int
1414
+ )
1415
+ )
1416
+ sums .append (res_sat )
1417
+
1418
+ e .append (ExprAssign (a , ExprCompose (* sums )))
1419
+ return e , []
1420
+
1421
+
1422
+ def qadd8 (ir , instr , a , b , c ):
1423
+ e , blocks = q_tpl (ir , instr , False , 8 , a , b , c )
1424
+ return e , blocks
1425
+
1426
+
1427
+ def qadd16 (ir , instr , a , b , c ):
1428
+ e , blocks = q_tpl (ir , instr , False , 16 , a , b , c )
1429
+ return e , blocks
1430
+
1431
+
1432
+ def qsub8 (ir , instr , a , b , c ):
1433
+ e , blocks = q_tpl (ir , instr , True , 8 , a , b , c )
1434
+ return e , blocks
1435
+
1436
+
1437
+ def qsub16 (ir , instr , a , b , c ):
1438
+ e , blocks = q_tpl (ir , instr , True , 16 , a , b , c )
1439
+ return e , blocks
1440
+
1441
+
1288
1442
def sel (ir , instr , a , b , c ):
1289
1443
e = []
1290
1444
cond = nf ^ of ^ ExprInt (1 , 1 )
@@ -1641,6 +1795,15 @@ def add_condition_expr(ir, instr, cond, instr_ir, extra_ir):
1641
1795
'smlatb' : smlatb ,
1642
1796
'smlatt' : smlatt ,
1643
1797
'uadd8' : uadd8 ,
1798
+ 'uadd16' : uadd16 ,
1799
+ 'uaddsubx' : uaddsubx ,
1800
+ 'sadd8' : sadd8 ,
1801
+ 'sadd16' : sadd16 ,
1802
+ 'saddsubx' : saddsubx ,
1803
+ 'qadd8' : qadd8 ,
1804
+ 'qadd16' : qadd16 ,
1805
+ 'qsub8' : qsub8 ,
1806
+ 'qsub16' : qsub16 ,
1644
1807
'sel' : sel ,
1645
1808
}
1646
1809
0 commit comments