@@ -15,7 +15,7 @@ use cilly::{
15
15
method:: { Method , MethodType } ,
16
16
ptr,
17
17
r#type:: Type ,
18
- size_of, source_info,
18
+ shl , shr , size_of, source_info,
19
19
static_field_desc:: StaticFieldDescriptor ,
20
20
type_def:: TypeDef ,
21
21
utilis:: escape_class_name,
@@ -206,6 +206,8 @@ pub fn insert_ffi_functions(asm: &mut Assembly, tcx: TyCtxt) {
206
206
bounds_check ( asm) ;
207
207
atomic:: atomics ( asm) ;
208
208
bitreverse_u128 ( asm) ;
209
+ bitreverse_u64 ( asm) ;
210
+ bitreverse_u32 ( asm) ;
209
211
let c_void = crate :: r#type:: c_void ( tcx) ;
210
212
211
213
asm. add_typedef ( TypeDef :: new (
@@ -1374,27 +1376,7 @@ fn shl_u128(value: CILNode, shift: CILNode) -> CILNode {
1374
1376
[ value, shift]
1375
1377
)
1376
1378
}
1377
- fn const_u128 ( value : u128 ) -> CILNode {
1378
- let low = u128_low_u64 ( value) ;
1379
- let high = ( value >> 64 ) as u64 ;
1380
- let ctor_sig = FnSig :: new (
1381
- & [
1382
- Type :: ManagedReference ( Type :: U128 . into ( ) ) ,
1383
- Type :: U64 ,
1384
- Type :: U64 ,
1385
- ] ,
1386
- Type :: Void ,
1387
- ) ;
1388
- CILNode :: NewObj ( Box :: new ( CallOpArgs {
1389
- site : CallSite :: boxed (
1390
- Some ( DotnetTypeRef :: uint_128 ( ) ) ,
1391
- ".ctor" . into ( ) ,
1392
- ctor_sig,
1393
- false ,
1394
- ) ,
1395
- args : [ conv_u64 ! ( ldc_u64!( high) ) , conv_u64 ! ( ldc_u64!( low) ) ] . into ( ) ,
1396
- } ) )
1397
- }
1379
+
1398
1380
add_method_from_trees ! (
1399
1381
bitreverse_u128,
1400
1382
& [ Type :: U128 ] ,
@@ -1406,12 +1388,12 @@ add_method_from_trees!(
1406
1388
tree: or_u128(
1407
1389
and_u128(
1408
1390
shr_u128( CILNode :: LDArg ( 0 ) , ldc_i32!( 1 ) ) ,
1409
- const_u128( 0x5555_5555_5555_5555_5555_5555_5555_5555_u128 ) ,
1391
+ CILNode :: const_u128( 0x5555_5555_5555_5555_5555_5555_5555_5555_u128 ) ,
1410
1392
) ,
1411
1393
shl_u128(
1412
1394
and_u128(
1413
1395
CILNode :: LDArg ( 0 ) ,
1414
- const_u128( 0x5555_5555_5555_5555_5555_5555_5555_5555_u128 ) ,
1396
+ CILNode :: const_u128( 0x5555_5555_5555_5555_5555_5555_5555_5555_u128 ) ,
1415
1397
) ,
1416
1398
ldc_i32!( 1 ) ,
1417
1399
) ,
@@ -1423,12 +1405,12 @@ add_method_from_trees!(
1423
1405
tree: or_u128(
1424
1406
and_u128(
1425
1407
shr_u128( CILNode :: LDLoc ( 0 ) , ldc_i32!( 2 ) ) ,
1426
- const_u128( 0x3333_3333_3333_3333_3333_3333_3333_3333_u128 ) ,
1408
+ CILNode :: const_u128( 0x3333_3333_3333_3333_3333_3333_3333_3333_u128 ) ,
1427
1409
) ,
1428
1410
shl_u128(
1429
1411
and_u128(
1430
1412
CILNode :: LDLoc ( 0 ) ,
1431
- const_u128( 0x3333_3333_3333_3333_3333_3333_3333_3333_u128 ) ,
1413
+ CILNode :: const_u128( 0x3333_3333_3333_3333_3333_3333_3333_3333_u128 ) ,
1432
1414
) ,
1433
1415
ldc_i32!( 2 ) ,
1434
1416
) ,
@@ -1440,12 +1422,12 @@ add_method_from_trees!(
1440
1422
tree: or_u128(
1441
1423
and_u128(
1442
1424
shr_u128( CILNode :: LDLoc ( 0 ) , ldc_i32!( 4 ) ) ,
1443
- const_u128( 0x0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_u128 ) ,
1425
+ CILNode :: const_u128( 0x0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_u128 ) ,
1444
1426
) ,
1445
1427
shl_u128(
1446
1428
and_u128(
1447
1429
CILNode :: LDLoc ( 0 ) ,
1448
- const_u128( 0x0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_u128 ) ,
1430
+ CILNode :: const_u128( 0x0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_0F0F_u128 ) ,
1449
1431
) ,
1450
1432
ldc_i32!( 4 ) ,
1451
1433
) ,
@@ -1457,12 +1439,12 @@ add_method_from_trees!(
1457
1439
tree: or_u128(
1458
1440
and_u128(
1459
1441
shr_u128( CILNode :: LDLoc ( 0 ) , ldc_i32!( 8 ) ) ,
1460
- const_u128( 0x00FF_00FF_00FF_00FF_00FF_00FF_00FF_00FF_u128 ) ,
1442
+ CILNode :: const_u128( 0x00FF_00FF_00FF_00FF_00FF_00FF_00FF_00FF_u128 ) ,
1461
1443
) ,
1462
1444
shl_u128(
1463
1445
and_u128(
1464
1446
CILNode :: LDLoc ( 0 ) ,
1465
- const_u128( 0x00FF_00FF_00FF_00FF_00FF_00FF_00FF_00FF_u128 ) ,
1447
+ CILNode :: const_u128( 0x00FF_00FF_00FF_00FF_00FF_00FF_00FF_00FF_u128 ) ,
1466
1448
) ,
1467
1449
ldc_i32!( 8 ) ,
1468
1450
) ,
@@ -1474,12 +1456,12 @@ add_method_from_trees!(
1474
1456
tree: or_u128(
1475
1457
and_u128(
1476
1458
shr_u128( CILNode :: LDLoc ( 0 ) , ldc_i32!( 16 ) ) ,
1477
- const_u128( 0x0000_FFFF_0000_FFFF_0000_FFFF_0000_FFFF_u128 ) ,
1459
+ CILNode :: const_u128( 0x0000_FFFF_0000_FFFF_0000_FFFF_0000_FFFF_u128 ) ,
1478
1460
) ,
1479
1461
shl_u128(
1480
1462
and_u128(
1481
1463
CILNode :: LDLoc ( 0 ) ,
1482
- const_u128( 0x0000_FFFF_0000_FFFF_0000_FFFF_0000_FFFF_u128 ) ,
1464
+ CILNode :: const_u128( 0x0000_FFFF_0000_FFFF_0000_FFFF_0000_FFFF_u128 ) ,
1483
1465
) ,
1484
1466
ldc_i32!( 16 ) ,
1485
1467
) ,
@@ -1491,12 +1473,12 @@ add_method_from_trees!(
1491
1473
tree: or_u128(
1492
1474
and_u128(
1493
1475
shr_u128( CILNode :: LDLoc ( 0 ) , ldc_i32!( 32 ) ) ,
1494
- const_u128( 0x0000_0000_FFFF_FFFF_0000_0000_FFFF_FFFF_u128 ) ,
1476
+ CILNode :: const_u128( 0x0000_0000_FFFF_FFFF_0000_0000_FFFF_FFFF_u128 ) ,
1495
1477
) ,
1496
1478
shl_u128(
1497
1479
and_u128(
1498
1480
CILNode :: LDLoc ( 0 ) ,
1499
- const_u128( 0x0000_0000_FFFF_FFFF_0000_0000_FFFF_FFFF_u128 ) ,
1481
+ CILNode :: const_u128( 0x0000_0000_FFFF_FFFF_0000_0000_FFFF_FFFF_u128 ) ,
1500
1482
) ,
1501
1483
ldc_i32!( 32 ) ,
1502
1484
) ,
@@ -1515,12 +1497,116 @@ add_method_from_trees!(
1515
1497
None
1516
1498
) ] ,
1517
1499
vec![ ( Some ( "n" . into( ) ) , Type :: U128 ) ] ,
1518
- vec![
1519
- Some ( "buf1" . into( ) ) ,
1520
- Some ( "buf2" . into( ) ) ,
1521
- Some ( "size" . into( ) )
1522
- ]
1500
+ vec![ Some ( "input" . into( ) ) , ]
1501
+ ) ;
1502
+ add_method_from_trees ! (
1503
+ bitreverse_u64,
1504
+ & [ Type :: U64 ] ,
1505
+ Type :: U64 ,
1506
+ vec![ BasicBlock :: new(
1507
+ vec![
1508
+ CILRoot :: STLoc {
1509
+ local: 0 ,
1510
+ tree: shr!( CILNode :: LDArg ( 0 ) , ldc_i32!( 1 ) ) & ldc_u64!( 0x5555_5555_5555_5555_u64 )
1511
+ | shl!(
1512
+ ( CILNode :: LDArg ( 0 ) & ldc_u64!( 0x5555_5555_5555_5555_u64 ) ) ,
1513
+ ldc_i32!( 1 )
1514
+ )
1515
+ }
1516
+ . into( ) ,
1517
+ CILRoot :: STLoc {
1518
+ local: 0 ,
1519
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 2 ) ) & ldc_u64!( 0x3333_3333_3333_3333_u64 )
1520
+ | shl!(
1521
+ ( CILNode :: LDLoc ( 0 ) & ldc_u64!( 0x3333_3333_3333_3333_u64 ) ) ,
1522
+ ldc_i32!( 2 )
1523
+ )
1524
+ }
1525
+ . into( ) ,
1526
+ CILRoot :: STLoc {
1527
+ local: 0 ,
1528
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 4 ) ) & ldc_u64!( 0x0F0F_0F0F_0F0F_0F0F_u64 )
1529
+ | shl!(
1530
+ ( CILNode :: LDLoc ( 0 ) & ldc_u64!( 0x0F0F_0F0F_0F0F_0F0F_u64 ) ) ,
1531
+ ldc_i32!( 4 )
1532
+ )
1533
+ }
1534
+ . into( ) ,
1535
+ CILRoot :: STLoc {
1536
+ local: 0 ,
1537
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 8 ) ) & ldc_u64!( 0x00FF_00FF_00FF_00FF_u64 )
1538
+ | shl!(
1539
+ ( CILNode :: LDLoc ( 0 ) & ldc_u64!( 0x00FF_00FF_00FF_00FF_u64 ) ) ,
1540
+ ldc_i32!( 8 )
1541
+ )
1542
+ }
1543
+ . into( ) ,
1544
+ CILRoot :: STLoc {
1545
+ local: 0 ,
1546
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 16 ) ) & ldc_u64!( 0x0000_FFFF_0000_FFFF_u64 )
1547
+ | shl!(
1548
+ ( CILNode :: LDLoc ( 0 ) & ldc_u64!( 0x0000_FFFF_0000_FFFF_u64 ) ) ,
1549
+ ldc_i32!( 16 )
1550
+ )
1551
+ }
1552
+ . into( ) ,
1553
+ CILRoot :: Ret {
1554
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 32 ) ) & ldc_u64!( 0x0000_0000_FFFF_FFFF_u64 )
1555
+ | shl!(
1556
+ ( CILNode :: LDLoc ( 0 ) & ldc_u64!( 0x0000_0000_FFFF_FFFF_u64 ) ) ,
1557
+ ldc_i32!( 32 )
1558
+ )
1559
+ }
1560
+ . into( )
1561
+ ] ,
1562
+ 0 ,
1563
+ None
1564
+ ) ] ,
1565
+ vec![ ( Some ( "n" . into( ) ) , Type :: U64 ) ] ,
1566
+ vec![ Some ( "input" . into( ) ) , ]
1567
+ ) ;
1568
+ add_method_from_trees ! (
1569
+ bitreverse_u32,
1570
+ & [ Type :: U32 ] ,
1571
+ Type :: U32 ,
1572
+ vec![ BasicBlock :: new(
1573
+ vec![
1574
+ CILRoot :: STLoc {
1575
+ local: 0 ,
1576
+ tree: shr!( CILNode :: LDArg ( 0 ) , ldc_i32!( 1 ) ) & ldc_u32!( 0x5555_5555_u32 )
1577
+ | shl!( ( CILNode :: LDArg ( 0 ) & ldc_u32!( 0x5555_5555_u32 ) ) , ldc_i32!( 1 ) )
1578
+ }
1579
+ . into( ) ,
1580
+ CILRoot :: STLoc {
1581
+ local: 0 ,
1582
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 2 ) ) & ldc_u32!( 0x3333_3333_u32 )
1583
+ | shl!( ( CILNode :: LDLoc ( 0 ) & ldc_u32!( 0x3333_3333_u32 ) ) , ldc_i32!( 2 ) )
1584
+ }
1585
+ . into( ) ,
1586
+ CILRoot :: STLoc {
1587
+ local: 0 ,
1588
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 4 ) ) & ldc_u32!( 0x0F0F_0F0F_u32 )
1589
+ | shl!( ( CILNode :: LDLoc ( 0 ) & ldc_u32!( 0x0F0F_0F0F_u32 ) ) , ldc_i32!( 4 ) )
1590
+ }
1591
+ . into( ) ,
1592
+ CILRoot :: STLoc {
1593
+ local: 0 ,
1594
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 8 ) ) & ldc_u32!( 0x00FF_00FF_u32 )
1595
+ | shl!( ( CILNode :: LDLoc ( 0 ) & ldc_u32!( 0x00FF_00FF_u32 ) ) , ldc_i32!( 8 ) )
1596
+ }
1597
+ . into( ) ,
1598
+ CILRoot :: Ret {
1599
+ tree: shr!( CILNode :: LDLoc ( 0 ) , ldc_i32!( 16 ) ) & ldc_u32!( 0x0000_FFFF_u32 )
1600
+ | shl!(
1601
+ ( CILNode :: LDLoc ( 0 ) & ldc_u32!( 0x0000_FFFF_u32 ) ) ,
1602
+ ldc_i32!( 16 )
1603
+ )
1604
+ }
1605
+ . into( )
1606
+ ] ,
1607
+ 0 ,
1608
+ None
1609
+ ) ] ,
1610
+ vec![ ( Some ( "n" . into( ) ) , Type :: U32 ) ] ,
1611
+ vec![ Some ( "input" . into( ) ) , ]
1523
1612
) ;
1524
- fn u128_low_u64 ( value : u128 ) -> u64 {
1525
- u64:: try_from ( value & u128:: from ( u64:: MAX ) ) . expect ( "trucating cast error" )
1526
- }
0 commit comments