Skip to content

Commit 62adab4

Browse files
authored
Merge pull request #257 from tclamb/master
Update additional PSP VFPU instructions
2 parents 2d7f351 + d730272 commit 62adab4

7 files changed

Lines changed: 427 additions & 5 deletions

File tree

Archs/MIPS/CMipsInstruction.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ int getImmediateBits(MipsImmediateType type)
3131
return 5;
3232
case MipsImmediateType::Immediate7:
3333
return 7;
34+
case MipsImmediateType::Immediate8:
35+
return 8;
3436
case MipsImmediateType::Immediate10:
3537
return 10;
3638
case MipsImmediateType::Immediate16:
@@ -285,6 +287,7 @@ void CMipsInstruction::encodeNormal() const
285287
case MipsImmediateType::Immediate26:
286288
case MipsImmediateType::Immediate20_0:
287289
case MipsImmediateType::Immediate7:
290+
case MipsImmediateType::Immediate8:
288291
case MipsImmediateType::ImmediateHalfFloat:
289292
encoding |= immediateData.primary.value;
290293
break;
@@ -344,6 +347,9 @@ void CMipsInstruction::encodeVfpu() const
344347
case MipsImmediateType::Immediate7:
345348
encoding |= immediateData.primary.value << 0;
346349
break;
350+
case MipsImmediateType::Immediate8:
351+
encoding |= immediateData.primary.value << 16;
352+
break;
347353
default:
348354
// TODO: Assert?
349355
break;

Archs/MIPS/CMipsInstruction.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ enum class MipsImmediateType
3939
CacheOp,
4040
Ext,
4141
Ins,
42-
Cop2BranchType
42+
Cop2BranchType,
43+
Immediate8
4344
};
4445

4546
struct MipsRegisterValue

Archs/MIPS/MipsOpcodes.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ const tMipsOpcode MipsOpcodes[] = {
698698
{ "vi2f.S", "vd,vs,i5", MIPS_VFPU4(0x14), MA_PSP, MO_VFPU },
699699
{ "vcmovt.S", "vd,vs,i5", MIPS_VFPU4(0x15)|0, MA_PSP, MO_VFPU },
700700
{ "vcmovf.S", "vd,vs,i5", MIPS_VFPU4(0x15)|(1<<19), MA_PSP, MO_VFPU },
701-
{ "vwbn.S", "vd,vs,i5", MIPS_VFPU4(0x18), MA_PSP, MO_VFPU },
701+
{ "vwbn.s", "vd,vs,i8", MIPS_VFPU4(0x18), MA_PSP, MO_VFPU|MO_VFPU_SINGLE },
702702

703703
// 31-------------21-------16--------------------------------------0
704704
// |= VF4-1.1 | rt | |
@@ -771,7 +771,7 @@ const tMipsOpcode MipsOpcodes[] = {
771771
{ "vbfy1.S", "vd,vs", MIPS_VFPU4_13(0x02), MA_PSP, MO_VFPU },
772772
{ "vbfy2.S", "vd,vs", MIPS_VFPU4_13(0x03), MA_PSP, MO_VFPU },
773773
{ "vocp.S", "vd,vs", MIPS_VFPU4_13(0x04), MA_PSP, MO_VFPU },
774-
{ "vsocp.S", "vd,vs", MIPS_VFPU4_13(0x05), MA_PSP, MO_VFPU },
774+
{ "vsocp.S", "vDd,vs", MIPS_VFPU4_13(0x05), MA_PSP, MO_VFPU },
775775
{ "vfad.p", "vSd,vs", MIPS_VFPU4_13(0x06)|MIPS_VFPUSIZE(1), MA_PSP, MO_VFPU|MO_VFPU_PAIR },
776776
{ "vfad.t", "vSd,vs", MIPS_VFPU4_13(0x06)|MIPS_VFPUSIZE(2), MA_PSP, MO_VFPU|MO_VFPU_TRIPLE },
777777
{ "vfad.q", "vSd,vs", MIPS_VFPU4_13(0x06)|MIPS_VFPUSIZE(3), MA_PSP, MO_VFPU|MO_VFPU_QUAD },
@@ -810,10 +810,11 @@ const tMipsOpcode MipsOpcodes[] = {
810810
// *1: vcrsp.t/vqmul.q
811811
{ "vmmul.S", "md,ms,mt", MIPS_VFPU6(0), MA_PSP, MO_VFPU|MO_VFPU_TRANSPOSE_VS },
812812
{ "vtfm2.p", "vd,ms,vt", MIPS_VFPU6(1)|MIPS_VFPUSIZE(1), MA_PSP, MO_VFPU|MO_VFPU_PAIR },
813-
{ "vhtfm2.p", "vd,ms,vt", MIPS_VFPU6(2)|MIPS_VFPUSIZE(1), MA_PSP, MO_VFPU|MO_VFPU_PAIR },
813+
{ "vhtfm2.p", "vd,ms,vt", MIPS_VFPU6(1)|MIPS_VFPUSIZE(0), MA_PSP, MO_VFPU|MO_VFPU_PAIR },
814814
{ "vtfm3.t", "vd,ms,vt", MIPS_VFPU6(2)|MIPS_VFPUSIZE(2), MA_PSP, MO_VFPU|MO_VFPU_TRIPLE },
815-
{ "vhtfm3.t", "vd,ms,vt", MIPS_VFPU6(3)|MIPS_VFPUSIZE(2), MA_PSP, MO_VFPU|MO_VFPU_TRIPLE },
815+
{ "vhtfm3.t", "vd,ms,vt", MIPS_VFPU6(2)|MIPS_VFPUSIZE(1), MA_PSP, MO_VFPU|MO_VFPU_TRIPLE },
816816
{ "vtfm4.q", "vd,ms,vt", MIPS_VFPU6(3)|MIPS_VFPUSIZE(3), MA_PSP, MO_VFPU|MO_VFPU_QUAD },
817+
{ "vhtfm4.q", "vd,ms,vt", MIPS_VFPU6(3)|MIPS_VFPUSIZE(2), MA_PSP, MO_VFPU|MO_VFPU_QUAD },
817818
{ "vmscl.S", "md,ms,vSt", MIPS_VFPU6(4), MA_PSP, MO_VFPU },
818819
{ "vcrsp.t", "vd,vs,vt", MIPS_VFPU6(5)|MIPS_VFPUSIZE(2), MA_PSP, MO_VFPU|MO_VFPU_TRIPLE },
819820
{ "vqmul.q", "vd,vs,vt", MIPS_VFPU6(5)|MIPS_VFPUSIZE(3), MA_PSP, MO_VFPU|MO_VFPU_QUAD },

Archs/MIPS/MipsParser.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,7 @@ bool MipsParser::parseVfpuRegister(Parser& parser, MipsRegisterValue& reg, int s
520520
break;
521521
case 'e': // transposed matrix
522522
reg.num |= (1 << 5);
523+
std::swap(col,row);
523524
[[fallthrough]];
524525
case 'm': // matrix
525526
reg.type = MipsRegisterType::VfpuMatrix;
@@ -1139,6 +1140,9 @@ static bool decodeImmediateSize(const char*& encoding, MipsImmediateType& dest)
11391140
case 7:
11401141
dest = MipsImmediateType::Immediate7;
11411142
break;
1143+
case 8:
1144+
dest = MipsImmediateType::Immediate8;
1145+
break;
11421146
case 10:
11431147
dest = MipsImmediateType::Immediate10;
11441148
break;

Readme.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,8 +1182,10 @@ will align the memory address to a multiple of 4, then create a label named `Mai
11821182

11831183
* Current Development Version
11841184
* *BREAKING* changes to PSP VFPU instruction parsing
1185+
* fixed transposed matrix register encoding (e.g. `vmidt.p E220` was assembling to `vmidt.p E202`)
11851186
* renamed `vuc2i.s` to [`vuc2ifs.s`](https://pspdev.github.io/vfpu-docs/#vuc2ifs.s)
11861187
* changed [`vfim.s`](https://pspdev.github.io/vfpu-docs/#vfim.s) half float immediate parsing from binary representation to float literals (was:`vfim.s S100,0x3f800000`, now: `vfim.s S100,1.0`)
1188+
* removed invalid instructions `vwbn.p`/`vwbn.t`/`vwbn.q`
11871189
* removed invalid instructions `vsbn.p`/`vsbn.t`/`vsbn.q`
11881190
* removed invalid instructions `vdet.s`/`vdet.t`/`vdet.q`
11891191
* removed invalid instructions `vcrs.s`/`vcrs.p`/`vcrs.q`
@@ -1193,6 +1195,8 @@ will align the memory address to a multiple of 4, then create a label named `Mai
11931195
* removed invalid instruction `vavg.s`
11941196
* removed invalid instruction `vfad.s`
11951197
* corrected output encodings for [`vdet.p`](https://pspdev.github.io/vfpu-docs/#vdet.p) & [`vcrs.t`](https://pspdev.github.io/vfpu-docs/#vcrs.t)
1198+
* corrected output encodings for [`vhtfm2.p`](https://pspdev.github.io/vfpu-docs/#vhtfm2.p) & [`vhtfm3.t`](https://pspdev.github.io/vfpu-docs/#vhtfm3.t)
1199+
* fixed `vd` register size for [`vsocp.s`](https://pspdev.github.io/vfpu-docs/#vsocp.s) & [`vsocp.p`](https://pspdev.github.io/vfpu-docs/#vsocp.p)
11961200
* fixed `vd` register size for [`vdot.p`](https://pspdev.github.io/vfpu-docs/#vdot.p)/[`vdot.t`](https://pspdev.github.io/vfpu-docs/#vdot.q)/[`vdot.t`](https://pspdev.github.io/vfpu-docs/#vdot.q) (was: `vdot.t C103,C201,C201`, now: `vdot.t S103,C201,C201`)
11971201
* fixed `vd` register size for [`vhdp.p`](https://pspdev.github.io/vfpu-docs/#vhdp.p)/[`vhdp.t`](https://pspdev.github.io/vfpu-docs/#vhdp.q)/[`vhdp.t`](https://pspdev.github.io/vfpu-docs/#vhdp.q) (was: `vhdp.t C103,C201,C201`, now: `vhdp.t S103,C201,C201`)
11981202
* fixed `vd` register size for [`vdet.p`](https://pspdev.github.io/vfpu-docs/#vdet.p) (was: `vdet.p C103,C202,C212`, now: `vdet.p S103,C202,C212`)
@@ -1226,6 +1230,8 @@ will align the memory address to a multiple of 4, then create a label named `Mai
12261230
* fixed numeric constant operations for `vpfxs`/`vpfxt` (e.g. `vpfxs 1,1/2,1,0`)
12271231
* added write mask operation to `vpfxd` to skip writing a channel (e.g. `vpfxd ,,,m` prevents writing the last channel)
12281232
* added empty prefix to `vpfxd` to leave a channel unmodified (e.g. `vpfxd ,,,m` leaves the first three channels unmodified)
1233+
* fixed immediate size for [`vwbn.s`](https://pspdev.github.io/vfpu-docs/#vwbn.s) (is 8 bits, was limited to 5 bits)
1234+
* added missing instruction [`vhtfm4.q`](https://pspdev.github.io/vfpu-docs/#vhtfm4.q)
12291235
* Version 0.11
12301236
* new `.aligna` directive for absolute address alignment
12311237
* new expression functions: `org(label)`, `orga(label)`, `headersize(label)`

0 commit comments

Comments
 (0)