38
38
| (e) << RE_SH \
39
39
| (f) << FUNC_SH)
40
40
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
+
41
49
/* Define these when we are not the ISA the kernel is being compiled with. */
42
50
#ifdef CONFIG_CPU_MICROMIPS
43
51
#define CL_uasm_i_b (buf , off ) ISAOPC(_beq)(buf, 0, 0, off)
@@ -62,7 +70,11 @@ static struct insn insn_table[] = {
62
70
{ insn_bltzl , M (bcond_op , 0 , bltzl_op , 0 , 0 , 0 ), RS | BIMM },
63
71
{ insn_bltz , M (bcond_op , 0 , bltz_op , 0 , 0 , 0 ), RS | BIMM },
64
72
{ insn_bne , M (bne_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | BIMM },
73
+ #ifndef CONFIG_CPU_MIPSR6
65
74
{ 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
66
78
{ insn_daddiu , M (daddiu_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | SIMM },
67
79
{ insn_daddu , M (spec_op , 0 , 0 , 0 , 0 , daddu_op ), RS | RT | RD },
68
80
{ insn_dinsm , M (spec3_op , 0 , 0 , 0 , 0 , dinsm_op ), RS | RT | RD | RE },
@@ -85,13 +97,22 @@ static struct insn insn_table[] = {
85
97
{ insn_jal , M (jal_op , 0 , 0 , 0 , 0 , 0 ), JIMM },
86
98
{ insn_jalr , M (spec_op , 0 , 0 , 0 , 0 , jalr_op ), RS | RD },
87
99
{ insn_j , M (j_op , 0 , 0 , 0 , 0 , 0 ), JIMM },
100
+ #ifndef CONFIG_CPU_MIPSR6
88
101
{ 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
89
105
{ insn_lb , M (lb_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | SIMM },
90
106
{ insn_ld , M (ld_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | SIMM },
91
107
{ insn_ldx , M (spec3_op , 0 , 0 , 0 , ldx_op , lx_op ), RS | RT | RD },
92
108
{ insn_lh , M (lh_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | SIMM },
109
+ #ifndef CONFIG_CPU_MIPSR6
93
110
{ insn_lld , M (lld_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | SIMM },
94
111
{ 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
95
116
{ insn_lui , M (lui_op , 0 , 0 , 0 , 0 , 0 ), RT | SIMM },
96
117
{ insn_lw , M (lw_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | SIMM },
97
118
{ insn_lwx , M (spec3_op , 0 , 0 , 0 , lwx_op , lx_op ), RS | RT | RD },
@@ -104,11 +125,20 @@ static struct insn insn_table[] = {
104
125
{ insn_mul , M (spec2_op , 0 , 0 , 0 , 0 , mul_op ), RS | RT | RD },
105
126
{ insn_ori , M (ori_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | UIMM },
106
127
{ insn_or , M (spec_op , 0 , 0 , 0 , 0 , or_op ), RS | RT | RD },
128
+ #ifndef CONFIG_CPU_MIPSR6
107
129
{ 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
108
133
{ insn_rfe , M (cop0_op , cop_op , 0 , 0 , 0 , rfe_op ), 0 },
109
134
{ insn_rotr , M (spec_op , 1 , 0 , 0 , 0 , srl_op ), RT | RD | RE },
135
+ #ifndef CONFIG_CPU_MIPSR6
110
136
{ insn_scd , M (scd_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | SIMM },
111
137
{ 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
112
142
{ insn_sd , M (sd_op , 0 , 0 , 0 , 0 , 0 ), RS | RT | SIMM },
113
143
{ insn_sll , M (spec_op , 0 , 0 , 0 , 0 , sll_op ), RT | RD | RE },
114
144
{ 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, ...)
198
228
op |= build_set (va_arg (ap , u32 ));
199
229
if (ip -> fields & SCIMM )
200
230
op |= build_scimm (va_arg (ap , u32 ));
231
+ if (ip -> fields & SIMM9 )
232
+ op |= build_scimm9 (va_arg (ap , u32 ));
201
233
va_end (ap );
202
234
203
235
* * buf = op ;
0 commit comments