mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
x86_64: исключен x87; добавлен параметр -stk
This commit is contained in:
1 parent
56965c8928
commit
276ec79efe
5 files changed
+39
-52
No files matched your search
+14
-33
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018, Anton Krotov
|
||||
Copyright (c) 2018, 2019 Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -517,7 +517,7 @@ BEGIN
|
||||
ASSERT(xmm = -1);
|
||||
PushAll(0)
|
||||
|
||||
|CODE.opALIGN16:
|
||||
|CODE.opALIGN16:
|
||||
reg1 := REG.GetAnyReg(R);
|
||||
Write("mov "); Write(regs[reg1]); WriteLn(",rsp");
|
||||
WriteLn("and rsp,-16");
|
||||
@@ -572,7 +572,7 @@ BEGIN
|
||||
END;
|
||||
|
||||
n := param2;
|
||||
IF n > 4 THEN
|
||||
IF n > 4 THEN
|
||||
WriteLn("mov r10, rcx");
|
||||
Write("mov rcx,"); WriteHexLn(n);
|
||||
WriteLn("@@: push 0");
|
||||
@@ -1980,36 +1980,17 @@ BEGIN
|
||||
Write("movsd "); xmmr(xmm); WriteLn(",qword[NUMBERS+32]")
|
||||
|
||||
|CODE.opPACKC:
|
||||
UnOp(reg1);
|
||||
PushAll(1);
|
||||
pushc(param2);
|
||||
WriteLn("fild qword[rsp]");
|
||||
Write("fld qword["); Write(regs[reg1]); WriteLn("]");
|
||||
WriteLn("fscale");
|
||||
Write("fstp qword["); Write(regs[reg1]); WriteLn("]");
|
||||
WriteLn("fistp qword[rsp]");
|
||||
pop(reg1);
|
||||
drop
|
||||
CallRTL(pic, CODE._pack)
|
||||
|
||||
|CODE.opPACK:
|
||||
BinOp(reg1, reg2);
|
||||
push(reg2);
|
||||
WriteLn("fild qword[rsp]");
|
||||
Write("fld qword["); Write(regs[reg1]); WriteLn("]");
|
||||
WriteLn("fscale");
|
||||
Write("fstp qword["); Write(regs[reg1]); WriteLn("]");
|
||||
WriteLn("fistp qword[rsp]");
|
||||
pop(reg2);
|
||||
drop;
|
||||
drop
|
||||
PushAll(2);
|
||||
CallRTL(pic, CODE._pack)
|
||||
|
||||
|CODE.opUNPK:
|
||||
BinOp(reg1, reg2);
|
||||
Write("fld qword["); Write(regs[reg1]); WriteLn("]");
|
||||
WriteLn("fxtract");
|
||||
Write("fstp qword["); Write(regs[reg1]); WriteLn("]");
|
||||
Write("fistp dword["); Write(regs[reg2]); WriteLn("]");
|
||||
drop;
|
||||
drop
|
||||
PushAll(2);
|
||||
CallRTL(pic, CODE._unpk)
|
||||
|
||||
END;
|
||||
|
||||
@@ -2022,18 +2003,18 @@ BEGIN
|
||||
END translate;
|
||||
|
||||
|
||||
PROCEDURE prolog (code: CODE.CODES; pic: BOOLEAN; target: INTEGER);
|
||||
PROCEDURE prolog (code: CODE.CODES; pic: BOOLEAN; target, stack_size: INTEGER);
|
||||
BEGIN
|
||||
IF target = mConst.Target_iConsole64 THEN
|
||||
WriteLn("format PE64 console");
|
||||
WriteLn("stack 1024*1024*2");
|
||||
Write("stack 1024*1024*"); WriteHexLn(stack_size);
|
||||
WriteLn("entry start");
|
||||
WriteLn("section '.text' code readable executable");
|
||||
WriteLn("start:");
|
||||
|
||||
ELSIF target = mConst.Target_iGUI64 THEN
|
||||
WriteLn("format PE64 GUI 5.0");
|
||||
WriteLn("stack 1024*1024*2");
|
||||
Write("stack 1024*1024*"); WriteHexLn(stack_size);
|
||||
WriteLn("entry start");
|
||||
WriteLn("section '.text' code readable executable");
|
||||
WriteLn("start:");
|
||||
@@ -2234,7 +2215,7 @@ BEGIN
|
||||
END;
|
||||
|
||||
WriteLn("section '.bss' data readable writeable");
|
||||
Write("GLOB: rb "); WriteHexLn(code.bss);
|
||||
Write("GLOB: rb "); WriteHexLn(MAX(code.bss, 8));
|
||||
|
||||
IF target = mConst.Target_iDLL64 THEN
|
||||
exp := code.export.first(CODE.EXPORT_PROC);
|
||||
@@ -2315,7 +2296,7 @@ BEGIN
|
||||
NewNumber(ROR(7FFH, 12)); (* +Infinity *)
|
||||
|
||||
pic := FALSE;
|
||||
prolog(code, pic, target);
|
||||
prolog(code, pic, target, stack);
|
||||
translate(code.commands, pic, CHL.Length(code.types) * 8);
|
||||
epilog(code, modname, pic, target);
|
||||
WR.Close(file)
|
||||
|
||||
+6
-4
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018, Anton Krotov
|
||||
Copyright (c) 2018, 2019 Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -118,6 +118,8 @@ CONST
|
||||
_strcmp2 *= 29;
|
||||
_strcmpw *= 30;
|
||||
_strcmpw2 *= 31;
|
||||
_pack *= 32;
|
||||
_unpk *= 33;
|
||||
|
||||
|
||||
TYPE
|
||||
@@ -186,7 +188,7 @@ TYPE
|
||||
dmin*: INTEGER;
|
||||
lcount*: INTEGER;
|
||||
bss*: INTEGER;
|
||||
rtl*: ARRAY 32 OF INTEGER;
|
||||
rtl*: ARRAY 34 OF INTEGER;
|
||||
|
||||
charoffs: ARRAY 256 OF INTEGER;
|
||||
wcharoffs: ARRAY 65536 OF INTEGER;
|
||||
@@ -627,7 +629,7 @@ PROCEDURE Enter* (label, params: INTEGER): COMMAND;
|
||||
VAR
|
||||
cmd: COMMAND3;
|
||||
|
||||
BEGIN
|
||||
BEGIN
|
||||
NEW(cmd);
|
||||
cmd.opcode := opENTER;
|
||||
cmd.param1 := label;
|
||||
@@ -656,7 +658,7 @@ END Leave;
|
||||
|
||||
PROCEDURE Call* (proc: INTEGER; call64: BOOLEAN; rparam: INTEGER; fparams: SET);
|
||||
BEGIN
|
||||
IF call64 THEN
|
||||
IF call64 THEN
|
||||
ASSERT(rparam <= 4);
|
||||
ASSERT(ORD(fparams) <= 15);
|
||||
AddJmpCmd(opCALL64, proc);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018, Anton Krotov
|
||||
Copyright (c) 2018, 2019 Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -162,7 +162,7 @@ VAR
|
||||
bits64: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
StackSize := 1;
|
||||
StackSize := 2;
|
||||
Version := 65536;
|
||||
pic := FALSE;
|
||||
reloc := FALSE;
|
||||
|
||||
+5
-3
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018, Anton Krotov
|
||||
Copyright (c) 2018, 2019 Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -698,7 +698,7 @@ BEGIN
|
||||
Size.Reloc := Size.Reloc + R.Size;
|
||||
R := R.next(RELOC)
|
||||
END;
|
||||
|
||||
|
||||
IF reloc THEN
|
||||
SectionHeaders[relsec].Name := ".reloc";
|
||||
SectionHeaders[relsec].VirtualSize := Size.Reloc;
|
||||
@@ -738,6 +738,8 @@ BEGIN
|
||||
DEC(PEHeader.OptionalHeader.SizeOfInitializedData, SectionHeaders[0].SizeOfRawData);
|
||||
DEC(PEHeader.OptionalHeader.SizeOfInitializedData, SectionHeaders[2].SizeOfRawData);
|
||||
|
||||
PEHeader.OptionalHeader.SizeOfUninitializedData := align(SectionHeaders[2].VirtualSize, FileAlignment);
|
||||
|
||||
FOR i := 0 TO ORD(PEHeader.FileHeader.NumberOfSections) - 1 DO
|
||||
INC(PEHeader.OptionalHeader.SizeOfImage, align(SectionHeaders[i].VirtualSize, SectionAlignment))
|
||||
END;
|
||||
@@ -846,7 +848,7 @@ BEGIN
|
||||
R := R.next(RELOC)
|
||||
END;
|
||||
|
||||
WR.Padding(File, FileAlignment)
|
||||
WR.Padding(File, FileAlignment)
|
||||
END;
|
||||
|
||||
WR.Close(File)
|
||||
|
||||
+12
-10
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018, Anton Krotov
|
||||
Copyright (c) 2018, 2019 Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -1700,10 +1700,10 @@ VAR
|
||||
procType := NIL;
|
||||
IF e1.obj IN {ePROC, eIMP} THEN
|
||||
procType := e1.ident.type
|
||||
ELSIF isExpr(e1) THEN
|
||||
ELSIF isExpr(e1) THEN
|
||||
procType := e1.type
|
||||
END;
|
||||
|
||||
END;
|
||||
|
||||
IF procType # NIL THEN
|
||||
cconv := procType.call;
|
||||
params := procType.params.size;
|
||||
@@ -1717,7 +1717,7 @@ VAR
|
||||
END;
|
||||
CODE.setlast(endcall.prev(CODE.COMMAND));
|
||||
fparams := procType.params.getfparams(procType, 3);
|
||||
|
||||
|
||||
IF e1.obj IN {ePROC, eIMP} THEN
|
||||
|
||||
IF e1.obj = eIMP THEN
|
||||
@@ -1730,7 +1730,7 @@ VAR
|
||||
deref(pos, e1, FALSE, errPROC);
|
||||
CODE.CallP(call64, MIN(params, 4), fparams)
|
||||
END;
|
||||
|
||||
|
||||
IF cconv IN {PROG.call64, PROG.win64(*, PROG.cdecl16*)} THEN
|
||||
CODE.AddCmd(CODE.opCLEANUP16, params)
|
||||
ELSIF cconv = PROG.cdecl THEN
|
||||
@@ -2428,7 +2428,7 @@ VAR
|
||||
params: INTEGER;
|
||||
fparams: SET;
|
||||
cconv: INTEGER;
|
||||
call64: BOOLEAN;
|
||||
call64: BOOLEAN;
|
||||
procType: PROG.TYPE_;
|
||||
|
||||
BEGIN
|
||||
@@ -2471,7 +2471,7 @@ BEGIN
|
||||
ELSIF isExpr(e) THEN
|
||||
procType := e.type
|
||||
END;
|
||||
|
||||
|
||||
IF procType # NIL THEN
|
||||
cconv := procType.call;
|
||||
params := procType.params.size;
|
||||
@@ -2484,8 +2484,8 @@ BEGIN
|
||||
CODE.AddCmd2(CODE.opALIGN16, params, 0)*)
|
||||
END;
|
||||
CODE.setlast(endcall.prev(CODE.COMMAND));
|
||||
fparams := procType.params.getfparams(procType, 3);
|
||||
|
||||
fparams := procType.params.getfparams(procType, 3);
|
||||
|
||||
IF e.obj IN {ePROC, eIMP} THEN
|
||||
|
||||
IF e.obj = eIMP THEN
|
||||
@@ -3190,6 +3190,8 @@ BEGIN
|
||||
getproc(rtl, "_strcmp2", CODE._strcmp2);
|
||||
getproc(rtl, "_strcmpw", CODE._strcmpw);
|
||||
getproc(rtl, "_strcmpw2", CODE._strcmpw2);
|
||||
getproc(rtl, "_pack", CODE._pack);
|
||||
getproc(rtl, "_unpk", CODE._unpk);
|
||||
|
||||
END setrtl;
|
||||
|
||||
|
||||
Reference in new issue
Block a user