Skip to content

Commit 9fb3c9c

Browse files
committed
Use array for regular operand sizes
1 parent c877b50 commit 9fb3c9c

File tree

1 file changed

+82
-111
lines changed

1 file changed

+82
-111
lines changed

bddisasm/bdx86_decoder.c

+82-111
Original file line numberDiff line numberDiff line change
@@ -1422,6 +1422,74 @@ NdParseMemoryOperand3264(
14221422
}
14231423

14241424

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+
14251493

14261494
//
14271495
// NdParseOperand
@@ -1473,10 +1541,11 @@ NdParseOperand(
14731541
// Implicit operand access, by default.
14741542
operand->Encoding = ND_OPE_S;
14751543

1476-
14771544
//
14781545
// Fill in operand size.
14791546
//
1547+
// Regular cases come from a table.
1548+
size = operandSizes[ops];
14801549
switch (ops)
14811550
{
14821551
case ND_OPS_asz:
@@ -1490,68 +1559,30 @@ NdParseOperand(
14901559
break;
14911560

14921561
case ND_OPS_0:
1493-
// No memory access. 0 operand size.
1494-
size = 0;
1495-
break;
1496-
14971562
case ND_OPS_b:
1498-
// 8 bits.
1499-
size = ND_SIZE_8BIT;
1500-
break;
1501-
15021563
case ND_OPS_w:
1503-
// 16 bits.
1504-
size = ND_SIZE_16BIT;
1505-
break;
1506-
15071564
case ND_OPS_d:
1508-
// 32 bits.
1509-
size = ND_SIZE_32BIT;
1510-
break;
1511-
15121565
case ND_OPS_q:
1513-
// 64 bits.
1514-
size = ND_SIZE_64BIT;
1515-
break;
1516-
15171566
case ND_OPS_dq:
1518-
// 128 bits.
1519-
size = ND_SIZE_128BIT;
1520-
break;
1521-
15221567
case ND_OPS_qq:
1523-
// 256 bits.
1524-
size = ND_SIZE_256BIT;
1525-
break;
1526-
15271568
case ND_OPS_oq:
1528-
// 512 bits.
1529-
size = ND_SIZE_512BIT;
1530-
break;
1531-
15321569
case ND_OPS_fa:
1533-
// 80 bits packed BCD.
1534-
size = ND_SIZE_80BIT;
1535-
break;
1536-
15371570
case ND_OPS_fw:
1538-
// 16 bits real number.
1539-
size = ND_SIZE_16BIT;
1540-
break;
1541-
15421571
case ND_OPS_fd:
1543-
// 32 bits real number.
1544-
size = ND_SIZE_32BIT;
1545-
break;
1546-
15471572
case ND_OPS_fq:
1548-
// 64 bits real number.
1549-
size = ND_SIZE_64BIT;
1550-
break;
1551-
15521573
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:
15551586
break;
15561587

15571588
case ND_OPS_fe:
@@ -1564,16 +1595,6 @@ NdParseOperand(
15641595
size = (Instrux->EfOpMode == ND_OPSZ_16) ? ND_SIZE_752BIT : ND_SIZE_864BIT;
15651596
break;
15661597

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-
15771598
case ND_OPS_v:
15781599
// 16, 32 or 64 bits.
15791600
{
@@ -1739,26 +1760,6 @@ NdParseOperand(
17391760
}
17401761
break;
17411762

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-
17621763
case ND_OPS_vm32x:
17631764
case ND_OPS_vm32y:
17641765
case ND_OPS_vm32z:
@@ -1842,36 +1843,6 @@ NdParseOperand(
18421843
}
18431844
break;
18441845

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-
18751846
default:
18761847
return ND_STATUS_INVALID_INSTRUX;
18771848
}

0 commit comments

Comments
 (0)