Subversion Repositories Kolibri OS

Rev

Rev 7597 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7597 Rev 7667
Line 306... Line 306...
306
BEGIN
306
BEGIN
307
    OutByte3(0FH, cond, 0C0H + reg)  // setcc reg
307
    OutByte3(0FH, cond, 0C0H + reg)  // setcc reg
308
END setcc;
308
END setcc;
Line -... Line 309...
-
 
309
 
-
 
310
 
-
 
311
PROCEDURE xor (reg1, reg2: INTEGER);
-
 
312
BEGIN
-
 
313
    OutByte2(31H, 0C0H + reg2 * 8 + reg1) // xor reg1, reg2
-
 
314
END xor;
309
 
315
 
310
 
316
 
311
PROCEDURE drop;
317
PROCEDURE drop;
312
BEGIN
318
BEGIN
Line 935... Line 941...
935
            IF a = 1 THEN
941
            IF a = 1 THEN
Line 936... Line 942...
936
 
942
 
937
            ELSIF a = -1 THEN
943
            ELSIF a = -1 THEN
938
                neg(reg1)
944
                neg(reg1)
939
            ELSIF a = 0 THEN
945
            ELSIF a = 0 THEN
940
                OutByte2(31H, 0C0H + reg1 * 9) // xor reg1, reg1
946
                xor(reg1, reg1)
941
            ELSE
947
            ELSE
942
                IF n > 0 THEN
948
                IF n > 0 THEN
943
                    IF a < 0 THEN
949
                    IF a < 0 THEN
944
                        neg(reg1)
950
                        neg(reg1)
Line 1078... Line 1084...
1078
 
1084
 
1079
            ELSE
1085
            ELSE
1080
                reg1 := REG.GetAnyReg(R);
1086
                reg1 := REG.GetAnyReg(R);
1081
                setcc(cc + 16, reg1);
1087
                setcc(cc + 16, reg1);
1082
                andrc(reg1, 1)
1088
                andrc(reg1, 1)
Line 1083... Line 1089...
1083
            END;
1089
            END
1084
 
1090
 
1085
        |CODE.opGT, CODE.opGE, CODE.opLT,
1091
        |CODE.opGT, CODE.opGE, CODE.opLT,
1086
         CODE.opLE, CODE.opEQ, CODE.opNE:
1092
         CODE.opLE, CODE.opEQ, CODE.opNE:
Line 1127... Line 1133...
1127
            ELSE
1133
            ELSE
1128
                setcc(setne, reg1)
1134
                setcc(setne, reg1)
1129
            END;
1135
            END;
1130
            andrc(reg1, 1)
1136
            andrc(reg1, 1)
Line -... Line 1137...
-
 
1137
            
-
 
1138
        |CODE.opACC:
-
 
1139
            IF (R.top # 0) OR (R.stk[0] # eax) THEN
-
 
1140
                PushAll(0);
-
 
1141
                GetRegA;
-
 
1142
                pop(eax);
-
 
1143
                DEC(R.pushed)
-
 
1144
            END
1131
 
1145
 
1132
        |CODE.opDROP:
1146
        |CODE.opDROP:
1133
            UnOp(reg1);
1147
            UnOp(reg1);
Line 1134... Line 1148...
1134
            drop
1148
            drop
Line 1342... Line 1356...
1342
            UnOp(reg1);
1356
            UnOp(reg1);
1343
            andrc(reg1, param2)
1357
            andrc(reg1, param2)
Line 1344... Line 1358...
1344
 
1358
 
1345
        |CODE.opDIVS:
1359
        |CODE.opDIVS:
1346
            BinOp(reg1, reg2);
1360
            BinOp(reg1, reg2);
1347
            OutByte2(31H, 0C0H + reg2 * 8 + reg1); // xor reg1, reg2
1361
            xor(reg1, reg2);
Line 1348... Line 1362...
1348
            drop
1362
            drop
1349
 
1363
 
1350
        |CODE.opDIVSC:
1364
        |CODE.opDIVSC:
Line 1476... Line 1490...
1476
        |CODE.opIN:
1490
        |CODE.opIN:
1477
            label := NewLabel();
1491
            label := NewLabel();
1478
            BinOp(reg1, reg2);
1492
            BinOp(reg1, reg2);
1479
            cmprc(reg1, 32);
1493
            cmprc(reg1, 32);
1480
            OutByte2(72H, 4); // jb L
1494
            OutByte2(72H, 4); // jb L
1481
            OutByte2(31H, 0C0H + reg1 * 9); // xor reg1, reg1
1495
            xor(reg1, reg1);
1482
            jmp(label);
1496
            jmp(label);
1483
            //L:
1497
            //L:
1484
            OutByte3(0FH, 0A3H, 0C0H + reg2 + 8 * reg1); // bt reg2, reg1
1498
            OutByte3(0FH, 0A3H, 0C0H + reg2 + 8 * reg1); // bt reg2, reg1
1485
            setcc(setc, reg1);
1499
            setcc(setc, reg1);
1486
            andrc(reg1, 1);
1500
            andrc(reg1, 1);
Line 1491... Line 1505...
1491
            label := NewLabel();
1505
            label := NewLabel();
1492
            UnOp(reg1);
1506
            UnOp(reg1);
1493
            reg2 := REG.GetAnyReg(R);
1507
            reg2 := REG.GetAnyReg(R);
1494
            cmprc(reg1, 32);
1508
            cmprc(reg1, 32);
1495
            OutByte2(72H, 4); // jb L
1509
            OutByte2(72H, 4); // jb L
1496
            OutByte2(31H, 0C0H + reg1 * 9); // xor reg1, reg1
1510
            xor(reg1, reg1);
1497
            jmp(label);
1511
            jmp(label);
1498
            //L:
1512
            //L:
1499
            movrc(reg2, param2);
1513
            movrc(reg2, param2);
1500
            OutByte3(0FH, 0A3H, 0C0H + reg2 + 8 * reg1); // bt reg2, reg1
1514
            OutByte3(0FH, 0A3H, 0C0H + reg2 + 8 * reg1); // bt reg2, reg1
1501
            setcc(setc, reg1);
1515
            setcc(setc, reg1);
Line 1629... Line 1643...
1629
                n := -1
1643
                n := -1
1630
            END;
1644
            END;
Line 1631... Line 1645...
1631
 
1645
 
1632
            IF ABS(a) = 1 THEN
1646
            IF ABS(a) = 1 THEN
1633
                UnOp(reg1);
1647
                UnOp(reg1);
1634
                OutByte2(31H, 0C0H + reg1 * 9) // xor reg1, reg1
1648
                xor(reg1, reg1)
1635
            ELSE
1649
            ELSE
1636
                IF n > 0 THEN
1650
                IF n > 0 THEN
1637
                    UnOp(reg1);
1651
                    UnOp(reg1);