@@ -108,6 +108,13 @@ namespace MIPSComp {
108
108
}
109
109
}
110
110
111
+ static void InitRegs (u8 *vregs, int reg) {
112
+ vregs[0 ] = reg;
113
+ vregs[1 ] = reg + 1 ;
114
+ vregs[2 ] = reg + 2 ;
115
+ vregs[3 ] = reg + 3 ;
116
+ }
117
+
111
118
void IRFrontend::ApplyPrefixST (u8 *vregs, u32 prefix, VectorSize sz, int tempReg) {
112
119
if (prefix == 0xE4 )
113
120
return ;
@@ -119,6 +126,27 @@ namespace MIPSComp {
119
126
for (int i = 0 ; i < n; i++)
120
127
origV[i] = vregs[i];
121
128
129
+ // Some common vector prefixes
130
+ if (sz == V_Quad && IsConsecutive4 (vregs)) {
131
+ if (prefix == 0xF00E4 && IsConsecutive4 (vregs)) {
132
+ InitRegs (vregs, tempReg);
133
+ ir.Write (IROp::Vec4Neg, vregs[0 ], origV[0 ]);
134
+ return ;
135
+ }
136
+ if (prefix == 0x00FE4 && IsConsecutive4 (vregs)) {
137
+ InitRegs (vregs, tempReg);
138
+ ir.Write (IROp::Vec4Abs, vregs[0 ], origV[0 ]);
139
+ return ;
140
+ }
141
+ // Pure shuffle
142
+ if (prefix == (prefix & 0xFF )) {
143
+ InitRegs (vregs, tempReg);
144
+ ir.Write (IROp::Vec4Shuffle, vregs[0 ], origV[0 ], prefix);
145
+ return ;
146
+ }
147
+ }
148
+
149
+ // Alright, fall back to the generic approach.
122
150
for (int i = 0 ; i < n; i++) {
123
151
int regnum = (prefix >> (i * 2 )) & 3 ;
124
152
int abs = (prefix >> (8 + i)) & 1 ;
@@ -395,7 +423,6 @@ namespace MIPSComp {
395
423
GetVectorRegsPrefixT (tregs, sz, vt);
396
424
GetVectorRegsPrefixD (dregs, V_Single, vd);
397
425
398
- // TODO: applyprefixST here somehow (shuffle, etc...)
399
426
ir.Write (IROp::FMul, IRVTEMP_0, sregs[0 ], tregs[0 ]);
400
427
401
428
int n = GetNumVectorElements (sz);
@@ -1050,7 +1077,7 @@ namespace MIPSComp {
1050
1077
}
1051
1078
} else if (sz == M_4x4) {
1052
1079
// Tekken 6 has a case here: MEE
1053
- logBlocks = 1 ;
1080
+ // logBlocks = 1;
1054
1081
}
1055
1082
1056
1083
// Fallback. Expands a LOT
@@ -1141,8 +1168,8 @@ namespace MIPSComp {
1141
1168
tempregs[i] = temp;
1142
1169
}
1143
1170
for (int i = 0 ; i < n; i++) {
1144
- u8 temp = tempregs [i];
1145
- ir.Write (IROp::FMov, dregs[i], temp );
1171
+ if (tempregs[i] != dregs [i])
1172
+ ir.Write (IROp::FMov, dregs[i], tempregs[i] );
1146
1173
}
1147
1174
}
1148
1175
0 commit comments