mirror of
git://c9x.me/qbe.git
synced 2026-04-05 09:59: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.
68 lines
1.3 KiB
C
68 lines
1.3 KiB
C
#include "all.h"
|
|
|
|
Amd64Op amd64_op[NOp] = {
|
|
#define O(op, t, x) [O##op] =
|
|
#define X(nm, zf, lf) { nm, zf, lf, },
|
|
#include "../ops.h"
|
|
};
|
|
|
|
static int
|
|
amd64_memargs(int op)
|
|
{
|
|
return amd64_op[op].nmem;
|
|
}
|
|
|
|
#define AMD64_COMMON \
|
|
.gpr0 = RAX, \
|
|
.ngpr = NGPR, \
|
|
.fpr0 = XMM0, \
|
|
.nfpr = NFPR, \
|
|
.rglob = BIT(RBP) | BIT(RSP), \
|
|
.nrglob = 2, \
|
|
.memargs = amd64_memargs, \
|
|
.abi0 = elimsb, \
|
|
.isel = amd64_isel, \
|
|
.cansel = 1,
|
|
|
|
Target T_amd64_sysv = {
|
|
.name = "amd64_sysv",
|
|
.emitfin = elf_emitfin,
|
|
.asloc = ".L",
|
|
.abi1 = amd64_sysv_abi,
|
|
.rsave = amd64_sysv_rsave,
|
|
.nrsave = {NGPS_SYSV, NFPS},
|
|
.retregs = amd64_sysv_retregs,
|
|
.argregs = amd64_sysv_argregs,
|
|
.emitfn = amd64_sysv_emitfn,
|
|
AMD64_COMMON
|
|
};
|
|
|
|
Target T_amd64_apple = {
|
|
.name = "amd64_apple",
|
|
.apple = 1,
|
|
.emitfin = macho_emitfin,
|
|
.asloc = "L",
|
|
.assym = "_",
|
|
.abi1 = amd64_sysv_abi,
|
|
.rsave = amd64_sysv_rsave,
|
|
.nrsave = {NGPS_SYSV, NFPS},
|
|
.retregs = amd64_sysv_retregs,
|
|
.argregs = amd64_sysv_argregs,
|
|
.emitfn = amd64_sysv_emitfn,
|
|
AMD64_COMMON
|
|
};
|
|
|
|
Target T_amd64_win = {
|
|
.name = "amd64_win",
|
|
.windows = 1,
|
|
.emitfin = pe_emitfin,
|
|
.asloc = "L",
|
|
.abi1 = amd64_winabi_abi,
|
|
.rsave = amd64_winabi_rsave,
|
|
.nrsave = {NGPS_WIN, NFPS},
|
|
.retregs = amd64_winabi_retregs,
|
|
.argregs = amd64_winabi_argregs,
|
|
.emitfn = amd64_winabi_emitfn,
|
|
AMD64_COMMON
|
|
};
|