| .. | .. |
|---|
| 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 */ |
|---|