Lines Matching defs:insn

16 #include <asm/insn.h>
88 u64 aarch64_insn_decode_immediate(enum aarch64_insn_imm_type type, u32 insn)
96 immlo = (insn >> ADR_IMM_LOSHIFT) & ADR_IMM_LOMASK;
97 immhi = (insn >> ADR_IMM_HISHIFT) & ADR_IMM_HIMASK;
98 insn = (immhi << ADR_IMM_HILOSPLIT) | immlo;
109 return (insn >> shift) & mask;
113 u32 insn, u64 imm)
118 if (insn == AARCH64_BREAK_FAULT)
140 insn &= ~(mask << shift);
141 insn |= (imm & mask) << shift;
143 return insn;
147 u32 insn)
172 return (insn >> shift) & GENMASK(4, 0);
176 u32 insn,
181 if (insn == AARCH64_BREAK_FAULT)
211 insn &= ~(GENMASK(4, 0) << shift);
212 insn |= reg << shift;
214 return insn;
225 u32 insn)
235 insn &= ~GENMASK(31, 30);
236 insn |= size << 30;
238 return insn;
264 u32 insn;
278 insn = aarch64_insn_get_bl_value();
281 insn = aarch64_insn_get_b_value();
288 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_26, insn,
297 u32 insn;
306 insn = aarch64_insn_get_cbz_value();
309 insn = aarch64_insn_get_cbnz_value();
320 insn |= AARCH64_INSN_SF_BIT;
327 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn, reg);
329 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn,
336 u32 insn;
341 insn = aarch64_insn_get_bcond_value();
347 insn |= cond;
349 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn,
356 u32 insn;
360 insn = aarch64_insn_get_br_value();
363 insn = aarch64_insn_get_blr_value();
366 insn = aarch64_insn_get_ret_value();
373 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, reg);
382 u32 insn;
386 insn = aarch64_insn_get_ldr_reg_value();
389 insn = aarch64_insn_get_signed_ldr_reg_value();
392 insn = aarch64_insn_get_str_reg_value();
399 insn = aarch64_insn_encode_ldst_size(size, insn);
401 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn, reg);
403 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn,
406 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn,
416 u32 insn;
434 insn = aarch64_insn_get_ldr_imm_value();
437 insn = aarch64_insn_get_signed_load_imm_value();
440 insn = aarch64_insn_get_str_imm_value();
447 insn = aarch64_insn_encode_ldst_size(size, insn);
449 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn, reg);
451 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn,
454 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_12, insn, imm);
461 u32 insn;
468 insn = aarch64_insn_get_ldr_lit_value();
471 insn |= BIT(30);
473 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn, reg);
475 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn,
486 u32 insn;
491 insn = aarch64_insn_get_ldp_pre_value();
494 insn = aarch64_insn_get_stp_pre_value();
497 insn = aarch64_insn_get_ldp_post_value();
500 insn = aarch64_insn_get_stp_post_value();
523 insn |= AARCH64_INSN_SF_BIT;
530 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn,
533 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT2, insn,
536 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn,
539 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_7, insn,
549 u32 insn;
554 insn = aarch64_insn_get_load_ex_value();
556 insn |= BIT(15);
560 insn = aarch64_insn_get_store_ex_value();
562 insn |= BIT(15);
569 insn = aarch64_insn_encode_ldst_size(size, insn);
571 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn,
574 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn,
577 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT2, insn,
580 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RS, insn,
586 u32 insn)
608 insn &= ~GENMASK(23, 22);
609 insn |= order << 22;
611 return insn;
621 u32 insn;
625 insn = aarch64_insn_get_ldadd_value();
628 insn = aarch64_insn_get_ldclr_value();
631 insn = aarch64_insn_get_ldeor_value();
634 insn = aarch64_insn_get_ldset_value();
637 insn = aarch64_insn_get_swp_value();
653 insn = aarch64_insn_encode_ldst_size(size, insn);
655 insn = aarch64_insn_encode_ldst_order(order, insn);
657 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn,
660 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn,
663 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RS, insn,
668 u32 insn)
690 insn &= ~(BIT(15) | BIT(22));
691 insn |= order;
693 return insn;
702 u32 insn;
713 insn = aarch64_insn_get_cas_value();
715 insn = aarch64_insn_encode_ldst_size(size, insn);
717 insn = aarch64_insn_encode_cas_order(order, insn);
719 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn,
722 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn,
725 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RS, insn,
735 u32 insn;
739 insn = aarch64_insn_get_add_imm_value();
742 insn = aarch64_insn_get_sub_imm_value();
745 insn = aarch64_insn_get_adds_imm_value();
748 insn = aarch64_insn_get_subs_imm_value();
759 insn |= AARCH64_INSN_SF_BIT;
777 insn |= AARCH64_INSN_LSL_12;
780 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst);
782 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src);
784 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_12, insn, imm);
797 u32 insn;
802 insn = aarch64_insn_get_bfm_value();
805 insn = aarch64_insn_get_ubfm_value();
808 insn = aarch64_insn_get_sbfm_value();
820 insn |= AARCH64_INSN_SF_BIT | AARCH64_INSN_N_BIT;
837 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst);
839 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src);
841 insn = aarch64_insn_encode_immediate(AARCH64_INSN_IMM_R, insn, immr);
843 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_S, insn, imms);
851 u32 insn;
855 insn = aarch64_insn_get_movz_value();
858 insn = aarch64_insn_get_movk_value();
861 insn = aarch64_insn_get_movn_value();
882 insn |= AARCH64_INSN_SF_BIT;
894 insn |= (shift >> 4) << 21;
896 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst);
898 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_16, insn, imm);
908 u32 insn;
912 insn = aarch64_insn_get_add_value();
915 insn = aarch64_insn_get_sub_value();
918 insn = aarch64_insn_get_adds_value();
921 insn = aarch64_insn_get_subs_value();
937 insn |= AARCH64_INSN_SF_BIT;
950 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst);
952 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src);
954 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, reg);
956 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_6, insn, shift);
964 u32 insn;
968 insn = aarch64_insn_get_rev16_value();
971 insn = aarch64_insn_get_rev32_value();
979 insn = aarch64_insn_get_rev64_value();
990 insn |= AARCH64_INSN_SF_BIT;
997 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst);
999 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src);
1008 u32 insn;
1012 insn = aarch64_insn_get_udiv_value();
1015 insn = aarch64_insn_get_sdiv_value();
1018 insn = aarch64_insn_get_lslv_value();
1021 insn = aarch64_insn_get_lsrv_value();
1024 insn = aarch64_insn_get_asrv_value();
1027 insn = aarch64_insn_get_rorv_value();
1038 insn |= AARCH64_INSN_SF_BIT;
1045 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst);
1047 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src);
1049 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, reg);
1059 u32 insn;
1063 insn = aarch64_insn_get_madd_value();
1066 insn = aarch64_insn_get_msub_value();
1077 insn |= AARCH64_INSN_SF_BIT;
1084 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst);
1086 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RA, insn, src);
1088 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn,
1091 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn,
1102 u32 insn;
1106 insn = aarch64_insn_get_and_value();
1109 insn = aarch64_insn_get_bic_value();
1112 insn = aarch64_insn_get_orr_value();
1115 insn = aarch64_insn_get_orn_value();
1118 insn = aarch64_insn_get_eor_value();
1121 insn = aarch64_insn_get_eon_value();
1124 insn = aarch64_insn_get_ands_value();
1127 insn = aarch64_insn_get_bics_value();
1143 insn |= AARCH64_INSN_SF_BIT;
1156 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst);
1158 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src);
1160 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, reg);
1162 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_6, insn, shift);
1182 u32 insn;
1187 insn = aarch64_insn_get_adr_value();
1191 insn = aarch64_insn_get_adrp_value();
1202 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, reg);
1204 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_ADR, insn, offset);
1212 s32 aarch64_get_branch_offset(u32 insn)
1216 if (aarch64_insn_is_b(insn) || aarch64_insn_is_bl(insn)) {
1217 imm = aarch64_insn_decode_immediate(AARCH64_INSN_IMM_26, insn);
1221 if (aarch64_insn_is_cbz(insn) || aarch64_insn_is_cbnz(insn) ||
1222 aarch64_insn_is_bcond(insn)) {
1223 imm = aarch64_insn_decode_immediate(AARCH64_INSN_IMM_19, insn);
1227 if (aarch64_insn_is_tbz(insn) || aarch64_insn_is_tbnz(insn)) {
1228 imm = aarch64_insn_decode_immediate(AARCH64_INSN_IMM_14, insn);
1240 u32 aarch64_set_branch_offset(u32 insn, s32 offset)
1242 if (aarch64_insn_is_b(insn) || aarch64_insn_is_bl(insn))
1243 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_26, insn,
1246 if (aarch64_insn_is_cbz(insn) || aarch64_insn_is_cbnz(insn) ||
1247 aarch64_insn_is_bcond(insn))
1248 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn,
1251 if (aarch64_insn_is_tbz(insn) || aarch64_insn_is_tbnz(insn))
1252 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_14, insn,
1259 s32 aarch64_insn_adrp_get_offset(u32 insn)
1261 BUG_ON(!aarch64_insn_is_adrp(insn));
1262 return aarch64_insn_decode_immediate(AARCH64_INSN_IMM_ADR, insn) << 12;
1265 u32 aarch64_insn_adrp_set_offset(u32 insn, s32 offset)
1267 BUG_ON(!aarch64_insn_is_adrp(insn));
1268 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_ADR, insn,
1275 u32 aarch64_insn_extract_system_reg(u32 insn)
1277 return (insn & 0x1FFFE0) >> 5;
1280 bool aarch32_insn_is_wide(u32 insn)
1282 return insn >= 0xe800;
1288 u32 aarch32_insn_extract_reg_num(u32 insn, int offset)
1290 return (insn & (0xf << offset)) >> offset;
1295 u32 aarch32_insn_mcr_extract_opc2(u32 insn)
1297 return (insn & (OPC2_MASK << OPC2_OFFSET)) >> OPC2_OFFSET;
1301 u32 aarch32_insn_mcr_extract_crm(u32 insn)
1303 return insn & CRM_MASK;
1317 u32 insn)
1327 insn |= AARCH64_INSN_SF_BIT;
1406 insn = aarch64_insn_encode_immediate(AARCH64_INSN_IMM_N, insn, n);
1407 insn = aarch64_insn_encode_immediate(AARCH64_INSN_IMM_R, insn, immr);
1408 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_S, insn, imms);
1417 u32 insn;
1421 insn = aarch64_insn_get_and_imm_value();
1424 insn = aarch64_insn_get_orr_imm_value();
1427 insn = aarch64_insn_get_eor_imm_value();
1430 insn = aarch64_insn_get_ands_imm_value();
1437 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, Rd);
1438 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, Rn);
1439 return aarch64_encode_immediate(imm, variant, insn);
1448 u32 insn;
1450 insn = aarch64_insn_get_extr_value();
1460 insn |= AARCH64_INSN_SF_BIT;
1461 insn = aarch64_insn_encode_immediate(AARCH64_INSN_IMM_N, insn, 1);
1468 insn = aarch64_insn_encode_immediate(AARCH64_INSN_IMM_S, insn, lsb);
1469 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, Rd);
1470 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, Rn);
1471 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, Rm);
1477 u32 insn;
1512 insn = aarch64_insn_get_dmb_value();
1513 insn &= ~GENMASK(11, 8);
1514 insn |= (opt << 8);
1516 return insn;