mirror of
git://c9x.me/qbe.git
synced 2026-04-05 18:09:47 +00:00
This is an implementation of the Windows ABI. It supports most features (struct passing/returning, varargs, env). TLS is not yet supported. This patch does not actually port QBE to Windows, it only allows QBE to generate correct asm to target Windows. As a result, testing is accomplished on a Linux host, by using a cross-compiling toolchain, and running the resulting binaries by using wine. See: TARGET=amd64_win tools/test.sh all A few cross-platform tests were changed from 'long' to 'long long' in driver code because long in C does not match the size of a QBE 'l' on Windows.
83 lines
1.4 KiB
C
83 lines
1.4 KiB
C
#include "../all.h"
|
|
|
|
typedef struct Amd64Op Amd64Op;
|
|
|
|
enum Amd64Reg {
|
|
RAX = RXX+1, /* caller-save */
|
|
RCX, /* caller-save */
|
|
RDX, /* caller-save */
|
|
RSI, /* caller-save on sysv, callee-save on win */
|
|
RDI, /* caller-save on sysv, callee-save on win */
|
|
R8, /* caller-save */
|
|
R9, /* caller-save */
|
|
R10, /* caller-save */
|
|
R11, /* caller-save */
|
|
|
|
RBX, /* callee-save */
|
|
R12,
|
|
R13,
|
|
R14,
|
|
R15,
|
|
|
|
RBP, /* globally live */
|
|
RSP,
|
|
|
|
XMM0, /* sse */
|
|
XMM1,
|
|
XMM2,
|
|
XMM3,
|
|
XMM4,
|
|
XMM5,
|
|
XMM6,
|
|
XMM7,
|
|
XMM8,
|
|
XMM9,
|
|
XMM10,
|
|
XMM11,
|
|
XMM12,
|
|
XMM13,
|
|
XMM14,
|
|
XMM15,
|
|
|
|
NFPR = XMM14 - XMM0 + 1, /* reserve XMM15 */
|
|
NGPR = RSP - RAX + 1,
|
|
NFPS = NFPR,
|
|
|
|
NGPS_SYSV = R11 - RAX + 1,
|
|
NCLR_SYSV = R15 - RBX + 1,
|
|
|
|
NGPS_WIN = R11 - RAX + 1 - 2, /* -2 for RDI/RDI */
|
|
NCLR_WIN = R15 - RBX + 1 + 2, /* +2 for RDI/RDI */
|
|
};
|
|
MAKESURE(reg_not_tmp, XMM15 < (int)Tmp0);
|
|
|
|
struct Amd64Op {
|
|
char nmem;
|
|
char zflag;
|
|
char lflag;
|
|
};
|
|
|
|
/* targ.c */
|
|
extern Amd64Op amd64_op[];
|
|
|
|
/* sysv.c (abi) */
|
|
extern int amd64_sysv_rsave[];
|
|
extern int amd64_sysv_rclob[];
|
|
bits amd64_sysv_retregs(Ref, int[2]);
|
|
bits amd64_sysv_argregs(Ref, int[2]);
|
|
void amd64_sysv_abi(Fn *);
|
|
|
|
/* winabi.c */
|
|
extern int amd64_winabi_rsave[];
|
|
extern int amd64_winabi_rclob[];
|
|
bits amd64_winabi_retregs(Ref, int[2]);
|
|
bits amd64_winabi_argregs(Ref, int[2]);
|
|
void amd64_winabi_abi(Fn *);
|
|
|
|
/* isel.c */
|
|
void amd64_isel(Fn *);
|
|
|
|
/* emit.c */
|
|
void amd64_sysv_emitfn(Fn *, FILE *);
|
|
void amd64_winabi_emitfn(Fn *, FILE *);
|