x86_64: исключен x87; добавлен параметр -stk

This commit is contained in:
AntKrotov authored and GitHub committed 2019-01-02 01:47:24 +03:00
1 parent 56965c8928
commit 276ec79efe
5 files changed
+39 -52

No files matched your search

+14 -33
View File
@@ -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
View File
@@ -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);
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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;