Skip to content

Commit a168b8f

Browse files
Leonid YegoshinMarkos Chandras
authored andcommitted
MIPS: mm: Add MIPS R6 instruction encodings
MIPS R6 defines new opcodes for ll, sc, cache and pref instructions so we need to take these into consideration in the micro-assembler. Signed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
1 parent 51eec48 commit a168b8f

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

arch/mips/include/uapi/asm/inst.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,12 @@ enum spec3_op {
8383
swe_op = 0x1f, bshfl_op = 0x20,
8484
swle_op = 0x21, swre_op = 0x22,
8585
prefe_op = 0x23, dbshfl_op = 0x24,
86-
lbue_op = 0x28, lhue_op = 0x29,
87-
lbe_op = 0x2c, lhe_op = 0x2d,
88-
lle_op = 0x2e, lwe_op = 0x2f,
86+
cache6_op = 0x25, sc6_op = 0x26,
87+
scd6_op = 0x27, lbue_op = 0x28,
88+
lhue_op = 0x29, lbe_op = 0x2c,
89+
lhe_op = 0x2d, lle_op = 0x2e,
90+
lwe_op = 0x2f, pref6_op = 0x35,
91+
ll6_op = 0x36, lld6_op = 0x37,
8992
rdhwr_op = 0x3b
9093
};
9194

arch/mips/mm/uasm-mips.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@
3838
| (e) << RE_SH \
3939
| (f) << FUNC_SH)
4040

41+
/* This macro sets the non-variable bits of an R6 instruction. */
42+
#define M6(a, b, c, d, e) \
43+
((a) << OP_SH \
44+
| (b) << RS_SH \
45+
| (c) << RT_SH \
46+
| (d) << SIMM9_SH \
47+
| (e) << FUNC_SH)
48+
4149
/* Define these when we are not the ISA the kernel is being compiled with. */
4250
#ifdef CONFIG_CPU_MICROMIPS
4351
#define CL_uasm_i_b(buf, off) ISAOPC(_beq)(buf, 0, 0, off)
@@ -62,7 +70,11 @@ static struct insn insn_table[] = {
6270
{ insn_bltzl, M(bcond_op, 0, bltzl_op, 0, 0, 0), RS | BIMM },
6371
{ insn_bltz, M(bcond_op, 0, bltz_op, 0, 0, 0), RS | BIMM },
6472
{ insn_bne, M(bne_op, 0, 0, 0, 0, 0), RS | RT | BIMM },
73+
#ifndef CONFIG_CPU_MIPSR6
6574
{ insn_cache, M(cache_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
75+
#else
76+
{ insn_cache, M6(cache_op, 0, 0, 0, cache6_op), RS | RT | SIMM9 },
77+
#endif
6678
{ insn_daddiu, M(daddiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
6779
{ insn_daddu, M(spec_op, 0, 0, 0, 0, daddu_op), RS | RT | RD },
6880
{ insn_dinsm, M(spec3_op, 0, 0, 0, 0, dinsm_op), RS | RT | RD | RE },
@@ -85,13 +97,22 @@ static struct insn insn_table[] = {
8597
{ insn_jal, M(jal_op, 0, 0, 0, 0, 0), JIMM },
8698
{ insn_jalr, M(spec_op, 0, 0, 0, 0, jalr_op), RS | RD },
8799
{ insn_j, M(j_op, 0, 0, 0, 0, 0), JIMM },
100+
#ifndef CONFIG_CPU_MIPSR6
88101
{ insn_jr, M(spec_op, 0, 0, 0, 0, jr_op), RS },
102+
#else
103+
{ insn_jr, M(spec_op, 0, 0, 0, 0, jalr_op), RS },
104+
#endif
89105
{ insn_lb, M(lb_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
90106
{ insn_ld, M(ld_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
91107
{ insn_ldx, M(spec3_op, 0, 0, 0, ldx_op, lx_op), RS | RT | RD },
92108
{ insn_lh, M(lh_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
109+
#ifndef CONFIG_CPU_MIPSR6
93110
{ insn_lld, M(lld_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
94111
{ insn_ll, M(ll_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
112+
#else
113+
{ insn_lld, M6(spec3_op, 0, 0, 0, lld6_op), RS | RT | SIMM9 },
114+
{ insn_ll, M6(spec3_op, 0, 0, 0, ll6_op), RS | RT | SIMM9 },
115+
#endif
95116
{ insn_lui, M(lui_op, 0, 0, 0, 0, 0), RT | SIMM },
96117
{ insn_lw, M(lw_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
97118
{ insn_lwx, M(spec3_op, 0, 0, 0, lwx_op, lx_op), RS | RT | RD },
@@ -104,11 +125,20 @@ static struct insn insn_table[] = {
104125
{ insn_mul, M(spec2_op, 0, 0, 0, 0, mul_op), RS | RT | RD},
105126
{ insn_ori, M(ori_op, 0, 0, 0, 0, 0), RS | RT | UIMM },
106127
{ insn_or, M(spec_op, 0, 0, 0, 0, or_op), RS | RT | RD },
128+
#ifndef CONFIG_CPU_MIPSR6
107129
{ insn_pref, M(pref_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
130+
#else
131+
{ insn_pref, M6(spec3_op, 0, 0, 0, pref6_op), RS | RT | SIMM9 },
132+
#endif
108133
{ insn_rfe, M(cop0_op, cop_op, 0, 0, 0, rfe_op), 0 },
109134
{ insn_rotr, M(spec_op, 1, 0, 0, 0, srl_op), RT | RD | RE },
135+
#ifndef CONFIG_CPU_MIPSR6
110136
{ insn_scd, M(scd_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
111137
{ insn_sc, M(sc_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
138+
#else
139+
{ insn_scd, M6(spec3_op, 0, 0, 0, scd6_op), RS | RT | SIMM9 },
140+
{ insn_sc, M6(spec3_op, 0, 0, 0, sc6_op), RS | RT | SIMM9 },
141+
#endif
112142
{ insn_sd, M(sd_op, 0, 0, 0, 0, 0), RS | RT | SIMM },
113143
{ insn_sll, M(spec_op, 0, 0, 0, 0, sll_op), RT | RD | RE },
114144
{ insn_sllv, M(spec_op, 0, 0, 0, 0, sllv_op), RS | RT | RD },
@@ -198,6 +228,8 @@ static void build_insn(u32 **buf, enum opcode opc, ...)
198228
op |= build_set(va_arg(ap, u32));
199229
if (ip->fields & SCIMM)
200230
op |= build_scimm(va_arg(ap, u32));
231+
if (ip->fields & SIMM9)
232+
op |= build_scimm9(va_arg(ap, u32));
201233
va_end(ap);
202234

203235
**buf = op;

0 commit comments

Comments
 (0)