.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
1 | 2 | /* |
---|
2 | 3 | * BPF JIT compiler for ARM64 |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2014-2016 Zi Shen Lim <zlim.lnx@gmail.com> |
---|
5 | | - * |
---|
6 | | - * This program is free software; you can redistribute it and/or modify |
---|
7 | | - * it under the terms of the GNU General Public License version 2 as |
---|
8 | | - * published by the Free Software Foundation. |
---|
9 | | - * |
---|
10 | | - * This program is distributed in the hope that it will be useful, |
---|
11 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
12 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
13 | | - * GNU General Public License for more details. |
---|
14 | | - * |
---|
15 | | - * You should have received a copy of the GNU General Public License |
---|
16 | | - * along with this program. If not, see <http://www.gnu.org/licenses/>. |
---|
17 | 6 | */ |
---|
18 | 7 | #ifndef _BPF_JIT_H |
---|
19 | 8 | #define _BPF_JIT_H |
---|
.. | .. |
---|
111 | 100 | /* Rd = Rn OP imm12 */ |
---|
112 | 101 | #define A64_ADD_I(sf, Rd, Rn, imm12) A64_ADDSUB_IMM(sf, Rd, Rn, imm12, ADD) |
---|
113 | 102 | #define A64_SUB_I(sf, Rd, Rn, imm12) A64_ADDSUB_IMM(sf, Rd, Rn, imm12, SUB) |
---|
| 103 | +#define A64_ADDS_I(sf, Rd, Rn, imm12) \ |
---|
| 104 | + A64_ADDSUB_IMM(sf, Rd, Rn, imm12, ADD_SETFLAGS) |
---|
| 105 | +#define A64_SUBS_I(sf, Rd, Rn, imm12) \ |
---|
| 106 | + A64_ADDSUB_IMM(sf, Rd, Rn, imm12, SUB_SETFLAGS) |
---|
| 107 | +/* Rn + imm12; set condition flags */ |
---|
| 108 | +#define A64_CMN_I(sf, Rn, imm12) A64_ADDS_I(sf, A64_ZR, Rn, imm12) |
---|
| 109 | +/* Rn - imm12; set condition flags */ |
---|
| 110 | +#define A64_CMP_I(sf, Rn, imm12) A64_SUBS_I(sf, A64_ZR, Rn, imm12) |
---|
114 | 111 | /* Rd = Rn */ |
---|
115 | 112 | #define A64_MOV(sf, Rd, Rn) A64_ADD_I(sf, Rd, Rn, 0) |
---|
116 | 113 | |
---|
.. | .. |
---|
182 | 179 | /* Rd = Ra + Rn * Rm */ |
---|
183 | 180 | #define A64_MADD(sf, Rd, Ra, Rn, Rm) aarch64_insn_gen_data3(Rd, Ra, Rn, Rm, \ |
---|
184 | 181 | A64_VARIANT(sf), AARCH64_INSN_DATA3_MADD) |
---|
| 182 | +/* Rd = Ra - Rn * Rm */ |
---|
| 183 | +#define A64_MSUB(sf, Rd, Ra, Rn, Rm) aarch64_insn_gen_data3(Rd, Ra, Rn, Rm, \ |
---|
| 184 | + A64_VARIANT(sf), AARCH64_INSN_DATA3_MSUB) |
---|
185 | 185 | /* Rd = Rn * Rm */ |
---|
186 | 186 | #define A64_MUL(sf, Rd, Rn, Rm) A64_MADD(sf, Rd, A64_ZR, Rn, Rm) |
---|
187 | 187 | |
---|
.. | .. |
---|
197 | 197 | /* Rn & Rm; set condition flags */ |
---|
198 | 198 | #define A64_TST(sf, Rn, Rm) A64_ANDS(sf, A64_ZR, Rn, Rm) |
---|
199 | 199 | |
---|
| 200 | +/* Logical (immediate) */ |
---|
| 201 | +#define A64_LOGIC_IMM(sf, Rd, Rn, imm, type) ({ \ |
---|
| 202 | + u64 imm64 = (sf) ? (u64)imm : (u64)(u32)imm; \ |
---|
| 203 | + aarch64_insn_gen_logical_immediate(AARCH64_INSN_LOGIC_##type, \ |
---|
| 204 | + A64_VARIANT(sf), Rn, Rd, imm64); \ |
---|
| 205 | +}) |
---|
| 206 | +/* Rd = Rn OP imm */ |
---|
| 207 | +#define A64_AND_I(sf, Rd, Rn, imm) A64_LOGIC_IMM(sf, Rd, Rn, imm, AND) |
---|
| 208 | +#define A64_ORR_I(sf, Rd, Rn, imm) A64_LOGIC_IMM(sf, Rd, Rn, imm, ORR) |
---|
| 209 | +#define A64_EOR_I(sf, Rd, Rn, imm) A64_LOGIC_IMM(sf, Rd, Rn, imm, EOR) |
---|
| 210 | +#define A64_ANDS_I(sf, Rd, Rn, imm) A64_LOGIC_IMM(sf, Rd, Rn, imm, AND_SETFLAGS) |
---|
| 211 | +/* Rn & imm; set condition flags */ |
---|
| 212 | +#define A64_TST_I(sf, Rn, imm) A64_ANDS_I(sf, A64_ZR, Rn, imm) |
---|
| 213 | + |
---|
| 214 | +/* HINTs */ |
---|
| 215 | +#define A64_HINT(x) aarch64_insn_gen_hint(x) |
---|
| 216 | + |
---|
| 217 | +/* BTI */ |
---|
| 218 | +#define A64_BTI_C A64_HINT(AARCH64_INSN_HINT_BTIC) |
---|
| 219 | +#define A64_BTI_J A64_HINT(AARCH64_INSN_HINT_BTIJ) |
---|
| 220 | +#define A64_BTI_JC A64_HINT(AARCH64_INSN_HINT_BTIJC) |
---|
| 221 | + |
---|
200 | 222 | #endif /* _BPF_JIT_H */ |
---|