162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2013 Huawei Ltd.
462306a36Sopenharmony_ci * Author: Jiang Liu <liuj97@gmail.com>
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2014 Zi Shen Lim <zlim.lnx@gmail.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef	__ASM_INSN_H
962306a36Sopenharmony_ci#define	__ASM_INSN_H
1062306a36Sopenharmony_ci#include <linux/build_bug.h>
1162306a36Sopenharmony_ci#include <linux/types.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <asm/insn-def.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifndef __ASSEMBLY__
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cienum aarch64_insn_hint_cr_op {
1862306a36Sopenharmony_ci	AARCH64_INSN_HINT_NOP	= 0x0 << 5,
1962306a36Sopenharmony_ci	AARCH64_INSN_HINT_YIELD	= 0x1 << 5,
2062306a36Sopenharmony_ci	AARCH64_INSN_HINT_WFE	= 0x2 << 5,
2162306a36Sopenharmony_ci	AARCH64_INSN_HINT_WFI	= 0x3 << 5,
2262306a36Sopenharmony_ci	AARCH64_INSN_HINT_SEV	= 0x4 << 5,
2362306a36Sopenharmony_ci	AARCH64_INSN_HINT_SEVL	= 0x5 << 5,
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	AARCH64_INSN_HINT_XPACLRI    = 0x07 << 5,
2662306a36Sopenharmony_ci	AARCH64_INSN_HINT_PACIA_1716 = 0x08 << 5,
2762306a36Sopenharmony_ci	AARCH64_INSN_HINT_PACIB_1716 = 0x0A << 5,
2862306a36Sopenharmony_ci	AARCH64_INSN_HINT_AUTIA_1716 = 0x0C << 5,
2962306a36Sopenharmony_ci	AARCH64_INSN_HINT_AUTIB_1716 = 0x0E << 5,
3062306a36Sopenharmony_ci	AARCH64_INSN_HINT_PACIAZ     = 0x18 << 5,
3162306a36Sopenharmony_ci	AARCH64_INSN_HINT_PACIASP    = 0x19 << 5,
3262306a36Sopenharmony_ci	AARCH64_INSN_HINT_PACIBZ     = 0x1A << 5,
3362306a36Sopenharmony_ci	AARCH64_INSN_HINT_PACIBSP    = 0x1B << 5,
3462306a36Sopenharmony_ci	AARCH64_INSN_HINT_AUTIAZ     = 0x1C << 5,
3562306a36Sopenharmony_ci	AARCH64_INSN_HINT_AUTIASP    = 0x1D << 5,
3662306a36Sopenharmony_ci	AARCH64_INSN_HINT_AUTIBZ     = 0x1E << 5,
3762306a36Sopenharmony_ci	AARCH64_INSN_HINT_AUTIBSP    = 0x1F << 5,
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	AARCH64_INSN_HINT_ESB  = 0x10 << 5,
4062306a36Sopenharmony_ci	AARCH64_INSN_HINT_PSB  = 0x11 << 5,
4162306a36Sopenharmony_ci	AARCH64_INSN_HINT_TSB  = 0x12 << 5,
4262306a36Sopenharmony_ci	AARCH64_INSN_HINT_CSDB = 0x14 << 5,
4362306a36Sopenharmony_ci	AARCH64_INSN_HINT_CLEARBHB = 0x16 << 5,
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	AARCH64_INSN_HINT_BTI   = 0x20 << 5,
4662306a36Sopenharmony_ci	AARCH64_INSN_HINT_BTIC  = 0x22 << 5,
4762306a36Sopenharmony_ci	AARCH64_INSN_HINT_BTIJ  = 0x24 << 5,
4862306a36Sopenharmony_ci	AARCH64_INSN_HINT_BTIJC = 0x26 << 5,
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cienum aarch64_insn_imm_type {
5262306a36Sopenharmony_ci	AARCH64_INSN_IMM_ADR,
5362306a36Sopenharmony_ci	AARCH64_INSN_IMM_26,
5462306a36Sopenharmony_ci	AARCH64_INSN_IMM_19,
5562306a36Sopenharmony_ci	AARCH64_INSN_IMM_16,
5662306a36Sopenharmony_ci	AARCH64_INSN_IMM_14,
5762306a36Sopenharmony_ci	AARCH64_INSN_IMM_12,
5862306a36Sopenharmony_ci	AARCH64_INSN_IMM_9,
5962306a36Sopenharmony_ci	AARCH64_INSN_IMM_7,
6062306a36Sopenharmony_ci	AARCH64_INSN_IMM_6,
6162306a36Sopenharmony_ci	AARCH64_INSN_IMM_S,
6262306a36Sopenharmony_ci	AARCH64_INSN_IMM_R,
6362306a36Sopenharmony_ci	AARCH64_INSN_IMM_N,
6462306a36Sopenharmony_ci	AARCH64_INSN_IMM_MAX
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cienum aarch64_insn_register_type {
6862306a36Sopenharmony_ci	AARCH64_INSN_REGTYPE_RT,
6962306a36Sopenharmony_ci	AARCH64_INSN_REGTYPE_RN,
7062306a36Sopenharmony_ci	AARCH64_INSN_REGTYPE_RT2,
7162306a36Sopenharmony_ci	AARCH64_INSN_REGTYPE_RM,
7262306a36Sopenharmony_ci	AARCH64_INSN_REGTYPE_RD,
7362306a36Sopenharmony_ci	AARCH64_INSN_REGTYPE_RA,
7462306a36Sopenharmony_ci	AARCH64_INSN_REGTYPE_RS,
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cienum aarch64_insn_register {
7862306a36Sopenharmony_ci	AARCH64_INSN_REG_0  = 0,
7962306a36Sopenharmony_ci	AARCH64_INSN_REG_1  = 1,
8062306a36Sopenharmony_ci	AARCH64_INSN_REG_2  = 2,
8162306a36Sopenharmony_ci	AARCH64_INSN_REG_3  = 3,
8262306a36Sopenharmony_ci	AARCH64_INSN_REG_4  = 4,
8362306a36Sopenharmony_ci	AARCH64_INSN_REG_5  = 5,
8462306a36Sopenharmony_ci	AARCH64_INSN_REG_6  = 6,
8562306a36Sopenharmony_ci	AARCH64_INSN_REG_7  = 7,
8662306a36Sopenharmony_ci	AARCH64_INSN_REG_8  = 8,
8762306a36Sopenharmony_ci	AARCH64_INSN_REG_9  = 9,
8862306a36Sopenharmony_ci	AARCH64_INSN_REG_10 = 10,
8962306a36Sopenharmony_ci	AARCH64_INSN_REG_11 = 11,
9062306a36Sopenharmony_ci	AARCH64_INSN_REG_12 = 12,
9162306a36Sopenharmony_ci	AARCH64_INSN_REG_13 = 13,
9262306a36Sopenharmony_ci	AARCH64_INSN_REG_14 = 14,
9362306a36Sopenharmony_ci	AARCH64_INSN_REG_15 = 15,
9462306a36Sopenharmony_ci	AARCH64_INSN_REG_16 = 16,
9562306a36Sopenharmony_ci	AARCH64_INSN_REG_17 = 17,
9662306a36Sopenharmony_ci	AARCH64_INSN_REG_18 = 18,
9762306a36Sopenharmony_ci	AARCH64_INSN_REG_19 = 19,
9862306a36Sopenharmony_ci	AARCH64_INSN_REG_20 = 20,
9962306a36Sopenharmony_ci	AARCH64_INSN_REG_21 = 21,
10062306a36Sopenharmony_ci	AARCH64_INSN_REG_22 = 22,
10162306a36Sopenharmony_ci	AARCH64_INSN_REG_23 = 23,
10262306a36Sopenharmony_ci	AARCH64_INSN_REG_24 = 24,
10362306a36Sopenharmony_ci	AARCH64_INSN_REG_25 = 25,
10462306a36Sopenharmony_ci	AARCH64_INSN_REG_26 = 26,
10562306a36Sopenharmony_ci	AARCH64_INSN_REG_27 = 27,
10662306a36Sopenharmony_ci	AARCH64_INSN_REG_28 = 28,
10762306a36Sopenharmony_ci	AARCH64_INSN_REG_29 = 29,
10862306a36Sopenharmony_ci	AARCH64_INSN_REG_FP = 29, /* Frame pointer */
10962306a36Sopenharmony_ci	AARCH64_INSN_REG_30 = 30,
11062306a36Sopenharmony_ci	AARCH64_INSN_REG_LR = 30, /* Link register */
11162306a36Sopenharmony_ci	AARCH64_INSN_REG_ZR = 31, /* Zero: as source register */
11262306a36Sopenharmony_ci	AARCH64_INSN_REG_SP = 31  /* Stack pointer: as load/store base reg */
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cienum aarch64_insn_special_register {
11662306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SPSR_EL1	= 0xC200,
11762306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_ELR_EL1	= 0xC201,
11862306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SP_EL0	= 0xC208,
11962306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SPSEL	= 0xC210,
12062306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_CURRENTEL	= 0xC212,
12162306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_DAIF	= 0xDA11,
12262306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_NZCV	= 0xDA10,
12362306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_FPCR	= 0xDA20,
12462306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_DSPSR_EL0	= 0xDA28,
12562306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_DLR_EL0	= 0xDA29,
12662306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SPSR_EL2	= 0xE200,
12762306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_ELR_EL2	= 0xE201,
12862306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SP_EL1	= 0xE208,
12962306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SPSR_INQ	= 0xE218,
13062306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SPSR_ABT	= 0xE219,
13162306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SPSR_UND	= 0xE21A,
13262306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SPSR_FIQ	= 0xE21B,
13362306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SPSR_EL3	= 0xF200,
13462306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_ELR_EL3	= 0xF201,
13562306a36Sopenharmony_ci	AARCH64_INSN_SPCLREG_SP_EL2	= 0xF210
13662306a36Sopenharmony_ci};
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_cienum aarch64_insn_variant {
13962306a36Sopenharmony_ci	AARCH64_INSN_VARIANT_32BIT,
14062306a36Sopenharmony_ci	AARCH64_INSN_VARIANT_64BIT
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cienum aarch64_insn_condition {
14462306a36Sopenharmony_ci	AARCH64_INSN_COND_EQ = 0x0, /* == */
14562306a36Sopenharmony_ci	AARCH64_INSN_COND_NE = 0x1, /* != */
14662306a36Sopenharmony_ci	AARCH64_INSN_COND_CS = 0x2, /* unsigned >= */
14762306a36Sopenharmony_ci	AARCH64_INSN_COND_CC = 0x3, /* unsigned < */
14862306a36Sopenharmony_ci	AARCH64_INSN_COND_MI = 0x4, /* < 0 */
14962306a36Sopenharmony_ci	AARCH64_INSN_COND_PL = 0x5, /* >= 0 */
15062306a36Sopenharmony_ci	AARCH64_INSN_COND_VS = 0x6, /* overflow */
15162306a36Sopenharmony_ci	AARCH64_INSN_COND_VC = 0x7, /* no overflow */
15262306a36Sopenharmony_ci	AARCH64_INSN_COND_HI = 0x8, /* unsigned > */
15362306a36Sopenharmony_ci	AARCH64_INSN_COND_LS = 0x9, /* unsigned <= */
15462306a36Sopenharmony_ci	AARCH64_INSN_COND_GE = 0xa, /* signed >= */
15562306a36Sopenharmony_ci	AARCH64_INSN_COND_LT = 0xb, /* signed < */
15662306a36Sopenharmony_ci	AARCH64_INSN_COND_GT = 0xc, /* signed > */
15762306a36Sopenharmony_ci	AARCH64_INSN_COND_LE = 0xd, /* signed <= */
15862306a36Sopenharmony_ci	AARCH64_INSN_COND_AL = 0xe, /* always */
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cienum aarch64_insn_branch_type {
16262306a36Sopenharmony_ci	AARCH64_INSN_BRANCH_NOLINK,
16362306a36Sopenharmony_ci	AARCH64_INSN_BRANCH_LINK,
16462306a36Sopenharmony_ci	AARCH64_INSN_BRANCH_RETURN,
16562306a36Sopenharmony_ci	AARCH64_INSN_BRANCH_COMP_ZERO,
16662306a36Sopenharmony_ci	AARCH64_INSN_BRANCH_COMP_NONZERO,
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cienum aarch64_insn_size_type {
17062306a36Sopenharmony_ci	AARCH64_INSN_SIZE_8,
17162306a36Sopenharmony_ci	AARCH64_INSN_SIZE_16,
17262306a36Sopenharmony_ci	AARCH64_INSN_SIZE_32,
17362306a36Sopenharmony_ci	AARCH64_INSN_SIZE_64,
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cienum aarch64_insn_ldst_type {
17762306a36Sopenharmony_ci	AARCH64_INSN_LDST_LOAD_REG_OFFSET,
17862306a36Sopenharmony_ci	AARCH64_INSN_LDST_STORE_REG_OFFSET,
17962306a36Sopenharmony_ci	AARCH64_INSN_LDST_LOAD_IMM_OFFSET,
18062306a36Sopenharmony_ci	AARCH64_INSN_LDST_STORE_IMM_OFFSET,
18162306a36Sopenharmony_ci	AARCH64_INSN_LDST_LOAD_PAIR_PRE_INDEX,
18262306a36Sopenharmony_ci	AARCH64_INSN_LDST_STORE_PAIR_PRE_INDEX,
18362306a36Sopenharmony_ci	AARCH64_INSN_LDST_LOAD_PAIR_POST_INDEX,
18462306a36Sopenharmony_ci	AARCH64_INSN_LDST_STORE_PAIR_POST_INDEX,
18562306a36Sopenharmony_ci	AARCH64_INSN_LDST_LOAD_EX,
18662306a36Sopenharmony_ci	AARCH64_INSN_LDST_LOAD_ACQ_EX,
18762306a36Sopenharmony_ci	AARCH64_INSN_LDST_STORE_EX,
18862306a36Sopenharmony_ci	AARCH64_INSN_LDST_STORE_REL_EX,
18962306a36Sopenharmony_ci	AARCH64_INSN_LDST_SIGNED_LOAD_IMM_OFFSET,
19062306a36Sopenharmony_ci	AARCH64_INSN_LDST_SIGNED_LOAD_REG_OFFSET,
19162306a36Sopenharmony_ci};
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cienum aarch64_insn_adsb_type {
19462306a36Sopenharmony_ci	AARCH64_INSN_ADSB_ADD,
19562306a36Sopenharmony_ci	AARCH64_INSN_ADSB_SUB,
19662306a36Sopenharmony_ci	AARCH64_INSN_ADSB_ADD_SETFLAGS,
19762306a36Sopenharmony_ci	AARCH64_INSN_ADSB_SUB_SETFLAGS
19862306a36Sopenharmony_ci};
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_cienum aarch64_insn_movewide_type {
20162306a36Sopenharmony_ci	AARCH64_INSN_MOVEWIDE_ZERO,
20262306a36Sopenharmony_ci	AARCH64_INSN_MOVEWIDE_KEEP,
20362306a36Sopenharmony_ci	AARCH64_INSN_MOVEWIDE_INVERSE
20462306a36Sopenharmony_ci};
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_cienum aarch64_insn_bitfield_type {
20762306a36Sopenharmony_ci	AARCH64_INSN_BITFIELD_MOVE,
20862306a36Sopenharmony_ci	AARCH64_INSN_BITFIELD_MOVE_UNSIGNED,
20962306a36Sopenharmony_ci	AARCH64_INSN_BITFIELD_MOVE_SIGNED
21062306a36Sopenharmony_ci};
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_cienum aarch64_insn_data1_type {
21362306a36Sopenharmony_ci	AARCH64_INSN_DATA1_REVERSE_16,
21462306a36Sopenharmony_ci	AARCH64_INSN_DATA1_REVERSE_32,
21562306a36Sopenharmony_ci	AARCH64_INSN_DATA1_REVERSE_64,
21662306a36Sopenharmony_ci};
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cienum aarch64_insn_data2_type {
21962306a36Sopenharmony_ci	AARCH64_INSN_DATA2_UDIV,
22062306a36Sopenharmony_ci	AARCH64_INSN_DATA2_SDIV,
22162306a36Sopenharmony_ci	AARCH64_INSN_DATA2_LSLV,
22262306a36Sopenharmony_ci	AARCH64_INSN_DATA2_LSRV,
22362306a36Sopenharmony_ci	AARCH64_INSN_DATA2_ASRV,
22462306a36Sopenharmony_ci	AARCH64_INSN_DATA2_RORV,
22562306a36Sopenharmony_ci};
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_cienum aarch64_insn_data3_type {
22862306a36Sopenharmony_ci	AARCH64_INSN_DATA3_MADD,
22962306a36Sopenharmony_ci	AARCH64_INSN_DATA3_MSUB,
23062306a36Sopenharmony_ci};
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_cienum aarch64_insn_logic_type {
23362306a36Sopenharmony_ci	AARCH64_INSN_LOGIC_AND,
23462306a36Sopenharmony_ci	AARCH64_INSN_LOGIC_BIC,
23562306a36Sopenharmony_ci	AARCH64_INSN_LOGIC_ORR,
23662306a36Sopenharmony_ci	AARCH64_INSN_LOGIC_ORN,
23762306a36Sopenharmony_ci	AARCH64_INSN_LOGIC_EOR,
23862306a36Sopenharmony_ci	AARCH64_INSN_LOGIC_EON,
23962306a36Sopenharmony_ci	AARCH64_INSN_LOGIC_AND_SETFLAGS,
24062306a36Sopenharmony_ci	AARCH64_INSN_LOGIC_BIC_SETFLAGS
24162306a36Sopenharmony_ci};
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cienum aarch64_insn_prfm_type {
24462306a36Sopenharmony_ci	AARCH64_INSN_PRFM_TYPE_PLD,
24562306a36Sopenharmony_ci	AARCH64_INSN_PRFM_TYPE_PLI,
24662306a36Sopenharmony_ci	AARCH64_INSN_PRFM_TYPE_PST,
24762306a36Sopenharmony_ci};
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cienum aarch64_insn_prfm_target {
25062306a36Sopenharmony_ci	AARCH64_INSN_PRFM_TARGET_L1,
25162306a36Sopenharmony_ci	AARCH64_INSN_PRFM_TARGET_L2,
25262306a36Sopenharmony_ci	AARCH64_INSN_PRFM_TARGET_L3,
25362306a36Sopenharmony_ci};
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_cienum aarch64_insn_prfm_policy {
25662306a36Sopenharmony_ci	AARCH64_INSN_PRFM_POLICY_KEEP,
25762306a36Sopenharmony_ci	AARCH64_INSN_PRFM_POLICY_STRM,
25862306a36Sopenharmony_ci};
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_cienum aarch64_insn_adr_type {
26162306a36Sopenharmony_ci	AARCH64_INSN_ADR_TYPE_ADRP,
26262306a36Sopenharmony_ci	AARCH64_INSN_ADR_TYPE_ADR,
26362306a36Sopenharmony_ci};
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_cienum aarch64_insn_mem_atomic_op {
26662306a36Sopenharmony_ci	AARCH64_INSN_MEM_ATOMIC_ADD,
26762306a36Sopenharmony_ci	AARCH64_INSN_MEM_ATOMIC_CLR,
26862306a36Sopenharmony_ci	AARCH64_INSN_MEM_ATOMIC_EOR,
26962306a36Sopenharmony_ci	AARCH64_INSN_MEM_ATOMIC_SET,
27062306a36Sopenharmony_ci	AARCH64_INSN_MEM_ATOMIC_SWP,
27162306a36Sopenharmony_ci};
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_cienum aarch64_insn_mem_order_type {
27462306a36Sopenharmony_ci	AARCH64_INSN_MEM_ORDER_NONE,
27562306a36Sopenharmony_ci	AARCH64_INSN_MEM_ORDER_ACQ,
27662306a36Sopenharmony_ci	AARCH64_INSN_MEM_ORDER_REL,
27762306a36Sopenharmony_ci	AARCH64_INSN_MEM_ORDER_ACQREL,
27862306a36Sopenharmony_ci};
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cienum aarch64_insn_mb_type {
28162306a36Sopenharmony_ci	AARCH64_INSN_MB_SY,
28262306a36Sopenharmony_ci	AARCH64_INSN_MB_ST,
28362306a36Sopenharmony_ci	AARCH64_INSN_MB_LD,
28462306a36Sopenharmony_ci	AARCH64_INSN_MB_ISH,
28562306a36Sopenharmony_ci	AARCH64_INSN_MB_ISHST,
28662306a36Sopenharmony_ci	AARCH64_INSN_MB_ISHLD,
28762306a36Sopenharmony_ci	AARCH64_INSN_MB_NSH,
28862306a36Sopenharmony_ci	AARCH64_INSN_MB_NSHST,
28962306a36Sopenharmony_ci	AARCH64_INSN_MB_NSHLD,
29062306a36Sopenharmony_ci	AARCH64_INSN_MB_OSH,
29162306a36Sopenharmony_ci	AARCH64_INSN_MB_OSHST,
29262306a36Sopenharmony_ci	AARCH64_INSN_MB_OSHLD,
29362306a36Sopenharmony_ci};
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci#define	__AARCH64_INSN_FUNCS(abbr, mask, val)				\
29662306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_##abbr(u32 code)		\
29762306a36Sopenharmony_ci{									\
29862306a36Sopenharmony_ci	BUILD_BUG_ON(~(mask) & (val));					\
29962306a36Sopenharmony_ci	return (code & (mask)) == (val);				\
30062306a36Sopenharmony_ci}									\
30162306a36Sopenharmony_cistatic __always_inline u32 aarch64_insn_get_##abbr##_value(void)	\
30262306a36Sopenharmony_ci{									\
30362306a36Sopenharmony_ci	return (val);							\
30462306a36Sopenharmony_ci}
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci/*
30762306a36Sopenharmony_ci * ARM Architecture Reference Manual for ARMv8 Profile-A, Issue A.a
30862306a36Sopenharmony_ci * Section C3.1 "A64 instruction index by encoding":
30962306a36Sopenharmony_ci * AArch64 main encoding table
31062306a36Sopenharmony_ci *  Bit position
31162306a36Sopenharmony_ci *   28 27 26 25	Encoding Group
31262306a36Sopenharmony_ci *   0  0  -  -		Unallocated
31362306a36Sopenharmony_ci *   1  0  0  -		Data processing, immediate
31462306a36Sopenharmony_ci *   1  0  1  -		Branch, exception generation and system instructions
31562306a36Sopenharmony_ci *   -  1  -  0		Loads and stores
31662306a36Sopenharmony_ci *   -  1  0  1		Data processing - register
31762306a36Sopenharmony_ci *   0  1  1  1		Data processing - SIMD and floating point
31862306a36Sopenharmony_ci *   1  1  1  1		Data processing - SIMD and floating point
31962306a36Sopenharmony_ci * "-" means "don't care"
32062306a36Sopenharmony_ci */
32162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(class_branch_sys,	0x1c000000, 0x14000000)
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(adr,	0x9F000000, 0x10000000)
32462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(adrp,	0x9F000000, 0x90000000)
32562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(prfm,	0x3FC00000, 0x39800000)
32662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(prfm_lit,	0xFF000000, 0xD8000000)
32762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(store_imm,	0x3FC00000, 0x39000000)
32862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(load_imm,	0x3FC00000, 0x39400000)
32962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(signed_load_imm, 0X3FC00000, 0x39800000)
33062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(store_pre,	0x3FE00C00, 0x38000C00)
33162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(load_pre,	0x3FE00C00, 0x38400C00)
33262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(store_post,	0x3FE00C00, 0x38000400)
33362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(load_post,	0x3FE00C00, 0x38400400)
33462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(str_reg,	0x3FE0EC00, 0x38206800)
33562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(str_imm,	0x3FC00000, 0x39000000)
33662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldadd,	0x3F20FC00, 0x38200000)
33762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldclr,	0x3F20FC00, 0x38201000)
33862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldeor,	0x3F20FC00, 0x38202000)
33962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldset,	0x3F20FC00, 0x38203000)
34062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(swp,	0x3F20FC00, 0x38208000)
34162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(cas,	0x3FA07C00, 0x08A07C00)
34262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldr_reg,	0x3FE0EC00, 0x38606800)
34362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(signed_ldr_reg, 0X3FE0FC00, 0x38A0E800)
34462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldr_imm,	0x3FC00000, 0x39400000)
34562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldr_lit,	0xBF000000, 0x18000000)
34662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldrsw_lit,	0xFF000000, 0x98000000)
34762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(exclusive,	0x3F800000, 0x08000000)
34862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(load_ex,	0x3F400000, 0x08400000)
34962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(store_ex,	0x3F400000, 0x08000000)
35062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(stp,	0x7FC00000, 0x29000000)
35162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldp,	0x7FC00000, 0x29400000)
35262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(stp_post,	0x7FC00000, 0x28800000)
35362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldp_post,	0x7FC00000, 0x28C00000)
35462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(stp_pre,	0x7FC00000, 0x29800000)
35562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ldp_pre,	0x7FC00000, 0x29C00000)
35662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(add_imm,	0x7F000000, 0x11000000)
35762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(adds_imm,	0x7F000000, 0x31000000)
35862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(sub_imm,	0x7F000000, 0x51000000)
35962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(subs_imm,	0x7F000000, 0x71000000)
36062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(movn,	0x7F800000, 0x12800000)
36162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(sbfm,	0x7F800000, 0x13000000)
36262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(bfm,	0x7F800000, 0x33000000)
36362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(movz,	0x7F800000, 0x52800000)
36462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ubfm,	0x7F800000, 0x53000000)
36562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(movk,	0x7F800000, 0x72800000)
36662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(add,	0x7F200000, 0x0B000000)
36762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(adds,	0x7F200000, 0x2B000000)
36862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(sub,	0x7F200000, 0x4B000000)
36962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(subs,	0x7F200000, 0x6B000000)
37062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(madd,	0x7FE08000, 0x1B000000)
37162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(msub,	0x7FE08000, 0x1B008000)
37262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(udiv,	0x7FE0FC00, 0x1AC00800)
37362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(sdiv,	0x7FE0FC00, 0x1AC00C00)
37462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(lslv,	0x7FE0FC00, 0x1AC02000)
37562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(lsrv,	0x7FE0FC00, 0x1AC02400)
37662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(asrv,	0x7FE0FC00, 0x1AC02800)
37762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(rorv,	0x7FE0FC00, 0x1AC02C00)
37862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(rev16,	0x7FFFFC00, 0x5AC00400)
37962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(rev32,	0x7FFFFC00, 0x5AC00800)
38062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(rev64,	0x7FFFFC00, 0x5AC00C00)
38162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(and,	0x7F200000, 0x0A000000)
38262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(bic,	0x7F200000, 0x0A200000)
38362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(orr,	0x7F200000, 0x2A000000)
38462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(mov_reg,	0x7FE0FFE0, 0x2A0003E0)
38562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(orn,	0x7F200000, 0x2A200000)
38662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(eor,	0x7F200000, 0x4A000000)
38762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(eon,	0x7F200000, 0x4A200000)
38862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ands,	0x7F200000, 0x6A000000)
38962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(bics,	0x7F200000, 0x6A200000)
39062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(and_imm,	0x7F800000, 0x12000000)
39162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(orr_imm,	0x7F800000, 0x32000000)
39262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(eor_imm,	0x7F800000, 0x52000000)
39362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ands_imm,	0x7F800000, 0x72000000)
39462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(extr,	0x7FA00000, 0x13800000)
39562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(b,		0xFC000000, 0x14000000)
39662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(bl,	0xFC000000, 0x94000000)
39762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(cbz,	0x7F000000, 0x34000000)
39862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(cbnz,	0x7F000000, 0x35000000)
39962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(tbz,	0x7F000000, 0x36000000)
40062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(tbnz,	0x7F000000, 0x37000000)
40162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(bcond,	0xFF000010, 0x54000000)
40262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(svc,	0xFFE0001F, 0xD4000001)
40362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(hvc,	0xFFE0001F, 0xD4000002)
40462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(smc,	0xFFE0001F, 0xD4000003)
40562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(brk,	0xFFE0001F, 0xD4200000)
40662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(exception,	0xFF000000, 0xD4000000)
40762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(hint,	0xFFFFF01F, 0xD503201F)
40862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(br,	0xFFFFFC1F, 0xD61F0000)
40962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(br_auth,	0xFEFFF800, 0xD61F0800)
41062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(blr,	0xFFFFFC1F, 0xD63F0000)
41162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(blr_auth,	0xFEFFF800, 0xD63F0800)
41262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ret,	0xFFFFFC1F, 0xD65F0000)
41362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ret_auth,	0xFFFFFBFF, 0xD65F0BFF)
41462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(eret,	0xFFFFFFFF, 0xD69F03E0)
41562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(eret_auth,	0xFFFFFBFF, 0xD69F0BFF)
41662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(mrs,	0xFFF00000, 0xD5300000)
41762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(msr_imm,	0xFFF8F01F, 0xD500401F)
41862306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(msr_reg,	0xFFF00000, 0xD5100000)
41962306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(dmb,	0xFFFFF0FF, 0xD50330BF)
42062306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(dsb_base,	0xFFFFF0FF, 0xD503309F)
42162306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(dsb_nxs,	0xFFFFF3FF, 0xD503323F)
42262306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(isb,	0xFFFFF0FF, 0xD50330DF)
42362306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(sb,	0xFFFFFFFF, 0xD50330FF)
42462306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(clrex,	0xFFFFF0FF, 0xD503305F)
42562306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(ssbb,	0xFFFFFFFF, 0xD503309F)
42662306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(pssbb,	0xFFFFFFFF, 0xD503349F)
42762306a36Sopenharmony_ci__AARCH64_INSN_FUNCS(bti,	0xFFFFFF3F, 0xD503241f)
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci#undef	__AARCH64_INSN_FUNCS
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_steppable_hint(u32 insn)
43262306a36Sopenharmony_ci{
43362306a36Sopenharmony_ci	if (!aarch64_insn_is_hint(insn))
43462306a36Sopenharmony_ci		return false;
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci	switch (insn & 0xFE0) {
43762306a36Sopenharmony_ci	case AARCH64_INSN_HINT_XPACLRI:
43862306a36Sopenharmony_ci	case AARCH64_INSN_HINT_PACIA_1716:
43962306a36Sopenharmony_ci	case AARCH64_INSN_HINT_PACIB_1716:
44062306a36Sopenharmony_ci	case AARCH64_INSN_HINT_PACIAZ:
44162306a36Sopenharmony_ci	case AARCH64_INSN_HINT_PACIASP:
44262306a36Sopenharmony_ci	case AARCH64_INSN_HINT_PACIBZ:
44362306a36Sopenharmony_ci	case AARCH64_INSN_HINT_PACIBSP:
44462306a36Sopenharmony_ci	case AARCH64_INSN_HINT_BTI:
44562306a36Sopenharmony_ci	case AARCH64_INSN_HINT_BTIC:
44662306a36Sopenharmony_ci	case AARCH64_INSN_HINT_BTIJ:
44762306a36Sopenharmony_ci	case AARCH64_INSN_HINT_BTIJC:
44862306a36Sopenharmony_ci	case AARCH64_INSN_HINT_NOP:
44962306a36Sopenharmony_ci		return true;
45062306a36Sopenharmony_ci	default:
45162306a36Sopenharmony_ci		return false;
45262306a36Sopenharmony_ci	}
45362306a36Sopenharmony_ci}
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_branch(u32 insn)
45662306a36Sopenharmony_ci{
45762306a36Sopenharmony_ci	/* b, bl, cb*, tb*, ret*, b.cond, br*, blr* */
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci	return aarch64_insn_is_b(insn) ||
46062306a36Sopenharmony_ci	       aarch64_insn_is_bl(insn) ||
46162306a36Sopenharmony_ci	       aarch64_insn_is_cbz(insn) ||
46262306a36Sopenharmony_ci	       aarch64_insn_is_cbnz(insn) ||
46362306a36Sopenharmony_ci	       aarch64_insn_is_tbz(insn) ||
46462306a36Sopenharmony_ci	       aarch64_insn_is_tbnz(insn) ||
46562306a36Sopenharmony_ci	       aarch64_insn_is_ret(insn) ||
46662306a36Sopenharmony_ci	       aarch64_insn_is_ret_auth(insn) ||
46762306a36Sopenharmony_ci	       aarch64_insn_is_br(insn) ||
46862306a36Sopenharmony_ci	       aarch64_insn_is_br_auth(insn) ||
46962306a36Sopenharmony_ci	       aarch64_insn_is_blr(insn) ||
47062306a36Sopenharmony_ci	       aarch64_insn_is_blr_auth(insn) ||
47162306a36Sopenharmony_ci	       aarch64_insn_is_bcond(insn);
47262306a36Sopenharmony_ci}
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_branch_imm(u32 insn)
47562306a36Sopenharmony_ci{
47662306a36Sopenharmony_ci	return aarch64_insn_is_b(insn) ||
47762306a36Sopenharmony_ci	       aarch64_insn_is_bl(insn) ||
47862306a36Sopenharmony_ci	       aarch64_insn_is_tbz(insn) ||
47962306a36Sopenharmony_ci	       aarch64_insn_is_tbnz(insn) ||
48062306a36Sopenharmony_ci	       aarch64_insn_is_cbz(insn) ||
48162306a36Sopenharmony_ci	       aarch64_insn_is_cbnz(insn) ||
48262306a36Sopenharmony_ci	       aarch64_insn_is_bcond(insn);
48362306a36Sopenharmony_ci}
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_adr_adrp(u32 insn)
48662306a36Sopenharmony_ci{
48762306a36Sopenharmony_ci	return aarch64_insn_is_adr(insn) ||
48862306a36Sopenharmony_ci	       aarch64_insn_is_adrp(insn);
48962306a36Sopenharmony_ci}
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_dsb(u32 insn)
49262306a36Sopenharmony_ci{
49362306a36Sopenharmony_ci	return aarch64_insn_is_dsb_base(insn) ||
49462306a36Sopenharmony_ci	       aarch64_insn_is_dsb_nxs(insn);
49562306a36Sopenharmony_ci}
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_barrier(u32 insn)
49862306a36Sopenharmony_ci{
49962306a36Sopenharmony_ci	return aarch64_insn_is_dmb(insn) ||
50062306a36Sopenharmony_ci	       aarch64_insn_is_dsb(insn) ||
50162306a36Sopenharmony_ci	       aarch64_insn_is_isb(insn) ||
50262306a36Sopenharmony_ci	       aarch64_insn_is_sb(insn) ||
50362306a36Sopenharmony_ci	       aarch64_insn_is_clrex(insn) ||
50462306a36Sopenharmony_ci	       aarch64_insn_is_ssbb(insn) ||
50562306a36Sopenharmony_ci	       aarch64_insn_is_pssbb(insn);
50662306a36Sopenharmony_ci}
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_store_single(u32 insn)
50962306a36Sopenharmony_ci{
51062306a36Sopenharmony_ci	return aarch64_insn_is_store_imm(insn) ||
51162306a36Sopenharmony_ci	       aarch64_insn_is_store_pre(insn) ||
51262306a36Sopenharmony_ci	       aarch64_insn_is_store_post(insn);
51362306a36Sopenharmony_ci}
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_store_pair(u32 insn)
51662306a36Sopenharmony_ci{
51762306a36Sopenharmony_ci	return aarch64_insn_is_stp(insn) ||
51862306a36Sopenharmony_ci	       aarch64_insn_is_stp_pre(insn) ||
51962306a36Sopenharmony_ci	       aarch64_insn_is_stp_post(insn);
52062306a36Sopenharmony_ci}
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_load_single(u32 insn)
52362306a36Sopenharmony_ci{
52462306a36Sopenharmony_ci	return aarch64_insn_is_load_imm(insn) ||
52562306a36Sopenharmony_ci	       aarch64_insn_is_load_pre(insn) ||
52662306a36Sopenharmony_ci	       aarch64_insn_is_load_post(insn);
52762306a36Sopenharmony_ci}
52862306a36Sopenharmony_ci
52962306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_is_load_pair(u32 insn)
53062306a36Sopenharmony_ci{
53162306a36Sopenharmony_ci	return aarch64_insn_is_ldp(insn) ||
53262306a36Sopenharmony_ci	       aarch64_insn_is_ldp_pre(insn) ||
53362306a36Sopenharmony_ci	       aarch64_insn_is_ldp_post(insn);
53462306a36Sopenharmony_ci}
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_cistatic __always_inline bool aarch64_insn_uses_literal(u32 insn)
53762306a36Sopenharmony_ci{
53862306a36Sopenharmony_ci	/* ldr/ldrsw (literal), prfm */
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci	return aarch64_insn_is_ldr_lit(insn) ||
54162306a36Sopenharmony_ci	       aarch64_insn_is_ldrsw_lit(insn) ||
54262306a36Sopenharmony_ci	       aarch64_insn_is_adr_adrp(insn) ||
54362306a36Sopenharmony_ci	       aarch64_insn_is_prfm_lit(insn);
54462306a36Sopenharmony_ci}
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_cienum aarch64_insn_encoding_class aarch64_get_insn_class(u32 insn);
54762306a36Sopenharmony_ciu64 aarch64_insn_decode_immediate(enum aarch64_insn_imm_type type, u32 insn);
54862306a36Sopenharmony_ciu32 aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type,
54962306a36Sopenharmony_ci				  u32 insn, u64 imm);
55062306a36Sopenharmony_ciu32 aarch64_insn_decode_register(enum aarch64_insn_register_type type,
55162306a36Sopenharmony_ci					 u32 insn);
55262306a36Sopenharmony_ciu32 aarch64_insn_gen_branch_imm(unsigned long pc, unsigned long addr,
55362306a36Sopenharmony_ci				enum aarch64_insn_branch_type type);
55462306a36Sopenharmony_ciu32 aarch64_insn_gen_comp_branch_imm(unsigned long pc, unsigned long addr,
55562306a36Sopenharmony_ci				     enum aarch64_insn_register reg,
55662306a36Sopenharmony_ci				     enum aarch64_insn_variant variant,
55762306a36Sopenharmony_ci				     enum aarch64_insn_branch_type type);
55862306a36Sopenharmony_ciu32 aarch64_insn_gen_cond_branch_imm(unsigned long pc, unsigned long addr,
55962306a36Sopenharmony_ci				     enum aarch64_insn_condition cond);
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_cistatic __always_inline u32
56262306a36Sopenharmony_ciaarch64_insn_gen_hint(enum aarch64_insn_hint_cr_op op)
56362306a36Sopenharmony_ci{
56462306a36Sopenharmony_ci	return aarch64_insn_get_hint_value() | op;
56562306a36Sopenharmony_ci}
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_cistatic __always_inline u32 aarch64_insn_gen_nop(void)
56862306a36Sopenharmony_ci{
56962306a36Sopenharmony_ci	return aarch64_insn_gen_hint(AARCH64_INSN_HINT_NOP);
57062306a36Sopenharmony_ci}
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ciu32 aarch64_insn_gen_branch_reg(enum aarch64_insn_register reg,
57362306a36Sopenharmony_ci				enum aarch64_insn_branch_type type);
57462306a36Sopenharmony_ciu32 aarch64_insn_gen_load_store_reg(enum aarch64_insn_register reg,
57562306a36Sopenharmony_ci				    enum aarch64_insn_register base,
57662306a36Sopenharmony_ci				    enum aarch64_insn_register offset,
57762306a36Sopenharmony_ci				    enum aarch64_insn_size_type size,
57862306a36Sopenharmony_ci				    enum aarch64_insn_ldst_type type);
57962306a36Sopenharmony_ciu32 aarch64_insn_gen_load_store_imm(enum aarch64_insn_register reg,
58062306a36Sopenharmony_ci				    enum aarch64_insn_register base,
58162306a36Sopenharmony_ci				    unsigned int imm,
58262306a36Sopenharmony_ci				    enum aarch64_insn_size_type size,
58362306a36Sopenharmony_ci				    enum aarch64_insn_ldst_type type);
58462306a36Sopenharmony_ciu32 aarch64_insn_gen_load_literal(unsigned long pc, unsigned long addr,
58562306a36Sopenharmony_ci				  enum aarch64_insn_register reg,
58662306a36Sopenharmony_ci				  bool is64bit);
58762306a36Sopenharmony_ciu32 aarch64_insn_gen_load_store_pair(enum aarch64_insn_register reg1,
58862306a36Sopenharmony_ci				     enum aarch64_insn_register reg2,
58962306a36Sopenharmony_ci				     enum aarch64_insn_register base,
59062306a36Sopenharmony_ci				     int offset,
59162306a36Sopenharmony_ci				     enum aarch64_insn_variant variant,
59262306a36Sopenharmony_ci				     enum aarch64_insn_ldst_type type);
59362306a36Sopenharmony_ciu32 aarch64_insn_gen_load_store_ex(enum aarch64_insn_register reg,
59462306a36Sopenharmony_ci				   enum aarch64_insn_register base,
59562306a36Sopenharmony_ci				   enum aarch64_insn_register state,
59662306a36Sopenharmony_ci				   enum aarch64_insn_size_type size,
59762306a36Sopenharmony_ci				   enum aarch64_insn_ldst_type type);
59862306a36Sopenharmony_ciu32 aarch64_insn_gen_add_sub_imm(enum aarch64_insn_register dst,
59962306a36Sopenharmony_ci				 enum aarch64_insn_register src,
60062306a36Sopenharmony_ci				 int imm, enum aarch64_insn_variant variant,
60162306a36Sopenharmony_ci				 enum aarch64_insn_adsb_type type);
60262306a36Sopenharmony_ciu32 aarch64_insn_gen_adr(unsigned long pc, unsigned long addr,
60362306a36Sopenharmony_ci			 enum aarch64_insn_register reg,
60462306a36Sopenharmony_ci			 enum aarch64_insn_adr_type type);
60562306a36Sopenharmony_ciu32 aarch64_insn_gen_bitfield(enum aarch64_insn_register dst,
60662306a36Sopenharmony_ci			      enum aarch64_insn_register src,
60762306a36Sopenharmony_ci			      int immr, int imms,
60862306a36Sopenharmony_ci			      enum aarch64_insn_variant variant,
60962306a36Sopenharmony_ci			      enum aarch64_insn_bitfield_type type);
61062306a36Sopenharmony_ciu32 aarch64_insn_gen_movewide(enum aarch64_insn_register dst,
61162306a36Sopenharmony_ci			      int imm, int shift,
61262306a36Sopenharmony_ci			      enum aarch64_insn_variant variant,
61362306a36Sopenharmony_ci			      enum aarch64_insn_movewide_type type);
61462306a36Sopenharmony_ciu32 aarch64_insn_gen_add_sub_shifted_reg(enum aarch64_insn_register dst,
61562306a36Sopenharmony_ci					 enum aarch64_insn_register src,
61662306a36Sopenharmony_ci					 enum aarch64_insn_register reg,
61762306a36Sopenharmony_ci					 int shift,
61862306a36Sopenharmony_ci					 enum aarch64_insn_variant variant,
61962306a36Sopenharmony_ci					 enum aarch64_insn_adsb_type type);
62062306a36Sopenharmony_ciu32 aarch64_insn_gen_data1(enum aarch64_insn_register dst,
62162306a36Sopenharmony_ci			   enum aarch64_insn_register src,
62262306a36Sopenharmony_ci			   enum aarch64_insn_variant variant,
62362306a36Sopenharmony_ci			   enum aarch64_insn_data1_type type);
62462306a36Sopenharmony_ciu32 aarch64_insn_gen_data2(enum aarch64_insn_register dst,
62562306a36Sopenharmony_ci			   enum aarch64_insn_register src,
62662306a36Sopenharmony_ci			   enum aarch64_insn_register reg,
62762306a36Sopenharmony_ci			   enum aarch64_insn_variant variant,
62862306a36Sopenharmony_ci			   enum aarch64_insn_data2_type type);
62962306a36Sopenharmony_ciu32 aarch64_insn_gen_data3(enum aarch64_insn_register dst,
63062306a36Sopenharmony_ci			   enum aarch64_insn_register src,
63162306a36Sopenharmony_ci			   enum aarch64_insn_register reg1,
63262306a36Sopenharmony_ci			   enum aarch64_insn_register reg2,
63362306a36Sopenharmony_ci			   enum aarch64_insn_variant variant,
63462306a36Sopenharmony_ci			   enum aarch64_insn_data3_type type);
63562306a36Sopenharmony_ciu32 aarch64_insn_gen_logical_shifted_reg(enum aarch64_insn_register dst,
63662306a36Sopenharmony_ci					 enum aarch64_insn_register src,
63762306a36Sopenharmony_ci					 enum aarch64_insn_register reg,
63862306a36Sopenharmony_ci					 int shift,
63962306a36Sopenharmony_ci					 enum aarch64_insn_variant variant,
64062306a36Sopenharmony_ci					 enum aarch64_insn_logic_type type);
64162306a36Sopenharmony_ciu32 aarch64_insn_gen_move_reg(enum aarch64_insn_register dst,
64262306a36Sopenharmony_ci			      enum aarch64_insn_register src,
64362306a36Sopenharmony_ci			      enum aarch64_insn_variant variant);
64462306a36Sopenharmony_ciu32 aarch64_insn_gen_logical_immediate(enum aarch64_insn_logic_type type,
64562306a36Sopenharmony_ci				       enum aarch64_insn_variant variant,
64662306a36Sopenharmony_ci				       enum aarch64_insn_register Rn,
64762306a36Sopenharmony_ci				       enum aarch64_insn_register Rd,
64862306a36Sopenharmony_ci				       u64 imm);
64962306a36Sopenharmony_ciu32 aarch64_insn_gen_extr(enum aarch64_insn_variant variant,
65062306a36Sopenharmony_ci			  enum aarch64_insn_register Rm,
65162306a36Sopenharmony_ci			  enum aarch64_insn_register Rn,
65262306a36Sopenharmony_ci			  enum aarch64_insn_register Rd,
65362306a36Sopenharmony_ci			  u8 lsb);
65462306a36Sopenharmony_ci#ifdef CONFIG_ARM64_LSE_ATOMICS
65562306a36Sopenharmony_ciu32 aarch64_insn_gen_atomic_ld_op(enum aarch64_insn_register result,
65662306a36Sopenharmony_ci				  enum aarch64_insn_register address,
65762306a36Sopenharmony_ci				  enum aarch64_insn_register value,
65862306a36Sopenharmony_ci				  enum aarch64_insn_size_type size,
65962306a36Sopenharmony_ci				  enum aarch64_insn_mem_atomic_op op,
66062306a36Sopenharmony_ci				  enum aarch64_insn_mem_order_type order);
66162306a36Sopenharmony_ciu32 aarch64_insn_gen_cas(enum aarch64_insn_register result,
66262306a36Sopenharmony_ci			 enum aarch64_insn_register address,
66362306a36Sopenharmony_ci			 enum aarch64_insn_register value,
66462306a36Sopenharmony_ci			 enum aarch64_insn_size_type size,
66562306a36Sopenharmony_ci			 enum aarch64_insn_mem_order_type order);
66662306a36Sopenharmony_ci#else
66762306a36Sopenharmony_cistatic inline
66862306a36Sopenharmony_ciu32 aarch64_insn_gen_atomic_ld_op(enum aarch64_insn_register result,
66962306a36Sopenharmony_ci				  enum aarch64_insn_register address,
67062306a36Sopenharmony_ci				  enum aarch64_insn_register value,
67162306a36Sopenharmony_ci				  enum aarch64_insn_size_type size,
67262306a36Sopenharmony_ci				  enum aarch64_insn_mem_atomic_op op,
67362306a36Sopenharmony_ci				  enum aarch64_insn_mem_order_type order)
67462306a36Sopenharmony_ci{
67562306a36Sopenharmony_ci	return AARCH64_BREAK_FAULT;
67662306a36Sopenharmony_ci}
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_cistatic inline
67962306a36Sopenharmony_ciu32 aarch64_insn_gen_cas(enum aarch64_insn_register result,
68062306a36Sopenharmony_ci			 enum aarch64_insn_register address,
68162306a36Sopenharmony_ci			 enum aarch64_insn_register value,
68262306a36Sopenharmony_ci			 enum aarch64_insn_size_type size,
68362306a36Sopenharmony_ci			 enum aarch64_insn_mem_order_type order)
68462306a36Sopenharmony_ci{
68562306a36Sopenharmony_ci	return AARCH64_BREAK_FAULT;
68662306a36Sopenharmony_ci}
68762306a36Sopenharmony_ci#endif
68862306a36Sopenharmony_ciu32 aarch64_insn_gen_dmb(enum aarch64_insn_mb_type type);
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_cis32 aarch64_get_branch_offset(u32 insn);
69162306a36Sopenharmony_ciu32 aarch64_set_branch_offset(u32 insn, s32 offset);
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_cis32 aarch64_insn_adrp_get_offset(u32 insn);
69462306a36Sopenharmony_ciu32 aarch64_insn_adrp_set_offset(u32 insn, s32 offset);
69562306a36Sopenharmony_ci
69662306a36Sopenharmony_cibool aarch32_insn_is_wide(u32 insn);
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_ci#define A32_RN_OFFSET	16
69962306a36Sopenharmony_ci#define A32_RT_OFFSET	12
70062306a36Sopenharmony_ci#define A32_RT2_OFFSET	 0
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ciu32 aarch64_insn_extract_system_reg(u32 insn);
70362306a36Sopenharmony_ciu32 aarch32_insn_extract_reg_num(u32 insn, int offset);
70462306a36Sopenharmony_ciu32 aarch32_insn_mcr_extract_opc2(u32 insn);
70562306a36Sopenharmony_ciu32 aarch32_insn_mcr_extract_crm(u32 insn);
70662306a36Sopenharmony_ci
70762306a36Sopenharmony_citypedef bool (pstate_check_t)(unsigned long);
70862306a36Sopenharmony_ciextern pstate_check_t * const aarch32_opcode_cond_checks[16];
70962306a36Sopenharmony_ci
71062306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci#endif	/* __ASM_INSN_H */
713