Rev 6613 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6613 | Rev 7107 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | Copyright 2016 Anton Krotov |
2 | Copyright 2016, 2017 Anton Krotov |
Line 3... | Line 3... | ||
3 | 3 | ||
Line 4... | Line 4... | ||
4 | This file is part of Compiler. |
4 | This file is part of Compiler. |
5 | 5 | ||
Line 50... | Line 50... | ||
50 | IDMOD = 1; IDCONST = 2; IDTYPE = 3; IDVAR = 4; IDPROC = 5; IDSTPROC = 6; IDGUARD = 7; IDPARAM = 8; IDSYSPROC = 9; |
50 | IDMOD = 1; IDCONST = 2; IDTYPE = 3; IDVAR = 4; IDPROC = 5; IDSTPROC = 6; IDGUARD = 7; IDPARAM = 8; IDSYSPROC = 9; |
Line 51... | Line 51... | ||
51 | 51 | ||
52 | stABS = 1; stODD = 2; stLEN = 3; stLSL = 4; stASR = 5; stROR = 6; stFLOOR = 7; stFLT = 8; |
52 | stABS = 1; stODD = 2; stLEN = 3; stLSL = 4; stASR = 5; stROR = 6; stFLOOR = 7; stFLT = 8; |
53 | stORD = 9; stCHR = 10; stLONG = 11; stSHORT = 12; stINC = 13; stDEC = 14; stINCL = 15; |
53 | stORD = 9; stCHR = 10; stLONG = 11; stSHORT = 12; stINC = 13; stDEC = 14; stINCL = 15; |
54 | stEXCL = 16; stCOPY = 17; stNEW = 18; stASSERT = 19; stPACK = 20; stUNPK = 21; stDISPOSE = 22; |
54 | stEXCL = 16; stCOPY = 17; stNEW = 18; stASSERT = 19; stPACK = 20; stUNPK = 21; stDISPOSE = 22; |
Line 55... | Line 55... | ||
55 | stBITS = 23; stLSR = 24; stLENGTH = 25; |
55 | stBITS = 23; stLSR = 24; stLENGTH = 25; stMIN = 26; stMAX = 27; |
56 | 56 | ||
Line 57... | Line 57... | ||
57 | sysADR = 101; sysSIZE = 102; sysINF = 103; sysGET = 104; sysPUT = 105; |
57 | sysADR = 101; sysSIZE = 102; sysINF = 103; sysGET = 104; sysPUT = 105; |
Line 58... | Line 58... | ||
58 | sysCODE = 106; sysTYPEID = 107; sysMOVE = 108; |
58 | sysCODE = 106; sysTYPEID = 107; sysMOVE = 108; sysCOPY = 109; |
59 | 59 | ||
Line 392... | Line 392... | ||
392 | NextCoord(coord); |
392 | NextCoord(coord); |
393 | pExpr(b); |
393 | pExpr(b); |
394 | IntType(b.T, coord); |
394 | IntType(b.T, coord); |
395 | IF b.eType = eCONST THEN |
395 | IF b.eType = eCONST THEN |
396 | Assert(ASR(FLOOR(b.Value), 5) = 0, coord, 53); |
396 | Assert(ASR(FLOOR(b.Value), 5) = 0, coord, 53); |
- | 397 | IF a.eType = eCONST THEN |
|
397 | Assert(a.Value <= b.Value, coord, 54) |
398 | Assert(a.Value <= b.Value, coord, 54) |
- | 399 | END |
|
398 | END; |
400 | END; |
399 | Load(b) |
401 | Load(b) |
400 | ELSE |
402 | ELSE |
401 | X86.Dup |
403 | X86.Dup |
402 | END; |
404 | END; |
Line 613... | Line 615... | ||
613 | e.eType := eCONST |
615 | e.eType := eCONST |
614 | END; |
616 | END; |
615 | Str(e1); |
617 | Str(e1); |
616 | e.T := inttype; |
618 | e.T := inttype; |
617 | X86.StFunc(X86.stLENGTH) |
619 | X86.StFunc(X86.stLENGTH) |
- | 620 | |stMIN, stMAX: |
|
- | 621 | pExpr(e1); |
|
- | 622 | IntType(e1.T, coord); |
|
- | 623 | Load(e1); |
|
- | 624 | Check(lxComma); |
|
- | 625 | NextCoord(coord); |
|
- | 626 | pExpr(e2); |
|
- | 627 | IntType(e2.T, coord); |
|
- | 628 | Load(e2); |
|
- | 629 | IF (e1.eType = eCONST) & (e2.eType = eCONST) THEN |
|
- | 630 | a := FLOOR(e1.Value); |
|
- | 631 | b := FLOOR(e2.Value); |
|
- | 632 | CASE func OF |
|
- | 633 | |stMIN: a := MIN(a, b) |
|
- | 634 | |stMAX: a := MAX(a, b) |
|
- | 635 | ELSE |
|
- | 636 | END; |
|
- | 637 | e.Value := LONG(FLT(a)); |
|
- | 638 | e.eType := eCONST |
|
- | 639 | END; |
|
- | 640 | IF func = stMIN THEN |
|
- | 641 | X86.StFunc(X86.stMIN) |
|
- | 642 | ELSE |
|
- | 643 | X86.StFunc(X86.stMAX) |
|
- | 644 | END; |
|
- | 645 | e.T := inttype |
|
618 | |sysADR: |
646 | |sysADR: |
619 | Assert((SCAN.tLex = lxIDENT) OR (SCAN.tLex = lxSTRING) OR (SCAN.tLex = lxCHX), coord, 43); |
647 | Assert((SCAN.tLex = lxIDENT) OR (SCAN.tLex = lxSTRING) OR (SCAN.tLex = lxCHX), coord, 43); |
620 | IF SCAN.tLex = lxIDENT THEN |
648 | IF SCAN.tLex = lxIDENT THEN |
621 | Designator(e1); |
649 | Designator(e1); |
622 | Assert((e1.eType = eVAR) OR (e1.eType = ePROC) OR (e1.T = strtype), coord, 43); |
650 | Assert((e1.eType = eVAR) OR (e1.eType = ePROC) OR (e1.T = strtype), coord, 43); |
Line 1634... | Line 1662... | ||
1634 | X86.EndCall; |
1662 | X86.EndCall; |
1635 | NextCoord(coord); |
1663 | NextCoord(coord); |
1636 | Expr(e1); |
1664 | Expr(e1); |
1637 | IntType(e1.T, coord); |
1665 | IntType(e1.T, coord); |
1638 | Load(e1); |
1666 | Load(e1); |
- | 1667 | |sysCOPY: |
|
- | 1668 | begcall := X86.current; |
|
- | 1669 | Designator(e1); |
|
- | 1670 | Assert(e1.eType = eVAR, coord, 63); |
|
- | 1671 | Check(lxComma); |
|
- | 1672 | X86.PushCall(begcall); |
|
- | 1673 | X86.Param; |
|
- | 1674 | NextCoord(coord); |
|
- | 1675 | Designator(e1); |
|
- | 1676 | Assert(e1.eType = eVAR, coord, 63); |
|
- | 1677 | Assert(~e1.Read, coord, 115); |
|
- | 1678 | Check(lxComma); |
|
- | 1679 | X86.EndCall; |
|
- | 1680 | NextCoord(coord); |
|
- | 1681 | Expr(e1); |
|
- | 1682 | IntType(e1.T, coord); |
|
- | 1683 | Load(e1); |
|
1639 | ELSE |
1684 | ELSE |
1640 | Assert(FALSE, coord2, 132) |
1685 | Assert(FALSE, coord2, 132) |
1641 | END; |
1686 | END; |
1642 | Check(lxRRound); |
1687 | Check(lxRRound); |
1643 | Next; |
1688 | Next; |
1644 | IF proc = sysMOVE THEN |
1689 | IF (proc = sysMOVE) OR (proc = sysCOPY) THEN |
1645 | X86.StProc(X86.sysMOVE) |
1690 | X86.StProc(X86.sysMOVE) |
1646 | END |
1691 | END |
1647 | END StProc; |
1692 | END StProc; |
Line 1648... | Line 1693... | ||
1648 | 1693 | ||
Line 1676... | Line 1721... | ||
1676 | ELSIF (e2.T.tType = TSTRING) & (e1.T.tType = TARRAY) THEN |
1721 | ELSIF (e2.T.tType = TSTRING) & (e1.T.tType = TARRAY) THEN |
1677 | s := DECL.GetString(e2.Value); |
1722 | s := DECL.GetString(e2.Value); |
1678 | IF s.Len = 1 THEN |
1723 | IF s.Len = 1 THEN |
1679 | X86.Mono(s.Number) |
1724 | X86.Mono(s.Number) |
1680 | END; |
1725 | END; |
1681 | X86.PushConst(UTILS.min(s.Len + 1, e1.T.Len)) |
1726 | X86.PushConst(MIN(s.Len + 1, e1.T.Len)) |
1682 | END; |
1727 | END; |
1683 | X86.Save(e1.T.tType) |
1728 | X86.Save(e1.T.tType) |
1684 | ELSIF e1.eType = ePROC THEN |
1729 | ELSIF e1.eType = ePROC THEN |
1685 | Assert((e1.id.T.Base.tType = TVOID) OR (e1.id.T.Call = DECL.winapi), coord, 132); |
1730 | Assert((e1.id.T.Base.tType = TVOID) OR (e1.id.T.Call = DECL.winapi), coord, 132); |
1686 | IF e1.id.ParamCount > 0 THEN |
1731 | IF e1.id.ParamCount > 0 THEN |