1569
1573
bu32 sat = 0, tsat, ret;
1571
1575
/* Sign extend accumulator if necessary, otherwise unsigned. */
1572
if (mmod == 0 || mmod == M_T || mmod == M_IS || mmod == M_ISS2
1573
|| mmod == M_S2RND || mmod == M_IH || mmod == M_W32)
1576
if (is_macmod_signed (mmod) || MM)
1574
1577
acc = get_extended_acc (cpu, which);
1576
1579
acc = get_unextended_acc (cpu, which);
1578
if (MM && (mmod == M_T || mmod == M_IS || mmod == M_ISS2
1579
|| mmod == M_S2RND || mmod == M_IH || mmod == M_W32))
1580
acc |= -(acc & 0x80000000);
1584
1583
bu8 sgn0 = (acc >> 31) & 1;
1584
bu8 sgn40 = (acc >> 39) & 1;
1585
1587
/* This can't saturate, so we don't keep track of the sat flag. */
1586
1588
bu64 res = decode_multfunc (cpu, h0, h1, src0, src1, mmod,
1615
1618
acc = 0x7fffffffffull, sat = 1;
1623
if ((bs64)acc < -((bs64)1 << 39))
1624
acc = -((bu64)1 << 39), sat = 1;
1625
if ((bs64)acc > 0x7FFFFFFFFFll)
1626
acc = 0x7FFFFFFFFFull, sat = 1;
1632
if ((bs64)acc > 0xFFFFFFFFFFull)
1633
acc = 0xFFFFFFFFFFull, sat = 1;
1637
if (!MM && acc & 0x8000000000000000ull)
1618
1639
if (!MM && acc > 0xFFFFFFFFFFull)
1620
if (MM && acc > 0xFFFFFFFF)
1624
if (acc & 0x8000000000000000ull)
1626
if (acc > 0xFFFFFFFFFFull)
1627
acc &= 0xFFFFFFFFFFull, sat = 1;
1628
if (MM && acc > 0xFFFFFFFF)
1630
if (acc & 0x80000000)
1631
acc |= 0xffffffff00000000ull;
1634
if (!MM && (bs64)acc < 0)
1636
if (MM && (bs64)acc < -((bs64)1 << 39))
1637
acc = -((bu64)1 << 39), sat = 1;
1638
if (!MM && (bs64)acc > (bs64)0xFFFFFFFFFFll)
1639
1640
acc = 0xFFFFFFFFFFull, sat = 1;
1640
1641
if (MM && acc > 0xFFFFFFFFFFull)
1641
1642
acc &= 0xFFFFFFFFFFull;
1642
if (MM && acc & 0x80000000)
1643
acc |= 0xffffffff00000000ull;
1643
if (acc & 0x8000000000ull)
1644
acc |= 0xffffff0000000000ull;
1649
if ((bs64)acc < -((bs64)1 << 39))
1650
acc = -((bu64)1 << 39), sat = 1;
1651
if ((bs64)acc > 0x7FFFFFFFFFll)
1652
acc = 0x7FFFFFFFFFull, sat = 1;
1653
else if (acc & 0x8000000000ull)
1654
acc |= 0xffffff0000000000ull;
1660
else if ((bs64)acc > (bs64)0xFFFFFFFFFFll)
1661
acc = 0xFFFFFFFFFFull, sat = 1;
1646
1665
if ((bs64)acc < -0x80000000ll)
1647
1666
acc = -0x80000000ull, sat = 1;
1648
else if ((bs64)acc >= 0x7fffffffll)
1667
else if ((bs64)acc > 0x7fffffffll)
1649
1668
acc = 0x7fffffffull, sat = 1;
1652
if (sgn0 && (sgn0 != ((acc >> 31) & 1))
1653
&& (((acc >> 32) & 0xFF) == 0xff))
1671
/* check max negative value */
1672
if (sgn40 && ((acc >> 31) != 0x1ffffffff)
1673
&& ((acc >> 31) != 0x0))
1674
acc = 0x80000000, sat = 1;
1675
if (!sat && !sgn40 && ((acc >> 31) != 0x0)
1676
&& ((acc >> 31) != 0x1ffffffff))
1677
acc = 0x7FFFFFFF, sat = 1;
1655
1678
acc &= 0xffffffff;
1656
1679
if (acc & 0x80000000)
1657
1680
acc |= 0xffffffff00000000ull;
1660
1685
illegal_instruction (cpu);
1668
1693
STORE (ASTATREG (av[which]), sat);
1670
1695
STORE (ASTATREG (avs[which]), sat);
1697
/* Figure out the overflow bit. */
1703
ret = extract_mult (cpu, nosat_acc, mmod, MM, fullword, overflow);
1673
1707
ret = extract_mult (cpu, acc, mmod, MM, fullword, overflow);
3719
3752
int h01 = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
3721
3754
bu32 res = DREG (dst);
3722
bu32 v_i = 0, zero = 0, n_1 = 0, n_0 = 0;
3755
bu32 v_0 = 0, v_1 = 0, zero = 0, n_1 = 0, n_0 = 0;
3724
3757
static const char * const ops[] = { "=", "+=", "-=" };
3725
3758
char _buf[128], *buf = _buf;
3744
3777
if (w1 == 1 || op1 != 3)
3746
3779
bu32 res1 = decode_macfunc (cpu, 1, op1, h01, h11, src0,
3747
src1, mmod, MM, P, &v_i, &n_1);
3780
src1, mmod, MM, P, &v_1, &n_1);
3750
3783
buf += sprintf (buf, P ? "R%i" : "R%i.H", dst + P);
3790
3825
if (w0 == 1 || op0 != 3)
3792
3827
bu32 res0 = decode_macfunc (cpu, 0, op0, h00, h10, src0,
3793
src1, mmod, 0, P, &v_i, &n_0);
3828
src1, mmod, 0, P, &v_0, &n_0);
3796
3831
buf += sprintf (buf, P ? "R%i" : "R%i.L", dst);
4213
4250
((s0 >> 8) & 0xff) + ((s0 >> 0) & 0xff) + i) >> 2) & 0xff;
4214
4251
tmp1 = ((((s1 >> 24) & 0xff) + ((s1 >> 16) & 0xff) +
4215
4252
((s0 >> 24) & 0xff) + ((s0 >> 16) & 0xff) + i) >> 2) & 0xff;
4216
SET_DREG (dst0, (tmp1 << (16 + (HL * 8))) | (tmp0 << (HL * 8)));
4253
STORE (DREG (dst0), (tmp1 << (16 + (HL * 8))) | (tmp0 << (HL * 8)));
4255
/* Implicit DISALGNEXCPT in parallel. */
4218
4258
else if ((aop == 0 || aop == 1) && s == 0 && aopcde == 8)
4329
4369
tmp0 = (bs32)(bs16)(s0 >> 0) + ((s1 >> ( 0 + (8 * !HL))) & 0xff);
4330
4370
tmp1 = (bs32)(bs16)(s0 >> 16) + ((s1 >> (16 + (8 * !HL))) & 0xff);
4331
SET_DREG (dst0, (CLAMP (tmp0, 0, 255) << ( 0 + (8 * HL))) |
4332
(CLAMP (tmp1, 0, 255) << (16 + (8 * HL))));
4371
STORE (DREG (dst0), (CLAMP (tmp0, 0, 255) << ( 0 + (8 * HL))) |
4372
(CLAMP (tmp1, 0, 255) << (16 + (8 * HL))));
4374
/* Implicit DISALGNEXCPT in parallel. */
4334
4377
else if ((aop == 0 || aop == 1) && aopcde == 16)
4808
4854
s1 = algn (s1L, s1H, IREG (1) & 3);
4812
4858
(((((s0 >> 0) & 0xff) + ((s1 >> 0) & 0xff) + !aop) >> 1) << 0) |
4813
4859
(((((s0 >> 8) & 0xff) + ((s1 >> 8) & 0xff) + !aop) >> 1) << 8) |
4814
4860
(((((s0 >> 16) & 0xff) + ((s1 >> 16) & 0xff) + !aop) >> 1) << 16) |
4815
4861
(((((s0 >> 24) & 0xff) + ((s1 >> 24) & 0xff) + !aop) >> 1) << 24));
4863
/* Implicit DISALGNEXCPT in parallel. */
4817
4866
else if (aop == 0 && aopcde == 21)
4839
4888
s1 = algn (s1L, s1H, IREG (1) & 3);
4843
4892
((((s0 >> 0) & 0xff) + ((s1 >> 0) & 0xff)) << 0) |
4844
4893
((((s0 >> 8) & 0xff) + ((s1 >> 8) & 0xff)) << 16));
4846
4895
((((s0 >> 16) & 0xff) + ((s1 >> 16) & 0xff)) << 0) |
4847
4896
((((s0 >> 24) & 0xff) + ((s1 >> 24) & 0xff)) << 16));
4898
/* Implicit DISALGNEXCPT in parallel. */
4849
4901
else if (aop == 1 && aopcde == 21)
4871
4923
s1 = algn (s1L, s1H, IREG (1) & 3);
4875
4927
(((((s0 >> 0) & 0xff) - ((s1 >> 0) & 0xff)) << 0) & 0xffff) |
4876
4928
(((((s0 >> 8) & 0xff) - ((s1 >> 8) & 0xff)) << 16)));
4878
4930
(((((s0 >> 16) & 0xff) - ((s1 >> 16) & 0xff)) << 0) & 0xffff) |
4879
4931
(((((s0 >> 24) & 0xff) - ((s1 >> 24) & 0xff)) << 16)));
4933
/* Implicit DISALGNEXCPT in parallel. */
4881
4936
else if (aop == 1 && aopcde == 7)
4968
5023
else if (aop == 0 && aopcde == 24)
4970
5025
TRACE_INSN (cpu, "R%i = BYTEPACK (R%i, R%i);", dst0, src0, src1);
4972
5027
(((DREG (src0) >> 0) & 0xff) << 0) |
4973
5028
(((DREG (src0) >> 16) & 0xff) << 8) |
4974
5029
(((DREG (src1) >> 0) & 0xff) << 16) |
4975
5030
(((DREG (src1) >> 16) & 0xff) << 24));
5032
/* Implicit DISALGNEXCPT in parallel. */
4977
5035
else if (aop == 1 && aopcde == 24)
4996
5054
byteb = (comb_src >> (8 + 8 * order));
4997
5055
bytec = (comb_src >> (16 + 8 * order));
4998
5056
byted = (comb_src >> (24 + 8 * order));
4999
SET_DREG (dst0, bytea | ((bu32)byteb << 16));
5000
SET_DREG (dst1, bytec | ((bu32)byted << 16));
5057
STORE (DREG (dst0), bytea | ((bu32)byteb << 16));
5058
STORE (DREG (dst1), bytec | ((bu32)byted << 16));
5060
/* Implicit DISALGNEXCPT in parallel. */
5002
5063
else if (aopcde == 13)
5172
5236
TRACE_INSN (cpu, "A%i = LSHIFT A%i BY R%i.L;", HLs, HLs, src0);
5173
val = get_extended_acc (cpu, HLs);
5237
val = get_unextended_acc (cpu, HLs);
5176
5240
val = lshiftrt (cpu, val, -shft, 40);
5488
5555
SET_AREG (0, acc0);
5489
SET_DREG (dst0, REG_H_L (out1 << 16, out0));
5556
STORE (DREG (dst0), REG_H_L (out1 << 16, out0));
5491
5558
else if (sop == 0 && sopcde == 10)
5493
5560
bu32 v = DREG (src0);
5494
5561
bu32 x = DREG (src1);
5495
5562
bu32 mask = (1 << (v & 0x1f)) - 1;
5496
5564
TRACE_INSN (cpu, "R%i = EXTRACT (R%i, R%i.L) (Z);", dst0, src1, src0);
5497
5566
x >>= ((v >> 8) & 0x1f);
5498
SET_DREG (dst0, x & mask);
5499
setflags_logical (cpu, DREG (dst0));
5568
STORE (DREG (dst0), x);
5569
setflags_logical (cpu, x);
5501
5571
else if (sop == 1 && sopcde == 10)
5504
5574
bu32 x = DREG (src1);
5505
5575
bu32 sgn = (1 << (v & 0x1f)) >> 1;
5506
5576
bu32 mask = (1 << (v & 0x1f)) - 1;
5507
5578
TRACE_INSN (cpu, "R%i = EXTRACT (R%i, R%i.L) (X);", dst0, src1, src0);
5508
5580
x >>= ((v >> 8) & 0x1f);
5513
setflags_logical (cpu, DREG (dst0));
5584
STORE (DREG (dst0), x);
5585
setflags_logical (cpu, x);
5515
5587
else if ((sop == 2 || sop == 3) && sopcde == 10)
5590
5663
int shift = (sop + 1) * 8;
5591
5664
TRACE_INSN (cpu, "R%i = ALIGN%i (R%i, R%i);", dst0, shift, src1, src0);
5592
SET_DREG (dst0, (DREG (src1) << (32 - shift)) | (DREG (src0) >> shift));
5665
STORE (DREG (dst0), (DREG (src1) << (32 - shift)) | (DREG (src0) >> shift));
5595
5668
illegal_instruction (cpu);
5628
5701
TRACE_INSN (cpu, "R%i.%c = R%i.%c >>> %i;",
5629
5702
dst0, (HLs & 2) ? 'H' : 'L',
5630
5703
src1, (HLs & 1) ? 'H' : 'L', newimmag);
5631
result = ashiftrt (cpu, in, newimmag, 16);
5705
result = lshift (cpu, in, 16 - (newimmag & 0xF), 16, 0);
5707
result = ashiftrt (cpu, in, newimmag, 16);
5633
5709
else if (sop == 1 && bit8 == 0)
5723
5799
acc <<= shiftup;
5805
acc <<= 32 - (shiftdn & 0x1f);
5727
5808
SET_AREG (HLs, acc);
5809
SET_ASTATREG (av[HLs], 0);
5728
5810
SET_ASTATREG (an, !!(acc & 0x8000000000ull));
5729
SET_ASTATREG (az, acc == 0);
5811
SET_ASTATREG (az, (acc & 0xFFFFFFFFFF) == 0);
5731
5813
else if (sop == 1 && sopcde == 1 && bit8 == 0)
5738
5820
TRACE_INSN (cpu, "R%i = R%i << %i (V,S);", dst0, src1, count);
5739
val0 = lshift (cpu, val0, count, 16, 1);
5741
val1 = lshift (cpu, val1, count, 16, 1);
5823
val0 = lshift (cpu, val0, count, 16, 1);
5825
val1 = lshift (cpu, val1, count, 16, 1);
5829
val0 = ashiftrt (cpu, val0, -count, 16);
5831
val1 = ashiftrt (cpu, val1, -count, 16);
5742
5833
SET_ASTAT (ASTAT | astat);
5744
5835
STORE (DREG (dst0), (val0 << 16) | val1);
5783
5874
TRACE_INSN (cpu, "R%i = R%i >>> %i %s;", dst0, src1, count,
5784
5875
sop == 0 ? "(V)" : "(V,S)");
5786
val0 = ashiftrt (cpu, val0, count, 16);
5788
val1 = ashiftrt (cpu, val1, count, 16);
5879
val0 = lshift (cpu, val0, 16 - (count & 0xF), 16, 0);
5881
val1 = lshift (cpu, val1, 16 - (count & 0xF), 16, 0);
5885
val0 = ashiftrt (cpu, val0, count, 16);
5887
val1 = ashiftrt (cpu, val1, count, 16);
5789
5890
SET_ASTAT (ASTAT | astat);
5791
5892
STORE (DREG (dst0), REG_H_L (val1 << 16, val0));