diff options
Diffstat (limited to 'arm64/targ.c')
-rw-r--r-- | arm64/targ.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/arm64/targ.c b/arm64/targ.c new file mode 100644 index 0000000..ead6932 --- /dev/null +++ b/arm64/targ.c @@ -0,0 +1,51 @@ +#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, + 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(R18)) + +static int +arm64_memargs(int op) +{ + (void)op; + return 0; +} + +Target T_arm64 = { + .gpr0 = R0, + .ngpr = NGPR, + .fpr0 = V0, + .nfpr = NFPR, + .rglob = RGLOB, + .nrglob = 3, + .rsave = arm64_rsave, + .nrsave = {NGPS, NFPS}, + .retregs = arm64_retregs, + .argregs = arm64_argregs, + .memargs = arm64_memargs, + .abi = arm64_abi, + .isel = arm64_isel, + .emitfn = arm64_emitfn, +}; + +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) +); |