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 c511f2b1..4d7f5069 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-2026 Mike Pall. All rights reserved. | 4 | -- Copyright (C) 2005-2026 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.5.0", |
| 13 | vernum = 10300, | 16 | vernum = 10500, |
| 14 | release = "2012-01-23", | 17 | release = "2021-05-02", |
| 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 |
