#include "all.h"

int arm64_rsave[] = {
	R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,
	R8,  R9,  R10, R11, R12, R13, R14, R15,
	IP0, IP1, R18, LR,
	V0,  V1,  V2,  V3,  V4,  V5,  V6,  V7,
	V16, V17, V18, V19, V20, V21, V22, V23,
	V24, V25, V26, V27, V28, V29, V30,
	-1
};
int arm64_rclob[] = {
	R19, R20, R21, R22, R23, R24, R25, R26,
	R27, R28,
	V8,  V9,  V10, V11, V12, V13, V14, V15,
	-1
};

#define RGLOB (BIT(FP) | BIT(SP) | BIT(IP1) | BIT(R18))

static int
arm64_memargs(int op)
{
	(void)op;
	return 0;
}

#define ARM64_COMMON \
	.gpr0 = R0, \
	.ngpr = NGPR, \
	.fpr0 = V0, \
	.nfpr = NFPR, \
	.rglob = RGLOB, \
	.nrglob = 4, \
	.rsave = arm64_rsave, \
	.nrsave = {NGPS, NFPS}, \
	.retregs = arm64_retregs, \
	.argregs = arm64_argregs, \
	.memargs = arm64_memargs, \
	.isel = arm64_isel, \
	.abi1 = arm64_abi, \
	.emitfn = arm64_emitfn, \
	.cansel = 0, \

Target T_arm64 = {
	.name = "arm64",
	.abi0 = elimsb,
	.emitfin = elf_emitfin,
	.asloc = ".L",
	ARM64_COMMON
};

Target T_arm64_apple = {
	.name = "arm64_apple",
	.apple = 1,
	.abi0 = apple_extsb,
	.emitfin = macho_emitfin,
	.asloc = "L",
	.assym = "_",
	ARM64_COMMON
};

MAKESURE(globals_are_not_arguments,
	(RGLOB & (BIT(R8+1) - 1)) == 0
);
MAKESURE(arrays_size_ok,
	sizeof arm64_rsave == (NGPS+NFPS+1) * sizeof(int) &&
	sizeof arm64_rclob == (NCLR+1) * sizeof(int)
);
