diff options
Diffstat (limited to 'dynasm/dasm_mips.lua')
-rw-r--r-- | dynasm/dasm_mips.lua | 684 |
1 files changed, 456 insertions, 228 deletions
diff --git a/dynasm/dasm_mips.lua b/dynasm/dasm_mips.lua index 9ef280e3..3e41df52 100644 --- a/dynasm/dasm_mips.lua +++ b/dynasm/dasm_mips.lua | |||
@@ -1,17 +1,20 @@ | |||
1 | ------------------------------------------------------------------------------ | 1 | ------------------------------------------------------------------------------ |
2 | -- DynASM MIPS module. | 2 | -- DynASM MIPS32/MIPS64 module. |
3 | -- | 3 | -- |
4 | -- Copyright (C) 2005-2020 Mike Pall. All rights reserved. | 4 | -- Copyright (C) 2005-2020 Mike Pall. All rights reserved. |
5 | -- See dynasm.lua for full copyright notice. | 5 | -- See dynasm.lua for full copyright notice. |
6 | ------------------------------------------------------------------------------ | 6 | ------------------------------------------------------------------------------ |
7 | 7 | ||
8 | local mips64 = mips64 | ||
9 | local mipsr6 = _map_def.MIPSR6 | ||
10 | |||
8 | -- Module information: | 11 | -- Module information: |
9 | local _info = { | 12 | local _info = { |
10 | arch = "mips", | 13 | arch = mips64 and "mips64" or "mips", |
11 | description = "DynASM MIPS module", | 14 | description = "DynASM MIPS32/MIPS64 module", |
12 | version = "1.3.0", | 15 | version = "1.4.0", |
13 | vernum = 10300, | 16 | vernum = 10400, |
14 | release = "2012-01-23", | 17 | release = "2020-01-20", |
15 | author = "Mike Pall", | 18 | author = "Mike Pall", |
16 | license = "MIT", | 19 | license = "MIT", |
17 | } | 20 | } |
@@ -27,7 +30,8 @@ local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char | |||
27 | local match, gmatch = _s.match, _s.gmatch | 30 | local match, gmatch = _s.match, _s.gmatch |
28 | local concat, sort = table.concat, table.sort | 31 | local concat, sort = table.concat, table.sort |
29 | local bit = bit or require("bit") | 32 | local bit = bit or require("bit") |
30 | local band, shl, sar, tohex = bit.band, bit.lshift, bit.arshift, bit.tohex | 33 | local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift |
34 | local tohex = bit.tohex | ||
31 | 35 | ||
32 | -- Inherited tables and callbacks. | 36 | -- Inherited tables and callbacks. |
33 | local g_opt, g_arch | 37 | local g_opt, g_arch |
@@ -38,7 +42,7 @@ local wline, werror, wfatal, wwarn | |||
38 | local action_names = { | 42 | local action_names = { |
39 | "STOP", "SECTION", "ESC", "REL_EXT", | 43 | "STOP", "SECTION", "ESC", "REL_EXT", |
40 | "ALIGN", "REL_LG", "LABEL_LG", | 44 | "ALIGN", "REL_LG", "LABEL_LG", |
41 | "REL_PC", "LABEL_PC", "IMM", | 45 | "REL_PC", "LABEL_PC", "IMM", "IMMS", |
42 | } | 46 | } |
43 | 47 | ||
44 | -- Maximum number of section buffer positions for dasm_put(). | 48 | -- Maximum number of section buffer positions for dasm_put(). |
@@ -235,7 +239,6 @@ local map_op = { | |||
235 | bne_3 = "14000000STB", | 239 | bne_3 = "14000000STB", |
236 | blez_2 = "18000000SB", | 240 | blez_2 = "18000000SB", |
237 | bgtz_2 = "1c000000SB", | 241 | bgtz_2 = "1c000000SB", |
238 | addi_3 = "20000000TSI", | ||
239 | li_2 = "24000000TI", | 242 | li_2 = "24000000TI", |
240 | addiu_3 = "24000000TSI", | 243 | addiu_3 = "24000000TSI", |
241 | slti_3 = "28000000TSI", | 244 | slti_3 = "28000000TSI", |
@@ -245,70 +248,52 @@ local map_op = { | |||
245 | ori_3 = "34000000TSU", | 248 | ori_3 = "34000000TSU", |
246 | xori_3 = "38000000TSU", | 249 | xori_3 = "38000000TSU", |
247 | lui_2 = "3c000000TU", | 250 | lui_2 = "3c000000TU", |
248 | beqzl_2 = "50000000SB", | 251 | daddiu_3 = mips64 and "64000000TSI", |
249 | beql_3 = "50000000STB", | 252 | ldl_2 = mips64 and "68000000TO", |
250 | bnezl_2 = "54000000SB", | 253 | ldr_2 = mips64 and "6c000000TO", |
251 | bnel_3 = "54000000STB", | ||
252 | blezl_2 = "58000000SB", | ||
253 | bgtzl_2 = "5c000000SB", | ||
254 | lb_2 = "80000000TO", | 254 | lb_2 = "80000000TO", |
255 | lh_2 = "84000000TO", | 255 | lh_2 = "84000000TO", |
256 | lwl_2 = "88000000TO", | ||
257 | lw_2 = "8c000000TO", | 256 | lw_2 = "8c000000TO", |
258 | lbu_2 = "90000000TO", | 257 | lbu_2 = "90000000TO", |
259 | lhu_2 = "94000000TO", | 258 | lhu_2 = "94000000TO", |
260 | lwr_2 = "98000000TO", | 259 | lwu_2 = mips64 and "9c000000TO", |
261 | sb_2 = "a0000000TO", | 260 | sb_2 = "a0000000TO", |
262 | sh_2 = "a4000000TO", | 261 | sh_2 = "a4000000TO", |
263 | swl_2 = "a8000000TO", | ||
264 | sw_2 = "ac000000TO", | 262 | sw_2 = "ac000000TO", |
265 | swr_2 = "b8000000TO", | ||
266 | cache_2 = "bc000000NO", | ||
267 | ll_2 = "c0000000TO", | ||
268 | lwc1_2 = "c4000000HO", | 263 | lwc1_2 = "c4000000HO", |
269 | pref_2 = "cc000000NO", | ||
270 | ldc1_2 = "d4000000HO", | 264 | ldc1_2 = "d4000000HO", |
271 | sc_2 = "e0000000TO", | 265 | ld_2 = mips64 and "dc000000TO", |
272 | swc1_2 = "e4000000HO", | 266 | swc1_2 = "e4000000HO", |
273 | sdc1_2 = "f4000000HO", | 267 | sdc1_2 = "f4000000HO", |
268 | sd_2 = mips64 and "fc000000TO", | ||
274 | 269 | ||
275 | -- Opcode SPECIAL. | 270 | -- Opcode SPECIAL. |
276 | nop_0 = "00000000", | 271 | nop_0 = "00000000", |
277 | sll_3 = "00000000DTA", | 272 | sll_3 = "00000000DTA", |
278 | movf_2 = "00000001DS", | 273 | sextw_2 = "00000000DT", |
279 | movf_3 = "00000001DSC", | ||
280 | movt_2 = "00010001DS", | ||
281 | movt_3 = "00010001DSC", | ||
282 | srl_3 = "00000002DTA", | 274 | srl_3 = "00000002DTA", |
283 | rotr_3 = "00200002DTA", | 275 | rotr_3 = "00200002DTA", |
284 | sra_3 = "00000003DTA", | 276 | sra_3 = "00000003DTA", |
285 | sllv_3 = "00000004DTS", | 277 | sllv_3 = "00000004DTS", |
286 | srlv_3 = "00000006DTS", | 278 | srlv_3 = "00000006DTS", |
287 | rotrv_3 = "00000046DTS", | 279 | rotrv_3 = "00000046DTS", |
280 | drotrv_3 = mips64 and "00000056DTS", | ||
288 | srav_3 = "00000007DTS", | 281 | srav_3 = "00000007DTS", |
289 | jr_1 = "00000008S", | ||
290 | jalr_1 = "0000f809S", | 282 | jalr_1 = "0000f809S", |
291 | jalr_2 = "00000009DS", | 283 | jalr_2 = "00000009DS", |
292 | movz_3 = "0000000aDST", | ||
293 | movn_3 = "0000000bDST", | ||
294 | syscall_0 = "0000000c", | 284 | syscall_0 = "0000000c", |
295 | syscall_1 = "0000000cY", | 285 | syscall_1 = "0000000cY", |
296 | break_0 = "0000000d", | 286 | break_0 = "0000000d", |
297 | break_1 = "0000000dY", | 287 | break_1 = "0000000dY", |
298 | sync_0 = "0000000f", | 288 | sync_0 = "0000000f", |
299 | mfhi_1 = "00000010D", | 289 | dsllv_3 = mips64 and "00000014DTS", |
300 | mthi_1 = "00000011S", | 290 | dsrlv_3 = mips64 and "00000016DTS", |
301 | mflo_1 = "00000012D", | 291 | dsrav_3 = mips64 and "00000017DTS", |
302 | mtlo_1 = "00000013S", | ||
303 | mult_2 = "00000018ST", | ||
304 | multu_2 = "00000019ST", | ||
305 | div_2 = "0000001aST", | ||
306 | divu_2 = "0000001bST", | ||
307 | add_3 = "00000020DST", | 292 | add_3 = "00000020DST", |
308 | move_2 = "00000021DS", | 293 | move_2 = mips64 and "00000025DS" or "00000021DS", |
309 | addu_3 = "00000021DST", | 294 | addu_3 = "00000021DST", |
310 | sub_3 = "00000022DST", | 295 | sub_3 = "00000022DST", |
311 | negu_2 = "00000023DT", | 296 | negu_2 = mips64 and "0000002fDT" or "00000023DT", |
312 | subu_3 = "00000023DST", | 297 | subu_3 = "00000023DST", |
313 | and_3 = "00000024DST", | 298 | and_3 = "00000024DST", |
314 | or_3 = "00000025DST", | 299 | or_3 = "00000025DST", |
@@ -317,6 +302,10 @@ local map_op = { | |||
317 | nor_3 = "00000027DST", | 302 | nor_3 = "00000027DST", |
318 | slt_3 = "0000002aDST", | 303 | slt_3 = "0000002aDST", |
319 | sltu_3 = "0000002bDST", | 304 | sltu_3 = "0000002bDST", |
305 | dadd_3 = mips64 and "0000002cDST", | ||
306 | daddu_3 = mips64 and "0000002dDST", | ||
307 | dsub_3 = mips64 and "0000002eDST", | ||
308 | dsubu_3 = mips64 and "0000002fDST", | ||
320 | tge_2 = "00000030ST", | 309 | tge_2 = "00000030ST", |
321 | tge_3 = "00000030STZ", | 310 | tge_3 = "00000030STZ", |
322 | tgeu_2 = "00000031ST", | 311 | tgeu_2 = "00000031ST", |
@@ -329,40 +318,36 @@ local map_op = { | |||
329 | teq_3 = "00000034STZ", | 318 | teq_3 = "00000034STZ", |
330 | tne_2 = "00000036ST", | 319 | tne_2 = "00000036ST", |
331 | tne_3 = "00000036STZ", | 320 | tne_3 = "00000036STZ", |
321 | dsll_3 = mips64 and "00000038DTa", | ||
322 | dsrl_3 = mips64 and "0000003aDTa", | ||
323 | drotr_3 = mips64 and "0020003aDTa", | ||
324 | dsra_3 = mips64 and "0000003bDTa", | ||
325 | dsll32_3 = mips64 and "0000003cDTA", | ||
326 | dsrl32_3 = mips64 and "0000003eDTA", | ||
327 | drotr32_3 = mips64 and "0020003eDTA", | ||
328 | dsra32_3 = mips64 and "0000003fDTA", | ||
332 | 329 | ||
333 | -- Opcode REGIMM. | 330 | -- Opcode REGIMM. |
334 | bltz_2 = "04000000SB", | 331 | bltz_2 = "04000000SB", |
335 | bgez_2 = "04010000SB", | 332 | bgez_2 = "04010000SB", |
336 | bltzl_2 = "04020000SB", | 333 | bltzl_2 = "04020000SB", |
337 | bgezl_2 = "04030000SB", | 334 | bgezl_2 = "04030000SB", |
338 | tgei_2 = "04080000SI", | ||
339 | tgeiu_2 = "04090000SI", | ||
340 | tlti_2 = "040a0000SI", | ||
341 | tltiu_2 = "040b0000SI", | ||
342 | teqi_2 = "040c0000SI", | ||
343 | tnei_2 = "040e0000SI", | ||
344 | bltzal_2 = "04100000SB", | ||
345 | bal_1 = "04110000B", | 335 | bal_1 = "04110000B", |
346 | bgezal_2 = "04110000SB", | ||
347 | bltzall_2 = "04120000SB", | ||
348 | bgezall_2 = "04130000SB", | ||
349 | synci_1 = "041f0000O", | 336 | synci_1 = "041f0000O", |
350 | 337 | ||
351 | -- Opcode SPECIAL2. | ||
352 | madd_2 = "70000000ST", | ||
353 | maddu_2 = "70000001ST", | ||
354 | mul_3 = "70000002DST", | ||
355 | msub_2 = "70000004ST", | ||
356 | msubu_2 = "70000005ST", | ||
357 | clz_2 = "70000020DS=", | ||
358 | clo_2 = "70000021DS=", | ||
359 | sdbbp_0 = "7000003f", | ||
360 | sdbbp_1 = "7000003fY", | ||
361 | |||
362 | -- Opcode SPECIAL3. | 338 | -- Opcode SPECIAL3. |
363 | ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 | 339 | ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 |
340 | dextm_4 = mips64 and "7c000001TSAM", -- Args: pos | size-1-32 | ||
341 | dextu_4 = mips64 and "7c000002TSAM", -- Args: pos-32 | size-1 | ||
342 | dext_4 = mips64 and "7c000003TSAM", -- Args: pos | size-1 | ||
343 | zextw_2 = mips64 and "7c00f803TS", | ||
364 | ins_4 = "7c000004TSAM", -- Note: last arg is msb = pos+size-1 | 344 | ins_4 = "7c000004TSAM", -- Note: last arg is msb = pos+size-1 |
345 | dinsm_4 = mips64 and "7c000005TSAM", -- Args: pos | pos+size-33 | ||
346 | dinsu_4 = mips64 and "7c000006TSAM", -- Args: pos-32 | pos+size-33 | ||
347 | dins_4 = mips64 and "7c000007TSAM", -- Args: pos | pos+size-1 | ||
365 | wsbh_2 = "7c0000a0DT", | 348 | wsbh_2 = "7c0000a0DT", |
349 | dsbh_2 = mips64 and "7c0000a4DT", | ||
350 | dshd_2 = mips64 and "7c000164DT", | ||
366 | seb_2 = "7c000420DT", | 351 | seb_2 = "7c000420DT", |
367 | seh_2 = "7c000620DT", | 352 | seh_2 = "7c000620DT", |
368 | rdhwr_2 = "7c00003bTD", | 353 | rdhwr_2 = "7c00003bTD", |
@@ -370,8 +355,12 @@ local map_op = { | |||
370 | -- Opcode COP0. | 355 | -- Opcode COP0. |
371 | mfc0_2 = "40000000TD", | 356 | mfc0_2 = "40000000TD", |
372 | mfc0_3 = "40000000TDW", | 357 | mfc0_3 = "40000000TDW", |
358 | dmfc0_2 = mips64 and "40200000TD", | ||
359 | dmfc0_3 = mips64 and "40200000TDW", | ||
373 | mtc0_2 = "40800000TD", | 360 | mtc0_2 = "40800000TD", |
374 | mtc0_3 = "40800000TDW", | 361 | mtc0_3 = "40800000TDW", |
362 | dmtc0_2 = mips64 and "40a00000TD", | ||
363 | dmtc0_3 = mips64 and "40a00000TDW", | ||
375 | rdpgpr_2 = "41400000DT", | 364 | rdpgpr_2 = "41400000DT", |
376 | di_0 = "41606000", | 365 | di_0 = "41606000", |
377 | di_1 = "41606000T", | 366 | di_1 = "41606000T", |
@@ -388,21 +377,14 @@ local map_op = { | |||
388 | 377 | ||
389 | -- Opcode COP1. | 378 | -- Opcode COP1. |
390 | mfc1_2 = "44000000TG", | 379 | mfc1_2 = "44000000TG", |
380 | dmfc1_2 = mips64 and "44200000TG", | ||
391 | cfc1_2 = "44400000TG", | 381 | cfc1_2 = "44400000TG", |
392 | mfhc1_2 = "44600000TG", | 382 | mfhc1_2 = "44600000TG", |
393 | mtc1_2 = "44800000TG", | 383 | mtc1_2 = "44800000TG", |
384 | dmtc1_2 = mips64 and "44a00000TG", | ||
394 | ctc1_2 = "44c00000TG", | 385 | ctc1_2 = "44c00000TG", |
395 | mthc1_2 = "44e00000TG", | 386 | mthc1_2 = "44e00000TG", |
396 | 387 | ||
397 | bc1f_1 = "45000000B", | ||
398 | bc1f_2 = "45000000CB", | ||
399 | bc1t_1 = "45010000B", | ||
400 | bc1t_2 = "45010000CB", | ||
401 | bc1fl_1 = "45020000B", | ||
402 | bc1fl_2 = "45020000CB", | ||
403 | bc1tl_1 = "45030000B", | ||
404 | bc1tl_2 = "45030000CB", | ||
405 | |||
406 | ["add.s_3"] = "46000000FGH", | 388 | ["add.s_3"] = "46000000FGH", |
407 | ["sub.s_3"] = "46000001FGH", | 389 | ["sub.s_3"] = "46000001FGH", |
408 | ["mul.s_3"] = "46000002FGH", | 390 | ["mul.s_3"] = "46000002FGH", |
@@ -419,51 +401,11 @@ local map_op = { | |||
419 | ["trunc.w.s_2"] = "4600000dFG", | 401 | ["trunc.w.s_2"] = "4600000dFG", |
420 | ["ceil.w.s_2"] = "4600000eFG", | 402 | ["ceil.w.s_2"] = "4600000eFG", |
421 | ["floor.w.s_2"] = "4600000fFG", | 403 | ["floor.w.s_2"] = "4600000fFG", |
422 | ["movf.s_2"] = "46000011FG", | ||
423 | ["movf.s_3"] = "46000011FGC", | ||
424 | ["movt.s_2"] = "46010011FG", | ||
425 | ["movt.s_3"] = "46010011FGC", | ||
426 | ["movz.s_3"] = "46000012FGT", | ||
427 | ["movn.s_3"] = "46000013FGT", | ||
428 | ["recip.s_2"] = "46000015FG", | 404 | ["recip.s_2"] = "46000015FG", |
429 | ["rsqrt.s_2"] = "46000016FG", | 405 | ["rsqrt.s_2"] = "46000016FG", |
430 | ["cvt.d.s_2"] = "46000021FG", | 406 | ["cvt.d.s_2"] = "46000021FG", |
431 | ["cvt.w.s_2"] = "46000024FG", | 407 | ["cvt.w.s_2"] = "46000024FG", |
432 | ["cvt.l.s_2"] = "46000025FG", | 408 | ["cvt.l.s_2"] = "46000025FG", |
433 | ["cvt.ps.s_3"] = "46000026FGH", | ||
434 | ["c.f.s_2"] = "46000030GH", | ||
435 | ["c.f.s_3"] = "46000030VGH", | ||
436 | ["c.un.s_2"] = "46000031GH", | ||
437 | ["c.un.s_3"] = "46000031VGH", | ||
438 | ["c.eq.s_2"] = "46000032GH", | ||
439 | ["c.eq.s_3"] = "46000032VGH", | ||
440 | ["c.ueq.s_2"] = "46000033GH", | ||
441 | ["c.ueq.s_3"] = "46000033VGH", | ||
442 | ["c.olt.s_2"] = "46000034GH", | ||
443 | ["c.olt.s_3"] = "46000034VGH", | ||
444 | ["c.ult.s_2"] = "46000035GH", | ||
445 | ["c.ult.s_3"] = "46000035VGH", | ||
446 | ["c.ole.s_2"] = "46000036GH", | ||
447 | ["c.ole.s_3"] = "46000036VGH", | ||
448 | ["c.ule.s_2"] = "46000037GH", | ||
449 | ["c.ule.s_3"] = "46000037VGH", | ||
450 | ["c.sf.s_2"] = "46000038GH", | ||
451 | ["c.sf.s_3"] = "46000038VGH", | ||
452 | ["c.ngle.s_2"] = "46000039GH", | ||
453 | ["c.ngle.s_3"] = "46000039VGH", | ||
454 | ["c.seq.s_2"] = "4600003aGH", | ||
455 | ["c.seq.s_3"] = "4600003aVGH", | ||
456 | ["c.ngl.s_2"] = "4600003bGH", | ||
457 | ["c.ngl.s_3"] = "4600003bVGH", | ||
458 | ["c.lt.s_2"] = "4600003cGH", | ||
459 | ["c.lt.s_3"] = "4600003cVGH", | ||
460 | ["c.nge.s_2"] = "4600003dGH", | ||
461 | ["c.nge.s_3"] = "4600003dVGH", | ||
462 | ["c.le.s_2"] = "4600003eGH", | ||
463 | ["c.le.s_3"] = "4600003eVGH", | ||
464 | ["c.ngt.s_2"] = "4600003fGH", | ||
465 | ["c.ngt.s_3"] = "4600003fVGH", | ||
466 | |||
467 | ["add.d_3"] = "46200000FGH", | 409 | ["add.d_3"] = "46200000FGH", |
468 | ["sub.d_3"] = "46200001FGH", | 410 | ["sub.d_3"] = "46200001FGH", |
469 | ["mul.d_3"] = "46200002FGH", | 411 | ["mul.d_3"] = "46200002FGH", |
@@ -480,130 +422,410 @@ local map_op = { | |||
480 | ["trunc.w.d_2"] = "4620000dFG", | 422 | ["trunc.w.d_2"] = "4620000dFG", |
481 | ["ceil.w.d_2"] = "4620000eFG", | 423 | ["ceil.w.d_2"] = "4620000eFG", |
482 | ["floor.w.d_2"] = "4620000fFG", | 424 | ["floor.w.d_2"] = "4620000fFG", |
483 | ["movf.d_2"] = "46200011FG", | ||
484 | ["movf.d_3"] = "46200011FGC", | ||
485 | ["movt.d_2"] = "46210011FG", | ||
486 | ["movt.d_3"] = "46210011FGC", | ||
487 | ["movz.d_3"] = "46200012FGT", | ||
488 | ["movn.d_3"] = "46200013FGT", | ||
489 | ["recip.d_2"] = "46200015FG", | 425 | ["recip.d_2"] = "46200015FG", |
490 | ["rsqrt.d_2"] = "46200016FG", | 426 | ["rsqrt.d_2"] = "46200016FG", |
491 | ["cvt.s.d_2"] = "46200020FG", | 427 | ["cvt.s.d_2"] = "46200020FG", |
492 | ["cvt.w.d_2"] = "46200024FG", | 428 | ["cvt.w.d_2"] = "46200024FG", |
493 | ["cvt.l.d_2"] = "46200025FG", | 429 | ["cvt.l.d_2"] = "46200025FG", |
494 | ["c.f.d_2"] = "46200030GH", | ||
495 | ["c.f.d_3"] = "46200030VGH", | ||
496 | ["c.un.d_2"] = "46200031GH", | ||
497 | ["c.un.d_3"] = "46200031VGH", | ||
498 | ["c.eq.d_2"] = "46200032GH", | ||
499 | ["c.eq.d_3"] = "46200032VGH", | ||
500 | ["c.ueq.d_2"] = "46200033GH", | ||
501 | ["c.ueq.d_3"] = "46200033VGH", | ||
502 | ["c.olt.d_2"] = "46200034GH", | ||
503 | ["c.olt.d_3"] = "46200034VGH", | ||
504 | ["c.ult.d_2"] = "46200035GH", | ||
505 | ["c.ult.d_3"] = "46200035VGH", | ||
506 | ["c.ole.d_2"] = "46200036GH", | ||
507 | ["c.ole.d_3"] = "46200036VGH", | ||
508 | ["c.ule.d_2"] = "46200037GH", | ||
509 | ["c.ule.d_3"] = "46200037VGH", | ||
510 | ["c.sf.d_2"] = "46200038GH", | ||
511 | ["c.sf.d_3"] = "46200038VGH", | ||
512 | ["c.ngle.d_2"] = "46200039GH", | ||
513 | ["c.ngle.d_3"] = "46200039VGH", | ||
514 | ["c.seq.d_2"] = "4620003aGH", | ||
515 | ["c.seq.d_3"] = "4620003aVGH", | ||
516 | ["c.ngl.d_2"] = "4620003bGH", | ||
517 | ["c.ngl.d_3"] = "4620003bVGH", | ||
518 | ["c.lt.d_2"] = "4620003cGH", | ||
519 | ["c.lt.d_3"] = "4620003cVGH", | ||
520 | ["c.nge.d_2"] = "4620003dGH", | ||
521 | ["c.nge.d_3"] = "4620003dVGH", | ||
522 | ["c.le.d_2"] = "4620003eGH", | ||
523 | ["c.le.d_3"] = "4620003eVGH", | ||
524 | ["c.ngt.d_2"] = "4620003fGH", | ||
525 | ["c.ngt.d_3"] = "4620003fVGH", | ||
526 | |||
527 | ["add.ps_3"] = "46c00000FGH", | ||
528 | ["sub.ps_3"] = "46c00001FGH", | ||
529 | ["mul.ps_3"] = "46c00002FGH", | ||
530 | ["abs.ps_2"] = "46c00005FG", | ||
531 | ["mov.ps_2"] = "46c00006FG", | ||
532 | ["neg.ps_2"] = "46c00007FG", | ||
533 | ["movf.ps_2"] = "46c00011FG", | ||
534 | ["movf.ps_3"] = "46c00011FGC", | ||
535 | ["movt.ps_2"] = "46c10011FG", | ||
536 | ["movt.ps_3"] = "46c10011FGC", | ||
537 | ["movz.ps_3"] = "46c00012FGT", | ||
538 | ["movn.ps_3"] = "46c00013FGT", | ||
539 | ["cvt.s.pu_2"] = "46c00020FG", | ||
540 | ["cvt.s.pl_2"] = "46c00028FG", | ||
541 | ["pll.ps_3"] = "46c0002cFGH", | ||
542 | ["plu.ps_3"] = "46c0002dFGH", | ||
543 | ["pul.ps_3"] = "46c0002eFGH", | ||
544 | ["puu.ps_3"] = "46c0002fFGH", | ||
545 | ["c.f.ps_2"] = "46c00030GH", | ||
546 | ["c.f.ps_3"] = "46c00030VGH", | ||
547 | ["c.un.ps_2"] = "46c00031GH", | ||
548 | ["c.un.ps_3"] = "46c00031VGH", | ||
549 | ["c.eq.ps_2"] = "46c00032GH", | ||
550 | ["c.eq.ps_3"] = "46c00032VGH", | ||
551 | ["c.ueq.ps_2"] = "46c00033GH", | ||
552 | ["c.ueq.ps_3"] = "46c00033VGH", | ||
553 | ["c.olt.ps_2"] = "46c00034GH", | ||
554 | ["c.olt.ps_3"] = "46c00034VGH", | ||
555 | ["c.ult.ps_2"] = "46c00035GH", | ||
556 | ["c.ult.ps_3"] = "46c00035VGH", | ||
557 | ["c.ole.ps_2"] = "46c00036GH", | ||
558 | ["c.ole.ps_3"] = "46c00036VGH", | ||
559 | ["c.ule.ps_2"] = "46c00037GH", | ||
560 | ["c.ule.ps_3"] = "46c00037VGH", | ||
561 | ["c.sf.ps_2"] = "46c00038GH", | ||
562 | ["c.sf.ps_3"] = "46c00038VGH", | ||
563 | ["c.ngle.ps_2"] = "46c00039GH", | ||
564 | ["c.ngle.ps_3"] = "46c00039VGH", | ||
565 | ["c.seq.ps_2"] = "46c0003aGH", | ||
566 | ["c.seq.ps_3"] = "46c0003aVGH", | ||
567 | ["c.ngl.ps_2"] = "46c0003bGH", | ||
568 | ["c.ngl.ps_3"] = "46c0003bVGH", | ||
569 | ["c.lt.ps_2"] = "46c0003cGH", | ||
570 | ["c.lt.ps_3"] = "46c0003cVGH", | ||
571 | ["c.nge.ps_2"] = "46c0003dGH", | ||
572 | ["c.nge.ps_3"] = "46c0003dVGH", | ||
573 | ["c.le.ps_2"] = "46c0003eGH", | ||
574 | ["c.le.ps_3"] = "46c0003eVGH", | ||
575 | ["c.ngt.ps_2"] = "46c0003fGH", | ||
576 | ["c.ngt.ps_3"] = "46c0003fVGH", | ||
577 | |||
578 | ["cvt.s.w_2"] = "46800020FG", | 430 | ["cvt.s.w_2"] = "46800020FG", |
579 | ["cvt.d.w_2"] = "46800021FG", | 431 | ["cvt.d.w_2"] = "46800021FG", |
580 | |||
581 | ["cvt.s.l_2"] = "46a00020FG", | 432 | ["cvt.s.l_2"] = "46a00020FG", |
582 | ["cvt.d.l_2"] = "46a00021FG", | 433 | ["cvt.d.l_2"] = "46a00021FG", |
583 | |||
584 | -- Opcode COP1X. | ||
585 | lwxc1_2 = "4c000000FX", | ||
586 | ldxc1_2 = "4c000001FX", | ||
587 | luxc1_2 = "4c000005FX", | ||
588 | swxc1_2 = "4c000008FX", | ||
589 | sdxc1_2 = "4c000009FX", | ||
590 | suxc1_2 = "4c00000dFX", | ||
591 | prefx_2 = "4c00000fMX", | ||
592 | ["alnv.ps_4"] = "4c00001eFGHS", | ||
593 | ["madd.s_4"] = "4c000020FRGH", | ||
594 | ["madd.d_4"] = "4c000021FRGH", | ||
595 | ["madd.ps_4"] = "4c000026FRGH", | ||
596 | ["msub.s_4"] = "4c000028FRGH", | ||
597 | ["msub.d_4"] = "4c000029FRGH", | ||
598 | ["msub.ps_4"] = "4c00002eFRGH", | ||
599 | ["nmadd.s_4"] = "4c000030FRGH", | ||
600 | ["nmadd.d_4"] = "4c000031FRGH", | ||
601 | ["nmadd.ps_4"] = "4c000036FRGH", | ||
602 | ["nmsub.s_4"] = "4c000038FRGH", | ||
603 | ["nmsub.d_4"] = "4c000039FRGH", | ||
604 | ["nmsub.ps_4"] = "4c00003eFRGH", | ||
605 | } | 434 | } |
606 | 435 | ||
436 | if mipsr6 then -- Instructions added with MIPSR6. | ||
437 | |||
438 | for k,v in pairs({ | ||
439 | |||
440 | -- Add immediate to upper bits. | ||
441 | aui_3 = "3c000000TSI", | ||
442 | daui_3 = mips64 and "74000000TSI", | ||
443 | dahi_2 = mips64 and "04060000SI", | ||
444 | dati_2 = mips64 and "041e0000SI", | ||
445 | |||
446 | -- TODO: addiupc, auipc, aluipc, lwpc, lwupc, ldpc. | ||
447 | |||
448 | -- Compact branches. | ||
449 | blezalc_2 = "18000000TB", -- rt != 0. | ||
450 | bgezalc_2 = "18000000T=SB", -- rt != 0. | ||
451 | bgtzalc_2 = "1c000000TB", -- rt != 0. | ||
452 | bltzalc_2 = "1c000000T=SB", -- rt != 0. | ||
453 | |||
454 | blezc_2 = "58000000TB", -- rt != 0. | ||
455 | bgezc_2 = "58000000T=SB", -- rt != 0. | ||
456 | bgec_3 = "58000000STB", -- rs != rt. | ||
457 | blec_3 = "58000000TSB", -- rt != rs. | ||
458 | |||
459 | bgtzc_2 = "5c000000TB", -- rt != 0. | ||
460 | bltzc_2 = "5c000000T=SB", -- rt != 0. | ||
461 | bltc_3 = "5c000000STB", -- rs != rt. | ||
462 | bgtc_3 = "5c000000TSB", -- rt != rs. | ||
463 | |||
464 | bgeuc_3 = "18000000STB", -- rs != rt. | ||
465 | bleuc_3 = "18000000TSB", -- rt != rs. | ||
466 | bltuc_3 = "1c000000STB", -- rs != rt. | ||
467 | bgtuc_3 = "1c000000TSB", -- rt != rs. | ||
468 | |||
469 | beqzalc_2 = "20000000TB", -- rt != 0. | ||
470 | bnezalc_2 = "60000000TB", -- rt != 0. | ||
471 | beqc_3 = "20000000STB", -- rs < rt. | ||
472 | bnec_3 = "60000000STB", -- rs < rt. | ||
473 | bovc_3 = "20000000STB", -- rs >= rt. | ||
474 | bnvc_3 = "60000000STB", -- rs >= rt. | ||
475 | |||
476 | beqzc_2 = "d8000000SK", -- rs != 0. | ||
477 | bnezc_2 = "f8000000SK", -- rs != 0. | ||
478 | jic_2 = "d8000000TI", | ||
479 | jialc_2 = "f8000000TI", | ||
480 | bc_1 = "c8000000L", | ||
481 | balc_1 = "e8000000L", | ||
482 | |||
483 | -- Opcode SPECIAL. | ||
484 | jr_1 = "00000009S", | ||
485 | sdbbp_0 = "0000000e", | ||
486 | sdbbp_1 = "0000000eY", | ||
487 | lsa_4 = "00000005DSTA", | ||
488 | dlsa_4 = mips64 and "00000015DSTA", | ||
489 | seleqz_3 = "00000035DST", | ||
490 | selnez_3 = "00000037DST", | ||
491 | clz_2 = "00000050DS", | ||
492 | clo_2 = "00000051DS", | ||
493 | dclz_2 = mips64 and "00000052DS", | ||
494 | dclo_2 = mips64 and "00000053DS", | ||
495 | mul_3 = "00000098DST", | ||
496 | muh_3 = "000000d8DST", | ||
497 | mulu_3 = "00000099DST", | ||
498 | muhu_3 = "000000d9DST", | ||
499 | div_3 = "0000009aDST", | ||
500 | mod_3 = "000000daDST", | ||
501 | divu_3 = "0000009bDST", | ||
502 | modu_3 = "000000dbDST", | ||
503 | dmul_3 = mips64 and "0000009cDST", | ||
504 | dmuh_3 = mips64 and "000000dcDST", | ||
505 | dmulu_3 = mips64 and "0000009dDST", | ||
506 | dmuhu_3 = mips64 and "000000ddDST", | ||
507 | ddiv_3 = mips64 and "0000009eDST", | ||
508 | dmod_3 = mips64 and "000000deDST", | ||
509 | ddivu_3 = mips64 and "0000009fDST", | ||
510 | dmodu_3 = mips64 and "000000dfDST", | ||
511 | |||
512 | -- Opcode SPECIAL3. | ||
513 | align_4 = "7c000220DSTA", | ||
514 | dalign_4 = mips64 and "7c000224DSTA", | ||
515 | bitswap_2 = "7c000020DT", | ||
516 | dbitswap_2 = mips64 and "7c000024DT", | ||
517 | |||
518 | -- Opcode COP1. | ||
519 | bc1eqz_2 = "45200000HB", | ||
520 | bc1nez_2 = "45a00000HB", | ||
521 | |||
522 | ["sel.s_3"] = "46000010FGH", | ||
523 | ["seleqz.s_3"] = "46000014FGH", | ||
524 | ["selnez.s_3"] = "46000017FGH", | ||
525 | ["maddf.s_3"] = "46000018FGH", | ||
526 | ["msubf.s_3"] = "46000019FGH", | ||
527 | ["rint.s_2"] = "4600001aFG", | ||
528 | ["class.s_2"] = "4600001bFG", | ||
529 | ["min.s_3"] = "4600001cFGH", | ||
530 | ["mina.s_3"] = "4600001dFGH", | ||
531 | ["max.s_3"] = "4600001eFGH", | ||
532 | ["maxa.s_3"] = "4600001fFGH", | ||
533 | ["cmp.af.s_3"] = "46800000FGH", | ||
534 | ["cmp.un.s_3"] = "46800001FGH", | ||
535 | ["cmp.or.s_3"] = "46800011FGH", | ||
536 | ["cmp.eq.s_3"] = "46800002FGH", | ||
537 | ["cmp.une.s_3"] = "46800012FGH", | ||
538 | ["cmp.ueq.s_3"] = "46800003FGH", | ||
539 | ["cmp.ne.s_3"] = "46800013FGH", | ||
540 | ["cmp.lt.s_3"] = "46800004FGH", | ||
541 | ["cmp.ult.s_3"] = "46800005FGH", | ||
542 | ["cmp.le.s_3"] = "46800006FGH", | ||
543 | ["cmp.ule.s_3"] = "46800007FGH", | ||
544 | ["cmp.saf.s_3"] = "46800008FGH", | ||
545 | ["cmp.sun.s_3"] = "46800009FGH", | ||
546 | ["cmp.sor.s_3"] = "46800019FGH", | ||
547 | ["cmp.seq.s_3"] = "4680000aFGH", | ||
548 | ["cmp.sune.s_3"] = "4680001aFGH", | ||
549 | ["cmp.sueq.s_3"] = "4680000bFGH", | ||
550 | ["cmp.sne.s_3"] = "4680001bFGH", | ||
551 | ["cmp.slt.s_3"] = "4680000cFGH", | ||
552 | ["cmp.sult.s_3"] = "4680000dFGH", | ||
553 | ["cmp.sle.s_3"] = "4680000eFGH", | ||
554 | ["cmp.sule.s_3"] = "4680000fFGH", | ||
555 | |||
556 | ["sel.d_3"] = "46200010FGH", | ||
557 | ["seleqz.d_3"] = "46200014FGH", | ||
558 | ["selnez.d_3"] = "46200017FGH", | ||
559 | ["maddf.d_3"] = "46200018FGH", | ||
560 | ["msubf.d_3"] = "46200019FGH", | ||
561 | ["rint.d_2"] = "4620001aFG", | ||
562 | ["class.d_2"] = "4620001bFG", | ||
563 | ["min.d_3"] = "4620001cFGH", | ||
564 | ["mina.d_3"] = "4620001dFGH", | ||
565 | ["max.d_3"] = "4620001eFGH", | ||
566 | ["maxa.d_3"] = "4620001fFGH", | ||
567 | ["cmp.af.d_3"] = "46a00000FGH", | ||
568 | ["cmp.un.d_3"] = "46a00001FGH", | ||
569 | ["cmp.or.d_3"] = "46a00011FGH", | ||
570 | ["cmp.eq.d_3"] = "46a00002FGH", | ||
571 | ["cmp.une.d_3"] = "46a00012FGH", | ||
572 | ["cmp.ueq.d_3"] = "46a00003FGH", | ||
573 | ["cmp.ne.d_3"] = "46a00013FGH", | ||
574 | ["cmp.lt.d_3"] = "46a00004FGH", | ||
575 | ["cmp.ult.d_3"] = "46a00005FGH", | ||
576 | ["cmp.le.d_3"] = "46a00006FGH", | ||
577 | ["cmp.ule.d_3"] = "46a00007FGH", | ||
578 | ["cmp.saf.d_3"] = "46a00008FGH", | ||
579 | ["cmp.sun.d_3"] = "46a00009FGH", | ||
580 | ["cmp.sor.d_3"] = "46a00019FGH", | ||
581 | ["cmp.seq.d_3"] = "46a0000aFGH", | ||
582 | ["cmp.sune.d_3"] = "46a0001aFGH", | ||
583 | ["cmp.sueq.d_3"] = "46a0000bFGH", | ||
584 | ["cmp.sne.d_3"] = "46a0001bFGH", | ||
585 | ["cmp.slt.d_3"] = "46a0000cFGH", | ||
586 | ["cmp.sult.d_3"] = "46a0000dFGH", | ||
587 | ["cmp.sle.d_3"] = "46a0000eFGH", | ||
588 | ["cmp.sule.d_3"] = "46a0000fFGH", | ||
589 | |||
590 | }) do map_op[k] = v end | ||
591 | |||
592 | else -- Instructions removed by MIPSR6. | ||
593 | |||
594 | for k,v in pairs({ | ||
595 | -- Traps, don't use. | ||
596 | addi_3 = "20000000TSI", | ||
597 | daddi_3 = mips64 and "60000000TSI", | ||
598 | |||
599 | -- Branch on likely, don't use. | ||
600 | beqzl_2 = "50000000SB", | ||
601 | beql_3 = "50000000STB", | ||
602 | bnezl_2 = "54000000SB", | ||
603 | bnel_3 = "54000000STB", | ||
604 | blezl_2 = "58000000SB", | ||
605 | bgtzl_2 = "5c000000SB", | ||
606 | |||
607 | lwl_2 = "88000000TO", | ||
608 | lwr_2 = "98000000TO", | ||
609 | swl_2 = "a8000000TO", | ||
610 | sdl_2 = mips64 and "b0000000TO", | ||
611 | sdr_2 = mips64 and "b1000000TO", | ||
612 | swr_2 = "b8000000TO", | ||
613 | cache_2 = "bc000000NO", | ||
614 | ll_2 = "c0000000TO", | ||
615 | pref_2 = "cc000000NO", | ||
616 | sc_2 = "e0000000TO", | ||
617 | scd_2 = mips64 and "f0000000TO", | ||
618 | |||
619 | -- Opcode SPECIAL. | ||
620 | movf_2 = "00000001DS", | ||
621 | movf_3 = "00000001DSC", | ||
622 | movt_2 = "00010001DS", | ||
623 | movt_3 = "00010001DSC", | ||
624 | jr_1 = "00000008S", | ||
625 | movz_3 = "0000000aDST", | ||
626 | movn_3 = "0000000bDST", | ||
627 | mfhi_1 = "00000010D", | ||
628 | mthi_1 = "00000011S", | ||
629 | mflo_1 = "00000012D", | ||
630 | mtlo_1 = "00000013S", | ||
631 | mult_2 = "00000018ST", | ||
632 | multu_2 = "00000019ST", | ||
633 | div_3 = "0000001aST", | ||
634 | divu_3 = "0000001bST", | ||
635 | ddiv_3 = mips64 and "0000001eST", | ||
636 | ddivu_3 = mips64 and "0000001fST", | ||
637 | dmult_2 = mips64 and "0000001cST", | ||
638 | dmultu_2 = mips64 and "0000001dST", | ||
639 | |||
640 | -- Opcode REGIMM. | ||
641 | tgei_2 = "04080000SI", | ||
642 | tgeiu_2 = "04090000SI", | ||
643 | tlti_2 = "040a0000SI", | ||
644 | tltiu_2 = "040b0000SI", | ||
645 | teqi_2 = "040c0000SI", | ||
646 | tnei_2 = "040e0000SI", | ||
647 | bltzal_2 = "04100000SB", | ||
648 | bgezal_2 = "04110000SB", | ||
649 | bltzall_2 = "04120000SB", | ||
650 | bgezall_2 = "04130000SB", | ||
651 | |||
652 | -- Opcode SPECIAL2. | ||
653 | madd_2 = "70000000ST", | ||
654 | maddu_2 = "70000001ST", | ||
655 | mul_3 = "70000002DST", | ||
656 | msub_2 = "70000004ST", | ||
657 | msubu_2 = "70000005ST", | ||
658 | clz_2 = "70000020D=TS", | ||
659 | clo_2 = "70000021D=TS", | ||
660 | dclz_2 = mips64 and "70000024D=TS", | ||
661 | dclo_2 = mips64 and "70000025D=TS", | ||
662 | sdbbp_0 = "7000003f", | ||
663 | sdbbp_1 = "7000003fY", | ||
664 | |||
665 | -- Opcode COP1. | ||
666 | bc1f_1 = "45000000B", | ||
667 | bc1f_2 = "45000000CB", | ||
668 | bc1t_1 = "45010000B", | ||
669 | bc1t_2 = "45010000CB", | ||
670 | bc1fl_1 = "45020000B", | ||
671 | bc1fl_2 = "45020000CB", | ||
672 | bc1tl_1 = "45030000B", | ||
673 | bc1tl_2 = "45030000CB", | ||
674 | |||
675 | ["movf.s_2"] = "46000011FG", | ||
676 | ["movf.s_3"] = "46000011FGC", | ||
677 | ["movt.s_2"] = "46010011FG", | ||
678 | ["movt.s_3"] = "46010011FGC", | ||
679 | ["movz.s_3"] = "46000012FGT", | ||
680 | ["movn.s_3"] = "46000013FGT", | ||
681 | ["cvt.ps.s_3"] = "46000026FGH", | ||
682 | ["c.f.s_2"] = "46000030GH", | ||
683 | ["c.f.s_3"] = "46000030VGH", | ||
684 | ["c.un.s_2"] = "46000031GH", | ||
685 | ["c.un.s_3"] = "46000031VGH", | ||
686 | ["c.eq.s_2"] = "46000032GH", | ||
687 | ["c.eq.s_3"] = "46000032VGH", | ||
688 | ["c.ueq.s_2"] = "46000033GH", | ||
689 | ["c.ueq.s_3"] = "46000033VGH", | ||
690 | ["c.olt.s_2"] = "46000034GH", | ||
691 | ["c.olt.s_3"] = "46000034VGH", | ||
692 | ["c.ult.s_2"] = "46000035GH", | ||
693 | ["c.ult.s_3"] = "46000035VGH", | ||
694 | ["c.ole.s_2"] = "46000036GH", | ||
695 | ["c.ole.s_3"] = "46000036VGH", | ||
696 | ["c.ule.s_2"] = "46000037GH", | ||
697 | ["c.ule.s_3"] = "46000037VGH", | ||
698 | ["c.sf.s_2"] = "46000038GH", | ||
699 | ["c.sf.s_3"] = "46000038VGH", | ||
700 | ["c.ngle.s_2"] = "46000039GH", | ||
701 | ["c.ngle.s_3"] = "46000039VGH", | ||
702 | ["c.seq.s_2"] = "4600003aGH", | ||
703 | ["c.seq.s_3"] = "4600003aVGH", | ||
704 | ["c.ngl.s_2"] = "4600003bGH", | ||
705 | ["c.ngl.s_3"] = "4600003bVGH", | ||
706 | ["c.lt.s_2"] = "4600003cGH", | ||
707 | ["c.lt.s_3"] = "4600003cVGH", | ||
708 | ["c.nge.s_2"] = "4600003dGH", | ||
709 | ["c.nge.s_3"] = "4600003dVGH", | ||
710 | ["c.le.s_2"] = "4600003eGH", | ||
711 | ["c.le.s_3"] = "4600003eVGH", | ||
712 | ["c.ngt.s_2"] = "4600003fGH", | ||
713 | ["c.ngt.s_3"] = "4600003fVGH", | ||
714 | ["movf.d_2"] = "46200011FG", | ||
715 | ["movf.d_3"] = "46200011FGC", | ||
716 | ["movt.d_2"] = "46210011FG", | ||
717 | ["movt.d_3"] = "46210011FGC", | ||
718 | ["movz.d_3"] = "46200012FGT", | ||
719 | ["movn.d_3"] = "46200013FGT", | ||
720 | ["c.f.d_2"] = "46200030GH", | ||
721 | ["c.f.d_3"] = "46200030VGH", | ||
722 | ["c.un.d_2"] = "46200031GH", | ||
723 | ["c.un.d_3"] = "46200031VGH", | ||
724 | ["c.eq.d_2"] = "46200032GH", | ||
725 | ["c.eq.d_3"] = "46200032VGH", | ||
726 | ["c.ueq.d_2"] = "46200033GH", | ||
727 | ["c.ueq.d_3"] = "46200033VGH", | ||
728 | ["c.olt.d_2"] = "46200034GH", | ||
729 | ["c.olt.d_3"] = "46200034VGH", | ||
730 | ["c.ult.d_2"] = "46200035GH", | ||
731 | ["c.ult.d_3"] = "46200035VGH", | ||
732 | ["c.ole.d_2"] = "46200036GH", | ||
733 | ["c.ole.d_3"] = "46200036VGH", | ||
734 | ["c.ule.d_2"] = "46200037GH", | ||
735 | ["c.ule.d_3"] = "46200037VGH", | ||
736 | ["c.sf.d_2"] = "46200038GH", | ||
737 | ["c.sf.d_3"] = "46200038VGH", | ||
738 | ["c.ngle.d_2"] = "46200039GH", | ||
739 | ["c.ngle.d_3"] = "46200039VGH", | ||
740 | ["c.seq.d_2"] = "4620003aGH", | ||
741 | ["c.seq.d_3"] = "4620003aVGH", | ||
742 | ["c.ngl.d_2"] = "4620003bGH", | ||
743 | ["c.ngl.d_3"] = "4620003bVGH", | ||
744 | ["c.lt.d_2"] = "4620003cGH", | ||
745 | ["c.lt.d_3"] = "4620003cVGH", | ||
746 | ["c.nge.d_2"] = "4620003dGH", | ||
747 | ["c.nge.d_3"] = "4620003dVGH", | ||
748 | ["c.le.d_2"] = "4620003eGH", | ||
749 | ["c.le.d_3"] = "4620003eVGH", | ||
750 | ["c.ngt.d_2"] = "4620003fGH", | ||
751 | ["c.ngt.d_3"] = "4620003fVGH", | ||
752 | ["add.ps_3"] = "46c00000FGH", | ||
753 | ["sub.ps_3"] = "46c00001FGH", | ||
754 | ["mul.ps_3"] = "46c00002FGH", | ||
755 | ["abs.ps_2"] = "46c00005FG", | ||
756 | ["mov.ps_2"] = "46c00006FG", | ||
757 | ["neg.ps_2"] = "46c00007FG", | ||
758 | ["movf.ps_2"] = "46c00011FG", | ||
759 | ["movf.ps_3"] = "46c00011FGC", | ||
760 | ["movt.ps_2"] = "46c10011FG", | ||
761 | ["movt.ps_3"] = "46c10011FGC", | ||
762 | ["movz.ps_3"] = "46c00012FGT", | ||
763 | ["movn.ps_3"] = "46c00013FGT", | ||
764 | ["cvt.s.pu_2"] = "46c00020FG", | ||
765 | ["cvt.s.pl_2"] = "46c00028FG", | ||
766 | ["pll.ps_3"] = "46c0002cFGH", | ||
767 | ["plu.ps_3"] = "46c0002dFGH", | ||
768 | ["pul.ps_3"] = "46c0002eFGH", | ||
769 | ["puu.ps_3"] = "46c0002fFGH", | ||
770 | ["c.f.ps_2"] = "46c00030GH", | ||
771 | ["c.f.ps_3"] = "46c00030VGH", | ||
772 | ["c.un.ps_2"] = "46c00031GH", | ||
773 | ["c.un.ps_3"] = "46c00031VGH", | ||
774 | ["c.eq.ps_2"] = "46c00032GH", | ||
775 | ["c.eq.ps_3"] = "46c00032VGH", | ||
776 | ["c.ueq.ps_2"] = "46c00033GH", | ||
777 | ["c.ueq.ps_3"] = "46c00033VGH", | ||
778 | ["c.olt.ps_2"] = "46c00034GH", | ||
779 | ["c.olt.ps_3"] = "46c00034VGH", | ||
780 | ["c.ult.ps_2"] = "46c00035GH", | ||
781 | ["c.ult.ps_3"] = "46c00035VGH", | ||
782 | ["c.ole.ps_2"] = "46c00036GH", | ||
783 | ["c.ole.ps_3"] = "46c00036VGH", | ||
784 | ["c.ule.ps_2"] = "46c00037GH", | ||
785 | ["c.ule.ps_3"] = "46c00037VGH", | ||
786 | ["c.sf.ps_2"] = "46c00038GH", | ||
787 | ["c.sf.ps_3"] = "46c00038VGH", | ||
788 | ["c.ngle.ps_2"] = "46c00039GH", | ||
789 | ["c.ngle.ps_3"] = "46c00039VGH", | ||
790 | ["c.seq.ps_2"] = "46c0003aGH", | ||
791 | ["c.seq.ps_3"] = "46c0003aVGH", | ||
792 | ["c.ngl.ps_2"] = "46c0003bGH", | ||
793 | ["c.ngl.ps_3"] = "46c0003bVGH", | ||
794 | ["c.lt.ps_2"] = "46c0003cGH", | ||
795 | ["c.lt.ps_3"] = "46c0003cVGH", | ||
796 | ["c.nge.ps_2"] = "46c0003dGH", | ||
797 | ["c.nge.ps_3"] = "46c0003dVGH", | ||
798 | ["c.le.ps_2"] = "46c0003eGH", | ||
799 | ["c.le.ps_3"] = "46c0003eVGH", | ||
800 | ["c.ngt.ps_2"] = "46c0003fGH", | ||
801 | ["c.ngt.ps_3"] = "46c0003fVGH", | ||
802 | |||
803 | -- Opcode COP1X. | ||
804 | lwxc1_2 = "4c000000FX", | ||
805 | ldxc1_2 = "4c000001FX", | ||
806 | luxc1_2 = "4c000005FX", | ||
807 | swxc1_2 = "4c000008FX", | ||
808 | sdxc1_2 = "4c000009FX", | ||
809 | suxc1_2 = "4c00000dFX", | ||
810 | prefx_2 = "4c00000fMX", | ||
811 | ["alnv.ps_4"] = "4c00001eFGHS", | ||
812 | ["madd.s_4"] = "4c000020FRGH", | ||
813 | ["madd.d_4"] = "4c000021FRGH", | ||
814 | ["madd.ps_4"] = "4c000026FRGH", | ||
815 | ["msub.s_4"] = "4c000028FRGH", | ||
816 | ["msub.d_4"] = "4c000029FRGH", | ||
817 | ["msub.ps_4"] = "4c00002eFRGH", | ||
818 | ["nmadd.s_4"] = "4c000030FRGH", | ||
819 | ["nmadd.d_4"] = "4c000031FRGH", | ||
820 | ["nmadd.ps_4"] = "4c000036FRGH", | ||
821 | ["nmsub.s_4"] = "4c000038FRGH", | ||
822 | ["nmsub.d_4"] = "4c000039FRGH", | ||
823 | ["nmsub.ps_4"] = "4c00003eFRGH", | ||
824 | |||
825 | }) do map_op[k] = v end | ||
826 | |||
827 | end | ||
828 | |||
607 | ------------------------------------------------------------------------------ | 829 | ------------------------------------------------------------------------------ |
608 | 830 | ||
609 | local function parse_gpr(expr) | 831 | local function parse_gpr(expr) |
@@ -633,7 +855,7 @@ local function parse_fpr(expr) | |||
633 | werror("bad register name `"..expr.."'") | 855 | werror("bad register name `"..expr.."'") |
634 | end | 856 | end |
635 | 857 | ||
636 | local function parse_imm(imm, bits, shift, scale, signed) | 858 | local function parse_imm(imm, bits, shift, scale, signed, action) |
637 | local n = tonumber(imm) | 859 | local n = tonumber(imm) |
638 | if n then | 860 | if n then |
639 | local m = sar(n, scale) | 861 | local m = sar(n, scale) |
@@ -651,7 +873,8 @@ local function parse_imm(imm, bits, shift, scale, signed) | |||
651 | match(imm, "^([%w_]+):([rf][1-3]?[0-9])$") then | 873 | match(imm, "^([%w_]+):([rf][1-3]?[0-9])$") then |
652 | werror("expected immediate operand, got register") | 874 | werror("expected immediate operand, got register") |
653 | else | 875 | else |
654 | waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) | 876 | waction(action or "IMM", |
877 | (signed and 32768 or 0)+shl(scale, 10)+shl(bits, 5)+shift, imm) | ||
655 | return 0 | 878 | return 0 |
656 | end | 879 | end |
657 | end | 880 | end |
@@ -756,13 +979,18 @@ map_op[".template__"] = function(params, template, nparams) | |||
756 | op = op + parse_disp(params[n]); n = n + 1 | 979 | op = op + parse_disp(params[n]); n = n + 1 |
757 | elseif p == "X" then | 980 | elseif p == "X" then |
758 | op = op + parse_index(params[n]); n = n + 1 | 981 | op = op + parse_index(params[n]); n = n + 1 |
759 | elseif p == "B" or p == "J" then | 982 | elseif p == "B" or p == "J" or p == "K" or p == "L" then |
760 | local mode, m, s = parse_label(params[n], false) | 983 | local mode, m, s = parse_label(params[n], false) |
761 | if p == "B" then m = m + 2048 end | 984 | if p == "J" then m = m + 0xa800 |
985 | elseif p == "K" then m = m + 0x5000 | ||
986 | elseif p == "L" then m = m + 0xa000 end | ||
762 | waction("REL_"..mode, m, s, 1) | 987 | waction("REL_"..mode, m, s, 1) |
763 | n = n + 1 | 988 | n = n + 1 |
764 | elseif p == "A" then | 989 | elseif p == "A" then |
765 | op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1 | 990 | op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1 |
991 | elseif p == "a" then | ||
992 | local m = parse_imm(params[n], 6, 6, 0, false, "IMMS"); n = n + 1 | ||
993 | op = op + band(m, 0x7c0) + band(shr(m, 9), 4) | ||
766 | elseif p == "M" then | 994 | elseif p == "M" then |
767 | op = op + parse_imm(params[n], 5, 11, 0, false); n = n + 1 | 995 | op = op + parse_imm(params[n], 5, 11, 0, false); n = n + 1 |
768 | elseif p == "N" then | 996 | elseif p == "N" then |
@@ -778,7 +1006,7 @@ map_op[".template__"] = function(params, template, nparams) | |||
778 | elseif p == "Z" then | 1006 | elseif p == "Z" then |
779 | op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 | 1007 | op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 |
780 | elseif p == "=" then | 1008 | elseif p == "=" then |
781 | op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo. | 1009 | n = n - 1 -- Re-use previous parameter for next template char. |
782 | else | 1010 | else |
783 | assert(false) | 1011 | assert(false) |
784 | end | 1012 | end |