18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
38c2ecf20Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
48c2ecf20Sopenharmony_ci * for more details.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * A small micro-assembler. It is intentionally kept simple, does only
78c2ecf20Sopenharmony_ci * support a subset of instructions, and does not try to hide pipeline
88c2ecf20Sopenharmony_ci * effects like branch delay slots.
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * Copyright (C) 2004, 2005, 2006, 2008	 Thiemo Seufer
118c2ecf20Sopenharmony_ci * Copyright (C) 2005, 2007  Maciej W. Rozycki
128c2ecf20Sopenharmony_ci * Copyright (C) 2006  Ralf Baechle (ralf@linux-mips.org)
138c2ecf20Sopenharmony_ci * Copyright (C) 2012, 2013  MIPS Technologies, Inc.  All rights reserved.
148c2ecf20Sopenharmony_ci */
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_cienum fields {
178c2ecf20Sopenharmony_ci	RS = 0x001,
188c2ecf20Sopenharmony_ci	RT = 0x002,
198c2ecf20Sopenharmony_ci	RD = 0x004,
208c2ecf20Sopenharmony_ci	RE = 0x008,
218c2ecf20Sopenharmony_ci	SIMM = 0x010,
228c2ecf20Sopenharmony_ci	UIMM = 0x020,
238c2ecf20Sopenharmony_ci	BIMM = 0x040,
248c2ecf20Sopenharmony_ci	JIMM = 0x080,
258c2ecf20Sopenharmony_ci	FUNC = 0x100,
268c2ecf20Sopenharmony_ci	SET = 0x200,
278c2ecf20Sopenharmony_ci	SCIMM = 0x400,
288c2ecf20Sopenharmony_ci	SIMM9 = 0x800,
298c2ecf20Sopenharmony_ci};
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#define OP_MASK		0x3f
328c2ecf20Sopenharmony_ci#define OP_SH		26
338c2ecf20Sopenharmony_ci#define RD_MASK		0x1f
348c2ecf20Sopenharmony_ci#define RD_SH		11
358c2ecf20Sopenharmony_ci#define RE_MASK		0x1f
368c2ecf20Sopenharmony_ci#define RE_SH		6
378c2ecf20Sopenharmony_ci#define IMM_MASK	0xffff
388c2ecf20Sopenharmony_ci#define IMM_SH		0
398c2ecf20Sopenharmony_ci#define JIMM_MASK	0x3ffffff
408c2ecf20Sopenharmony_ci#define JIMM_SH		0
418c2ecf20Sopenharmony_ci#define FUNC_MASK	0x3f
428c2ecf20Sopenharmony_ci#define FUNC_SH		0
438c2ecf20Sopenharmony_ci#define SET_MASK	0x7
448c2ecf20Sopenharmony_ci#define SET_SH		0
458c2ecf20Sopenharmony_ci#define SIMM9_SH	7
468c2ecf20Sopenharmony_ci#define SIMM9_MASK	0x1ff
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cienum opcode {
498c2ecf20Sopenharmony_ci	insn_addiu, insn_addu, insn_and, insn_andi, insn_bbit0, insn_bbit1,
508c2ecf20Sopenharmony_ci	insn_beq, insn_beql, insn_bgez, insn_bgezl, insn_bgtz, insn_blez,
518c2ecf20Sopenharmony_ci	insn_bltz, insn_bltzl, insn_bne, insn_break, insn_cache, insn_cfc1,
528c2ecf20Sopenharmony_ci	insn_cfcmsa, insn_ctc1, insn_ctcmsa, insn_daddiu, insn_daddu, insn_ddivu,
538c2ecf20Sopenharmony_ci	insn_ddivu_r6, insn_di, insn_dins, insn_dinsm, insn_dinsu, insn_divu,
548c2ecf20Sopenharmony_ci	insn_divu_r6, insn_dmfc0, insn_dmodu, insn_dmtc0, insn_dmultu,
558c2ecf20Sopenharmony_ci	insn_dmulu, insn_drotr, insn_drotr32, insn_dsbh, insn_dshd, insn_dsll,
568c2ecf20Sopenharmony_ci	insn_dsll32, insn_dsllv, insn_dsra, insn_dsra32, insn_dsrav, insn_dsrl,
578c2ecf20Sopenharmony_ci	insn_dsrl32, insn_dsrlv, insn_dsubu, insn_eret, insn_ext, insn_ins,
588c2ecf20Sopenharmony_ci	insn_j, insn_jal, insn_jalr, insn_jr, insn_lb, insn_lbu, insn_ld,
598c2ecf20Sopenharmony_ci	insn_lddir, insn_ldpte, insn_ldx, insn_lh, insn_lhu, insn_ll, insn_lld,
608c2ecf20Sopenharmony_ci	insn_lui, insn_lw, insn_lwu, insn_lwx, insn_mfc0, insn_mfhc0, insn_mfhi,
618c2ecf20Sopenharmony_ci	insn_mflo, insn_modu, insn_movn, insn_movz, insn_mtc0, insn_mthc0,
628c2ecf20Sopenharmony_ci	insn_mthi, insn_mtlo, insn_mul, insn_multu, insn_mulu, insn_nor,
638c2ecf20Sopenharmony_ci	insn_or, insn_ori, insn_pref, insn_rfe, insn_rotr, insn_sb, insn_sc,
648c2ecf20Sopenharmony_ci	insn_scd, insn_seleqz, insn_selnez, insn_sd, insn_sh, insn_sll,
658c2ecf20Sopenharmony_ci	insn_sllv, insn_slt, insn_slti, insn_sltiu, insn_sltu, insn_sra,
668c2ecf20Sopenharmony_ci	insn_srav, insn_srl, insn_srlv, insn_subu, insn_sw, insn_sync,
678c2ecf20Sopenharmony_ci	insn_syscall, insn_tlbp, insn_tlbr, insn_tlbwi, insn_tlbwr, insn_wait,
688c2ecf20Sopenharmony_ci	insn_wsbh, insn_xor, insn_xori, insn_yield,
698c2ecf20Sopenharmony_ci	insn_invalid /* insn_invalid must be last */
708c2ecf20Sopenharmony_ci};
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistruct insn {
738c2ecf20Sopenharmony_ci	u32 match;
748c2ecf20Sopenharmony_ci	enum fields fields;
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_cistatic inline u32 build_rs(u32 arg)
788c2ecf20Sopenharmony_ci{
798c2ecf20Sopenharmony_ci	WARN(arg & ~RS_MASK, KERN_WARNING "Micro-assembler field overflow\n");
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci	return (arg & RS_MASK) << RS_SH;
828c2ecf20Sopenharmony_ci}
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_cistatic inline u32 build_rt(u32 arg)
858c2ecf20Sopenharmony_ci{
868c2ecf20Sopenharmony_ci	WARN(arg & ~RT_MASK, KERN_WARNING "Micro-assembler field overflow\n");
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci	return (arg & RT_MASK) << RT_SH;
898c2ecf20Sopenharmony_ci}
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_cistatic inline u32 build_rd(u32 arg)
928c2ecf20Sopenharmony_ci{
938c2ecf20Sopenharmony_ci	WARN(arg & ~RD_MASK, KERN_WARNING "Micro-assembler field overflow\n");
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	return (arg & RD_MASK) << RD_SH;
968c2ecf20Sopenharmony_ci}
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cistatic inline u32 build_re(u32 arg)
998c2ecf20Sopenharmony_ci{
1008c2ecf20Sopenharmony_ci	WARN(arg & ~RE_MASK, KERN_WARNING "Micro-assembler field overflow\n");
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	return (arg & RE_MASK) << RE_SH;
1038c2ecf20Sopenharmony_ci}
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistatic inline u32 build_simm(s32 arg)
1068c2ecf20Sopenharmony_ci{
1078c2ecf20Sopenharmony_ci	WARN(arg > 0x7fff || arg < -0x8000,
1088c2ecf20Sopenharmony_ci	     KERN_WARNING "Micro-assembler field overflow\n");
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	return arg & 0xffff;
1118c2ecf20Sopenharmony_ci}
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_cistatic inline u32 build_uimm(u32 arg)
1148c2ecf20Sopenharmony_ci{
1158c2ecf20Sopenharmony_ci	WARN(arg & ~IMM_MASK, KERN_WARNING "Micro-assembler field overflow\n");
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci	return arg & IMM_MASK;
1188c2ecf20Sopenharmony_ci}
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_cistatic inline u32 build_scimm(u32 arg)
1218c2ecf20Sopenharmony_ci{
1228c2ecf20Sopenharmony_ci	WARN(arg & ~SCIMM_MASK,
1238c2ecf20Sopenharmony_ci	     KERN_WARNING "Micro-assembler field overflow\n");
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	return (arg & SCIMM_MASK) << SCIMM_SH;
1268c2ecf20Sopenharmony_ci}
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_cistatic inline u32 build_scimm9(s32 arg)
1298c2ecf20Sopenharmony_ci{
1308c2ecf20Sopenharmony_ci	WARN((arg > 0xff || arg < -0x100),
1318c2ecf20Sopenharmony_ci	       KERN_WARNING "Micro-assembler field overflow\n");
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci	return (arg & SIMM9_MASK) << SIMM9_SH;
1348c2ecf20Sopenharmony_ci}
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_cistatic inline u32 build_func(u32 arg)
1378c2ecf20Sopenharmony_ci{
1388c2ecf20Sopenharmony_ci	WARN(arg & ~FUNC_MASK, KERN_WARNING "Micro-assembler field overflow\n");
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	return arg & FUNC_MASK;
1418c2ecf20Sopenharmony_ci}
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_cistatic inline u32 build_set(u32 arg)
1448c2ecf20Sopenharmony_ci{
1458c2ecf20Sopenharmony_ci	WARN(arg & ~SET_MASK, KERN_WARNING "Micro-assembler field overflow\n");
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci	return arg & SET_MASK;
1488c2ecf20Sopenharmony_ci}
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_cistatic void build_insn(u32 **buf, enum opcode opc, ...);
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci#define I_u1u2u3(op)					\
1538c2ecf20Sopenharmony_ciIp_u1u2u3(op)						\
1548c2ecf20Sopenharmony_ci{							\
1558c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, a, b, c);		\
1568c2ecf20Sopenharmony_ci}							\
1578c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci#define I_s3s1s2(op)					\
1608c2ecf20Sopenharmony_ciIp_s3s1s2(op)						\
1618c2ecf20Sopenharmony_ci{							\
1628c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, c, a);		\
1638c2ecf20Sopenharmony_ci}							\
1648c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci#define I_u2u1u3(op)					\
1678c2ecf20Sopenharmony_ciIp_u2u1u3(op)						\
1688c2ecf20Sopenharmony_ci{							\
1698c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, a, c);		\
1708c2ecf20Sopenharmony_ci}							\
1718c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci#define I_u3u2u1(op)					\
1748c2ecf20Sopenharmony_ciIp_u3u2u1(op)						\
1758c2ecf20Sopenharmony_ci{							\
1768c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, c, b, a);		\
1778c2ecf20Sopenharmony_ci}							\
1788c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci#define I_u3u1u2(op)					\
1818c2ecf20Sopenharmony_ciIp_u3u1u2(op)						\
1828c2ecf20Sopenharmony_ci{							\
1838c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, c, a);		\
1848c2ecf20Sopenharmony_ci}							\
1858c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci#define I_u1u2s3(op)					\
1888c2ecf20Sopenharmony_ciIp_u1u2s3(op)						\
1898c2ecf20Sopenharmony_ci{							\
1908c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, a, b, c);		\
1918c2ecf20Sopenharmony_ci}							\
1928c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci#define I_u2s3u1(op)					\
1958c2ecf20Sopenharmony_ciIp_u2s3u1(op)						\
1968c2ecf20Sopenharmony_ci{							\
1978c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, c, a, b);		\
1988c2ecf20Sopenharmony_ci}							\
1998c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ci#define I_u2u1s3(op)					\
2028c2ecf20Sopenharmony_ciIp_u2u1s3(op)						\
2038c2ecf20Sopenharmony_ci{							\
2048c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, a, c);		\
2058c2ecf20Sopenharmony_ci}							\
2068c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci#define I_u2u1msbu3(op)					\
2098c2ecf20Sopenharmony_ciIp_u2u1msbu3(op)					\
2108c2ecf20Sopenharmony_ci{							\
2118c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, a, c+d-1, c);	\
2128c2ecf20Sopenharmony_ci}							\
2138c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci#define I_u2u1msb32u3(op)				\
2168c2ecf20Sopenharmony_ciIp_u2u1msbu3(op)					\
2178c2ecf20Sopenharmony_ci{							\
2188c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, a, c+d-33, c);	\
2198c2ecf20Sopenharmony_ci}							\
2208c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci#define I_u2u1msb32msb3(op)				\
2238c2ecf20Sopenharmony_ciIp_u2u1msbu3(op)					\
2248c2ecf20Sopenharmony_ci{							\
2258c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, a, c+d-33, c-32);	\
2268c2ecf20Sopenharmony_ci}							\
2278c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_ci#define I_u2u1msbdu3(op)				\
2308c2ecf20Sopenharmony_ciIp_u2u1msbu3(op)					\
2318c2ecf20Sopenharmony_ci{							\
2328c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, a, d-1, c);	\
2338c2ecf20Sopenharmony_ci}							\
2348c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_ci#define I_u1u2(op)					\
2378c2ecf20Sopenharmony_ciIp_u1u2(op)						\
2388c2ecf20Sopenharmony_ci{							\
2398c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, a, b);		\
2408c2ecf20Sopenharmony_ci}							\
2418c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci#define I_u2u1(op)					\
2448c2ecf20Sopenharmony_ciIp_u1u2(op)						\
2458c2ecf20Sopenharmony_ci{							\
2468c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, b, a);		\
2478c2ecf20Sopenharmony_ci}							\
2488c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ci#define I_u1s2(op)					\
2518c2ecf20Sopenharmony_ciIp_u1s2(op)						\
2528c2ecf20Sopenharmony_ci{							\
2538c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, a, b);		\
2548c2ecf20Sopenharmony_ci}							\
2558c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ci#define I_u1(op)					\
2588c2ecf20Sopenharmony_ciIp_u1(op)						\
2598c2ecf20Sopenharmony_ci{							\
2608c2ecf20Sopenharmony_ci	build_insn(buf, insn##op, a);			\
2618c2ecf20Sopenharmony_ci}							\
2628c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ci#define I_0(op)						\
2658c2ecf20Sopenharmony_ciIp_0(op)						\
2668c2ecf20Sopenharmony_ci{							\
2678c2ecf20Sopenharmony_ci	build_insn(buf, insn##op);			\
2688c2ecf20Sopenharmony_ci}							\
2698c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i##op);
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ciI_u2u1s3(_addiu)
2728c2ecf20Sopenharmony_ciI_u3u1u2(_addu)
2738c2ecf20Sopenharmony_ciI_u2u1u3(_andi)
2748c2ecf20Sopenharmony_ciI_u3u1u2(_and)
2758c2ecf20Sopenharmony_ciI_u1u2s3(_beq)
2768c2ecf20Sopenharmony_ciI_u1u2s3(_beql)
2778c2ecf20Sopenharmony_ciI_u1s2(_bgez)
2788c2ecf20Sopenharmony_ciI_u1s2(_bgezl)
2798c2ecf20Sopenharmony_ciI_u1s2(_bgtz)
2808c2ecf20Sopenharmony_ciI_u1s2(_blez)
2818c2ecf20Sopenharmony_ciI_u1s2(_bltz)
2828c2ecf20Sopenharmony_ciI_u1s2(_bltzl)
2838c2ecf20Sopenharmony_ciI_u1u2s3(_bne)
2848c2ecf20Sopenharmony_ciI_u1(_break)
2858c2ecf20Sopenharmony_ciI_u2s3u1(_cache)
2868c2ecf20Sopenharmony_ciI_u1u2(_cfc1)
2878c2ecf20Sopenharmony_ciI_u2u1(_cfcmsa)
2888c2ecf20Sopenharmony_ciI_u1u2(_ctc1)
2898c2ecf20Sopenharmony_ciI_u2u1(_ctcmsa)
2908c2ecf20Sopenharmony_ciI_u1u2(_ddivu)
2918c2ecf20Sopenharmony_ciI_u3u1u2(_ddivu_r6)
2928c2ecf20Sopenharmony_ciI_u1u2u3(_dmfc0)
2938c2ecf20Sopenharmony_ciI_u3u1u2(_dmodu)
2948c2ecf20Sopenharmony_ciI_u1u2u3(_dmtc0)
2958c2ecf20Sopenharmony_ciI_u1u2(_dmultu)
2968c2ecf20Sopenharmony_ciI_u3u1u2(_dmulu)
2978c2ecf20Sopenharmony_ciI_u2u1s3(_daddiu)
2988c2ecf20Sopenharmony_ciI_u3u1u2(_daddu)
2998c2ecf20Sopenharmony_ciI_u1(_di);
3008c2ecf20Sopenharmony_ciI_u1u2(_divu)
3018c2ecf20Sopenharmony_ciI_u3u1u2(_divu_r6)
3028c2ecf20Sopenharmony_ciI_u2u1(_dsbh);
3038c2ecf20Sopenharmony_ciI_u2u1(_dshd);
3048c2ecf20Sopenharmony_ciI_u2u1u3(_dsll)
3058c2ecf20Sopenharmony_ciI_u2u1u3(_dsll32)
3068c2ecf20Sopenharmony_ciI_u3u2u1(_dsllv)
3078c2ecf20Sopenharmony_ciI_u2u1u3(_dsra)
3088c2ecf20Sopenharmony_ciI_u2u1u3(_dsra32)
3098c2ecf20Sopenharmony_ciI_u3u2u1(_dsrav)
3108c2ecf20Sopenharmony_ciI_u2u1u3(_dsrl)
3118c2ecf20Sopenharmony_ciI_u2u1u3(_dsrl32)
3128c2ecf20Sopenharmony_ciI_u3u2u1(_dsrlv)
3138c2ecf20Sopenharmony_ciI_u2u1u3(_drotr)
3148c2ecf20Sopenharmony_ciI_u2u1u3(_drotr32)
3158c2ecf20Sopenharmony_ciI_u3u1u2(_dsubu)
3168c2ecf20Sopenharmony_ciI_0(_eret)
3178c2ecf20Sopenharmony_ciI_u2u1msbdu3(_ext)
3188c2ecf20Sopenharmony_ciI_u2u1msbu3(_ins)
3198c2ecf20Sopenharmony_ciI_u1(_j)
3208c2ecf20Sopenharmony_ciI_u1(_jal)
3218c2ecf20Sopenharmony_ciI_u2u1(_jalr)
3228c2ecf20Sopenharmony_ciI_u1(_jr)
3238c2ecf20Sopenharmony_ciI_u2s3u1(_lb)
3248c2ecf20Sopenharmony_ciI_u2s3u1(_lbu)
3258c2ecf20Sopenharmony_ciI_u2s3u1(_ld)
3268c2ecf20Sopenharmony_ciI_u2s3u1(_lh)
3278c2ecf20Sopenharmony_ciI_u2s3u1(_lhu)
3288c2ecf20Sopenharmony_ciI_u2s3u1(_ll)
3298c2ecf20Sopenharmony_ciI_u2s3u1(_lld)
3308c2ecf20Sopenharmony_ciI_u1s2(_lui)
3318c2ecf20Sopenharmony_ciI_u2s3u1(_lw)
3328c2ecf20Sopenharmony_ciI_u2s3u1(_lwu)
3338c2ecf20Sopenharmony_ciI_u1u2u3(_mfc0)
3348c2ecf20Sopenharmony_ciI_u1u2u3(_mfhc0)
3358c2ecf20Sopenharmony_ciI_u3u1u2(_modu)
3368c2ecf20Sopenharmony_ciI_u3u1u2(_movn)
3378c2ecf20Sopenharmony_ciI_u3u1u2(_movz)
3388c2ecf20Sopenharmony_ciI_u1(_mfhi)
3398c2ecf20Sopenharmony_ciI_u1(_mflo)
3408c2ecf20Sopenharmony_ciI_u1u2u3(_mtc0)
3418c2ecf20Sopenharmony_ciI_u1u2u3(_mthc0)
3428c2ecf20Sopenharmony_ciI_u1(_mthi)
3438c2ecf20Sopenharmony_ciI_u1(_mtlo)
3448c2ecf20Sopenharmony_ciI_u3u1u2(_mul)
3458c2ecf20Sopenharmony_ciI_u1u2(_multu)
3468c2ecf20Sopenharmony_ciI_u3u1u2(_mulu)
3478c2ecf20Sopenharmony_ciI_u3u1u2(_nor)
3488c2ecf20Sopenharmony_ciI_u3u1u2(_or)
3498c2ecf20Sopenharmony_ciI_u2u1u3(_ori)
3508c2ecf20Sopenharmony_ciI_0(_rfe)
3518c2ecf20Sopenharmony_ciI_u2s3u1(_sb)
3528c2ecf20Sopenharmony_ciI_u2s3u1(_sc)
3538c2ecf20Sopenharmony_ciI_u2s3u1(_scd)
3548c2ecf20Sopenharmony_ciI_u2s3u1(_sd)
3558c2ecf20Sopenharmony_ciI_u3u1u2(_seleqz)
3568c2ecf20Sopenharmony_ciI_u3u1u2(_selnez)
3578c2ecf20Sopenharmony_ciI_u2s3u1(_sh)
3588c2ecf20Sopenharmony_ciI_u2u1u3(_sll)
3598c2ecf20Sopenharmony_ciI_u3u2u1(_sllv)
3608c2ecf20Sopenharmony_ciI_s3s1s2(_slt)
3618c2ecf20Sopenharmony_ciI_u2u1s3(_slti)
3628c2ecf20Sopenharmony_ciI_u2u1s3(_sltiu)
3638c2ecf20Sopenharmony_ciI_u3u1u2(_sltu)
3648c2ecf20Sopenharmony_ciI_u2u1u3(_sra)
3658c2ecf20Sopenharmony_ciI_u3u2u1(_srav)
3668c2ecf20Sopenharmony_ciI_u2u1u3(_srl)
3678c2ecf20Sopenharmony_ciI_u3u2u1(_srlv)
3688c2ecf20Sopenharmony_ciI_u2u1u3(_rotr)
3698c2ecf20Sopenharmony_ciI_u3u1u2(_subu)
3708c2ecf20Sopenharmony_ciI_u2s3u1(_sw)
3718c2ecf20Sopenharmony_ciI_u1(_sync)
3728c2ecf20Sopenharmony_ciI_0(_tlbp)
3738c2ecf20Sopenharmony_ciI_0(_tlbr)
3748c2ecf20Sopenharmony_ciI_0(_tlbwi)
3758c2ecf20Sopenharmony_ciI_0(_tlbwr)
3768c2ecf20Sopenharmony_ciI_u1(_wait);
3778c2ecf20Sopenharmony_ciI_u2u1(_wsbh)
3788c2ecf20Sopenharmony_ciI_u3u1u2(_xor)
3798c2ecf20Sopenharmony_ciI_u2u1u3(_xori)
3808c2ecf20Sopenharmony_ciI_u2u1(_yield)
3818c2ecf20Sopenharmony_ciI_u2u1msbu3(_dins);
3828c2ecf20Sopenharmony_ciI_u2u1msb32u3(_dinsm);
3838c2ecf20Sopenharmony_ciI_u2u1msb32msb3(_dinsu);
3848c2ecf20Sopenharmony_ciI_u1(_syscall);
3858c2ecf20Sopenharmony_ciI_u1u2s3(_bbit0);
3868c2ecf20Sopenharmony_ciI_u1u2s3(_bbit1);
3878c2ecf20Sopenharmony_ciI_u3u1u2(_lwx)
3888c2ecf20Sopenharmony_ciI_u3u1u2(_ldx)
3898c2ecf20Sopenharmony_ciI_u1u2(_ldpte)
3908c2ecf20Sopenharmony_ciI_u2u1u3(_lddir)
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_CAVIUM_OCTEON
3938c2ecf20Sopenharmony_ci#include <asm/octeon/octeon.h>
3948c2ecf20Sopenharmony_civoid uasm_i_pref(u32 **buf, unsigned int a, signed int b,
3958c2ecf20Sopenharmony_ci			    unsigned int c)
3968c2ecf20Sopenharmony_ci{
3978c2ecf20Sopenharmony_ci	if (OCTEON_IS_MODEL(OCTEON_CN6XXX) && a <= 24 && a != 5)
3988c2ecf20Sopenharmony_ci		/*
3998c2ecf20Sopenharmony_ci		 * As per erratum Core-14449, replace prefetches 0-4,
4008c2ecf20Sopenharmony_ci		 * 6-24 with 'pref 28'.
4018c2ecf20Sopenharmony_ci		 */
4028c2ecf20Sopenharmony_ci		build_insn(buf, insn_pref, c, 28, b);
4038c2ecf20Sopenharmony_ci	else
4048c2ecf20Sopenharmony_ci		build_insn(buf, insn_pref, c, a, b);
4058c2ecf20Sopenharmony_ci}
4068c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_i_pref);
4078c2ecf20Sopenharmony_ci#else
4088c2ecf20Sopenharmony_ciI_u2s3u1(_pref)
4098c2ecf20Sopenharmony_ci#endif
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ci/* Handle labels. */
4128c2ecf20Sopenharmony_civoid uasm_build_label(struct uasm_label **lab, u32 *addr, int lid)
4138c2ecf20Sopenharmony_ci{
4148c2ecf20Sopenharmony_ci	(*lab)->addr = addr;
4158c2ecf20Sopenharmony_ci	(*lab)->lab = lid;
4168c2ecf20Sopenharmony_ci	(*lab)++;
4178c2ecf20Sopenharmony_ci}
4188c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_build_label);
4198c2ecf20Sopenharmony_ci
4208c2ecf20Sopenharmony_ciint uasm_in_compat_space_p(long addr)
4218c2ecf20Sopenharmony_ci{
4228c2ecf20Sopenharmony_ci	/* Is this address in 32bit compat space? */
4238c2ecf20Sopenharmony_ci	return addr == (int)addr;
4248c2ecf20Sopenharmony_ci}
4258c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_in_compat_space_p);
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_cistatic int uasm_rel_highest(long val)
4288c2ecf20Sopenharmony_ci{
4298c2ecf20Sopenharmony_ci#ifdef CONFIG_64BIT
4308c2ecf20Sopenharmony_ci	return ((((val + 0x800080008000L) >> 48) & 0xffff) ^ 0x8000) - 0x8000;
4318c2ecf20Sopenharmony_ci#else
4328c2ecf20Sopenharmony_ci	return 0;
4338c2ecf20Sopenharmony_ci#endif
4348c2ecf20Sopenharmony_ci}
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_cistatic int uasm_rel_higher(long val)
4378c2ecf20Sopenharmony_ci{
4388c2ecf20Sopenharmony_ci#ifdef CONFIG_64BIT
4398c2ecf20Sopenharmony_ci	return ((((val + 0x80008000L) >> 32) & 0xffff) ^ 0x8000) - 0x8000;
4408c2ecf20Sopenharmony_ci#else
4418c2ecf20Sopenharmony_ci	return 0;
4428c2ecf20Sopenharmony_ci#endif
4438c2ecf20Sopenharmony_ci}
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ciint uasm_rel_hi(long val)
4468c2ecf20Sopenharmony_ci{
4478c2ecf20Sopenharmony_ci	return ((((val + 0x8000L) >> 16) & 0xffff) ^ 0x8000) - 0x8000;
4488c2ecf20Sopenharmony_ci}
4498c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_rel_hi);
4508c2ecf20Sopenharmony_ci
4518c2ecf20Sopenharmony_ciint uasm_rel_lo(long val)
4528c2ecf20Sopenharmony_ci{
4538c2ecf20Sopenharmony_ci	return ((val & 0xffff) ^ 0x8000) - 0x8000;
4548c2ecf20Sopenharmony_ci}
4558c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_rel_lo);
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_civoid UASM_i_LA_mostly(u32 **buf, unsigned int rs, long addr)
4588c2ecf20Sopenharmony_ci{
4598c2ecf20Sopenharmony_ci	if (!uasm_in_compat_space_p(addr)) {
4608c2ecf20Sopenharmony_ci		uasm_i_lui(buf, rs, uasm_rel_highest(addr));
4618c2ecf20Sopenharmony_ci		if (uasm_rel_higher(addr))
4628c2ecf20Sopenharmony_ci			uasm_i_daddiu(buf, rs, rs, uasm_rel_higher(addr));
4638c2ecf20Sopenharmony_ci		if (uasm_rel_hi(addr)) {
4648c2ecf20Sopenharmony_ci			uasm_i_dsll(buf, rs, rs, 16);
4658c2ecf20Sopenharmony_ci			uasm_i_daddiu(buf, rs, rs,
4668c2ecf20Sopenharmony_ci					uasm_rel_hi(addr));
4678c2ecf20Sopenharmony_ci			uasm_i_dsll(buf, rs, rs, 16);
4688c2ecf20Sopenharmony_ci		} else
4698c2ecf20Sopenharmony_ci			uasm_i_dsll32(buf, rs, rs, 0);
4708c2ecf20Sopenharmony_ci	} else
4718c2ecf20Sopenharmony_ci		uasm_i_lui(buf, rs, uasm_rel_hi(addr));
4728c2ecf20Sopenharmony_ci}
4738c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(UASM_i_LA_mostly);
4748c2ecf20Sopenharmony_ci
4758c2ecf20Sopenharmony_civoid UASM_i_LA(u32 **buf, unsigned int rs, long addr)
4768c2ecf20Sopenharmony_ci{
4778c2ecf20Sopenharmony_ci	UASM_i_LA_mostly(buf, rs, addr);
4788c2ecf20Sopenharmony_ci	if (uasm_rel_lo(addr)) {
4798c2ecf20Sopenharmony_ci		if (!uasm_in_compat_space_p(addr))
4808c2ecf20Sopenharmony_ci			uasm_i_daddiu(buf, rs, rs,
4818c2ecf20Sopenharmony_ci					uasm_rel_lo(addr));
4828c2ecf20Sopenharmony_ci		else
4838c2ecf20Sopenharmony_ci			uasm_i_addiu(buf, rs, rs,
4848c2ecf20Sopenharmony_ci					uasm_rel_lo(addr));
4858c2ecf20Sopenharmony_ci	}
4868c2ecf20Sopenharmony_ci}
4878c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(UASM_i_LA);
4888c2ecf20Sopenharmony_ci
4898c2ecf20Sopenharmony_ci/* Handle relocations. */
4908c2ecf20Sopenharmony_civoid uasm_r_mips_pc16(struct uasm_reloc **rel, u32 *addr, int lid)
4918c2ecf20Sopenharmony_ci{
4928c2ecf20Sopenharmony_ci	(*rel)->addr = addr;
4938c2ecf20Sopenharmony_ci	(*rel)->type = R_MIPS_PC16;
4948c2ecf20Sopenharmony_ci	(*rel)->lab = lid;
4958c2ecf20Sopenharmony_ci	(*rel)++;
4968c2ecf20Sopenharmony_ci}
4978c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_r_mips_pc16);
4988c2ecf20Sopenharmony_ci
4998c2ecf20Sopenharmony_cistatic inline void __resolve_relocs(struct uasm_reloc *rel,
5008c2ecf20Sopenharmony_ci				    struct uasm_label *lab);
5018c2ecf20Sopenharmony_ci
5028c2ecf20Sopenharmony_civoid uasm_resolve_relocs(struct uasm_reloc *rel,
5038c2ecf20Sopenharmony_ci				  struct uasm_label *lab)
5048c2ecf20Sopenharmony_ci{
5058c2ecf20Sopenharmony_ci	struct uasm_label *l;
5068c2ecf20Sopenharmony_ci
5078c2ecf20Sopenharmony_ci	for (; rel->lab != UASM_LABEL_INVALID; rel++)
5088c2ecf20Sopenharmony_ci		for (l = lab; l->lab != UASM_LABEL_INVALID; l++)
5098c2ecf20Sopenharmony_ci			if (rel->lab == l->lab)
5108c2ecf20Sopenharmony_ci				__resolve_relocs(rel, l);
5118c2ecf20Sopenharmony_ci}
5128c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_resolve_relocs);
5138c2ecf20Sopenharmony_ci
5148c2ecf20Sopenharmony_civoid uasm_move_relocs(struct uasm_reloc *rel, u32 *first, u32 *end,
5158c2ecf20Sopenharmony_ci			       long off)
5168c2ecf20Sopenharmony_ci{
5178c2ecf20Sopenharmony_ci	for (; rel->lab != UASM_LABEL_INVALID; rel++)
5188c2ecf20Sopenharmony_ci		if (rel->addr >= first && rel->addr < end)
5198c2ecf20Sopenharmony_ci			rel->addr += off;
5208c2ecf20Sopenharmony_ci}
5218c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_move_relocs);
5228c2ecf20Sopenharmony_ci
5238c2ecf20Sopenharmony_civoid uasm_move_labels(struct uasm_label *lab, u32 *first, u32 *end,
5248c2ecf20Sopenharmony_ci			       long off)
5258c2ecf20Sopenharmony_ci{
5268c2ecf20Sopenharmony_ci	for (; lab->lab != UASM_LABEL_INVALID; lab++)
5278c2ecf20Sopenharmony_ci		if (lab->addr >= first && lab->addr < end)
5288c2ecf20Sopenharmony_ci			lab->addr += off;
5298c2ecf20Sopenharmony_ci}
5308c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_move_labels);
5318c2ecf20Sopenharmony_ci
5328c2ecf20Sopenharmony_civoid uasm_copy_handler(struct uasm_reloc *rel, struct uasm_label *lab,
5338c2ecf20Sopenharmony_ci				u32 *first, u32 *end, u32 *target)
5348c2ecf20Sopenharmony_ci{
5358c2ecf20Sopenharmony_ci	long off = (long)(target - first);
5368c2ecf20Sopenharmony_ci
5378c2ecf20Sopenharmony_ci	memcpy(target, first, (end - first) * sizeof(u32));
5388c2ecf20Sopenharmony_ci
5398c2ecf20Sopenharmony_ci	uasm_move_relocs(rel, first, end, off);
5408c2ecf20Sopenharmony_ci	uasm_move_labels(lab, first, end, off);
5418c2ecf20Sopenharmony_ci}
5428c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_copy_handler);
5438c2ecf20Sopenharmony_ci
5448c2ecf20Sopenharmony_ciint uasm_insn_has_bdelay(struct uasm_reloc *rel, u32 *addr)
5458c2ecf20Sopenharmony_ci{
5468c2ecf20Sopenharmony_ci	for (; rel->lab != UASM_LABEL_INVALID; rel++) {
5478c2ecf20Sopenharmony_ci		if (rel->addr == addr
5488c2ecf20Sopenharmony_ci		    && (rel->type == R_MIPS_PC16
5498c2ecf20Sopenharmony_ci			|| rel->type == R_MIPS_26))
5508c2ecf20Sopenharmony_ci			return 1;
5518c2ecf20Sopenharmony_ci	}
5528c2ecf20Sopenharmony_ci
5538c2ecf20Sopenharmony_ci	return 0;
5548c2ecf20Sopenharmony_ci}
5558c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_insn_has_bdelay);
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_ci/* Convenience functions for labeled branches. */
5588c2ecf20Sopenharmony_civoid uasm_il_bltz(u32 **p, struct uasm_reloc **r, unsigned int reg,
5598c2ecf20Sopenharmony_ci			   int lid)
5608c2ecf20Sopenharmony_ci{
5618c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
5628c2ecf20Sopenharmony_ci	uasm_i_bltz(p, reg, 0);
5638c2ecf20Sopenharmony_ci}
5648c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_bltz);
5658c2ecf20Sopenharmony_ci
5668c2ecf20Sopenharmony_civoid uasm_il_b(u32 **p, struct uasm_reloc **r, int lid)
5678c2ecf20Sopenharmony_ci{
5688c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
5698c2ecf20Sopenharmony_ci	uasm_i_b(p, 0);
5708c2ecf20Sopenharmony_ci}
5718c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_b);
5728c2ecf20Sopenharmony_ci
5738c2ecf20Sopenharmony_civoid uasm_il_beq(u32 **p, struct uasm_reloc **r, unsigned int r1,
5748c2ecf20Sopenharmony_ci			  unsigned int r2, int lid)
5758c2ecf20Sopenharmony_ci{
5768c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
5778c2ecf20Sopenharmony_ci	uasm_i_beq(p, r1, r2, 0);
5788c2ecf20Sopenharmony_ci}
5798c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_beq);
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_civoid uasm_il_beqz(u32 **p, struct uasm_reloc **r, unsigned int reg,
5828c2ecf20Sopenharmony_ci			   int lid)
5838c2ecf20Sopenharmony_ci{
5848c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
5858c2ecf20Sopenharmony_ci	uasm_i_beqz(p, reg, 0);
5868c2ecf20Sopenharmony_ci}
5878c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_beqz);
5888c2ecf20Sopenharmony_ci
5898c2ecf20Sopenharmony_civoid uasm_il_beqzl(u32 **p, struct uasm_reloc **r, unsigned int reg,
5908c2ecf20Sopenharmony_ci			    int lid)
5918c2ecf20Sopenharmony_ci{
5928c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
5938c2ecf20Sopenharmony_ci	uasm_i_beqzl(p, reg, 0);
5948c2ecf20Sopenharmony_ci}
5958c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_beqzl);
5968c2ecf20Sopenharmony_ci
5978c2ecf20Sopenharmony_civoid uasm_il_bne(u32 **p, struct uasm_reloc **r, unsigned int reg1,
5988c2ecf20Sopenharmony_ci			  unsigned int reg2, int lid)
5998c2ecf20Sopenharmony_ci{
6008c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
6018c2ecf20Sopenharmony_ci	uasm_i_bne(p, reg1, reg2, 0);
6028c2ecf20Sopenharmony_ci}
6038c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_bne);
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_civoid uasm_il_bnez(u32 **p, struct uasm_reloc **r, unsigned int reg,
6068c2ecf20Sopenharmony_ci			   int lid)
6078c2ecf20Sopenharmony_ci{
6088c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
6098c2ecf20Sopenharmony_ci	uasm_i_bnez(p, reg, 0);
6108c2ecf20Sopenharmony_ci}
6118c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_bnez);
6128c2ecf20Sopenharmony_ci
6138c2ecf20Sopenharmony_civoid uasm_il_bgezl(u32 **p, struct uasm_reloc **r, unsigned int reg,
6148c2ecf20Sopenharmony_ci			    int lid)
6158c2ecf20Sopenharmony_ci{
6168c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
6178c2ecf20Sopenharmony_ci	uasm_i_bgezl(p, reg, 0);
6188c2ecf20Sopenharmony_ci}
6198c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_bgezl);
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_civoid uasm_il_bgez(u32 **p, struct uasm_reloc **r, unsigned int reg,
6228c2ecf20Sopenharmony_ci			   int lid)
6238c2ecf20Sopenharmony_ci{
6248c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
6258c2ecf20Sopenharmony_ci	uasm_i_bgez(p, reg, 0);
6268c2ecf20Sopenharmony_ci}
6278c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_bgez);
6288c2ecf20Sopenharmony_ci
6298c2ecf20Sopenharmony_civoid uasm_il_bbit0(u32 **p, struct uasm_reloc **r, unsigned int reg,
6308c2ecf20Sopenharmony_ci			    unsigned int bit, int lid)
6318c2ecf20Sopenharmony_ci{
6328c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
6338c2ecf20Sopenharmony_ci	uasm_i_bbit0(p, reg, bit, 0);
6348c2ecf20Sopenharmony_ci}
6358c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_bbit0);
6368c2ecf20Sopenharmony_ci
6378c2ecf20Sopenharmony_civoid uasm_il_bbit1(u32 **p, struct uasm_reloc **r, unsigned int reg,
6388c2ecf20Sopenharmony_ci			    unsigned int bit, int lid)
6398c2ecf20Sopenharmony_ci{
6408c2ecf20Sopenharmony_ci	uasm_r_mips_pc16(r, *p, lid);
6418c2ecf20Sopenharmony_ci	uasm_i_bbit1(p, reg, bit, 0);
6428c2ecf20Sopenharmony_ci}
6438c2ecf20Sopenharmony_ciUASM_EXPORT_SYMBOL(uasm_il_bbit1);
644