Rev 8859 | Rev 9873 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8859 | Rev 9847 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2018-2021, Anton Krotov |
4 | Copyright (c) 2018-2022, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 664... | Line 664... | ||
664 | OutIntByte(offs) |
664 | OutIntByte(offs) |
665 | END |
665 | END |
666 | END _movrm; |
666 | END _movrm; |
Line 667... | Line 667... | ||
667 | 667 | ||
668 | 668 | ||
669 | PROCEDURE movmr (reg1, offs, reg2: INTEGER); (* mov dword[reg1+offs], reg2_8 *) |
669 | PROCEDURE movmr (reg1, offs, reg2: INTEGER); (* mov dword[reg1+offs], reg2 *) |
670 | BEGIN |
670 | BEGIN |
Line 728... | Line 728... | ||
728 | 728 | ||
729 | PROCEDURE translate (pic: BOOLEAN; stroffs: INTEGER); |
729 | PROCEDURE translate (pic: BOOLEAN; stroffs: INTEGER); |
730 | VAR |
730 | VAR |
Line 731... | Line 731... | ||
731 | cmd, next: COMMAND; |
731 | cmd, next: COMMAND; |
Line 732... | Line 732... | ||
732 | 732 | ||
Line 733... | Line 733... | ||
733 | reg1, reg2, fr: INTEGER; |
733 | reg1, reg2, reg3, fr: INTEGER; |
Line 773... | Line 773... | ||
773 | UnOp(reg1); |
773 | UnOp(reg1); |
774 | OutByte2(0FFH, 0D0H + reg1); (* call reg1 *) |
774 | OutByte2(0FFH, 0D0H + reg1); (* call reg1 *) |
775 | drop; |
775 | drop; |
776 | ASSERT(R.top = -1) |
776 | ASSERT(R.top = -1) |
Line -... | Line 777... | ||
- | 777 | ||
- | 778 | |IL.opFASTCALL: |
|
- | 779 | IF param2 = 1 THEN |
|
- | 780 | pop(ecx) |
|
- | 781 | ELSIF param2 = 2 THEN |
|
- | 782 | pop(ecx); |
|
- | 783 | pop(edx) |
|
- | 784 | END |
|
777 | 785 | ||
778 | |IL.opPRECALL: |
786 | |IL.opPRECALL: |
779 | PushAll(0); |
787 | PushAll(0); |
780 | IF (param2 # 0) & (fr >= 0) THEN |
788 | IF (param2 # 0) & (fr >= 0) THEN |
781 | subrc(esp, 8) |
789 | subrc(esp, 8) |
Line 830... | Line 838... | ||
830 | |IL.opENTER: |
838 | |IL.opENTER: |
831 | ASSERT(R.top = -1); |
839 | ASSERT(R.top = -1); |
Line 832... | Line 840... | ||
832 | 840 | ||
Line -... | Line 841... | ||
- | 841 | SetLabel(param1); |
|
- | 842 | ||
- | 843 | IF cmd.param3 > 0 THEN |
|
- | 844 | pop(eax); |
|
- | 845 | IF cmd.param3 >= 2 THEN |
|
- | 846 | push(edx) |
|
- | 847 | END; |
|
- | 848 | push(ecx); |
|
- | 849 | push(eax) |
|
833 | SetLabel(param1); |
850 | END; |
834 | 851 | ||
Line 835... | Line 852... | ||
835 | push(ebp); |
852 | push(ebp); |
836 | mov(ebp, esp); |
853 | mov(ebp, esp); |
Line 1706... | Line 1723... | ||
1706 | OutByte2(07DH, 002H); (* jge L *) |
1723 | OutByte2(07DH, 002H); (* jge L *) |
1707 | neg(reg1) (* neg reg1 |
1724 | neg(reg1) (* neg reg1 |
1708 | L: *) |
1725 | L: *) |
Line 1709... | Line 1726... | ||
1709 | 1726 | ||
- | 1727 | |IL.opCOPY: |
|
- | 1728 | IF (0 < param2) & (param2 <= 64) THEN |
|
- | 1729 | BinOp(reg1, reg2); |
|
- | 1730 | reg3 := GetAnyReg(); |
|
- | 1731 | FOR n := 0 TO param2 - param2 MOD 4 - 1 BY 4 DO |
|
- | 1732 | movrm(reg3, reg1, n); |
|
- | 1733 | movmr(reg2, n, reg3) |
|
- | 1734 | END; |
|
- | 1735 | n := param2 - param2 MOD 4; |
|
- | 1736 | IF param2 MOD 4 >= 2 THEN |
|
- | 1737 | movrm16(reg3, reg1, n); |
|
- | 1738 | movmr16(reg2, n, reg3); |
|
- | 1739 | INC(n, 2); |
|
- | 1740 | DEC(param2, 2) |
|
- | 1741 | END; |
|
- | 1742 | IF param2 MOD 4 = 1 THEN |
|
- | 1743 | movrm8(reg3, reg1, n); |
|
- | 1744 | movmr8(reg2, n, reg3); |
|
- | 1745 | END; |
|
- | 1746 | drop; |
|
- | 1747 | drop; |
|
- | 1748 | drop |
|
1710 | |IL.opCOPY: |
1749 | ELSE |
1711 | PushAll(2); |
1750 | PushAll(2); |
1712 | pushc(param2); |
1751 | pushc(param2); |
- | 1752 | CallRTL(pic, IL._move) |
|
Line 1713... | Line 1753... | ||
1713 | CallRTL(pic, IL._move) |
1753 | END |
1714 | 1754 | ||
1715 | |IL.opMOVE: |
1755 | |IL.opMOVE: |