@@ -1422,6 +1422,74 @@ NdParseMemoryOperand3264(
1422
1422
}
1423
1423
1424
1424
1425
+ static const ND_OPERAND_SIZE operandSizes [] =
1426
+ {
1427
+ 0 , // none
1428
+ 0 , // 0
1429
+ 0 , // asz
1430
+ 0 , // ssz
1431
+ 0 , // a
1432
+ 0 , // c
1433
+ ND_SIZE_8BIT , // b, 8 bits
1434
+ ND_SIZE_16BIT , // w, 16 bits
1435
+ ND_SIZE_32BIT , // d, 32 bits
1436
+ ND_SIZE_64BIT , // q, 64 bits
1437
+ ND_SIZE_128BIT , // dq, 128 bits
1438
+ ND_SIZE_256BIT , // qq, 256 bits
1439
+ ND_SIZE_512BIT , // oq, 512 bits
1440
+ 0 , // v
1441
+ 0 , // y
1442
+ 0 , // yf
1443
+ 0 , // z
1444
+ 0 , // s
1445
+ 0 , // p
1446
+ ND_SIZE_80BIT , // fa, 80 bits packed BCD
1447
+ ND_SIZE_16BIT , // fw, 16 bits real number
1448
+ ND_SIZE_32BIT , // fd, 32 bits real number
1449
+ ND_SIZE_64BIT , // fq, 64 bits real number
1450
+ ND_SIZE_80BIT , // ft, 80 bits real number
1451
+ 0 , // fe
1452
+ 0 , // fs
1453
+ 0 , // l
1454
+ ND_SIZE_4096BIT , // rx, 512 bytes extended state
1455
+ ND_SIZE_CACHE_LINE , // cl, The size of one cache line
1456
+ ND_SIZE_64BIT , // sd, 128 bits scalar element (double precision)
1457
+ ND_SIZE_32BIT , // ss, 128 bits scalar element (single precision)
1458
+ ND_SIZE_16BIT , // sh, FP16 Scalar element
1459
+ 0 , // ps
1460
+ 0 , // pd
1461
+ 0 , // ph
1462
+ 0 , // ev
1463
+ 0 , // qv
1464
+ 0 , // hv
1465
+ 0 , // x
1466
+ 0 , // uv
1467
+ 0 , // fv
1468
+ ND_SIZE_1KB , // t, Tile register. The actual size depends on how the TILECFG register has been programmed,
1469
+ // but it can be up to 1K in size
1470
+ ND_SIZE_384BIT , // 384, 384 bit Key Locker handle
1471
+ ND_SIZE_512BIT , // 512, 512 bit Key Locker handle
1472
+ ND_SIZE_4096BIT , // 4096, 64 entries x 64 bit per entry = 4096 bit MSR address/value list
1473
+ 0 , // v2
1474
+ 0 , // v3
1475
+ 0 , // v4
1476
+ 0 , // v5
1477
+ 0 , // v8
1478
+ 12 , // 12, SAVPREVSSP instruction reads/writes 4 + 8 bytes from the shadow stack
1479
+ 0 , // mib, MIB addressing, the base & the index are used to form a pointer
1480
+ 0 , // vm32x
1481
+ 0 , // vm32y
1482
+ 0 , // vm32z
1483
+ 0 , // vm32h
1484
+ 0 , // vm32n
1485
+ 0 , // vm64x
1486
+ 0 , // vm64y
1487
+ 0 , // vm64z
1488
+ 0 , // vm64h
1489
+ 0 , // vm64n
1490
+ ND_SIZE_UNKNOWN // unknown
1491
+ };
1492
+
1425
1493
1426
1494
//
1427
1495
// NdParseOperand
@@ -1473,10 +1541,11 @@ NdParseOperand(
1473
1541
// Implicit operand access, by default.
1474
1542
operand -> Encoding = ND_OPE_S ;
1475
1543
1476
-
1477
1544
//
1478
1545
// Fill in operand size.
1479
1546
//
1547
+ // Regular cases come from a table.
1548
+ size = operandSizes [ops ];
1480
1549
switch (ops )
1481
1550
{
1482
1551
case ND_OPS_asz :
@@ -1490,68 +1559,30 @@ NdParseOperand(
1490
1559
break ;
1491
1560
1492
1561
case ND_OPS_0 :
1493
- // No memory access. 0 operand size.
1494
- size = 0 ;
1495
- break ;
1496
-
1497
1562
case ND_OPS_b :
1498
- // 8 bits.
1499
- size = ND_SIZE_8BIT ;
1500
- break ;
1501
-
1502
1563
case ND_OPS_w :
1503
- // 16 bits.
1504
- size = ND_SIZE_16BIT ;
1505
- break ;
1506
-
1507
1564
case ND_OPS_d :
1508
- // 32 bits.
1509
- size = ND_SIZE_32BIT ;
1510
- break ;
1511
-
1512
1565
case ND_OPS_q :
1513
- // 64 bits.
1514
- size = ND_SIZE_64BIT ;
1515
- break ;
1516
-
1517
1566
case ND_OPS_dq :
1518
- // 128 bits.
1519
- size = ND_SIZE_128BIT ;
1520
- break ;
1521
-
1522
1567
case ND_OPS_qq :
1523
- // 256 bits.
1524
- size = ND_SIZE_256BIT ;
1525
- break ;
1526
-
1527
1568
case ND_OPS_oq :
1528
- // 512 bits.
1529
- size = ND_SIZE_512BIT ;
1530
- break ;
1531
-
1532
1569
case ND_OPS_fa :
1533
- // 80 bits packed BCD.
1534
- size = ND_SIZE_80BIT ;
1535
- break ;
1536
-
1537
1570
case ND_OPS_fw :
1538
- // 16 bits real number.
1539
- size = ND_SIZE_16BIT ;
1540
- break ;
1541
-
1542
1571
case ND_OPS_fd :
1543
- // 32 bits real number.
1544
- size = ND_SIZE_32BIT ;
1545
- break ;
1546
-
1547
1572
case ND_OPS_fq :
1548
- // 64 bits real number.
1549
- size = ND_SIZE_64BIT ;
1550
- break ;
1551
-
1552
1573
case ND_OPS_ft :
1553
- // 80 bits real number.
1554
- size = ND_SIZE_80BIT ;
1574
+ case ND_OPS_rx :
1575
+ case ND_OPS_cl :
1576
+ case ND_OPS_sd :
1577
+ case ND_OPS_ss :
1578
+ case ND_OPS_sh :
1579
+ case ND_OPS_mib :
1580
+ case ND_OPS_12 :
1581
+ case ND_OPS_t :
1582
+ case ND_OPS_384 :
1583
+ case ND_OPS_512 :
1584
+ case ND_OPS_4096 :
1585
+ case ND_OPS_unknown :
1555
1586
break ;
1556
1587
1557
1588
case ND_OPS_fe :
@@ -1564,16 +1595,6 @@ NdParseOperand(
1564
1595
size = (Instrux -> EfOpMode == ND_OPSZ_16 ) ? ND_SIZE_752BIT : ND_SIZE_864BIT ;
1565
1596
break ;
1566
1597
1567
- case ND_OPS_rx :
1568
- // 512 bytes extended state.
1569
- size = ND_SIZE_4096BIT ;
1570
- break ;
1571
-
1572
- case ND_OPS_cl :
1573
- // The size of one cache line.
1574
- size = ND_SIZE_CACHE_LINE ;
1575
- break ;
1576
-
1577
1598
case ND_OPS_v :
1578
1599
// 16, 32 or 64 bits.
1579
1600
{
@@ -1739,26 +1760,6 @@ NdParseOperand(
1739
1760
}
1740
1761
break ;
1741
1762
1742
- case ND_OPS_sd :
1743
- // 128 bits scalar element (double precision).
1744
- size = ND_SIZE_64BIT ;
1745
- break ;
1746
-
1747
- case ND_OPS_ss :
1748
- // 128 bits scalar element (single precision).
1749
- size = ND_SIZE_32BIT ;
1750
- break ;
1751
-
1752
- case ND_OPS_sh :
1753
- // FP16 Scalar element.
1754
- size = ND_SIZE_16BIT ;
1755
- break ;
1756
-
1757
- case ND_OPS_mib :
1758
- // MIB addressing, the base & the index are used to form a pointer.
1759
- size = 0 ;
1760
- break ;
1761
-
1762
1763
case ND_OPS_vm32x :
1763
1764
case ND_OPS_vm32y :
1764
1765
case ND_OPS_vm32z :
@@ -1842,36 +1843,6 @@ NdParseOperand(
1842
1843
}
1843
1844
break ;
1844
1845
1845
- case ND_OPS_12 :
1846
- // SAVPREVSSP instruction reads/writes 4 + 8 bytes from the shadow stack.
1847
- size = 12 ;
1848
- break ;
1849
-
1850
- case ND_OPS_t :
1851
- // Tile register. The actual size depends on how the TILECFG register has been programmed, but it can be
1852
- // up to 1K in size.
1853
- size = ND_SIZE_1KB ;
1854
- break ;
1855
-
1856
- case ND_OPS_384 :
1857
- // 384 bit Key Locker handle.
1858
- size = ND_SIZE_384BIT ;
1859
- break ;
1860
-
1861
- case ND_OPS_512 :
1862
- // 512 bit Key Locker handle.
1863
- size = ND_SIZE_512BIT ;
1864
- break ;
1865
-
1866
- case ND_OPS_4096 :
1867
- // 64 entries x 64 bit per entry = 4096 bit MSR address/value list.
1868
- size = ND_SIZE_4096BIT ;
1869
- break ;
1870
-
1871
- case ND_OPS_unknown :
1872
- size = ND_SIZE_UNKNOWN ;
1873
- break ;
1874
-
1875
1846
default :
1876
1847
return ND_STATUS_INVALID_INSTRUX ;
1877
1848
}
0 commit comments