From 7b2da98caf3c389c4bd29df887050414597aeb7f Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Mon, 19 Jun 2017 03:54:47 +0200 Subject: WIP on mcode for win64. --- src/ortho/mcode/ortho_code-x86-abi.adb | 28 ++++++++++++---------- src/ortho/mcode/ortho_code-x86-flags_linux.ads | 3 +++ src/ortho/mcode/ortho_code-x86-flags_linux64.ads | 3 +++ src/ortho/mcode/ortho_code-x86-flags_macosx.ads | 3 +++ src/ortho/mcode/ortho_code-x86-flags_macosx64.ads | 3 +++ src/ortho/mcode/ortho_code-x86-flags_windows.ads | 3 +++ src/ortho/mcode/ortho_code-x86-flags_windows64.ads | 5 +++- 7 files changed, 35 insertions(+), 13 deletions(-) (limited to 'src/ortho') diff --git a/src/ortho/mcode/ortho_code-x86-abi.adb b/src/ortho/mcode/ortho_code-x86-abi.adb index b474f2bd6..8c746c18a 100644 --- a/src/ortho/mcode/ortho_code-x86-abi.adb +++ b/src/ortho/mcode/ortho_code-x86-abi.adb @@ -42,11 +42,15 @@ package body Ortho_Code.X86.Abi is Abi := (Offset => Subprg_Stack_Init, Inum => 0, Fnum => 0); end Start_Subprogram; - type Regs_List is array (Natural range <>) of O_Reg; + type Regs_List is array (Boolean range <>, Natural range <>) of O_Reg; Int_Regs : constant Regs_List := - (R_Di, R_Si, R_Dx, R_Cx, R_R8, R_R9); + (False => (R_Di, R_Si, R_Dx, R_Cx, R_R8, R_R9), + True => (R_Cx, R_Dx, R_R8, R_R9, R_None, R_None)); Sse_Regs : constant Regs_List := - (R_Xmm0, R_Xmm1, R_Xmm2, R_Xmm3, R_Xmm4, R_Xmm5, R_Xmm6, R_Xmm7); + (False => (R_Xmm0, R_Xmm1, R_Xmm2, R_Xmm3, + R_Xmm4, R_Xmm5, R_Xmm6, R_Xmm7), + True => (R_Xmm0, R_Xmm1, R_Xmm2, R_Xmm3, + R_None, R_None, R_None, R_None)); procedure New_Interface (Inter : O_Dnode; Abi : in out O_Abi_Subprg) is @@ -59,26 +63,26 @@ package body Ortho_Code.X86.Abi is if Flags.M64 then -- AMD64 ABI 3.2.3 Parameter passing -- The size of each argument gets rounded up to eight bytes. - Size := 0; case Get_Type_Mode (Itype) is when Mode_Int | Mode_Uns | Mode_B2 | Mode_P64 => - if Abi.Inum <= Int_Regs'Last then - Reg := Int_Regs (Abi.Inum); + if Abi.Inum <= Int_Regs'Last (2) then + Reg := Int_Regs (Flags.Win64, Abi.Inum); Abi.Inum := Abi.Inum + 1; - else - Size := 8; end if; when Mode_Fp => - if Abi.Fnum <= Sse_Regs'Last then - Reg := Sse_Regs (Abi.Fnum); + if Abi.Fnum <= Sse_Regs'Last (2) then + Reg := Sse_Regs (Flags.Win64, Abi.Fnum); Abi.Fnum := Abi.Fnum + 1; - else - Size := 8; end if; when others => -- Parameters are scalars. raise Program_Error; end case; + if Reg = R_None then + Size := 8; + else + Size := 0; + end if; else Size := Get_Type_Size (Itype); Size := (Size + 3) and not 3; diff --git a/src/ortho/mcode/ortho_code-x86-flags_linux.ads b/src/ortho/mcode/ortho_code-x86-flags_linux.ads index c60e0a7c1..490a7af21 100644 --- a/src/ortho/mcode/ortho_code-x86-flags_linux.ads +++ b/src/ortho/mcode/ortho_code-x86-flags_linux.ads @@ -31,4 +31,7 @@ package Ortho_Code.X86.Flags_Linux is -- 32 bits. M64 : constant Boolean := False; + + -- Not Windows x64 calling convention. + Win64 : constant Boolean := False; end Ortho_Code.X86.Flags_Linux; diff --git a/src/ortho/mcode/ortho_code-x86-flags_linux64.ads b/src/ortho/mcode/ortho_code-x86-flags_linux64.ads index 000e6e0cd..b832ee76e 100644 --- a/src/ortho/mcode/ortho_code-x86-flags_linux64.ads +++ b/src/ortho/mcode/ortho_code-x86-flags_linux64.ads @@ -31,4 +31,7 @@ package Ortho_Code.X86.Flags_Linux64 is -- 32 bits. M64 : constant Boolean := True; + + -- Not Windows x64 calling convention. + Win64 : constant Boolean := False; end Ortho_Code.X86.Flags_Linux64; diff --git a/src/ortho/mcode/ortho_code-x86-flags_macosx.ads b/src/ortho/mcode/ortho_code-x86-flags_macosx.ads index 8966e5340..b8bc5cef3 100644 --- a/src/ortho/mcode/ortho_code-x86-flags_macosx.ads +++ b/src/ortho/mcode/ortho_code-x86-flags_macosx.ads @@ -31,4 +31,7 @@ package Ortho_Code.X86.Flags_Macosx is -- 32 bits. M64 : constant Boolean := False; + + -- Not Windows x64 calling convention. + Win64 : constant Boolean := False; end Ortho_Code.X86.Flags_Macosx; diff --git a/src/ortho/mcode/ortho_code-x86-flags_macosx64.ads b/src/ortho/mcode/ortho_code-x86-flags_macosx64.ads index caf4e2a08..185c9cca0 100644 --- a/src/ortho/mcode/ortho_code-x86-flags_macosx64.ads +++ b/src/ortho/mcode/ortho_code-x86-flags_macosx64.ads @@ -31,4 +31,7 @@ package Ortho_Code.X86.Flags_Macosx64 is -- 64 bits. M64 : constant Boolean := True; + + -- Not Windows x64 calling convention. + Win64 : constant Boolean := False; end Ortho_Code.X86.Flags_Macosx64; diff --git a/src/ortho/mcode/ortho_code-x86-flags_windows.ads b/src/ortho/mcode/ortho_code-x86-flags_windows.ads index dfe6e678b..5398a747d 100644 --- a/src/ortho/mcode/ortho_code-x86-flags_windows.ads +++ b/src/ortho/mcode/ortho_code-x86-flags_windows.ads @@ -31,4 +31,7 @@ package Ortho_Code.X86.Flags_Windows is -- 32 bits. M64 : constant Boolean := False; + + -- Not Windows x64 calling convention. + Win64 : constant Boolean := False; end Ortho_Code.X86.Flags_Windows; diff --git a/src/ortho/mcode/ortho_code-x86-flags_windows64.ads b/src/ortho/mcode/ortho_code-x86-flags_windows64.ads index b2063e4d4..3ac655d28 100644 --- a/src/ortho/mcode/ortho_code-x86-flags_windows64.ads +++ b/src/ortho/mcode/ortho_code-x86-flags_windows64.ads @@ -29,6 +29,9 @@ package Ortho_Code.X86.Flags_Windows64 is -- Alignment for double (64 bit float). Mode_F64_Align : constant Natural := 3; - -- 32 bits. + -- 64 bits. M64 : constant Boolean := True; + + -- Windows x64 calling convention. + Win64 : constant Boolean := True; end Ortho_Code.X86.Flags_Windows64; -- cgit v1.2.3