diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2015-02-19 10:00:34 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2015-02-19 10:00:34 -0500 |
commit | 661af35e5fd878f915ed05dbbfe383f64133f98c (patch) | |
tree | 956b7efd662b682224e61060552fdcf4201101bf /arch/mips/mm/uasm-mips.c | |
parent | ca5d25642e212f73492d332d95dc90ef46a0e8dc (diff) | |
parent | f296e7c48d3155991b99f41372e1786c5be03457 (diff) |
Merge branch 'mipsr6-for-3.20' of git://git.linux-mips.org/pub/scm/mchandras/linux into mips-for-linux-next
Diffstat (limited to 'arch/mips/mm/uasm-mips.c')
-rw-r--r-- | arch/mips/mm/uasm-mips.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/arch/mips/mm/uasm-mips.c b/arch/mips/mm/uasm-mips.c index 8e02291cfc0c..855fc8a6a3c5 100644 --- a/arch/mips/mm/uasm-mips.c +++ b/arch/mips/mm/uasm-mips.c | |||
@@ -38,6 +38,14 @@ | |||
38 | | (e) << RE_SH \ | 38 | | (e) << RE_SH \ |
39 | | (f) << FUNC_SH) | 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 | /* Define these when we are not the ISA the kernel is being compiled with. */ | 49 | /* Define these when we are not the ISA the kernel is being compiled with. */ |
42 | #ifdef CONFIG_CPU_MICROMIPS | 50 | #ifdef CONFIG_CPU_MICROMIPS |
43 | #define CL_uasm_i_b(buf, off) ISAOPC(_beq)(buf, 0, 0, off) | 51 | #define CL_uasm_i_b(buf, off) ISAOPC(_beq)(buf, 0, 0, off) |
@@ -62,7 +70,11 @@ static struct insn insn_table[] = { | |||
62 | { insn_bltzl, M(bcond_op, 0, bltzl_op, 0, 0, 0), RS | BIMM }, | 70 | { insn_bltzl, M(bcond_op, 0, bltzl_op, 0, 0, 0), RS | BIMM }, |
63 | { insn_bltz, M(bcond_op, 0, bltz_op, 0, 0, 0), RS | BIMM }, | 71 | { insn_bltz, M(bcond_op, 0, bltz_op, 0, 0, 0), RS | BIMM }, |
64 | { insn_bne, M(bne_op, 0, 0, 0, 0, 0), RS | RT | BIMM }, | 72 | { insn_bne, M(bne_op, 0, 0, 0, 0, 0), RS | RT | BIMM }, |
73 | #ifndef CONFIG_CPU_MIPSR6 | ||
65 | { insn_cache, M(cache_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 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 | { insn_daddiu, M(daddiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 78 | { insn_daddiu, M(daddiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
67 | { insn_daddu, M(spec_op, 0, 0, 0, 0, daddu_op), RS | RT | RD }, | 79 | { insn_daddu, M(spec_op, 0, 0, 0, 0, daddu_op), RS | RT | RD }, |
68 | { insn_dinsm, M(spec3_op, 0, 0, 0, 0, dinsm_op), RS | RT | RD | RE }, | 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 | { insn_jal, M(jal_op, 0, 0, 0, 0, 0), JIMM }, | 97 | { insn_jal, M(jal_op, 0, 0, 0, 0, 0), JIMM }, |
86 | { insn_jalr, M(spec_op, 0, 0, 0, 0, jalr_op), RS | RD }, | 98 | { insn_jalr, M(spec_op, 0, 0, 0, 0, jalr_op), RS | RD }, |
87 | { insn_j, M(j_op, 0, 0, 0, 0, 0), JIMM }, | 99 | { insn_j, M(j_op, 0, 0, 0, 0, 0), JIMM }, |
100 | #ifndef CONFIG_CPU_MIPSR6 | ||
88 | { insn_jr, M(spec_op, 0, 0, 0, 0, jr_op), RS }, | 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 | { insn_lb, M(lb_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 105 | { insn_lb, M(lb_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
90 | { insn_ld, M(ld_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 106 | { insn_ld, M(ld_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
91 | { insn_ldx, M(spec3_op, 0, 0, 0, ldx_op, lx_op), RS | RT | RD }, | 107 | { insn_ldx, M(spec3_op, 0, 0, 0, ldx_op, lx_op), RS | RT | RD }, |
92 | { insn_lh, M(lh_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 108 | { insn_lh, M(lh_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
109 | #ifndef CONFIG_CPU_MIPSR6 | ||
93 | { insn_lld, M(lld_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 110 | { insn_lld, M(lld_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
94 | { insn_ll, M(ll_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 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 | { insn_lui, M(lui_op, 0, 0, 0, 0, 0), RT | SIMM }, | 116 | { insn_lui, M(lui_op, 0, 0, 0, 0, 0), RT | SIMM }, |
96 | { insn_lw, M(lw_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 117 | { insn_lw, M(lw_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
97 | { insn_lwx, M(spec3_op, 0, 0, 0, lwx_op, lx_op), RS | RT | RD }, | 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 | { insn_mul, M(spec2_op, 0, 0, 0, 0, mul_op), RS | RT | RD}, | 125 | { insn_mul, M(spec2_op, 0, 0, 0, 0, mul_op), RS | RT | RD}, |
105 | { insn_ori, M(ori_op, 0, 0, 0, 0, 0), RS | RT | UIMM }, | 126 | { insn_ori, M(ori_op, 0, 0, 0, 0, 0), RS | RT | UIMM }, |
106 | { insn_or, M(spec_op, 0, 0, 0, 0, or_op), RS | RT | RD }, | 127 | { insn_or, M(spec_op, 0, 0, 0, 0, or_op), RS | RT | RD }, |
128 | #ifndef CONFIG_CPU_MIPSR6 | ||
107 | { insn_pref, M(pref_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 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 | { insn_rfe, M(cop0_op, cop_op, 0, 0, 0, rfe_op), 0 }, | 133 | { insn_rfe, M(cop0_op, cop_op, 0, 0, 0, rfe_op), 0 }, |
109 | { insn_rotr, M(spec_op, 1, 0, 0, 0, srl_op), RT | RD | RE }, | 134 | { insn_rotr, M(spec_op, 1, 0, 0, 0, srl_op), RT | RD | RE }, |
135 | #ifndef CONFIG_CPU_MIPSR6 | ||
110 | { insn_scd, M(scd_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 136 | { insn_scd, M(scd_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
111 | { insn_sc, M(sc_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 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 | { insn_sd, M(sd_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 142 | { insn_sd, M(sd_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
113 | { insn_sll, M(spec_op, 0, 0, 0, 0, sll_op), RT | RD | RE }, | 143 | { insn_sll, M(spec_op, 0, 0, 0, 0, sll_op), RT | RD | RE }, |
114 | { insn_sllv, M(spec_op, 0, 0, 0, 0, sllv_op), RS | RT | RD }, | 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 | op |= build_set(va_arg(ap, u32)); | 228 | op |= build_set(va_arg(ap, u32)); |
199 | if (ip->fields & SCIMM) | 229 | if (ip->fields & SCIMM) |
200 | op |= build_scimm(va_arg(ap, u32)); | 230 | op |= build_scimm(va_arg(ap, u32)); |
231 | if (ip->fields & SIMM9) | ||
232 | op |= build_scimm9(va_arg(ap, u32)); | ||
201 | va_end(ap); | 233 | va_end(ap); |
202 | 234 | ||
203 | **buf = op; | 235 | **buf = op; |