Skip to content

Commit bc70c7b

Browse files
committed
Merge branch 'feature/aarch-asm'
2 parents 9c5be8b + 5ec6086 commit bc70c7b

18 files changed

+1510
-73
lines changed

include/elf.h

+8
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,14 @@ typedef struct {
147147
#define R_X86_64_PC32 (2) /* PC relative 32 bit signed */
148148
#define R_X86_64_PLT32 (4) /* 32 bit PLT address */
149149

150+
#define R_AARCH64_ABS64 257
151+
#define R_AARCH64_ADR_PREL_PG_HI21 275
152+
#define R_AARCH64_ADR_PREL_PG_HI21_NC 276
153+
#define R_AARCH64_ADD_ABS_LO12_NC 277
154+
#define R_AARCH64_CALL26 283
155+
#define R_AARCH64_ADR_GOT_PAGE 311
156+
#define R_AARCH64_LD64_GOT_LO12_NC 312
157+
150158
#define R_RISCV_64 (2)
151159
#define R_RISCV_BRANCH (16)
152160
#define R_RISCV_JAL (17)

include/math.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ int isinf(double x);
5151
int signbit(double x);
5252
double copysign(double x, double f);
5353

54-
#if defined(__APPLE__) || defined(__GNUC__) || defined(__riscv)
54+
#if defined(__APPLE__) || defined(__GNUC__) || defined(__aarch64__) || defined(__riscv)
5555
// isfinite, isinf and isnan is defined by macro and not included in lib file,
5656
// so it will be link error.
5757
#include <stdint.h>

libsrc/crt0/_start.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#pragma GCC diagnostic ignored "-Wunused-function"
55
#endif
66

7-
char **environ;
7+
extern char **environ;
88

99
#if defined(__linux__)
1010

libsrc/misc/longjmp.c

+11-11
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,23 @@ void longjmp(jmp_buf env, int result) {
4141
#define RESTORE_FREGS // Empty
4242
#else
4343
#define RESTORE_FREGS \
44-
"ldp d8, d9, [x0, 112]\n" \
45-
"ldp d10, d11, [x0, 128]\n" \
46-
"ldp d12, d13, [x0, 144]\n" \
47-
"ldp d14, d15, [x0, 160]\n"
44+
"ldp d8, d9, [x0, #112]\n" \
45+
"ldp d10, d11, [x0, #128]\n" \
46+
"ldp d12, d13, [x0, #144]\n" \
47+
"ldp d14, d15, [x0, #160]\n"
4848
#endif
4949
__asm("ldp fp, lr, [x0]\n"
50-
"ldp x9, x19, [x0, 16]\n"
51-
"ldp x20, x21, [x0, 32]\n"
52-
"ldp x22, x23, [x0, 48]\n"
53-
"ldp x24, x25, [x0, 64]\n"
54-
"ldp x26, x27, [x0, 80]\n"
55-
"ldp x28, x29, [x0, 96]\n"
50+
"ldp x9, x19, [x0, #16]\n"
51+
"ldp x20, x21, [x0, #32]\n"
52+
"ldp x22, x23, [x0, #48]\n"
53+
"ldp x24, x25, [x0, #64]\n"
54+
"ldp x26, x27, [x0, #80]\n"
55+
"ldp x28, x29, [x0, #96]\n"
5656
RESTORE_FREGS
5757
"mov sp, x9\n"
5858
"mov w0, w1\n" // Result value.
5959
"cmp w0, wzr\n"
60-
"b.ne .longjmp_0\n"
60+
"bne .longjmp_0\n"
6161
"mov w0, #1\n"
6262
".longjmp_0:");
6363
}

libsrc/misc/setjmp.c

+10-10
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,19 @@ int setjmp(jmp_buf env) {
3737
#define SAVE_FREGS // Empty
3838
#else
3939
#define SAVE_FREGS \
40-
"stp d8, d9, [x0, 112]\n" \
41-
"stp d10, d11, [x0, 128]\n" \
42-
"stp d12, d13, [x0, 144]\n" \
43-
"stp d14, d15, [x0, 160]\n"
40+
"stp d8, d9, [x0, #112]\n" \
41+
"stp d10, d11, [x0, #128]\n" \
42+
"stp d12, d13, [x0, #144]\n" \
43+
"stp d14, d15, [x0, #160]\n"
4444
#endif
4545
__asm("stp fp, lr, [x0]\n"
4646
"mov x9, sp\n"
47-
"stp x9, x19, [x0, 16]\n"
48-
"stp x20, x21, [x0, 32]\n"
49-
"stp x22, x23, [x0, 48]\n"
50-
"stp x24, x25, [x0, 64]\n"
51-
"stp x26, x27, [x0, 80]\n"
52-
"stp x28, x29, [x0, 96]\n"
47+
"stp x9, x19, [x0, #16]\n"
48+
"stp x20, x21, [x0, #32]\n"
49+
"stp x22, x23, [x0, #48]\n"
50+
"stp x24, x25, [x0, #64]\n"
51+
"stp x26, x27, [x0, #80]\n"
52+
"stp x28, x29, [x0, #96]\n"
5353
SAVE_FREGS
5454
"mov w0, wzr");
5555
}

libsrc/stdlib/environ.c

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
char **environ;

libsrc/stdlib/getenv.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "stdlib.h"
22
#include "string.h"
33

4-
char **environ;
4+
extern char **environ;
55

66
char *getenv(const char *varname) {
77
if (environ != NULL) {

src/as/arch/aarch64/aarch64_code.h

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#pragma once
2+
3+
#define IMM(imm, t, b) (((imm) >> (b)) & ((1 << (t - b + 1)) - 1))
4+
5+
#define W_MOVK(sz, rd, imm, sft) MAKE_CODE32(inst, code, 0x72800000U | ((sz) << 31) | ((sft) << 21) | (((imm) & ((1U << 16) - 1)) << 5) | (rd))
6+
#define W_MOVZ(sz, rd, imm, sft) MAKE_CODE32(inst, code, 0x52800000U | ((sz) << 31) | ((sft) << 21) | (((imm) & ((1U << 16) - 1)) << 5) | (rd))
7+
#define W_MOVN(sz, rd, imm, sft) MAKE_CODE32(inst, code, 0x12800000U | ((sz) << 31) | ((sft) << 21) | (((imm) & ((1U << 16) - 1)) << 5) | (rd))
8+
9+
#define W_ADD_I(sz, rd, rn, imm) MAKE_CODE32(inst, code, 0x11000000U | ((sz) << 31) | (((imm) & ((1U << 12) - 1)) << 10) | ((rn) << 5) | (rd))
10+
#define W_ADD_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x0b000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd))
11+
#define W_ADD_E(sz, rd, rn, rm, option, ov) MAKE_CODE32(inst, code, 0x4b200000U | ((sz) << 31) | ((rm) << 16) | ((option) << 13) | ((ov) << 10) | ((rn) << 5) | (rd))
12+
#define W_ADDS_I(sz, rd, rn, imm) MAKE_CODE32(inst, code, 0x31000000U | ((sz) << 31) | (((imm) & ((1U << 12) - 1)) << 10) | ((rn) << 5) | (rd))
13+
#define W_ADDS_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x2b000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd))
14+
#define W_SUB_I(sz, rd, rn, imm) MAKE_CODE32(inst, code, 0x51000000U | ((sz) << 31) | (((imm) & ((1U << 12) - 1)) << 10) | ((rn) << 5) | (rd))
15+
#define W_SUB_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x4b000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd))
16+
#define W_SUBS_I(sz, rd, rn, imm) MAKE_CODE32(inst, code, 0x71000000U | ((sz) << 31) | (((imm) & ((1U << 12) - 1)) << 10) | ((rn) << 5) | (rd))
17+
#define W_SUBS_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x6b000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd))
18+
#define W_SUB_E(sz, rd, rn, rm, option, ov) MAKE_CODE32(inst, code, 0x4b200000U | ((sz) << 31) | ((rm) << 16) | ((option) << 13) | ((ov) << 10) | ((rn) << 5) | (rd))
19+
#define W_MADD(sz, rd, rn, rm, ra) MAKE_CODE32(inst, code, 0x1b000000U | ((sz) << 31) | ((rm) << 16) | ((ra) << 10) | ((rn) << 5) | (rd))
20+
#define W_MSUB(sz, rd, rn, rm, ra) MAKE_CODE32(inst, code, 0x1b008000U | ((sz) << 31) | ((rm) << 16) | ((ra) << 10) | ((rn) << 5) | (rd))
21+
#define W_SDIV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac00c00U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd))
22+
#define W_UDIV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac00800U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd))
23+
#define W_AND_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x0a000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd))
24+
#define W_ORR_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x2a000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd))
25+
#define W_EOR_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x4a000000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd))
26+
#define W_EON_S(sz, rd, rn, rm, imm) MAKE_CODE32(inst, code, 0x4a200000U | ((sz) << 31) | ((rm) << 16) | (((imm) & ((1U << 6) - 1)) << 10) | ((rn) << 5) | (rd))
27+
28+
#define W_LSLV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac02000U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd))
29+
#define W_LSRV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac02400U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd))
30+
#define W_ASRV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1ac02800U | ((sz) << 31) | ((rm) << 16) | ((rn) << 5) | (rd))
31+
32+
#define W_SBFM(sz, rd, sn, rn, immr, imms) MAKE_CODE32(inst, code, 0x13000000U | ((sz) << 31) | ((sn) << 22) | ((immr) << 16) | ((imms) << 10) | ((rn) << 5) | (rd))
33+
#define W_UBFM(sz, rd, sn, rn, immr, imms) MAKE_CODE32(inst, code, 0x53000000U | ((sz) << 31) | ((sn) << 22) | ((immr) << 16) | ((imms) << 10) | ((rn) << 5) | (rd))
34+
35+
#define W_LDUR(b, s, rt, ofs, base) MAKE_CODE32(inst, code, 0x38400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((base) << 5) | (rt))
36+
#define W_LDR_UIMM(b, s, rt, ofs, base) MAKE_CODE32(inst, code, 0x39400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 12) - 1))) << 10) | ((base) << 5) | (rt))
37+
#define W_LDR(b, s, rt, ofs, base, prepost) MAKE_CODE32(inst, code, 0x38400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((prepost) << 10) | ((base) << 5) | (rt))
38+
#define W_STUR(b, rt, ofs, base) MAKE_CODE32(inst, code, 0x38000000U | ((b) << 30) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((base) << 5) | (rt))
39+
#define W_STR_UIMM(b, rt, ofs, base) MAKE_CODE32(inst, code, 0x39000000U | ((b) << 30) | ((((ofs) & ((1U << 12) - 1))) << 10) | ((base) << 5) | (rt))
40+
#define W_STR(b, rt, ofs, base, prepost) MAKE_CODE32(inst, code, 0x38000000U | ((b) << 30) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((prepost) << 10) | ((base) << 5) | (rt))
41+
#define W_LDP(sz, rs1, rs2, ofs, base, prepost) MAKE_CODE32(inst, code, 0x28400000U | ((sz) << 31) | ((prepost) << 23) | (((((ofs) >> 3) & ((1U << 7) - 1))) << 15) | ((rs2) << 10) | ((base) << 5) | (rs1))
42+
#define W_STP(sz, rs1, rs2, ofs, base, prepost) MAKE_CODE32(inst, code, 0x28000000U | ((sz) << 31) | ((prepost) << 23) | (((((ofs) >> 3) & ((1U << 7) - 1))) << 15) | ((rs2) << 10) | ((base) << 5) | (rs1))
43+
44+
#define W_LDR_R(sz, rt, base, rm, sz2, s, option) MAKE_CODE32(inst, code, 0xb8600800U | ((sz) << 30) | ((rm) << 16) | ((option) << 13) | ((s) << 12) | ((base) << 5) | (rt))
45+
#define W_LDRB_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x38400000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt))
46+
#define W_LDRSB_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x38c00000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt))
47+
#define W_LDRH_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x78400000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt))
48+
#define W_LDRSH_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x78c00000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt))
49+
#define W_STR_R(sz, rt, base, rm, option) MAKE_CODE32(inst, code, 0xb8200800U | ((sz) << 30) | ((rm) << 16) | ((option) << 13) | ((base) << 5) | (rt))
50+
#define W_STRB_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x38000000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt))
51+
#define W_STRH_R(rt, base, rm, option) MAKE_CODE32(inst, code, 0x78000000U | ((((ofs) & ((1U << 9) - 1))) << 12) | ((option) << 10) | ((base) << 5) | (rt))
52+
53+
#define W_ADRP(rd, imm) MAKE_CODE32(inst, code, 0x90000000U | (IMM(imm, 31, 30) << 29) | (IMM(imm, 29, 12) << 5) | (rd))
54+
55+
#define W_CSINC(sz, rd, rn, rm, cond) MAKE_CODE32(inst, code, 0x1a800400U | ((sz) << 31) | ((rm) << 16) | ((cond) << 12) | ((rn) << 5) | (rd))
56+
57+
#define W_B() MAKE_CODE32(inst, code, 0x14000000U)
58+
#define W_BR(rn) MAKE_CODE32(inst, code, 0xd61f0000U | ((rn) << 5))
59+
#define W_BCC(cond) MAKE_CODE32(inst, code, 0x54000000U | (cond))
60+
61+
#define W_BL(offset) MAKE_CODE32(inst, code, 0x94000000U | ((offset) & ((1U << 26) - 1)))
62+
#define W_BLR(rn) MAKE_CODE32(inst, code, 0xd63f0000U | ((rn) << 5))
63+
#define W_RET(rn) MAKE_CODE32(inst, code, 0xd65f0000U | ((rn) << 5))
64+
#define W_SVC(imm) MAKE_CODE32(inst, code, 0xd4000001U | ((imm) << 5))
65+
66+
#define P_MOV(sz, rd, rs) W_ORR_S(sz, rd, ZERO, rs, 0)
67+
#define P_MOV_SP(sz, rd, rs) W_ADD_I(sz, rd, rs, 0)
68+
#define P_MUL(sz, rd, rn, rm) W_MADD(sz, rd, rn, rm, ZERO)
69+
#define P_CMP(sz, rm, rn) W_SUBS_S(sz, ZERO, rm, rn, 0)
70+
#define P_CMP_I(sz, rd, imm) W_SUBS_I(sz, ZERO, rd, imm)
71+
#define P_CMN(sz, rn, rm) W_ADDS_S(sz, ZERO, rn, rm, 0)
72+
#define P_CMN_I(sz, rd, imm) W_ADDS_I(sz, ZERO, rd, imm)
73+
#define P_LSL_I(sz, rd, rn, imm) W_UBFM(sz, opr1->reg.no, sz, opr2->reg.no, -(imm) & (63>>(1-(sz))), (63>>(1-(sz))) - (imm))
74+
#define P_LSR_I(sz, rd, rn, imm) W_UBFM(sz, opr1->reg.no, sz, opr2->reg.no, imm, 63>>(1-(sz)))
75+
#define P_ASR_I(sz, rd, rn, imm) W_SBFM(sz, opr1->reg.no, sz, opr2->reg.no, imm, 63>>(1-(sz)))
76+
#define P_CSET(sz, rd, cond) W_CSINC(sz, rd, ZERO, ZERO, (cond) ^ 1)
77+
78+
// FP instructions.
79+
80+
#define F_LDUR(b, s, rt, ofs, base) MAKE_CODE32(inst, code, 0xbc400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((base) << 5) | (rt))
81+
#define F_LDR_UIMM(b, s, rt, ofs, base) MAKE_CODE32(inst, code, 0xbd400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 12) - 1))) << 10) | ((base) << 5) | (rt))
82+
#define F_LDR(b, s, rt, ofs, base, prepost) MAKE_CODE32(inst, code, 0xbc400000U | ((b) << 30) | ((s) << 23) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((prepost) << 10) | ((base) << 5) | (rt))
83+
#define F_STUR(b, rt, ofs, base) MAKE_CODE32(inst, code, 0xbc000000U | ((b) << 30) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((base) << 5) | (rt))
84+
#define F_STR_UIMM(b, rt, ofs, base) MAKE_CODE32(inst, code, 0xbd000000U | ((b) << 30) | ((((ofs) & ((1U << 12) - 1))) << 10) | ((base) << 5) | (rt))
85+
#define F_STR(b, rt, ofs, base, prepost) MAKE_CODE32(inst, code, 0xbc000000U | ((b) << 30) | ((((ofs) & ((1U << 9) - 1))) << 12) | ((prepost) << 10) | ((base) << 5) | (rt))
86+
#define F_LDP(b, rt, ru, base, ofs, prepost) MAKE_CODE32(inst, code, 0x2c400000U | ((b) << 30) | ((prepost) << 23) | ((((ofs) & ((1U << 10) - (1 << 3)))) << (15 - 3)) | ((ru) << 10) | ((base) << 5) | (rt))
87+
#define F_STP(b, rt, ru, base, ofs, prepost) MAKE_CODE32(inst, code, 0x2c000000U | ((b) << 30) | ((prepost) << 23) | ((((ofs) & ((1U << 10) - (1 << 3)))) << (15 - 3)) | ((ru) << 10) | ((base) << 5) | (rt))
88+
89+
#define FMOV(sz, rd, rn) MAKE_CODE32(inst, code, 0x1e204000U | ((sz) << 22) | ((rn) << 5) | (rd))
90+
#define FADD(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1e202800U | ((sz) << 22) | ((rm) << 16) | ((rn) << 5) | (rd))
91+
#define FSUB(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1e203800U | ((sz) << 22) | ((rm) << 16) | ((rn) << 5) | (rd))
92+
#define FMUL(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1e200800U | ((sz) << 22) | ((rm) << 16) | ((rn) << 5) | (rd))
93+
#define FDIV(sz, rd, rn, rm) MAKE_CODE32(inst, code, 0x1e201800U | ((sz) << 22) | ((rm) << 16) | ((rn) << 5) | (rd))
94+
#define FCMP(sz, rd, rn) MAKE_CODE32(inst, code, 0x1e602000U | ((sz) << 22) | ((rn) << 16) | ((rd) << 5))
95+
#define FNEG(sz, rd, rn) MAKE_CODE32(inst, code, 0x1e214000U | ((sz) << 22) | ((rn) << 5) | (rd))
96+
#define FSQRT(sz, rd, rn) MAKE_CODE32(inst, code, 0x1e21c000U | ((sz) << 22) | ((rn) << 5) | (rd))
97+
98+
#define SCVTF(dsz, rt, ssz, rn) MAKE_CODE32(inst, code, 0x1e220000 | ((dsz) << 31) | ((ssz) << 22) | ((rn) << 5) | (rt))
99+
#define UCVTF(dsz, rt, ssz, rn) MAKE_CODE32(inst, code, 0x1e230000 | ((dsz) << 31) | ((ssz) << 22) | ((rn) << 5) | (rt))
100+
#define FCVT(dsz, rt, rn) MAKE_CODE32(inst, code, 0x1e224000 | ((1 - (dsz)) << 22) | ((dsz) << 15) | ((rn) << 5) | (rt))
101+
#define FCVTZS(dsz, rt, ssz, rn) MAKE_CODE32(inst, code, 0x1e380000 | ((dsz) << 31) | ((ssz) << 22) | ((rn) << 5) | (rt))
102+
#define FCVTZU(dsz, rt, ssz, rn) MAKE_CODE32(inst, code, 0x1e390000 | ((dsz) << 31) | ((ssz) << 22) | ((rn) << 5) | (rt))

0 commit comments

Comments
 (0)