summaryrefslogtreecommitdiff
path: root/compiler_and_linker
diff options
context:
space:
mode:
authorAsh Wolf <ninji@wuffs.org>2023-01-11 22:29:53 +0000
committerAsh Wolf <ninji@wuffs.org>2023-01-11 22:29:53 +0000
commit0bec4f557a96e1a40437cf5af20cc78a5eec8a63 (patch)
treec1e05ec804c43aa5a8f5f21b0ed02d0587d29563 /compiler_and_linker
parentaec1b8dddc68ecb8288ec6132932e4c7b4bca09f (diff)
downloadMWCC-0bec4f557a96e1a40437cf5af20cc78a5eec8a63.tar.gz
MWCC-0bec4f557a96e1a40437cf5af20cc78a5eec8a63.zip
getting closer
Diffstat (limited to '')
-rw-r--r--compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Options/Glue/TargetWarningHelpers-ppc-cc.c22
-rw-r--r--compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/cc-mach-ppc.c36
-rw-r--r--compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/libimp-mach-ppc.c4
-rw-r--r--compiler_and_linker/FrontEnd/C/CPrep.c1362
-rw-r--r--compiler_and_linker/FrontEnd/C/CPrepTokenizer.c106
-rw-r--r--compiler_and_linker/FrontEnd/C/CScope.c413
-rw-r--r--compiler_and_linker/FrontEnd/Common/CompilerTools.c29
-rw-r--r--compiler_and_linker/unsorted/AddPropagation.c18
-rw-r--r--compiler_and_linker/unsorted/Alias.c26
-rw-r--r--compiler_and_linker/unsorted/CABI.c2
-rw-r--r--compiler_and_linker/unsorted/CClass.c4
-rw-r--r--compiler_and_linker/unsorted/CCompiler.c8
-rw-r--r--compiler_and_linker/unsorted/CDecl.c472
-rw-r--r--compiler_and_linker/unsorted/CError.c22
-rw-r--r--compiler_and_linker/unsorted/CExpr.c280
-rw-r--r--compiler_and_linker/unsorted/CExpr2.c42
-rw-r--r--compiler_and_linker/unsorted/CExprConvMatch.c4
-rw-r--r--compiler_and_linker/unsorted/CFunc.c10
-rw-r--r--compiler_and_linker/unsorted/CInit.c210
-rw-r--r--compiler_and_linker/unsorted/CInline.c2
-rw-r--r--compiler_and_linker/unsorted/CInt64.c2
-rw-r--r--compiler_and_linker/unsorted/CMachine.c172
-rw-r--r--compiler_and_linker/unsorted/CParser.c202
-rw-r--r--compiler_and_linker/unsorted/CPrec.c4
-rw-r--r--compiler_and_linker/unsorted/CTemplateClass.c2
-rw-r--r--compiler_and_linker/unsorted/CTemplateNew.c2
-rw-r--r--compiler_and_linker/unsorted/CTemplateTools.c2
-rw-r--r--compiler_and_linker/unsorted/CodeGen.c92
-rw-r--r--compiler_and_linker/unsorted/CodeMotion.c26
-rw-r--r--compiler_and_linker/unsorted/Coloring.c2
-rw-r--r--compiler_and_linker/unsorted/ConstantPropagation.c22
-rw-r--r--compiler_and_linker/unsorted/CopyPropagation.c14
-rw-r--r--compiler_and_linker/unsorted/Exceptions.c2
-rw-r--r--compiler_and_linker/unsorted/FuncLevelAsmPPC.c8
-rw-r--r--compiler_and_linker/unsorted/GCCInlineAsm.c6
-rw-r--r--compiler_and_linker/unsorted/GenStabs.c2
-rw-r--r--compiler_and_linker/unsorted/InlineAsm.c14
-rw-r--r--compiler_and_linker/unsorted/InlineAsmPPC.c80
-rw-r--r--compiler_and_linker/unsorted/InlineAsmRegisters.c2
-rw-r--r--compiler_and_linker/unsorted/InstrSelection.c991
-rw-r--r--compiler_and_linker/unsorted/InterferenceGraph.c12
-rw-r--r--compiler_and_linker/unsorted/IroDump.c2
-rw-r--r--compiler_and_linker/unsorted/IroLinearForm.c10
-rw-r--r--compiler_and_linker/unsorted/IroPointerAnalysisADTs.c4
-rw-r--r--compiler_and_linker/unsorted/LiveVariables.c157
-rw-r--r--compiler_and_linker/unsorted/LoopDetection.c9
-rw-r--r--compiler_and_linker/unsorted/LoopOptimization.c18
-rw-r--r--compiler_and_linker/unsorted/MachineSimulation601.c552
-rw-r--r--compiler_and_linker/unsorted/MachineSimulation603.c626
-rw-r--r--compiler_and_linker/unsorted/MachineSimulation603e.c650
-rw-r--r--compiler_and_linker/unsorted/MachineSimulation604.c670
-rw-r--r--compiler_and_linker/unsorted/MachineSimulation7400.c744
-rw-r--r--compiler_and_linker/unsorted/MachineSimulation750.c678
-rw-r--r--compiler_and_linker/unsorted/MachineSimulation821.c615
-rw-r--r--compiler_and_linker/unsorted/MachineSimulationAltiVec.c752
-rw-r--r--compiler_and_linker/unsorted/ObjGenMachO.c4
-rw-r--r--compiler_and_linker/unsorted/OpcodeInfo.c435
-rw-r--r--compiler_and_linker/unsorted/Operands.c100
-rw-r--r--compiler_and_linker/unsorted/PCode.c22
-rw-r--r--compiler_and_linker/unsorted/PCodeAssembly.c58
-rw-r--r--compiler_and_linker/unsorted/PCodeInfo.c41
-rw-r--r--compiler_and_linker/unsorted/PCodeListing.c50
-rw-r--r--compiler_and_linker/unsorted/PCodeUtilities.c27
-rw-r--r--compiler_and_linker/unsorted/Peephole.c146
-rw-r--r--compiler_and_linker/unsorted/RegisterInfo.c2
-rw-r--r--compiler_and_linker/unsorted/Scheduler.c16
-rw-r--r--compiler_and_linker/unsorted/SpillCode.c8
-rw-r--r--compiler_and_linker/unsorted/StackFrame.c10
-rw-r--r--compiler_and_linker/unsorted/StrengthReduction.c8
-rw-r--r--compiler_and_linker/unsorted/UseDefChains.c32
-rw-r--r--compiler_and_linker/unsorted/ValueNumbering.c28
-rw-r--r--compiler_and_linker/unsorted/VectorArraysToRegs.c6
-rw-r--r--compiler_and_linker/unsorted/uDump.c2
73 files changed, 9161 insertions, 2052 deletions
diff --git a/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Options/Glue/TargetWarningHelpers-ppc-cc.c b/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Options/Glue/TargetWarningHelpers-ppc-cc.c
index 31b718f..db6165c 100644
--- a/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Options/Glue/TargetWarningHelpers-ppc-cc.c
+++ b/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Options/Glue/TargetWarningHelpers-ppc-cc.c
@@ -21,16 +21,16 @@ int TargetSetWarningFlags(short val, Boolean set) {
case 'Uv': pWarningC.warn_unusedvar = set; break;
case 'Ua': pWarningC.warn_unusedarg = set; break;
case 'Ec': pWarningC.warn_extracomma = set; break;
- case 'Pe': pWarningC.pedantic = set; break;
+ case 'Pd': pWarningC.pedantic = set; break;
case 'Hv': pWarningC.warn_hidevirtual = set; break;
case 'Ic': pWarningC.warn_implicitconv = set; break;
case 'Ni': pWarningC.warn_notinlined = set; break;
case 'Sc': pWarningC.warn_structclass = set; break;
- case 'Pa': pExtraWarningC.warn_padding = set ? 1 : 2; break;
- case 'Nu': pExtraWarningC.warn_resultnotused = set ? 1 : 2; break;
- case 'Se': pExtraWarningC.warn_no_side_effect = set ? 1 : 2; break;
- case 'PI': pExtraWarningC.warn_ptr_int_conv = set ? 1 : 2; break;
- case 'La': pExtraWarningC.warn_largeargs = set ? 1 : 2; break;
+ case 'Pa': pExtraWarningC.warn_padding = set ? PR_ON : PR_OFF; break;
+ case 'Nu': pExtraWarningC.warn_resultnotused = set ? PR_ON : PR_OFF; break;
+ case 'Se': pExtraWarningC.warn_no_side_effect = set ? PR_ON : PR_OFF; break;
+ case 'PI': pExtraWarningC.warn_ptr_int_conv = set ? PR_ON : PR_OFF; break;
+ case 'La': pExtraWarningC.warn_largeargs = set ? PR_ON : PR_OFF; break;
case 'We': pWarningC.warningerrors = set; break;
case 'Cp': pFrontEndC.checkprotos = set; break;
default: return 0;
@@ -64,15 +64,15 @@ void TargetDisplayWarningOptions(Handle txt) {
HPrintF(txt, "\t- 'inline' not performed\n");
if (pWarningC.warn_structclass)
HPrintF(txt, "\t- struct/class conflict\n");
- if (pExtraWarningC.warn_largeargs)
+ if (pExtraWarningC.warn_largeargs == 1)
HPrintF(txt, "\t- large args passed to unprototyped functions\n");
- if (pExtraWarningC.warn_padding)
+ if (pExtraWarningC.warn_padding == 1)
HPrintF(txt, "\t- padding added between struct members\n");
- if (pExtraWarningC.warn_resultnotused)
+ if (pExtraWarningC.warn_resultnotused == 1)
HPrintF(txt, "\t- result of non-void function call not used\n");
- if (pExtraWarningC.warn_no_side_effect)
+ if (pExtraWarningC.warn_no_side_effect == 1)
HPrintF(txt, "\t- use of expressions as statements without side effects\n");
- if (pExtraWarningC.warn_ptr_int_conv)
+ if (pExtraWarningC.warn_ptr_int_conv == 1)
HPrintF(txt, "\t- implicit integer/pointer conversions\n");
if (pFrontEndC.checkprotos)
HPrintF(txt, "\t- checking prototypes\n");
diff --git a/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/cc-mach-ppc.c b/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/cc-mach-ppc.c
index fc6206c..5965d11 100644
--- a/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/cc-mach-ppc.c
+++ b/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/cc-mach-ppc.c
@@ -85,7 +85,7 @@ CWPLUGIN_ENTRY (CWPlugin_GetPanelList)(const CWPanelList **panelList) {
}
static CWPLUGIN_ENTRY (CmdLine_GetObjectFlags)(const CWObjectFlags **objectFlags) {
- static const CWObjectFlags sFlags = {
+ static const CWObjectFlags myFlags = {
2,
0x80000000,
".o",
@@ -101,7 +101,7 @@ static CWPLUGIN_ENTRY (CmdLine_GetObjectFlags)(const CWObjectFlags **objectFlags
CWFOURCHAR('C','W','I','E'), CWFOURCHAR('T','E','X','T')
};
- *objectFlags = &sFlags;
+ *objectFlags = &myFlags;
return 0;
}
@@ -361,8 +361,7 @@ static const char *STR10000[] = {
"possible unwanted ';'",
"possible unwanted assignment",
"possible unwanted compare",
- "illegal implicit conversion from '%t' to",
- "'%t'",
+ "illegal implicit conversion from '%t' to\n'%t'",
"local data >32k",
"illegal jump past initializer",
"illegal ctor initializer",
@@ -370,12 +369,10 @@ static const char *STR10000[] = {
"cannot construct %t's direct member '%u'",
"#if nesting overflow",
"illegal empty declaration",
- "illegal implicit enum conversion from '%t' to",
- "'%t'",
+ "illegal implicit enum conversion from '%t' to\n'%t'",
"illegal use of #pragma parameter",
"virtual functions cannot be pascal functions",
- "illegal implicit const/volatile pointer conversion from '%t' to",
- "'%t'",
+ "illegal implicit const/volatile pointer conversion from '%t' to\n'%t'",
"illegal use of non-static member",
"illegal precompiled header version",
"illegal precompiled header compiler flags or target",
@@ -399,23 +396,14 @@ static const char *STR10000[] = {
"illegal constructor/destructor declaration",
"'catch' expected",
"#include nesting overflow",
- "cannot convert",
- "'%t' to",
- "'%t'",
- "type mismatch",
- "'%t' and",
- "'%t'",
+ "cannot convert\n'%t' to\n'%t'",
+ "type mismatch\n'%t' and\n'%t'",
"class type expected",
- "illegal explicit conversion from '%t' to",
- "'%t'",
+ "illegal explicit conversion from '%t' to\n'%t'",
"function call '*' does not match",
- "identifier '%u' redeclared",
- "was declared as: '%t'",
- "now declared as: '%t'",
+ "identifier '%u' redeclared\nwas declared as: '%t'\nnow declared as: '%t'",
"cannot throw class with ambiguous base class ('%u')",
- "class '%t': '%o' has more than one final overrider:",
- "'%o'",
- "and '%o'",
+ "class '%t': '%o' has more than one final overrider:\n'%o'\nand '%o'",
"exception handling option is disabled",
"cannot delete pointer to const",
"cannot destroy const object",
@@ -469,9 +457,7 @@ static const char *STR10000[] = {
"illegal use of 'super'",
"illegal message receiver",
"receiver cannot handle this message",
- "ambiguous message selector",
- "used: '%m'",
- "also had: '%m'",
+ "ambiguous message selector\nused: '%m'\nalso had: '%m'",
"unknown message selector",
"illegal use of Objective-C object",
"protocol '%u' redefined",
diff --git a/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/libimp-mach-ppc.c b/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/libimp-mach-ppc.c
index b62d413..a0cf8c7 100644
--- a/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/libimp-mach-ppc.c
+++ b/compiler_and_linker/CmdLine_Tools/MacOS_PPC/Tools_PPC/Src/Plugin/libimp-mach-ppc.c
@@ -94,7 +94,7 @@ static CWPLUGIN_ENTRY (PPCLibImport_GetFileTypeMappings)(const OSFileTypeMapping
}
static CWPLUGIN_ENTRY (PPCLibImport_GetObjectFlags)(const CWObjectFlags **objectFlags) {
- static const CWObjectFlags sFlags = {
+ static const CWObjectFlags myFlags = {
2,
0,
NULL,
@@ -110,7 +110,7 @@ static CWPLUGIN_ENTRY (PPCLibImport_GetObjectFlags)(const CWObjectFlags **object
0, 0
};
- *objectFlags = &sFlags;
+ *objectFlags = &myFlags;
return 0;
}
diff --git a/compiler_and_linker/FrontEnd/C/CPrep.c b/compiler_and_linker/FrontEnd/C/CPrep.c
index f38c504..80472b1 100644
--- a/compiler_and_linker/FrontEnd/C/CPrep.c
+++ b/compiler_and_linker/FrontEnd/C/CPrep.c
@@ -1,16 +1,25 @@
-#include "compiler.h"
+#include "compiler/CPrep.h"
+#include "compiler/CBrowse.h"
+#include "compiler/CCompiler.h"
#include "compiler/CError.h"
+#include "compiler/CException.h"
#include "compiler/CInt64.h"
-#include "compiler/objects.h"
-#include "compiler/scopes.h"
-#include "compiler/tokens.h"
-#include "cos.h"
#include "compiler/CMachine.h"
#include "compiler/CParser.h"
-#include "compiler/CPrep.h"
+#include "compiler/CPrec.h"
+#include "compiler/CPreprocess.h"
#include "compiler/CPrepTokenizer.h"
#include "compiler/CScope.h"
+#include "compiler/CSOM.h"
#include "compiler/CodeGen.h"
+#include "compiler/CompilerTools.h"
+#include "compiler/FuncLevelAsmPPC.h"
+#include "compiler/IroPointerAnalysis.h"
+#include "compiler/ObjGenMachO.h"
+#include "compiler/objects.h"
+#include "compiler/scopes.h"
+#include "compiler/tokens.h"
+#include "cos.h"
#ifdef __MWERKS__
#pragma options align=mac68k
@@ -31,17 +40,16 @@ enum {
IfState_1 = 1,
IfState_2 = 2,
IfState_3 = 3,
- IfState_4 = 4,
- IfState_5 = 5
+ IfState_4 = 4
};
// forward declarations
-static PrepValue CPrep_ParseCond();
-static PrepValue CPrep_ParseBinary(PrepValue *rhs, short op);
+static PrepValue CPrep_ParseCond(void);
+static PrepValue CPrep_ParseBinary(PrepValue *rhs, short precLimit);
static char *XpandMacro(Macro *macro);
static void prepmacro(Macro *macro);
-static void prepifskip();
-static void gotonexttoken();
+static void prepifskip(void);
+static void gotonexttoken(void);
extern SInt16 *CLT_filesp;
extern CPrepFileInfo **CLT_filestack;
@@ -305,7 +313,7 @@ static void cannotopenerror(StringPtr filename, Boolean err) {
if (prep_file) {
was_prep_error = 1;
- CError_Error(151, fname);
+ CError_Error(CErrorStr151, fname);
if (err)
longjmp(errorreturn, 1);
} else {
@@ -325,7 +333,7 @@ void CPrep_InsertSpecialMacro(Macro *macro, char *name) {
insertmacro(macro);
}
-void CPrep_InsertSpecialMacros() {
+void CPrep_InsertSpecialMacros(void) {
CPrep_InsertSpecialMacro(&lineM, "__LINE__");
CPrep_InsertSpecialMacro(&fileM, "__FILE__");
CPrep_InsertSpecialMacro(&dateM, "__DATE__");
@@ -343,7 +351,7 @@ void CPrep_InsertSpecialMacros() {
CodeGen_InsertSpecialMacros();
}
-void CPrep_RemoveSpecialMacros() {
+void CPrep_RemoveSpecialMacros(void) {
Macro **scan;
int x;
@@ -359,11 +367,11 @@ void CPrep_RemoveSpecialMacros() {
}
}
-static void CPrep_Reconfig() {
+static void CPrep_Reconfig(void) {
cprep_idarray['$'] = copts.dollar_identifiers != 0;
}
-Boolean setupprep() {
+Boolean setupprep(void) {
int x;
now_time = time(NULL);
@@ -436,7 +444,7 @@ Boolean setupprep() {
return 0;
}
-void cleanupprep() {
+void cleanupprep(void) {
while (filesp >= 0)
popfile();
@@ -494,7 +502,7 @@ static Boolean setupfile(StringPtr filename, Boolean flag1, Boolean flag2) {
if (filesp >= 31) {
was_prep_error = 1;
- CError_ErrorTerm(243);
+ CError_ErrorTerm(CErrorStr243);
return 0;
}
@@ -657,11 +665,10 @@ void CPrep_TokenStreamSetState(SInt32 *state) {
ts_current = ts_first + *state;
}
-void CPrep_UnLex() {
+void CPrep_UnLex(void) {
++ts_preread_elements;
--ts_current;
-#line 900
- CError_ASSERT(ts_current >= ts_first);
+ CError_ASSERT(900, ts_current >= ts_first);
}
void CPrep_TokenStreamSetCurState(SInt32 *state) {
@@ -726,7 +733,7 @@ loop:
}
if (!t)
return 0;
- if (t == TK_NEG7) {
+ if (t == TK_EOL) {
t = lex();
v++;
}
@@ -795,7 +802,7 @@ loop:
return v;
}
-void CPrep_StreamGetBlock(TStream *stream, CPrepStreamFuncPtr func, int arg) {
+void CPrep_StreamGetBlock(TokenStream *stream, CPrepStreamFuncPtr func, int arg) {
Boolean save_eoltokens;
SInt32 start_offset;
Boolean tryflag;
@@ -814,20 +821,20 @@ void CPrep_StreamGetBlock(TStream *stream, CPrepStreamFuncPtr func, int arg) {
tryflag = 1;
case ':':
if (!(count = CPrep_StreamSkipToBrace(func, 0))) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
cprep_eoltokens = save_eoltokens;
return;
}
case '{':
break;
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
cprep_eoltokens = save_eoltokens;
return;
}
if (!(count = CPrep_StreamSkipBlock(func, count))) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
cprep_eoltokens = save_eoltokens;
return;
}
@@ -835,12 +842,12 @@ void CPrep_StreamGetBlock(TStream *stream, CPrepStreamFuncPtr func, int arg) {
if (tryflag) {
tryloop:
switch (lex()) {
- case TK_NEG7:
+ case TK_EOL:
count++;
goto tryloop;
case TK_CATCH:
if (!(count = CPrep_StreamSkipToBrace(func, count)) || !(count = CPrep_StreamSkipBlock(func, count))) {
- CError_Error(242);
+ CError_Error(CErrorStr242);
cprep_eoltokens = save_eoltokens;
return;
}
@@ -848,7 +855,7 @@ void CPrep_StreamGetBlock(TStream *stream, CPrepStreamFuncPtr func, int arg) {
goto tryloop;
break;
default:
- CError_Error(242);
+ CError_Error(CErrorStr242);
cprep_eoltokens = save_eoltokens;
return;
}
@@ -860,7 +867,7 @@ void CPrep_StreamGetBlock(TStream *stream, CPrepStreamFuncPtr func, int arg) {
memcpy(stream->firsttoken, ts_first + start_offset, count * sizeof(TStreamElement));
}
-void CPrep_StreamGetSemicolon(TStream *stream, CPrepStreamFuncPtr func) {
+void CPrep_StreamGetSemicolon(TokenStream *stream, CPrepStreamFuncPtr func) {
SInt32 count;
SInt32 start_offset;
Boolean save_eoltokens;
@@ -887,7 +894,7 @@ void CPrep_StreamGetSemicolon(TStream *stream, CPrepStreamFuncPtr func) {
cprep_eoltokens = save_eoltokens;
}
-void CPrep_StreamGetTemplate(TStream *stream, CPrepStreamFuncPtr func) {
+void CPrep_StreamGetTemplate(TokenStream *stream, CPrepStreamFuncPtr func) {
SInt32 count;
SInt32 start_offset;
Boolean save_eoltokens;
@@ -903,9 +910,9 @@ void CPrep_StreamGetTemplate(TStream *stream, CPrepStreamFuncPtr func) {
loop:
switch (tk) {
case 0:
- CError_ErrorTerm(102);
+ CError_ErrorTerm(CErrorStr102);
case '}':
- CError_Error(229);
+ CError_Error(CErrorStr229);
return;
case ';':
count++;
@@ -940,7 +947,7 @@ loop:
if (level <= 0)
break;
if (!(tk = lex()))
- CError_ErrorTerm(102);
+ CError_ErrorTerm(CErrorStr102);
} while (1);
if (lookahead() == ';') {
tk = lex();
@@ -954,7 +961,7 @@ loop:
cprep_eoltokens = save_eoltokens;
}
-void CPrep_StreamInsert(TStream *stream, SInt32 *state) {
+void CPrep_StreamInsert(TokenStream *stream, SInt32 *state) {
if (ts_preread_elements + (ts_current - ts_first) + stream->tokens >= ts_elements)
CPrep_TSBufferGrow(stream->tokens);
if (ts_preread_elements)
@@ -964,7 +971,7 @@ void CPrep_StreamInsert(TStream *stream, SInt32 *state) {
CPrep_TokenStreamGetState(state);
}
-void CPrep_StreamRemove(TStream *stream, SInt32 *state) {
+void CPrep_StreamRemove(TokenStream *stream, SInt32 *state) {
TStreamElement *end;
SInt32 amount;
@@ -979,14 +986,13 @@ void CPrep_StreamRemove(TStream *stream, SInt32 *state) {
}
void CPrep_RemoveTokens(SInt32 amount) {
-#line 1296
- CError_ASSERT(ts_preread_elements >= amount);
+ CError_ASSERT(1296, ts_preread_elements >= amount);
ts_preread_elements -= amount;
memmove(ts_current, ts_current + amount, sizeof(TStreamElement) * ts_preread_elements);
}
-void CPrep_TokenStreamFlush() {
+void CPrep_TokenStreamFlush(void) {
if (!ts_preread_elements)
ts_current = ts_first;
}
@@ -1060,7 +1066,7 @@ static int CPrep_TokenSize(char *str) {
return 1;
}
-TStreamElement *CPrep_CurStreamElement() {
+TStreamElement *CPrep_CurStreamElement(void) {
static TStreamElement dummyelement;
if (ts_first < ts_current)
return ts_current - 1;
@@ -1091,10 +1097,8 @@ void CPrep_GetTokenContext(TStreamElement *token, CPrepFileInfo **tokenfile, SIn
if (!token && ts_first < ts_current)
prevtoken = ts_current - 1;
- if (prevtoken && !prevtoken->tokenfile) {
-#line 1454
- CError_FATAL();
- }
+ if (prevtoken && !prevtoken->tokenfile)
+ CError_FATAL(1454);
if (was_prep_error || !prevtoken) {
if (!prep_file)
@@ -1147,13 +1151,13 @@ void CPrep_GetTokenContext(TStreamElement *token, CPrepFileInfo **tokenfile, SIn
while (r5 < 80 && (r7 - r5) >= r4 && r7[-r5] != '\r')
r5++;
r5--;
- while ((c = r7[-r5]) && (c == ' ' || c == '\t' || c == 4))
+ while ((c = r7[-r5]) && (c == ' ' || c == '\t' || c == TK_4))
r5--;
r6 = 0;
while ((c = r7[-r5]) != '\r' && c && r6 < 126) {
if (!r5)
*tokenoffset = r6;
- if (c != 4) {
+ if (c != TK_4) {
buf1[r6++] = (c != '\t') ? c : ' ';
}
r5--;
@@ -1200,7 +1204,7 @@ void CPrep_ErrorName(short code, const char *name) {
in_assembler = 0;
was_prep_error = 1;
if (code == 102 && (tokenstacklevel > 0 || pos < prep_file_end))
- CError_Error(105, name);
+ CError_Error(CErrorStr105, name);
else
CError_Error(code, name);
in_assembler = save;
@@ -1238,18 +1242,20 @@ void CPrep_ErrorMessageVA(int code, const char *format, va_list list, Boolean fl
in_assembler = save;
}
-void popfile() {
- // r5 and r6 are swapped, not sure why
+void popfile(void) {
+ CPrepFileInfo *file;
+
if (filesp >= 0) {
CWReleaseFileText(cparamblkptr->context, prep_file->textbuffer);
prep_file->textbuffer = NULL;
if (--filesp >= 0) {
- prep_file = filestack[filesp];
- prep_file_start = prep_file->textbuffer;
- prep_file_end = prep_file->textbuffer + prep_file->textlength;
- pos = prep_file_start + prep_file->pos;
- linenumber = prep_file->linenumber;
- cprep_hasprepline = prep_file->hasprepline;
+ file = filestack[filesp];
+ prep_file = file;
+ prep_file_start = file->textbuffer;
+ prep_file_end = file->textbuffer + file->textlength;
+ pos = prep_file_start + file->pos;
+ linenumber = file->linenumber;
+ cprep_hasprepline = file->hasprepline;
at_linestart = 1;
}
if (preprocessing_only && !copts.simple_prepdump)
@@ -1257,7 +1263,7 @@ void popfile() {
}
}
-static SInt32 prepoffset() {
+static SInt32 prepoffset(void) {
if (filesp > 0)
return filestack[0]->pos;
else if (tokenstacklevel)
@@ -1266,7 +1272,7 @@ static SInt32 prepoffset() {
return pos - filestack[0]->textbuffer;
}
-static SInt32 prepoffset2() {
+static SInt32 prepoffset2(void) {
return lineoffset;
}
@@ -1396,8 +1402,7 @@ void CPrep_GetFileOffsetInfo2(FileOffsetInfo *foi, SInt32 *pLine, HashNameNode *
}
*pLine = foi->tokenline;
-#line 2010
- CError_ASSERT(*pLine >= 0);
+ CError_ASSERT(2010, *pLine >= 0);
*pName = foi->file ? foi->file->nameNode : NULL;
}
@@ -1484,14 +1489,14 @@ UInt8 C_Compiler(CParams *param) {
if (tokenstacklevel) {
was_prep_error = 1;
- CError_ErrorTerm(119);
+ CError_ErrorTerm(CErrorStr119);
} else if (iflevel) {
was_prep_error = 0;
ts.tokenfile = ifstack[iflevel - 1].file;
ts.tokenoffset = ifstack[iflevel - 1].pos;
if (iflevel)
CError_SetErrorToken(&ts);
- CError_ErrorTerm(119);
+ CError_ErrorTerm(CErrorStr119);
}
if (!anyerrors) {
@@ -1536,7 +1541,7 @@ UInt8 C_Compiler(CParams *param) {
static void pushtokenseq(Macro *macro) {
if (tokenstacklevel >= 128) {
was_prep_error = 1;
- CError_ErrorTerm(111);
+ CError_ErrorTerm(CErrorStr111);
} else {
tokenstack[tokenstacklevel].pos = pos;
tokenstack[tokenstacklevel].macrostart = macrostart;
@@ -1548,7 +1553,7 @@ static void pushtokenseq(Macro *macro) {
}
}
-void poptokenseq() {
+void poptokenseq(void) {
if (!--tokenstacklevel && dofreeaheap)
freeaheap();
@@ -1586,7 +1591,7 @@ static Boolean is_nextchar(short t) {
return 0;
}
-static Macro *ismacroname() {
+static Macro *ismacroname(void) {
Macro *scan;
Boolean save_macrocheck;
HashNameNode *name = tkidentifier;
@@ -1675,7 +1680,7 @@ static Macro *ismacroname5(char *str) {
return NULL;
}
-static Macro *ismacroname3() {
+static Macro *ismacroname3(void) {
Macro *scan;
HashNameNode *name = tkidentifier;
@@ -1716,7 +1721,7 @@ static Macro *ismacroname4(HashNameNode *name) {
return scan;
}
-void foundnl() {
+void foundnl(void) {
if (!tokenstacklevel) {
if (preprocessing_only)
CPrep_PreprocessDumpNewLine();
@@ -1727,7 +1732,7 @@ void foundnl() {
}
}
-void newline() {
+void newline(void) {
foundnl();
nlflag = 1;
at_linestart = 1;
@@ -1739,7 +1744,7 @@ void newline() {
}
}
-static void gotonexttoken() {
+static void gotonexttoken(void) {
char *save_pos;
Macro *macro;
char c;
@@ -1777,7 +1782,7 @@ loop:
}
}
-short notendofline() {
+short notendofline(void) {
char *save_pos;
Macro *macro;
char c;
@@ -1809,80 +1814,286 @@ loop:
static void CPrep_MacroRedefError(char *name, Boolean *flag) {
if (!*flag) {
if (copts.gcc_extensions) {
- CPrep_WarningName(108, name);
+ CPrep_WarningName(CErrorStr108, name);
} else if (copts.cpp_extensions) {
if (copts.pedantic)
- CPrep_WarningName(108, name);
+ CPrep_WarningName(CErrorStr108, name);
} else {
- CPrep_ErrorName(108, name);
+ CPrep_ErrorName(CErrorStr108, name);
}
*flag = 1;
}
}
-static void goendofline() {
+static void goendofline(void) {
if (notendofline()) {
- CPrep_Error(113);
+ CPrep_Error(CErrorStr113);
skipendofline();
}
}
-static void CPrep_Define() {
+static void CPrep_Define(void) {
Macro *existing_macro; // r31
- HashNameNode *name; // r29
- short r28; // r28
- Boolean r27; // r27
Macro *macro; // r20
+ HashNameNode *name; // r29
+ HashNameNode **names; // r20
short t; // r17
+ short i;
+ short argCount; // r28
+ char *ptr19;
+ char *ptr17;
+ Boolean hasVarArgs; // r27
+ Boolean isPrecedingTokenAnArg;
+ Boolean tokenPasteFlag;
Boolean error_flag;
+ HashNameNode *myNameList[128];
macrocheck = 0;
nlflag = 0;
t = lexidentifier();
if (nlflag) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
skipendofline();
}
if (t != TK_IDENTIFIER) {
- CPrep_Error(107);
+ CPrep_Error(CErrorStr107);
skipendofline();
return;
}
- macro = ismacroname3();
+ existing_macro = ismacroname3();
name = tkidentifier;
error_flag = 0;
- r27 = 0;
+ hasVarArgs = 0;
if (prepcurchar() == '(') {
- r28 = 1;
+ argCount = 1;
pos = nextcharpos;
- // fix me
+ if (existing_macro)
+ names = existing_macro->names;
+ else
+ names = NULL;
+
+ do {
+ t = lexidentifier();
+ if (t != TK_IDENTIFIER)
+ break;
+
+ if (nlflag) {
+ CPrep_Error(CErrorStr112);
+ return;
+ }
+
+ if (!strcmp(tkidentifier->name, "__VA_ARGS__")) {
+ CPrep_ErrorName(CErrorStr365, tkidentifier->name);
+ return;
+ }
+
+ for (i = 1; i < argCount; i++) {
+ if (!strcmp(tkidentifier->name, myNameList[i - 1]->name)) {
+ CPrep_ErrorName(CErrorStr365, tkidentifier->name);
+ return;
+ }
+ }
+
+ myNameList[argCount - 1] = tkidentifier;
+
+ if (existing_macro) {
+ if ((existing_macro->xC & 0x7FFF) < argCount)
+ CPrep_MacroRedefError(name->name, &error_flag);
+ if (names[argCount - 1] != tkidentifier && !copts.cpp_extensions)
+ CPrep_MacroRedefError(name->name, &error_flag);
+ }
+
+ if (argCount >= 128)
+ CError_Error(CErrorStr110);
+ else
+ argCount++;
+
+ t = plex();
+ if (nlflag) {
+ CPrep_Error(CErrorStr112);
+ return;
+ }
+ } while (t == ',');
+
+ if (nlflag) {
+ CPrep_Error(CErrorStr112);
+ return;
+ }
+
+ if (t == TK_ELLIPSIS) {
+ hasVarArgs = 1;
+ myNameList[argCount - 1] = GetHashNameNode("__VA_ARGS__");
+ if (argCount >= 128)
+ CError_Error(CErrorStr110);
+ else
+ argCount++;
+
+ t = plex();
+ if (nlflag) {
+ CPrep_Error(CErrorStr112);
+ return;
+ }
+ }
+
+ if (t != ')') {
+ CPrep_Error(CErrorStr109);
+ skipendofline();
+ return;
+ }
+
+ macro = galloc(sizeof(Macro) + sizeof(HashNameNode *) + sizeof(HashNameNode *) * (argCount - 2));
} else {
macro = galloc(sizeof(Macro));
- r28 = 0;
+ argCount = 0;
}
- if (existing_macro && (existing_macro->xC & 0x7FFF) != r28)
+ if (existing_macro && (existing_macro->xC & 0x7FFF) != argCount)
CPrep_MacroRedefError(name->name, &error_flag);
macro->name = name;
- macro->xC = r27 ? (r28 | 0x8000) : r28;
+ macro->xC = hasVarArgs ? (argCount | 0x8000) : argCount;
macro->is_special = 0;
macro->xF = 0;
- if (r28 > 1) {
- // fix me
- }
+ for (i = 1; i < argCount; i++)
+ macro->names[i - 1] = myNameList[i - 1];
mlist.size = 0;
if (notendofline()) {
- // fix me
+ while (1) {
+ tokenPasteFlag = 0;
+ innerLoop:
+ isPrecedingTokenAnArg = 0;
+ ptr19 = pos;
+ spaceskip = 0;
+ t = prepnextchar();
+
+ switch (t) {
+ case 0:
+ CPrep_Error(CErrorStr102);
+ break;
+
+ case '"':
+ case '\'':
+ CPrep_MatchChar(t, 1);
+ AppendGListData(&mlist, ptr19, pos - ptr19);
+ break;
+
+ case '#':
+ ptr17 = pos;
+ if (prepnextchar() == '#')
+ CPrep_Error(CErrorStr117);
+ pos = ptr17;
+
+ if (notendofline()) {
+ t = prepnextchar();
+ if ((t >= 'a' && t <= 'z') || (t >= 'A' && t <= 'Z') || t == '_') {
+ pos = ReadIdentifier(pos - 1);
+ for (i = 1; i < argCount; i++) {
+ if (tkidentifier == macro->names[i - 1])
+ break;
+ }
+
+ if (i < argCount) {
+ AppendGListByte(&mlist, TK_MACRO_ARG_HASH);
+ AppendGListByte(&mlist, i);
+ break;
+ }
+ }
+ }
+
+ if (copts.ANSI_strict)
+ CPrep_Error(CErrorStr117);
+ AppendGListByte(&mlist, '#');
+ pos = ptr17;
+ break;
+
+ default:
+ if ((t >= 'a' && t <= 'z') || (t >= 'A' && t <= 'Z') || t == '_') {
+ pos = ReadIdentifier(pos - 1);
+ for (i = 1; i < argCount; i++) {
+ if (tkidentifier == macro->names[i - 1])
+ break;
+ }
+
+ if (i < argCount) {
+ AppendGListByte(&mlist, tokenPasteFlag ? TK_MACRO_ARG_2 : TK_MACRO_ARG_1);
+ AppendGListByte(&mlist, i);
+ isPrecedingTokenAnArg = 1;
+ } else {
+ AppendGListName(&mlist, tkidentifier->name);
+ }
+ } else {
+ AppendGListByte(&mlist, t);
+ }
+ }
+
+ if (!notendofline())
+ break;
+
+ ptr17 = pos;
+ if (prepnextchar() == '#' && prepnextchar() == '#') {
+ if (!notendofline())
+ CPrep_Error(CErrorStr117);
+ if (isPrecedingTokenAnArg)
+ (*mlist.data)[mlist.size - 2] = TK_MACRO_ARG_2;
+ tokenPasteFlag = 1;
+ goto innerLoop;
+ }
+ pos = ptr17;
+
+ if (spaceskip)
+ AppendGListByte(&mlist, ' ');
+ }
+ }
+
+ macrocheck = 1;
+
+ if (mlist.size > 0) {
+ AppendGListByte(&mlist, 0);
+ if (mlist.size > 0x20000) {
+ CPrep_Error(CErrorStr111);
+ return;
+ }
+
+ if (existing_macro) {
+ if (!existing_macro->c || memcmp(*mlist.data, existing_macro->c, mlist.size))
+ CPrep_MacroRedefError(name->name, &error_flag);
+ }
+
+ macro->c = galloc(mlist.size);
+ memcpy(macro->c, *mlist.data, mlist.size);
} else {
- // fix me
+ macro->c = NULL;
+ if (existing_macro && existing_macro->c)
+ CPrep_MacroRedefError(name->name, &error_flag);
+ }
+
+ if (existing_macro && error_flag)
+ return;
+
+ macro->next = macrohashtable[macro->name->hashval];
+ macrohashtable[macro->name->hashval] = macro;
+
+ if (cparamblkptr->browseOptions.recordMacros && prep_file->recordbrowseinfo) {
+ CBrowse_NewMacro(macro, prep_file, gDirectiveStart, pos - prep_file_start + 1);
+ }
+
+ if (error_flag) {
+ macro = macrohashtable[macro->name->hashval];
+ while (1) {
+ if (macro->next == existing_macro) {
+ macro->next = macro->next->next;
+ break;
+ }
+ macro = macro->next;
+ CError_ASSERT(2847, macro);
+ }
}
}
-static void prepundefine() {
+static void prepundefine(void) {
short t;
Macro *macro;
Macro **scan;
@@ -1891,10 +2102,10 @@ static void prepundefine() {
nlflag = 0;
t = lexidentifier();
if (nlflag) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
skipendofline();
} else if (t != TK_IDENTIFIER) {
- CPrep_Error(107);
+ CPrep_Error(CErrorStr107);
skipendofline();
} else {
name = tkidentifier;
@@ -1909,12 +2120,121 @@ static void prepundefine() {
}
}
-static Boolean CPrep_CheckTarget() {}
-static Boolean CPrep_CheckOption() {}
-static char *CPrep_XpandDefinedCheck(char *) {}
+static Boolean CPrep_CheckTarget(void) {
+ Boolean result;
+
+ if (!notendofline()) {
+ CError_Error(CErrorStr112);
+ return 0;
+ }
+
+ if (plex() != '(') {
+ CError_Error(CErrorStr114);
+ return 0;
+ }
+
+ if (!notendofline()) {
+ CError_Error(CErrorStr112);
+ return 0;
+ }
+
+ if (plex() != TK_STRING) {
+ CError_Error(CErrorStr120);
+ return 0;
+ }
+
+ result = !strcmp(cparams.targetName, tkstring);
+
+ if (!notendofline()) {
+ CError_Error(CErrorStr112);
+ return 0;
+ }
+
+ if (plex() != ')') {
+ CError_Error(CErrorStr115);
+ return 0;
+ }
+
+ return result;
+}
+
+static Boolean CPrep_CheckOption(void) {
+ UInt16 offset;
+ UInt8 *ptr;
+ struct CompilerOption *option;
+ Boolean result;
+
+ if (!notendofline()) {
+ CError_Error(CErrorStr112);
+ return 0;
+ }
+
+ if (plex() != '(') {
+ CError_Error(CErrorStr114);
+ return 0;
+ }
+
+ if (!notendofline()) {
+ CError_Error(CErrorStr112);
+ return 0;
+ }
+
+ if (lexidentifier() != TK_IDENTIFIER) {
+ CError_Error(CErrorStr107);
+ return 0;
+ }
+
+ if (!strcmp(tkidentifier->name, "scheduling")) {
+ result = copts.schedule_mode != 0;
+ } else if (!strcmp(tkidentifier->name, "precompile")) {
+ result = cparamblkptr->isPrecompiling == 1;
+ } else if (!strcmp(tkidentifier->name, "preprocess")) {
+ result = cparamblkptr->isPreprocessing;
+ } else {
+ for (option = compileroptions; option->name; option++) {
+ if (!strcmp(tkidentifier->name, option->name)) {
+ offset = option->bits & OPT_OFFSET_MASK;
+ ptr = (UInt8 *) (offset + (intptr_t) &copts);
+ result = *ptr;
+ if (offset == OPT_OFFSET(booltruefalse) && !copts.cplusplus)
+ result = 0;
+ goto gotResult;
+ }
+ }
+ result = 0;
+ }
+
+gotResult:
+ if (!notendofline()) {
+ CError_Error(CErrorStr112);
+ return 0;
+ }
+
+ if (plex() != ')') {
+ CError_Error(CErrorStr115);
+ return 0;
+ }
+
+ return result;
+}
+
+static char *CPrep_XpandDefinedCheck(char *str) {
+ while (*str == ' ' || (*str >= 9 && *str <= 12))
+ str++;
+
+ if (*str == '(') {
+ str++;
+ while (*str == ' ' || (*str >= 9 && *str <= 12))
+ str++;
+ }
+
+ if ((*str >= 'a' && *str <= 'z') || (*str >= 'A' && *str <= 'Z') || *str == '_')
+ return ReadIdentifier(str);
+
+ return NULL;
+}
static char *XpandString(Macro *macro, char *somepos) {
- // almost matches, r22 and r23 are swapped at the end
short start_level;
char *curpos;
char *tmp;
@@ -1923,7 +2243,6 @@ static char *XpandString(Macro *macro, char *somepos) {
char *macro_output;
Macro *macro2;
int c;
- char *resultptr;
pushtokenseq(macro);
macropos = somepos;
@@ -1971,7 +2290,7 @@ static char *XpandString(Macro *macro, char *somepos) {
tmplen = mlist.size;
if (tmplen > 0x20000) {
macropos = pos;
- CPrep_Error(111);
+ CPrep_Error(CErrorStr111);
return "";
}
curpos = aalloc(tmplen);
@@ -2049,16 +2368,43 @@ static char *XpandString(Macro *macro, char *somepos) {
AppendGListByte(&mlist, 0);
skip_null_term:
if ((tmplen = mlist.size) > 0x20000) {
- CPrep_Error(111);
+ CPrep_Error(CErrorStr111);
return "";
- } else {
- resultptr = aalloc(tmplen);
- memcpy(resultptr, *mlist.data, tmplen);
- return resultptr;
}
+
+ tmp = aalloc(tmplen);
+ memcpy(tmp, *mlist.data, tmplen);
+ return tmp;
}
char *CPrep_GetFileName(char *buffer, Boolean flag1, Boolean flag2) {
+ FSSpec spec;
+ Str255 filename;
+ int size;
+ char *src;
+ char *dst;
+
+ COS_FileGetFSSpecInfo(&filestack[flag1 ? 0 : filesp]->textfile, NULL, NULL, filename);
+
+ size = filename[0];
+ if (!buffer)
+ buffer = galloc(size + 3);
+
+ dst = buffer;
+
+ if (flag2)
+ *(dst++) = '"';
+
+ src = (char *) filename;
+ while (size-- > 0)
+ *(dst++) = *(++src);
+
+ if (flag2)
+ *(dst++) = '"';
+
+ *(dst++) = 0;
+
+ return buffer;
}
static char *XpandSpecialMacro(Macro *macro) {
@@ -2113,6 +2459,230 @@ static char *XpandSpecialMacro(Macro *macro) {
}
static char *XpandMacro(Macro *macro) {
+ void **buf1;
+ void **buf2;
+ Boolean hasVarArgs;
+ int argCount;
+ int maxArgs;
+ char *p;
+ char *p2;
+ char *input;
+ short ch;
+ short t;
+ short i;
+ short depth;
+ short spaceFlag;
+ Boolean inVarArgs;
+ SInt32 tmplen;
+
+ if (macro->is_special)
+ return XpandSpecialMacro(macro);
+
+ argCount = macro->xC & 0x7FFF;
+ hasVarArgs = (macro->xC & 0x8000) != 0;
+
+ if (argCount) {
+ gotonexttoken();
+ CError_ASSERT(3293, prepnextchar() == '(');
+ if (argCount > 1) {
+ inVarArgs = hasVarArgs && argCount == 2;
+ maxArgs = argCount - 1;
+ buf1 = aalloc(sizeof(void *) * maxArgs);
+ buf2 = aalloc(sizeof(void *) * maxArgs);
+ i = 1;
+ while (i < argCount) {
+ spaceFlag = 1;
+ depth = 0;
+ mlist.size = 0;
+ restart1:
+ spaceskip = 0;
+ restart2:
+ t = prepnextchar();
+ switch (t) {
+ case '\r':
+ foundnl();
+ spaceskip = 1;
+ goto restart2;
+ case '\t':
+ case '\n':
+ case '\v':
+ case '\f':
+ case ' ':
+ spaceskip = 1;
+ goto restart2;
+ case 0:
+ if (tokenstacklevel != 0) {
+ poptokenseq();
+ goto restart2;
+ }
+ CPrep_Error(CErrorStr102);
+ break;
+ case '"':
+ case '\'':
+ p = pos - 1;
+ CPrep_MatchChar(t, 0);
+ AppendGListData(&mlist, p, pos - p);
+ goto restart1;
+ case ')':
+ if (--depth < 0) {
+ if (++i >= argCount)
+ break;
+ macropos = pos;
+ CPrep_Error(CErrorStr116);
+ return "";
+ }
+ goto do_default;
+ case ',':
+ if (depth <= 0 && !inVarArgs) {
+ i++;
+ if (hasVarArgs && i == maxArgs) {
+ inVarArgs = 1;
+ } else if (i >= argCount) {
+ macropos = pos;
+ CPrep_Error(CErrorStr115);
+ return "";
+ }
+ break;
+ }
+ goto do_default;
+ case '(':
+ depth++;
+ default:
+ do_default:
+ if (spaceskip && !spaceFlag)
+ AppendGListByte(&mlist, ' ');
+ AppendGListByte(&mlist, t);
+ spaceFlag = 0;
+ goto restart1;
+ }
+
+ buf2[i - 2] = buf1[i - 2] = NULL;
+ if (mlist.size > 0) {
+ AppendGListByte(&mlist, 0);
+ tmplen = mlist.size;
+ if (tmplen <= 0x20000) {
+ buf1[i - 2] = aalloc(tmplen);
+ memcpy(buf1[i - 2], *mlist.data, tmplen);
+ } else {
+ CPrep_Error(CErrorStr111);
+ }
+ }
+ }
+ } else {
+ gotonexttoken();
+ if (prepnextchar() != ')') {
+ macropos = pos;
+ CPrep_Error(CErrorStr115);
+ }
+ }
+ }
+
+ if (!macro->c)
+ return "";
+
+ if (argCount <= 1 && hasVarArgs == 0)
+ return XpandString(macro, macro->c);
+
+ input = macro->c;
+ mlist.size = 0;
+ while ((ch = *(input++))) {
+ switch (ch) {
+ case '"':
+ case '\'':
+ p = input - 1;
+ input = CPrep_MatchChar2(input, ch, 0);
+ AppendGListData(&mlist, p, input - p);
+ break;
+
+ case TK_MACRO_ARG_2:
+ p = buf1[*(input++) - 1];
+ if (p) {
+ while (1) {
+ switch (*p) {
+ case 0:
+ break;
+ case TK_4:
+ case TK_5:
+ p++;
+ continue;
+ default:
+ AppendGListByte(&mlist, *(p++));
+ continue;
+ }
+ break;
+ }
+ }
+ break;
+
+ case TK_MACRO_ARG_HASH:
+ AppendGListByte(&mlist, '"');
+ p = buf1[*(input++) - 1];
+ if (p) {
+ while ((ch = *(p++))) {
+ switch (ch) {
+ case TK_4:
+ case TK_5:
+ break;
+ case '"':
+ AppendGListByte(&mlist, '\\');
+ case '\'':
+ AppendGListByte(&mlist, ch);
+ while (*p && *p != ch) {
+ if (*p == '"' || *p == '\\')
+ AppendGListByte(&mlist, '\\');
+ AppendGListByte(&mlist, *(p++));
+ }
+ if (*p == '"')
+ AppendGListByte(&mlist, '\\');
+ if (*p)
+ AppendGListByte(&mlist, *(p++));
+ break;
+ default:
+ AppendGListByte(&mlist, ch);
+ break;
+ }
+ }
+ }
+ AppendGListByte(&mlist, '"');
+ break;
+
+ case TK_MACRO_ARG_1:
+ i = *(input++) - 1;
+ p = buf2[i];
+ if (!p) {
+ if (!buf1[i])
+ break;
+
+ tmplen = mlist.size;
+ p2 = aalloc(tmplen);
+ memcpy(p2, *mlist.data, tmplen);
+ p = buf2[i] = XpandString(NULL, buf1[i]);
+ mlist.size = 0;
+ AppendGListData(&mlist, p2, tmplen);
+ }
+
+ while (*p)
+ AppendGListByte(&mlist, *(p++));
+
+ if (p[-1] == '>' && *input == '>')
+ AppendGListByte(&mlist, ' ');
+ break;
+
+ default:
+ AppendGListByte(&mlist, ch);
+ }
+ }
+
+ AppendGListByte(&mlist, 0);
+
+ if (mlist.size > 0x20000) {
+ CPrep_Error(CErrorStr111);
+ return "";
+ } else {
+ p = aalloc(mlist.size);
+ memcpy(p, *mlist.data, mlist.size);
+ return XpandString(macro, p);
+ }
}
static void prepmacro(Macro *macro) {
@@ -2133,7 +2703,7 @@ static void prepmacro(Macro *macro) {
spaceskip = save_spaceskip;
}
-Boolean macrotest() {
+Boolean macrotest(void) {
Macro *macro;
if ((macro = ismacroname())) {
prepmacro(macro);
@@ -2147,7 +2717,7 @@ short CPrep_PragmaLex(Boolean no_err) {
if (notendofline())
return plex();
if (!no_err)
- CPrep_Error(113);
+ CPrep_Error(CErrorStr113);
return 0;
}
@@ -2209,7 +2779,7 @@ static void CPrep_PragmaImExport(int flags) {
OBJECT(list->object)->flags |= flags;
break;
default:
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
return;
}
}
@@ -2222,7 +2792,7 @@ static void CPrep_PragmaImExport(int flags) {
} while (plex() == ',' && notendofline());
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
static void pragma_on_off_reset(UInt32 bits) {
@@ -2258,15 +2828,14 @@ static void pragma_on_off_reset(UInt32 bits) {
else if ((bits & OPT_OFFSET_MASK) == OPT_OFFSET(lib_export))
imex_flags = OBJECT_FLAGS_60;
else
-#line 3610
- CError_FATAL();
+ CError_FATAL(3610);
CPrep_PragmaImExport(imex_flags);
return;
}
}
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
static HashNameNode *CPrep_PragmaOnceName(StringPtr name, Boolean flag) {
@@ -2291,20 +2860,20 @@ static HashNameNode *CPrep_PragmaOnceName(StringPtr name, Boolean flag) {
return GetHashNameNodeExport(myname);
}
-static void pragma_precompile_target() {
+static void pragma_precompile_target(void) {
if (!notendofline()) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
return;
}
if (plex() != TK_STRING) {
- CPrep_Error(117);
+ CPrep_Error(CErrorStr117);
skipendofline();
return;
}
if (ispascalstring) {
- CPrep_Error(101);
+ CPrep_Error(CErrorStr101);
skipendofline();
return;
}
@@ -2319,15 +2888,15 @@ static void CPrep_DefinePragmaOnceMacro(StringPtr name, Boolean flag) {
namenode = CPrep_PragmaOnceName(name, flag);
if (!ismacroname4(namenode)) {
- macro = galloc(sizeof(Macro));
- memclrw(macro, sizeof(Macro));
+ macro = galloc(sizeof(Macro) + sizeof(HashNameNode *));
+ memclrw(macro, sizeof(Macro) + sizeof(HashNameNode *));
macro->name = namenode;
macro->next = macrohashtable[namenode->hashval];
macrohashtable[namenode->hashval] = macro;
}
}
-static void CPrep_PragmaOnce() {
+static void CPrep_PragmaOnce(void) {
if (notendofline()) {
if (plex() == TK_IDENTIFIER) {
if (!strcmp(tkidentifier->name, "on")) {
@@ -2339,7 +2908,7 @@ static void CPrep_PragmaOnce() {
}
}
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
} else {
Str255 filename;
COS_FileGetFSSpecInfo(&prep_file->textfile, NULL, NULL, filename);
@@ -2347,7 +2916,7 @@ static void CPrep_PragmaOnce() {
}
}
-static void CPrep_PragmaUnused() {
+static void CPrep_PragmaUnused(void) {
NameSpace *nspace;
NameSpaceObjectList *list;
short t;
@@ -2366,7 +2935,7 @@ static void CPrep_PragmaUnused() {
list = CScope_GetLocalObject(nspace, tkidentifier);
if (list && list->object->otype == OT_OBJECT && OBJECT(list->object)->datatype == DLOCAL) {
- OBJECT(list->object)->flags |= OBJECT_FLAGS_UNUSED;
+ OBJECT(list->object)->flags |= OBJECT_FLAGS_1;
if (notendofline()) {
t = plex();
if (t == ')')
@@ -2381,17 +2950,17 @@ static void CPrep_PragmaUnused() {
}
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
-static void CPrep_PragmaInlineDepth() {
+static void CPrep_PragmaInlineDepth(void) {
int lv;
if (notendofline() && plex() == '(' && notendofline()) {
switch (plex()) {
case TK_IDENTIFIER:
if (strcmp(tkidentifier->name, "smart"))
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
else
copts.inlinelevel = 0;
break;
@@ -2400,78 +2969,78 @@ static void CPrep_PragmaInlineDepth() {
if (lv >= 0 && lv <= 1024)
copts.inlinelevel = lv ? lv : -1;
else
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
break;
default:
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
if (!notendofline() || plex() != ')') {
- CPrep_Warning(115);
+ CPrep_Warning(CErrorStr115);
}
if (notendofline()) {
- CPrep_Warning(113);
+ CPrep_Warning(CErrorStr113);
skipendofline();
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
}
-static void CPrep_PragmaInlineMaxSize() {
+static void CPrep_PragmaInlineMaxSize(void) {
if (notendofline() && plex() == '(' && notendofline()) {
switch (plex()) {
case TK_INTCONST:
copts.inline_max_size = CInt64_GetULong(&tkintconst);
break;
default:
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
if (!notendofline() || plex() != ')') {
- CPrep_Warning(115);
+ CPrep_Warning(CErrorStr115);
}
if (notendofline()) {
- CPrep_Warning(113);
+ CPrep_Warning(CErrorStr113);
skipendofline();
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
}
-static void CPrep_PragmaInlineMaxTotalSize() {
+static void CPrep_PragmaInlineMaxTotalSize(void) {
if (notendofline() && plex() == '(' && notendofline()) {
switch (plex()) {
case TK_INTCONST:
copts.inline_max_total_size = CInt64_GetULong(&tkintconst);
break;
default:
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
if (!notendofline() || plex() != ')') {
- CPrep_Warning(115);
+ CPrep_Warning(CErrorStr115);
}
if (notendofline()) {
- CPrep_Warning(113);
+ CPrep_Warning(CErrorStr113);
skipendofline();
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
}
-static void pragma_segment() {
+static void pragma_segment(void) {
short i;
short t;
char name[256];
@@ -2490,17 +3059,17 @@ static void pragma_segment() {
name[i] = 0;
if (!i || i >= 255)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
copts.forcedSegment = GetHashNameNodeExport(name);
ObjGen_SegmentName();
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
}
-static void pragma_options() {
+static void pragma_options(void) {
if (notendofline() && plex() == TK_IDENTIFIER && !strcmp(tkidentifier->name, "align") && notendofline() && plex() == '=' && notendofline() && plex() == TK_IDENTIFIER) {
if (!strcmp(tkidentifier->name, "reset")) {
CPrep_PopOption(OPT_OFFSET(align_mode));
@@ -2524,18 +3093,18 @@ static void pragma_options() {
}
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
done:
if (notendofline()) {
- CPrep_Error(113);
+ CPrep_Error(CErrorStr113);
skipendofline();
}
}
-static void pragma_push() {
+static void pragma_push(void) {
struct COptsPush *push;
push = galloc(sizeof(struct COptsPush));
@@ -2545,17 +3114,17 @@ static void pragma_push() {
push->opts = copts;
}
-static void pragma_pop() {
+static void pragma_pop(void) {
if (coptpushs) {
copts = coptpushs->opts;
coptpushs = coptpushs->next;
CMach_Configure();
} else {
- CPrep_Error(237);
+ CPrep_Error(CErrorStr237);
}
}
-static void pragma_overload() {
+static void pragma_overload(void) {
Object *obj;
if (cparamblkptr->isPreprocessing) {
@@ -2567,19 +3136,19 @@ static void pragma_overload() {
tk = lex();
if ((obj = CParser_ParseObject())) {
if (obj->sclass && obj->sclass != 0x103)
- CPrep_Error(177);
+ CPrep_Error(CErrorStr177);
obj->qual |= Q_OVERLOAD;
} else {
- CPrep_Error(186);
+ CPrep_Error(CErrorStr186);
}
if (nlflag)
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
if (tk != ';')
- CPrep_Error(123);
+ CPrep_Error(CErrorStr123);
}
-static void pragma_optimization_level() {
+static void pragma_optimization_level(void) {
short t;
int lv;
@@ -2589,14 +3158,14 @@ static void pragma_optimization_level() {
lv = CInt64_GetULong(&tkintconst);
if (lv >= 0 && lv <= 4) {
if (copts.crippled && lv > 1) {
- CPrep_Warning(385);
+ CPrep_Warning(CErrorStr385);
lv = 1;
}
CPrep_PushOption(OPT_OFFSET(optimizationlevel), lv);
CodeGen_UpdateOptimizerOptions();
CodeGen_UpdateBackEndOptions();
} else {
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
skipendofline();
}
} else if (t == TK_IDENTIFIER && !strcmp(tkidentifier->name, "reset")) {
@@ -2604,17 +3173,17 @@ static void pragma_optimization_level() {
CodeGen_UpdateOptimizerOptions();
CodeGen_UpdateBackEndOptions();
} else {
- CPrep_Error(105);
+ CPrep_Error(CErrorStr105);
skipendofline();
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
}
}
-static void pragma_opt_unroll_count() {
+static void pragma_opt_unroll_count(void) {
short t;
int lv;
@@ -2627,7 +3196,7 @@ static void pragma_opt_unroll_count() {
CodeGen_UpdateOptimizerOptions();
CodeGen_UpdateBackEndOptions();
} else {
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
skipendofline();
}
} else if (t == TK_IDENTIFIER && !strcmp(tkidentifier->name, "reset")) {
@@ -2635,17 +3204,17 @@ static void pragma_opt_unroll_count() {
CodeGen_UpdateOptimizerOptions();
CodeGen_UpdateBackEndOptions();
} else {
- CPrep_Error(105);
+ CPrep_Error(CErrorStr105);
skipendofline();
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
}
}
-static void pragma_opt_unroll_instr_count() {
+static void pragma_opt_unroll_instr_count(void) {
short t;
int lv;
@@ -2658,7 +3227,7 @@ static void pragma_opt_unroll_instr_count() {
CodeGen_UpdateOptimizerOptions();
CodeGen_UpdateBackEndOptions();
} else {
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
skipendofline();
}
} else if (t == TK_IDENTIFIER && !strcmp(tkidentifier->name, "reset")) {
@@ -2666,17 +3235,17 @@ static void pragma_opt_unroll_instr_count() {
CodeGen_UpdateOptimizerOptions();
CodeGen_UpdateBackEndOptions();
} else {
- CPrep_Error(105);
+ CPrep_Error(CErrorStr105);
skipendofline();
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
}
}
-static void pragma_pack() {
+static void pragma_pack(void) {
int t;
int i;
Boolean did_push;
@@ -2697,7 +3266,7 @@ static void pragma_pack() {
cprep_packstack[cprep_packstackp].align_mode = copts.align_mode;
did_push = 1;
} else {
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
} else if (!strcmp(tkidentifier->name, "pop")) {
if (cprep_packstackp < 128) {
@@ -2705,7 +3274,7 @@ static void pragma_pack() {
cprep_packstackp++;
did_pop = 1;
} else {
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
} else {
if (did_push) {
@@ -2719,10 +3288,10 @@ static void pragma_pack() {
copts.align_mode = cprep_packstack[i].align_mode;
cprep_packstackp = i + 1;
} else {
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
} else {
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
did_pop = 0;
did_push = 0;
@@ -2750,7 +3319,7 @@ static void pragma_pack() {
break;
default:
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
}
did_pop = 0;
@@ -2765,15 +3334,15 @@ static void pragma_pack() {
} while (1);
}
if (t != ')' && copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
macrocheck = 0;
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
}
-static void pragma_comment() {
+static void pragma_comment(void) {
int t;
short start_tokenstacklevel = tokenstacklevel;
@@ -2799,13 +3368,13 @@ static void pragma_comment() {
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
@@ -2825,25 +3394,25 @@ static void pragma_comment() {
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
return;
}
@@ -2851,17 +3420,17 @@ static void pragma_comment() {
if (t != ')') {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
}
}
-static void pragma_message() {
+static void pragma_message(void) {
int t;
short start_tokenstacklevel;
char str[128];
@@ -2893,22 +3462,22 @@ static void pragma_message() {
skipendofline();
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
}
} else if (plex() != ')') {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
}
}
-static void preppragma() {
+static void preppragma(void) {
struct CompilerOption *opt;
Boolean save_eoltokens;
@@ -2998,14 +3567,14 @@ static void preppragma() {
}
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
skipendofline();
macrocheck = 1;
return;
}
foundOption:
if (notendofline()) {
- CPrep_Error(113);
+ CPrep_Error(CErrorStr113);
skipendofline();
}
CPrep_Reconfig();
@@ -3025,13 +3594,13 @@ static void prepinclude(Boolean flag) {
StringPtr ptr;
if (!notendofline()) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
return;
}
t = prepcurchar();
if (t != '"' && t != '<') {
- CPrep_Error(117);
+ CPrep_Error(CErrorStr117);
skipendofline();
return;
}
@@ -3043,10 +3612,10 @@ static void prepinclude(Boolean flag) {
if (!copts.flat_include)
r29 = 0;
len = 0;
- while ((t = prepnextstringchar(save_pos, 1)) != '>') {
- if (t != 5) {
+ while ((t = prepnextstringchar((StringPtr) save_pos, 1)) != '>') {
+ if (t != TK_5) {
if (len > 254) {
- CPrep_Error(106);
+ CPrep_Error(CErrorStr106);
skipendofline();
return;
}
@@ -3062,7 +3631,7 @@ static void prepinclude(Boolean flag) {
macrocheck = 0;
buf[1] = 0;
if (t != TK_STRING) {
- CPrep_Error(117);
+ CPrep_Error(CErrorStr117);
skipendofline();
return;
}
@@ -3104,19 +3673,19 @@ all_done:
setupfile(ptr, r29, flag);
}
-static void prepline() {
+static void prepline(void) {
short t;
short len;
char buf[256];
cprep_hasprepline = 1;
if (!notendofline()) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
return;
}
if (plex() != TK_INTCONST) {
- CPrep_Error(117);
+ CPrep_Error(CErrorStr117);
skipendofline();
return;
}
@@ -3124,7 +3693,7 @@ static void prepline() {
linenumber = CInt64_GetULong(&tkintconst) - 1;
if (notendofline()) {
if (prepnextchar() != '"') {
- CPrep_Error(117);
+ CPrep_Error(CErrorStr117);
skipendofline();
return;
}
@@ -3134,7 +3703,7 @@ static void prepline() {
if (!t)
break;
if (len > 252) {
- CPrep_Error(106);
+ CPrep_Error(CErrorStr106);
skipendofline();
return;
}
@@ -3152,79 +3721,174 @@ static void prepline() {
}
}
-static TypeIntegral *CPrep_GetPrepType(PrepValue *pv) {
+static Type *CPrep_GetPrepType(PrepValue *pv) {
if (copts.longlong_prepeval || copts.c9x) {
if (pv->is_unsigned)
- return &stunsignedlonglong;
+ return TYPE(&stunsignedlonglong);
else
- return &stsignedlonglong;
+ return TYPE(&stsignedlonglong);
} else {
if (pv->is_unsigned)
- return &stunsignedlong;
+ return TYPE(&stunsignedlong);
else
- return &stsignedlong;
+ return TYPE(&stsignedlong);
}
}
-static PrepValue CPrep_ParseUnary() {
+static PrepValue CPrep_ParseUnary(void) {
+ PrepValue val;
+
+ if (!notendofline()) {
+ CPrep_Error(CErrorStr112);
+ val.val = cint64_zero;
+ val.is_unsigned = 0;
+ } else {
+ switch (plex()) {
+ case '-':
+ val = CPrep_ParseUnary();
+ val.val = CMach_CalcIntMonadic(CPrep_GetPrepType(&val), '-', val.val);
+ return val;
+
+ case '+':
+ val = CPrep_ParseUnary();
+ return val;
+
+ case '!':
+ val = CPrep_ParseUnary();
+ CInt64_SetLong(&val.val, CInt64_IsZero(&val.val));
+ return val;
+
+ case '~':
+ val = CPrep_ParseUnary();
+ val.val = CMach_CalcIntMonadic(CPrep_GetPrepType(&val), '~', val.val);
+ return val;
+
+ case '(':
+ val = CPrep_ParseCond();
+ if (exprtk != ')') {
+ CPrep_Error(CErrorStr115);
+ return val;
+ }
+ break;
+
+ case TK_TRUE:
+ val.val = cint64_one;
+ val.is_unsigned = 1;
+ break;
+
+ default:
+ CPrep_Error(CErrorStr141);
+ case TK_FALSE:
+ val.val = cint64_zero;
+ val.is_unsigned = 1;
+ break;
+
+ case TK_INTCONST:
+ val.val = tkintconst;
+ val.is_unsigned = (tksize == IT_ULONGLONG || tksize == IT_ULONG || tksize == IT_UINT || tksize == IT_UCHAR);
+ break;
+ case TK_IDENTIFIER:
+ val.val = cint64_zero;
+ val.is_unsigned = 0;
+ if (!strcmp("defined", tkidentifier->name)) {
+ macrocheck = 0;
+ if (!notendofline()) {
+ CPrep_Error(CErrorStr112);
+ break;
+ }
+
+ if ((exprtk = plex()) == '(') {
+ if (!notendofline()) {
+ CPrep_Error(CErrorStr112);
+ macrocheck = 1;
+ break;
+ }
+
+ if (lexidentifier() != TK_IDENTIFIER) {
+ CPrep_Error(CErrorStr107);
+ macrocheck = 1;
+ break;
+ }
+
+ if (ismacroname3())
+ val.val = cint64_one;
+
+ if (!notendofline()) {
+ CPrep_Error(CErrorStr112);
+ macrocheck = 1;
+ break;
+ }
+
+ if (plex() != ')')
+ CPrep_Error(CErrorStr115);
+ } else if (exprtk == TK_IDENTIFIER) {
+ if (ismacroname3())
+ val.val = cint64_one;
+ } else {
+ CPrep_Error(CErrorStr107);
+ }
+
+ macrocheck = 1;
+ }
+ break;
+ }
+ }
+
+ exprtk = notendofline() ? plex() : (short) 0;
+ return val;
}
-static PrepValue CPrep_ParseBinary(PrepValue *rhs, short op) {
- // i need a lot of fixing :(
+static PrepValue CPrep_ParseBinary(PrepValue *rhs, short precLimit) {
PrepValue a;
PrepValue b;
- short t;
- short op2;
- short op3;
- short prec2;
- short prec3;
+ short op;
+ short prec;
+ short newprec;
- if (!rhs) {
+ if (!rhs)
a = CPrep_ParseUnary();
- } else {
+ else
a = *rhs;
- }
- op2 = op;
-restart:
- op3 = exprtk;
- prec3 = GetPrec(op3);
- if (!prec3) {
- return a;
- }
- if (!notendofline()) {
- CPrep_Error(112);
- return a;
- }
- b = CPrep_ParseUnary();
- prec3 = prec3; // variable change situation?
- do {
- if (exprtk == ')' || !notendofline()) {
- if (b.is_unsigned)
- a.is_unsigned = 1;
- a.val = CMach_CalcIntDiadic((Type *) CPrep_GetPrepType(&a), a.val, t, b.val);
+ while (1) {
+ if (!(prec = GetPrec(op = exprtk)))
return a;
- }
- op = GetPrec(exprtk);
- if (!op) {
- CPrep_Error(141);
+ if (!notendofline()) {
+ CPrep_Error(CErrorStr112);
return a;
}
- if (prec3 >= prec2) {
- if (b.is_unsigned)
- a.is_unsigned = 1;
- a.val = CMach_CalcIntDiadic((Type *) CPrep_GetPrepType(&a), a.val, t, b.val);
- if (GetPrec(op) > op2)
- goto restart;
- return a;
+
+ b = CPrep_ParseUnary();
+ while (1) {
+ if (exprtk == ')' || !notendofline()) {
+ if (b.is_unsigned)
+ a.is_unsigned = 1;
+ a.val = CMach_CalcIntDiadic(CPrep_GetPrepType(&a), a.val, op, b.val);
+ return a;
+ }
+
+ if (!(newprec = GetPrec(exprtk))) {
+ CPrep_Error(CErrorStr141);
+ return a;
+ }
+
+ if (prec >= newprec) {
+ if (b.is_unsigned)
+ a.is_unsigned = 1;
+ a.val = CMach_CalcIntDiadic(CPrep_GetPrepType(&a), a.val, op, b.val);
+ if (GetPrec(newprec) <= precLimit)
+ return a;
+ break;
+ } else {
+ b = CPrep_ParseBinary(&b, prec);
+ }
}
- b = CPrep_ParseBinary(&b, prec3);
- } while (1);
+ }
}
-static PrepValue CPrep_ParseCond() {
+static PrepValue CPrep_ParseCond(void) {
PrepValue a;
PrepValue b;
PrepValue c;
@@ -3233,15 +3897,15 @@ static PrepValue CPrep_ParseCond() {
if (exprtk == '?') {
b = CPrep_ParseCond();
if (!notendofline()) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
return a;
}
if (exprtk != ':') {
- CPrep_Error(170);
+ CPrep_Error(CErrorStr170);
return a;
}
if (!notendofline()) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
return a;
}
c = CPrep_ParseCond();
@@ -3251,7 +3915,7 @@ static PrepValue CPrep_ParseCond() {
return a;
}
-static void doevalconstexpr() {
+static void doevalconstexpr(void) {
PrepValue v;
macrocheck = 1;
@@ -3259,10 +3923,10 @@ static void doevalconstexpr() {
cprep_incondexpr = 1;
v = CPrep_ParseCond();
if (exprtk)
- CPrep_Error(141);
+ CPrep_Error(CErrorStr141);
cprep_incondexpr = 0;
if (nlflag)
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
else
goendofline();
tkintconst = v.val;
@@ -3270,7 +3934,7 @@ static void doevalconstexpr() {
static void pushifstate(SInt16 state) {
if (iflevel >= 64) {
- CPrep_Error(215);
+ CPrep_Error(CErrorStr215);
} else {
ifstack[iflevel].state = state;
ifstack[iflevel].file = prep_file;
@@ -3279,9 +3943,9 @@ static void pushifstate(SInt16 state) {
}
}
-static void popifstate() {
+static void popifstate(void) {
if (iflevel <= 0) {
- CPrep_Error(117);
+ CPrep_Error(CErrorStr117);
} else {
switch (ifstack[iflevel - 1].state) {
case IfState_1:
@@ -3303,7 +3967,7 @@ static void popifstate() {
}
}
-static void positiveif() {
+static void positiveif(void) {
pushifstate(IfState_0);
}
@@ -3316,7 +3980,7 @@ static void negativeif(Boolean flag) {
}
}
-static void prepif() {
+static void prepif(void) {
if (iflevel > 0) {
switch (ifstack[iflevel - 1].state) {
case IfState_1:
@@ -3335,7 +3999,7 @@ static void prepif() {
positiveif();
}
-static void prepifdef() {
+static void prepifdef(void) {
if (iflevel > 0) {
switch (ifstack[iflevel - 1].state) {
case IfState_1:
@@ -3349,13 +4013,13 @@ static void prepifdef() {
macrocheck = 0;
if (!notendofline()) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
negativeif(1);
return;
}
if (lexidentifier() != TK_IDENTIFIER) {
- CPrep_Error(107);
+ CPrep_Error(CErrorStr107);
negativeif(1);
return;
}
@@ -3368,7 +4032,7 @@ static void prepifdef() {
negativeif(1);
}
-static void prepifndef() {
+static void prepifndef(void) {
if (iflevel > 0) {
switch (ifstack[iflevel - 1].state) {
case IfState_1:
@@ -3382,13 +4046,13 @@ static void prepifndef() {
macrocheck = 0;
if (!notendofline()) {
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
negativeif(1);
return;
}
if (lexidentifier() != TK_IDENTIFIER) {
- CPrep_Error(107);
+ CPrep_Error(CErrorStr107);
negativeif(1);
return;
}
@@ -3401,9 +4065,9 @@ static void prepifndef() {
negativeif(1);
}
-static void prepelif() {
+static void prepelif(void) {
if (iflevel <= 0 || ifstack[iflevel - 1].state == IfState_2 || ifstack[iflevel - 1].state == IfState_4) {
- CPrep_Error(118);
+ CPrep_Error(CErrorStr118);
skipendofline();
return;
}
@@ -3423,14 +4087,13 @@ static void prepelif() {
prepifskip();
break;
default:
-#line 5700
- CError_FATAL();
+ CError_FATAL(5700);
}
}
-static void prepelse() {
+static void prepelse(void) {
if (iflevel <= 0 || ifstack[iflevel - 1].state == IfState_2 || ifstack[iflevel - 1].state == IfState_4) {
- CPrep_Error(118);
+ CPrep_Error(CErrorStr118);
skipendofline();
return;
}
@@ -3452,14 +4115,13 @@ static void prepelse() {
ifstack[iflevel - 1].state = IfState_4;
break;
default:
-#line 5738
- CError_FATAL();
+ CError_FATAL(5738);
}
}
-static void prependif() {
+static void prependif(void) {
if (iflevel <= 0) {
- CPrep_Error(118);
+ CPrep_Error(CErrorStr118);
skipendofline();
return;
}
@@ -3474,7 +4136,7 @@ static void prependif() {
popifstate();
}
-static void prepifskip() {
+static void prepifskip(void) {
// this function does something very weird with its code generation that i can't match
TStreamElement ts;
short t;
@@ -3484,70 +4146,74 @@ static void prepifskip() {
case IfState_1:
case IfState_3:
case IfState_4:
- restart:
- t = prepskipnextchar();
- pos = nextcharpos;
- switch (t) {
- case 0:
- if (tokenstacklevel > 0) {
- poptokenseq();
- } else if (tokenstacklevel > 0 || pos >= prep_file_end) {
- if (filesp > 0) {
- popfile();
- } else {
- was_prep_error = 0;
- ts.tokenfile = ifstack[iflevel - 1].file;
- ts.tokenoffset = ifstack[iflevel - 1].pos;
- CError_SetErrorToken(&ts);
- CError_ErrorTerm(119);
- iflevel = 0;
- return;
- }
- } else {
- CPrep_Error(105);
- }
- goto restart;
- case '\r':
- newline();
- goto restart;
- case '"':
- skipendoflinematch(pos, '"');
- goto restart;
- case '\'':
- skipendoflinematch(pos, '"');
- goto restart;
- case '#':
- t = prepskipnextchar();
- pos = nextcharpos;
- switch (t) {
- case '\r':
- goto restart;
- case 0:
- CPrep_Error(102);
- default:
- pos = ReadIdentifier(pos - 1);
- if (!strcmp("if", tkidentifier->name)) {
- prepif();
- } else if (!strcmp("ifdef", tkidentifier->name)) {
- prepifdef();
- } else if (!strcmp("ifndef", tkidentifier->name)) {
- prepifndef();
- } else if (!strcmp("elif", tkidentifier->name)) {
- prepelif();
- } else if (!strcmp("else", tkidentifier->name)) {
- prepelse();
- } else if (!strcmp("endif", tkidentifier->name)) {
- prependif();
+ while (1) {
+ t = prepskipnextchar();
+ pos = nextcharpos;
+ switch (t) {
+ case 0:
+ if (tokenstacklevel > 0) {
+ poptokenseq();
+ } else if (tokenstacklevel > 0 || pos >= prep_file_end) {
+ if (filesp > 0) {
+ popfile();
} else {
- skipendofline();
- goto restart;
+ was_prep_error = 0;
+ ts.tokenfile = ifstack[iflevel - 1].file;
+ ts.tokenoffset = ifstack[iflevel - 1].pos;
+ CError_SetErrorToken(&ts);
+ CError_ErrorTerm(CErrorStr119);
+ iflevel = 0;
+ return;
}
- }
- break;
- default:
- skipendofline();
- goto restart;
+ } else {
+ CPrep_Error(CErrorStr105);
+ }
+ continue;
+ case '\r':
+ newline();
+ continue;
+ case '"':
+ skipendoflinematch((StringPtr) pos, '"');
+ continue;
+ case '\'':
+ skipendoflinematch((StringPtr) pos, '"');
+ continue;
+ case '#':
+ t = prepskipnextchar();
+ pos = nextcharpos;
+ switch (t) {
+ case '\r':
+ continue;
+ case 0:
+ CPrep_Error(CErrorStr102);
+ default:
+ pos = ReadIdentifier(pos - 1);
+ if (!strcmp("if", tkidentifier->name)) {
+ prepif();
+ } else if (!strcmp("ifdef", tkidentifier->name)) {
+ prepifdef();
+ } else if (!strcmp("ifndef", tkidentifier->name)) {
+ prepifndef();
+ } else if (!strcmp("elif", tkidentifier->name)) {
+ prepelif();
+ } else if (!strcmp("else", tkidentifier->name)) {
+ prepelse();
+ } else if (!strcmp("endif", tkidentifier->name)) {
+ prependif();
+ } else {
+ skipendofline();
+ continue;
+ }
+ }
+ break;
+ default:
+ skipendofline();
+ continue;
+ }
+ break;
}
+ break;
+ case IfState_2:
default:
return;
}
@@ -3555,7 +4221,7 @@ static void prepifskip() {
}
}
-void preprocessor() {
+void preprocessor(void) {
short t;
gDirectiveStart = pos - prep_file_start;
@@ -3564,7 +4230,7 @@ void preprocessor() {
switch (t) {
case 0:
- CPrep_Error(102);
+ CPrep_Error(CErrorStr102);
case '\r':
return;
}
@@ -3591,7 +4257,7 @@ void preprocessor() {
return;
}
if (!strcmp("error", tkidentifier->name)) {
- CPrep_Error(318);
+ CPrep_Error(CErrorStr318);
CError_ResetErrorSkip();
skipendofline();
macrocheck = 1;
@@ -3604,7 +4270,7 @@ void preprocessor() {
}
if (!copts.ANSI_strict) {
if (!strcmp("warning", tkidentifier->name)) {
- CPrep_Warning(337);
+ CPrep_Warning(CErrorStr337);
skipendofline();
macrocheck = 1;
return;
@@ -3652,7 +4318,7 @@ void preprocessor() {
return;
}
}
- CPrep_Error(104);
+ CPrep_Error(CErrorStr104);
skipendofline();
macrocheck = 1;
}
@@ -3661,7 +4327,7 @@ SInt32 CPrep_BrowserTokenOffset(FileOffsetInfo *foi) {
return foi->tokenoffset;
}
-SInt32 CPrep_BrowserFileOffset() {
+SInt32 CPrep_BrowserFileOffset(void) {
if (ts_first < ts_current)
return ts_current[-1].tokenoffset + 1;
else if (tokenstacklevel)
@@ -3693,6 +4359,6 @@ void CPrep_BrowserFilePosition(CPrepFileInfo **fileinfo, SInt32 *offset) {
}
}
-CPrepFileInfo *CPrep_BrowserCurrentFile() {
+CPrepFileInfo *CPrep_BrowserCurrentFile(void) {
return prep_file;
}
diff --git a/compiler_and_linker/FrontEnd/C/CPrepTokenizer.c b/compiler_and_linker/FrontEnd/C/CPrepTokenizer.c
index 4ea0fb0..4c36aab 100644
--- a/compiler_and_linker/FrontEnd/C/CPrepTokenizer.c
+++ b/compiler_and_linker/FrontEnd/C/CPrepTokenizer.c
@@ -91,7 +91,7 @@ loop:
for (;;) {
if (!(c = *(p++))) {
if (tokenstacklevel > 0 || p >= (StringPtr) prep_file_end) {
- CPrep_Error(103);
+ CPrep_Error(CErrorStr103);
nextcharpos = (char *) p - 1;
return c;
}
@@ -235,7 +235,7 @@ loop:
if (!(c = *(p++))) {
if (tokenstacklevel > 0 || p >= (StringPtr) prep_file_end) {
pos = (char *) p - 1;
- CPrep_Error(103);
+ CPrep_Error(CErrorStr103);
return c;
}
p[-1] = ' ';
@@ -411,12 +411,12 @@ void CPrep_MatchChar(char ch, Boolean flag) {
loop:
if (!(c = *(p++))) {
if (tokenstacklevel > 0 || p >= prep_file_end)
- CPrep_Error(102);
+ CPrep_Error(CErrorStr102);
else if (ch == '"')
- CPrep_Error(101);
+ CPrep_Error(CErrorStr101);
else if (ch == '\'')
- CPrep_Error(100);
- CPrep_Error(117);
+ CPrep_Error(CErrorStr100);
+ CPrep_Error(CErrorStr117);
pos = p - 1;
return;
}
@@ -427,7 +427,7 @@ loop:
foundnl();
if (*p == '\n')
p++;
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
pos = p;
return;
}
@@ -487,12 +487,12 @@ char *CPrep_MatchChar2(char *start, char ch, Boolean flag) {
loop:
if (!(c = *(p++))) {
if (tokenstacklevel > 0 || p >= prep_file_end)
- CPrep_Error(102);
+ CPrep_Error(CErrorStr102);
else if (ch == '"')
- CPrep_Error(101);
+ CPrep_Error(CErrorStr101);
else if (ch == '\'')
- CPrep_Error(100);
- CPrep_Error(117);
+ CPrep_Error(CErrorStr100);
+ CPrep_Error(CErrorStr117);
return p - 1;
}
@@ -502,7 +502,7 @@ loop:
foundnl();
if (*p == '\n')
p++;
- CPrep_Error(112);
+ CPrep_Error(CErrorStr112);
return p;
}
haveBackslash = 0;
@@ -700,7 +700,7 @@ static short intsuffix(short token, Boolean flag) {
}
if ((t >= 'a' && t <= 'z') || (t >= 'A' && t <= 'Z') || (t == '_') || (t >= '0' && t <= '9'))
- CPrep_Error(105);
+ CPrep_Error(CErrorStr105);
if (!is_longlong && !is_long) {
if (!is_unsigned && CInt64_IsInRange(tkintconst, stsignedint.size))
@@ -720,7 +720,7 @@ static short intsuffix(short token, Boolean flag) {
if (CInt64_IsInURange(tkintconst, stsignedlonglong.size))
return IT_ULONGLONG;
}
- CError_Error(154);
+ CError_Error(CErrorStr154);
tkintconst = cint64_zero;
return IT_INT;
}
@@ -766,7 +766,7 @@ static short floatsuffix(short token) {
}
if ((token >= 'a' && token <= 'z') || (token >= 'A' && token <= 'Z') || (token == '_') || (token >= '0' && token <= '9')) {
- CPrep_Error(105);
+ CPrep_Error(CErrorStr105);
whichtype = IT_DOUBLE;
}
@@ -819,7 +819,7 @@ static SInt32 nextchar(StringPtr str) {
case 'x':
chr = tohex(prepnextstringchar(str, 1));
if (chr == -1) {
- CPrep_Error(100);
+ CPrep_Error(CErrorStr100);
return ' ';
}
out_of_bounds = 0;
@@ -830,7 +830,7 @@ static SInt32 nextchar(StringPtr str) {
out_of_bounds = 1;
}
if (out_of_bounds)
- CError_Error(100);
+ CError_Error(CErrorStr100);
break;
default:
if (t >= '0' && t <= '7') {
@@ -845,7 +845,7 @@ static SInt32 nextchar(StringPtr str) {
i++;
}
if (out_of_bounds)
- CError_Error(100);
+ CError_Error(CErrorStr100);
} else {
chr = t;
}
@@ -1018,7 +1018,7 @@ void skipendofline(void) {
if ((ch = *(p++)) == 0) {
if (tokenstacklevel > 0 || p >= (StringPtr) prep_file_end) {
pos = (char *) p - 1;
- CPrep_Error(103);
+ CPrep_Error(CErrorStr103);
return;
}
p[-1] = ' ';
@@ -1084,12 +1084,12 @@ void CPrep_SkipAsmComment(void) {
macrocheck = save_macrocheck;
}
-static short tille(void) { return TK_NEG6; }
+static short tille(void) { return TK_ILLEGAL; }
static short tcret(void) {
newline();
if (cprep_eoltokens)
- return TK_NEG7;
+ return TK_EOL;
else
return 0;
}
@@ -1107,7 +1107,7 @@ static short tapos(short _t) {
start = (StringPtr) pos;
t = nextchar((StringPtr) pos);
if ((t == '\'' || t == 0 || t == '\r') && !was_escchar) {
- CPrep_Error(100);
+ CPrep_Error(CErrorStr100);
tkintconst = cint64_zero;
tksize = IT_INT;
return TK_INTCONST;
@@ -1170,7 +1170,7 @@ static short tapos(short _t) {
while (1) {
if ((t2 == 0 || t2 == '\r') && !was_escchar) {
- CPrep_Error(100);
+ CPrep_Error(CErrorStr100);
break;
}
@@ -1183,7 +1183,7 @@ static short tapos(short _t) {
break;
if (i >= stunsignedlonglong.size) {
- CPrep_Error(100);
+ CPrep_Error(CErrorStr100);
break;
}
}
@@ -1237,9 +1237,9 @@ static short tquot(short t) {
c = nextchar(start_pos);
if ((c == '"' || c == '\r' || c == 0) && !was_escchar) {
if (c == 0 && (tokenstacklevel > 0 || pos >= prep_file_end))
- CPrep_Error(102);
+ CPrep_Error(CErrorStr102);
else if (c != '"')
- CPrep_Error(101);
+ CPrep_Error(CErrorStr101);
break;
}
if ((size + type->size) >= maxstringsize) {
@@ -1262,7 +1262,7 @@ static short tquot(short t) {
if (ispascalstring) {
if (size > 255 && type->size == 1) {
- CPrep_Error(106);
+ CPrep_Error(CErrorStr106);
size = 255;
}
CInt64_SetLong(&ch64, size / type->size);
@@ -1571,7 +1571,7 @@ static short tzero(short t) {
case 'e':
pos = CMach_FloatScan(p, &tkfloatconst, &floatFailed);
if (floatFailed)
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
tksize = floatsuffix(prepcurchar());
return TK_FLOATCONST;
}
@@ -1580,7 +1580,7 @@ static short tzero(short t) {
}
if (failed) {
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
tkintconst = cint64_zero;
}
@@ -1601,7 +1601,7 @@ static short tpoin(void) {
if (ch >= '0' && ch <= '9') {
pos = CMach_FloatScan(p, &tkfloatconst, &failed);
if (failed)
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
tksize = floatsuffix(prepcurchar());
return TK_FLOATCONST;
}
@@ -1631,13 +1631,13 @@ static short tnumb(short t) {
if (ch == '.' || ch == 'e' || ch == 'E') {
pos = CMach_FloatScan(p, &tkfloatconst, &floatFailed);
if (floatFailed)
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
tksize = floatsuffix(prepcurchar());
return TK_FLOATCONST;
}
if (failed) {
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
tkintconst = cint64_zero;
}
@@ -1744,12 +1744,12 @@ static short tchrc(void) {
if (copts.cplusplus) {
if (!strcmp("const_cast", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_CONST_CAST;
}
if (!strcmp("catch", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_CATCH;
}
if (!strcmp("class", tkidentifier->name))
@@ -1778,7 +1778,7 @@ static short tchrd(void) {
return TK_DELETE;
if (!strcmp("dynamic_cast", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_DYNAMIC_CAST;
}
}
@@ -1875,7 +1875,7 @@ static short tchrm(void) {
return 0;
if (copts.cplusplus && !strcmp("mutable", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_MUTABLE;
}
return TK_IDENTIFIER;
@@ -1891,7 +1891,7 @@ static short tchrn(short t) {
return TK_NEW;
if (!strcmp("namespace", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_NAMESPACE;
}
if (!in_assembler && !preprocessing_only) {
@@ -1957,7 +1957,7 @@ static short tchrr(void) {
return TK_RETURN;
if (copts.cplusplus && !strcmp("reinterpret_cast", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_REINTERPRET_CAST;
}
if (copts.c9x && !strcmp("restrict", tkidentifier->name))
@@ -1984,7 +1984,7 @@ static short tchrs(void) {
return TK_SWITCH;
if (copts.cplusplus && !strcmp("static_cast", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_STATIC_CAST;
}
return TK_IDENTIFIER;
@@ -2006,27 +2006,27 @@ static short tchrt(void) {
return TK_TRUE;
if (!strcmp("template", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_TEMPLATE;
}
if (!strcmp("try", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_TRY;
}
if (!strcmp("throw", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_THROW;
}
if (!strcmp("typeid", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_TYPEID;
}
if (!strcmp("typename", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_TYPENAME;
}
}
@@ -2044,7 +2044,7 @@ static short tchru(void) {
return TK_UNSIGNED;
if (copts.cplusplus && !strcmp("using", tkidentifier->name)) {
if (copts.ecplusplus)
- CPrep_Warning(339);
+ CPrep_Warning(CErrorStr339);
return TK_USING;
}
return TK_IDENTIFIER;
@@ -2151,7 +2151,7 @@ static short tdoll(short t) {
static short tisid(void) {
if (!tokenstacklevel)
- CError_Error(105);
+ CError_Error(CErrorStr105);
return 0;
}
@@ -2161,7 +2161,7 @@ static short tnull(short t) {
return t;
} else {
pos[-1] = -64;
- return TK_NEG6;
+ return TK_ILLEGAL;
}
}
@@ -2169,7 +2169,7 @@ static short t0x1a(void) {
if (*pos == 0)
return 0;
else
- return TK_NEG6;
+ return TK_ILLEGAL;
}
typedef short (*TokenizePtr)(short);
@@ -2228,7 +2228,7 @@ short lookahead_noeol(void) {
CPrep_TokenStreamGetState(&state);
do {
t = lex();
- } while (t == TK_NEG7);
+ } while (t == TK_EOL);
CPrep_TokenStreamSetState(&state);
return t;
@@ -2303,7 +2303,7 @@ static void CPrep_StringConCat(Boolean flag) {
ch = lex();
elem = --ts_current;
memmove(elem, elem + 1, sizeof(TStreamElement) * ts_preread_elements);
- } while (ch == TK_NEG7);
+ } while (ch == TK_EOL);
chunk = lalloc(sizeof(StringChunk));
chunk->next = chunks;
@@ -2330,7 +2330,7 @@ short lex(void) {
short t;
while (1) {
- if (ts_preread_elements > 0)
+ if (ts_preread_elements <= 0)
break;
t = ts_current->tokentype;
@@ -2353,7 +2353,7 @@ short lex(void) {
tksize = ts_current->data.tkstring.size;
ispascalstring = ts_current->subtype;
break;
- case TK_NEG7:
+ case TK_EOL:
nlflag = 1;
if (!cprep_eoltokens) {
ts_current++;
@@ -2414,7 +2414,7 @@ short lex(void) {
return t;
}
break;
- case TK_NEG6:
+ case TK_ILLEGAL:
ts_current++;
CError_Error(CErrorStr105);
ts_current--;
diff --git a/compiler_and_linker/FrontEnd/C/CScope.c b/compiler_and_linker/FrontEnd/C/CScope.c
index f15787c..a59a8a7 100644
--- a/compiler_and_linker/FrontEnd/C/CScope.c
+++ b/compiler_and_linker/FrontEnd/C/CScope.c
@@ -1,17 +1,29 @@
-#include "compiler.h"
+#include "compiler/CScope.h"
+#include "compiler/CClass.h"
+#include "compiler/CDecl.h"
#include "compiler/CError.h"
#include "compiler/CMangler.h"
#include "compiler/CParser.h"
#include "compiler/CPrep.h"
-#include "compiler/CScope.h"
+#include "compiler/CPrepTokenizer.h"
+#include "compiler/CTemplateClass.h"
+#include "compiler/CTemplateNew.h"
+#include "compiler/CTemplateTools.h"
+#include "compiler/CompilerTools.h"
#include "compiler/enode.h"
#include "compiler/objects.h"
#include "compiler/scopes.h"
#include "compiler/templates.h"
#include "compiler/types.h"
+typedef enum ELookupType {
+ Lookup_0,
+ Lookup_1,
+ Lookup_2
+} ELookupType;
+
static Boolean cscope_isambig;
-static UInt8 cscope_lookuptype;
+static ELookupType cscope_lookuptype;
static SInt32 cscope_foundclassoffset;
static TemplClass *cscope_foundtemplate;
static TypeClass *cscope_foundclass;
@@ -23,14 +35,14 @@ TypeClass *cscope_currentclass;
NameSpace *cscope_current;
NameSpace *cscope_root;
-void CScope_Setup() {
+void CScope_Setup(void) {
cscope_current = cscope_root = CScope_NewHashNameSpace(0);
cscope_currentclass = NULL;
cscope_currentfunc = NULL;
cscope_is_member_func = 0;
}
-void CScope_Cleanup() {
+void CScope_Cleanup(void) {
}
void CScope_GetScope(CScopeSave *save) {
@@ -113,16 +125,15 @@ void CScope_RestoreScope(CScopeSave *saved) {
}
static Boolean CScope_ObjectIsFunction(Object *obj) {
- return obj->otype == OT_OBJECT && obj->type->type == TYPEFUNC;
+ return obj->otype == OT_OBJECT && IS_TYPE_FUNC(obj->type);
}
-Boolean CScope_IsEmptySymTable() {
+Boolean CScope_IsEmptySymTable(void) {
NameSpaceObjectList *scan;
NameSpaceName *nsname;
int i;
-#line 232
- CError_ASSERT(cscope_root->is_hash);
+ CError_ASSERT(232, cscope_root->is_hash);
i = 0;
do {
@@ -157,9 +168,9 @@ static void CScope_AppendNameSpaceName(NameSpaceName *nsn) {
static void CScope_AmbigNameError(NameSpace *nspace1, NameSpace *nspace2, HashNameNode *name) {
if (name && nspace1 != nspace2) {
- CError_Error(319, CError_GetNameString(nspace1, name), CError_GetNameString(nspace2, name));
+ CError_Error(CErrorStr319, CError_GetNameString(nspace1, name), CError_GetNameString(nspace2, name));
} else {
- CError_Error(188, nspace2);
+ CError_Error(CErrorStr188, nspace2);
}
}
@@ -248,8 +259,7 @@ NameSpaceObjectList *CScope_InsertName(NameSpace *nspace, HashNameNode *name) {
static NameSpaceObjectList *CScope_AppendName(NameSpace *nspace, HashNameNode *name) {
NameSpaceName *nsname;
NameSpaceName *scan;
-#line 387
- CError_ASSERT(!nspace->is_hash);
+ CError_ASSERT(387, !nspace->is_hash);
if (nspace->is_global)
nsname = galloc(sizeof(NameSpaceName));
@@ -327,14 +337,13 @@ restart:
case TYPEMEMBERPOINTER:
list = CScope_BuildTypeAssociatedNameSpaceList(list, TYPE_MEMBER_POINTER(type)->ty1);
type = TYPE_MEMBER_POINTER(type)->ty2;
- if (type->type != TYPECLASS)
+ if (!IS_TYPE_CLASS(type))
break;
case TYPECLASS:
list = CScope_AddNameSpaceToList(list, TYPE_CLASS(type)->nspace);
break;
default:
-#line 494
- CError_FATAL();
+ CError_FATAL(494);
}
return list;
@@ -366,7 +375,7 @@ NameSpaceObjectList *CScope_ArgumentDependentNameLookup(NameSpaceObjectList *lis
for (iscan = CScope_FindQualName(scan->nspace, name); iscan; iscan = iscan->next) {
if (iscan->object->otype != OT_OBJECT)
continue;
- if (OBJECT(iscan->object)->type->type != TYPEFUNC)
+ if (!IS_TYPE_FUNC(OBJECT(iscan->object)->type))
continue;
if (flag && (TYPE_FUNC(OBJECT(iscan->object)->type)->flags & FUNC_FLAGS_METHOD))
continue;
@@ -441,16 +450,14 @@ Boolean CScope_IsStdNameSpace(NameSpace *nspace) {
}
Boolean CScope_IsEmptyNameSpace(NameSpace *nspace) {
-#line 664
- CError_ASSERT(!nspace->is_hash);
+ CError_ASSERT(664, !nspace->is_hash);
return !nspace->data.list;
}
void CScope_MergeNameSpace(NameSpace *dst, NameSpace *src) {
NameSpaceName *nsname;
-#line 678
- CError_ASSERT(!dst->is_hash && !src->is_hash);
+ CError_ASSERT(678, !dst->is_hash && !src->is_hash);
if ((nsname = dst->data.list)) {
while (nsname->next)
@@ -473,19 +480,19 @@ void CScope_AddObject(NameSpace *nspace, HashNameNode *name, ObjBase *obj) {
newlist = lalloc(sizeof(NameSpaceObjectList));
if (obj->otype == OT_NAMESPACE || objlist->object->otype == OT_NAMESPACE) {
- CError_Error(322/*, objlist->object*/);
+ CError_Error(CErrorStr322/*, objlist->object*/);
return;
}
if (obj->otype == OT_TYPETAG) {
do {
if (objlist->object->otype == OT_TYPETAG) {
- CError_Error(322/*, objlist->object*/);
+ CError_Error(CErrorStr322/*, objlist->object*/);
return;
}
if (copts.cplusplus && objlist->object->otype == OT_TYPE && !is_typesame(OBJ_TYPE_TAG(obj)->type, OBJ_TYPE(objlist->object)->type)) {
- CError_Error(332);
+ CError_Error(CErrorStr332);
return;
}
@@ -501,12 +508,11 @@ void CScope_AddObject(NameSpace *nspace, HashNameNode *name, ObjBase *obj) {
if (objlist->object->otype == OT_TYPETAG) {
if (copts.cplusplus && obj->otype == OT_TYPE && !is_typesame(OBJ_TYPE(obj)->type, OBJ_TYPE_TAG(objlist->object)->type)) {
- CError_Error(332);
+ CError_Error(CErrorStr332);
return;
}
-#line 739
- CError_ASSERT(!objlist->next);
+ CError_ASSERT(739, !objlist->next);
newlist->object = objlist->object;
newlist->next = NULL;
@@ -516,7 +522,7 @@ void CScope_AddObject(NameSpace *nspace, HashNameNode *name, ObjBase *obj) {
}
if (!copts.cplusplus || !CScope_ObjectIsFunction(OBJECT(obj))) {
- CError_Error(322);
+ CError_Error(CErrorStr322);
return;
}
@@ -530,7 +536,7 @@ void CScope_AddObject(NameSpace *nspace, HashNameNode *name, ObjBase *obj) {
}
if (!CScope_ObjectIsFunction(OBJECT(objlist->object))) {
- CError_Error(322);
+ CError_Error(CErrorStr322);
return;
}
@@ -597,8 +603,7 @@ NameSpaceLookupList *CScope_BuildNameSpaceLookupList(NameSpace *nspace) {
goto foundIt;
}
}
-#line 853
- CError_FATAL();
+ CError_FATAL(853);
foundIt:
for (current2 = currentL->namespaces; current2; current2 = current2->next) {
if (current2->nspace == current->nspace)
@@ -718,8 +723,7 @@ restart:
case OT_NAMESPACE:
return OBJ_NAMESPACE(list->object)->nspace;
default:
-#line 1052
- CError_FATAL();
+ CError_FATAL(1052);
break;
case OT_ENUMCONST:
case OT_MEMBERVAR:
@@ -728,10 +732,10 @@ restart:
goto restart;
}
- if (type->type != TYPECLASS) {
- if (type->type == TYPETEMPLATE)
+ if (!IS_TYPE_CLASS(type)) {
+ if (IS_TYPE_TEMPLATE(type))
return NULL;
- CError_Error(320);
+ CError_Error(CErrorStr320);
if (fail)
*fail = 1;
return NULL;
@@ -741,13 +745,13 @@ restart:
}
static BClassList *CScope_RecFindClassMember(CScopeParseResult *result, TypeClass *tclass, SInt32 offset) {
- // does not match, r24 and r23 are swapped at the end x.x
Boolean fail;
NameSpace *nspace;
NameSpaceObjectList *list;
- ClassList *base;
TypeClass *bestClass;
- BClassList *bestBase, *n;
+ BClassList *bestBase;
+ ClassList *base;
+ BClassList *n;
BClassList *candidate;
SInt32 thisoffset;
BClassList *newlist;
@@ -761,7 +765,7 @@ static BClassList *CScope_RecFindClassMember(CScopeParseResult *result, TypeClas
}
switch (cscope_lookuptype) {
- case 2:
+ case Lookup_2:
fail = 0;
if ((nspace = CScope_ExtractNameSpace(list, &fail))) {
if (cscope_foundclass) {
@@ -780,20 +784,20 @@ static BClassList *CScope_RecFindClassMember(CScopeParseResult *result, TypeClas
newlist = lalloc(sizeof(BClassList));
newlist->next = NULL;
- newlist->type = (Type *) tclass;
+ newlist->type = TYPE(tclass);
return newlist;
}
if (fail)
return NULL;
break;
- case 0:
+ case Lookup_0:
if (cscope_foundclass) {
if (
list->object->otype == OT_TYPETAG
&& result->nsol_14->object->otype == OT_TYPETAG
- && OBJ_TYPE_TAG(list->object)->type->type == TYPECLASS
- && OBJ_TYPE_TAG(result->nsol_14->object)->type->type == TYPECLASS
+ && IS_TYPE_CLASS(OBJ_TYPE_TAG(list->object)->type)
+ && IS_TYPE_CLASS(OBJ_TYPE_TAG(result->nsol_14->object)->type)
&& (TYPE_CLASS(OBJ_TYPE_TAG(list->object)->type)->flags & CLASS_FLAGS_800)
&& (TYPE_CLASS(OBJ_TYPE_TAG(result->nsol_14->object)->type)->flags & CLASS_FLAGS_800)
&& TEMPL_CLASS_INST(OBJ_TYPE_TAG(list->object)->type)->templ == TEMPL_CLASS_INST(OBJ_TYPE_TAG(result->nsol_14->object)->type)->templ
@@ -816,9 +820,9 @@ static BClassList *CScope_RecFindClassMember(CScopeParseResult *result, TypeClas
result->nsol_14 = list;
newlist = lalloc(sizeof(BClassList));
newlist->next = NULL;
- newlist->type = (Type *) tclass;
+ newlist->type = TYPE(tclass);
return newlist;
- case 1:
+ case Lookup_1:
for (; list; list = list->next) {
if (list->object->otype == OT_TYPETAG) {
if (cscope_foundclass) {
@@ -836,14 +840,13 @@ static BClassList *CScope_RecFindClassMember(CScopeParseResult *result, TypeClas
result->x8 = OBJ_TYPE_TAG(list->object)->type;
newlist = lalloc(sizeof(BClassList));
newlist->next = NULL;
- newlist->type = (Type *) tclass;
+ newlist->type = TYPE(tclass);
return newlist;
}
}
break;
default:
-#line 1202
- CError_FATAL();
+ CError_FATAL(1202);
}
}
@@ -852,7 +855,7 @@ static BClassList *CScope_RecFindClassMember(CScopeParseResult *result, TypeClas
if ((candidate = CScope_RecFindClassMember(result, base->base, thisoffset))) {
n = lalloc(sizeof(BClassList));
n->next = candidate;
- n->type = (Type *) tclass;
+ n->type = TYPE(tclass);
if (bestBase && bestClass == cscope_foundclass) {
if (CClass_IsMoreAccessiblePath(n, bestBase))
bestBase = n;
@@ -866,7 +869,7 @@ static BClassList *CScope_RecFindClassMember(CScopeParseResult *result, TypeClas
return bestBase;
}
-static Boolean CScope_FindClassMember(CScopeParseResult *result, NameSpace *nspace, HashNameNode *name, UInt8 lookupType) {
+static Boolean CScope_FindClassMember(CScopeParseResult *result, NameSpace *nspace, HashNameNode *name, ELookupType lookupType) {
BClassList *bcl;
BClassList *scan;
@@ -907,11 +910,11 @@ static BClassList *CScope_GetAccessPathRec(TypeClass *src, TypeClass *dest, SInt
if (src == dest) {
if (cscope_foundclass && cscope_foundclassoffset != offset)
- CError_Error(188);
+ CError_Error(CErrorStr188);
list = lalloc(sizeof(BClassList));
list->next = NULL;
- list->type = (Type *) src;
+ list->type = TYPE(src);
cscope_foundclass = src;
cscope_foundclassoffset = offset;
return list;
@@ -925,7 +928,7 @@ static BClassList *CScope_GetAccessPathRec(TypeClass *src, TypeClass *dest, SInt
if (best) {
list = lalloc(sizeof(BClassList));
list->next = best;
- list->type = (Type *) src;
+ list->type = TYPE(src);
return list;
}
@@ -946,7 +949,7 @@ static NameSpace *CScope_FindLookupNameSpace(CScopeNSIterator *iterator, NameSpa
Boolean fail = 0;
if (lookup->nspace->theclass) {
- if (CScope_FindClassMember(iterator->result, lookup->nspace, name, 2)) {
+ if (CScope_FindClassMember(iterator->result, lookup->nspace, name, Lookup_2)) {
retnspace = iterator->result->nspace_0;
iterator->result->nspace_0 = NULL;
return retnspace;
@@ -1106,7 +1109,7 @@ static NameSpaceObjectList *CScope_NSIteratorFind(CScopeNSIterator *iterator, Ha
if (iterator->lookup->namespaces)
return CScope_FindLookupName(iterator->lookup, name, NULL);
if (iterator->lookup->nspace->theclass) {
- if (CScope_FindClassMember(iterator->result, iterator->lookup->nspace, name, 0)) {
+ if (CScope_FindClassMember(iterator->result, iterator->lookup->nspace, name, Lookup_0)) {
list = iterator->result->nsol_14;
iterator->result->nsol_14 = NULL;
return list;
@@ -1119,7 +1122,7 @@ static NameSpaceObjectList *CScope_NSIteratorFind(CScopeNSIterator *iterator, Ha
return list;
} else {
if (iterator->nspace->theclass) {
- if (CScope_FindClassMember(iterator->result, iterator->nspace, name, 0)) {
+ if (CScope_FindClassMember(iterator->result, iterator->nspace, name, Lookup_0)) {
list = iterator->result->nsol_14;
iterator->result->nsol_14 = NULL;
return list;
@@ -1163,7 +1166,7 @@ static NameSpace *CScope_NSIteratorFindNameSpace(CScopeNSIterator *iterator, Has
if (iterator->lookup->namespaces)
return CScope_FindLookupNameSpace(iterator, iterator->lookup, name);
if (iterator->lookup->nspace->theclass) {
- if (CScope_FindClassMember(iterator->result, iterator->lookup->nspace, name, 2)) {
+ if (CScope_FindClassMember(iterator->result, iterator->lookup->nspace, name, Lookup_2)) {
nspace = iterator->result->nspace_0;
iterator->result->nspace_0 = NULL;
return nspace;
@@ -1176,7 +1179,7 @@ static NameSpace *CScope_NSIteratorFindNameSpace(CScopeNSIterator *iterator, Has
return CScope_ExtractNameSpace(list, NULL);
} else {
if (iterator->nspace->theclass) {
- if (CScope_FindClassMember(iterator->result, iterator->nspace, name, 2)) {
+ if (CScope_FindClassMember(iterator->result, iterator->nspace, name, Lookup_2)) {
nspace = iterator->result->nspace_0;
iterator->result->nspace_0 = NULL;
return nspace;
@@ -1196,7 +1199,7 @@ static Boolean CScope_SetupParseNameResult(CScopeParseResult *result, NameSpaceO
if (!list->next || list->next->object->otype == OT_TYPETAG) {
switch (list->object->otype) {
case OT_NAMESPACE:
- CError_Error(321);
+ CError_Error(CErrorStr321);
return 0;
case OT_TYPE:
result->x8 = OBJ_TYPE(list->object)->type;
@@ -1207,7 +1210,7 @@ static Boolean CScope_SetupParseNameResult(CScopeParseResult *result, NameSpaceO
break;
case OT_TYPETAG:
result->x8 = OBJ_TYPE_TAG(list->object)->type;
- result->xC = NULL;
+ result->xC = 0;
result->obj_10 = list->object;
result->name_4 = name;
result->x20 = 1;
@@ -1226,18 +1229,17 @@ Boolean CScope_FindQualifiedClassMember(CScopeParseResult *result, TypeClass *tc
NameSpaceObjectList *list;
memclrw(result, sizeof(CScopeParseResult));
- CDecl_CompleteType((Type *) tclass);
+ CDecl_CompleteType(TYPE(tclass));
- if (CScope_FindClassMember(result, tclass->nspace, name, 0)) {
+ if (CScope_FindClassMember(result, tclass->nspace, name, Lookup_0)) {
list = result->nsol_14;
-#line 1780
- CError_ASSERT(list);
+ CError_ASSERT(1780, list);
result->nsol_14 = NULL;
if (CScope_SetupParseNameResult(result, list, name) && !result->x8)
return 1;
else
- CError_Error(340, name->name);
+ CError_Error(CErrorStr340, name->name);
}
return 0;
@@ -1252,7 +1254,7 @@ static NameSpace *CScope_FindQualifiedNameSpace(CScopeParseResult *result, NameS
Boolean fail = 0;
if (nspace->theclass) {
- if (CScope_FindClassMember(result, nspace, name, 2)) {
+ if (CScope_FindClassMember(result, nspace, name, Lookup_2)) {
nspace = result->nspace_0;
result->nspace_0 = NULL;
return nspace;
@@ -1291,8 +1293,8 @@ static NameSpaceObjectList *CScope_FindQualifiedName(CScopeParseResult *result,
NameSpaceLookupList *lookup;
if (nspace->theclass) {
- CDecl_CompleteType((Type *) nspace->theclass);
- if (CScope_FindClassMember(result, nspace, name, 0)) {
+ CDecl_CompleteType(TYPE(nspace->theclass));
+ if (CScope_FindClassMember(result, nspace, name, Lookup_0)) {
list = result->nsol_14;
result->nsol_14 = NULL;
return list;
@@ -1324,8 +1326,8 @@ static Boolean CScope_FindQualifiedTag(CScopeParseResult *result, NameSpace *nsp
NameSpaceList *scan;
if (nspace->theclass) {
- CDecl_CompleteType((Type *) nspace->theclass);
- return CScope_FindClassMember(result, nspace, name, 1) != 0;
+ CDecl_CompleteType(TYPE(nspace->theclass));
+ return CScope_FindClassMember(result, nspace, name, Lookup_1) != 0;
}
if ((list = CScope_FindQualName(nspace, name))) {
@@ -1439,46 +1441,46 @@ Type *CScope_GetTagType(NameSpace *nspace, HashNameNode *name) {
}
static Boolean CScope_DependentTemplateMember(CScopeParseResult *result, TypeTemplDep *ttempldep, Boolean flag1, Boolean flag2) {
- // does not match, sign extension/caching mishap
SInt32 streamstate;
short token;
- short token2;
TypeTemplDep *newtype;
TypeTemplDep *newtype2;
CPrep_TokenStreamGetState(&streamstate);
-#line 2026
- CError_ASSERT(lex() == TK_COLON_COLON);
+ token = lex();
+ CError_ASSERT(2026, token == TK_COLON_COLON);
- do {
+ while (1) {
token = lex();
if (token == TK_OPERATOR && flag1) {
if (!CParser_ParseOperatorName(NULL, 1, 1))
return 0;
- newtype = CDecl_NewTemplDepType(TEMPLDEP_QUALNAME);
+ newtype = TYPE_TEMPLATE(CDecl_NewTemplDepType(TEMPLDEP_QUALNAME));
newtype->u.qual.type = ttempldep;
newtype->u.qual.name = tkidentifier;
CPrep_TokenStreamSetState(&streamstate);
lex();
tk = lex();
- result->x8 = (Type *) newtype;
+ result->x8 = TYPE(newtype);
return 1;
- } else if (token == TK_TEMPLATE) {
+ }
+
+ if (token == TK_TEMPLATE) {
if (lex() != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
CPrep_TokenStreamGetState(&streamstate);
- newtype = CDecl_NewTemplDepType(TEMPLDEP_QUALNAME);
+ newtype = TYPE_TEMPLATE(CDecl_NewTemplDepType(TEMPLDEP_QUALNAME));
newtype->u.qual.type = ttempldep;
newtype->u.qual.name = tkidentifier;
- if ((token2 = lex()) != '<') {
- CError_Error(230);
+ if ((token = lex()) != '<') {
+ CError_Error(CErrorStr230);
return 0;
}
- tk = token2;
- newtype2 = CDecl_NewTemplDepType(TEMPLDEP_QUALTEMPL);
+ tk = token;
+ newtype2 = TYPE_TEMPLATE(CDecl_NewTemplDepType(TEMPLDEP_QUALTEMPL));
newtype2->u.qualtempl.type = newtype;
newtype2->u.qualtempl.args = CTempl_ParseUncheckTemplArgs(NULL, 1);
CPrep_TokenStreamGetState(&streamstate);
@@ -1487,27 +1489,29 @@ static Boolean CScope_DependentTemplateMember(CScopeParseResult *result, TypeTem
continue;
} else {
CPrep_TokenStreamSetState(&streamstate);
- result->x8 = (Type *) newtype2;
+ result->x8 = TYPE(newtype2);
return 1;
}
- } else if (token == TK_IDENTIFIER) {
- newtype = CDecl_NewTemplDepType(TEMPLDEP_QUALNAME);
+ }
+
+ if (token == TK_IDENTIFIER) {
+ newtype = TYPE_TEMPLATE(CDecl_NewTemplDepType(TEMPLDEP_QUALNAME));
newtype->u.qual.type = ttempldep;
newtype->u.qual.name = tkidentifier;
tk = token;
CPrep_TokenStreamGetState(&streamstate);
- token2 = lex();
+ token = lex();
tkidentifier = newtype->u.qual.name;
- if (token2 == TK_COLON_COLON) {
+ if (token == TK_COLON_COLON) {
ttempldep = newtype;
continue;
}
- if ((token2 == '<') && !flag2) {
- tk = token2;
+ if ((token == '<') && !flag2) {
+ tk = token;
newtype2 = newtype;
- newtype = CDecl_NewTemplDepType(TEMPLDEP_QUALTEMPL);
+ newtype = TYPE_TEMPLATE(CDecl_NewTemplDepType(TEMPLDEP_QUALTEMPL));
newtype->u.qualtempl.type = newtype2;
newtype->u.qualtempl.args = CTempl_ParseUncheckTemplArgs(NULL, 1);
@@ -1519,35 +1523,40 @@ static Boolean CScope_DependentTemplateMember(CScopeParseResult *result, TypeTem
}
CPrep_TokenStreamSetState(&streamstate);
- result->x8 = (Type *) newtype;
- return 1;
- } else {
- CPrep_TokenStreamSetState(&streamstate);
- result->x8 = (Type *) ttempldep;
+ result->x8 = TYPE(newtype);
return 1;
}
- } while (1);
+
+ CPrep_TokenStreamSetState(&streamstate);
+ result->x8 = TYPE(ttempldep);
+ return 1;
+ }
}
static Boolean CScope_CheckDtorName(TypeClass *tclass, Boolean *flag) {
if ((tk = lex()) != TK_IDENTIFIER)
- CError_Error(107);
+ CError_Error(CErrorStr107);
if (tclass) {
*flag = 0;
- if ((tclass->classname == tkidentifier) || (CScope_GetType(tclass->nspace, tkidentifier, NULL) == (Type *) tclass) || (CScope_GetType(cscope_current, tkidentifier, NULL) == (Type *) tclass)) {
+ if (
+ (tclass->classname == tkidentifier) ||
+ (CScope_GetType(tclass->nspace, tkidentifier, NULL) == TYPE(tclass)) ||
+ (CScope_GetType(cscope_current, tkidentifier, NULL) == TYPE(tclass))
+ )
+ {
if (!CClass_Destructor(tclass))
*flag = 1;
if ((tclass->flags & CLASS_FLAGS_800) && (lookahead() == '<')) {
tk = lex();
if (!CTemplTool_EqualArgs(TEMPL_CLASS_INST(tclass)->inst_args, CTempl_ParseUncheckTemplArgs(NULL, 0)))
- CError_Error(374);
+ CError_Error(CErrorStr374);
}
return 1;
}
}
- CError_Error(141);
+ CError_Error(CErrorStr141);
return 0;
}
@@ -1561,7 +1570,7 @@ static Boolean CScope_ParseQualifiedName(CScopeParseResult *result, NameSpace *n
switch (tk) {
case TK_TEMPLATE:
if ((tk = lex()) != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
case TK_IDENTIFIER:
@@ -1589,7 +1598,7 @@ static Boolean CScope_ParseQualifiedName(CScopeParseResult *result, NameSpace *n
flag = 1;
break;
default:
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
@@ -1599,13 +1608,13 @@ static Boolean CScope_ParseQualifiedName(CScopeParseResult *result, NameSpace *n
return 1;
}
if (nspace->theclass && !(nspace->theclass->flags & CLASS_FLAGS_2))
- CError_Error(136, nspace->theclass, 0);
+ CError_Error(CErrorStr136, nspace->theclass, 0);
else
- CError_Error(140, saveidentifier->name);
+ CError_Error(CErrorStr140, saveidentifier->name);
return 0;
}
- if (result->x8 && (result->x8->type == TYPECLASS) && (lookahead() == '<')) {
+ if (result->x8 && IS_TYPE_CLASS(result->x8) && (lookahead() == '<')) {
tclass = TYPE_CLASS(result->x8);
if (tclass->flags & CLASS_FLAGS_800)
tclass = TYPE_CLASS(TEMPL_CLASS_INST(tclass)->templ);
@@ -1613,8 +1622,8 @@ static Boolean CScope_ParseQualifiedName(CScopeParseResult *result, NameSpace *n
return 1;
tk = lex();
- result->x8 = CTempl_ClassGetType(tclass);
- if ((result->x8->type == TYPECLASS) && (lookahead() == TK_COLON_COLON)) {
+ result->x8 = CTempl_ClassGetType(TEMPL_CLASS(tclass));
+ if (IS_TYPE_CLASS(result->x8) && (lookahead() == TK_COLON_COLON)) {
lex();
tk = lex();
result->x1D = 1;
@@ -1638,7 +1647,7 @@ Boolean CScope_ParseExprName(CScopeParseResult *result) {
if (!copts.cplusplus) {
memclrw(result, sizeof(CScopeParseResult));
if (tk != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
@@ -1658,8 +1667,7 @@ Boolean CScope_ParseExprName(CScopeParseResult *result) {
if ((tk == TK_COLON_COLON || tk == TK_IDENTIFIER) && CScope_ParseQualifiedNameSpace(result, 1, 1)) {
if (result->x8)
return 1;
-#line 2313
- CError_ASSERT(result->nspace_0);
+ CError_ASSERT(2313, result->nspace_0);
} else {
memclrw(result, sizeof(CScopeParseResult));
result->nspace_0 = cscope_current;
@@ -1668,10 +1676,10 @@ Boolean CScope_ParseExprName(CScopeParseResult *result) {
switch (tk) {
case TK_TEMPLATE:
if (!result->x1D)
- CError_Error(373);
+ CError_Error(CErrorStr373);
if ((tk = lex()) != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
case TK_IDENTIFIER:
@@ -1693,13 +1701,13 @@ Boolean CScope_ParseExprName(CScopeParseResult *result) {
name = destructor_name_node;
break;
default:
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
if (result->x1D) {
if (!(list = CScope_FindQualifiedName(result, result->nspace_0, name, &result->nspace_0))) {
- CError_Error(140, CError_GetNameString(result->nspace_0, name));
+ CError_Error(CErrorStr140, CError_GetNameString(result->nspace_0, name));
return 0;
} else {
return CScope_SetupParseNameResult(result, list, name);
@@ -1715,7 +1723,7 @@ Boolean CScope_ParseExprName(CScopeParseResult *result) {
} while (CScope_NSIteratorNext(&iterator));
if (result->x1D) {
- CError_Error(140, name->name);
+ CError_Error(CErrorStr140, name->name);
return 0;
} else {
result->nspace_0 = cscope_current;
@@ -1737,7 +1745,7 @@ Boolean CScope_ParseDeclName(CScopeParseResult *result) {
if (!copts.cplusplus) {
non_cpp_mode:
if (tk != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
memclrw(result, sizeof(CScopeParseResult));
@@ -1756,7 +1764,7 @@ Boolean CScope_ParseDeclName(CScopeParseResult *result) {
return 0;
} else {
if ((tk != TK_COLON_COLON) && (tk != TK_IDENTIFIER)) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
@@ -1767,8 +1775,7 @@ Boolean CScope_ParseDeclName(CScopeParseResult *result) {
return 1;
nspace = result->nspace_0;
-#line 2435
- CError_ASSERT(nspace);
+ CError_ASSERT(2435, nspace);
switch (tk) {
case TK_OPERATOR:
@@ -1779,7 +1786,7 @@ Boolean CScope_ParseDeclName(CScopeParseResult *result) {
}
CScope_RestoreScope(&save);
if (op)
- CError_Error(121);
+ CError_Error(CErrorStr121);
result->x21 = 1;
return 1;
case TK_IDENTIFIER:
@@ -1789,26 +1796,26 @@ Boolean CScope_ParseDeclName(CScopeParseResult *result) {
break;
case '~':
if (!nspace->theclass) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return 0;
}
tk = lex();
if (tk != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
if (nspace->theclass->classname != tkidentifier)
- CError_Error(121);
+ CError_Error(CErrorStr121);
name = destructor_name_node;
break;
default:
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
if (result->x1D) {
if (!(list = CScope_FindQualifiedName(result, result->nspace_0, name, &result->nspace_0))) {
- CError_Error(140, name->name);
+ CError_Error(CErrorStr140, name->name);
return 0;
} else {
return CScope_SetupParseNameResult(result, list, name);
@@ -1823,7 +1830,7 @@ Boolean CScope_ParseDeclName(CScopeParseResult *result) {
}
} while (CScope_NSIteratorNext(&iterator));
- CError_Error(140, name->name);
+ CError_Error(CErrorStr140, name->name);
return 0;
}
}
@@ -1851,9 +1858,9 @@ Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1,
if (tk != TK_TEMPLATE)
return nspace != NULL;
if (!result->x1D)
- CError_Error(373);
+ CError_Error(CErrorStr373);
if ((tk = lex()) != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
}
@@ -1871,12 +1878,11 @@ Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1,
// list = r21
for (list = CScope_NSIteratorFind(&iterator, name); list; list = list->next) {
if (list->object->otype == OT_NAMESPACE) {
-#line 2565
- CError_ASSERT(!nspace || !nspace->theclass);
+ CError_ASSERT(2565, !nspace || !nspace->theclass);
result->nspace_0 = nspace = OBJ_NAMESPACE(list->object)->nspace;
if ((tk = lex()) != TK_COLON_COLON) {
- CError_Error(321);
+ CError_Error(CErrorStr321);
return 0;
}
@@ -1891,24 +1897,23 @@ Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1,
result->x8 = type;
return 1;
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return 0;
}
}
parse_thing:
if (t == '<') {
if (TYPE_CLASS(type)->flags & CLASS_FLAGS_800) {
- type = (Type *) TEMPL_CLASS_INST(type)->templ;
+ type = TYPE(TEMPL_CLASS_INST(type)->templ);
} else if (!(TYPE_CLASS(type)->flags & CLASS_FLAGS_100)) {
result->x8 = type;
return 1;
}
}
if ((tk = lex()) == '<') {
-#line 2609
- CError_ASSERT(TYPE_CLASS(type)->flags & CLASS_FLAGS_100);
- type2 = CTempl_ClassGetType(TYPE_CLASS(type));
- if (type2->type == TYPETEMPLATE) {
+ CError_ASSERT(2609, TYPE_CLASS(type)->flags & CLASS_FLAGS_100);
+ type2 = CTempl_ClassGetType(TEMPL_CLASS(type));
+ if (IS_TYPE_TEMPLATE(type2)) {
if (lookahead() != TK_COLON_COLON) {
result->x8 = type2;
return 1;
@@ -1926,8 +1931,7 @@ Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1,
tk = lex();
CDecl_CompleteType(type2);
} else {
-#line 2632
- CError_ASSERT(tk == TK_COLON_COLON);
+ CError_ASSERT(2632, tk == TK_COLON_COLON);
if (!(TYPE_CLASS(type)->flags & CLASS_FLAGS_100) || CParser_CheckTemplateClassUsage(TEMPL_CLASS(type), 1))
result->nspace_0 = nspace = TYPE_CLASS(type)->nspace;
CDecl_CompleteType(type);
@@ -1939,10 +1943,10 @@ Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1,
}
if (list->object->otype == OT_TYPE) {
type2 = OBJ_TYPE(list->object)->type;
- if (type2->type != TYPECLASS) {
- if (type2->type == TYPETEMPLATE) {
+ if (!IS_TYPE_CLASS(type2)) {
+ if (IS_TYPE_TEMPLATE(type2)) {
if (TYPE_TEMPLATE(type2)->dtype == TEMPLDEP_ARGUMENT && TYPE_TEMPLATE(type2)->u.pid.type == TPT_TEMPLATE) {
- type2 = CTempl_ParseTemplTemplParam(type2);
+ type2 = CTempl_ParseTemplTemplParam(TYPE_TEMPLATE(type2));
if ((type2->type != TYPETEMPLATE) || ((t = lookahead()) != TK_COLON_COLON)) {
result->x8 = type2;
return 1;
@@ -1955,7 +1959,7 @@ Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1,
result->x8 = type2;
return 1;
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return 0;
}
} else {
@@ -1967,8 +1971,7 @@ Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1,
result->x8 = type2;
return 1;
}
-#line 2686
- CError_ASSERT(tk == TK_COLON_COLON);
+ CError_ASSERT(2686, tk == TK_COLON_COLON);
if (!type2->size)
CDecl_CompleteType(type2);
result->nspace_0 = nspace = TYPE_CLASS(type2)->nspace;
@@ -1982,7 +1985,7 @@ Boolean CScope_ParseQualifiedNameSpace(CScopeParseResult *result, Boolean flag1,
}
} while (CScope_NSIteratorNext(&iterator));
- CError_Error(140, name->name);
+ CError_Error(CErrorStr140, name->name);
return 0;
}
@@ -1995,7 +1998,7 @@ Boolean CScope_ParseElaborateName(CScopeParseResult *result) {
if (!copts.cplusplus) {
memclrw(result, sizeof(CScopeParseResult));
if (tk != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
@@ -2014,32 +2017,31 @@ Boolean CScope_ParseElaborateName(CScopeParseResult *result) {
return 1;
} else {
if ((tk != TK_COLON_COLON) && (tk != TK_IDENTIFIER)) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
if (!CScope_ParseQualifiedNameSpace(result, 0, 0)) {
result->nspace_0 = cscope_current;
if (tk != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
name = tkidentifier;
} else {
if (result->x8)
return 1;
-#line 2760
- CError_ASSERT(result->nspace_0);
+ CError_ASSERT(2760, result->nspace_0);
if (tk != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return 0;
}
name = tkidentifier;
if (result->x1D) {
if (result->nspace_0->theclass)
- return CScope_FindClassMember(result, result->nspace_0, name, 1) != 0;
+ return CScope_FindClassMember(result, result->nspace_0, name, Lookup_1) != 0;
else
return CScope_FindQualifiedTag(result, result->nspace_0, name);
}
@@ -2145,7 +2147,7 @@ Boolean CScope_FindClassMemberObject(TypeClass *tclass, CScopeParseResult *resul
memclrw(result, sizeof(CScopeParseResult));
- if (CScope_FindClassMember(result, tclass->nspace, name, 0)) {
+ if (CScope_FindClassMember(result, tclass->nspace, name, Lookup_0)) {
list = result->nsol_14;
result->nsol_14 = NULL;
if (list && list->object->otype == OT_OBJECT)
@@ -2285,7 +2287,7 @@ NameSpaceObjectList *CScope_GetLocalObject(NameSpace *nspace, HashNameNode *name
case OT_OBJECT:
return CScope_GetLocalObjects(list);
default:
- CError_Error(122, name->name);
+ CError_Error(CErrorStr122, name->name);
return NULL;
case OT_TYPETAG:
break;
@@ -2323,7 +2325,7 @@ BClassList *CScope_GetClassAccessPath(BClassList *list, TypeClass *tclass) {
list = CScope_GetBaseAccessPathEnd(list);
for (scan = list; scan; scan = scan->next) {
- if (scan->type == (Type *) tclass)
+ if (scan->type == TYPE(tclass))
return scan;
}
@@ -2334,8 +2336,7 @@ BClassList *CScope_GetClassAccessPath(BClassList *list, TypeClass *tclass) {
return list2;
}
}
-#line 3217
- CError_FATAL();
+ CError_FATAL(3217);
}
return NULL;
@@ -2344,9 +2345,9 @@ BClassList *CScope_GetClassAccessPath(BClassList *list, TypeClass *tclass) {
static Boolean CScope_FixMemberResult(TypeClass *tclass, CScopeParseResult *result) {
if (!(result->bcl_18 = CScope_GetClassAccessPath(result->bcl_18, tclass))) {
if (result->name_4)
- CError_Error(150, result->name_4->name);
+ CError_Error(CErrorStr150, result->name_4->name);
else
- CError_Error(328);
+ CError_Error(CErrorStr328);
return 0;
} else {
return 1;
@@ -2364,10 +2365,10 @@ Boolean CScope_ParseMemberName(TypeClass *tclass, CScopeParseResult *result, Boo
if (!CScope_ParseExprName(result))
return 0;
- if (result->x8 && result->x8->type == TYPETEMPLATE && TYPE_TEMPLATE(result->x8)->dtype == TEMPLDEP_QUALNAME) {
+ if (result->x8 && IS_TYPE_TEMPLATE(result->x8) && TYPE_TEMPLATE(result->x8)->dtype == TEMPLDEP_QUALNAME) {
if (flag)
return 1;
- CError_Error(340, TYPE_TEMPLATE(result->x8)->u.qual.name->name);
+ CError_Error(CErrorStr340, TYPE_TEMPLATE(result->x8)->u.qual.name->name);
result->x8 = NULL;
return 0;
}
@@ -2385,7 +2386,7 @@ Boolean CScope_ParseMemberName(TypeClass *tclass, CScopeParseResult *result, Boo
switch (t) {
case TK_COLON_COLON:
memclrw(result, sizeof(CScopeParseResult));
- if (!CScope_FindClassMember(result, tclass->nspace, name, 2))
+ if (!CScope_FindClassMember(result, tclass->nspace, name, Lookup_2))
goto restart;
break;
case '<':
@@ -2402,7 +2403,7 @@ Boolean CScope_ParseMemberName(TypeClass *tclass, CScopeParseResult *result, Boo
}
if (!(list = CScope_FindQualifiedName(result, tclass->nspace, destructor_name_node, &result->nspace_0))) {
- CError_Error(140, CError_GetNameString(result->nspace_0, destructor_name_node));
+ CError_Error(CErrorStr140, CError_GetNameString(result->nspace_0, destructor_name_node));
return 0;
} else {
return CScope_SetupParseNameResult(result, list, destructor_name_node);
@@ -2424,7 +2425,7 @@ static void CScope_AddUsingObject(BClassList *bcl, NameSpace *nspace, ObjBase *o
if (bcl) {
if (!nspace->theclass)
- CError_Error(200);
+ CError_Error(CErrorStr200);
else
CClass_CheckPathAccess(bcl, NULL, obj->access);
}
@@ -2461,15 +2462,15 @@ static void CScope_AddUsingObject(BClassList *bcl, NameSpace *nspace, ObjBase *o
*OBJ_MEMBER_VAR(copy) = *OBJ_MEMBER_VAR(obj);
copy->access = access;
pathcopy = CScope_GetClassAccessPath(CClass_GetPathCopy(bcl, 1), nspace->theclass);
- if (pathcopy && pathcopy->type == (Type *) nspace->theclass) {
+ if (pathcopy && pathcopy->type == TYPE(nspace->theclass)) {
OBJ_MEMBER_VAR_PATH(copy)->has_path = 1;
OBJ_MEMBER_VAR_PATH(copy)->path = pathcopy;
} else {
- CError_Error(221);
+ CError_Error(CErrorStr221);
}
CScope_AddObject(nspace, OBJ_MEMBER_VAR(copy)->name, copy);
} else {
- CError_Error(221);
+ CError_Error(CErrorStr221);
}
} else if (obj->otype == OT_OBJECT) {
if (!nspace->theclass) {
@@ -2492,17 +2493,17 @@ static void CScope_AddUsingObject(BClassList *bcl, NameSpace *nspace, ObjBase *o
OBJECT(copy)->u.alias.member = NULL;
OBJECT(copy)->u.alias.offset = 0;
- if (OBJECT(copy)->type->type == TYPEFUNC && (TYPE_FUNC(OBJECT(copy)->type)->flags & FUNC_FLAGS_METHOD) && !TYPE_METHOD(OBJECT(copy)->type)->x26) {
+ if (IS_TYPE_NONSTATIC_METHOD(OBJECT(copy)->type)) {
if (!(tclass = nspace->theclass) || !(OBJECT(copy)->u.alias.member = CScope_GetClassAccessPath(
- CClass_GetPathCopy(bcl, 1), tclass)) || (OBJECT(copy)->u.alias.member->type != (Type *) nspace->theclass)) {
- CError_Error(221);
+ CClass_GetPathCopy(bcl, 1), tclass)) || (OBJECT(copy)->u.alias.member->type != TYPE(nspace->theclass))) {
+ CError_Error(CErrorStr221);
OBJECT(copy)->u.alias.member = NULL;
}
}
CScope_AddObject(nspace, OBJECT(copy)->name, copy);
} else {
- CError_Error(200);
+ CError_Error(CErrorStr200);
}
}
@@ -2511,8 +2512,8 @@ void CScope_AddClassUsingDeclaration(TypeClass *tclass, TypeClass *tclass2, Hash
NameSpaceObjectList *scan;
memclrw(&result, sizeof(CScopeParseResult));
- if (!CScope_FindClassMember(&result, tclass2->nspace, name, 0) || !CScope_FixMemberResult(tclass, &result)) {
- CError_Error(340, name->name);
+ if (!CScope_FindClassMember(&result, tclass2->nspace, name, Lookup_0) || !CScope_FixMemberResult(tclass, &result)) {
+ CError_Error(CErrorStr340, name->name);
return;
}
@@ -2530,32 +2531,34 @@ void CScope_AddClassUsingDeclaration(TypeClass *tclass, TypeClass *tclass2, Hash
if (result.obj_10)
CScope_AddUsingObject(result.bcl_18, tclass->nspace, result.obj_10, result.name_4, access);
else
- CError_Error(340, name->name);
+ CError_Error(CErrorStr340, name->name);
}
}
-void CScope_ParseUsingDeclaration(NameSpace *nspace, short access, Boolean flag) {
- // almost matches, slight bit of register weirdness
+void CScope_ParseUsingDeclaration(NameSpace *nspace, AccessType access, Boolean flag) {
+ NameSpace *saveNSpace;
+ Boolean flag_r27;
+ Boolean flag_r26;
+ NameSpaceObjectList *scan;
CScopeParseResult result;
if (nspace->theclass) {
- Boolean flag_r27 = (TYPE_CLASS(nspace->theclass)->flags & CLASS_FLAGS_100) ? 1 : 0;
- Boolean flag_r26 = 0;
+ flag_r27 = (TYPE_CLASS(nspace->theclass)->flags & CLASS_FLAGS_100) ? 1 : 0;
+ flag_r26 = 0;
if (tk == TK_TYPENAME) {
if (!flag_r27)
- CError_Error(200);
+ CError_Error(CErrorStr200);
flag_r26 = 1;
tk = lex();
}
if (!CScope_ParseMemberName(nspace->theclass, &result, flag_r27)) {
- CError_Error(200);
+ CError_Error(CErrorStr200);
return;
}
- if (result.x8 && result.x8->type == TYPETEMPLATE && TYPE_TEMPLATE(result.x8)->dtype == TEMPLDEP_QUALNAME) {
-#line 3578
- CError_ASSERT(flag_r27);
+ if (result.x8 && IS_TYPE_TEMPLATE(result.x8) && TYPE_TEMPLATE(result.x8)->dtype == TEMPLDEP_QUALNAME) {
+ CError_ASSERT(3578, flag_r27);
if (flag_r26) {
ObjType *objtype = galloc(sizeof(ObjType));
@@ -2565,32 +2568,34 @@ void CScope_ParseUsingDeclaration(NameSpace *nspace, short access, Boolean flag)
objtype->type = result.x8;
CScope_AddObject(nspace, TYPE_TEMPLATE(result.x8)->u.qual.name, OBJ_BASE(objtype));
} else {
- CTemplClass_RegisterUsingDecl(TEMPL_CLASS(nspace->theclass), result.x8, access);
+ CTemplClass_RegisterUsingDecl(
+ TEMPL_CLASS(nspace->theclass),
+ TYPE_TEMPLATE(result.x8),
+ access);
}
if ((tk = lex()) != ';')
- CError_Error(123);
+ CError_Error(CErrorStr123);
return;
}
if (!result.x1D) {
- CError_Error(200);
+ CError_Error(CErrorStr200);
return;
}
} else {
- NameSpace *savenspace = cscope_current;
+ saveNSpace = cscope_current;
cscope_current = nspace;
if (!CScope_ParseExprName(&result) || !result.x1D) {
- cscope_current = savenspace;
- CError_Error(200);
+ cscope_current = saveNSpace;
+ CError_Error(CErrorStr200);
return;
} else {
- cscope_current = savenspace;
+ cscope_current = saveNSpace;
}
}
if (result.nsol_14) {
- NameSpaceObjectList *scan;
for (scan = result.nsol_14; scan; scan = scan->next) {
if (scan->object->otype == OT_OBJECT)
CScope_AddUsingObject(result.bcl_18, nspace, scan->object, result.name_4, access);
@@ -2599,11 +2604,11 @@ void CScope_ParseUsingDeclaration(NameSpace *nspace, short access, Boolean flag)
if (result.obj_10)
CScope_AddUsingObject(result.bcl_18, nspace, result.obj_10, result.name_4, access);
else
- CError_Error(200);
+ CError_Error(CErrorStr200);
}
if ((tk = lex()) != ';')
- CError_Error(123);
+ CError_Error(CErrorStr123);
}
static NameSpace *CScope_ParseQualifiedNamespaceSpecifier(NameSpace *nspace) {
@@ -2620,7 +2625,7 @@ static NameSpace *CScope_ParseQualifiedNamespaceSpecifier(NameSpace *nspace) {
do {
if (tk != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
break;
}
@@ -2631,7 +2636,7 @@ static NameSpace *CScope_ParseQualifiedNamespaceSpecifier(NameSpace *nspace) {
goto some_goto;
}
} while (CScope_NSIteratorNext(&iterator));
- CError_Error(140, tkidentifier->name);
+ CError_Error(CErrorStr140, tkidentifier->name);
some_goto:
if ((tk = lex()) != TK_COLON_COLON)
break;
@@ -2656,17 +2661,17 @@ void CScope_ParseNameSpaceAlias(HashNameNode *name) {
objns->nspace = CScope_ParseQualifiedNamespaceSpecifier(cscope_current);
CScope_AddObject(cscope_current, name, OBJ_BASE(objns));
} else if (list->object->otype != OT_NAMESPACE) {
- CError_Error(320);
+ CError_Error(CErrorStr320);
tk = lex();
CScope_ParseQualifiedNamespaceSpecifier(cscope_current);
} else {
tk = lex();
if (CScope_ParseQualifiedNamespaceSpecifier(cscope_current) != OBJ_NAMESPACE(list->object)->nspace)
- CError_Error(122, name->name);
+ CError_Error(CErrorStr122, name->name);
}
if (tk != ';')
- CError_Error(123);
+ CError_Error(CErrorStr123);
}
void CScope_ParseUsingDirective(NameSpace *nspace) {
@@ -2686,9 +2691,9 @@ void CScope_ParseUsingDirective(NameSpace *nspace) {
nspace->usings = list;
}
} else {
- CError_Error(321);
+ CError_Error(CErrorStr321);
}
if (tk != ';')
- CError_Error(123);
+ CError_Error(CErrorStr123);
}
diff --git a/compiler_and_linker/FrontEnd/Common/CompilerTools.c b/compiler_and_linker/FrontEnd/Common/CompilerTools.c
index 131aa8e..fff4809 100644
--- a/compiler_and_linker/FrontEnd/Common/CompilerTools.c
+++ b/compiler_and_linker/FrontEnd/Common/CompilerTools.c
@@ -53,7 +53,7 @@ unsigned char *CTool_CtoPstr(char *cstr) {
return (unsigned char *) cstr;
}
-static void GListError() {
+static void GListError(void) {
if (GListErrorProc)
GListErrorProc();
}
@@ -465,7 +465,7 @@ HashNameNode *GetHashNameNodeByID(SInt32 id) {
return NULL;
}
-void NameHashExportReset() {
+void NameHashExportReset(void) {
HashNameNode *node;
short i;
@@ -540,13 +540,13 @@ void NameHashWriteTargetEndianNameTable(GList *glist) {
AppendGListByte(glist, 0);
}
-void InitNameHash() {
+void InitNameHash(void) {
name_hash_nodes = galloc(2048 * sizeof(HashNameNode *));
memclrw(name_hash_nodes, 2048 * sizeof(HashNameNode *));
hash_name_id = 1;
}
-SInt32 CTool_TotalHeapSize() {
+SInt32 CTool_TotalHeapSize(void) {
HeapBlock *blockp;
SInt32 size = 0;
@@ -718,7 +718,7 @@ short initgheap(heaperror_t heaperrorproc) {
return 0;
}
-heaperror_t getheaperror() {
+heaperror_t getheaperror(void) {
return heaperror;
}
@@ -740,7 +740,7 @@ static void relheap(HeapMem *heapp) {
memclrw(heapp, sizeof(HeapMem));
}
-void releaseheaps() {
+void releaseheaps(void) {
relheap(&gheap);
relheap(&lheap);
relheap(&aheap);
@@ -748,11 +748,11 @@ void releaseheaps() {
relheap(&bheap);
}
-void releasegheap() {
+void releasegheap(void) {
relheap(&gheap);
}
-void releaseoheap() {
+void releaseoheap(void) {
relheap(&gheap);
oheap.allocsize = 0x40000;
MoreHeapSpace(&oheap, 0);
@@ -823,17 +823,16 @@ void *balloc(SInt32 s) {
return cp;
}
-void locklheap() {
+void locklheap(void) {
lheaplockcount++;
}
-void unlocklheap() {
+void unlocklheap(void) {
if (lheaplockcount > 0)
--lheaplockcount;
}
-void freelheap() {
- // possible inline or macro?
+void freelheap(void) {
HeapBlock *blockp;
if (lheaplockcount == 0) {
@@ -849,7 +848,7 @@ void freelheap() {
}
}
-void freeaheap() {
+void freeaheap(void) {
HeapBlock *blockp;
blockp = aheap.blocks;
@@ -863,7 +862,7 @@ void freeaheap() {
}
}
-void freeoheap() {
+void freeoheap(void) {
HeapBlock *blockp;
blockp = oheap.blocks;
@@ -877,7 +876,7 @@ void freeoheap() {
}
}
-void freebheap() {
+void freebheap(void) {
HeapBlock *blockp;
blockp = bheap.blocks;
diff --git a/compiler_and_linker/unsorted/AddPropagation.c b/compiler_and_linker/unsorted/AddPropagation.c
index 2084f75..f0e2b32 100644
--- a/compiler_and_linker/unsorted/AddPropagation.c
+++ b/compiler_and_linker/unsorted/AddPropagation.c
@@ -51,8 +51,8 @@ static int addpropagatestouse(int candidateID, int useID) {
return 0;
}
- if (useInstr->flags & (fPCodeFlag2 | fPCodeFlag4)) {
- if (PCODE_FLAG_SET_F(useInstr) & fPCodeFlag2000000)
+ if (useInstr->flags & (fIsRead | fIsWrite)) {
+ if (PCODE_FLAG_SET_F(useInstr) & fUpdatesPtr)
return 0;
} else if (useInstr->op == PC_ADDI) {
if (useInstr->args[2].kind != PCOp_IMMEDIATE)
@@ -124,7 +124,7 @@ static int addpropagatestouse(int candidateID, int useID) {
}
if (
- (useInstr->flags & fPCodeFlag4) &&
+ (useInstr->flags & fIsWrite) &&
useInstr->args[0].kind == PCOp_REGISTER &&
useInstr->args[0].arg == RegClass_GPR &&
useInstr->args[0].data.reg.reg == reg1
@@ -168,7 +168,7 @@ static int addpropagatestouse(int candidateID, int useID) {
}
}
- if ((useInstr->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000)) && object)
+ if ((useInstr->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000)) && object)
useInstr->alias = make_alias(object, offset, nbytes_loaded_or_stored_by(useInstr));
return 1;
@@ -190,10 +190,10 @@ static void propagateandremoveadd(int id) {
useInstr = Uses[list->id].pcode;
if (instr->op == PC_ADD) {
- if (useInstr->flags & (fPCodeFlag2 | fPCodeFlag4)) {
+ if (useInstr->flags & (fIsRead | fIsWrite)) {
if (useInstr->args[2].kind != PCOp_REGISTER) {
useInstr->op += 2;
- useInstr->flags |= fPCodeFlag20;
+ useInstr->flags |= fIsPtrOp;
}
useInstr->args[1] = instr->args[1];
useInstr->args[2] = instr->args[2];
@@ -227,13 +227,13 @@ static void propagateandremoveadd(int id) {
SInt32 newValue = useInstr->args[2].data.imm.value + instr->args[2].data.imm.value;
useInstr->args[2] = instr->args[2];
useInstr->args[2].data.imm.value = newValue;
- useInstr->flags |= fPCodeFlag20;
+ useInstr->flags |= fIsPtrOp;
} else if (instr->args[2].kind == PCOp_MEMORY) {
SInt32 newValue = useInstr->args[2].data.imm.value + instr->args[2].data.mem.offset;
useInstr->args[2] = instr->args[2];
useInstr->args[2].data.mem.offset = newValue;
- useInstr->flags &= ~fPCodeFlag20;
- if (useInstr->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000))
+ useInstr->flags &= ~fIsPtrOp;
+ if (useInstr->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000))
useInstr->alias = make_alias(
useInstr->args[2].data.mem.obj,
useInstr->args[2].data.mem.offset,
diff --git a/compiler_and_linker/unsorted/Alias.c b/compiler_and_linker/unsorted/Alias.c
index 4a2f176..d8d883d 100644
--- a/compiler_and_linker/unsorted/Alias.c
+++ b/compiler_and_linker/unsorted/Alias.c
@@ -257,7 +257,7 @@ static int addresspropagatestouse(int candidateID, int useID) {
CError_ASSERT(478, object->otype == OT_OBJECT);
- if ((candidate_pcode->flags & (fPCodeFlag2 | fPCodeFlag4)) && (candidate_pcode->flags & fPCodeFlag2000000)) {
+ if ((candidate_pcode->flags & (fIsRead | fIsWrite)) && (candidate_pcode->flags & fUpdatesPtr)) {
reg = candidate_pcode->args[1].data.reg.reg;
offset = 0;
flag24 = 1;
@@ -282,7 +282,7 @@ static int addresspropagatestouse(int candidateID, int useID) {
}
if (
- !(use_pcode->flags & (fPCodeFlag2 | fPCodeFlag4)) &&
+ !(use_pcode->flags & (fIsRead | fIsWrite)) &&
use_pcode->op != PC_ADDI &&
use_pcode->op != PC_ADD &&
use_pcode->op != PC_ADDIS
@@ -293,7 +293,7 @@ static int addresspropagatestouse(int candidateID, int useID) {
}
if (
- (use_pcode->flags & (fPCodeFlag4 | fPCodeFlag40000)) &&
+ (use_pcode->flags & (fIsWrite | fPCodeFlag40000)) &&
use_pcode->args[0].kind == PCOp_REGISTER &&
use_pcode->args[0].arg == RegClass_GPR &&
use_pcode->args[0].data.reg.reg == reg &&
@@ -363,7 +363,7 @@ static int addresspropagatestouse(int candidateID, int useID) {
add_alias_member(worst_case, make_alias(object, 0, 0));
}
- if (use_pcode->flags & (fPCodeFlag2 | fPCodeFlag4))
+ if (use_pcode->flags & (fIsRead | fIsWrite))
size = nbytes_loaded_or_stored_by(use_pcode);
if (use_pcode->args[2].kind == PCOp_REGISTER) {
@@ -435,7 +435,7 @@ static int addresspropagatestouse(int candidateID, int useID) {
use_pcode->op == PC_ADDI ||
use_pcode->op == PC_ADD ||
use_pcode->op == PC_ADDIS ||
- ((candidate_pcode->flags & (fPCodeFlag2 | fPCodeFlag4)) && (candidate_pcode->flags & fPCodeFlag2000000))
+ ((candidate_pcode->flags & (fIsRead | fIsWrite)) && (candidate_pcode->flags & fUpdatesPtr))
)
recursive_propagation = 1;
}
@@ -454,7 +454,7 @@ static int addresspropagatestouse(int candidateID, int useID) {
use_pcode->op == PC_ADDI ||
use_pcode->op == PC_ADD ||
use_pcode->op == PC_ADDIS ||
- ((use_pcode->flags & (fPCodeFlag2 | fPCodeFlag4)) && (use_pcode->flags & fPCodeFlag2000000))
+ ((use_pcode->flags & (fIsRead | fIsWrite)) && (use_pcode->flags & fUpdatesPtr))
) {
if (alias->type == AliasType2)
add_alias_member(worst_case, alias);
@@ -519,15 +519,15 @@ void gather_alias_info(void) {
bitvectorcopy(myvec, usedefinfo[block->blockIndex].defvec8, number_of_Defs);
for (pcode = block->firstPCode; pcode; pcode = pcode->nextPCode) {
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000)) {
+ if (pcode->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000)) {
if (!pcode->alias) {
pcode->alias = worst_case;
} else {
if ((pcode->alias->type == AliasType0 || pcode->alias->type == AliasType1) &&
pcode->alias->size == nbytes_loaded_or_stored_by(pcode)) {
- pcode->flags &= ~fPCodeFlag20;
+ pcode->flags &= ~fIsPtrOp;
} else {
- pcode->flags |= fPCodeFlag20;
+ pcode->flags |= fIsPtrOp;
}
if (pcode->alias != worst_case) {
@@ -536,7 +536,7 @@ void gather_alias_info(void) {
op = pcode->args;
for (i = 0; i < pcode->argCount; i++, op++) {
if (
- (!(pcode->flags & (fPCodeFlag4 | fPCodeFlag40000)) || op != pcode->args) &&
+ (!(pcode->flags & (fIsWrite | fPCodeFlag40000)) || op != pcode->args) &&
op->kind == PCOp_REGISTER &&
(RegClass) op->arg == RegClass_GPR &&
(op->data.reg.effect & EffectRead)
@@ -576,7 +576,7 @@ void gather_alias_info(void) {
}
if (alias_choice == worst_case) {
- pcode->flags |= fPCodeFlag20;
+ pcode->flags |= fIsPtrOp;
if (pcode->alias->type == AliasType2)
add_alias_member(worst_case, pcode->alias);
else
@@ -589,7 +589,7 @@ void gather_alias_info(void) {
}
}
} else {
- if ((pcode->flags & fPCodeFlag8) && !pcode->alias)
+ if ((pcode->flags & fIsCall) && !pcode->alias)
pcode->alias = worst_case;
}
@@ -607,7 +607,7 @@ void gather_alias_info(void) {
} else {
for (block = pcbasicblocks; block; block = block->nextBlock) {
for (pcode = block->firstPCode; pcode; pcode = pcode->nextPCode) {
- if ((pcode->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag8 | fPCodeFlag20000 | fPCodeFlag40000)) && !pcode->alias)
+ if ((pcode->flags & (fIsRead | fIsWrite | fIsCall | fPCodeFlag20000 | fPCodeFlag40000)) && !pcode->alias)
pcode->alias = worst_case;
}
}
diff --git a/compiler_and_linker/unsorted/CABI.c b/compiler_and_linker/unsorted/CABI.c
index 91883f5..853a053 100644
--- a/compiler_and_linker/unsorted/CABI.c
+++ b/compiler_and_linker/unsorted/CABI.c
@@ -2013,7 +2013,7 @@ ENode *CABI_DestroyObject(Object *dtor, ENode *objexpr, CABIDestroyMode mode, Bo
if (flag1)
expr->data.funccall.funcref->flags |= ENODE_FLAG_80;
expr->data.funccall.functype = TYPE_FUNC(dtor->type);
- dtor->flags |= OBJECT_FLAGS_UNUSED;
+ dtor->flags |= OBJECT_FLAGS_1;
list = lalloc(sizeof(ENodeList));
list->node = objexpr;
diff --git a/compiler_and_linker/unsorted/CClass.c b/compiler_and_linker/unsorted/CClass.c
index 961d99b..7123a93 100644
--- a/compiler_and_linker/unsorted/CClass.c
+++ b/compiler_and_linker/unsorted/CClass.c
@@ -1273,7 +1273,7 @@ static Object *CClass_FindCovariantFunction(Object *func, Type *type) {
nsol = CScope_FindName(
TYPE_METHOD(func->type)->theclass->nspace,
- CMangler_GetCovariantFunctionName(func, type));
+ CMangler_GetCovariantFunctionName(func, TYPE_CLASS(type)));
CError_ASSERT(1754, nsol && !nsol->next && nsol->object->otype == OT_OBJECT);
@@ -1287,7 +1287,7 @@ static ObjectList *CClass_DeclareCovariantFuncs(ObjectList *list, Object *func,
ObjectList *newlist;
for (types = CClass_GetCoVariantClassList(NULL, tclass, func, 1); types; types = types->next) {
- name = CMangler_GetCovariantFunctionName(func, types->type);
+ name = CMangler_GetCovariantFunctionName(func, TYPE_CLASS(types->type));
newfunc = galloc(sizeof(Object));
memclrw(newfunc, sizeof(Object));
diff --git a/compiler_and_linker/unsorted/CCompiler.c b/compiler_and_linker/unsorted/CCompiler.c
index 6159517..1bac511 100644
--- a/compiler_and_linker/unsorted/CCompiler.c
+++ b/compiler_and_linker/unsorted/CCompiler.c
@@ -3,6 +3,8 @@
#include "compiler/CPrep.h"
#include "compiler/CompilerTools.h"
#include "compiler/CodeGen.h"
+#include "compiler/CodeGenOptPPC.h"
+#include "compiler/IrOptimizer.h"
#include "compiler/types.h"
#include "pref_structs.h"
@@ -72,7 +74,7 @@ static int setup_param_block(CWPluginContext context) {
return CWGetTargetName(context, target_name, sizeof(target_name)) == cwNoErr;
}
-static short store_compile_results() {
+static short store_compile_results(void) {
CWResult result;
if (cparams.objectDataHandle)
@@ -181,7 +183,7 @@ static void initialize_compiler_options(CParams *params) {
copts.text = CWFOURCHAR('T','E','X','T');
}
-static void GetLicense() {
+static void GetLicense(void) {
if (!license_cookie) {
crippled = 1;
CWCheckoutLicense(cparams.context, "MacOS_Plugins_MacOS_Unlimited", "7", 2, NULL, &license_cookie);
@@ -195,7 +197,7 @@ static void GetLicense() {
}
}
-static void ReleaseLicense() {
+static void ReleaseLicense(void) {
if (license_cookie && using_license_manager)
CWCheckinLicense(cparams.context, license_cookie);
using_license_manager = 0;
diff --git a/compiler_and_linker/unsorted/CDecl.c b/compiler_and_linker/unsorted/CDecl.c
index 0ee3cf8..789c6d8 100644
--- a/compiler_and_linker/unsorted/CDecl.c
+++ b/compiler_and_linker/unsorted/CDecl.c
@@ -104,12 +104,12 @@ static void CDecl_ParseCPPFuncDecl(TypeFunc *tfunc) {
for (;;) {
if (tk == TK_CONST) {
if (tfunc->flags & FUNC_FLAGS_CONST)
- CError_Warning(313, "const");
+ CError_Warning(CErrorStr313, "const");
tfunc->flags |= FUNC_FLAGS_CONST;
tk = lex();
} else if (tk == TK_VOLATILE) {
if (tfunc->flags & FUNC_FLAGS_VOLATILE)
- CError_Warning(313, "volatile");
+ CError_Warning(CErrorStr313, "volatile");
tfunc->flags |= FUNC_FLAGS_VOLATILE;
tk = lex();
} else {
@@ -125,7 +125,7 @@ void CDecl_NewConvFuncType(DeclInfo *declinfo) {
TypeFunc *tfunc;
if (tk != '(')
- CError_Error(114);
+ CError_Error(CErrorStr114);
else
tk = lex();
@@ -133,7 +133,7 @@ void CDecl_NewConvFuncType(DeclInfo *declinfo) {
tk = lex();
if (tk != ')')
- CError_Error(115);
+ CError_Error(CErrorStr115);
else
tk = lex();
@@ -181,14 +181,14 @@ void CDecl_CompleteType(Type *type) {
Boolean IsCompleteType(Type *type) {
switch (type->type) {
case TYPEVOID:
- CError_Error(126);
+ CError_Error(CErrorStr126);
return 0;
case TYPEFUNC:
- CError_Error(146);
+ CError_Error(CErrorStr146);
return 0;
case TYPESTRUCT:
if (!type->size) {
- CError_Error(136, type, 0);
+ CError_Error(CErrorStr136, type, 0);
return 0;
}
return 1;
@@ -201,13 +201,13 @@ Boolean IsCompleteType(Type *type) {
)
)
{
- CError_Error(136, type, 0);
+ CError_Error(CErrorStr136, type, 0);
return 0;
}
return 1;
default:
if (!type->size) {
- CError_Error(145);
+ CError_Error(CErrorStr145);
return 0;
}
return 1;
@@ -217,10 +217,10 @@ Boolean IsCompleteType(Type *type) {
Boolean CanAllocObject(Type *type) {
switch (type->type) {
case TYPEVOID:
- CError_Error(126);
+ CError_Error(CErrorStr126);
return 0;
case TYPEFUNC:
- CError_Error(146);
+ CError_Error(CErrorStr146);
return 0;
case TYPECLASS:
if (TYPE_CLASS(type)->flags & CLASS_FLAGS_ABSTRACT) {
@@ -238,11 +238,11 @@ Boolean CanCreateObject(Type *type) {
if (IS_TYPE_CLASS(type)) {
if (TYPE_CLASS(type)->flags & CLASS_FLAGS_1) {
- CError_Error(191);
+ CError_Error(CErrorStr191);
return 0;
}
if (TYPE_CLASS(type)->objcinfo) {
- CError_Error(307);
+ CError_Error(CErrorStr307);
return 0;
}
}
@@ -259,7 +259,7 @@ static Boolean CanCreateHandleMemberObject(Type *type) {
if (IS_TYPE_CLASS(type)) {
if (CClass_Destructor(TYPE_CLASS(type)) || CClass_Constructor(TYPE_CLASS(type))) {
- CError_Error(191);
+ CError_Error(CErrorStr191);
return 0;
}
}
@@ -333,12 +333,12 @@ Boolean CDecl_CheckArrayIntegr(Type *type) {
return 0;
if (IS_TYPE_CLASS(type) && TYPE_CLASS(type)->sominfo) {
- CError_Error(289);
+ CError_Error(CErrorStr289);
return 0;
}
if (IS_TYPE_REFERENCE(type)) {
- CError_Error(196);
+ CError_Error(CErrorStr196);
return 0;
}
@@ -350,7 +350,7 @@ static Boolean checkfuncintegr(Type *type) {
return 1;
if (IS_TYPE_CLASS(type) && TYPE_CLASS(type)->sominfo) {
- CError_Error(283);
+ CError_Error(CErrorStr283);
return 0;
}
@@ -370,7 +370,7 @@ void CDecl_ParseDirectFuncDecl(DeclInfo *declinfo) {
} else {
list = parameter_type_list(declinfo);
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
}
@@ -387,7 +387,7 @@ void CDecl_ParseDirectFuncDecl(DeclInfo *declinfo) {
if (copts.cplusplus) {
CDecl_ParseCPPFuncDecl(tfunc);
if (declinfo->storageclass == TK_TYPEDEF && tfunc->exspecs)
- CError_Error(264);
+ CError_Error(CErrorStr264);
}
scandirectdecl1(declinfo);
@@ -418,7 +418,7 @@ static void scandirectdecl1(DeclInfo *declinfo) {
expr = CExpr_IntegralConstOrDepExpr();
if (!ENODE_IS(expr, EINTCONST)) {
if (tk != ']')
- CError_ErrorSkip(125);
+ CError_ErrorSkip(CErrorStr125);
else
tk = lex();
declinfo->x47 = 1;
@@ -433,13 +433,13 @@ static void scandirectdecl1(DeclInfo *declinfo) {
}
len = expr->data.intval;
if (CInt64_IsNegative(&len)) {
- CError_Error(124);
+ CError_Error(CErrorStr124);
len = cint64_one;
} else if (CInt64_IsZero(&len)) {
if (!copts.ANSI_strict && declinfo->x50) {
flag = 1;
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
len = cint64_one;
}
}
@@ -452,12 +452,12 @@ static void scandirectdecl1(DeclInfo *declinfo) {
else
len = expr->data.intval;
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
}
}
if (tk != ']')
- CError_ErrorSkip(125);
+ CError_ErrorSkip(CErrorStr125);
else
tk = lex();
}
@@ -543,12 +543,12 @@ static void substitute_type(Type *type1, Type *type2) {
}
type1 = TYPE_TEMPLATE(type1)->u.array.type;
} else {
- CError_Error(146);
+ CError_Error(CErrorStr146);
return;
}
break;
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
}
@@ -563,7 +563,7 @@ static void scandecl(DeclInfo *declinfo) {
scandeclarator(declinfo);
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
@@ -581,7 +581,7 @@ static void scandecl(DeclInfo *declinfo) {
static Boolean CDecl_ParseOperatorDecl(DeclInfo *declinfo) {
if (declinfo->x3E) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return 0;
}
@@ -622,7 +622,7 @@ static Boolean CDecl_CheckOperatorType(DeclInfo *declinfo, Boolean flag) {
Boolean r6;
if (!IS_TYPE_FUNC(declinfo->thetype)) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
@@ -639,7 +639,7 @@ static Boolean CDecl_CheckOperatorType(DeclInfo *declinfo, Boolean flag) {
case TK_DELETE_ARRAY:
break;
default:
- CError_Error(205);
+ CError_Error(CErrorStr205);
}
}
@@ -659,7 +659,7 @@ static Boolean CDecl_CheckOperatorType(DeclInfo *declinfo, Boolean flag) {
case TK_DELETE_ARRAY:
break;
default:
- CError_Error(205);
+ CError_Error(CErrorStr205);
}
}
}
@@ -667,7 +667,7 @@ static Boolean CDecl_CheckOperatorType(DeclInfo *declinfo, Boolean flag) {
r27 = OpMysteryValue3;
}
} else {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
@@ -676,52 +676,52 @@ static Boolean CDecl_CheckOperatorType(DeclInfo *declinfo, Boolean flag) {
case TK_NEW:
case TK_NEW_ARRAY:
if (r6 || !is_typesame(functype, (Type *) &void_ptr) || r27 < OpMysteryValue1 || args->type != CABI_GetSizeTType()) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
return 1;
case TK_DELETE:
case TK_DELETE_ARRAY:
if (r6 || !IS_TYPE_VOID(functype) || r27 < OpMysteryValue1 || !is_typesame(args->type, (Type *) &void_ptr)) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
return 1;
case '=':
if (!r6) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
break;
case '(':
if (!r6) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
return 1;
case '[':
if (!r6) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
break;
case TK_ARROW:
if (r27 != OpMysteryValue1 || r6 == 0) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
return 1;
case TK_INCREMENT:
case TK_DECREMENT:
if (r27 == OpMysteryValue2 && secondarg->type != (Type *) &stsignedint) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
break;
}
if (flag && !r6) {
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
@@ -779,7 +779,7 @@ static Boolean CDecl_CheckOperatorType(DeclInfo *declinfo, Boolean flag) {
break;
}
- CError_Error(193);
+ CError_Error(CErrorStr193);
return 0;
}
@@ -799,7 +799,7 @@ static void scandirectdeclarator(DeclInfo *declinfo, NameSpace *nspace) {
CScope_RestoreScope(&scopesave);
return;
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
if (nspace)
CScope_RestoreScope(&scopesave);
return;
@@ -829,7 +829,7 @@ static void scandirectdeclarator(DeclInfo *declinfo, NameSpace *nspace) {
}
if (declinfo->name)
- CError_Error(121);
+ CError_Error(CErrorStr121);
CDecl_ParseDirectFuncDecl(declinfo);
if (nspace)
@@ -856,16 +856,16 @@ static void scandirectdeclarator(DeclInfo *declinfo, NameSpace *nspace) {
if (IS_TYPE_FUNC(declinfo->thetype))
TYPE_FUNC(declinfo->thetype)->flags |= FUNC_FLAGS_40;
else
- CError_Error(121);
+ CError_Error(CErrorStr121);
} else {
- CError_Error(114);
+ CError_Error(CErrorStr114);
}
return;
}
flag = 1;
} else if (tk != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
CScope_RestoreScope(&scopesave);
return;
} else {
@@ -873,7 +873,7 @@ static void scandirectdeclarator(DeclInfo *declinfo, NameSpace *nspace) {
}
if (declinfo->name) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
CScope_RestoreScope(&scopesave);
return;
}
@@ -884,7 +884,7 @@ static void scandirectdeclarator(DeclInfo *declinfo, NameSpace *nspace) {
tk = lex();
} else if (tk == TK_IDENTIFIER) {
if (declinfo->name)
- CError_Error(121);
+ CError_Error(CErrorStr121);
declinfo->name = tkidentifier;
tk = lex();
} else if (tk == TK_OPERATOR) {
@@ -911,12 +911,12 @@ void makememberpointertype(DeclInfo *declinfo, TypeClass *tclass, UInt32 qual) {
TypeFunc *tfunc;
if (tclass->flags & CLASS_FLAGS_1) {
- CError_Error(191);
+ CError_Error(CErrorStr191);
declinfo->thetype = (Type *) &stsignedint;
return;
}
if (tclass->sominfo) {
- CError_Error(290);
+ CError_Error(CErrorStr290);
declinfo->thetype = (Type *) &stsignedint;
return;
}
@@ -951,17 +951,17 @@ void CDecl_ScanPointer(DeclInfo *declinfo, NameSpace *nspace, Boolean flag) {
switch (tk) {
case TK_CONST:
if (qual & Q_CONST)
- CError_Error(121);
+ CError_Error(CErrorStr121);
qual |= Q_CONST;
continue;
case TK_VOLATILE:
if (qual & Q_VOLATILE)
- CError_Error(121);
+ CError_Error(CErrorStr121);
qual |= Q_VOLATILE;
continue;
case TK_RESTRICT:
if (qual & Q_RESTRICT)
- CError_Error(121);
+ CError_Error(CErrorStr121);
qual |= Q_RESTRICT;
continue;
default:
@@ -971,7 +971,7 @@ void CDecl_ScanPointer(DeclInfo *declinfo, NameSpace *nspace, Boolean flag) {
}
if (IS_TYPE_REFERENCE(declinfo->thetype) || ((qual & Q_REFERENCE) && IS_TYPE_VOID(declinfo->thetype))) {
- CError_Error(196);
+ CError_Error(CErrorStr196);
return;
}
@@ -1013,7 +1013,7 @@ void CDecl_ScanPointer(DeclInfo *declinfo, NameSpace *nspace, Boolean flag) {
declinfo->x20 = pr.x8;
return;
}
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
}
break;
@@ -1083,7 +1083,7 @@ void scandeclarator(DeclInfo *declinfo) {
return;
}
}
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
}
@@ -1111,7 +1111,7 @@ void conversion_type_name(DeclInfo *declinfo) {
if (pr.nspace_0 && pr.nspace_0->theclass && tk == '*')
CDecl_ScanPointer(&subdeclinfo, pr.nspace_0, 0);
else
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
}
@@ -1131,14 +1131,14 @@ static void scaninlinefunc(Object *obj) {
r29 = 0;
while (1) {
if (r29 >= 256) {
- CError_Error(127);
+ CError_Error(CErrorStr127);
r29 = 255;
}
val = CExpr_IntegralConstExpr();
array[r29++] = CInt64_GetULong(&val);
if (tk != '}') {
if (tk != ',')
- CError_Error(116);
+ CError_Error(CErrorStr116);
tk = lex();
} else {
tk = lex();
@@ -1158,7 +1158,7 @@ static void scaninlinefunc(Object *obj) {
memcpy(obj->u.ifunc.data, array, obj->u.ifunc.size);
if (tk != ';')
- CError_Error(123);
+ CError_Error(CErrorStr123);
}
typedef enum {
@@ -1200,7 +1200,7 @@ static Object *CDecl_OverloadFunctionObject(NameSpaceObjectList *list, DeclInfo
if (IS_TYPEFUNC_METHOD(scanfunc)) {
switch (mode) {
case OverloadMode0:
- CError_Error(197);
+ CError_Error(CErrorStr197);
break;
case OverloadMode1:
if (!TYPE_METHOD(scanfunc)->x26)
@@ -1220,14 +1220,14 @@ static Object *CDecl_OverloadFunctionObject(NameSpaceObjectList *list, DeclInfo
}
} else {
if (mode)
- CError_Error(197);
+ CError_Error(CErrorStr197);
}
compareresult = CParser_CompareArgLists(args, scanargs);
if (compareresult == 1) {
if (scanfunc->flags & FUNC_FLAGS_40) {
if (!(tfunc->flags & FUNC_FLAGS_40)) {
- CError_Error(197);
+ CError_Error(CErrorStr197);
break;
}
if (!is_typesame(tfunc->functype, scanfunc->functype))
@@ -1235,7 +1235,7 @@ static Object *CDecl_OverloadFunctionObject(NameSpaceObjectList *list, DeclInfo
if ((tfunc->qual & (Q_CONST | Q_PASCAL)) != (scanfunc->qual & (Q_CONST | Q_PASCAL)))
continue;
if ((tfunc->flags & (FUNC_FLAGS_F0000000 | FUNC_FLAGS_PASCAL)) != (scanfunc->flags & (FUNC_FLAGS_F0000000 | FUNC_FLAGS_PASCAL))) {
- CError_Error(197);
+ CError_Error(CErrorStr197);
break;
}
if (tfunc->exspecs || scanfunc->exspecs)
@@ -1244,12 +1244,12 @@ static Object *CDecl_OverloadFunctionObject(NameSpaceObjectList *list, DeclInfo
}
if (tfunc->flags & FUNC_FLAGS_40) {
- CError_Error(197);
+ CError_Error(CErrorStr197);
break;
}
if (!is_typesame(tfunc->functype, scanfunc->functype) || ((tfunc->qual & (Q_CONST | Q_PASCAL)) != (scanfunc->qual & (Q_CONST | Q_PASCAL))) || ((tfunc->flags & (FUNC_FLAGS_F0000000 | FUNC_FLAGS_PASCAL)) != (scanfunc->flags & (FUNC_FLAGS_F0000000 | FUNC_FLAGS_PASCAL)))) {
- CError_Error(197);
+ CError_Error(CErrorStr197);
break;
}
@@ -1260,7 +1260,7 @@ static Object *CDecl_OverloadFunctionObject(NameSpaceObjectList *list, DeclInfo
return obj;
} else if (compareresult == 2) {
- CError_Error(197);
+ CError_Error(CErrorStr197);
break;
}
}
@@ -1271,12 +1271,12 @@ static Object *CDecl_OverloadFunctionObject(NameSpaceObjectList *list, DeclInfo
}
if (!outflag) {
- CError_Error(197);
+ CError_Error(CErrorStr197);
return NULL;
}
if (declinfo->nspace)
- CError_Error(336);
+ CError_Error(CErrorStr336);
*outflag = 1;
obj = CParser_NewFunctionObject(declinfo);
@@ -1286,7 +1286,7 @@ static Object *CDecl_OverloadFunctionObject(NameSpaceObjectList *list, DeclInfo
for (scan = list; scan; scan = scan->next) {
if (scan->object->otype == OT_OBJECT && IS_TYPE_FUNC(OBJECT(scan->object)->type)) {
if (TYPE_FUNC(OBJECT(scan->object)->type)->flags & FUNC_FLAGS_PASCAL)
- CError_Error(226);
+ CError_Error(CErrorStr226);
}
}
}
@@ -1294,7 +1294,7 @@ static Object *CDecl_OverloadFunctionObject(NameSpaceObjectList *list, DeclInfo
if (copts.cplusplus && declinfo->x4E) {
for (scan = list; scan; scan = scan->next) {
if (scan->object->otype == OT_OBJECT && !(OBJECT(scan->object)->qual & Q_80000))
- CError_Error(197);
+ CError_Error(CErrorStr197);
}
}
@@ -1327,7 +1327,7 @@ void MergeDefaultArgs(FuncArg *a, FuncArg *b) {
b->dexpr = NULL;
b = b->next;
}
- CError_Error(205);
+ CError_Error(CErrorStr205);
return;
}
scan_b = scan_b->next;
@@ -1350,7 +1350,7 @@ void MergeDefaultArgs(FuncArg *a, FuncArg *b) {
b->dexpr = NULL;
b = b->next;
}
- CError_Error(205);
+ CError_Error(CErrorStr205);
return;
} else {
scan_a = scan_a->next;
@@ -1382,7 +1382,7 @@ void CheckDefaultArgs(FuncArg *args) {
args->dexpr = NULL;
args = args->next;
}
- CError_Error(205);
+ CError_Error(CErrorStr205);
return;
}
scan = scan->next;
@@ -1392,7 +1392,7 @@ void CheckDefaultArgs(FuncArg *args) {
static void CDecl_FuncRedeclCheck(Object *obj, DeclInfo *declinfo, Boolean flag) {
if (declinfo->storageclass == TK_STATIC && obj->sclass != TK_STATIC) {
if (copts.cplusplus)
- CError_Error(260);
+ CError_Error(CErrorStr260);
else
obj->sclass = TK_STATIC;
}
@@ -1428,7 +1428,7 @@ Object *CDecl_GetFunctionObject(DeclInfo *declinfo, NameSpace *nspace, Boolean *
switch (TYPE_FUNC(declinfo->thetype)->functype->type) {
case TYPEFUNC:
case TYPEARRAY:
- CError_Error(128);
+ CError_Error(CErrorStr128);
TYPE_FUNC(declinfo->thetype)->functype = (Type *) &stsignedint;
break;
}
@@ -1438,14 +1438,14 @@ Object *CDecl_GetFunctionObject(DeclInfo *declinfo, NameSpace *nspace, Boolean *
if (!nspace2->theclass->size)
CDecl_CompleteType((Type *) nspace2->theclass);
if (!(list = CScope_GetLocalObject(nspace2, declinfo->name))) {
- CError_Error(140, declinfo->name->name);
+ CError_Error(CErrorStr140, declinfo->name->name);
return NULL;
}
obj = OBJECT(list->object);
type = obj->type;
if (!IS_TYPE_FUNC(type)) {
- CError_Error(249, CError_GetObjectName(obj), type, obj->qual, declinfo->thetype, declinfo->qual);
+ CError_Error(CErrorStr249, CError_GetObjectName(obj), type, obj->qual, declinfo->thetype, declinfo->qual);
return NULL;
}
@@ -1483,7 +1483,7 @@ Object *CDecl_GetFunctionObject(DeclInfo *declinfo, NameSpace *nspace, Boolean *
tmp = *TYPE_METHOD(obj->type);
*(TYPE_FUNC(&tmp)) = *TYPE_FUNC(declinfo->thetype);
tmp.flags |= FUNC_FLAGS_METHOD;
- CError_Error(249, CError_GetObjectName(obj), obj->type, obj->qual, &tmp, declinfo->qual);
+ CError_Error(CErrorStr249, CError_GetObjectName(obj), obj->type, obj->qual, &tmp, declinfo->qual);
}
if (TYPE_FUNC(declinfo->thetype)->exspecs || TYPE_FUNC(obj->type)->exspecs)
@@ -1493,12 +1493,12 @@ Object *CDecl_GetFunctionObject(DeclInfo *declinfo, NameSpace *nspace, Boolean *
CDecl_FuncRedeclCheck(obj, declinfo, 0);
if (declinfo->x3C) {
if (obj->nspace->theclass && !(obj->nspace->theclass->flags & CLASS_FLAGS_800))
- CError_Error(335);
+ CError_Error(CErrorStr335);
declinfo->x3C = 0;
}
} else {
if (TYPE_FUNC(declinfo->thetype)->flags & (FUNC_FLAGS_VOLATILE | FUNC_FLAGS_CONST))
- CError_Error(384);
+ CError_Error(CErrorStr384);
if (declinfo->x3E && !CDecl_CheckOperatorType(declinfo, 0))
return NULL;
@@ -1519,7 +1519,7 @@ Object *CDecl_GetFunctionObject(DeclInfo *declinfo, NameSpace *nspace, Boolean *
} else {
obj = OBJECT(list->object);
if (!is_typesame(declinfo->thetype, obj->type) || (declinfo->qual & (Q_CONST | Q_PASCAL)) != (obj->qual & (Q_CONST | Q_PASCAL))) {
- CError_Error(249, CError_GetObjectName(obj), obj->type, obj->qual, declinfo->thetype, declinfo->qual);
+ CError_Error(CErrorStr249, CError_GetObjectName(obj), obj->type, obj->qual, declinfo->thetype, declinfo->qual);
r27 = 1;
if (!IS_TYPE_FUNC(obj->type))
return NULL;
@@ -1530,13 +1530,13 @@ Object *CDecl_GetFunctionObject(DeclInfo *declinfo, NameSpace *nspace, Boolean *
CDecl_FuncRedeclCheck(obj, declinfo, *pflag);
} else {
if (declinfo->nspace)
- CError_Error(336);
+ CError_Error(CErrorStr336);
if (declinfo->has_expltargs) {
if (declinfo->name)
- CError_Error(140, declinfo->name->name);
+ CError_Error(CErrorStr140, declinfo->name->name);
else
- CError_Error(127);
+ CError_Error(CErrorStr127);
}
obj = CParser_NewFunctionObject(declinfo);
@@ -1545,7 +1545,7 @@ Object *CDecl_GetFunctionObject(DeclInfo *declinfo, NameSpace *nspace, Boolean *
if (pflag)
*pflag = 1;
else
- CError_Error(127);
+ CError_Error(CErrorStr127);
CheckDefaultArgs(TYPE_FUNC(obj->type)->args);
CScope_AddObject(nspace2, declinfo->name, OBJ_BASE(obj));
@@ -1566,9 +1566,9 @@ void CDecl_TypedefDeclarator(DeclInfo *declinfo) {
CError_QualifierCheck(declinfo->qual & ~(Q_ALIGNED_MASK | Q_REFERENCE | Q_PASCAL | Q_VOLATILE | Q_CONST));
if (declinfo->x48 || declinfo->x44)
- CError_Error(121);
+ CError_Error(CErrorStr121);
if (declinfo->x3E)
- CError_Error(193);
+ CError_Error(CErrorStr193);
objt = NULL;
list = CScope_FindName(nspace, declinfo->name);
@@ -1580,11 +1580,11 @@ void CDecl_TypedefDeclarator(DeclInfo *declinfo) {
case OT_TYPETAG:
break;
case OT_NAMESPACE:
- CError_Error(321);
+ CError_Error(CErrorStr321);
return;
case OT_ENUMCONST:
case OT_OBJECT:
- CError_Error(322);
+ CError_Error(CErrorStr322);
return;
default:
CError_FATAL(2156);
@@ -1594,12 +1594,12 @@ void CDecl_TypedefDeclarator(DeclInfo *declinfo) {
if (objt) {
const UInt32 mask = Q_ALIGNED_MASK | Q_REFERENCE | Q_PASCAL | Q_VOLATILE | Q_CONST;
if (!is_typesame(objt->type, declinfo->thetype) || (objt->qual & mask) != (declinfo->qual & mask)) {
- CError_Error(249, declinfo->name->name, objt->type, objt->qual, declinfo->thetype, declinfo->qual);
+ CError_Error(CErrorStr249, declinfo->name->name, objt->type, objt->qual, declinfo->thetype, declinfo->qual);
} else if (!copts.cplusplus && (copts.pedantic || copts.ANSI_strict)) {
if (copts.pedantic)
- CError_Warning(122, declinfo->name->name);
+ CError_Warning(CErrorStr122, declinfo->name->name);
else
- CError_Error(122, declinfo->name->name);
+ CError_Error(CErrorStr122, declinfo->name->name);
}
return;
}
@@ -1643,9 +1643,9 @@ static void CDecl_DataDeclarator(DeclInfo *declinfo, short access, Boolean flag)
CError_QualifierCheck(declinfo->qual & ~(Q_ALIGNED_MASK | Q_OVERLOAD | Q_20000 | Q_PASCAL | Q_VOLATILE | Q_CONST));
if (declinfo->x48 || declinfo->x44)
- CError_Error(121);
+ CError_Error(CErrorStr121);
if (declinfo->x3E)
- CError_Error(193);
+ CError_Error(CErrorStr193);
obj = NULL;
list = CScope_FindName(nspace, declinfo->name);
@@ -1654,19 +1654,19 @@ static void CDecl_DataDeclarator(DeclInfo *declinfo, short access, Boolean flag)
case OT_OBJECT:
obj = OBJECT(list->object);
if (flag)
- CError_Error(122, declinfo->name->name);
+ CError_Error(CErrorStr122, declinfo->name->name);
break;
case OT_TYPETAG:
break;
case OT_NAMESPACE:
- CError_Error(321);
+ CError_Error(CErrorStr321);
return;
case OT_ENUMCONST:
case OT_TYPE:
- CError_Error(322);
+ CError_Error(CErrorStr322);
break;
case OT_MEMBERVAR:
- CError_Error(221);
+ CError_Error(CErrorStr221);
break;
default:
CError_FATAL(2281);
@@ -1703,17 +1703,17 @@ static void CDecl_DataDeclarator(DeclInfo *declinfo, short access, Boolean flag)
tmpflag = is_typesame(declinfo->thetype, obj->type);
if (!tmpflag || (obj->qual & (Q_PASCAL | Q_VOLATILE | Q_CONST)) != (declinfo->qual & (Q_PASCAL | Q_VOLATILE | Q_CONST)))
- CError_Error(249, CError_GetObjectName(obj), obj->type, obj->qual, declinfo->thetype, declinfo->qual);
+ CError_Error(CErrorStr249, CError_GetObjectName(obj), obj->type, obj->qual, declinfo->thetype, declinfo->qual);
if (obj->qual & Q_10000) {
if (tk == ',' || tk == ';')
return;
- CError_Error(333, obj);
+ CError_Error(CErrorStr333, obj);
}
if (declinfo->storageclass != TK_EXTERN) {
if (obj->sclass != TK_EXTERN && declinfo->storageclass && obj->sclass != declinfo->storageclass)
- CError_Error(333, obj);
+ CError_Error(CErrorStr333, obj);
if (tmpflag) {
obj->sclass = declinfo->storageclass;
@@ -1728,9 +1728,9 @@ static void CDecl_DataDeclarator(DeclInfo *declinfo, short access, Boolean flag)
}
} else {
if (declinfo->nspace)
- CError_Error(336);
+ CError_Error(CErrorStr336);
if (IS_TYPE_CLASS(declinfo->thetype) && TYPE_CLASS(declinfo->thetype)->sominfo)
- CError_Error(288);
+ CError_Error(CErrorStr288);
if (!CanCreateObject(declinfo->thetype))
declinfo->thetype = (Type *) &stsignedint;
@@ -1771,7 +1771,7 @@ static void CDecl_DataDeclarator(DeclInfo *declinfo, short access, Boolean flag)
obj->u.data.u.intconst = expr->data.intval;
obj->qual |= Q_10000 | Q_20000;
} else {
- CError_Error(354, obj->name->name);
+ CError_Error(CErrorStr354, obj->name->name);
}
}
}
@@ -1784,17 +1784,17 @@ Boolean CDecl_FunctionDeclarator(DeclInfo *declinfo, NameSpace *nspace, Boolean
if (obj) {
if (declinfo->x44 || tk == '{' || tk == TK_TRY || (declinfo->x4B && tk == ':') || (!copts.cplusplus && isdeclaration(0, 0, 0, 0))) {
if (!flag || cscope_currentfunc) {
- CError_Error(127);
+ CError_Error(CErrorStr127);
if (cscope_currentfunc)
return 0;
}
if (obj->nspace == cscope_root && !strcmp(obj->name->name, "main")) {
if (obj->sclass == TK_STATIC || (copts.ANSI_strict && TYPE_FUNC(obj->type)->functype != (Type *) &stsignedint))
- CError_Error(334);
+ CError_Error(CErrorStr334);
} else if (copts.require_prototypes && (pflag || declinfo->x64)) {
if (obj->sclass != TK_STATIC && !(obj->qual & Q_INLINE) && !obj->nspace->is_unnamed)
- CError_Warning(178);
+ CError_Warning(CErrorStr178);
}
CFunc_ParseFuncDef(obj, declinfo, NULL, 0, 0, NULL);
@@ -1826,7 +1826,7 @@ static void CDecl_ParseSpecialMember(DeclInfo *declinfo, Boolean flag) {
}
if (!r28->nspace->theclass) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
@@ -1860,10 +1860,10 @@ static void CDecl_ParseSpecialMember(DeclInfo *declinfo, Boolean flag) {
if (flag)
CDecl_FunctionDeclarator(declinfo, NULL, 1, 1);
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
} else {
- CError_Error(114);
+ CError_Error(CErrorStr114);
}
return;
} else if (TYPE_FUNC(r28->type)->flags & FUNC_FLAGS_40) {
@@ -1882,10 +1882,10 @@ static void CDecl_ParseSpecialMember(DeclInfo *declinfo, Boolean flag) {
if (flag)
CDecl_FunctionDeclarator(declinfo, NULL, 1, 1);
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
} else {
- CError_Error(114);
+ CError_Error(CErrorStr114);
}
return;
} else {
@@ -1907,12 +1907,12 @@ static void CDecl_ParseSpecialMember(DeclInfo *declinfo, Boolean flag) {
return;
}
} else {
- CError_Error(114);
+ CError_Error(CErrorStr114);
}
}
}
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
void CDecl_ScanDeclarator(DeclInfo *declinfo) {
@@ -1929,12 +1929,12 @@ void CDecl_ScanDeclarator(DeclInfo *declinfo) {
}
scandeclarator(declinfo);
if (!declinfo->name) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
if (declinfo->storageclass && declinfo->storageclass != TK_EXTERN)
- CError_Error(177);
+ CError_Error(CErrorStr177);
if (IS_TYPE_FUNC(declinfo->thetype)) {
CDecl_GetFunctionObject(declinfo, NULL, NULL, 1);
@@ -1942,16 +1942,16 @@ void CDecl_ScanDeclarator(DeclInfo *declinfo) {
}
if (declinfo->x48 || declinfo->x44)
- CError_Error(121);
+ CError_Error(CErrorStr121);
if (declinfo->x3E)
- CError_Error(193);
+ CError_Error(CErrorStr193);
if (
(declinfo->qual & ~(Q_ALIGNED_MASK | Q_OVERLOAD | Q_20000 | Q_PASCAL | Q_VOLATILE | Q_CONST)) ||
(declinfo->storageclass == TK_TYPEDEF && (declinfo->qual & ~(Q_ALIGNED_MASK | Q_REFERENCE | Q_PASCAL | Q_VOLATILE | Q_CONST)))
)
- CError_Error(176);
+ CError_Error(CErrorStr176);
}
void scandeclaratorlist(DeclInfo *declinfo) {
@@ -1981,7 +1981,7 @@ void scandeclaratorlist(DeclInfo *declinfo) {
declinfo->name = NULL;
scandeclarator(declinfo);
if (!declinfo->name) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
break;
}
@@ -2007,7 +2007,7 @@ void scandeclaratorlist(DeclInfo *declinfo) {
}
if (tk != ';')
- CError_Error(123);
+ CError_Error(CErrorStr123);
}
static TypeIntegral *CDecl_FindSignedType(short size) {
@@ -2165,7 +2165,7 @@ static TypeEnum *CDecl_OldParseEnumList(TypeEnum *tenum, HashNameNode *name) {
if (!copts.warn_extracomma)
break;
}
- CError_Warning(107);
+ CError_Warning(CErrorStr107);
break;
}
@@ -2198,7 +2198,7 @@ static TypeEnum *CDecl_OldParseEnumList(TypeEnum *tenum, HashNameNode *name) {
r23 = 0;
} else {
if (r23)
- CError_Error(154);
+ CError_Error(CErrorStr154);
if (!r24 || !CInt64_IsNegative(&val)) {
if (CInt64_GreaterU(val, minimum)) {
@@ -2216,10 +2216,10 @@ static TypeEnum *CDecl_OldParseEnumList(TypeEnum *tenum, HashNameNode *name) {
if (copts.enumsalwaysint) {
if (copts.ANSI_strict) {
if (!CInt64_IsInRange(val, stsignedint.size))
- CError_Error(154);
+ CError_Error(CErrorStr154);
} else {
if (!CInt64_IsInRange(val, stsignedint.size) && !CInt64_IsInURange(val, stunsignedint.size))
- CError_Error(154);
+ CError_Error(CErrorStr154);
}
} else if (r24) {
switch (basetype->size) {
@@ -2239,12 +2239,12 @@ static TypeEnum *CDecl_OldParseEnumList(TypeEnum *tenum, HashNameNode *name) {
if (!copts.ANSI_strict && CInt64_IsInRange(maximum, 4) && CInt64_IsInURange(minimum, 4))
break;
if (overflowed)
- CError_Error(154);
+ CError_Error(CErrorStr154);
break;
}
case 8:
if (CInt64_Equal(val, minimum) && CInt64_IsNegative(&val))
- CError_Error(154);
+ CError_Error(CErrorStr154);
break;
default:
CError_FATAL(3071);
@@ -2265,7 +2265,7 @@ static TypeEnum *CDecl_OldParseEnumList(TypeEnum *tenum, HashNameNode *name) {
basetype = TYPE(CDecl_FindUnsignedType(8));
if (basetype->size != 8) {
if (overflowed)
- CError_Error(154);
+ CError_Error(CErrorStr154);
break;
}
case 8:
@@ -2318,7 +2318,7 @@ static TypeEnum *CDecl_OldParseEnumList(TypeEnum *tenum, HashNameNode *name) {
oec->type = TYPE(tenum);
if (tk != '}')
- CError_ErrorSkip(130);
+ CError_ErrorSkip(CErrorStr130);
else
tk = lex();
@@ -2363,14 +2363,14 @@ void CDecl_ComputeUnderlyingEnumType(TypeEnum *tenum) {
}
if (CInt64_IsNegative(&maximum))
- CError_Error(154);
+ CError_Error(CErrorStr154);
t = 0;
do {
r26 = TYPE(CDecl_IterateIntegralEnumType(&t));
if (!r26) {
r26 = TYPE(&stsignedlong);
- CError_Error(154);
+ CError_Error(CErrorStr154);
break;
}
@@ -2392,7 +2392,7 @@ void CDecl_ComputeUnderlyingEnumType(TypeEnum *tenum) {
r26 = TYPE(CDecl_IterateUIntegralEnumType(&t));
if (!r26) {
r26 = TYPE(&stunsignedlong);
- CError_Error(154);
+ CError_Error(CErrorStr154);
break;
}
if (CInt64_IsInURange(val, r26->size))
@@ -2510,9 +2510,9 @@ static TypeEnum *CDecl_ParseEnumList(TypeEnum *tenum, HashNameNode *name) {
if (copts.cpp_extensions)
break;
}
- CError_Warning(107);
+ CError_Warning(CErrorStr107);
} else {
- CError_Error(107);
+ CError_Error(CErrorStr107);
}
break;
}
@@ -2587,7 +2587,7 @@ static TypeEnum *CDecl_ParseEnumList(TypeEnum *tenum, HashNameNode *name) {
}
if (overflowed)
- CError_Error(154);
+ CError_Error(CErrorStr154);
oec->val = val;
oec->type = basetype;
@@ -2615,7 +2615,7 @@ static TypeEnum *CDecl_ParseEnumList(TypeEnum *tenum, HashNameNode *name) {
oec->type = TYPE(tenum);
if (tk != '}')
- CError_ErrorSkip(130);
+ CError_ErrorSkip(CErrorStr130);
else
tk = lex();
@@ -2641,7 +2641,7 @@ void scanenum(DeclInfo *declinfo) {
lex();
do_shit:
if (type->size || !IS_TYPE_ENUM(type)) {
- CError_Error(122, name->name);
+ CError_Error(CErrorStr122, name->name);
declinfo->thetype = TYPE(CDecl_ParseEnumList(NULL, NULL));
return;
}
@@ -2669,7 +2669,7 @@ void scanenum(DeclInfo *declinfo) {
if (CScope_ParseElaborateName(&pr)) {
if ((type = pr.x8)) {
if (!IS_TYPE_ENUM(type))
- CError_Error(121);
+ CError_Error(CErrorStr121);
if ((tk = lex()) == '{')
goto do_shit;
declinfo->thetype = type;
@@ -2680,11 +2680,11 @@ void scanenum(DeclInfo *declinfo) {
declinfo->thetype = TYPE(CDecl_ParseEnumList(NULL, pr.name_4));
return;
} else {
- CError_Error(140, pr.name_4->name);
+ CError_Error(CErrorStr140, pr.name_4->name);
}
}
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
declinfo->thetype = TYPE(&stsignedint);
@@ -2712,7 +2712,7 @@ void CDecl_ScanStructDeclarator(BigDeclInfo *bde) {
bde->declinfo2.x50 = 1;
scandeclarator(&bde->declinfo2);
if (!bde->declinfo2.name) {
- CError_Error(131);
+ CError_Error(CErrorStr131);
return;
}
@@ -2724,7 +2724,7 @@ void CDecl_ScanStructDeclarator(BigDeclInfo *bde) {
if (!IsCompleteType(type))
return;
if (tk != ';' || lookahead() != '}') {
- CError_Error(145);
+ CError_Error(CErrorStr145);
return;
}
}
@@ -2736,7 +2736,7 @@ void CDecl_ScanStructDeclarator(BigDeclInfo *bde) {
}
if (IS_TYPE_CLASS(bde->declinfo2.thetype) && TYPE_CLASS(bde->declinfo2.thetype)->sominfo) {
- CError_Error(287);
+ CError_Error(CErrorStr287);
return;
}
@@ -2747,11 +2747,11 @@ void CDecl_ScanStructDeclarator(BigDeclInfo *bde) {
if (!IS_TYPE_INT_OR_ENUM(bde->declinfo2.thetype)) {
if (CTemplTool_IsTemplateArgumentDependentType(bde->declinfo2.thetype))
goto fuckup;
- CError_Error(138);
+ CError_Error(CErrorStr138);
bde->declinfo2.thetype = TYPE(&stunsignedint);
} else if (copts.ANSI_strict && !copts.cplusplus) {
if (bde->declinfo2.thetype != TYPE(&stsignedint) && bde->declinfo2.thetype != TYPE(&stunsignedint)) {
- CError_Error(138);
+ CError_Error(CErrorStr138);
bde->declinfo2.thetype = TYPE(&stunsignedint);
}
}
@@ -2767,7 +2767,7 @@ void CDecl_ScanStructDeclarator(BigDeclInfo *bde) {
bits = 32;
break;
default:
- CError_Error(138);
+ CError_Error(CErrorStr138);
return;
}
fuckup:
@@ -2784,12 +2784,12 @@ fuckup:
val = CInt64_GetULong(&expr->data.intval);
if (is_bitfield) {
if (val < 0 || val > bits) {
- CError_Error(138);
+ CError_Error(CErrorStr138);
return;
}
} else {
if (val <= 0 || val > bits) {
- CError_Error(138);
+ CError_Error(CErrorStr138);
return;
}
}
@@ -2849,7 +2849,7 @@ static void CDecl_LayoutStruct(TypeStruct *tstruct) {
r23 = 1;
while (innermember) {
if (ismember(tstruct, innermember->name))
- CError_Error(133, innermember->name->name);
+ CError_Error(CErrorStr133, innermember->name->name);
if (r23) {
member->type = innermember->type;
member->name = innermember->name;
@@ -2911,14 +2911,14 @@ static void CDecl_LayoutStruct(TypeStruct *tstruct) {
prev = NULL;
while (member) {
if (prev && (prev->offset + prev->type->size) < member->offset) {
- CError_Warning(350, member->offset - (prev->offset + prev->type->size), prev->name->name);
+ CError_Warning(CErrorStr350, member->offset - (prev->offset + prev->type->size), prev->name->name);
}
prev = member;
member = member->next;
}
if (prev && (prev->offset + prev->type->size) < tstruct->size) {
- CError_Warning(350, tstruct->size - (prev->offset + prev->type->size), prev->name->name);
+ CError_Warning(CErrorStr350, tstruct->size - (prev->offset + prev->type->size), prev->name->name);
}
}
}
@@ -2935,14 +2935,14 @@ static SInt32 scanstructdeclarationlist(TypeStruct *tstruct, Boolean flag) {
CPrep_NewFileOffsetInfo(&member_fileoffset, NULL);
CObjC_ParseDefs(tstruct);
if ((tk = lex()) != '}')
- CError_Error(130);
+ CError_Error(CErrorStr130);
} else {
do {
CPrep_NewFileOffsetInfo(&member_fileoffset, NULL);
memclrw(&bde.declinfo, sizeof(DeclInfo));
CParser_GetDeclSpecs(&bde.declinfo, 0);
if (bde.declinfo.storageclass || bde.declinfo.x44) {
- CError_Error(131);
+ CError_Error(CErrorStr131);
tstruct->members = NULL;
return -1;
}
@@ -2951,12 +2951,12 @@ static SInt32 scanstructdeclarationlist(TypeStruct *tstruct, Boolean flag) {
while (1) {
CDecl_ScanStructDeclarator(&bde);
if (!CanCreateObject(bde.declinfo2.thetype)) {
- CError_Error(131);
+ CError_Error(CErrorStr131);
bde.xCD = 0;
}
if (bde.declinfo2.x3E) {
- CError_Error(131);
+ CError_Error(CErrorStr131);
bde.xCD = 0;
}
@@ -2973,7 +2973,7 @@ static SInt32 scanstructdeclarationlist(TypeStruct *tstruct, Boolean flag) {
CBrowse_AddStructMember(member, CPrep_BrowserTokenOffset(&member_fileoffset) + 1, CPrep_BrowserFileOffset());
}
} else {
- CError_Error(133, bde.declinfo2.name->name);
+ CError_Error(CErrorStr133, bde.declinfo2.name->name);
}
}
@@ -2987,12 +2987,12 @@ static SInt32 scanstructdeclarationlist(TypeStruct *tstruct, Boolean flag) {
member->type = bde.declinfo.thetype;
appendmember(tstruct, member);
} else {
- CError_Error(131);
+ CError_Error(CErrorStr131);
}
if (tk != ';') {
tstruct->members = NULL;
- CError_Error(123);
+ CError_Error(CErrorStr123);
return -1;
}
@@ -3055,7 +3055,7 @@ void scanstruct(DeclInfo *declinfo, short structtype) {
type = (Type *) CDecl_DefineStruct(name, structtype);
if (!IS_TYPE_STRUCT(type) || TYPE_STRUCT(type)->stype != structtype) {
- CError_Error(132, name->name);
+ CError_Error(CErrorStr132, name->name);
declinfo->thetype = type;
return;
}
@@ -3066,7 +3066,7 @@ void scanstruct(DeclInfo *declinfo, short structtype) {
}
if (type->size) {
- CError_Error(132, name->name);
+ CError_Error(CErrorStr132, name->name);
type = (Type *) CDecl_DefineStruct(NULL, structtype);
}
} else {
@@ -3077,7 +3077,7 @@ void scanstruct(DeclInfo *declinfo, short structtype) {
}
}
} else if (tk != '{') {
- CError_Error(131);
+ CError_Error(CErrorStr131);
declinfo->thetype = (Type *) &stsignedint;
return;
} else {
@@ -3098,7 +3098,7 @@ void scanstruct(DeclInfo *declinfo, short structtype) {
}
static void InlineFunctionObject(Object *obj, TypeClass *tclass) {
- TStream stream;
+ TokenStream stream;
CPrepFileInfo *file;
obj->qual |= Q_INLINE;
@@ -3151,16 +3151,16 @@ TypeMethod *CDecl_MakeTypeMemberFunc(TypeFunc *tfunc, TypeClass *tclass, Boolean
CDecl_AddThisPointerArgument(TYPE_FUNC(method), tclass);
if ((flag || (tfunc->flags & (FUNC_FLAGS_1000 | FUNC_FLAGS_2000))) && (tfunc->flags & (FUNC_FLAGS_CONST | FUNC_FLAGS_VOLATILE)))
- CError_Error(384);
+ CError_Error(CErrorStr384);
return method;
}
static void CDecl_MakeFunctionVirtual(TypeClass *tclass, Object *func) {
if (is_pascal_object(func))
- CError_Error(219);
+ CError_Error(CErrorStr219);
if (tclass->mode == CLASS_MODE_1)
- CError_Error(352, func);
+ CError_Error(CErrorStr352, func);
func->datatype = DVFUNC;
}
@@ -3172,7 +3172,7 @@ static void CDecl_AddFunctionMember(DeclE *decle, TypeClass *tclass, DeclInfo *d
Boolean outflag;
if (IS_TYPE_ARRAY(TYPE_FUNC(declinfo->thetype)->functype) || IS_TYPE_FUNC(TYPE_FUNC(declinfo->thetype)->functype)) {
- CError_Error(128);
+ CError_Error(CErrorStr128);
TYPE_FUNC(declinfo->thetype)->functype = (Type *) &stsignedint;
}
@@ -3189,7 +3189,7 @@ static void CDecl_AddFunctionMember(DeclE *decle, TypeClass *tclass, DeclInfo *d
if ((list = CScope_FindName(tclass->nspace, declinfo->name))) {
if (list->object->otype != OT_TYPETAG) {
if (list->object->otype != OT_OBJECT || !IS_TYPE_FUNC(OBJECT(list->object)->type))
- CError_Error(133, declinfo->name->name);
+ CError_Error(CErrorStr133, declinfo->name->name);
} else {
list = NULL;
}
@@ -3214,7 +3214,7 @@ static void CDecl_AddFunctionMember(DeclE *decle, TypeClass *tclass, DeclInfo *d
if (outflag)
tfunc->x1E = ++decle->x8;
else
- CError_Error(133, CError_GetObjectName(obj));
+ CError_Error(CErrorStr133, CError_GetObjectName(obj));
} else {
tfunc->x1E = ++decle->x8;
obj = CParser_NewFunctionObject(declinfo);
@@ -3239,18 +3239,18 @@ static void CDecl_AddFunctionMember(DeclE *decle, TypeClass *tclass, DeclInfo *d
if ((flag1 || r31) && flag3 && (tk == '=')) {
if ((tk = lex()) == TK_INTCONST) {
if (!CInt64_IsZero(&tkintconst))
- CError_Error(121);
+ CError_Error(CErrorStr121);
tfunc->flags |= FUNC_FLAGS_8;
tclass->flags |= CLASS_FLAGS_ABSTRACT;
tk = lex();
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
}
if (flag3 && ((tk == '{') || (tk == TK_TRY) || ((tk == ':') && CClass_IsConstructor(obj)))) {
if (declinfo->x49)
- CError_Error(127);
+ CError_Error(CErrorStr127);
InlineFunctionObject(obj, NULL);
}
@@ -3390,14 +3390,14 @@ static void CDecl_ParseFriendDecl(TypeClass *tclass) {
declinfo.x4C = 1;
CParser_GetDeclSpecs(&declinfo, 1);
if (declinfo.storageclass) {
- CError_Error(177);
+ CError_Error(CErrorStr177);
declinfo.storageclass = 0;
}
declinfo.x4C = 0;
if (tk == ';') {
if (!r27)
- CError_Error(201);
+ CError_Error(CErrorStr201);
if (IS_TYPE_CLASS(declinfo.thetype)) {
if (!(TYPE_CLASS(declinfo.thetype)->flags & CLASS_FLAGS_100) || CParser_CheckTemplateClassUsage(TEMPL_CLASS(declinfo.thetype), 1)) {
@@ -3410,7 +3410,7 @@ static void CDecl_ParseFriendDecl(TypeClass *tclass) {
if (IS_TYPE_TEMPLATE(declinfo.thetype) && is_templ)
CTemplClass_RegisterFriend(TEMPL_CLASS(tclass), &declinfo);
else
- CError_Error(201);
+ CError_Error(CErrorStr201);
}
} else {
if (declinfo.x14 || declinfo.x10) {
@@ -3420,7 +3420,7 @@ static void CDecl_ParseFriendDecl(TypeClass *tclass) {
if (obj)
CDecl_AddFriend(tclass, obj, NULL);
if (tk != ';')
- CError_Error(123);
+ CError_Error(CErrorStr123);
else
tk = lex();
}
@@ -3453,7 +3453,7 @@ static void CDecl_ParseFriendDecl(TypeClass *tclass) {
CTemplClass_RegisterFriend(TEMPL_CLASS(tclass), &declinfo);
}
} else {
- CError_Error(201);
+ CError_Error(CErrorStr201);
}
if (tk != ',')
@@ -3466,7 +3466,7 @@ static void CDecl_ParseFriendDecl(TypeClass *tclass) {
if (tk == ';')
tk = lex();
else
- CError_Error(123);
+ CError_Error(CErrorStr123);
}
static ObjMemberVar *CDecl_InstanceDataDeclarator(DeclE *decle, TypeClass *tclass, Type *type, UInt32 qual, HashNameNode *name, short access) {
@@ -3477,15 +3477,15 @@ static ObjMemberVar *CDecl_InstanceDataDeclarator(DeclE *decle, TypeClass *tclas
if (name && (list = CScope_FindName(tclass->nspace, name))) {
switch (list->object->otype) {
case OT_NAMESPACE:
- CError_Error(321);
+ CError_Error(CErrorStr321);
return NULL;
case OT_ENUMCONST:
case OT_TYPE:
case OT_OBJECT:
- CError_Error(322);
+ CError_Error(CErrorStr322);
return NULL;
case OT_MEMBERVAR:
- CError_Error(122, name->name);
+ CError_Error(CErrorStr122, name->name);
return NULL;
case OT_TYPETAG:
break;
@@ -3526,7 +3526,7 @@ static ObjMemberVar *CDecl_InstanceDataDeclarator(DeclE *decle, TypeClass *tclas
void CDecl_CheckCtorIntegrity(FuncArg *args, TypeClass *tclass) {
if (args && args->type == TYPE(tclass)) {
if (!args->next || args->next->dexpr) {
- CError_Error(239);
+ CError_Error(CErrorStr239);
args->type = &stvoid;
}
}
@@ -3576,7 +3576,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
} else {
for (; nspace; nspace = nspace->parent) {
if (!nspace->name && !nspace->theclass && nspace->parent && !nspace->is_templ) {
- CError_Error(347);
+ CError_Error(CErrorStr347);
break;
}
}
@@ -3592,14 +3592,14 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
switch (tk) {
case TK_UU_DECLSPEC:
if ((tk = lex()) != '(')
- CError_Error(114);
+ CError_Error(CErrorStr114);
memclrw(&declinfo, sizeof(DeclInfo));
CParser_ParseDeclSpec(&declinfo, 1);
r21 |= declinfo.qual;
r20 |= declinfo.exportflags;
r18 = declinfo.section;
if ((tk = lex()) != ')')
- CError_Error(115);
+ CError_Error(CErrorStr115);
tk = lex();
goto restart2;
case TK_PRIVATE:
@@ -3612,9 +3612,9 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
global_access = access = ACCESSPUBLIC;
check_access:
if (r22 || r20)
- CError_Error(121);
+ CError_Error(CErrorStr121);
if ((tk = lex()) != ':')
- CError_Error(170);
+ CError_Error(CErrorStr170);
else
tk = lex();
goto restart;
@@ -3651,7 +3651,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
continue;
if (tk == '~')
goto restart2;
- CError_Error(107);
+ CError_Error(CErrorStr107);
}
if (t == '(') {
@@ -3673,7 +3673,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
bde.declinfo2.thetype = CTemplTool_ResolveMemberSelfRefs(TEMPL_CLASS(tclass), bde.declinfo2.thetype, &bde.declinfo2.qual);
if (tclass->sominfo) {
if (TYPE_FUNC(bde.declinfo2.thetype)->args)
- CError_Error(272);
+ CError_Error(CErrorStr272);
bde.declinfo2.qual |= Q_VIRTUAL;
} else {
CDecl_CheckCtorIntegrity(TYPE_FUNC(bde.declinfo2.thetype)->args, tclass);
@@ -3686,12 +3686,12 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
bde.declinfo2.qual |= r21;
CDecl_AddFunctionMember(decle, tclass, &bde.declinfo2, access, 0, 0, 1, 0);
} else {
- CError_Error(241);
+ CError_Error(CErrorStr241);
}
if (tk == ';')
tk = lex();
else
- CError_Error(123);
+ CError_Error(CErrorStr123);
goto restart;
}
}
@@ -3711,7 +3711,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
goto restart;
case '~':
if ((tk = lex()) != TK_IDENTIFIER || tkidentifier != tclass->classname) {
- CError_Error(241);
+ CError_Error(CErrorStr241);
goto restart;
}
CError_QualifierCheck(r22 & ~(Q_VIRTUAL | Q_INLINE | Q_ASM));
@@ -3722,7 +3722,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
memclrw(&bde.declinfo, sizeof(DeclInfo));
CParser_GetDeclSpecs(&bde.declinfo, 0);
if (tk != '(' || bde.declinfo.thetype != TYPE(tclass) || bde.declinfo.nspace) {
- CError_Error(241);
+ CError_Error(CErrorStr241);
goto restart;
}
CPrep_UnLex();
@@ -3750,15 +3750,15 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
bde.declinfo2.qual |= r21;
CDecl_AddFunctionMember(decle, tclass, &bde.declinfo2, access, 1, 0, 1, 0);
} else {
- CError_Error(133, CError_GetFunctionName(tclass->nspace, destructor_name_node, NULL));
+ CError_Error(CErrorStr133, CError_GetFunctionName(tclass->nspace, destructor_name_node, NULL));
}
} else {
- CError_Error(146);
+ CError_Error(CErrorStr146);
}
if (tk == ';')
tk = lex();
else
- CError_Error(123);
+ CError_Error(CErrorStr123);
goto restart;
case TK_OPERATOR:
if (CMangler_OperatorName(lookahead())) {
@@ -3782,7 +3782,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
if (tk == ';')
tk = lex();
else
- CError_Error(123);
+ CError_Error(CErrorStr123);
goto restart;
}
case TK_FRIEND:
@@ -3815,7 +3815,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
case TK_MUTABLE:
break;
default:
- CError_Error(177);
+ CError_Error(CErrorStr177);
bde.declinfo.storageclass = 0;
}
@@ -3825,7 +3825,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
if (r17)
bde.declinfo2.thetype = CTemplTool_ResolveMemberSelfRefs(TEMPL_CLASS(tclass), bde.declinfo2.thetype, &bde.declinfo2.qual);
if (bde.declinfo2.nspace)
- CError_Error(200);
+ CError_Error(CErrorStr200);
if (bde.declinfo2.x3E) {
if (bde.declinfo.storageclass == TK_MUTABLE)
CError_QualifierCheck(Q_MUTABLE);
@@ -3843,9 +3843,9 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
break;
default:
if (bde.declinfo2.storageclass == TK_STATIC)
- CError_Error(193);
+ CError_Error(CErrorStr193);
if (tclass->sominfo)
- CError_Error(193);
+ CError_Error(CErrorStr193);
}
bde.declinfo2.storageclass = 0;
@@ -3856,11 +3856,11 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
if (tclass->sominfo)
CSOM_FixNewDeleteFunctype(TYPE_FUNC(bde.declinfo2.thetype));
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
} else if (bde.xCD) {
if (bde.declinfo2.name == constructor_name_node || bde.declinfo2.name == destructor_name_node)
- CError_Error(241);
+ CError_Error(CErrorStr241);
switch (bde.declinfo2.storageclass) {
case TK_TYPEDEF:
CError_QualifierCheck(bde.declinfo2.qual & Q_VIRTUAL);
@@ -3869,12 +3869,12 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
case TK_STATIC:
CError_QualifierCheck(bde.declinfo2.qual & Q_VIRTUAL);
if (tclass->sominfo)
- CError_Error(271);
+ CError_Error(CErrorStr271);
if (IS_TYPE_FUNC(bde.declinfo2.thetype)) {
bde.declinfo2.qual |= r21;
bde.declinfo2.storageclass = 0;
if (bde.declinfo2.name == tclass->classname)
- CError_Error(241);
+ CError_Error(CErrorStr241);
CDecl_AddFunctionMember(decle, tclass, &bde.declinfo2, access, 0, 0, 1, 1);
} else {
CDecl_ExtractClassExportFlags(&bde.declinfo2, tclass->eflags);
@@ -3886,7 +3886,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
case TK_MUTABLE:
if (IS_TYPE_FUNC(bde.declinfo2.thetype)) {
if (bde.declinfo2.name == tclass->classname)
- CError_Error(241);
+ CError_Error(CErrorStr241);
if (bde.declinfo.storageclass == TK_MUTABLE)
CError_QualifierCheck(Q_MUTABLE);
bde.declinfo2.qual |= r21;
@@ -3901,7 +3901,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
}
break;
default:
- CError_Error(177);
+ CError_Error(CErrorStr177);
}
}
@@ -3928,7 +3928,7 @@ static void CDecl_ParseClassMembers(DeclE *decle, TypeClass *tclass, short mode)
// this should be 70148 i think
if (tk != ';') {
- CError_Error(123);
+ CError_Error(CErrorStr123);
return;
}
CPrep_TokenStreamFlush();
@@ -3988,18 +3988,18 @@ Boolean CDecl_CheckNewBase(TypeClass *tclass, TypeClass *baseclass, Boolean is_v
ClassList *scan;
if (tclass == baseclass) {
- CError_Error(131);
+ CError_Error(CErrorStr131);
return 0;
}
if (!(baseclass->flags & CLASS_FLAGS_2)) {
- CError_Error(136, baseclass, 0);
+ CError_Error(CErrorStr136, baseclass, 0);
return 0;
}
if (baseclass->flags & CLASS_FLAGS_10) {
if (is_virtual || tclass->bases) {
- CError_Error(191);
+ CError_Error(CErrorStr191);
return 0;
}
tclass->flags |= CLASS_FLAGS_10;
@@ -4007,7 +4007,7 @@ Boolean CDecl_CheckNewBase(TypeClass *tclass, TypeClass *baseclass, Boolean is_v
if (baseclass->flags & CLASS_FLAGS_1) {
if (is_virtual || tclass->bases) {
- CError_Error(191);
+ CError_Error(CErrorStr191);
return 0;
}
tclass->flags |= CLASS_FLAGS_1;
@@ -4015,25 +4015,25 @@ Boolean CDecl_CheckNewBase(TypeClass *tclass, TypeClass *baseclass, Boolean is_v
if (baseclass->sominfo) {
if (!is_virtual)
- CError_Error(268);
+ CError_Error(CErrorStr268);
CSOM_MakeSOMClass(tclass);
} else if (tclass->sominfo) {
- CError_Error(267);
+ CError_Error(CErrorStr267);
}
if (tclass->bases && (tclass->flags & CLASS_FLAGS_10) && (tclass->flags & CLASS_FLAGS_10)) {
- CError_Error(131);
+ CError_Error(CErrorStr131);
return 0;
}
if (copts.ecplusplus && (is_virtual || tclass->bases)) {
- CError_Error(339);
+ CError_Error(CErrorStr339);
return 0;
}
for (scan = tclass->bases; scan; scan = scan->next) {
if (scan->base == baseclass) {
- CError_Error(131);
+ CError_Error(CErrorStr131);
return 0;
}
}
@@ -4091,7 +4091,7 @@ static void CDecl_ParseBaseClassList(TypeClass *tclass, short mode, Boolean is_t
if (tk == TK_VIRTUAL) {
if (is_virtual)
- CError_Error(121);
+ CError_Error(CErrorStr121);
is_virtual = 1;
tk = lex();
}
@@ -4099,11 +4099,11 @@ static void CDecl_ParseBaseClassList(TypeClass *tclass, short mode, Boolean is_t
if (CScope_ParseDeclName(&pr)) {
if (!pr.x8) {
if (!pr.name_4) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
} else if (tk == TK_IDENTIFIER && pr.name_4 == tkidentifier) {
goto special_parsing;
}
- CError_Error(140, tkidentifier->name);
+ CError_Error(CErrorStr140, tkidentifier->name);
continue;
}
@@ -4119,7 +4119,7 @@ static void CDecl_ParseBaseClassList(TypeClass *tclass, short mode, Boolean is_t
}
if (!IS_TYPE_CLASS(pr.x8) || (TYPE_CLASS(pr.x8)->flags & CLASS_FLAGS_100)) {
- CError_Error(131);
+ CError_Error(CErrorStr131);
continue;
}
baseclass = TYPE_CLASS(pr.x8);
@@ -4127,14 +4127,14 @@ static void CDecl_ParseBaseClassList(TypeClass *tclass, short mode, Boolean is_t
special_parsing:
if (!strcmp(tkidentifier->name, "HandleObject")) {
if (tclass->bases)
- CError_Error(191);
+ CError_Error(CErrorStr191);
tclass->flags |= CLASS_FLAGS_10 | CLASS_FLAGS_1;
tk = lex();
break;
}
if (!strcmp(tkidentifier->name, "SingleObject") || !strcmp(tkidentifier->name, "SingleInheritance")) {
if (tclass->bases)
- CError_Error(191);
+ CError_Error(CErrorStr191);
tclass->flags |= CLASS_FLAGS_10;
tk = lex();
break;
@@ -4146,7 +4146,7 @@ static void CDecl_ParseBaseClassList(TypeClass *tclass, short mode, Boolean is_t
}
if (!strcmp(tkidentifier->name, "__somobject")) {
if (!is_virtual)
- CError_Error(268);
+ CError_Error(CErrorStr268);
CSOM_MakeSOMClass(tclass);
tk = lex();
break;
@@ -4157,7 +4157,7 @@ static void CDecl_ParseBaseClassList(TypeClass *tclass, short mode, Boolean is_t
break;
}
- CError_Error(140, tkidentifier->name);
+ CError_Error(CErrorStr140, tkidentifier->name);
continue;
}
@@ -4533,7 +4533,7 @@ static void CDecl_SetupClassLayout(DeclE *decle, TypeClass *tclass, ObjBase **ob
decle->xA = i - 1;
}
} else if (TYPE_FUNC(obj->type)->flags & FUNC_FLAGS_8) {
- CError_Error(351, obj);
+ CError_Error(CErrorStr351, obj);
TYPE_FUNC(obj->type)->flags &= ~FUNC_FLAGS_8;
}
} else {
@@ -4668,11 +4668,11 @@ void CDecl_ParseClassDeclSpec(UInt8 *declspec) {
if (declinfo.exportflags & EXPORT_FLAGS_EXPORT)
*declspec |= CLASS_EFLAGS_EXPORT;
if ((tk = lex()) != ')')
- CError_Error(115);
+ CError_Error(CErrorStr115);
else
tk = lex();
} else {
- CError_Error(114);
+ CError_Error(CErrorStr114);
}
}
@@ -4736,7 +4736,7 @@ void CDecl_ParseClass(DeclInfo *declinfo, short mode, Boolean flag1, UInt8 class
return;
}
if (!IS_TYPE_TEMPLATE(search) || !(tclass = TYPE_CLASS(CTemplTool_GetSelfRefTemplate(search)))) {
- CError_Error(132, classname->name);
+ CError_Error(CErrorStr132, classname->name);
tclass = CDecl_DefineClass(cscope_current, NULL, NULL, mode, 0, 1);
break;
}
@@ -4746,9 +4746,9 @@ void CDecl_ParseClass(DeclInfo *declinfo, short mode, Boolean flag1, UInt8 class
if (tclass->mode != mode) {
if ((mode == CLASS_FLAGS_2 && tclass->mode == CLASS_MODE_0) || (mode == CLASS_MODE_0 && tclass->mode == CLASS_MODE_2)) {
if (copts.warn_structclass)
- CError_Warning(343);
+ CError_Warning(CErrorStr343);
} else {
- CError_Error(132, classname);
+ CError_Error(CErrorStr132, classname);
}
}
tclass->eflags |= class_declspec;
@@ -4763,7 +4763,7 @@ void CDecl_ParseClass(DeclInfo *declinfo, short mode, Boolean flag1, UInt8 class
}
default:
if (!CScope_ParseElaborateName(&pr)) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
declinfo->thetype = (Type *) &stsignedint;
return;
}
@@ -4783,20 +4783,20 @@ void CDecl_ParseClass(DeclInfo *declinfo, short mode, Boolean flag1, UInt8 class
declinfo->thetype = (Type *) tclass;
if (tk == ':' || tk == '{') {
if (declinfo->x4C)
- CError_Error(201);
+ CError_Error(CErrorStr201);
if (tclass->flags & CLASS_FLAGS_2) {
if ((tclass->flags & CLASS_FLAGS_100) && !TEMPL_CLASS(tclass)->instances && !(TEMPL_CLASS(tclass)->flags & TEMPLCLASS_FLAGS_2)) {
tclass = TYPE_CLASS(CDecl_SpecializeTemplateClass(TEMPL_CLASS(tclass)));
} else {
- CError_Error(132, tclass->classname->name);
+ CError_Error(CErrorStr132, tclass->classname->name);
tclass = CDecl_DefineClass(cscope_current, NULL, NULL, mode, 0, 1);
}
}
for (nspace = cscope_current; nspace; nspace = nspace->parent) {
if (nspace == tclass->nspace) {
- CError_Error(132, tclass->classname->name);
+ CError_Error(CErrorStr132, tclass->classname->name);
tclass = CDecl_DefineClass(cscope_current, NULL, NULL, mode, 0, 1);
break;
}
@@ -4833,7 +4833,7 @@ void CDecl_ParseClass(DeclInfo *declinfo, short mode, Boolean flag1, UInt8 class
CBrowse_EndClass(offset, &gl);
}
} else {
- CError_Error(135);
+ CError_Error(CErrorStr135);
}
if (is_templ)
diff --git a/compiler_and_linker/unsorted/CError.c b/compiler_and_linker/unsorted/CError.c
index a7ade45..4c7860d 100644
--- a/compiler_and_linker/unsorted/CError.c
+++ b/compiler_and_linker/unsorted/CError.c
@@ -26,7 +26,7 @@ char cerror_synchdata[32];
short cerror_synchoffset;
int CError_BreakPointcount;
-void CError_Init() {
+void CError_Init(void) {
cerror_errorcount = 0;
cerror_lasterrorline = -1;
cerror_token = 0;
@@ -38,7 +38,7 @@ void CError_SetErrorToken(TStreamElement *token) {
cerror_token = token;
}
-void CError_SetNullErrorToken() {
+void CError_SetNullErrorToken(void) {
cerror_token = (TStreamElement *) -1;
}
@@ -52,7 +52,7 @@ void CError_UnlockErrorPos(TStreamElement **saved) {
cerror_locktoken = *saved;
}
-void CError_ResetErrorSkip() {
+void CError_ResetErrorSkip(void) {
cerror_lasterrorline = -1;
}
@@ -925,7 +925,7 @@ void CError_OverloadedFunctionError2(Object *obj, ObjectList *olst, ENodeList *a
}
current->next = NULL;
- CError_ErrorFuncCall(392, &first, argNodes);
+ CError_ErrorFuncCall(CErrorStr392, &first, argNodes);
}
void CError_OverloadedFunctionError(Object *obj, ObjectList *olst) {
@@ -936,7 +936,7 @@ void CError_OverloadedFunctionError(Object *obj, ObjectList *olst) {
if (trychain)
longjmp(trychain->jmpbuf, 1);
- CError_GetErrorString(string, 199);
+ CError_GetErrorString(string, CErrorStr199);
CError_BufferInit(&eb, buf, sizeof(buf));
CError_BufferAppendString(&eb, string);
@@ -960,9 +960,9 @@ void CError_OverloadedFunctionError(Object *obj, ObjectList *olst) {
void CError_AbstractClassError(TypeClass *tclass) {
Object *result = CClass_CheckPures(tclass);
if (!result)
- CError_Error(372, tclass, 0);
+ CError_Error(CErrorStr372, tclass, 0);
else
- CError_Error(194, result);
+ CError_Error(CErrorStr194, result);
}
void CError_Warning(int code, ...) {
@@ -989,23 +989,23 @@ void CError_Internal(char *filename, int line) {
CError_BreakPoint(0, 0);
}
-void CError_ExpressionTooComplex() {
+void CError_ExpressionTooComplex(void) {
CompilerGetCString(6, string);
CError_ErrorMessage(10002, string, 1, 0);
longjmp(errorreturn, 1);
}
-void CError_NoMem() {
+void CError_NoMem(void) {
cprep_nomem_exit = 1;
longjmp(errorreturn, 1);
}
-void CError_UserBreak() {
+void CError_UserBreak(void) {
CompilerGetCString(8, string);
longjmp(errorreturn, 1);
}
-void CError_CannotOpen() {
+void CError_CannotOpen(void) {
CompilerGetCString(9, string);
CWReportMessage(cparamblkptr->context, NULL, string, NULL, messagetypeError, 0);
longjmp(errorreturn, 1);
diff --git a/compiler_and_linker/unsorted/CExpr.c b/compiler_and_linker/unsorted/CExpr.c
index f305fc9..8deb0ed 100644
--- a/compiler_and_linker/unsorted/CExpr.c
+++ b/compiler_and_linker/unsorted/CExpr.c
@@ -823,11 +823,11 @@ static ENode *CExpr_ParseExplicitConversion(Type *type, UInt32 qual) {
if (tk == '(')
tk = lex();
else
- CError_Error(114);
+ CError_Error(CErrorStr114);
args = CExpr_ScanExpressionList(1);
if (tk != ')') {
- CError_Error(115);
+ CError_Error(CErrorStr115);
return nullnode();
}
@@ -930,7 +930,7 @@ ENode *CExpr_MakeNameLookupResultExpr(CScopeParseResult *pr) {
expr->data.intval = OBJ_ENUM_CONST(pr->obj_10)->val;
return expr;
case OT_MEMBERVAR:
- CError_Error(0xDD);
+ CError_Error(CErrorStr221);
return nullnode();
default:
CError_FATAL(1268);
@@ -1079,19 +1079,19 @@ static ENode *CExpr_ParseNameResultExpr(CScopeParseResult *pr, ENode *expr, Bool
}
if (CClass_IsDestructor(OBJECT(pr->obj_10))) {
if ((tk = lex()) != '(') {
- CError_Error(114);
+ CError_Error(CErrorStr114);
return nullnode();
}
if ((tk = lex()) != ')') {
- CError_Error(115);
+ CError_Error(CErrorStr115);
return nullnode();
}
if (!expr && (!cscope_currentfunc || !cscope_currentclass || !cscope_is_member_func)) {
- CError_Error(221);
+ CError_Error(CErrorStr221);
return nullnode();
}
if (pr->isambig)
- CError_Error(188);
+ CError_Error(CErrorStr188);
if ((expr = CExpr_GetClassAccessNode(pr->bcl_18, NULL, expr, OBJECT(pr->obj_10), pr->obj_10->access, 1))) {
tk = lex();
@@ -1136,7 +1136,7 @@ static ENode *CExpr_ParseNameResultExpr(CScopeParseResult *pr, ENode *expr, Bool
case OT_MEMBERVAR:
if (!flag1 || expr || !pr->x1D) {
if (pr->isambig)
- CError_Error(188);
+ CError_Error(CErrorStr188);
result = checkreference(CExpr_MemberVarAccess(pr->bcl_18, OBJ_MEMBER_VAR(pr->obj_10), expr));
tk = lex();
return result;
@@ -1242,7 +1242,7 @@ static ENode *CExpr_ParseNameResultExpr(CScopeParseResult *pr, ENode *expr, Bool
}
if (copts.require_prototypes)
- CError_Error(178);
+ CError_Error(CErrorStr178);
tfunc = galloc(sizeof(TypeFunc));
memclrw(tfunc, sizeof(TypeFunc));
@@ -1271,7 +1271,7 @@ static ENode *CExpr_ParseRotate(Boolean is_right) {
ENode *expr2;
if (lex() != '(') {
- CError_Error(114);
+ CError_Error(CErrorStr114);
return nullnode();
}
@@ -1279,7 +1279,7 @@ static ENode *CExpr_ParseRotate(Boolean is_right) {
expr1 = assignment_expression();
if (tk != ',') {
- CError_Error(116);
+ CError_Error(CErrorStr116);
return nullnode();
}
@@ -1287,7 +1287,7 @@ static ENode *CExpr_ParseRotate(Boolean is_right) {
expr2 = assignment_expression();
if (tk != ')') {
- CError_Error(115);
+ CError_Error(CErrorStr115);
return nullnode();
}
@@ -1309,22 +1309,22 @@ static ENode *CExpr_ParseNextArg(void) {
SInt32 rounded_size;
if ((tk = lex()) != '(') {
- CError_Error(114);
+ CError_Error(CErrorStr114);
return nullnode();
}
if ((tk = lex()) != TK_IDENTIFIER) {
- CError_Error(0x6B);
+ CError_Error(CErrorStr107);
return nullnode();
}
list = CScope_FindObjectList(&pr, tkidentifier);
if (!list) {
- CError_Error(140, tkidentifier->name);
+ CError_Error(CErrorStr140, tkidentifier->name);
return nullnode();
}
if (list->object->otype != OT_OBJECT || OBJECT(list->object)->datatype != DLOCAL) {
- CError_Error(140, tkidentifier->name);
+ CError_Error(CErrorStr140, tkidentifier->name);
return nullnode();
}
@@ -1334,7 +1334,7 @@ static ENode *CExpr_ParseNextArg(void) {
expr->rtype = TYPE(&void_ptr);
if ((tk = lex()) != ')') {
- CError_Error(115);
+ CError_Error(CErrorStr115);
return expr;
} else {
tk = lex();
@@ -1356,10 +1356,10 @@ static ENode *CExpr_ParseVecStep(void) {
CParser_GetDeclSpecs(&di, 0);
scandeclarator(&di);
if (di.name)
- CError_Error(121);
+ CError_Error(CErrorStr121);
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
@@ -1369,7 +1369,7 @@ static ENode *CExpr_ParseVecStep(void) {
} else {
expr = unary_expression();
if (ENODE_IS(expr, EINDIRECT) && ENODE_IS(expr->data.monadic, EBITFIELD))
- CError_Error(144);
+ CError_Error(CErrorStr144);
type = expr->rtype;
}
@@ -1395,7 +1395,7 @@ static ENode *CExpr_ParseVecStep(void) {
PPCError_Error(104, "vec_step", "vec_step", type, 0);
}
} else {
- CError_Error(114);
+ CError_Error(CErrorStr114);
}
return expr;
@@ -1459,7 +1459,7 @@ static SInt32 CExpr_BuiltInComputeType(Type *type) {
case TYPEFUNC:
return 0x8000;
default:
- CError_Error(146);
+ CError_Error(CErrorStr146);
case TYPEVOID:
return 0;
}
@@ -1506,10 +1506,10 @@ static Type *CExpr_ParseTypeExpression(Boolean *outflag) {
CParser_GetDeclSpecs(&di, 0);
scandeclarator(&di);
if (di.name)
- CError_Error(121);
+ CError_Error(CErrorStr121);
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
@@ -1519,7 +1519,7 @@ static Type *CExpr_ParseTypeExpression(Boolean *outflag) {
} else {
expr = unary_expression();
if (ENODE_IS(expr, EINDIRECT) && ENODE_IS(expr->data.monadic, EBITFIELD))
- CError_Error(144);
+ CError_Error(CErrorStr144);
if (outflag)
*outflag = ENODE_IS(expr, EINTCONST) && CInt64_IsZero(&expr->data.intval);
@@ -1544,7 +1544,7 @@ static ENode *CExpr_ParseBuiltin_isintconst(void) {
tk = lex();
if (tk != '(')
- CError_ErrorSkip(121);
+ CError_ErrorSkip(CErrorStr121);
else
tk = lex();
@@ -1552,7 +1552,7 @@ static ENode *CExpr_ParseBuiltin_isintconst(void) {
CInt64_SetLong(&expr->data.intval, 1);
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
@@ -1645,7 +1645,7 @@ static ENode *primary_expression(Boolean flag) {
tk = lex();
expr = s_expression();
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
if (ENODE_IS(expr, EASS))
@@ -1680,7 +1680,7 @@ static ENode *primary_expression(Boolean flag) {
return nullnode();
}
- CError_ErrorSkip(141);
+ CError_ErrorSkip(CErrorStr141);
return nullnode();
}
@@ -1690,7 +1690,7 @@ static ENode *CExpr_SimpleExplicitConversion(void) {
memclrw(&di, sizeof(DeclInfo));
if (!copts.cpp_extensions && tk != TK_UU_TYPEOF_UU && tk != TK_TYPENAME && lookahead() != '(')
- CError_Error(114);
+ CError_Error(CErrorStr114);
CParser_GetDeclSpecs(&di, 0);
return CExpr_ParseExplicitConversion(di.thetype, di.qual);
@@ -1701,7 +1701,7 @@ static ENode *CExpr_NewPTMFCall(void) {
CExpr_ScanExpressionList(1);
if (tk != ')') {
- CError_Error(115);
+ CError_Error(CErrorStr115);
return nullnode();
} else {
CError_FATAL(2465);
@@ -1721,7 +1721,7 @@ static ENode *call_ptmf(ENode *expr) {
args = CExpr_ScanExpressionList(1);
if (tk != ')') {
- CError_Error(115);
+ CError_Error(CErrorStr115);
return nullnode();
}
@@ -1785,12 +1785,12 @@ loop:
goto loop;
} else {
if (!is_typesame(pr.x8, expr->rtype))
- CError_Error(146);
+ CError_Error(CErrorStr146);
if (tk == TK_COLON_COLON && ((tk = lex()) == '~') && ((tk = lex()) == TK_IDENTIFIER)) {
parse_dtor:
if (CScope_FindTypeName(nspace, tkidentifier, &pr) && !pr.nspace_0) {
if (!is_typesame(pr.x8, expr->rtype))
- CError_Error(146);
+ CError_Error(CErrorStr146);
tk = lex();
goto parsed;
}
@@ -1801,7 +1801,7 @@ loop:
memclrw(&di, sizeof(DeclInfo));
CParser_GetDeclSpecs(&di, 0);
if (di.storageclass || di.qual || !is_typesame(di.thetype, expr->rtype))
- CError_Error(146);
+ CError_Error(CErrorStr146);
if (tk == TK_COLON_COLON && ((tk = lex()) == '~')) {
is_tilde:
if ((tk = lex()) == TK_IDENTIFIER)
@@ -1809,22 +1809,22 @@ loop:
memclrw(&di, sizeof(DeclInfo));
CParser_GetDeclSpecs(&di, 0);
if (di.storageclass || !is_typesame(di.thetype, expr->rtype))
- CError_Error(146);
+ CError_Error(CErrorStr146);
goto parsed;
}
}
- CError_Error(141);
+ CError_Error(CErrorStr141);
return NULL;
parsed:
if (tk == '(') {
if ((tk = lex()) != ')')
- CError_Error(115);
+ CError_Error(CErrorStr115);
else
tk = lex();
} else {
- CError_Error(114);
+ CError_Error(CErrorStr114);
}
expr = makemonadicnode(expr, ETYPCON);
@@ -1900,7 +1900,7 @@ loop:
if (copts.cplusplus && CExpr_CheckOperator('[', expr, subexpr, &conv)) {
if ((expr = conv.x0)) {
if (tk != ']')
- CError_ErrorSkip(125);
+ CError_ErrorSkip(CErrorStr125);
else
tk = lex();
goto loop;
@@ -1915,14 +1915,14 @@ loop:
} else if (IS_TYPE_POINTER(subexpr->rtype)) {
expr = padd(subexpr, expr);
} else {
- CError_Error(148);
+ CError_Error(CErrorStr148);
goto dont_do_indirect;
}
expr = makemonadicnode(expr, EINDIRECT);
expr->rtype = TPTR_TARGET(expr->rtype);
dont_do_indirect:
if (tk != ']')
- CError_ErrorSkip(125);
+ CError_ErrorSkip(CErrorStr125);
else
tk = lex();
goto loop;
@@ -1943,7 +1943,7 @@ loop:
tk = lex();
args = CExpr_ScanExpressionList(1);
if (tk != ')')
- CError_Error(115);
+ CError_Error(CErrorStr115);
if (ENODE_IS(funcexpr, ETEMPLDEP)) {
expr = CExpr_NewENode(EFUNCCALL);
@@ -1968,7 +1968,7 @@ loop:
}
if (!IS_TYPE_POINTER(expr->rtype)) {
- CError_ErrorSkip(148);
+ CError_ErrorSkip(CErrorStr148);
return expr;
}
@@ -1989,20 +1989,20 @@ loop:
return subexpr;
if (!(TYPE_CLASS(expr->rtype)->flags & CLASS_FLAGS_2))
- CError_Error(136, expr->rtype, 0);
+ CError_Error(CErrorStr136, expr->rtype, 0);
if ((tk = lex()) == TK_TEMPLATE && (tk = lex()) != TK_IDENTIFIER)
- CError_Error(107);
+ CError_Error(CErrorStr107);
if (CScope_ParseMemberName(TYPE_CLASS(expr->rtype), &pr, 0)) {
if (pr.x1C) {
if ((tk = lex()) == '(') {
if ((tk = lex()) != ')')
- CError_Error(115);
+ CError_Error(CErrorStr115);
else
tk = lex();
} else {
- CError_Error(114);
+ CError_Error(CErrorStr114);
}
expr = makemonadicnode(expr, ETYPCON);
@@ -2016,7 +2016,7 @@ loop:
if (!IS_TYPE_STRUCT(expr->rtype) || TYPE_STRUCT(expr->rtype)->stype > STRUCT_TYPE_3) {
if (copts.cplusplus && (subexpr = CExpr_DummyDestr(expr)))
return subexpr;
- CError_ErrorSkip(149);
+ CError_ErrorSkip(CErrorStr149);
return expr;
}
if (!ENODE_IS(expr, EINDIRECT)) {
@@ -2036,21 +2036,21 @@ loop:
expr = tmp;
}
if ((tk = lex()) != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return expr;
}
member = ismember(TYPE_STRUCT(expr->rtype), tkidentifier);
if (!member) {
if (!expr->rtype->size)
- CError_Error(136, expr->rtype, 0);
+ CError_Error(CErrorStr136, expr->rtype, 0);
else
- CError_Error(150, tkidentifier->name);
+ CError_Error(CErrorStr150, tkidentifier->name);
return expr;
}
if (!IS_TYPE_POINTER(expr->data.monadic->rtype)) {
- CError_ErrorSkip(149);
+ CError_ErrorSkip(CErrorStr149);
return expr;
}
@@ -2103,7 +2103,7 @@ static ENode *CExpr_ParseSizeof(void) {
type = CExpr_ParseTypeExpression(NULL);
if (IS_TYPE_CLASS(type) && TYPE_CLASS(type)->sominfo)
- CError_Error(286);
+ CError_Error(CErrorStr286);
if (CTemplTool_IsTemplateArgumentDependentType(type)) {
expr = CExpr_NewTemplDepENode(TDE_SIZEOF);
@@ -2116,9 +2116,9 @@ static ENode *CExpr_ParseSizeof(void) {
return intconstnode(CABI_GetSizeTType(), 1);
if (IS_TYPE_CLASS(type) || IS_TYPE_STRUCT(type))
- CError_Error(136, type, 0);
+ CError_Error(CErrorStr136, type, 0);
else
- CError_Error(146);
+ CError_Error(CErrorStr146);
}
return intconstnode(CABI_GetSizeTType(), type->size);
@@ -2129,7 +2129,7 @@ SInt32 scansizeof(void) {
expr = CExpr_ParseSizeof();
if (!ENODE_IS(expr, EINTCONST)) {
- CError_Error(190);
+ CError_Error(CErrorStr190);
return 0;
}
@@ -2143,7 +2143,7 @@ static ENode *CExpr_ParseAlignof(void) {
type = CExpr_ParseTypeExpression(NULL);
if (IS_TYPE_CLASS(type) && TYPE_CLASS(type)->sominfo)
- CError_Error(364);
+ CError_Error(CErrorStr364);
if (CTemplTool_IsTemplateArgumentDependentType(type)) {
expr = CExpr_NewTemplDepENode(TDE_ALIGNOF);
@@ -2153,9 +2153,9 @@ static ENode *CExpr_ParseAlignof(void) {
if (type->size == 0) {
if (IS_TYPE_CLASS(type) || IS_TYPE_STRUCT(type))
- CError_Error(136, type, 0);
+ CError_Error(CErrorStr136, type, 0);
else
- CError_Error(146);
+ CError_Error(CErrorStr146);
}
align = CMach_GetTypeAlign(type);
@@ -2170,7 +2170,7 @@ SInt32 scanalignof(void) {
expr = CExpr_ParseAlignof();
if (!ENODE_IS(expr, EINTCONST)) {
- CError_Error(190);
+ CError_Error(CErrorStr190);
return 0;
}
@@ -2193,7 +2193,7 @@ ENode *getnodeaddress(ENode *expr, Boolean flag) {
expr = CExpr_LValue(expr, flag, flag);
if (!ENODE_IS(expr, EINDIRECT)) {
if (!flag)
- CError_Error(142);
+ CError_Error(CErrorStr142);
return nullnode();
}
} else {
@@ -2203,7 +2203,7 @@ ENode *getnodeaddress(ENode *expr, Boolean flag) {
cscope_currentfunc &&
cscope_currentclass &&
expr->data.monadic->data.objref == CClass_ThisSelfObject())
- CError_Error(189);
+ CError_Error(CErrorStr189);
}
result = lalloc(sizeof(ENode));
@@ -2226,17 +2226,17 @@ restart:
goto restart;
}
if (obj->datatype == DINLINEFUNC)
- CError_Error(175);
+ CError_Error(CErrorStr175);
obj->flags |= OBJECT_FLAGS_2;
if (flag && !copts.cplusplus && obj->sclass == TK_REGISTER)
- CError_Error(163);
+ CError_Error(CErrorStr163);
break;
case EFUNCCALL:
if (flag && !IS_TYPE_POINTER_ONLY(result->data.monadic->data.funccall.functype->functype))
- CError_Warning(142);
+ CError_Warning(CErrorStr142);
break;
case EBITFIELD:
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
@@ -2270,7 +2270,7 @@ static ENode *CExpr_MakeStaticMemberList(NameSpaceObjectList *list) {
}
if (!newlist) {
- CError_Warning(331);
+ CError_Warning(CErrorStr331);
return nullnode();
}
@@ -2303,12 +2303,12 @@ ENode *getpointertomemberfunc(ENode *expr, Type *type, Boolean flag) {
CError_ASSERT(3442, ENODE_IS(expr, EMEMBER));
if (expr->data.emember->expr && !copts.cpp_extensions)
- CError_Error(141);
+ CError_Error(CErrorStr141);
if (!copts.cpp_extensions) {
if (!(expr->data.emember->x11 && expr->data.emember->pr_1D)) {
if (type && IS_TYPE_MEMBERPOINTER(type))
- CError_Warning(331);
+ CError_Warning(CErrorStr331);
}
}
@@ -2323,7 +2323,7 @@ ENode *getpointertomemberfunc(ENode *expr, Type *type, Boolean flag) {
}
}
if (!list) {
- CError_Error(146);
+ CError_Error(CErrorStr146);
return nullnode();
}
} else {
@@ -2342,7 +2342,7 @@ ENode *getpointertomemberfunc(ENode *expr, Type *type, Boolean flag) {
CError_ASSERT(3503, obj->otype == OT_OBJECT && IS_TYPE_NONSTATIC_METHOD(obj->type));
if (TYPE_FUNC(obj->type)->flags & FUNC_FLAGS_100000)
- CError_Error(190);
+ CError_Error(CErrorStr190);
ptmtype = CExpr_NewPTMType(expr->data.emember, obj);
tmethod = TYPE_METHOD(obj->type);
@@ -2377,7 +2377,7 @@ static ENode *getpointertomember(ENode *expr) {
CError_ASSERT(3554, ENODE_IS(expr, EMEMBER));
if (expr->data.emember->expr)
- CError_Error(141);
+ CError_Error(CErrorStr141);
expr->data.emember->x11 = 1;
if (!expr->data.emember->list->next) {
@@ -2417,7 +2417,7 @@ ENode *CExpr_New_ELOGNOT_Node(ENode *input) {
expr = CExpr_ConvertToCondition(expr);
break;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
return expr;
}
@@ -2466,7 +2466,7 @@ ENode *CExpr_New_EMONMIN_Node(ENode *input) {
}
return CExpr_UnaryFloatExpression(makemonadicnode(expr, EMONMIN));
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
return expr;
}
}
@@ -2599,7 +2599,7 @@ ENode *unary_expression(void) {
}
if (!IS_TYPE_POINTER(expr->rtype)) {
- CError_Error(148);
+ CError_Error(CErrorStr148);
return expr;
}
@@ -2625,7 +2625,7 @@ ENode *unary_expression(void) {
case TYPEARRAY:
return expr;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
return expr;
}
@@ -2649,7 +2649,7 @@ ENode *unary_expression(void) {
break;
if ((tk = lex()) != TK_IDENTIFIER) {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return nullnode();
}
@@ -2730,7 +2730,7 @@ ENode *PointerToMemberCast(ENode *expr, TypeMemberPointer *tm1, TypeMemberPointe
}
if (isambig)
- CError_Error(188);
+ CError_Error(CErrorStr188);
if ((pathoffset = CClass_GetPathOffset(path)) < 0)
goto failed;
@@ -2742,7 +2742,7 @@ ENode *PointerToMemberCast(ENode *expr, TypeMemberPointer *tm1, TypeMemberPointe
if (tm1->size != tm2->size) {
failed:
- CError_Error(247, tm1, 0, tm2, 0);
+ CError_Error(CErrorStr247, tm1, 0, tm2, 0);
return nullnode();
}
@@ -2794,7 +2794,7 @@ static ENode *CExpr_MemberPointerCast(ENode *expr, TypeMemberPointer *type, UInt
expr = CExpr_MemberPointerConversion(expr, type, 1);
if (!IS_TYPE_MEMBERPOINTER(expr->rtype)) {
- CError_Error(164);
+ CError_Error(CErrorStr164);
return nullnode();
}
@@ -2820,7 +2820,7 @@ ENode *do_typecast(ENode *expr, Type *type, UInt32 qual) {
switch (type->type) {
case TYPEARRAY:
- CError_Error(247, expr->rtype, ENODE_QUALS(expr), type, qual);
+ CError_Error(CErrorStr247, expr->rtype, ENODE_QUALS(expr), type, qual);
return expr;
case TYPEMEMBERPOINTER:
if (!IS_TYPE_CLASS(expr->rtype))
@@ -2833,7 +2833,7 @@ ENode *do_typecast(ENode *expr, Type *type, UInt32 qual) {
return CExpr_AssignmentPromotion(expr, type, flags, 1);
if (ENODE_IS(expr, EOBJREF) && IS_TYPE_NONSTATIC_METHOD(expr->data.objref->type)) {
- CError_Error(221);
+ CError_Error(CErrorStr221);
return nullnode();
}
@@ -2869,7 +2869,7 @@ ENode *do_typecast(ENode *expr, Type *type, UInt32 qual) {
return assign_node;
}
- CError_Error(247, expr->rtype, ENODE_QUALS(expr), type, qual);
+ CError_Error(CErrorStr247, expr->rtype, ENODE_QUALS(expr), type, qual);
return nullnode();
}
@@ -2913,7 +2913,7 @@ ENode *do_typecast(ENode *expr, Type *type, UInt32 qual) {
}
if (!(IS_TYPE_POINTER_ONLY(expr->rtype) && !IS_TYPE_FLOAT(type)))
- CError_Error(247, expr->rtype, ENODE_QUALS(expr), type, qual);
+ CError_Error(CErrorStr247, expr->rtype, ENODE_QUALS(expr), type, qual);
if (ENODE_IS(expr, ETYPCON) && ENODE_IS(tmp = expr->data.monadic, EINTCONST)) {
tmp->rtype = type;
@@ -2948,7 +2948,7 @@ ENode *do_typecast(ENode *expr, Type *type, UInt32 qual) {
if (!IS_TYPE_INT(expr->rtype)) {
if (!IS_TYPE_ENUM(expr->rtype)) {
- CError_Error(247, expr->rtype, ENODE_QUALS(expr), type, qual);
+ CError_Error(CErrorStr247, expr->rtype, ENODE_QUALS(expr), type, qual);
return expr;
}
expr = forceintegral(expr);
@@ -2969,7 +2969,7 @@ ENode *do_typecast(ENode *expr, Type *type, UInt32 qual) {
if ((tmp = CodeGen_HandleTypeCast(expr, type, qual)))
return tmp;
- CError_Error(247, expr->rtype, ENODE_QUALS(expr), type, qual);
+ CError_Error(CErrorStr247, expr->rtype, ENODE_QUALS(expr), type, qual);
return nullnode();
}
@@ -2996,18 +2996,18 @@ ENode *cast_expression(void) {
scandeclarator(&di);
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
if (di.name)
- CError_Error(164);
+ CError_Error(CErrorStr164);
if (copts.altivec_model && tk == '(' && IS_TYPE_VECTOR(di.thetype)) {
tk = lex();
expr = s_expression();
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
@@ -3067,7 +3067,7 @@ restart:
}
if (!IS_TYPE_POINTER(left->rtype)) {
- CError_Error(148);
+ CError_Error(CErrorStr148);
return left;
}
@@ -3079,16 +3079,16 @@ restart:
tk = lex();
right = pointer_generation(cast_expression());
if (!ENODE_IS(left, EINDIRECT)) {
- CError_Error(142);
+ CError_Error(CErrorStr142);
return left;
}
common_part:
if (!IS_TYPE_CLASS(left->rtype)) {
- CError_Error(149);
+ CError_Error(CErrorStr149);
return left;
}
if (!IS_TYPE_MEMBERPOINTER(right->rtype)) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return left;
}
if (left->rtype != TYPE_MEMBER_POINTER(right->rtype)->ty2) {
@@ -3100,7 +3100,7 @@ restart:
0, 1, 1);
left->rtype = TYPE_MEMBER_POINTER(right->rtype)->ty2;
} else {
- CError_Error(146);
+ CError_Error(CErrorStr146);
return left;
}
}
@@ -3212,7 +3212,7 @@ ENode *CExpr_New_EMODULO_Node(ENode *left, ENode *right, Boolean no_warning) {
if (iszero(right)) {
if (!no_warning)
- CError_Warning(139);
+ CError_Warning(CErrorStr139);
return left;
}
@@ -3346,34 +3346,34 @@ static ENode *pointercompare(ENodeType nt, ENode *left, ENode *right) {
} else if (CClass_IsBaseClass(TYPE_CLASS(rtype), TYPE_CLASS(ltype), NULL, 0, 1)) {
right = CExpr_SafeClassPointerCast(right, TYPE_CLASS(rtype), TYPE_CLASS(ltype), 0, 1);
} else {
- CError_Error(245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
+ CError_Error(CErrorStr245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
}
} else {
- CError_Error(245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
+ CError_Error(CErrorStr245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
}
}
} else if (!is_typeequal(left->rtype, right->rtype)) {
if (!copts.objective_c || !CObjC_IsCompatibleType(left->rtype, right->rtype)) {
- CError_Error(245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
+ CError_Error(CErrorStr245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
}
}
} else if (nt == EEQU || nt == ENOTEQU) {
if (IS_TYPE_INT(ltype)) {
if (!(ENODE_IS(left, EINTCONST) && CInt64_IsZero(&left->data.intval)))
- CError_Error(144);
+ CError_Error(CErrorStr144);
CError_ASSERT(4847, IS_TYPE_POINTER_ONLY(rtype));
left->rtype = TYPE(&stunsignedlong);
} else if (IS_TYPE_INT(rtype)) {
if (!(ENODE_IS(right, EINTCONST) && CInt64_IsZero(&right->data.intval)))
- CError_Error(144);
+ CError_Error(CErrorStr144);
CError_ASSERT(4855, IS_TYPE_POINTER_ONLY(ltype));
right->rtype = TYPE(&stunsignedlong);
} else if (!is_typeequal(ltype, rtype)) {
- CError_Error(245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
+ CError_Error(CErrorStr245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
}
} else {
if (!is_typeequal(ltype, rtype))
- CError_Error(245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
+ CError_Error(CErrorStr245, left->rtype, ENODE_QUALS(left), right->rtype, ENODE_QUALS(right));
}
return logicalexpression(makediadicnode(left, right, nt));
@@ -3538,12 +3538,12 @@ ENode *memberpointercompare(ENodeType nt, ENode *left, ENode *right) {
if (!IS_TYPE_MEMBERPOINTER(left->rtype)) {
if (!(IS_TYPE_INT(left->rtype) && ENODE_IS(left, EINTCONST) && CInt64_IsZero(&left->data.intval))) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
} else if (!IS_TYPE_MEMBERPOINTER(right->rtype)) {
if (!(IS_TYPE_INT(right->rtype) && ENODE_IS(right, EINTCONST) && CInt64_IsZero(&right->data.intval))) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
} else if (!is_typeequal(left->rtype, right->rtype)) {
@@ -3788,7 +3788,7 @@ ENode *CExpr_New_ELAND_Node(ENode *left, ENode *right) {
left = CExpr_ConvertToCondition(left);
break;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
left = nullnode();
}
switch (right->rtype->type) {
@@ -3802,7 +3802,7 @@ ENode *CExpr_New_ELAND_Node(ENode *left, ENode *right) {
right = CExpr_ConvertToCondition(right);
break;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
right = nullnode();
}
@@ -3873,7 +3873,7 @@ ENode *CExpr_New_ELOR_Node(ENode *left, ENode *right) {
left = CExpr_ConvertToCondition(left);
break;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
left = nullnode();
}
switch (right->rtype->type) {
@@ -3887,7 +3887,7 @@ ENode *CExpr_New_ELOR_Node(ENode *left, ENode *right) {
right = CExpr_ConvertToCondition(right);
break;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
right = nullnode();
}
@@ -4134,7 +4134,7 @@ ENode *CExpr_New_ECOND_Node(ENode *cond, ENode *expr1, ENode *expr2) {
expr2 = pointer_generation(expr2);
if (!IS_TYPE_INT_OR_FLOAT(cond->rtype) && !IS_TYPE_POINTER_ONLY(cond->rtype)) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
@@ -4197,7 +4197,7 @@ ENode *CExpr_New_ECOND_Node(ENode *cond, ENode *expr1, ENode *expr2) {
expr2 = conv.right;
} else if (CExpr_CanImplicitlyConvert(expr1, expr2->rtype, ENODE_QUALS(expr2))) {
if (CExpr_CanImplicitlyConvert(expr2, expr1->rtype, ENODE_QUALS(expr1)))
- CError_Error(188);
+ CError_Error(CErrorStr188);
expr1 = CExpr_Convert(expr1, expr2->rtype, ENODE_QUALS(expr2), 0, 1);
} else if (CExpr_CanImplicitlyConvert(expr2, expr1->rtype, ENODE_QUALS(expr1))) {
expr2 = CExpr_Convert(expr2, expr1->rtype, ENODE_QUALS(expr1), 0, 1);
@@ -4295,7 +4295,7 @@ ENode *CExpr_New_ECOND_Node(ENode *cond, ENode *expr1, ENode *expr2) {
expr2 = CExpr_Convert(expr2, expr1->rtype, ENODE_QUALS(expr1), 0, 1);
} else if (CExpr_CanImplicitlyConvert(expr1, expr2->rtype, ENODE_QUALS(expr2))) {
if (CExpr_CanImplicitlyConvert(expr2, expr1->rtype, ENODE_QUALS(expr1)))
- CError_Error(188);
+ CError_Error(CErrorStr188);
expr1 = CExpr_Convert(expr1, expr2->rtype, ENODE_QUALS(expr2), 0, 1);
} else if (CExpr_CanImplicitlyConvert(expr2, expr1->rtype, ENODE_QUALS(expr1))) {
expr2 = CExpr_Convert(expr2, expr1->rtype, ENODE_QUALS(expr1), 0, 1);
@@ -4306,7 +4306,7 @@ ENode *CExpr_New_ECOND_Node(ENode *cond, ENode *expr1, ENode *expr2) {
break;
default:
failed:
- CError_Error(245, expr1->rtype, ENODE_QUALS(expr1), expr2->rtype, ENODE_QUALS(expr2));
+ CError_Error(CErrorStr245, expr1->rtype, ENODE_QUALS(expr1), expr2->rtype, ENODE_QUALS(expr2));
return nullnode();
}
@@ -4335,7 +4335,7 @@ static ENode *conditional_expression(void) {
if (!IS_TYPE_TEMPLDEPEXPR(cond->rtype)) {
cond = CExpr_ConvertToCondition(cond);
if (!IS_TYPE_INT_OR_FLOAT(cond->rtype) && !IS_TYPE_POINTER_ONLY(cond->rtype)) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
} else {
@@ -4345,7 +4345,7 @@ static ENode *conditional_expression(void) {
tk = lex();
expr1 = expression();
if (tk != ':')
- CError_ErrorSkip(141);
+ CError_ErrorSkip(CErrorStr141);
else
tk = lex();
@@ -4408,7 +4408,7 @@ static ENode *makeassignmentnode(ENode *left, ENodeType nt, short token) {
return conv.x0;
}
if (IS_TYPE_CLASS(left->rtype) && CClass_AssignmentOperator(TYPE_CLASS(left->rtype)))
- CError_Error(144);
+ CError_Error(CErrorStr144);
}
continue_anyway:
if (IS_TYPE_ARRAY(left->rtype)) {
@@ -4417,7 +4417,7 @@ continue_anyway:
tmp->flags = left->flags;
return tmp;
}
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
@@ -4425,19 +4425,19 @@ continue_anyway:
if (nt != EASS) {
if (!IS_TYPE_INT(right->rtype)) {
if (!IS_TYPE_ENUM(right->rtype)) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return left;
}
right = forceintegral(right);
}
if (!IS_TYPE_INT(left->rtype)) {
if (copts.cplusplus) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return left;
}
left = forceintegral(left);
if (!IS_TYPE_INT(left->rtype)) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return left;
}
}
@@ -4445,7 +4445,7 @@ continue_anyway:
}
if (IS_TYPE_CLASS(left->rtype) && TYPE_CLASS(left->rtype)->sominfo) {
- CError_Error(285);
+ CError_Error(CErrorStr285);
return left;
}
@@ -4515,7 +4515,7 @@ static ENode *makepassignmentnode(ENode *left, ENodeType nt, short token) {
}
if (is_array)
- CError_Error(144);
+ CError_Error(CErrorStr144);
switch (left->rtype->type) {
case TYPEINT:
@@ -4524,13 +4524,13 @@ static ENode *makepassignmentnode(ENode *left, ENodeType nt, short token) {
break;
case TYPEENUM:
if (copts.cplusplus) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return left;
}
left = forceintegral(left);
break;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
return left;
}
@@ -4554,7 +4554,7 @@ static ENode *makepassignmentnode(ENode *left, ENodeType nt, short token) {
return left;
}
}
- CError_Error(144);
+ CError_Error(CErrorStr144);
return left;
} else {
return CExpr_MakeOpAssNode(left, right, nt);
@@ -4576,7 +4576,7 @@ static ENode *makemulassignmentnode(ENode *left, ENodeType nt, short token) {
return conv.x0;
}
if (!IS_TYPE_INT(left->rtype) && !(IS_TYPE_FLOAT(left->rtype) && nt != EMODASS)) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
left = CExpr_LValue(left, 1, 1);
@@ -4584,7 +4584,7 @@ static ENode *makemulassignmentnode(ENode *left, ENodeType nt, short token) {
if (IS_TYPE_ENUM(left->rtype))
left = forceintegral(left);
if (!IS_TYPE_INT(left->rtype) && !(IS_TYPE_FLOAT(left->rtype) && nt != EMODASS)) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
@@ -4594,13 +4594,13 @@ static ENode *makemulassignmentnode(ENode *left, ENodeType nt, short token) {
}
if (is_array)
- CError_Error(144);
+ CError_Error(CErrorStr144);
if (IS_TYPE_ENUM(right->rtype))
right = forceintegral(right);
if (IS_TYPE_INT(left->rtype) && IS_TYPE_FLOAT(right->rtype) && nt == EMODASS) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
}
@@ -4655,7 +4655,7 @@ ENode *assignment_expression(void) {
expr = makemulassignmentnode(expr, EDIVASS, tk);
if (ENODE_IS(expr, EDIVASS)) {
if (iszero(expr->data.diadic.right) && !IS_TYPE_FLOAT(expr->rtype)) {
- CError_Warning(139);
+ CError_Warning(CErrorStr139);
return expr->data.diadic.left;
}
if (CExpr_IsOne(expr->data.diadic.right))
@@ -4666,7 +4666,7 @@ ENode *assignment_expression(void) {
expr = makemulassignmentnode(expr, EMODASS, tk);
if (ENODE_IS(expr, EMODASS)) {
if (iszero(expr->data.diadic.right)) {
- CError_Warning(139);
+ CError_Warning(CErrorStr139);
return expr->data.diadic.left;
}
}
@@ -4798,14 +4798,14 @@ void CExpr_CheckUnusedExpression(ENode *expr) {
while (ENODE_IS(scan, ETYPCON))
scan = scan->data.monadic;
if (ENODE_IS(scan, EEQU)) {
- CError_Warning(208);
+ CError_Warning(CErrorStr208);
return;
}
}
if (copts.warn_no_side_effect) {
if (!CExpr_HasSideEffect(expr)) {
- CError_Warning(369);
+ CError_Warning(CErrorStr369);
return;
}
}
@@ -4837,7 +4837,7 @@ void CExpr_CheckUnusedExpression(ENode *expr) {
if (!ENODE_IS(arg->node, ETEMP))
return;
}
- CError_Warning(370);
+ CError_Warning(CErrorStr370);
}
}
}
@@ -4884,7 +4884,7 @@ CInt64 CExpr_IntegralConstExprType(Type **tint) {
}
}
- CError_Error(124);
+ CError_Error(CErrorStr124);
*tint = TYPE(&stchar);
return cint64_zero;
}
@@ -4908,7 +4908,7 @@ ENode *CExpr_IntegralConstOrDepExpr(void) {
if (CTemplTool_IsTemplateArgumentDependentExpression(expr))
return expr;
- CError_Error(124);
+ CError_Error(CErrorStr124);
expr = nullnode();
expr->rtype = TYPE(&stchar);
return expr;
@@ -4922,7 +4922,7 @@ CInt64 CExpr_IntegralConstExpr(void) {
void CExpr_CheckUnwantedAssignment(ENode *expr) {
if (copts.warn_possunwant) {
if (ENODE_IS(expr, EASS) && !(expr->flags & ENODE_FLAG_80))
- CError_Warning(207);
+ CError_Warning(CErrorStr207);
}
}
@@ -4953,7 +4953,7 @@ Boolean CExpr_ParseAsmExpr(Object **objptr, CInt64 *valptr) {
case EMEMBER:
if (expr->data.emember->list->object->otype == OT_OBJECT) {
if (expr->data.emember->list->next && expr->data.emember->list->next->object->otype == OT_OBJECT)
- CError_Error(199);
+ CError_Error(CErrorStr199);
*objptr = OBJECT(expr->data.emember->list->object);
while ((*objptr)->datatype == DALIAS)
*objptr = (*objptr)->u.alias.object;
@@ -4961,11 +4961,11 @@ Boolean CExpr_ParseAsmExpr(Object **objptr, CInt64 *valptr) {
}
break;
case EOBJLIST:
- CError_Error(199);
+ CError_Error(CErrorStr199);
return 0;
}
}
- CError_Error(155);
+ CError_Error(CErrorStr155);
return 0;
}
diff --git a/compiler_and_linker/unsorted/CExpr2.c b/compiler_and_linker/unsorted/CExpr2.c
index e2284d7..609cd43 100644
--- a/compiler_and_linker/unsorted/CExpr2.c
+++ b/compiler_and_linker/unsorted/CExpr2.c
@@ -389,7 +389,7 @@ ENode *stringconstnode(char *str) {
ENode *forceintegral(ENode *expr) {
if (!IS_TYPE_ENUM(expr->rtype)) {
- CError_Error(144);
+ CError_Error(CErrorStr144);
return nullnode();
} else {
expr->rtype = TYPE_ENUM(expr->rtype)->enumtype;
@@ -631,7 +631,7 @@ void CExpr_ArithmeticConversion(ENode **left, ENode **right) {
(*left)->rtype = TYPE_ENUM((*left)->rtype)->enumtype;
break;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
(*left) = nullnode();
}
@@ -643,7 +643,7 @@ void CExpr_ArithmeticConversion(ENode **left, ENode **right) {
(*right)->rtype = TYPE_ENUM((*right)->rtype)->enumtype;
break;
default:
- CError_Error(144);
+ CError_Error(CErrorStr144);
(*right) = nullnode();
}
@@ -741,7 +741,7 @@ ENode *CExpr_TempModifyExpr(ENode *expr) {
tempnode = CExpr_NewETEMPNode(type, 1);
eanode = CExpr_GetEA(expr);
if (!eanode) {
- CError_Error(142);
+ CError_Error(CErrorStr142);
return expr;
}
@@ -840,7 +840,7 @@ loop:
case EINDIRECT:
if (flag2) {
if (!CExpr_IsLValue(expr))
- CError_Warning(142);
+ CError_Warning(CErrorStr142);
if (
ENODE_IS(expr->data.monadic, EOBJREF) &&
@@ -848,11 +848,11 @@ loop:
cscope_currentfunc &&
cscope_currentclass &&
expr->data.monadic->data.objref == CClass_ThisSelfObject())
- CError_Error(189);
+ CError_Error(CErrorStr189);
}
if (flag1) {
if (CParser_IsConst(expr->rtype, expr->flags & ENODE_FLAG_QUALS))
- CError_Error(179);
+ CError_Error(CErrorStr179);
}
return expr;
case EPREINC:
@@ -877,7 +877,7 @@ loop:
tmpnode->rtype = expr->rtype;
return tmpnode;
}
- CError_Error(190);
+ CError_Error(CErrorStr190);
return expr;
}
break;
@@ -904,7 +904,7 @@ loop:
}
if (flag2)
- CError_Error(142);
+ CError_Error(CErrorStr142);
return expr;
}
@@ -912,7 +912,7 @@ ENode *CExpr_MakeObjRefNode(Object *obj, Boolean flag) {
ENode *expr;
if (obj->sclass == TK_TYPEDEF) {
- CError_Error(141);
+ CError_Error(CErrorStr141);
return intconstnode((Type *) &void_ptr, 0);
}
@@ -925,7 +925,7 @@ ENode *CExpr_MakeObjRefNode(Object *obj, Boolean flag) {
if (!IS_TYPE_FUNC(obj->type))
expr->flags = obj->qual & ENODE_FLAG_QUALS;
if (flag)
- obj->flags |= OBJECT_FLAGS_UNUSED;
+ obj->flags |= OBJECT_FLAGS_1;
return expr;
}
@@ -995,7 +995,7 @@ ENode *CExpr_AdjustFunctionCall(ENode *expr) {
CDecl_CompleteType(expr->data.funccall.functype->functype);
case TYPESTRUCT:
if (!expr->data.funccall.functype->functype->size)
- CError_Error(136, expr->data.funccall.functype->functype, 0);
+ CError_Error(CErrorStr136, expr->data.funccall.functype->functype, 0);
}
if (CMach_GetFunctionResultClass(expr->data.funccall.functype)) {
@@ -1429,7 +1429,7 @@ static short std_assign_check_overload(NameSpaceObjectList *list, TemplArg *temp
assign_node = expr;
expr->rtype = CDecl_NewPointerType(used_obj->type);
expr->flags = obj->qual & ENODE_FLAG_QUALS;
- used_obj->flags |= OBJECT_FLAGS_UNUSED;
+ used_obj->flags |= OBJECT_FLAGS_1;
if (used_obj->datatype == DINLINEFUNC)
CError_Error(CErrorStr175);
}
@@ -1957,7 +1957,7 @@ short user_assign_check(ENode *expr, Type *type, UInt32 qual, Boolean flag1, Boo
r13 = TYPE_METHOD(r26->type);
CError_ASSERT(2537, r13->flags & FUNC_FLAGS_METHOD);
r15b = create_objectrefnode(r26);
- r26->flags |= OBJECT_FLAGS_UNUSED;
+ r26->flags |= OBJECT_FLAGS_1;
r14d = lalloc(sizeof(ENodeList));
r14d->next = NULL;
expr = getnodeaddress(expr, 0);
@@ -2023,7 +2023,7 @@ ENode *CExpr_ConvertToCondition(ENode *expr) {
case TYPECLASS:
return CExpr_Convert(expr, TYPE(&stbool), 0, 0, 1);
default:
- CError_Error(376, expr->rtype, expr->flags & ENODE_FLAG_QUALS);
+ CError_Error(CErrorStr376, expr->rtype, expr->flags & ENODE_FLAG_QUALS);
return nullnode();
}
}
@@ -2457,7 +2457,7 @@ static ENode *CExpr_GenericCall(ENode *funcexpr, ENodeList *argexprs, TypeFunc *
callexpr->data.funccall.funcref->rtype = CDecl_NewPointerType(TYPE(tfunc));
callexpr->data.funccall.args = argexprs;
callexpr->data.funccall.functype = tfunc;
- funcexpr->data.objref->flags |= OBJECT_FLAGS_UNUSED;
+ funcexpr->data.objref->flags |= OBJECT_FLAGS_1;
return CExpr_AdjustFunctionCall(callexpr);
}
@@ -3413,7 +3413,7 @@ ENode *CExpr_ConstructObject(TypeClass *tclass, ENode *addr_expr, ENodeList *arg
CExpr_AssignmentPromotion(args->node, TYPE(tclass), 0, 1),
EASS);
}
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
return addr_expr;
}
@@ -3430,7 +3430,7 @@ static ENode *CExpr_DeleteFuncCall(Object *obj, ENode *arg, Type *type, Boolean
expr->rtype = &stvoid;
expr->data.funccall.funcref = create_objectrefnode(obj);
expr->data.funccall.functype = TYPE_FUNC(obj->type);
- obj->flags |= OBJECT_FLAGS_UNUSED;
+ obj->flags |= OBJECT_FLAGS_1;
list = lalloc(sizeof(ENodeList));
list->node = arg;
@@ -3504,7 +3504,7 @@ static ENode *CExpr_PlacementDeleteCall(Type *type, ENode *expr, Object *obj, Bo
result->rtype = &stvoid;
result->data.funccall.funcref = create_objectrefnode(funcobj);
result->data.funccall.functype = TYPE_FUNC(funcobj->type);
- funcobj->flags |= OBJECT_FLAGS_UNUSED;
+ funcobj->flags |= OBJECT_FLAGS_1;
list = lalloc(sizeof(ENodeList));
list->node = create_objectnode(obj);
@@ -3784,7 +3784,7 @@ static ENode *CExpr_NewArray(Type *type, UInt32 qual, ENodeList *nodelist, Boole
if (CClass_Constructor(TYPE_CLASS(innertype))) {
ctor = CClass_DefaultConstructor(TYPE_CLASS(innertype));
if (ctor) {
- ctor->flags |= OBJECT_FLAGS_UNUSED;
+ ctor->flags |= OBJECT_FLAGS_1;
} else {
ctor = CClass_DummyDefaultConstructor(TYPE_CLASS(innertype));
if (!ctor)
@@ -4187,7 +4187,7 @@ ENode *scandelete(Boolean flag) {
result_expr = CABI_DestroyObject(dtor, expr, 2, 0, 0);
result_expr->rtype = TYPE(&void_ptr);
result_expr = funccallexpr(obj, result_expr, NULL, NULL, NULL);
- obj->flags |= OBJECT_FLAGS_UNUSED;
+ obj->flags |= OBJECT_FLAGS_1;
}
if (is_virtual) {
diff --git a/compiler_and_linker/unsorted/CExprConvMatch.c b/compiler_and_linker/unsorted/CExprConvMatch.c
index 7fdce02..24afb62 100644
--- a/compiler_and_linker/unsorted/CExprConvMatch.c
+++ b/compiler_and_linker/unsorted/CExprConvMatch.c
@@ -567,7 +567,7 @@ static Boolean CExpr_OverloadFuncMatch(NameSpaceObjectList *list, TemplArg *temp
*outExpr = expr;
expr->rtype = CDecl_NewPointerType(object26->type);
expr->flags = object->qual & ENODE_FLAG_QUALS;
- object26->flags |= OBJECT_FLAGS_UNUSED;
+ object26->flags |= OBJECT_FLAGS_1;
if (object26->datatype == DINLINEFUNC)
CError_Error(CErrorStr175);
}
@@ -1086,7 +1086,7 @@ static ENode *CExpr_UserConversion(ENode *expr, Type *type2, UInt32 qual2, Impli
CError_ASSERT(1416, IS_TYPEFUNC_METHOD(tfunc23));
funcref = create_objectrefnode(object28);
- object28->flags |= OBJECT_FLAGS_UNUSED;
+ object28->flags |= OBJECT_FLAGS_1;
arglist = lalloc(sizeof(ENodeList));
arglist->next = NULL;
diff --git a/compiler_and_linker/unsorted/CFunc.c b/compiler_and_linker/unsorted/CFunc.c
index 94a2c9e..2e10bad 100644
--- a/compiler_and_linker/unsorted/CFunc.c
+++ b/compiler_and_linker/unsorted/CFunc.c
@@ -601,7 +601,7 @@ void CFunc_WarnUnused(void) {
ObjectList *list;
for (list = locals; list; list = list->next) {
if (
- !(list->object->flags & OBJECT_FLAGS_UNUSED) &&
+ !(list->object->flags & OBJECT_FLAGS_1) &&
!IsTempName(list->object->name) &&
!(list->object->qual & Q_10000)
)
@@ -616,7 +616,7 @@ void CFunc_WarnUnused(void) {
ObjectList *list;
for (list = arguments; list; list = list->next) {
if (
- !(list->object->flags & OBJECT_FLAGS_UNUSED) &&
+ !(list->object->flags & OBJECT_FLAGS_1) &&
!IsTempName(list->object->name) &&
list->object->name != this_name_node &&
list->object->name != self_name_node
@@ -3035,11 +3035,11 @@ void CFunc_ParseFuncDef(Object *func, DeclInfo *di, TypeClass *tclass, Boolean i
CheckCLabels();
- if (nameobj_func && (nameobj_func->flags & OBJECT_FLAGS_UNUSED))
+ if (nameobj_func && (nameobj_func->flags & OBJECT_FLAGS_1))
CInit_DeclareData(nameobj_func->u.alias.object, func->name->name, NULL, strlen(func->name->name) + 1);
- if (nameobj_FUNCTION && (nameobj_FUNCTION->flags & OBJECT_FLAGS_UNUSED))
+ if (nameobj_FUNCTION && (nameobj_FUNCTION->flags & OBJECT_FLAGS_1))
CInit_DeclareData(nameobj_FUNCTION->u.alias.object, func->name->name, NULL, strlen(func->name->name) + 1);
- if (nameobj_pretty && (nameobj_pretty->flags & OBJECT_FLAGS_UNUSED))
+ if (nameobj_pretty && (nameobj_pretty->flags & OBJECT_FLAGS_1))
CInit_DeclareData(nameobj_pretty->u.alias.object, prettyname, NULL, strlen(prettyname) + 1);
if (!fatalerrors) {
diff --git a/compiler_and_linker/unsorted/CInit.c b/compiler_and_linker/unsorted/CInit.c
index a76bdab..180f098 100644
--- a/compiler_and_linker/unsorted/CInit.c
+++ b/compiler_and_linker/unsorted/CInit.c
@@ -180,7 +180,7 @@ static CInit_Initializer *CInit_ParseInitializerList(void) {
return r30;
if (tk != ',') {
- CError_Error(116);
+ CError_Error(CErrorStr116);
return r30;
}
} while ((tk = lex()) != '}');
@@ -271,12 +271,12 @@ static Stage CInit_ParseNextInit(CInit_Stuff2 *s) {
if (tk == ')')
tk = lex();
else
- CError_Error(115);
+ CError_Error(CErrorStr115);
if (tk == '(')
tk = lex();
else
- CError_Error(114);
+ CError_Error(CErrorStr114);
s->x24++;
t = lookahead();
if (t == TK_UU_VECTOR || (t == TK_IDENTIFIER && !strcmp("vector", tkidentifier->name)))
@@ -305,7 +305,7 @@ static Stage CInit_ParseNextInit(CInit_Stuff2 *s) {
}
if (s->x24) {
if (tk != ')')
- CError_Error(174);
+ CError_Error(CErrorStr174);
if (s->x24 > 1) {
s->x24--;
tk = lex();
@@ -313,7 +313,7 @@ static Stage CInit_ParseNextInit(CInit_Stuff2 *s) {
}
} else {
if (tk != '}')
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
s->stage = Stage3;
return Stage3;
@@ -357,7 +357,7 @@ static void CInit_CloseInitList(void) {
tk = lex();
if (tk != '}')
- CError_ErrorSkip(130);
+ CError_ErrorSkip(CErrorStr130);
else
tk = lex();
}
@@ -434,7 +434,7 @@ static Object *CInit_CreateStaticDataObject(Type *type, UInt32 qual, HashNameNod
return obj;
}
-static Type *CInit_GetRegMemType() {
+static Type *CInit_GetRegMemType(void) {
return CDecl_NewStructType(void_ptr.size * 3, CMach_GetTypeAlign((Type *) &void_ptr));
}
@@ -470,7 +470,7 @@ static void CInit_InitNonConst(CInit_Stuff *s, Type *type, ENode *expr) {
s->x4->x1C = entry;
}
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
}
}
@@ -577,7 +577,7 @@ static void CInit_InitTypePointer(CInit_Stuff *s, ENode *expr, TypePointer *tptr
CInit_InitNonConst(s, TYPE(tptr), expr);
}
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
}
@@ -592,7 +592,7 @@ static void CInit_InitTypeInt(CInit_Stuff *s, ENode *expr, TypeIntegral *tint, U
CInit_InitNonConst(s, TYPE(tint), expr);
}
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
}
@@ -605,7 +605,7 @@ static void CInit_InitTypeFloat(CInit_Stuff *s, ENode *expr, TypeIntegral *tint,
CInit_InitNonConst(s, TYPE(tint), expr);
}
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
}
@@ -618,7 +618,7 @@ static void CInit_InitTypeEnum(CInit_Stuff *s, ENode *expr, TypeEnum *tenum, UIn
CInit_InitNonConst(s, TYPE(tenum), expr);
}
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
}
@@ -671,7 +671,7 @@ static void CInit_InitTypeBitfield(CInit_Stuff *s, ENode *expr, TypeBitfield *tb
CInit_InitNonConst(s, TYPE(tbitfield), expr);
}
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
}
@@ -689,7 +689,7 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
is_zero_size = tptr->size == 0;
targetsize = tptr->target->size;
if (!targetsize) {
- CError_Error(145);
+ CError_Error(CErrorStr145);
return;
}
@@ -700,7 +700,7 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
flag = 1;
if (CInit_ParseNextInit(s2) == Stage3) {
if (is_zero_size)
- CError_Error(174);
+ CError_Error(CErrorStr174);
tk = lex();
return;
}
@@ -714,7 +714,7 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
case Stage2:
break;
default:
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
@@ -723,7 +723,7 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
if (s2->stage == Stage2 && ENODE_IS(s2->expr, ESTRINGCONST) && (is_char_ptr || is_wchar_ptr)) {
if (IS_TYPE_POINTER_ONLY(s2->expr->rtype) && tptr->target->size != TYPE_POINTER(s2->expr->rtype)->target->size)
- CError_Warning(174);
+ CError_Warning(CErrorStr174);
size = tmp = s2->expr->data.string.size;
if (is_zero_size) {
tptr->size = s2->expr->data.string.size;
@@ -734,7 +734,7 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
} else {
if (s2->expr->data.string.size > tptr->size) {
if (copts.cplusplus || (s2->expr->data.string.size - 1) > tptr->size)
- CError_Error(147);
+ CError_Error(CErrorStr147);
s2->expr->data.string.size = tptr->size;
size = tptr->size;
}
@@ -742,7 +742,7 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
}
} else {
if (!flag && errorflag) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
@@ -760,7 +760,7 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
} else {
if (tptr->size <= i * targetsize) {
i--;
- CError_Error(147);
+ CError_Error(CErrorStr147);
}
s->size = start + i * targetsize;
CInit_InitType(s, s2, tptr->target, qual, 0);
@@ -777,7 +777,7 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
tk = lex();
return;
default:
- CError_Error(130);
+ CError_Error(CErrorStr130);
return;
}
@@ -791,10 +791,10 @@ static void CInit_InitTypeArray(CInit_Stuff *s, CInit_Stuff2 *s2, TypePointer *t
tk = lex();
return;
case Stage2:
- CError_Error(147);
+ CError_Error(CErrorStr147);
return;
default:
- CError_Error(130);
+ CError_Error(CErrorStr130);
}
}
}
@@ -813,7 +813,7 @@ static void CInit_InitTypeStruct(CInit_Stuff *s, CInit_Stuff2 *s2, const TypeStr
tstruct = TYPE_STRUCT(s2->type);
if (!(member = tstruct->members)) {
- CError_Error(145);
+ CError_Error(CErrorStr145);
return;
}
@@ -835,7 +835,7 @@ static void CInit_InitTypeStruct(CInit_Stuff *s, CInit_Stuff2 *s2, const TypeStr
case Stage2:
break;
default:
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
@@ -851,7 +851,7 @@ static void CInit_InitTypeStruct(CInit_Stuff *s, CInit_Stuff2 *s2, const TypeStr
s->size = start + member->offset;
if (!member->type->size) {
if (!errorflag || !IS_TYPE_ARRAY(member->type)) {
- CError_Error(147);
+ CError_Error(CErrorStr147);
if (!IS_TYPE_ARRAY(member->type))
return;
}
@@ -882,10 +882,10 @@ static void CInit_InitTypeStruct(CInit_Stuff *s, CInit_Stuff2 *s2, const TypeStr
tk = lex();
return;
case Stage2:
- CError_Error(147);
+ CError_Error(CErrorStr147);
return;
default:
- CError_Error(130);
+ CError_Error(CErrorStr130);
return;
}
}
@@ -911,7 +911,7 @@ static void CInit_InitTypeStruct(CInit_Stuff *s, CInit_Stuff2 *s2, const TypeStr
for (i = 1; i < 16; i++)
p[i] = val;
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
}
break;
@@ -927,7 +927,7 @@ static void CInit_InitTypeStruct(CInit_Stuff *s, CInit_Stuff2 *s2, const TypeStr
for (i = 1; i < 8; i++)
p[i] = val;
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
}
break;
@@ -943,7 +943,7 @@ static void CInit_InitTypeStruct(CInit_Stuff *s, CInit_Stuff2 *s2, const TypeStr
for (i = 1; i < 4; i++)
p[i] = val;
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
}
break;
@@ -951,7 +951,7 @@ static void CInit_InitTypeStruct(CInit_Stuff *s, CInit_Stuff2 *s2, const TypeStr
}
return;
default:
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
}
@@ -981,7 +981,7 @@ static void CInit_InitTypeClass(CInit_Stuff *s, CInit_Stuff2 *s2, TypeClass *tcl
TypePointer arraytype;
if (tclass->bases || tclass->vtable) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
@@ -1003,7 +1003,7 @@ static void CInit_InitTypeClass(CInit_Stuff *s, CInit_Stuff2 *s2, TypeClass *tcl
case Stage2:
break;
default:
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
@@ -1016,13 +1016,13 @@ static void CInit_InitTypeClass(CInit_Stuff *s, CInit_Stuff2 *s2, TypeClass *tcl
for (ivar = tclass->ivars; ivar; ivar = ivar->next) {
if (ivar->access != ACCESSPUBLIC) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
break;
}
}
if (!(ivar = tclass->ivars)) {
- CError_Error(147);
+ CError_Error(CErrorStr147);
return;
}
start = s->size;
@@ -1030,7 +1030,7 @@ static void CInit_InitTypeClass(CInit_Stuff *s, CInit_Stuff2 *s2, TypeClass *tcl
s->size = start + ivar->offset;
if (!ivar->type->size) {
if (!errorflag || !IS_TYPE_ARRAY(ivar->type)) {
- CError_Error(147);
+ CError_Error(CErrorStr147);
if (!IS_TYPE_ARRAY(ivar->type))
return;
}
@@ -1050,10 +1050,10 @@ static void CInit_InitTypeClass(CInit_Stuff *s, CInit_Stuff2 *s2, TypeClass *tcl
tk = lex();
return;
case Stage2:
- CError_Error(147);
+ CError_Error(CErrorStr147);
return;
default:
- CError_Error(130);
+ CError_Error(CErrorStr130);
return;
}
}
@@ -1068,7 +1068,7 @@ static void CInit_InitTypeClass(CInit_Stuff *s, CInit_Stuff2 *s2, TypeClass *tcl
tk = lex();
break;
default:
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
return;
}
@@ -1080,7 +1080,7 @@ static void CInit_InitType(CInit_Stuff *s, CInit_Stuff2 *s2, Type *type, UInt32
switch (type->type) {
case TYPEVOID:
- CError_Error(174);
+ CError_Error(CErrorStr174);
break;
case TYPEINT:
case TYPEFLOAT:
@@ -1098,7 +1098,7 @@ static void CInit_InitType(CInit_Stuff *s, CInit_Stuff2 *s2, Type *type, UInt32
break;
}
if (s2->stage != Stage2) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
@@ -1131,10 +1131,10 @@ static void CInit_InitType(CInit_Stuff *s, CInit_Stuff2 *s2, Type *type, UInt32
tk = lex();
break;
case Stage2:
- CError_Error(147);
+ CError_Error(CErrorStr147);
break;
default:
- CError_Error(130);
+ CError_Error(CErrorStr130);
}
}
break;
@@ -1165,7 +1165,7 @@ static void CInit_InitData(CInit_Stuff *s, Type *type, UInt32 qual, Boolean flag
if (IS_TYPE_ARRAY(type))
s->bufferSize = 16 * TYPE_POINTER(type)->target->size;
else
- CError_Error(145);
+ CError_Error(CErrorStr145);
} else {
s->bufferSize = type->size;
}
@@ -1199,7 +1199,7 @@ static void CInit_InitData(CInit_Stuff *s, Type *type, UInt32 qual, Boolean flag
s->buffer = buffer;
}
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
s->size = size;
@@ -1282,7 +1282,7 @@ static Boolean CInit_ConstructGlobalObject(Object *obj, TypeClass *tclass, ENode
if (tk == ')')
tk = lex();
else
- CError_Error(115);
+ CError_Error(CErrorStr115);
} else if (valueexpr) {
list = lalloc(sizeof(ENodeList));
list->node = valueexpr;
@@ -1300,7 +1300,7 @@ static Boolean CInit_ConstructGlobalObject(Object *obj, TypeClass *tclass, ENode
if (tk == '=') {
ctorflag = 0;
if (list)
- CError_Error(174);
+ CError_Error(CErrorStr174);
list = lalloc(sizeof(ENodeList));
list->next = NULL;
@@ -1310,12 +1310,12 @@ static Boolean CInit_ConstructGlobalObject(Object *obj, TypeClass *tclass, ENode
expr = CExpr_ConstructObject(tclass, expr, list, 0, 1, 0, 1, ctorflag);
if (expr->rtype->type != TYPEPOINTER) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return 1;
}
} else {
if (list)
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
if (dtor)
@@ -1353,7 +1353,7 @@ static Boolean CInit_ConstructAutoObject(TypeClass *tclass, ENode *expr, SInt32
if (tk == ')')
tk = lex();
else
- CError_Error(115);
+ CError_Error(CErrorStr115);
} else if (expr) {
r30 = lalloc(sizeof(ENodeList));
r30->node = expr;
@@ -1366,7 +1366,7 @@ static Boolean CInit_ConstructAutoObject(TypeClass *tclass, ENode *expr, SInt32
r24 = 1;
if (tk == '=') {
if (r30)
- CError_Error(174);
+ CError_Error(CErrorStr174);
r30 = lalloc(sizeof(ENodeList));
r30->next = NULL;
tk = lex();
@@ -1384,7 +1384,7 @@ static Boolean CInit_ConstructAutoObject(TypeClass *tclass, ENode *expr, SInt32
r29 = CExpr_ConstructObject(tclass, r29, r30, 0, 1, 0, 1, r24);
if (!IS_TYPE_POINTER_ONLY(r29->rtype)) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return 1;
}
r29 = makemonadicnode(r29, EINDIRECT);
@@ -1392,7 +1392,7 @@ static Boolean CInit_ConstructAutoObject(TypeClass *tclass, ENode *expr, SInt32
cinit_initinfo->insert_expr_cb(r29);
} else {
if (r30)
- CError_Error(174);
+ CError_Error(CErrorStr174);
if (dtor)
r29 = cinit_initinfo->register_object_cb(TYPE(tclass), cinit_initinfo->obj1C, offset, 0);
cinit_initinfo->insert_expr_cb(r29);
@@ -1421,7 +1421,7 @@ static void CInit_ExprPointer(TypePointer *tptr, ENode *expr) {
cinit_initinfo->expr_cb(TYPE(tptr), expr, 0);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
}
cinit_initinfo->expr_offset += 4;
@@ -1436,7 +1436,7 @@ static void CInit_ExprInt(TypeIntegral *tint, ENode *expr) {
cinit_initinfo->expr_cb(TYPE(tint), expr, 0);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
}
cinit_initinfo->expr_offset += tint->size;
@@ -1449,7 +1449,7 @@ static void CInit_ExprFloat(TypeIntegral *tint, ENode *expr) {
cinit_initinfo->expr_cb(TYPE(tint), expr, 0);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
}
cinit_initinfo->expr_offset += tint->size;
@@ -1462,7 +1462,7 @@ static void CInit_ExprEnum(TypeEnum *tenum, ENode *expr) {
cinit_initinfo->expr_cb(TYPE(tenum), expr, 0);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
}
cinit_initinfo->expr_offset += tenum->size;
@@ -1475,7 +1475,7 @@ static void CInit_ExprMemberPointer(TypeMemberPointer *tmptr, ENode *expr) {
cinit_initinfo->expr_cb(TYPE(tmptr), expr, 0);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
}
cinit_initinfo->expr_offset += tmptr->size;
@@ -1504,11 +1504,11 @@ static void CInit_TypeExpr(Type *type, ENode *expr) {
cinit_initinfo->expr_cb(type, expr, 0);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(124);
+ CError_Error(CErrorStr124);
}
break;
case TYPEARRAY:
- CError_Error(174);
+ CError_Error(CErrorStr174);
break;
default:
CError_FATAL(2082);
@@ -1533,7 +1533,7 @@ static void CInit_Bitfield(TypeBitfield *tbitfield) {
if (ENODE_IS(expr, EINTCONST))
CInit_SetBitfield(tbitfield, (UInt8 *) cinit_initinfo->buffer + cinit_initinfo->expr_offset, expr->data.intval);
else
- CError_Error(124);
+ CError_Error(CErrorStr124);
if (r30)
CInit_CloseInitList();
@@ -1553,13 +1553,13 @@ static void CInit_Array(TypePointer *tptr, UInt32 qual, Boolean flag) {
targetsize2 = tptr->target->size;
if (!tptr->target->size) {
if (!IS_TYPE_ARRAY(tptr->target)) {
- CError_Error(145);
+ CError_Error(CErrorStr145);
return;
}
targetsize1 = tptr->target->size;
targetsize2 = tptr->target->size;
if (!tptr->target->size) {
- CError_Error(145);
+ CError_Error(CErrorStr145);
return;
}
}
@@ -1570,7 +1570,7 @@ static void CInit_Array(TypePointer *tptr, UInt32 qual, Boolean flag) {
in_block = 1;
if (flag && !(tk == TK_STRING && is_char_ptr) && !(tk == TK_STRING_WIDE && is_wchar_ptr)) {
if (tk != '{') {
- CError_ErrorSkip(135);
+ CError_ErrorSkip(CErrorStr135);
return;
}
tk = lex();
@@ -1585,7 +1585,7 @@ static void CInit_Array(TypePointer *tptr, UInt32 qual, Boolean flag) {
if (tptr->size) {
if (tksize > tptr->size) {
if (copts.cplusplus || (tksize - (is_wchar_ptr ? stwchar.size : 1)) > tptr->size)
- CError_Error(147);
+ CError_Error(CErrorStr147);
tksize = tptr->size;
}
memcpy(cinit_initinfo->buffer + cinit_initinfo->expr_offset, tkstring, tksize);
@@ -1618,7 +1618,7 @@ static void CInit_Array(TypePointer *tptr, UInt32 qual, Boolean flag) {
cinit_initinfo->expr_cb(tptr->target, NULL, 1);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
i++;
}
@@ -1640,7 +1640,7 @@ static void CInit_Array(TypePointer *tptr, UInt32 qual, Boolean flag) {
cinit_initinfo->expr_cb(tptr->target, conv_assignment_expression(), 1);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
} else {
CInit_Type(tptr->target, qual, 0);
@@ -1648,7 +1648,7 @@ static void CInit_Array(TypePointer *tptr, UInt32 qual, Boolean flag) {
} else {
if (tptr->size <= i * targetsize1) {
i--;
- CError_Error(147);
+ CError_Error(CErrorStr147);
}
cinit_initinfo->expr_offset = start + i * targetsize2;
@@ -1657,7 +1657,7 @@ static void CInit_Array(TypePointer *tptr, UInt32 qual, Boolean flag) {
cinit_initinfo->expr_cb(tptr->target, conv_assignment_expression(), 1);
cinit_initinfo->expr_cb_called = 1;
} else {
- CError_Error(174);
+ CError_Error(CErrorStr174);
}
} else {
CInit_Type(tptr->target, qual, 0);
@@ -1671,7 +1671,7 @@ static void CInit_Array(TypePointer *tptr, UInt32 qual, Boolean flag) {
if (tk != '}') {
if (tk != ',') {
- CError_ErrorSkip(121);
+ CError_ErrorSkip(CErrorStr121);
in_block = 0;
i++;
goto innerloop;
@@ -1688,7 +1688,7 @@ static void CInit_Struct(TypeStruct *tstruct, Boolean flag) {
Boolean in_block;
if (!(member = tstruct->members)) {
- CError_Error(145);
+ CError_Error(CErrorStr145);
return;
}
@@ -1711,7 +1711,7 @@ static void CInit_Struct(TypeStruct *tstruct, Boolean flag) {
if (tk != '{') {
if (flag)
- CError_ErrorSkip(135);
+ CError_ErrorSkip(CErrorStr135);
in_block = 0;
} else {
in_block = 1;
@@ -1725,7 +1725,7 @@ static void CInit_Struct(TypeStruct *tstruct, Boolean flag) {
cinit_initinfo->expr_offset = start + member->offset;
if (!member->type->size && IS_TYPE_ARRAY(member->type)) {
- CError_Error(147);
+ CError_Error(CErrorStr147);
break;
}
@@ -1734,7 +1734,7 @@ static void CInit_Struct(TypeStruct *tstruct, Boolean flag) {
break;
if (tk != ',') {
- CError_Error(121);
+ CError_Error(CErrorStr121);
break;
}
@@ -1746,7 +1746,7 @@ static void CInit_Struct(TypeStruct *tstruct, Boolean flag) {
if (!in_block)
break;
if ((tk = lex()) != '}') {
- CError_Error(147);
+ CError_Error(CErrorStr147);
break;
}
} else {
@@ -1772,7 +1772,7 @@ static void CInit_Class(TypeClass *tclass, Boolean flag) {
}
if (tclass->bases || tclass->vtable) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
@@ -1789,7 +1789,7 @@ static void CInit_Class(TypeClass *tclass, Boolean flag) {
break;
if (!ivar->type->size && IS_TYPE_ARRAY(ivar->type)) {
- CError_Error(147);
+ CError_Error(CErrorStr147);
break;
}
@@ -1800,7 +1800,7 @@ static void CInit_Class(TypeClass *tclass, Boolean flag) {
break;
if (tk != ',') {
- CError_Error(121);
+ CError_Error(CErrorStr121);
break;
}
@@ -1812,7 +1812,7 @@ static void CInit_Class(TypeClass *tclass, Boolean flag) {
if (!in_block)
break;
if ((tk = lex()) != '}') {
- CError_Error(147);
+ CError_Error(CErrorStr147);
break;
}
} else {
@@ -1821,11 +1821,11 @@ static void CInit_Class(TypeClass *tclass, Boolean flag) {
}
} else {
if (in_block && tk != '}')
- CError_Error(147);
+ CError_Error(CErrorStr147);
}
} else {
if (in_block)
- CError_Error(174);
+ CError_Error(CErrorStr174);
CInit_TypeExpr(TYPE(tclass), CExpr_AssignmentPromotion(conv_assignment_expression(), TYPE(tclass), 0, 1));
}
@@ -1840,7 +1840,7 @@ static void CInit_Type(Type *type, UInt32 qual, Boolean flag) {
switch (type->type) {
case TYPEVOID:
- CError_Error(174);
+ CError_Error(CErrorStr174);
break;
case TYPEINT:
case TYPEFLOAT:
@@ -1885,7 +1885,7 @@ static void CInit_GlobalStaticInit(Type *type, ENode *valueexpr, Boolean flag) {
} else {
expr = create_objectrefnode(cinit_initinfo->obj);
if (!IS_TYPE_POINTER_ONLY(expr->rtype)) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
TYPE_POINTER(expr->rtype)->target = type;
@@ -1920,7 +1920,7 @@ static void CInit_AutoInit(Type *type, ENode *valueexpr, Boolean flag) {
}
expr = create_objectrefnode(cinit_initinfo->obj1C);
if (!IS_TYPE_POINTER_ONLY(expr->rtype)) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
TYPE_POINTER(expr->rtype)->target = type;
@@ -1932,7 +1932,7 @@ static void CInit_AutoInit(Type *type, ENode *valueexpr, Boolean flag) {
tmp->rtype = type;
expr = makediadicnode(tmp, valueexpr, EASS);
if (!copts.cplusplus)
- CError_Error(124);
+ CError_Error(CErrorStr124);
cinit_initinfo->insert_expr_cb(expr);
}
}
@@ -1961,11 +1961,11 @@ static ENode *CInit_GenericData(Object *obj, Type *type, UInt32 qual, ExprCB exp
if (tk == '(') {
if (IS_TYPE_ARRAY(type))
- CError_Error(174);
+ CError_Error(CErrorStr174);
tk = lex();
expr = CExpr_AssignmentPromotion(assignment_expression(), type, qual, 1);
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
goto jump_ahead;
@@ -1975,7 +1975,7 @@ static ENode *CInit_GenericData(Object *obj, Type *type, UInt32 qual, ExprCB exp
switch (type->type) {
case TYPECLASS:
if (tk == '{' && CClass_Constructor(TYPE_CLASS(type)))
- CError_Error(174);
+ CError_Error(CErrorStr174);
case TYPESTRUCT:
if (tk != '{')
goto generic_type;
@@ -2195,7 +2195,7 @@ static void CInit_InitializeClassArray(Object *obj, TypeClass *tclass, Boolean f
if (!ctor) {
ctor = CClass_DummyDefaultConstructor(tclass);
if (!ctor) {
- CError_Error(203);
+ CError_Error(CErrorStr203);
return;
}
}
@@ -2314,7 +2314,7 @@ static ENode *CInit_GlobalTempNode(Type *type, Boolean flag) {
node = create_objectrefnode(CInit_CreateStaticData(type));
if (IS_TYPE_CLASS(type) && (dtor = CClass_Destructor(TYPE_CLASS(type))) && !copts.no_static_dtors) {
if (flag)
- CError_Error(190);
+ CError_Error(CErrorStr190);
funcnode = galloc(sizeof(ENode));
funcnode->type = EFUNCCALL;
@@ -2340,7 +2340,7 @@ static void CInit_RefInit(Type *type, ENode *expr, Boolean flag) {
objexpr = create_objectrefnode(cinit_initinfo->obj);
if (!IS_TYPE_POINTER_ONLY(objexpr->rtype)) {
- CError_Error(174);
+ CError_Error(CErrorStr174);
return;
}
TYPE_POINTER(objexpr->rtype)->target = type;
@@ -2575,7 +2575,7 @@ void CInit_InitializeAutoData(Object *obj, InsertExprCB insert_cb, RegisterObjec
tk = lex();
expr = conv_assignment_expression();
if (tk != ')')
- CError_Error(115);
+ CError_Error(CErrorStr115);
tk = lex();
} else if (tk == '=' && ((tk = lex()) == '{' || IS_TYPE_ARRAY(obj->type))) {
insert_cb(CInit_AutoObject(obj, obj->type, obj->qual));
@@ -2586,7 +2586,7 @@ void CInit_InitializeAutoData(Object *obj, InsertExprCB insert_cb, RegisterObjec
expr = CExpr_AssignmentPromotion(expr, obj->type, obj->qual & (Q_CONST | Q_VOLATILE), 1);
insert_cb(makediadicnode(create_objectnode2(obj), expr, EASS));
} else if (copts.cplusplus && is_const_object(obj)) {
- CError_Error(224);
+ CError_Error(CErrorStr224);
}
return;
@@ -2626,13 +2626,13 @@ void CInit_InitializeAutoData(Object *obj, InsertExprCB insert_cb, RegisterObjec
CFunc_CheckClassCtors(TYPE_CLASS(obj->type));
if ((IS_TYPE_REFERENCE(obj->type) || is_const_object(obj)) && copts.cplusplus)
- CError_Error(224);
+ CError_Error(CErrorStr224);
} else {
if (obj->type->size || IS_TYPE_ARRAY(obj->type)) {
if ((expr = CInit_GenericData(NULL, obj->type, obj->qual, CInit_AutoInit, 0)))
insert_cb(makediadicnode(create_objectnode2(obj), expr, EASS));
} else {
- CError_Error(145);
+ CError_Error(CErrorStr145);
}
}
@@ -2675,7 +2675,7 @@ void CInit_InitializeStaticData(Object *obj, InitExprRegisterCB cb) {
}
} else {
if (copts.cplusplus && is_const_object(obj))
- CError_Error(224);
+ CError_Error(CErrorStr224);
if (is_const_object(obj))
CInit_DeclareReadOnlyData(obj, NULL, NULL, obj->type->size);
@@ -2723,13 +2723,13 @@ void CInit_InitializeStaticData(Object *obj, InitExprRegisterCB cb) {
CFunc_CheckClassCtors(TYPE_CLASS(obj->type));
if ((IS_TYPE_REFERENCE(obj->type) || is_const_object(obj)) && copts.cplusplus)
- CError_Error(224);
+ CError_Error(CErrorStr224);
} else {
if (obj->type->size || IS_TYPE_ARRAY(obj->type)) {
if ((expr = CInit_GenericData(obj, obj->type, obj->qual, CInit_GlobalStaticInit, 1)))
cb(makediadicnode(create_objectnode2(obj), expr, EASS));
} else {
- CError_Error(145);
+ CError_Error(CErrorStr145);
}
}
@@ -2770,7 +2770,7 @@ void CInit_InitializeData(Object *obj) {
}
} else {
if (obj->flags & OBJECT_FLAGS_4)
- CError_Error(329, obj);
+ CError_Error(CErrorStr329, obj);
obj->flags |= OBJECT_FLAGS_4;
needs_construction = 0;
@@ -2803,7 +2803,7 @@ void CInit_InitializeData(Object *obj) {
if (!needs_construction && copts.cplusplus) {
if (IS_TYPE_REFERENCE(obj->type) || is_const_object(obj))
- CError_Error(224);
+ CError_Error(CErrorStr224);
}
if (IsCompleteType(obj->type))
CInit_DeclareData(obj, NULL, NULL, obj->type->size);
@@ -2813,13 +2813,13 @@ void CInit_InitializeData(Object *obj) {
}
if (obj->flags & OBJECT_FLAGS_4)
- CError_Error(329, obj);
+ CError_Error(CErrorStr329, obj);
if (CInit_IsSimpleStructArrayInit(obj->type)) {
if (tk == '=')
tk = lex();
else
- CError_Error(121);
+ CError_Error(CErrorStr121);
CInit_GlobalObject(obj);
return;
}
@@ -2838,7 +2838,7 @@ void CInit_InitializeData(Object *obj) {
}
if (obj->type->size == 0 && !IS_TYPE_ARRAY(obj->type)) {
- CError_Error(145);
+ CError_Error(CErrorStr145);
CInit_CleanupInitInfo(&initinfo);
return;
}
@@ -2977,7 +2977,7 @@ void CInit_RewriteString(ENode *expr, Boolean flag) {
Boolean is_wide;
if (cparamblkptr->isPrecompiling == 1)
- CError_Error(180);
+ CError_Error(CErrorStr180);
CError_ASSERT(4220, expr->rtype->type == TYPEPOINTER);
diff --git a/compiler_and_linker/unsorted/CInline.c b/compiler_and_linker/unsorted/CInline.c
index 2ab6568..85cdf83 100644
--- a/compiler_and_linker/unsorted/CInline.c
+++ b/compiler_and_linker/unsorted/CInline.c
@@ -3458,7 +3458,7 @@ void CInline_AddDefaultFunctionAction(Object *object) {
cinline_actionlist = action;
}
-void CInline_AddInlineFunctionAction(Object *object, TypeClass *tclass, FileOffsetInfo *fileoffset, TStream *stream, Boolean flag) {
+void CInline_AddInlineFunctionAction(Object *object, TypeClass *tclass, FileOffsetInfo *fileoffset, TokenStream *stream, Boolean flag) {
CI_Action *action;
for (action = flag ? cinline_tactionlist : cinline_actionlist; action; action = action->next) {
diff --git a/compiler_and_linker/unsorted/CInt64.c b/compiler_and_linker/unsorted/CInt64.c
index ce2c45c..449e068 100644
--- a/compiler_and_linker/unsorted/CInt64.c
+++ b/compiler_and_linker/unsorted/CInt64.c
@@ -8,7 +8,7 @@ const CInt64 cint64_min = {0x80000000, 0};
#define SHIFT_LEFT_ONE(a, b) do { a <<= 1; if (b & 0x80000000) { a |= 1; } b <<= 1; } while(0)
-void CInt64_Init() {
+void CInt64_Init(void) {
}
CInt64 CInt64_Not(CInt64 input) {
diff --git a/compiler_and_linker/unsorted/CMachine.c b/compiler_and_linker/unsorted/CMachine.c
index 2b1440f..4bde879 100644
--- a/compiler_and_linker/unsorted/CMachine.c
+++ b/compiler_and_linker/unsorted/CMachine.c
@@ -6,6 +6,7 @@
#include "compiler/CPrep.h"
#include "compiler/CPrepTokenizer.h"
#include "compiler/CompilerTools.h"
+#include "compiler/ScanFloat.h"
#include "compiler/objects.h"
#include "compiler/types.h"
@@ -126,7 +127,7 @@ static short cmach_packsize[] = {
static SInt16 CMach_GetQualifiedTypeAlign(Type *type, Boolean flag);
static SInt16 CMach_GetMemberAlignment(Type *type, SInt32 align, Boolean flag);
-void CMach_Configure() {
+void CMach_Configure(void) {
}
SInt32 CMach_GetQUALalign(UInt32 qual) {
@@ -170,8 +171,7 @@ SInt32 CMach_GetQUALalign(UInt32 qual) {
}
SInt32 CMach_ArgumentAlignment(Type *type) {
- // does not match - registers
- UInt8 save_align_mode;
+ char save_align_mode;
UInt8 save_oldalignment;
SInt32 align;
@@ -252,13 +252,13 @@ CInt64 CMach_CalcIntDiadic(Type *type, CInt64 left, short op, CInt64 right) {
break;
case '/':
if (CInt64_IsZero(&right))
- CError_Warning(139);
+ CError_Warning(CErrorStr139);
else
left = CInt64_DivU(left, right);
break;
case '%':
if (CInt64_IsZero(&right))
- CError_Warning(139);
+ CError_Warning(CErrorStr139);
else
left = CInt64_ModU(left, right);
break;
@@ -302,13 +302,13 @@ CInt64 CMach_CalcIntDiadic(Type *type, CInt64 left, short op, CInt64 right) {
left = CInt64_Or(left, right);
break;
case TK_LOGICAL_AND:
- CInt64_SetLong(&left, (CInt64_IsZero(&left) == 0 && CInt64_IsZero(&right) == 0));
+ CInt64_SetLong(&left, (!CInt64_IsZero(&left) && !CInt64_IsZero(&right)));
break;
case TK_LOGICAL_OR:
- CInt64_SetLong(&left, (CInt64_IsZero(&left) == 0 || CInt64_IsZero(&right) == 0));
+ CInt64_SetLong(&left, (!CInt64_IsZero(&left) || !CInt64_IsZero(&right)));
break;
default:
- CError_Error(120);
+ CError_Error(CErrorStr120);
}
switch (type->size) {
@@ -350,13 +350,13 @@ CInt64 CMach_CalcIntDiadic(Type *type, CInt64 left, short op, CInt64 right) {
break;
case '/':
if (CInt64_IsZero(&right))
- CError_Warning(139);
+ CError_Warning(CErrorStr139);
else
left = CInt64_Div(left, right);
break;
case '%':
if (CInt64_IsZero(&right))
- CError_Warning(139);
+ CError_Warning(CErrorStr139);
else
left = CInt64_Mod(left, right);
break;
@@ -400,13 +400,13 @@ CInt64 CMach_CalcIntDiadic(Type *type, CInt64 left, short op, CInt64 right) {
left = CInt64_Or(left, right);
break;
case TK_LOGICAL_AND:
- CInt64_SetLong(&left, (CInt64_IsZero(&left) == 0 && CInt64_IsZero(&right) == 0));
+ CInt64_SetLong(&left, (!CInt64_IsZero(&left) && !CInt64_IsZero(&right)));
break;
case TK_LOGICAL_OR:
- CInt64_SetLong(&left, (CInt64_IsZero(&left) == 0 || CInt64_IsZero(&right) == 0));
+ CInt64_SetLong(&left, (!CInt64_IsZero(&left) || !CInt64_IsZero(&right)));
break;
default:
- CError_Error(120);
+ CError_Error(CErrorStr120);
}
switch (type->size) {
@@ -456,7 +456,7 @@ CInt64 CMach_CalcIntMonadic(Type *type, short op, CInt64 val) {
val = CInt64_Not(val);
break;
default:
- CError_Error(120);
+ CError_Error(CErrorStr120);
}
switch (type->size) {
@@ -500,7 +500,7 @@ CInt64 CMach_CalcIntMonadic(Type *type, short op, CInt64 val) {
val = CInt64_Not(val);
break;
default:
- CError_Error(120);
+ CError_Error(CErrorStr120);
}
switch (type->size) {
@@ -683,7 +683,7 @@ char *CMach_FloatScan(char *input, Float *result, Boolean *fail) {
char *outpos;
if (!(outpos = ScanFloat(input, &resultval, fail)))
- CError_ErrorTerm(154);
+ CError_ErrorTerm(CErrorStr154);
if (*fail)
result->value = 0.0;
@@ -768,9 +768,9 @@ void CMach_PrintFloat(char *buf, Float val) {
sprintf(buf, "%g", f);
}
-void CMach_PragmaParams() {
+void CMach_PragmaParams(void) {
if (copts.warn_illpragma)
- CError_Warning(186, 0);
+ CError_Warning(CErrorStr186, 0);
while (notendofline())
lex();
@@ -835,37 +835,49 @@ static SInt32 CMach_GetPPCTypeAlign(Type *type, Boolean flag1, Boolean flag2) {
return align;
}
-static SInt16 CMach_GetQualifiedStructAlign(TypeStruct *tstruct, Boolean flag) {
+static SInt16 CMach_GetQualifiedStructAlign(const TypeStruct *tstruct, Boolean flag) {
StructMember *member;
SInt32 best;
SInt32 align;
Boolean isFirst;
- // very close to matching but tstruct->stype gets cached when it should not be
- if (tstruct->stype >= STRUCT_TYPE_4 && tstruct->stype <= STRUCT_TYPE_E) {
+ if (tstruct->stype >= STRUCT_TYPE_4 && tstruct->stype <= STRUCT_TYPE_E)
return 16;
- } else {
-
- switch (copts.align_mode) {
- case AlignMode3_1Byte:
- case AlignMode8_Packed:
- return 1;
- case AlignMode0_Mac68k:
- return 2;
- case AlignMode1_Mac68k4byte:
- return (tstruct->size <= 2) ? 2 : 4;
- }
- if (tstruct->size <= 1)
+ switch (copts.align_mode) {
+ case AlignMode3_1Byte:
+ case AlignMode8_Packed:
return 1;
- best = 1;
- switch (copts.align_mode) {
- default:
- CError_FATAL(1026);
- case AlignMode4_2Byte:
- case AlignMode5_4Byte:
- case AlignMode6_8Byte:
- case AlignMode7_16Byte:
+ case AlignMode0_Mac68k:
+ return 2;
+ case AlignMode1_Mac68k4byte:
+ return (tstruct->size <= 2) ? 2 : 4;
+ }
+
+ if (tstruct->size <= 1)
+ return 1;
+
+ best = 1;
+ switch (copts.align_mode) {
+ default:
+ CError_FATAL(1026);
+ case AlignMode4_2Byte:
+ case AlignMode5_4Byte:
+ case AlignMode6_8Byte:
+ case AlignMode7_16Byte:
+ for (member = tstruct->members; member; member = member->next) {
+ align = CMach_GetQualifiedTypeAlign(member->type, flag);
+ if (align > best)
+ best = align;
+ if (flag) {
+ align = CMach_GetQUALalign(member->qual);
+ if (align > best)
+ best = align;
+ }
+ }
+ return best;
+ case AlignMode2_PPC:
+ if (copts.oldalignment) {
for (member = tstruct->members; member; member = member->next) {
align = CMach_GetQualifiedTypeAlign(member->type, flag);
if (align > best)
@@ -876,46 +888,32 @@ static SInt16 CMach_GetQualifiedStructAlign(TypeStruct *tstruct, Boolean flag) {
best = align;
}
}
- return best;
- case AlignMode2_PPC:
- if (copts.oldalignment) {
- for (member = tstruct->members; member; member = member->next) {
- align = CMach_GetQualifiedTypeAlign(member->type, flag);
- if (align > best)
- best = align;
- if (flag) {
- align = CMach_GetQUALalign(member->qual);
- if (align > best)
- best = align;
- }
- }
- } else if (tstruct->stype == STRUCT_TYPE_UNION) {
- for (member = tstruct->members; member; member = member->next) {
- align = CMach_GetPPCTypeAlign(member->type, 1, flag);
+ } else if (TYPE_STRUCT(tstruct)->stype == STRUCT_TYPE_UNION) {
+ for (member = tstruct->members; member; member = member->next) {
+ align = CMach_GetPPCTypeAlign(member->type, 1, flag);
+ if (align > best)
+ best = align;
+ if (flag) {
+ align = CMach_GetQUALalign(member->qual);
if (align > best)
best = align;
- if (flag) {
- align = CMach_GetQUALalign(member->qual);
- if (align > best)
- best = align;
- }
}
- } else {
- isFirst = 1;
- for (member = tstruct->members; member; member = member->next) {
- align = CMach_GetPPCTypeAlign(member->type, isFirst || (best >= 8), flag);
+ }
+ } else {
+ isFirst = 1;
+ for (member = tstruct->members; member; member = member->next) {
+ align = CMach_GetPPCTypeAlign(member->type, isFirst || (best >= 8), flag);
+ if (align > best)
+ best = align;
+ if (flag) {
+ align = CMach_GetQUALalign(member->qual);
if (align > best)
best = align;
- if (flag) {
- align = CMach_GetQUALalign(member->qual);
- if (align > best)
- best = align;
- }
- isFirst = 0;
}
+ isFirst = 0;
}
- return best;
- }
+ }
+ return best;
}
}
@@ -1029,7 +1027,7 @@ static SInt16 CMach_GetWinMinimizeAlign(SInt16 align) {
}
static SInt16 CMach_GetQualifiedTypeAlign(Type *type, Boolean flag) {
- Boolean r31;
+ Boolean isWin;
SInt16 align;
if (type->type == TYPESTRUCT && TYPE_STRUCT(type)->stype >= STRUCT_TYPE_4 && TYPE_STRUCT(type)->stype <= STRUCT_TYPE_E)
@@ -1043,10 +1041,10 @@ static SInt16 CMach_GetQualifiedTypeAlign(Type *type, Boolean flag) {
case AlignMode5_4Byte:
case AlignMode6_8Byte:
case AlignMode7_16Byte:
- r31 = 1;
+ isWin = 1;
break;
default:
- r31 = 0;
+ isWin = 0;
break;
}
@@ -1059,7 +1057,7 @@ restart:
case TYPEENUM:
type = TYPE_ENUM(type)->enumtype;
case TYPEINT:
- if (r31)
+ if (isWin)
return CMach_GetWinTypeAlign(type);
if (type->size == 1)
return 1;
@@ -1069,7 +1067,7 @@ restart:
return 4;
return 2;
case TYPEFLOAT:
- if (r31)
+ if (isWin)
return CMach_GetWinTypeAlign(type);
switch (copts.align_mode) {
case AlignMode0_Mac68k:
@@ -1085,7 +1083,7 @@ restart:
}
case TYPEMEMBERPOINTER:
case TYPEPOINTER:
- if (r31)
+ if (isWin)
return CMach_GetWinTypeAlign(type);
if (copts.align_mode == AlignMode0_Mac68k)
return 2;
@@ -1093,7 +1091,7 @@ restart:
return 4;
case TYPEARRAY:
if (copts.align_array_members) {
- if (r31)
+ if (isWin)
return CMach_GetWinTypeAlign(type);
if (type->size == 1)
return 1;
@@ -1115,7 +1113,7 @@ restart:
align = TYPE_STRUCT(type)->align;
else
align = CMach_GetQualifiedStructAlign(TYPE_STRUCT(type), flag);
- if (r31)
+ if (isWin)
return CMach_GetWinMinimizeAlign(align);
else
return align;
@@ -1124,7 +1122,7 @@ restart:
align = TYPE_CLASS(type)->align;
else
align = CMach_GetQualifiedClassAlign(TYPE_CLASS(type), flag);
- if (r31)
+ if (isWin)
return CMach_GetWinMinimizeAlign(align);
else
return align;
@@ -1150,7 +1148,7 @@ static SInt16 CMach_GetMemberAlignment(Type *type, SInt32 var, Boolean flag) {
if (align < 1)
align = 1;
- if (type->type == TYPESTRUCT && TYPE_STRUCT(type)->stype >= STRUCT_TYPE_4 && TYPE_STRUCT(type)->stype <= STRUCT_TYPE_E && align < 16)
+ if (IS_TYPE_VECTOR(type) && align < 16)
align = 16;
switch (copts.align_mode) {
@@ -1197,7 +1195,7 @@ void CMach_StructLayoutInitOffset(SInt32 offset) {
cmach_curbfsize = 0;
}
-SInt32 CMach_StructLayoutGetCurSize() {
+SInt32 CMach_StructLayoutGetCurSize(void) {
return cmach_structoffset;
}
@@ -1323,7 +1321,7 @@ Boolean CMach_PassResultInHiddenArg(Type *type) {
}
}
-char *CMach_GetCPU() {
+char *CMach_GetCPU(void) {
switch (copts.cpu) {
case CPU_PPC401: return "__PPC401__";
case CPU_PPC403: return "__PPC403__";
@@ -1379,7 +1377,7 @@ SInt32 CMach_RoundedSizeOf(Object *object) {
return (size + align) & ~align;
}
-void CMach_ReInitRuntimeObjects() {
+void CMach_ReInitRuntimeObjects(void) {
HashNameNode *e0 = GetHashNameNodeExport("[0]");
HashNameNode *e1 = GetHashNameNodeExport("[1]");
HashNameNode *e2 = GetHashNameNodeExport("[2]");
diff --git a/compiler_and_linker/unsorted/CParser.c b/compiler_and_linker/unsorted/CParser.c
index 85ccf26..214061d 100644
--- a/compiler_and_linker/unsorted/CParser.c
+++ b/compiler_and_linker/unsorted/CParser.c
@@ -459,7 +459,7 @@ Boolean CParser_ParseOperatorName(short *token, Boolean flag1, Boolean flag2) {
if (lookahead() == '[') {
lex();
if (lex() != ']')
- CError_Error(125);
+ CError_Error(CErrorStr125);
//if (tk == TK_NEW)
// tk = TK_NEW_ARRAY;
//else
@@ -469,14 +469,14 @@ Boolean CParser_ParseOperatorName(short *token, Boolean flag1, Boolean flag2) {
break;
case '(':
if ((tk = lex()) != ')') {
- CError_Error(204);
+ CError_Error(CErrorStr204);
return 0;
}
tk = '(';
break;
case '[':
if ((tk = lex()) != ']') {
- CError_Error(204);
+ CError_Error(CErrorStr204);
return 0;
}
tk = '[';
@@ -502,7 +502,7 @@ Boolean CParser_ParseOperatorName(short *token, Boolean flag1, Boolean flag2) {
*token = 0;
return 1;
} else {
- CError_Error(204);
+ CError_Error(CErrorStr204);
return 0;
}
}
@@ -906,7 +906,7 @@ Object *CParser_FindDeallocationObject(Type *type, FuncArg *args, Boolean flag1,
}
if (list)
- CError_Warning(375, type, 0);
+ CError_Warning(CErrorStr375, type, 0);
list = (retry_flag && copts.array_new_delete) ? &dela_fobj->first : &delp_fobj->first;
first_time = 0;
@@ -1823,7 +1823,7 @@ static Type *getthetype(short token, short size, short signedness) {
case TK_VOID:
return TYPE(&stvoid);
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
return TYPE(&stvoid);
}
}
@@ -1863,7 +1863,7 @@ static void CParser_ParseAttributeFunctionSummary(DeclInfo *declinfo) {
Boolean flag;
if ((tk = lex()) != '(') {
- CError_Error(114);
+ CError_Error(CErrorStr114);
return;
}
@@ -1880,7 +1880,7 @@ static void CParser_ParseAttributeFunctionSummary(DeclInfo *declinfo) {
flag = 0;
} else {
lex();
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
@@ -1893,7 +1893,7 @@ static void CParser_ParseAttributeFunctionSummary(DeclInfo *declinfo) {
lex();
if (tk != ')')
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
void CParser_ParseAttribute(Type *type, DeclInfo *declinfo) {
@@ -1902,21 +1902,21 @@ void CParser_ParseAttribute(Type *type, DeclInfo *declinfo) {
do {
if ((tk = lex()) != '(') {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
if ((tk = lex()) != '(') {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
if ((tk = lex()) != TK_IDENTIFIER && tk != TK_CONST) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
if (!strcmp(tkidentifier->name, "aligned") || !strcmp(tkidentifier->name, "__aligned__")) {
if ((tk = lex()) != '(') {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
@@ -1939,7 +1939,7 @@ void CParser_ParseAttribute(Type *type, DeclInfo *declinfo) {
case 0x2000:
break;
default:
- CError_Error(124);
+ CError_Error(CErrorStr124);
return;
}
if (type) {
@@ -1954,7 +1954,7 @@ void CParser_ParseAttribute(Type *type, DeclInfo *declinfo) {
type->size += CABI_StructSizeAlignValue(type, type->size);
}
} else {
- CError_Error(149);
+ CError_Error(CErrorStr149);
}
} else if (declinfo) {
declinfo->qual &= ~Q_ALIGNED_MASK;
@@ -2006,67 +2006,67 @@ void CParser_ParseAttribute(Type *type, DeclInfo *declinfo) {
break;
}
} else {
- CError_Error(359);
+ CError_Error(CErrorStr359);
}
if (tk != ')') {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
} else if (!strcmp(tkidentifier->name, "nothrow") || !strcmp(tkidentifier->name, "__nothrow__")) {
if (declinfo && declinfo->thetype && IS_TYPE_FUNC(declinfo->thetype))
TYPE_FUNC(declinfo->thetype)->flags |= FUNC_FLAGS_NOTHROW;
else
- CError_Error(359);
+ CError_Error(CErrorStr359);
} else if (!strcmp("function_summary", tkidentifier->name)) {
CParser_ParseAttributeFunctionSummary(declinfo);
} else if (!strcmp(tkidentifier->name, "packed") || !strcmp(tkidentifier->name, "__packed__")) {
- CError_Error(359);
+ CError_Error(CErrorStr359);
} else if (!strcmp(tkidentifier->name, "unused") || !strcmp(tkidentifier->name, "__unused__")) {
} else if (!strcmp(tkidentifier->name, "noreturn") || !strcmp(tkidentifier->name, "__noreturn__")) {
} else if (tk == TK_CONST || !strcmp(tkidentifier->name, "__const__")) {
} else if (!strcmp(tkidentifier->name, "format") || !strcmp(tkidentifier->name, "__format__")) {
- CError_Warning(359);
+ CError_Warning(CErrorStr359);
if ((tk = lex()) != '(') {
- CError_Warning(114);
+ CError_Warning(CErrorStr114);
return;
}
tk = lex();
if ((tk = lex()) != ',') {
- CError_Warning(116);
+ CError_Warning(CErrorStr116);
return;
}
tk = lex();
if ((tk = lex()) != ',') {
- CError_Warning(116);
+ CError_Warning(CErrorStr116);
return;
}
tk = lex();
if ((tk = lex()) != ')') {
- CError_Warning(115);
+ CError_Warning(CErrorStr115);
return;
}
} else if (!strcmp(tkidentifier->name, "mode") || !strcmp(tkidentifier->name, "__mode__")) {
- CError_Warning(359);
+ CError_Warning(CErrorStr359);
if ((tk = lex()) != '(') {
- CError_Warning(114);
+ CError_Warning(CErrorStr114);
return;
}
tk = lex();
if ((tk = lex()) != ')') {
- CError_Warning(115);
+ CError_Warning(CErrorStr115);
return;
}
} else {
- CError_Error(359);
+ CError_Error(CErrorStr359);
}
if ((tk = lex()) != ')') {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
if ((tk = lex()) != ')') {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
tk = lex();
@@ -2084,10 +2084,10 @@ static void CParser_ParseTypeOf(DeclInfo *declinfo) {
CParser_GetDeclSpecs(&subdi, 0);
scandeclarator(&subdi);
if (subdi.name)
- CError_Error(121);
+ CError_Error(CErrorStr121);
if (tk != ')')
- CError_ErrorSkip(115);
+ CError_ErrorSkip(CErrorStr115);
else
tk = lex();
@@ -2095,7 +2095,7 @@ static void CParser_ParseTypeOf(DeclInfo *declinfo) {
} else {
expr = unary_expression();
if (ENODE_IS(expr, EINDIRECT) && ENODE_IS(expr->data.monadic, EBITFIELD))
- CError_Error(144);
+ CError_Error(CErrorStr144);
TypedefDeclInfo(declinfo, expr->rtype, expr->flags & ENODE_FLAG_QUALS);
}
}
@@ -2103,7 +2103,7 @@ static void CParser_ParseTypeOf(DeclInfo *declinfo) {
void CParser_ParseDeclSpec(DeclInfo *declinfo, Boolean flag) {
if ((tk = lex()) != TK_IDENTIFIER) {
if (tk != TK_EXPORT)
- CError_Error(107);
+ CError_Error(CErrorStr107);
else
declinfo->exportflags |= EXPORT_FLAGS_EXPORT;
} else if (!strcmp("internal", tkidentifier->name)) {
@@ -2146,7 +2146,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_SIGNED:
@@ -2184,7 +2184,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_UNSIGNED:
@@ -2222,7 +2222,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_BOOL:
@@ -2260,7 +2260,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_SHORT:
@@ -2310,7 +2310,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_IDENTIFIER:
@@ -2322,7 +2322,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_LONG:
@@ -2368,7 +2368,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_IDENTIFIER:
@@ -2380,7 +2380,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_INT:
@@ -2453,7 +2453,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
return 1;
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_LONG:
@@ -2496,7 +2496,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
}
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
break;
case TK_FLOAT:
@@ -2546,7 +2546,7 @@ static int CParser_GetVectorDeclSpec(Type **type) {
}
}
default:
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
return 0;
@@ -2560,7 +2560,7 @@ Boolean CParser_CheckTemplateClassUsage(TemplClass *tmclass, Boolean flag) {
while (1) {
if (!nspace) {
if (flag)
- CError_Error(230);
+ CError_Error(CErrorStr230);
return 0;
}
if (nspace->theclass == TYPE_CLASS(tmclass))
@@ -2623,7 +2623,7 @@ restart:
case TK_TYPEDEF:
case TK_MUTABLE:
if (di->storageclass)
- CError_Error(121);
+ CError_Error(CErrorStr121);
di->storageclass = tk;
break;
case TK_CONST:
@@ -2701,10 +2701,10 @@ restart:
break;
case TK_UU_DECLSPEC:
if ((tk = lex()) != '(')
- CError_Error(114);
+ CError_Error(CErrorStr114);
CParser_ParseDeclSpec(di, 0);
if ((tk = lex()) != ')')
- CError_Error(115);
+ CError_Error(CErrorStr115);
break;
case TK_ASM:
if (di->qual & Q_ASM)
@@ -2718,74 +2718,74 @@ restart:
break;
case TK_SHORT:
if (typesize || (typetoken && typetoken != TK_INT && typetoken != TK_DOUBLE))
- CError_Error(121);
+ CError_Error(CErrorStr121);
typesize = 1;
break;
case TK_LONG:
if (copts.longlong) {
if (typetoken && typetoken != TK_INT && typetoken != TK_DOUBLE)
- CError_Error(121);
+ CError_Error(CErrorStr121);
if (typesize) {
if (typesize != 2 || typetoken == TK_DOUBLE)
- CError_Error(121);
+ CError_Error(CErrorStr121);
typesize = 3;
} else {
typesize = 2;
}
} else {
if (typesize || (typetoken && typetoken != TK_INT && typetoken != TK_DOUBLE))
- CError_Error(121);
+ CError_Error(CErrorStr121);
typesize = 2;
}
break;
case TK_SIGNED:
if (signedness || (typetoken && typetoken != TK_INT && typetoken != TK_CHAR))
- CError_Error(121);
+ CError_Error(CErrorStr121);
signedness = -1;
break;
case TK_UNSIGNED:
if (signedness || (typetoken && typetoken != TK_INT && typetoken != TK_CHAR))
- CError_Error(121);
+ CError_Error(CErrorStr121);
signedness = 1;
break;
case TK_VOID:
if (typetoken || typesize || signedness)
- CError_Error(121);
+ CError_Error(CErrorStr121);
typetoken = TK_VOID;
break;
case TK_FLOAT:
if (typetoken || typesize || signedness)
- CError_Error(121);
+ CError_Error(CErrorStr121);
typetoken = TK_FLOAT;
break;
case TK_BOOL:
if (typetoken || typesize)
- CError_Error(121);
+ CError_Error(CErrorStr121);
typetoken = TK_BOOL;
break;
case TK_CHAR:
if (typetoken || typesize)
- CError_Error(121);
+ CError_Error(CErrorStr121);
typetoken = TK_CHAR;
break;
case TK_WCHAR_T:
if (typetoken || typesize || signedness)
- CError_Error(121);
+ CError_Error(CErrorStr121);
typetoken = TK_WCHAR_T;
break;
case TK_INT:
if (typetoken)
- CError_Error(121);
+ CError_Error(CErrorStr121);
typetoken = TK_INT;
break;
case TK_DOUBLE:
if (typetoken || signedness)
- CError_Error(121);
+ CError_Error(CErrorStr121);
typetoken = TK_DOUBLE;
break;
case TK_STRUCT:
if (typetoken || signedness || typesize)
- CError_Error(121);
+ CError_Error(CErrorStr121);
tk = lex();
scanstruct(di, STRUCT_TYPE_STRUCT);
if (tk == TK_UU_ATTRIBUTE_UU)
@@ -2797,7 +2797,7 @@ restart:
return;
case TK_CLASS:
if (typetoken || signedness || typesize)
- CError_Error(121);
+ CError_Error(CErrorStr121);
tk = lex();
CDecl_ParseClass(di, CLASS_MODE_2, 1, 0);
if (tk == TK_UU_ATTRIBUTE_UU)
@@ -2809,7 +2809,7 @@ restart:
return;
case TK_UNION:
if (typetoken || signedness || typesize)
- CError_Error(121);
+ CError_Error(CErrorStr121);
tk = lex();
scanstruct(di, STRUCT_TYPE_UNION);
if (tk == TK_UU_ATTRIBUTE_UU)
@@ -2821,7 +2821,7 @@ restart:
return;
case TK_ENUM:
if (typetoken || signedness || typesize)
- CError_Error(121);
+ CError_Error(CErrorStr121);
tk = lex();
scanenum(di);
if (tk == TK_UU_ATTRIBUTE_UU)
@@ -2833,11 +2833,11 @@ restart:
return;
case TK_TYPENAME:
if (typetoken || signedness || typesize || di->x53)
- CError_Error(121);
+ CError_Error(CErrorStr121);
di->x53 = 1;
tk = lex();
if (tk != TK_COLON_COLON && tk != TK_IDENTIFIER) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
break;
}
goto some_shared_label;
@@ -2847,7 +2847,7 @@ restart:
goto some_shared_label;
case TK_UU_VECTOR:
if (typetoken || signedness || typesize)
- CError_Error(121);
+ CError_Error(CErrorStr121);
handle_vector:
if (CParser_GetVectorDeclSpec(&di->thetype)) {
if (tk == TK_CONST) {
@@ -2855,7 +2855,7 @@ restart:
di->qual |= Q_CONST;
tk = lex();
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
}
if (tk == TK_VOLATILE) {
@@ -2863,7 +2863,7 @@ restart:
di->qual |= Q_VOLATILE;
tk = lex();
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
}
return;
@@ -2871,7 +2871,7 @@ restart:
break;
case TK_UU_TYPEOF_UU:
if (typetoken || signedness || typesize)
- CError_Error(121);
+ CError_Error(CErrorStr121);
CParser_ParseTypeOf(di);
typetoken = -1;
goto bailOut;
@@ -2897,11 +2897,11 @@ restart:
case TPT_TYPE:
break;
case TPT_NONTYPE:
- CError_Error(348);
+ CError_Error(CErrorStr348);
pr.x8 = TYPE(&stsignedint);
break;
case TPT_TEMPLATE:
- CError_Error(230);
+ CError_Error(CErrorStr230);
pr.x8 = TYPE(&stsignedint);
break;
default:
@@ -2910,7 +2910,7 @@ restart:
break;
case TEMPLDEP_QUALNAME:
if (!di->x53 && !pr.x20 && di->x55)
- CError_Error(355);
+ CError_Error(CErrorStr355);
break;
case TEMPLDEP_TEMPLATE:
case TEMPLDEP_ARRAY:
@@ -2926,13 +2926,13 @@ restart:
if (!CParser_CheckTemplateClassUsage(TEMPL_CLASS(pr.x8), 0)) {
if (di->x56) {
if (di->qual)
- CError_Error(121);
+ CError_Error(CErrorStr121);
di->thetype = pr.x8;
di->x57 = 1;
tk = lex();
return;
} else {
- CError_Error(230);
+ CError_Error(CErrorStr230);
pr.x8 = TYPE(&stsignedint);
}
}
@@ -2952,7 +2952,7 @@ restart:
if (IS_TYPE_FUNC(OBJECT(di->x14->object)->type) && ((TYPE_FUNC(OBJECT(di->x14->object)->type)->flags & FUNC_FLAGS_1000) | FUNC_FLAGS_2000))
r23 = 0;
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
}
} else if (pr.obj_10) {
@@ -2964,20 +2964,20 @@ restart:
if (IS_TYPE_FUNC(di->x10->type) && ((TYPE_FUNC(di->x10->type)->flags & FUNC_FLAGS_1000) | FUNC_FLAGS_2000))
r23 = 0;
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
}
}
break;
case OT_ENUMCONST:
case OT_MEMBERVAR:
- CError_Error(121);
+ CError_Error(CErrorStr121);
break;
default:
CError_FATAL(4217);
}
} else if (pr.name_4) {
if (copts.cplusplus)
- CError_Error(121);
+ CError_Error(CErrorStr121);
} else if (pr.x21) {
CPrep_TokenStreamSetState(&state);
CPrep_UnLex();
@@ -2994,9 +2994,9 @@ restart:
di->x4A = 1;
if (r23) {
if (!di->storageclass && !di->qual && !di->exportflags)
- CError_Error(121);
+ CError_Error(CErrorStr121);
else
- CError_Warning(349);
+ CError_Warning(CErrorStr349);
}
}
if (typetoken >= 0)
@@ -3008,7 +3008,7 @@ restart:
return;
case ';':
if (!typetoken && !signedness && !typesize && copts.warn_emptydecl)
- CError_Warning(216);
+ CError_Warning(CErrorStr216);
if (typetoken >= 0)
di->thetype = getthetype(typetoken, typesize, signedness);
return;
@@ -3116,13 +3116,13 @@ void CParser_CheckAnonymousUnion(DeclInfo *di, Boolean flag) {
if (!di->storageclass && !di->qual)
return;
}
- CError_Warning(216);
+ CError_Warning(CErrorStr216);
}
return;
}
if (!flag && di->storageclass != TK_STATIC)
- CError_Error(177);
+ CError_Error(CErrorStr177);
if (flag && di->storageclass != TK_STATIC) {
obj = CParser_NewLocalDataObject(di, 1);
@@ -3210,7 +3210,7 @@ Object *CParser_ParseObject(void) {
return OBJECT(list->object);
obj = OBJECT(list->object);
- CError_Error(249, CError_GetObjectName(obj), obj->type, obj->qual, di.thetype, di.qual);
+ CError_Error(CErrorStr249, CError_GetObjectName(obj), obj->type, obj->qual, di.thetype, di.qual);
}
}
@@ -3228,7 +3228,7 @@ void CParser_ParseGlobalDeclaration(void) {
memclrw(&di, sizeof(DeclInfo));
CParser_GetDeclSpecs(&di, 1);
if (di.storageclass == TK_REGISTER || di.storageclass == TK_AUTO) {
- CError_Error(177);
+ CError_Error(CErrorStr177);
di.storageclass = 0;
}
@@ -3239,7 +3239,7 @@ void CParser_ParseGlobalDeclaration(void) {
tk = lex();
} else {
- CError_Error(102);
+ CError_Error(CErrorStr102);
}
}
@@ -3257,7 +3257,7 @@ static void CParser_ParseLinkageSpecification(DeclInfo *di) {
r29 = 8;
r28 = 1;
} else {
- CError_Error(121);
+ CError_Error(CErrorStr121);
r29 = 0;
r28 = 1;
}
@@ -3265,7 +3265,7 @@ static void CParser_ParseLinkageSpecification(DeclInfo *di) {
if ((tk = lex()) == '{') {
while (1) {
if ((tk = lex()) == 0) {
- CError_Error(130);
+ CError_Error(CErrorStr130);
return;
}
@@ -3292,7 +3292,7 @@ static void CParser_ParseLinkageSpecification(DeclInfo *di) {
if (di->storageclass != TK_TYPEDEF) {
if (di->storageclass && copts.pedantic)
- CError_Warning(177);
+ CError_Warning(CErrorStr177);
if (!di->storageclass)
di->storageclass = TK_EXTERN;
}
@@ -3321,7 +3321,7 @@ static void CParser_ParseNameSpace(DeclInfo *di) {
}
} else {
if (tk != '{') {
- CError_Error(107);
+ CError_Error(CErrorStr107);
return;
}
name = CParser_GetUnnamedNameSpaceName();
@@ -3352,20 +3352,20 @@ static void CParser_ParseNameSpace(DeclInfo *di) {
CScope_AddObject(cscope_current, name, OBJ_BASE(objns));
} else {
if (list->object->otype != OT_NAMESPACE)
- CError_Error(320);
+ CError_Error(CErrorStr320);
else
nspace = OBJ_NAMESPACE(list->object)->nspace;
}
if (tk != '{') {
- CError_Error(135);
+ CError_Error(CErrorStr135);
return;
}
CScope_SetNameSpaceScope(nspace, &save);
while (1) {
if ((tk = lex()) == 0) {
- CError_Error(130);
+ CError_Error(CErrorStr130);
break;
}
@@ -3400,9 +3400,9 @@ static void CParser_ParseDeclaration(DeclInfo *di) {
CParser_ParseNameSpace(di);
break;
case TK_EXPORT:
- CError_Error(190);
+ CError_Error(CErrorStr190);
if ((tk = lex()) != TK_TEMPLATE) {
- CError_Error(121);
+ CError_Error(CErrorStr121);
return;
}
case TK_TEMPLATE:
@@ -3427,7 +3427,7 @@ static void CParser_ParseDeclaration(DeclInfo *di) {
default:
CParser_GetDeclSpecs(di, 1);
if ((di->storageclass == TK_REGISTER || di->storageclass == TK_AUTO) != 0) {
- CError_Error(177);
+ CError_Error(CErrorStr177);
di->storageclass = 0;
}
if (tk != ';')
@@ -3442,7 +3442,7 @@ void cparser(void) {
DeclInfo di;
if (copts.crippled && copts.optimizationlevel > 1) {
- CError_Warning(385);
+ CError_Warning(CErrorStr385);
copts.optimizationlevel = 1;
CodeGen_UpdateOptimizerOptions();
CodeGen_UpdateBackEndOptions();
@@ -3459,7 +3459,7 @@ void cparser(void) {
} while (tk && (tk = lex()));
} else {
if (!copts.cplusplus && copts.ANSI_strict)
- CError_Error(102);
+ CError_Error(CErrorStr102);
}
CInit_DefineTentativeData();
diff --git a/compiler_and_linker/unsorted/CPrec.c b/compiler_and_linker/unsorted/CPrec.c
index 6e0692b..75608bf 100644
--- a/compiler_and_linker/unsorted/CPrec.c
+++ b/compiler_and_linker/unsorted/CPrec.c
@@ -172,7 +172,7 @@ static TemplArg *CPrec_GetTemplateArgPatch(TemplArg *arg);
static NameSpaceObjectList *CPrec_GetNameSpaceObjectListPatch(NameSpaceObjectList *nsol);
static OSErr CPrec_FlushBufferCheck(void);
-void SetupPrecompiler(void) {
+void SetupPrecompiler(Boolean isPrecompiling) {
cprec_refnum = 0;
cprec_glist.data = NULL;
cprec_header = NULL;
@@ -1455,7 +1455,7 @@ static TStreamElement *CPrec_GetTStreamPatch(TStreamElement *tokens, SInt32 coun
case TK_STRING_WIDE:
CPrec_RawMemPatch(&current->data.tkstring.data, tokens->data.tkstring.data, tokens->data.tkstring.size);
break;
- case TK_NEG7:
+ case TK_EOL:
break;
default:
if (tokens->tokentype < 0)
diff --git a/compiler_and_linker/unsorted/CTemplateClass.c b/compiler_and_linker/unsorted/CTemplateClass.c
index e0813e8..e180159 100644
--- a/compiler_and_linker/unsorted/CTemplateClass.c
+++ b/compiler_and_linker/unsorted/CTemplateClass.c
@@ -255,7 +255,7 @@ TemplClassInst *CTemplClass_GetInstance(TemplClass *tmclass, TemplArg *inst_args
return CTemplClass_NewInstance(tmclass, inst_args, oargs);
}
-TemplateMember *CTemplClass_DefineMember(TemplClass *tmclass, Object *object, FileOffsetInfo *foi, TStream *stream) {
+TemplateMember *CTemplClass_DefineMember(TemplClass *tmclass, Object *object, FileOffsetInfo *foi, TokenStream *stream) {
TemplateMember *member;
for (member = tmclass->members; member; member = member->next) {
diff --git a/compiler_and_linker/unsorted/CTemplateNew.c b/compiler_and_linker/unsorted/CTemplateNew.c
index 4fdfc37..ddda594 100644
--- a/compiler_and_linker/unsorted/CTemplateNew.c
+++ b/compiler_and_linker/unsorted/CTemplateNew.c
@@ -787,7 +787,7 @@ static void *CTempl_ParseMemberFunction(int unk1, int unk2, int unk3, Object *fu
static void CTempl_ParseMember(TemplParam *params, TemplClass *templ, DeclInfo *di, SInt32 *startOffset) {
Object *object;
NameSpaceObjectList *nsol;
- TStream stream;
+ TokenStream stream;
CPrepFileInfo *file;
SInt32 offset;
Boolean saveForceLoc;
diff --git a/compiler_and_linker/unsorted/CTemplateTools.c b/compiler_and_linker/unsorted/CTemplateTools.c
index 1d79ce0..bc7f8be 100644
--- a/compiler_and_linker/unsorted/CTemplateTools.c
+++ b/compiler_and_linker/unsorted/CTemplateTools.c
@@ -1005,7 +1005,7 @@ static TemplClassInst *CTemplTool_FindNestedClassInstance(TemplClass *a, TemplCl
break;
if ((inst->theclass.flags & (CLASS_FLAGS_2 | CLASS_FLAGS_800)) == CLASS_FLAGS_800)
- CTempl_InstantiateTemplateClass(inst);
+ CTempl_InstantiateTemplateClass(TYPE_CLASS(inst));
}
return inst;
diff --git a/compiler_and_linker/unsorted/CodeGen.c b/compiler_and_linker/unsorted/CodeGen.c
index 8268736..b79b423 100644
--- a/compiler_and_linker/unsorted/CodeGen.c
+++ b/compiler_and_linker/unsorted/CodeGen.c
@@ -873,7 +873,7 @@ void CodeGen_Generator(Statement *statements, Object *func, UInt8 mysteryFlag, B
}
if (cparamblkptr->isPrecompiling == 1)
- CError_Error(180);
+ CError_Error(CErrorStr180);
if (!func) {
func = createstaticinitobject();
@@ -919,7 +919,7 @@ void CodeGen_Generator(Statement *statements, Object *func, UInt8 mysteryFlag, B
initpcode();
pclabel(prologue = makepcblock(), makepclabel());
- prologue->flags |= fPCBlockFlag1;
+ prologue->flags |= fIsProlog;
pclabel(tmp = makepcblock(), makepclabel());
pcbranch(prologue, tmp->labels);
@@ -1019,7 +1019,7 @@ void CodeGen_Generator(Statement *statements, Object *func, UInt8 mysteryFlag, B
current_statement = NULL;
epilogue = pclastblock;
- pclastblock->flags |= fPCBlockFlag2;
+ pclastblock->flags |= fIsEpilogue;
pccomputepredecessors();
deleteunreachableblocks();
@@ -1278,18 +1278,18 @@ void CodeGen_ParseDeclSpec(HashNameNode *identifier, DeclInfo *declinfo) {
declinfo->storageclass = TK_EXTERN;
declinfo->exportflags = EXPORT_FLAGS_INTERNAL;
} else {
- CError_Error(176);
+ CError_Error(CErrorStr176);
}
}
static void CodeGen_EOLCheck(void) {
short t;
- if (plex() != TK_NEG7) {
- CPrep_Error(113);
+ if (plex() != TK_EOL) {
+ CPrep_Error(CErrorStr113);
do {
t = plex();
- } while (t != TK_NEG7 && t != 0);
+ } while (t != TK_EOL && t != 0);
}
}
@@ -1346,7 +1346,7 @@ static void pragma_scheduling(void) {
PPCError_Error(115);
return;
}
- CPrep_Error(186);
+ CPrep_Error(CErrorStr186);
return;
}
@@ -1382,7 +1382,7 @@ static void pragma_scheduling(void) {
cpu = 9;
break;
default:
- CPrep_Error(186);
+ CPrep_Error(CErrorStr186);
return;
}
schedule_for(cpu);
@@ -1390,7 +1390,7 @@ static void pragma_scheduling(void) {
}
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
static SInt32 CodeGen_ParseLongIntegerORonORoff(void) {
@@ -1403,7 +1403,7 @@ static SInt32 CodeGen_ParseLongIntegerORonORoff(void) {
if (!tkintconst.hi)
result = CInt64_GetULong(&tkintconst);
else
- CPrep_Error(154);
+ CPrep_Error(CErrorStr154);
CodeGen_EOLCheck();
} else if (t == TK_IDENTIFIER) {
if (!strcmp(tkidentifier->name, "on")) {
@@ -1415,11 +1415,11 @@ static SInt32 CodeGen_ParseLongIntegerORonORoff(void) {
return 0;
}
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
return 0;
} else {
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
}
return result;
@@ -1443,7 +1443,7 @@ void CodeGen_ParsePragma(HashNameNode *name) {
copts.report_heap_info = CInt64_GetULong(&tkintconst);
if (copts.report_heap_info < 0) {
copts.report_heap_info = 0;
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
} else if (t == TK_IDENTIFIER) {
if (!strcmp(tkidentifier->name, "off")) {
@@ -1451,11 +1451,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
copts.report_heap_info = 1;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
return;
@@ -1474,11 +1474,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
copts.ppc_unroll_speculative = 1;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
return;
@@ -1490,7 +1490,7 @@ void CodeGen_ParsePragma(HashNameNode *name) {
copts.ppc_unroll_instructions_limit = CInt64_GetULong(&tkintconst);
if (copts.ppc_unroll_instructions_limit < 0) {
copts.ppc_unroll_instructions_limit = 0;
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
} else if (t == TK_IDENTIFIER) {
if (!strcmp(tkidentifier->name, "off")) {
@@ -1498,11 +1498,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
copts.ppc_unroll_instructions_limit = 70;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
return;
@@ -1514,10 +1514,10 @@ void CodeGen_ParsePragma(HashNameNode *name) {
value = CInt64_GetULong(&tkintconst);
if (value < 0) {
copts.gen_fsel = 0;
- CError_Error(186);
+ CError_Error(CErrorStr186);
} else if (value > 255) {
copts.gen_fsel = 255;
- CError_Error(186);
+ CError_Error(CErrorStr186);
} else {
copts.gen_fsel = value;
}
@@ -1529,11 +1529,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "always")) {
copts.gen_fsel = 255;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
return;
@@ -1545,7 +1545,7 @@ void CodeGen_ParsePragma(HashNameNode *name) {
copts.ppc_unroll_factor_limit = CInt64_GetULong(&tkintconst);
if (copts.ppc_unroll_factor_limit < 0) {
copts.ppc_unroll_factor_limit = 0;
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
} else if (t == TK_IDENTIFIER) {
if (!strcmp(tkidentifier->name, "off")) {
@@ -1553,11 +1553,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
copts.ppc_unroll_factor_limit = 10;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
return;
@@ -1570,11 +1570,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
copts.altivec_model = 1;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
return;
@@ -1591,11 +1591,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "reset")) {
CPrep_PopOption(OPT_OFFSET(altivec_vrsave));
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
return;
@@ -1768,11 +1768,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
no_descriptors = 0;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
@@ -1787,11 +1787,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
copts.codegen_dynamic = 1;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
@@ -1809,11 +1809,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
copts.codegen_pic = 0;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
@@ -1827,11 +1827,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
copts.no_implicit_templates = 0;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
@@ -1845,11 +1845,11 @@ void CodeGen_ParsePragma(HashNameNode *name) {
} else if (!strcmp(tkidentifier->name, "on")) {
copts.no_common = 0;
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
return;
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
@@ -1866,7 +1866,7 @@ void CodeGen_ParsePragma(HashNameNode *name) {
}
}
} else {
- CError_Error(186);
+ CError_Error(CErrorStr186);
}
CodeGen_EOLCheck();
@@ -1874,12 +1874,12 @@ void CodeGen_ParsePragma(HashNameNode *name) {
}
if (copts.warn_illpragma)
- CPrep_Warning(186);
+ CPrep_Warning(CErrorStr186);
- if (plex() != TK_NEG7) {
+ if (plex() != TK_EOL) {
do {
t = plex();
- } while (t != TK_NEG7 && t != 0);
+ } while (t != TK_EOL && t != 0);
}
}
diff --git a/compiler_and_linker/unsorted/CodeMotion.c b/compiler_and_linker/unsorted/CodeMotion.c
index 00e8015..8ce2962 100644
--- a/compiler_and_linker/unsorted/CodeMotion.c
+++ b/compiler_and_linker/unsorted/CodeMotion.c
@@ -16,12 +16,12 @@ static int isloopinvariant(PCode *pcode, Loop *loop, UInt32 *vec, int flag1, int
RegUseOrDef *list;
int i;
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000)) {
+ if (pcode->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000)) {
if (pcode->alias) {
if (pcode->alias->type == AliasType2 || (pcode->flags & (fIsVolatile | fSideEffects)))
return 0;
- if (pcode->flags & fPCodeFlag2) {
+ if (pcode->flags & fIsRead) {
for (list = findobjectusedef(pcode->alias->object)->defs; list; list = list->next) {
if (
may_alias(pcode, Defs[list->id].pcode) &&
@@ -32,7 +32,7 @@ static int isloopinvariant(PCode *pcode, Loop *loop, UInt32 *vec, int flag1, int
}
}
- if (pcode->flags & fPCodeFlag4) {
+ if (pcode->flags & fIsWrite) {
for (list = findobjectusedef(pcode->alias->object)->uses; list; list = list->next) {
if (
may_alias(pcode, Uses[list->id].pcode) &&
@@ -46,7 +46,7 @@ static int isloopinvariant(PCode *pcode, Loop *loop, UInt32 *vec, int flag1, int
}
}
- if ((pcode->flags & fPCodeFlag4) && !bitvectorgetbit(pcode->block->blockIndex, loop->vec2C))
+ if ((pcode->flags & fIsWrite) && !bitvectorgetbit(pcode->block->blockIndex, loop->vec2C))
return 0;
op = pcode->args;
@@ -54,7 +54,7 @@ static int isloopinvariant(PCode *pcode, Loop *loop, UInt32 *vec, int flag1, int
while (i--) {
switch (op->kind) {
case PCOp_MEMORY:
- if ((pcode->flags & fPCodeFlag2) && ((pcode->flags == 0) & 0x40)) {
+ if ((pcode->flags & fIsRead) && ((pcode->flags == 0) & 0x40)) {
for (list = findobjectusedef(op->data.mem.obj)->defs; list; list = list->next) {
if (
may_alias(pcode, Defs[list->id].pcode) &&
@@ -64,7 +64,7 @@ static int isloopinvariant(PCode *pcode, Loop *loop, UInt32 *vec, int flag1, int
return 0;
}
}
- if (pcode->flags & fPCodeFlag4) {
+ if (pcode->flags & fIsWrite) {
for (list = findobjectusedef(op->data.mem.obj)->uses; list; list = list->next) {
if (
may_alias(pcode, Uses[list->id].pcode) &&
@@ -390,8 +390,8 @@ static int srawi_addze_isloopinvariant(PCode *pcode, Loop *loop, UInt32 *vec) {
nextInstr->op == PC_ADDZE &&
pcode->args[0].data.reg.reg == nextInstr->args[0].data.reg.reg &&
nextInstr->args[0].data.reg.reg == nextInstr->args[1].data.reg.reg &&
- !(pcode->flags & (fPCodeFlag8 | fPCodeFlag20 | fIsVolatile | fSideEffects)) &&
- !(nextInstr->flags & (fPCodeFlag8 | fPCodeFlag20 | fIsVolatile | fSideEffects)) &&
+ !(pcode->flags & (fIsCall | fIsPtrOp | fIsVolatile | fSideEffects)) &&
+ !(nextInstr->flags & (fIsCall | fIsPtrOp | fIsVolatile | fSideEffects)) &&
isloopinvariant(pcode, loop, vec, 1, 0) &&
srawi_addze_maymove(pcode, loop)
) {
@@ -469,7 +469,7 @@ static void movecmptopreheader(Loop *loop, PCodeBlock *block, PCode *pc1, PCode
PCode *pc3;
preheader = loop->preheader;
- if (PCODE_FLAG_SET_F(pc1) & fPCodeFlag20000000) {
+ if (PCODE_FLAG_SET_F(pc1) & fRecordBit) {
moveinvariantcomputation(pc1, loop);
} else {
deletepcode(pc1);
@@ -651,7 +651,7 @@ static void simpleunswitchloop(Loop *loop) {
myvec = oalloc(4 * ((number_of_Defs + 31) >> 5));
bitvectorcopy(myvec, usedefinfo[block26->blockIndex].defvec8, number_of_Defs);
for (pc25 = loop->preheader->nextBlock->firstPCode; pc25; pc25 = pc25->nextPCode) {
- if (!(PCODE_FLAG_SET_F(pc25) & (fPCodeFlag8 | fPCodeFlag20 | fIsVolatile | fSideEffects | fPCodeFlag20000000))) {
+ if (!(PCODE_FLAG_SET_F(pc25) & (fIsCall | fIsPtrOp | fIsVolatile | fSideEffects | fRecordBit))) {
if (isloopinvariant(pc25, loop, myvec, 0, 1))
break;
}
@@ -670,7 +670,7 @@ static void simpleunswitchloop(Loop *loop) {
pc29 = pc25->block->lastPCode;
if (
!pc29 ||
- !(pc29->flags & fPCodeFlag1) ||
+ !(pc29->flags & fIsBranch) ||
pc29->args[0].kind != PCOp_REGISTER ||
pc29->args[0].arg != RegClass_CRFIELD
)
@@ -850,9 +850,9 @@ static void moveinvariantsfromloop(Loop *loop) {
bitvectorcopy(myvec, usedefinfo[block->blockIndex].defvec8, number_of_Defs);
for (instr = block->firstPCode; instr; instr = nextInstr) {
nextInstr = instr->nextPCode;
- if (!(instr->flags & fPCodeFlag1) && instr->argCount) {
+ if (!(instr->flags & fIsBranch) && instr->argCount) {
if (
- !(instr->flags & (fPCodeFlag8 | fPCodeFlag20 | fIsVolatile | fSideEffects)) &&
+ !(instr->flags & (fIsCall | fIsPtrOp | fIsVolatile | fSideEffects)) &&
isloopinvariant(instr, loop, myvec, 0, 0) &&
maymove(instr, loop)
) {
diff --git a/compiler_and_linker/unsorted/Coloring.c b/compiler_and_linker/unsorted/Coloring.c
index f8ba156..82a87f3 100644
--- a/compiler_and_linker/unsorted/Coloring.c
+++ b/compiler_and_linker/unsorted/Coloring.c
@@ -197,7 +197,7 @@ static void rewritepcode(void) {
}
if (
- (instr->flags & fPCodeFlag10) &&
+ (instr->flags & fIsMove) &&
(instr->args[1].arg == coloring_class) &&
instr->args[1].data.reg.reg == instr->args[0].data.reg.reg
)
diff --git a/compiler_and_linker/unsorted/ConstantPropagation.c b/compiler_and_linker/unsorted/ConstantPropagation.c
index 4fe1d06..2b40453 100644
--- a/compiler_and_linker/unsorted/ConstantPropagation.c
+++ b/compiler_and_linker/unsorted/ConstantPropagation.c
@@ -128,7 +128,7 @@ static int isunsignedloadoperand(PCodeArg *op) {
PCode *instr;
if ((instr = defininginstruction[op->data.reg.reg])) {
- if (instr->flags & fPCodeFlag2) {
+ if (instr->flags & fIsRead) {
if (instr->op >= PC_LHZ && instr->op <= PC_LHZUX)
return 2;
if (instr->op >= PC_LBZ && instr->op <= PC_LBZUX)
@@ -173,7 +173,7 @@ static int issignedloadoperand(PCodeArg *op) {
PCode *instr;
if ((instr = defininginstruction[op->data.reg.reg])) {
- if (instr->flags & fPCodeFlag2) {
+ if (instr->flags & fIsRead) {
if (instr->op >= PC_LHA && instr->op <= PC_LHAUX)
return 2;
} else if (instr->op == PC_EXTSB) {
@@ -223,7 +223,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
break;
case PC_RLWINM:
if (
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
instr->args[2].data.imm.value == 0 &&
instr->args[4].data.imm.value == 31
)
@@ -279,7 +279,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
break;
case PC_EXTSH:
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
break;
if (isconstantoperand(&instr->args[1], &value1)) {
@@ -303,7 +303,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
break;
case PC_EXTSB:
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
break;
if (
@@ -332,7 +332,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
break;
case PC_ADDI:
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
break;
immAddend = instr->args[2].data.imm.value;
@@ -352,7 +352,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
break;
case PC_ADD:
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
break;
if (isconstantoperand(&instr->args[2], &value1)) {
@@ -418,7 +418,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
instr->args[1] = stackInstr->args[1];
instr->args[2] = stackInstr->args[2];
instr->args[2].data.imm.value = value1 + addend;
- if (instr->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000))
+ if (instr->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000))
instr->alias = make_alias(instr->args[2].data.imm.obj, instr->args[2].data.imm.value, 1);
propagatedconstants = 1;
changed = 1;
@@ -428,7 +428,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
break;
case PC_OR:
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
break;
value1 = 0;
@@ -494,7 +494,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
break;
case PC_SUBF:
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
break;
if (isconstantoperand(&instr->args[1], &value1) && FITS_IN_SHORT(-value1)) {
@@ -559,7 +559,7 @@ static void propagateconstantstoblock(PCodeBlock *block) {
instr->args[1] = stackInstr->args[1];
instr->args[2] = stackInstr->args[2];
instr->args[2].data.imm.value = value1 + addend;
- if (instr->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000))
+ if (instr->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000))
instr->alias = make_alias(instr->args[2].data.imm.obj, instr->args[2].data.imm.value,
nbytes_loaded_or_stored_by(instr));
propagatedconstants = 1;
diff --git a/compiler_and_linker/unsorted/CopyPropagation.c b/compiler_and_linker/unsorted/CopyPropagation.c
index 8662f61..af451a0 100644
--- a/compiler_and_linker/unsorted/CopyPropagation.c
+++ b/compiler_and_linker/unsorted/CopyPropagation.c
@@ -65,7 +65,7 @@ static void computecandidatelist(void) {
bitvectorcopy(vec, usedefinfo[block->blockIndex].usevec1C, number_of_Uses);
candidate = &Candidates[firstcandidateinblock[block->blockIndex] + ncandidatesinblock[block->blockIndex] - 1];
for (pcode = block->lastPCode; pcode; pcode = pcode->prevPCode) {
- if (!(pcode->flags & fPCodeFlag1) && pcode->argCount) {
+ if (!(pcode->flags & fIsBranch) && pcode->argCount) {
if (is_candidate(pcode)) {
reg = pcode->args[0].data.reg.reg;
candidate->pcode = pcode;
@@ -80,7 +80,7 @@ static void computecandidatelist(void) {
}
}
- if ((pcode->flags & fPCodeFlag2 | fPCodeFlag4) && (pcode->flags & fPCodeFlag2000000)) {
+ if ((pcode->flags & fIsRead | fIsWrite) && (pcode->flags & fUpdatesPtr)) {
for (list = reg_Uses[pcode->args[1].arg][pcode->args[1].data.reg.reg]; list; list = list->next) {
if (bitvectorgetbit(list->id, vec)) {
newlist = oalloc(sizeof(RegUseOrDef));
@@ -147,7 +147,7 @@ static void computelocalpropinfo(Boolean flag) {
if (flag) {
for (pcode = block->firstPCode; pcode; pcode = pcode->nextPCode) {
- if (!(pcode->flags & fPCodeFlag1) && pcode->argCount) {
+ if (!(pcode->flags & fIsBranch) && pcode->argCount) {
i = pcode->argCount;
op = pcode->args;
while (i--) {
@@ -176,7 +176,7 @@ static void computelocalpropinfo(Boolean flag) {
}
} else {
for (pcode = block->firstPCode; pcode; pcode = pcode->nextPCode) {
- if (!(pcode->flags & fPCodeFlag1) && pcode->argCount) {
+ if (!(pcode->flags & fIsBranch) && pcode->argCount) {
i = pcode->argCount;
op = pcode->args;
while (i--) {
@@ -286,7 +286,7 @@ int precedes(PCode *a, PCode *b) {
static int canidatepropagatestoalluses(int id) {
RegUseOrDef *list;
- if (PCODE_FLAG_SET_F(Candidates[id].pcode) & (fPCodeFlag20000000 | fSideEffects))
+ if (PCODE_FLAG_SET_F(Candidates[id].pcode) & (fRecordBit | fSideEffects))
return 0;
for (list = Candidates[id].list; list; list = list->next) {
@@ -349,7 +349,7 @@ void propagateinstructions(Object *proc, Propagation *config, int passCount, Boo
}
static int is_copy(PCode *pcode) {
- return (pcode->flags & fPCodeFlag10) && (pcode->args[0].data.reg.reg >= n_real_registers[pcode->args[0].arg]);
+ return (pcode->flags & fIsMove) && (pcode->args[0].data.reg.reg >= n_real_registers[pcode->args[0].arg]);
}
static int copypropagatestouse(int candidateID, int useID) {
@@ -368,7 +368,7 @@ static int copypropagatestouse(int candidateID, int useID) {
reg1 = pcode->args[0].data.reg.reg;
reg2 = pcode->args[1].data.reg.reg;
- if (use->pcode->flags & fPCodeFlag10)
+ if (use->pcode->flags & fIsMove)
return 0;
if (rclass == RegClass_GPR && use->pcode->op == PC_RLWIMI && use->pcode->args[0].data.reg.reg == reg1)
diff --git a/compiler_and_linker/unsorted/Exceptions.c b/compiler_and_linker/unsorted/Exceptions.c
index cd25577..14627cf 100644
--- a/compiler_and_linker/unsorted/Exceptions.c
+++ b/compiler_and_linker/unsorted/Exceptions.c
@@ -756,7 +756,7 @@ static int mergeexceptionactions(void) {
return 0;
for (pca = pc_actions; pca; pca = pca->next) {
- if (pca->firstInstr->block->flags & fPCBlockFlag20)
+ if (pca->firstInstr->block->flags & fDeleted)
deleteexceptionaction(pca);
}
diff --git a/compiler_and_linker/unsorted/FuncLevelAsmPPC.c b/compiler_and_linker/unsorted/FuncLevelAsmPPC.c
index e7fe347..6122800 100644
--- a/compiler_and_linker/unsorted/FuncLevelAsmPPC.c
+++ b/compiler_and_linker/unsorted/FuncLevelAsmPPC.c
@@ -85,7 +85,7 @@ void assign_local_addresses(void) {
for (list = locals; list; list = list->next) {
vi = CodeGen_GetNewVarInfo();
list->object->u.var.info = vi;
- list->object->flags |= OBJECT_FLAGS_UNUSED;
+ list->object->flags |= OBJECT_FLAGS_1;
vi->used = 1;
}
@@ -122,7 +122,7 @@ static void FuncAsm_PreScanDirectives(void) {
while (tk == TK_IDENTIFIER && (directive = InlineAsm_IsDirective(AssemblerType_0))) {
InlineAsm_ProcessDirective(directive);
- if (tk == ';' || tk == TK_NEG7) {
+ if (tk == ';' || tk == TK_EOL) {
CPrep_TokenStreamFlush();
tk = lex();
} else {
@@ -274,7 +274,7 @@ void Assembler(Object *func) {
branch_label(makepclabel());
epilogue = pclastblock;
- pclastblock->flags |= fPCBlockFlag2;
+ pclastblock->flags |= fIsEpilogue;
CheckCLabels();
if (fatalerrors)
@@ -325,7 +325,7 @@ void Assembler(Object *func) {
branch_label(makepclabel());
epilogue = pclastblock;
- pclastblock->flags |= fPCBlockFlag2;
+ pclastblock->flags |= fIsEpilogue;
pccomputepredecessors();
if (copts.debuglisting)
diff --git a/compiler_and_linker/unsorted/GCCInlineAsm.c b/compiler_and_linker/unsorted/GCCInlineAsm.c
index d0ae953..897df9b 100644
--- a/compiler_and_linker/unsorted/GCCInlineAsm.c
+++ b/compiler_and_linker/unsorted/GCCInlineAsm.c
@@ -31,7 +31,7 @@ void InlineAsm_SkipComment(void) {
static char gcc_parse_attribute(void) {
char ch;
- while (tk == TK_NEG7)
+ while (tk == TK_EOL)
tk = lex();
if (tk != '"')
@@ -57,7 +57,7 @@ static void gcc_parse_name(Boolean flag, char attribute) {
ENode *tempexpr;
Statement *stmt;
- while (tk == TK_NEG7)
+ while (tk == TK_EOL)
tk = lex();
if (tk != '(')
@@ -220,7 +220,7 @@ void InlineAsm_gcc_parse(void) {
gcc_name_list_index = -1;
cprep_eoltokens = 0;
- if (tk == TK_NEG7)
+ if (tk == TK_EOL)
tk = lex();
gcc_parse_output();
diff --git a/compiler_and_linker/unsorted/GenStabs.c b/compiler_and_linker/unsorted/GenStabs.c
index 0563efe..4dfe371 100644
--- a/compiler_and_linker/unsorted/GenStabs.c
+++ b/compiler_and_linker/unsorted/GenStabs.c
@@ -709,7 +709,7 @@ static int StabTypeID(Type *type) {
id = local_enum(type);
break;
case TYPESTRUCT:
- if (IS_TYPESTRUCT_VECTOR(type)) {
+ if (IS_TYPESTRUCT_VECTOR(TYPE_STRUCT(type))) {
switch (TYPE_STRUCT(type)->stype) {
case STRUCT_TYPE_4: return StabType_VectorUChar;
case STRUCT_TYPE_5: return StabType_VectorSChar;
diff --git a/compiler_and_linker/unsorted/InlineAsm.c b/compiler_and_linker/unsorted/InlineAsm.c
index e800327..ba6d2f2 100644
--- a/compiler_and_linker/unsorted/InlineAsm.c
+++ b/compiler_and_linker/unsorted/InlineAsm.c
@@ -35,7 +35,7 @@ void InlineAsm_SyntaxError(short code) {
if (backtracking)
longjmp(backtrack, 1);
- if (tk == TK_NEG7 || tk == ';')
+ if (tk == TK_EOL || tk == ';')
code = CErrorStr112;
CError_Error(code);
}
@@ -357,7 +357,7 @@ HashNameNode *MakeLocalLabel(CInt64 num) {
return GetHashNameNodeExport(buf);
}
-static void ScanOptionalLabel() {
+static void ScanOptionalLabel(void) {
if (tk == TK_INTCONST) {
if (lookahead() == ':') {
InlineAsm_DefineLabel(MakeLocalLabel(tkintconst));
@@ -385,17 +385,17 @@ static void ScanOptionalLabel() {
static void ScanStatements(volatile short endToken, UInt8 mode) {
if (setjmp(InlineAsm_assemblererror)) {
- while (tk != TK_NEG7 && tk != endToken && tk != '}' && tk)
+ while (tk != TK_EOL && tk != endToken && tk != '}' && tk)
tk = lex();
- if (tk == ';' || tk == TK_NEG7)
+ if (tk == ';' || tk == TK_EOL)
tk = lex();
} else {
InlineAsm_Initialize(mode);
InlineAsm_gccmode = 0;
if (setjmp(InlineAsm_assemblererror)) {
- while (tk != ';' && tk != TK_NEG7 && tk != endToken && tk != '}' && tk)
+ while (tk != ';' && tk != TK_EOL && tk != endToken && tk != '}' && tk)
tk = lex();
- if (tk == ';' || tk == TK_NEG7)
+ if (tk == ';' || tk == TK_EOL)
tk = lex();
}
@@ -431,7 +431,7 @@ static void ScanStatements(volatile short endToken, UInt8 mode) {
InlineAsm_gcc_parse();
}
- if (tk == ';' || tk == TK_NEG7) {
+ if (tk == ';' || tk == TK_EOL) {
CPrep_TokenStreamFlush();
tk = lex();
} else if (tk != endToken) {
diff --git a/compiler_and_linker/unsorted/InlineAsmPPC.c b/compiler_and_linker/unsorted/InlineAsmPPC.c
index e3a5f98..834432c 100644
--- a/compiler_and_linker/unsorted/InlineAsmPPC.c
+++ b/compiler_and_linker/unsorted/InlineAsmPPC.c
@@ -630,7 +630,7 @@ static void memoryoperand(IAOperand *op, InlineAsm *ia, Boolean flag, short effe
CError_Error(CErrorStr155);
}
- expr.object->flags |= OBJECT_FLAGS_UNUSED;
+ expr.object->flags |= OBJECT_FLAGS_1;
return;
}
@@ -679,7 +679,7 @@ static void memoryoperand(IAOperand *op, InlineAsm *ia, Boolean flag, short effe
op[0].u.obj.obj = expr.xC;
op[0].u.obj.offset = expr.value;
- expr.xC->flags |= OBJECT_FLAGS_UNUSED;
+ expr.xC->flags |= OBJECT_FLAGS_1;
return;
}
@@ -732,7 +732,7 @@ static void registeroperand(IAOperand *op, char rclass, short effect) {
op->u.reg.num = num;
op->u.reg.effect = effect;
if (obj) {
- reg->object->flags |= OBJECT_FLAGS_UNUSED;
+ reg->object->flags |= OBJECT_FLAGS_1;
Registers_GetVarInfo(obj)->flags |= VarInfoFlag40;
}
} else if (rclass == RegClass_CRFIELD) {
@@ -994,11 +994,11 @@ static InlineAsm *InlineAsm_ScanAssemblyOperands(IAMnemonic *mnemonic) {
info = &opcodeinfo[mnemonic->x4];
argcount = info->x8;
- if (PCODE_FLAG_SET_F(info) & fPCodeFlag8000000)
+ if (PCODE_FLAG_SET_F(info) & fCanSetRecordBit)
argcount++;
- if (!(PCODE_FLAG_SET_F(info) & fPCodeFlag10000000) && (PCODE_FLAG_SET_F(info) & fPCodeFlag4000000))
+ if (!(PCODE_FLAG_SET_F(info) & fSetsCarry) && (PCODE_FLAG_SET_F(info) & fCanSetCarry))
argcount++;
- if (PCODE_FLAG_SET_T(info) & fPCodeFlag2000000)
+ if (PCODE_FLAG_SET_T(info) & fCanLink)
argcount++;
buffersize = sizeof(InlineAsm) + sizeof(IAOperand) * argcount;
@@ -1669,7 +1669,7 @@ void InlineAsm_ProcessDirective(SInt32 directive) {
CError_Error(CErrorStr166);
tk = lex();
- if (tk != TK_NEG7 && tk != ';')
+ if (tk != TK_EOL && tk != ';')
fralloc_parameter_area_size = getimmediateoperand(0x20, 0x7FFE);
requires_frame = 1;
@@ -1832,9 +1832,9 @@ void InlineAsm_ScanAssemblyInstruction(void) {
CError_Error(CErrorStr261);
info = &opcodeinfo[mnemonic->x4];
- flag3 = (FLAG_SET_F(info->flags) & fPCodeFlag4000000) && (mnemonic->x10 & 0x400);
- flag4 = (FLAG_SET_T(info->flags) & fPCodeFlag20000000) && (mnemonic->x10 & 2);
- flag5 = (FLAG_SET_T(info->flags) & fPCodeFlag2000000) && (mnemonic->x10 & 1);
+ flag3 = (FLAG_SET_F(info->flags) & fCanSetCarry) && (mnemonic->x10 & 0x400);
+ flag4 = (FLAG_SET_T(info->flags) & fCanBeAbsolute) && (mnemonic->x10 & 2);
+ flag5 = (FLAG_SET_T(info->flags) & fCanLink) && (mnemonic->x10 & 1);
if ((cpu == CPUMask_Generic) && (cpu & CPUFLAG_LOW_MASK) != ((cpu & mnemonic->cpu) & CPUFLAG_LOW_MASK)) {
CError_Error(CErrorStr152);
@@ -1912,10 +1912,10 @@ static PCode *InlineAsm_TranslateIRtoPCodePPC(InlineAsm *ia, int argcount, Assem
extra_args = 0;
reg = 0;
- if ((PCODE_FLAG_SET_F(info) & fPCodeFlag8000000) && !(PCODE_FLAG_SET_F(info) & fPCodeFlag20000000))
+ if ((PCODE_FLAG_SET_F(info) & fCanSetRecordBit) && !(PCODE_FLAG_SET_F(info) & fRecordBit))
extra_args++;
- if (!(PCODE_FLAG_SET_F(info) & fPCodeFlag10000000) && (PCODE_FLAG_SET_F(info) & fPCodeFlag4000000))
+ if (!(PCODE_FLAG_SET_F(info) & fSetsCarry) && (PCODE_FLAG_SET_F(info) & fCanSetCarry))
extra_args++;
if (argcount < ia->argcount) {
@@ -1976,8 +1976,8 @@ static PCode *InlineAsm_TranslateIRtoPCodePPC(InlineAsm *ia, int argcount, Assem
case IAOpnd_Imm:
dest->kind = PCOp_IMMEDIATE;
dest->data.imm.value = src->u.imm.value;
- if (pc->flags & (fPCodeFlag2 | fPCodeFlag4))
- pc->flags |= fPCodeFlag20;
+ if (pc->flags & (fIsRead | fIsWrite))
+ pc->flags |= fIsPtrOp;
dest->data.imm.obj = NULL;
break;
@@ -2062,7 +2062,7 @@ static PCode *InlineAsm_TranslateIRtoPCodePPC(InlineAsm *ia, int argcount, Assem
dest->arg = src->u.obj.unk;
dest->data.mem.obj = src->u.obj.obj;
dest->data.mem.offset = src->u.obj.offset;
- if (pc->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000)) {
+ if (pc->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000)) {
pc->alias = make_alias(dest->data.mem.obj, dest->data.mem.offset, nbytes_loaded_or_stored_by(pc));
if (is_volatile_object(dest->data.mem.obj))
pc->flags |= fIsVolatile;
@@ -2076,8 +2076,8 @@ static PCode *InlineAsm_TranslateIRtoPCodePPC(InlineAsm *ia, int argcount, Assem
src->u.labdiff.label1->pclabel = makepclabel();
if (src->u.labdiff.label2->pclabel == NULL)
src->u.labdiff.label2->pclabel = makepclabel();
- if (pc->flags & (fPCodeFlag2 | fPCodeFlag4))
- pc->flags |= fPCodeFlag20;
+ if (pc->flags & (fIsRead | fIsWrite))
+ pc->flags |= fIsPtrOp;
dest->kind = PCOp_LABELDIFF;
dest->data.labeldiff.labelA = src->u.labdiff.label1->pclabel;
dest->data.labeldiff.labelB = src->u.labdiff.label2->pclabel;
@@ -2127,21 +2127,21 @@ void InlineAsm_TranslateIRtoPCode(Statement *stmt) {
setpcodeflags(fSideEffects);
if (ia->flags2 & IAFlagsB_1) {
- if (PCODE_FLAG_SET_F(pc) & fPCodeFlag8000000)
+ if (PCODE_FLAG_SET_F(pc) & fCanSetRecordBit)
pcsetrecordbit(pclastblock->lastPCode);
else
CError_Error(CErrorStr261);
}
if (ia->flags2 & IAFlagsB_2) {
- if (PCODE_FLAG_SET_F(pc) & fPCodeFlag4000000)
+ if (PCODE_FLAG_SET_F(pc) & fCanSetCarry)
setpcodeflags(fOverflow); // idk?
else
CError_Error(CErrorStr261);
}
if (ia->flags2 & IAFlagsB_4) {
- if (PCODE_FLAG_SET_T(pc) & fPCodeFlag20000000) {
+ if (PCODE_FLAG_SET_T(pc) & fCanBeAbsolute) {
int i;
for (i = 0; i < pc->argCount; i++) {
if (pc->args[i].kind == PCOp_LABEL || pc->args[i].kind == PCOp_MEMORY) {
@@ -2149,18 +2149,18 @@ void InlineAsm_TranslateIRtoPCode(Statement *stmt) {
break;
}
}
- setpcodeflags(fAbsolute); // idk?
+ setpcodeflags(fAbsolute);
} else {
CError_Error(CErrorStr261);
}
}
if (ia->flags2 & IAFlagsB_8) {
- if (PCODE_FLAG_SET_T(pc) & fPCodeFlag2000000) {
+ if (PCODE_FLAG_SET_T(pc) & fCanLink) {
pcsetlinkbit(pclastblock->lastPCode);
if (!(ia->flags & IAFlag2)) {
- pclastblock->lastPCode->flags &= ~fPCodeFlag8;
- pclastblock->lastPCode->flags |= fPCodeFlag1;
+ pclastblock->lastPCode->flags &= ~fIsCall;
+ pclastblock->lastPCode->flags |= fIsBranch;
}
makes_call = 1;
} else {
@@ -2169,9 +2169,9 @@ void InlineAsm_TranslateIRtoPCode(Statement *stmt) {
}
if (ia->flags2 & IAFlagsB_10)
- setpcodeflags(fPCodeFlag8000000);
+ setpcodeflags(fCanSetRecordBit);
if (ia->flags2 & IAFlagsB_20)
- setpcodeflags(fPCodeFlag4000000);
+ setpcodeflags(fCanSetCarry);
if (OPCODE_PART_1(opcodeinfo[pc->op].insn) == 16) {
PCodeLabel *dest = NULL;
@@ -2260,7 +2260,7 @@ static void savepicbase(short reg, HashNameNode *name) {
}
static SInt32 InlineAsm_OpcodeSize(InlineAsm *ia) {
- if (opcodeinfo[ia->opcode].flags & (fPCodeFlag2 | fPCodeFlag4)) {
+ if (opcodeinfo[ia->opcode].flags & (fIsRead | fIsWrite)) {
switch (ia->opcode) {
case PC_LBZ:
case PC_LBZU:
@@ -2353,11 +2353,11 @@ static SInt32 InlineAsm_OpcodeSize(InlineAsm *ia) {
CError_FATAL(3924);
}
} else {
- if (opcodeinfo[ia->opcode].flags & fPCodeFlag80000000)
+ if (opcodeinfo[ia->opcode].flags & fOpTypeGPR)
return 4;
- if (opcodeinfo[ia->opcode].flags & fPCodeFlag40000000)
+ if (opcodeinfo[ia->opcode].flags & fOpTypeFPR)
return 8;
- if (opcodeinfo[ia->opcode].flags & (fPCodeFlag80000000 | fPCodeFlag40000000))
+ if (opcodeinfo[ia->opcode].flags & fOpTypeVR)
return 16;
if (opcodeinfo[ia->opcode].flags & fSideEffects) {
@@ -2395,17 +2395,17 @@ void CodeGen_GetAsmEffects(Statement *stmt, IAEffects *effects) {
effects->x0 = 0;
effects->x5 = 0;
- if (info->flags & fPCodeFlag20) {
- if (info->flags & fPCodeFlag2)
+ if (info->flags & fIsPtrOp) {
+ if (info->flags & fIsRead)
effects->x1 = 1;
- if (info->flags & fPCodeFlag4)
+ if (info->flags & fIsWrite)
effects->x2 = 1;
}
- if (PCODE_FLAG_SET_T(info) & fPCodeFlag2000000) {
+ if (PCODE_FLAG_SET_T(info) & fCanLink) {
if (ia->flags2 & IAFlagsB_8)
effects->x4 = 1;
- else if ((info->flags & fPCodeFlag8) || (info->flags & fPCodeFlag4))
+ else if ((info->flags & fIsCall) || (info->flags & fIsWrite))
effects->x3 = 1;
if (ia->opcode == PC_B) {
@@ -2450,13 +2450,13 @@ void CodeGen_GetAsmEffects(Statement *stmt, IAEffects *effects) {
case IAOpnd_3:
case IAOpnd_4:
if (op->u.obj.obj) {
- if (info->flags & fPCodeFlag2) {
+ if (info->flags & fIsRead) {
effects->operands[effects->numoperands].type = IAEffect_0;
effects->operands[effects->numoperands].object = op->u.obj.obj;
effects->operands[effects->numoperands].offset = op->u.obj.offset;
effects->operands[effects->numoperands].size = InlineAsm_OpcodeSize(ia);
effects->numoperands++;
- } else if (!(info->flags & (fPCodeFlag1 | fPCodeFlag8))) {
+ } else if (!(info->flags & (fIsBranch | fIsCall))) {
effects->operands[effects->numoperands].type = IAEffect_3;
effects->operands[effects->numoperands].object = op->u.obj.obj;
effects->operands[effects->numoperands].offset = op->u.obj.offset;
@@ -2510,7 +2510,7 @@ void CodeGen_GetAsmEffects(Statement *stmt, IAEffects *effects) {
case IAOpnd_3:
case IAOpnd_4:
if (op->u.obj.obj) {
- if (info->flags & fPCodeFlag4) {
+ if (info->flags & fIsWrite) {
effects->operands[effects->numoperands].type = IAEffect_1;
effects->operands[effects->numoperands].object = op->u.obj.obj;
effects->operands[effects->numoperands].offset = op->u.obj.offset;
@@ -2524,7 +2524,7 @@ void CodeGen_GetAsmEffects(Statement *stmt, IAEffects *effects) {
CError_ASSERT(4151, (UInt32) effects->numoperands <= IAMaxOperands);
}
- if ((info->flags & (fPCodeFlag1 | fPCodeFlag8)) && (SInt32)effects->numlabels == 0)
+ if ((info->flags & (fIsBranch | fIsCall)) && (SInt32)effects->numlabels == 0)
effects->x3 = 1;
}
@@ -2556,7 +2556,7 @@ void CodeGen_PropagateIntoAsm(Statement *stmt, Object *obj, ENode *expr) {
break;
case IAOpnd_3:
case IAOpnd_4:
- if (!(opcodeinfo[ia->opcode].flags & (fPCodeFlag4 | fPCodeFlag40000)) &&
+ if (!(opcodeinfo[ia->opcode].flags & (fIsWrite | fPCodeFlag40000)) &&
ia->args[i].u.obj.obj == obj)
ia->args[i].u.obj.obj = newobj;
break;
diff --git a/compiler_and_linker/unsorted/InlineAsmRegisters.c b/compiler_and_linker/unsorted/InlineAsmRegisters.c
index 8dfba1e..251c345 100644
--- a/compiler_and_linker/unsorted/InlineAsmRegisters.c
+++ b/compiler_and_linker/unsorted/InlineAsmRegisters.c
@@ -14,7 +14,7 @@ typedef struct HashedRegister {
static HashedRegister *hashedregisters[64];
-void InlineAsm_InitializeRegisters() {
+void InlineAsm_InitializeRegisters(void) {
SInt32 i;
for (i = 0; i < 64; i++)
diff --git a/compiler_and_linker/unsorted/InstrSelection.c b/compiler_and_linker/unsorted/InstrSelection.c
index 1916711..0ea8bf9 100644
--- a/compiler_and_linker/unsorted/InstrSelection.c
+++ b/compiler_and_linker/unsorted/InstrSelection.c
@@ -139,7 +139,7 @@ void gen_POSTINCDEC(ENode *expr, short outputReg, short outputRegHi, Operand *ou
output->reg = (outputReg && outputReg != objReg) ? outputReg : ALLOC_FPR();
emitpcode(PC_FMR, output->reg, objReg);
fval = one_point_zero;
- load_floating_constant(constReg = ALLOC_FPR(), type, &fval.value);
+ load_floating_constant(constReg = ALLOC_FPR(), type, &fval);
if (ENODE_IS(expr, EPOSTINC)) {
emitpcode((type->size == 4) ? PC_FADDS : PC_FADD, objReg, objReg, constReg);
@@ -157,7 +157,7 @@ void gen_POSTINCDEC(ENode *expr, short outputReg, short outputRegHi, Operand *ou
emitpcode(PC_FMR, output->reg, b.reg);
fval = one_point_zero;
- load_floating_constant(constReg = ALLOC_FPR(), type, &fval.value);
+ load_floating_constant(constReg = ALLOC_FPR(), type, &fval);
finalReg = ALLOC_FPR();
if (ENODE_IS(expr, EPOSTINC))
@@ -2907,351 +2907,340 @@ void gen_condition(ENode *cond, Operand *output) {
void gen_condition_gpr(ENode *cond, Operand *output, short outputReg) {
ENode *left;
ENode *right;
- Operand op1;
+ Operand condOp;
+ int finalReg;
int tmpReg;
- int reg;
+ int tmpReg2;
+ int tmpReg3;
+ int tmpReg4;
int a;
int b;
left = cond->data.diadic.left;
right = cond->data.diadic.right;
- memclrw(&op1, sizeof(Operand));
+ memclrw(&condOp, sizeof(Operand));
if (!IS_TYPE_FLOAT(left->rtype)) {
+ Operand op1;
Operand op2;
- Operand op3;
- Operand op4;
+ Operand opTmp;
+ memclrw(&op1, sizeof(Operand));
memclrw(&op2, sizeof(Operand));
- memclrw(&op3, sizeof(Operand));
- memclrw(&op4, sizeof(Operand));
+ memclrw(&opTmp, sizeof(Operand));
if (right->hascall) {
- GEN_NODE(right, &op3);
+ GEN_NODE(right, &op2);
if (!IS_INT_CONST_ZERO(right)) {
if (right->rtype->size < 4)
- extend32(&op3, right->rtype, 0);
- ENSURE_GPR(&op3, right->rtype, 0);
+ extend32(&op2, right->rtype, 0);
+ ENSURE_GPR(&op2, right->rtype, 0);
}
- GEN_NODE(left, &op2);
+ GEN_NODE(left, &op1);
if (left->rtype->size < 4)
- extend32(&op2, left->rtype, 0);
- ENSURE_GPR(&op2, left->rtype, 0);
+ extend32(&op1, left->rtype, 0);
+ ENSURE_GPR(&op1, left->rtype, 0);
} else {
- GEN_NODE(left, &op2);
- ENSURE_GPR(&op2, left->rtype, 0);
+ GEN_NODE(left, &op1);
+ ENSURE_GPR(&op1, left->rtype, 0);
if (left->rtype->size < 4)
- extend32(&op2, left->rtype, 0);
+ extend32(&op1, left->rtype, 0);
- GEN_NODE(right, &op3);
+ GEN_NODE(right, &op2);
if (!IS_INT_CONST_ZERO(right)) {
if (right->rtype->size < 4)
- extend32(&op3, right->rtype, 0);
- ENSURE_GPR(&op3, right->rtype, 0);
+ extend32(&op2, right->rtype, 0);
+ ENSURE_GPR(&op2, right->rtype, 0);
}
}
switch (cond->type) {
case EEQU:
if (
- copts.peephole &&
- IS_INT_CONST(right) &&
- pclastblock->pcodeCount > 0) {
+ copts.peephole &&
+ IS_INT_CONST(right) &&
+ pclastblock->pcodeCount > 0 &&
+ pclastblock->lastPCode->op == PC_RLWINM &&
+ pclastblock->lastPCode->args[0].data.reg.reg == op1.reg
+ )
+ {
PCode *pc = pclastblock->lastPCode;
- if (pc->op == PC_RLWINM && pc->args[0].data.reg.reg == op2.reg) {
- SInt32 r6 = pc->args[2].data.imm.value;
- SInt32 r7 = pc->args[3].data.imm.value;
- SInt32 r3 = right->data.intval.lo;
- if (r7 == pc->args[4].data.imm.value) {
- reg = outputReg ? outputReg : ALLOC_GPR();
- if (r3 != (r3 & 1)) {
- emitpcode(PC_LI, reg, 0);
- } else if (r3 == 0) {
- int tmpreg = ALLOC_GPR();
- emitpcode(
- PC_RLWINM, tmpreg,
- pc->args[1].data.reg.reg,
- (r6 + r7 + 1) & 31, 31, 31);
- emitpcode(PC_XORI, reg, tmpreg, 1);
- } else if (r3 == 1) {
- emitpcode(
- PC_RLWINM, reg,
- pc->args[1].data.reg.reg,
- (r6 + r7 + 1) & 31, 31, 31);
- } else {
- CError_FATAL(5434);
- }
- output->optype = OpndType_GPR;
- output->reg = reg;
- return;
+ SInt32 a = pc->args[2].data.imm.value;
+ SInt32 b = pc->args[3].data.imm.value;
+ SInt32 value = right->data.intval.lo;
+ if (b == pc->args[4].data.imm.value) {
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+
+ if (value != (value & 1)) {
+ emitpcode(PC_LI, finalReg, 0);
+ } else if (value == 0) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(
+ PC_RLWINM, tmpReg,
+ pc->args[1].data.reg.reg,
+ (a + b + 1) & 31, 31, 31);
+ emitpcode(PC_XORI, finalReg, tmpReg, 1);
+ } else if (value == 1) {
+ emitpcode(
+ PC_RLWINM, finalReg,
+ pc->args[1].data.reg.reg,
+ (a + b + 1) & 31, 31, 31);
+ } else {
+ CError_FATAL(5434);
}
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
}
}
if (IS_INT_CONST_ZERO(right)) {
- //int tmpReg = ALLOC_GPR(); // affected
- int tmpReg;
- int t = used_virtual_registers[RegClass_GPR];
- used_virtual_registers[RegClass_GPR]++;
- emitpcode(PC_CNTLZW, t, op2.reg, 0);
- tmpReg = t;
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg, 27, 5, 31);
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_CNTLZW, tmpReg, op1.reg, 0);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg, 27, 5, 31);
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
return;
} else {
- int tmpReg, tmpReg2;
- tmpReg = ALLOC_GPR(); // affected
- emitpcode(PC_SUBF, tmpReg, op2.reg, op3.reg);
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg, op1.reg, op2.reg);
tmpReg2 = ALLOC_GPR();
emitpcode(PC_CNTLZW, tmpReg2, tmpReg);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg2, 27, 5, 31);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg2, 27, 5, 31);
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
return;
}
case ENOTEQU:
if (
- copts.peephole &&
- IS_INT_CONST(right) &&
- pclastblock->pcodeCount > 0) {
+ copts.peephole &&
+ IS_INT_CONST(right) &&
+ pclastblock->pcodeCount > 0 &&
+ pclastblock->lastPCode->op == PC_RLWINM &&
+ pclastblock->lastPCode->args[0].data.reg.reg == op1.reg
+ )
+ {
PCode *pc = pclastblock->lastPCode;
- if (pc->op == PC_RLWINM && pc->args[0].data.reg.reg == op2.reg) {
- SInt32 r6 = pc->args[2].data.imm.value;
- SInt32 r7 = pc->args[3].data.imm.value;
- SInt32 r3 = right->data.intval.lo;
- if (r7 == pc->args[4].data.imm.value) {
- reg = outputReg ? outputReg : ALLOC_GPR();
- if (r3 != (r3 & 1)) {
- emitpcode(PC_LI, reg, 1);
- } else if (r3 == 0) {
- emitpcode(
- PC_RLWINM, reg,
- pc->args[1].data.reg.reg,
- (r6 + r7 + 1) & 31, 31, 31);
- } else if (r3 == 1) {
- int tmpreg = ALLOC_GPR(); // affected
- emitpcode(
- PC_RLWINM, tmpreg,
- pc->args[1].data.reg.reg,
- (r6 + r7 + 1) & 31, 31, 31);
- emitpcode(PC_XORI, reg, tmpreg, 1);
- } else {
- CError_FATAL(5503);
- }
- output->optype = OpndType_GPR;
- output->reg = reg;
- return;
+ SInt32 a = pc->args[2].data.imm.value;
+ SInt32 b = pc->args[3].data.imm.value;
+ SInt32 value = right->data.intval.lo;
+ if (b == pc->args[4].data.imm.value) {
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+
+ if (value != (value & 1)) {
+ emitpcode(PC_LI, finalReg, 1);
+ } else if (value == 0) {
+ emitpcode(
+ PC_RLWINM, finalReg,
+ pc->args[1].data.reg.reg,
+ (a + b + 1) & 31, 31, 31);
+ } else if (value == 1) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(
+ PC_RLWINM, tmpReg,
+ pc->args[1].data.reg.reg,
+ (a + b + 1) & 31, 31, 31);
+ emitpcode(PC_XORI, finalReg, tmpReg, 1);
+ } else {
+ CError_FATAL(5503);
}
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
}
}
if (IS_INT_CONST_ZERO(right)) {
if (copts.optimize_for_size) {
- int tmpReg;
- tmpReg = ALLOC_GPR(); // affected
- emitpcode(PC_ADDIC, tmpReg, op2.reg, -1);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_SUBFE, reg, tmpReg, op2.reg);
- } else {
- int tmpReg, tmpReg2;
- // tmpReg, tmpReg2 swap
- tmpReg = ALLOC_GPR();
- emitpcode(PC_NEG, tmpReg, op2.reg);
- tmpReg2 = ALLOC_GPR();
- emitpcode(PC_OR, tmpReg2, tmpReg, op2.reg);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg2, 1, 31, 31);
- }
- output->optype = OpndType_GPR;
- output->reg = reg;
- return;
- } else {
- if (copts.optimize_for_size) {
- int tmpReg, tmpReg2;
- // tmpReg, tmpReg2 swap
tmpReg = ALLOC_GPR();
- emitpcode(PC_SUBF, tmpReg, op2.reg, op3.reg);
- tmpReg2 = ALLOC_GPR();
- emitpcode(PC_ADDIC, tmpReg2, tmpReg, -1);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_SUBFE, reg, tmpReg2, tmpReg);
+ emitpcode(PC_ADDIC, tmpReg, op1.reg, -1);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg, op1.reg);
} else {
- int tmpReg, tmpReg2, tmpReg3;
- // tmpReg, tmpReg2 swap
tmpReg = ALLOC_GPR();
- emitpcode(PC_SUBF, tmpReg, op2.reg, op3.reg);
+ emitpcode(PC_NEG, tmpReg, op1.reg);
tmpReg2 = ALLOC_GPR();
- emitpcode(PC_SUBF, tmpReg2, op3.reg, op2.reg);
- tmpReg3 = ALLOC_GPR();
- emitpcode(PC_OR, tmpReg3, tmpReg, tmpReg2);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg3, 1, 31, 31);
+ emitpcode(PC_OR, tmpReg2, tmpReg, op1.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg2, 1, 31, 31);
}
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
return;
}
+ if (copts.optimize_for_size) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg, op1.reg, op2.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_ADDIC, tmpReg2, tmpReg, -1);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg2, tmpReg);
+ } else {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg, op1.reg, op2.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg2, op2.reg, op1.reg);
+ tmpReg3 = ALLOC_GPR();
+ emitpcode(PC_OR, tmpReg3, tmpReg, tmpReg2);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg3, 1, 31, 31);
+ }
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+
case EGREATEREQU:
if (!is_unsigned(left->rtype) && IS_INT_CONST_ZERO(right)) {
- int tmpReg;
tmpReg = ALLOC_GPR();
- emitpcode(PC_RLWINM, tmpReg, op2.reg, 1, 31, 31);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_XORI, reg, tmpReg, 1);
+ emitpcode(PC_RLWINM, tmpReg, op1.reg, 1, 31, 31);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_XORI, finalReg, tmpReg, 1);
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
return;
}
- op4 = op3;
- op3 = op2;
- op2 = op4;
+ opTmp = op2;
+ op2 = op1;
+ op1 = opTmp;
+
case ELESSEQU:
if (is_unsigned(left->rtype)) {
if (copts.optimize_for_size) {
- int tmpReg, tmpReg2;
tmpReg = ALLOC_GPR();
emitpcode(PC_LI, tmpReg, -1);
tmpReg2 = ALLOC_GPR();
- emitpcode(PC_SUBFC, tmpReg2, op2.reg, op3.reg);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_SUBFZE, reg, tmpReg);
+ emitpcode(PC_SUBFC, tmpReg2, op1.reg, op2.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFZE, finalReg, tmpReg);
} else {
- int tmpReg, tmpReg2, tmpReg3, tmpReg4;
tmpReg = ALLOC_GPR();
- emitpcode(PC_SUBF, tmpReg, op2.reg, op3.reg);
+ emitpcode(PC_SUBF, tmpReg, op1.reg, op2.reg);
tmpReg2 = ALLOC_GPR();
- emitpcode(PC_ORC, tmpReg2, op3.reg, op2.reg);
+ emitpcode(PC_ORC, tmpReg2, op2.reg, op1.reg);
tmpReg3 = ALLOC_GPR();
emitpcode(PC_RLWINM, tmpReg3, tmpReg, 31, 1, 31);
tmpReg4 = ALLOC_GPR();
emitpcode(PC_SUBF, tmpReg4, tmpReg3, tmpReg2);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg4, 1, 31, 31);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg4, 1, 31, 31);
}
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
return;
}
if (IS_INT_CONST_ZERO(right)) {
- int tmpReg, tmpReg2;
tmpReg = ALLOC_GPR();
emitpcode(PC_LI, tmpReg, 1);
tmpReg2 = ALLOC_GPR();
- emitpcode(PC_CNTLZW, tmpReg2, op2.reg);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWNM, reg, tmpReg, tmpReg2, 31, 31);
- output->optype = OpndType_GPR;
- output->reg = reg;
- return;
- } else {
- int tmpReg, tmpReg2, tmpReg3;
- tmpReg2 = ALLOC_GPR();
- emitpcode(PC_SRAWI, tmpReg2, op3.reg, 31);
- tmpReg = ALLOC_GPR();
- emitpcode(PC_RLWINM, tmpReg, op2.reg, 1, 31, 31);
- tmpReg3 = ALLOC_GPR();
- emitpcode(PC_SUBFC, tmpReg3, op2.reg, op3.reg);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_ADDE, reg, tmpReg2, tmpReg);
+ emitpcode(PC_CNTLZW, tmpReg2, op1.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWNM, finalReg, tmpReg, tmpReg2, 31, 31);
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
return;
}
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_SRAWI, tmpReg2, op2.reg, 31);
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_RLWINM, tmpReg, op1.reg, 1, 31, 31);
+ tmpReg3 = ALLOC_GPR();
+ emitpcode(PC_SUBFC, tmpReg3, op1.reg, op2.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_ADDE, finalReg, tmpReg2, tmpReg);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+
case EGREATER:
if (!is_unsigned(left->rtype) && IS_INT_CONST_ZERO(right)) {
- int tmpReg, tmpReg2;
tmpReg = ALLOC_GPR();
- emitpcode(PC_NEG, tmpReg, op2.reg);
+ emitpcode(PC_NEG, tmpReg, op1.reg);
tmpReg2 = ALLOC_GPR();
- emitpcode(PC_ANDC, tmpReg2, tmpReg, op2.reg);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg2, 1, 31, 31);
+ emitpcode(PC_ANDC, tmpReg2, tmpReg, op1.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg2, 1, 31, 31);
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
return;
}
- op4 = op3;
- op3 = op2;
- op2 = op4;
+ opTmp = op2;
+ op2 = op1;
+ op1 = opTmp;
+
case ELESS:
if (is_unsigned(left->rtype)) {
if (left->rtype->size <= 2) {
- int tmpReg;
tmpReg = ALLOC_GPR();
- emitpcode(PC_SUBF, tmpReg, op3.reg, op2.reg);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg, 1, 31, 31);
+ emitpcode(PC_SUBF, tmpReg, op2.reg, op1.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg, 1, 31, 31);
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
} else {
if (copts.optimize_for_size) {
- int tmpReg, tmpReg2;
tmpReg = ALLOC_GPR();
- emitpcode(PC_SUBFC, tmpReg, op3.reg, op2.reg);
+ emitpcode(PC_SUBFC, tmpReg, op2.reg, op1.reg);
tmpReg2 = ALLOC_GPR();
emitpcode(PC_SUBFE, tmpReg2, tmpReg, tmpReg);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_NEG, reg, tmpReg2);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_NEG, finalReg, tmpReg2);
} else {
- int tmpReg, tmpReg2, tmpReg3;
tmpReg = ALLOC_GPR();
- emitpcode(PC_XOR, tmpReg, op3.reg, op2.reg);
+ emitpcode(PC_XOR, tmpReg, op2.reg, op1.reg);
tmpReg2 = ALLOC_GPR();
emitpcode(PC_CNTLZW, tmpReg2, tmpReg);
tmpReg3 = ALLOC_GPR();
- emitpcode(PC_SLW, tmpReg3, op3.reg, tmpReg2);
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg3, 1, 31, 31);
+ emitpcode(PC_SLW, tmpReg3, op2.reg, tmpReg2);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg3, 1, 31, 31);
}
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
return;
}
return;
- } else {
- if (IS_INT_CONST_ZERO(right)) {
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, op2.reg, 1, 31, 31);
- output->optype = OpndType_GPR;
- output->reg = reg;
- return;
- } else {
- int tmpReg, tmpReg2, tmpReg3, tmpReg4;
- tmpReg = ALLOC_GPR();
- emitpcode(PC_XOR, tmpReg, op3.reg, op2.reg);
- tmpReg2 = ALLOC_GPR();
- emitpcode(PC_SRAWI, tmpReg2, tmpReg, 1);
- tmpReg3 = ALLOC_GPR();
- emitpcode(PC_AND, tmpReg3, tmpReg, op3.reg);
- tmpReg4 = ALLOC_GPR();
- emitpcode(PC_SUBF, tmpReg4, tmpReg3, tmpReg2);
+ }
- reg = outputReg ? outputReg : ALLOC_GPR();
- emitpcode(PC_RLWINM, reg, tmpReg4, 1, 31, 31);
- output->optype = OpndType_GPR;
- output->reg = reg;
- return;
- }
+ if (IS_INT_CONST_ZERO(right)) {
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, op1.reg, 1, 31, 31);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
}
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_XOR, tmpReg, op2.reg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_SRAWI, tmpReg2, tmpReg, 1);
+ tmpReg3 = ALLOC_GPR();
+ emitpcode(PC_AND, tmpReg3, tmpReg, op2.reg);
+ tmpReg4 = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg4, tmpReg3, tmpReg2);
+
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_RLWINM, finalReg, tmpReg4, 1, 31, 31);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+
default:
CError_FATAL(5777);
}
}
- gen_condition(cond, &op1);
+ gen_condition(cond, &condOp);
emitpcode(PC_MFCR, tmpReg = used_virtual_registers[RegClass_GPR]++);
a = 0;
- b = op1.reg * 4;
- switch (op1.regOffset) {
+ b = condOp.reg * 4;
+ switch (condOp.regOffset) {
case ENOTEQU:
a = 1;
case EEQU:
@@ -3267,18 +3256,349 @@ void gen_condition_gpr(ENode *cond, Operand *output, short outputReg) {
break;
}
- reg = outputReg ? outputReg : ALLOC_GPR();
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
if (a) {
emitpcode(PC_RLWINM, tmpReg, tmpReg, b + 1, 31, 31);
- emitpcode(PC_XORI, reg, tmpReg, 1);
+ emitpcode(PC_XORI, finalReg, tmpReg, 1);
} else {
- emitpcode(PC_RLWINM, reg, tmpReg, b + 1, 31, 31);
+ emitpcode(PC_RLWINM, finalReg, tmpReg, b + 1, 31, 31);
}
output->optype = OpndType_GPR;
- output->reg = reg;
+ output->reg = finalReg;
}
void gen_negated_condition_gpr(ENode *cond, Operand *output, short outputReg) {
+ ENode *left;
+ ENode *right;
+ Operand op1;
+ Operand op2;
+ Operand opTmp;
+ int finalReg;
+ int tmpReg;
+ int tmpReg2;
+ int tmpReg3;
+
+ left = cond->data.diadic.left;
+ right = cond->data.diadic.right;
+ CError_ASSERT(5843, TYPE_FITS_IN_REGISTER(left->rtype) && TYPE_FITS_IN_REGISTER(right->rtype));
+
+ memclrw(&op1, sizeof(Operand));
+ memclrw(&op2, sizeof(Operand));
+ memclrw(&opTmp, sizeof(Operand));
+
+ if (right->hascall) {
+ GEN_NODE(right, &op2);
+ if (!IS_INT_CONST_ZERO(right)) {
+ if (right->rtype->size < 4)
+ extend32(&op2, right->rtype, 0);
+ ENSURE_GPR(&op2, right->rtype, 0);
+ }
+
+ GEN_NODE(left, &op1);
+ if (left->rtype->size < 4)
+ extend32(&op1, left->rtype, 0);
+ ENSURE_GPR(&op1, left->rtype, 0);
+ } else {
+ GEN_NODE(left, &op1);
+ ENSURE_GPR(&op1, left->rtype, 0);
+ if (left->rtype->size < 4)
+ extend32(&op1, left->rtype, 0);
+
+ GEN_NODE(right, &op2);
+ if (!IS_INT_CONST_ZERO(right)) {
+ if (right->rtype->size < 4)
+ extend32(&op2, right->rtype, 0);
+ ENSURE_GPR(&op2, right->rtype, 0);
+ }
+ }
+
+ switch (cond->type) {
+ case EEQU:
+ if (
+ copts.peephole &&
+ IS_INT_CONST(right) &&
+ pclastblock->pcodeCount > 0 &&
+ pclastblock->lastPCode->op == PC_RLWINM &&
+ pclastblock->lastPCode->args[0].data.reg.reg == op1.reg
+ )
+ {
+ PCode *pc = pclastblock->lastPCode;
+ SInt32 a = pc->args[2].data.imm.value;
+ SInt32 b = pc->args[3].data.imm.value;
+ SInt32 value = right->data.intval.lo;
+ if (b == pc->args[4].data.imm.value) {
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+
+ if (value != (value & 1)) {
+ emitpcode(PC_LI, finalReg, 0);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ if (value == 0) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(
+ PC_RLWINM, tmpReg,
+ pc->args[1].data.reg.reg,
+ (a + b + 1) & 31, 31, 31);
+ emitpcode(PC_ADDI, finalReg, tmpReg, 0, -1);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ if (value == 1) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(
+ PC_RLWINM,
+ tmpReg,
+ pc->args[1].data.reg.reg,
+ (a + b + 1) & 31,
+ 31,
+ 31);
+ emitpcode(PC_NEG, finalReg, tmpReg);
+ output->optype = OpndType_GPR;
+ output->reg = tmpReg; // bug???
+ return;
+ }
+
+ CError_FATAL(5923);
+ }
+ }
+
+ if (IS_INT_CONST_ZERO(right)) {
+ if (copts.optimize_for_size) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_ADDIC, tmpReg, op1.reg, -1);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg, tmpReg);
+ } else {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_CNTLZW, tmpReg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_RLWINM, tmpReg2, tmpReg, 27, 31, 31);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_NEG, finalReg, tmpReg2);
+ }
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ if (copts.optimize_for_size) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg, op2.reg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_ADDIC, tmpReg2, tmpReg, -1);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg2, tmpReg2);
+ } else {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg, op2.reg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg2, op1.reg, op2.reg);
+ tmpReg3 = ALLOC_GPR();
+ emitpcode(PC_NOR, tmpReg3, tmpReg, tmpReg2);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SRAWI, finalReg, tmpReg3, 31);
+ }
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+
+ case ENOTEQU:
+ if (
+ copts.peephole &&
+ IS_INT_CONST(right) &&
+ pclastblock->pcodeCount > 0 &&
+ pclastblock->lastPCode->op == PC_RLWINM &&
+ pclastblock->lastPCode->args[0].data.reg.reg == op1.reg
+ )
+ {
+ PCode *pc = pclastblock->lastPCode;
+ SInt32 a = pc->args[2].data.imm.value;
+ SInt32 b = pc->args[3].data.imm.value;
+ SInt32 value = right->data.intval.lo;
+ if (b == pc->args[4].data.imm.value) {
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+
+ if (value != (value & 1)) {
+ emitpcode(PC_LI, finalReg, -1);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ if (value == 0) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(
+ PC_RLWINM, tmpReg,
+ pc->args[1].data.reg.reg,
+ (a + b + 1) & 31, 31, 31);
+ emitpcode(PC_NEG, finalReg, tmpReg);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ if (value == 1) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(
+ PC_RLWINM, tmpReg,
+ pc->args[1].data.reg.reg,
+ (a + b + 1) & 31, 31, 31);
+ emitpcode(PC_ADDI, finalReg, tmpReg, 0, -1);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ CError_FATAL(6031);
+ }
+ }
+
+ if (IS_INT_CONST_ZERO(right)) {
+ if (copts.optimize_for_size) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBFIC, tmpReg, op1.reg, 0);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg, tmpReg);
+ } else {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_NEG, tmpReg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_OR, tmpReg2, tmpReg, op1.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SRAWI, finalReg, tmpReg2, 31);
+ }
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ if (copts.optimize_for_size) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg, op2.reg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_SUBFIC, tmpReg2, tmpReg, 0);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg2, tmpReg2);
+ } else {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg, op2.reg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg2, op1.reg, op2.reg);
+ tmpReg3 = ALLOC_GPR();
+ emitpcode(PC_OR, tmpReg3, tmpReg, tmpReg2);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SRAWI, finalReg, tmpReg3, 31);
+ }
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+
+ case EGREATEREQU:
+ if (!is_unsigned(left->rtype) && IS_INT_CONST_ZERO(right)) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_RLWINM, tmpReg, op1.reg, 1, 31, 31);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_ADDI, finalReg, tmpReg, 0, -1);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+ opTmp = op2;
+ op2 = op1;
+ op1 = opTmp;
+
+ case ELESSEQU:
+ if (is_unsigned(left->rtype)) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBFC, tmpReg, op1.reg, op2.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_ADDZE, tmpReg2, op1.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBF, finalReg, tmpReg2, op1.reg);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ if (IS_INT_CONST_ZERO(right)) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_NEG, tmpReg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_ORC, tmpReg2, op1.reg, tmpReg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SRAWI, finalReg, tmpReg2, 31);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_XORIS, tmpReg, op1.reg, 0x8000);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_SUBF, tmpReg2, op1.reg, op2.reg);
+ tmpReg3 = ALLOC_GPR();
+ emitpcode(PC_ADDC, tmpReg3, tmpReg2, tmpReg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg3, tmpReg3);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+
+ case EGREATER:
+ if (!is_unsigned(left->rtype) && IS_INT_CONST_ZERO(right)) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_NEG, tmpReg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_ANDC, tmpReg2, tmpReg, op1.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SRAWI, finalReg, tmpReg2, 31);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+ opTmp = op2;
+ op2 = op1;
+ op1 = opTmp;
+
+ case ELESS:
+ if (is_unsigned(left->rtype)) {
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBFC, tmpReg, op2.reg, op1.reg);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg, tmpReg);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ if (IS_INT_CONST_ZERO(right)) {
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SRAWI, finalReg, op1.reg, 31);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+ }
+
+ tmpReg = ALLOC_GPR();
+ emitpcode(PC_SUBFC, tmpReg, op2.reg, op1.reg);
+ tmpReg2 = ALLOC_GPR();
+ emitpcode(PC_RLWINM, tmpReg2, op2.reg, 1, 31, 31);
+ tmpReg3 = ALLOC_GPR();
+ emitpcode(PC_RLWINM, tmpReg3, op1.reg, 1, 31, 31);
+ finalReg = outputReg ? outputReg : ALLOC_GPR();
+ emitpcode(PC_SUBFE, finalReg, tmpReg3, tmpReg2);
+ output->optype = OpndType_GPR;
+ output->reg = finalReg;
+ return;
+
+ default:
+ CError_FATAL(6240);
+ }
}
void compare_floating(short nt, ENode *left, ENode *right, Operand *output) {
@@ -3347,9 +3667,127 @@ void compare_integer(short nt, ENode *left, ENode *right, Operand *output) {
}
void compare_immediate(short nt, ENode *left, SInt32 value, Operand *output) {
+ int postIncFlag;
+ short postIncReg;
+ Operand op;
+ SInt32 postIncValue;
+
+ memclrw(&op, sizeof(Operand));
+
+ postIncFlag = ispostincrementopportunity(left, &op, &postIncValue);
+ if (!postIncFlag) {
+ GEN_NODE(left, &op);
+ if (op.optype != OpndType_CRField) {
+ if (left->rtype->size < 4)
+ extend32(&op, left->rtype, 0);
+ else
+ ENSURE_GPR(&op, left->rtype, 0);
+ }
+ } else {
+ postIncReg = op.reg;
+ if (left->rtype->size < 4)
+ extend32(&op, left->rtype, 0);
+ ENSURE_GPR(&op, left->rtype, 0);
+ }
+
+ if (op.optype == OpndType_CRField) {
+ if (
+ (nt == EEQU && value == 1) ||
+ (nt == ENOTEQU && value == 0) ||
+ (nt == EGREATER && value == 0) ||
+ (nt == EGREATEREQU && value == 1)
+ )
+ {
+ *output = op;
+ return;
+ }
+
+ if (
+ (nt == EEQU && value == 0) ||
+ (nt == ENOTEQU && value == 1) ||
+ (nt == ELESS && value == 1) ||
+ (nt == ELESSEQU && value == 0)
+ )
+ {
+ *output = op;
+ switch (op.regOffset) {
+ case EEQU:
+ output->regOffset = ENOTEQU;
+ return;
+ case ENOTEQU:
+ output->regOffset = EEQU;
+ return;
+ case ELESS:
+ output->regOffset = EGREATEREQU;
+ return;
+ case EGREATER:
+ output->regOffset = ELESSEQU;
+ return;
+ case ELESSEQU:
+ output->regOffset = EGREATER;
+ return;
+ case EGREATEREQU:
+ output->regOffset = ELESS;
+ return;
+ }
+ }
+
+ ENSURE_GPR(&op, left->rtype, 0);
+ }
+
+ if (
+ copts.peephole &&
+ value == 0 &&
+ pclastblock->pcodeCount > 0 &&
+ pclastblock->lastPCode->op != PC_RLWINM &&
+ (PCODE_FLAG_SET_F(pclastblock->lastPCode) & (fIsMove | fSideEffects | fCanSetRecordBit | fOpTypeGPR)) == (fCanSetRecordBit | fOpTypeGPR) &&
+ pclastblock->lastPCode->args[0].data.reg.reg == op.reg &&
+ (!is_unsigned(left->rtype) || nt == EEQU || nt == ENOTEQU)
+ )
+ {
+ pcsetrecordbit(pclastblock->lastPCode);
+ } else {
+ emitpcode(is_unsigned(left->rtype) ? PC_CMPLI : PC_CMPI, 0, op.reg, value);
+ }
+
+ if (postIncFlag)
+ add_register_immediate(postIncReg, postIncReg, postIncValue);
+
+ output->optype = OpndType_CRField;
+ output->reg = 0;
+ output->regOffset = nt;
}
void compare_immediate_long(short nt, ENode *left, SInt32 value, Operand *output) {
+ int postIncFlag;
+ short postIncReg;
+ int outputReg;
+ Operand op;
+ SInt32 postIncValue;
+
+ memclrw(&op, sizeof(Operand));
+
+ postIncFlag = ispostincrementopportunity(left, &op, &postIncValue);
+ if (!postIncFlag) {
+ GEN_NODE(left, &op);
+ } else {
+ postIncReg = op.reg;
+ }
+
+ if (left->rtype->size < 4)
+ extend32(&op, left->rtype, 0);
+ ENSURE_GPR(&op, left->rtype, 0);
+
+ outputReg = ALLOC_GPR();
+ emitpcode(PC_ADDIS, outputReg, op.reg, 0, (SInt16) (~(value >> 16) + 1));
+ emitpcode(PC_CMPLI, 0, outputReg, value & 0xFFFF);
+
+ if (postIncFlag)
+ add_register_immediate(postIncReg, postIncReg, postIncValue);
+
+ output->optype = OpndType_CRField;
+ output->reg = 0;
+ output->regOffset = nt;
}
static int ismask(SInt32 value, short *first, short *last) {
@@ -3729,12 +4167,123 @@ void I8_gen_SUB(ENode *expr, short outputReg, short outputRegHi, Operand *output
}
void I8_gen_XOR(ENode *expr, short outputReg, short outputRegHi, Operand *output) {
+ ENode *left;
+ ENode *right;
+ short reg;
+ short regHi;
+ Operand opleft;
+ Operand opright;
+
+ left = expr->data.diadic.left;
+ right = expr->data.diadic.right;
+ memclrw(&opleft, sizeof(Operand));
+ memclrw(&opright, sizeof(Operand));
+
+ if (right->hascall) {
+ GEN_NODE(right, &opright);
+ coerce_to_register_pair(&opright, right->rtype, 0, 0);
+
+ GEN_NODE(left, &opleft);
+ coerce_to_register_pair(&opleft, left->rtype, 0, 0);
+ } else {
+ GEN_NODE(left, &opleft);
+ coerce_to_register_pair(&opleft, left->rtype, 0, 0);
+
+ GEN_NODE(right, &opright);
+ coerce_to_register_pair(&opright, right->rtype, 0, 0);
+ }
+
+ CError_ASSERT(7254, opleft.optype == OpndType_GPRPair && opright.optype == OpndType_GPRPair);
+
+ reg = outputReg ? outputReg : ALLOC_GPR();
+ regHi = outputRegHi ? outputRegHi : ALLOC_GPR();
+
+ emitpcode(PC_XOR, reg, opleft.reg, opright.reg);
+ emitpcode(PC_XOR, regHi, opleft.regHi, opright.regHi);
+
+ output->optype = OpndType_GPRPair;
+ output->reg = reg;
+ output->regHi = regHi;
}
void I8_gen_OR(ENode *expr, short outputReg, short outputRegHi, Operand *output) {
+ ENode *left;
+ ENode *right;
+ short reg;
+ short regHi;
+ Operand opleft;
+ Operand opright;
+
+ left = expr->data.diadic.left;
+ right = expr->data.diadic.right;
+ memclrw(&opleft, sizeof(Operand));
+ memclrw(&opright, sizeof(Operand));
+
+ if (right->hascall) {
+ GEN_NODE(right, &opright);
+ coerce_to_register_pair(&opright, right->rtype, 0, 0);
+
+ GEN_NODE(left, &opleft);
+ coerce_to_register_pair(&opleft, left->rtype, 0, 0);
+ } else {
+ GEN_NODE(left, &opleft);
+ coerce_to_register_pair(&opleft, left->rtype, 0, 0);
+
+ GEN_NODE(right, &opright);
+ coerce_to_register_pair(&opright, right->rtype, 0, 0);
+ }
+
+ CError_ASSERT(7304, opleft.optype == OpndType_GPRPair && opright.optype == OpndType_GPRPair);
+
+ reg = outputReg ? outputReg : ALLOC_GPR();
+ regHi = outputRegHi ? outputRegHi : ALLOC_GPR();
+
+ emitpcode(PC_OR, reg, opleft.reg, opright.reg);
+ emitpcode(PC_OR, regHi, opleft.regHi, opright.regHi);
+
+ output->optype = OpndType_GPRPair;
+ output->reg = reg;
+ output->regHi = regHi;
}
void I8_gen_AND(ENode *expr, short outputReg, short outputRegHi, Operand *output) {
+ ENode *left;
+ ENode *right;
+ short reg;
+ short regHi;
+ Operand opleft;
+ Operand opright;
+
+ left = expr->data.diadic.left;
+ right = expr->data.diadic.right;
+ memclrw(&opleft, sizeof(Operand));
+ memclrw(&opright, sizeof(Operand));
+
+ if (right->hascall) {
+ GEN_NODE(right, &opright);
+ coerce_to_register_pair(&opright, right->rtype, 0, 0);
+
+ GEN_NODE(left, &opleft);
+ coerce_to_register_pair(&opleft, left->rtype, 0, 0);
+ } else {
+ GEN_NODE(left, &opleft);
+ coerce_to_register_pair(&opleft, left->rtype, 0, 0);
+
+ GEN_NODE(right, &opright);
+ coerce_to_register_pair(&opright, right->rtype, 0, 0);
+ }
+
+ CError_ASSERT(7354, opleft.optype == OpndType_GPRPair && opright.optype == OpndType_GPRPair);
+
+ reg = outputReg ? outputReg : ALLOC_GPR();
+ regHi = outputRegHi ? outputRegHi : ALLOC_GPR();
+
+ emitpcode(PC_AND, reg, opleft.reg, opright.reg);
+ emitpcode(PC_AND, regHi, opleft.regHi, opright.regHi);
+
+ output->optype = OpndType_GPRPair;
+ output->reg = reg;
+ output->regHi = regHi;
}
int I8_getbit(UInt64 val) {
@@ -4173,7 +4722,7 @@ void I8_gen_ASS(ENode *expr, short outputReg, short outputRegHi, Operand *output
if (ENODE_IS(left, EINDIRECT))
left = left->data.monadic;
else
- CError_FATAL(8238);
+ CError_FATAL(8328);
right = expr->data.cond.expr2;
} else {
left = expr->data.diadic.left;
diff --git a/compiler_and_linker/unsorted/InterferenceGraph.c b/compiler_and_linker/unsorted/InterferenceGraph.c
index f714b13..a849d1a 100644
--- a/compiler_and_linker/unsorted/InterferenceGraph.c
+++ b/compiler_and_linker/unsorted/InterferenceGraph.c
@@ -64,7 +64,7 @@ static void buildinterferencematrix(void) {
for (j = 0; j < regs; j++) {
if (bitvectorgetbit(j, vec)) {
if (
- (instr->flags & fPCodeFlag10) &&
+ (instr->flags & fIsMove) &&
PC_OP_IS_ANY_REGISTER(&instr->args[0], coloring_class) &&
instr->args[1].data.reg.reg == j
)
@@ -89,10 +89,10 @@ static void buildinterferencematrix(void) {
}
if (coloring_class == RegClass_GPR) {
- if (PCODE_FLAG_SET_F(instr) & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag40000)) {
+ if (PCODE_FLAG_SET_F(instr) & (fIsRead | fIsWrite | fPCodeFlag40000)) {
if (instr->args[1].data.reg.reg >= n_real_registers[coloring_class])
makeinterfere(0, instr->args[1].data.reg.reg);
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag2000000)
+ if (PCODE_FLAG_SET_F(instr) & fUpdatesPtr)
makeinterfere(instr->args[0].data.reg.reg, instr->args[1].data.reg.reg);
} else {
switch (instr->op) {
@@ -119,7 +119,7 @@ static void buildinterferencematrix(void) {
}
}
- if (coloring_class == RegClass_GPR && (instr->flags & fPCodeFlag8)) {
+ if (coloring_class == RegClass_GPR && (instr->flags & fIsCall)) {
i = branch_count_volatiles();
op = instr->args;
CError_ASSERT(219, instr->argCount != 0);
@@ -168,8 +168,8 @@ static void coalescenodes(void) {
for (block = pcbasicblocks; block; block = block->nextBlock) {
for (instr = block->firstPCode; instr; instr = instr->nextPCode) {
- if ((instr->flags & fPCodeFlag10) && !(instr->flags & fSideEffects)) {
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) {
+ if ((instr->flags & fIsMove) && !(instr->flags & fSideEffects)) {
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit) {
CError_FATAL(309);
continue;
}
diff --git a/compiler_and_linker/unsorted/IroDump.c b/compiler_and_linker/unsorted/IroDump.c
index 9472a0f..22f5041 100644
--- a/compiler_and_linker/unsorted/IroDump.c
+++ b/compiler_and_linker/unsorted/IroDump.c
@@ -566,7 +566,7 @@ void IRO_SpellType(Type *type, char *buf) {
strcat(buf, TYPE_ENUM(type)->enumname->name);
break;
case TYPESTRUCT:
- if (IS_TYPESTRUCT_VECTOR(type)) {
+ if (IS_TYPESTRUCT_VECTOR(TYPE_STRUCT(type))) {
switch (TYPE_STRUCT(type)->stype) {
case STRUCT_TYPE_4:
strcpy(buf, "vector unsigned char ");
diff --git a/compiler_and_linker/unsorted/IroLinearForm.c b/compiler_and_linker/unsorted/IroLinearForm.c
index c44a90c..2ac1d0a 100644
--- a/compiler_and_linker/unsorted/IroLinearForm.c
+++ b/compiler_and_linker/unsorted/IroLinearForm.c
@@ -79,10 +79,10 @@ static void MarkAssigned(IROLinear *linear, Boolean flag) {
rec = IRO_InitAddrRecordPointer(inner);
IRO_DecomposeAddressExpression(inner, rec);
if (rec->numObjRefs == 1 && IS_LINEAR_ENODE(inner->u.diadic.left, EOBJREF)) {
- rec->objRefs->element->flags |= IROLF_Assigned;
+ ((IROLinear *) rec->objRefs->element)->flags |= IROLF_Assigned;
if (flag) {
linear->flags |= IROLF_Used;
- rec->objRefs->element->flags |= IROLF_Used;
+ ((IROLinear *) rec->objRefs->element)->flags |= IROLF_Used;
}
}
}
@@ -116,10 +116,10 @@ static void MarkAssigned(IROLinear *linear, Boolean flag) {
rec = IRO_InitAddrRecordPointer(inner);
IRO_DecomposeAddressExpression(inner, rec);
if (rec->numObjRefs == 1 && IS_LINEAR_ENODE(inner->u.diadic.left, EOBJREF)) {
- rec->objRefs->element->flags |= IROLF_Assigned;
+ ((IROLinear *) rec->objRefs->element)->flags |= IROLF_Assigned;
if (flag) {
linear->flags |= IROLF_Used;
- rec->objRefs->element->flags |= IROLF_Used;
+ ((IROLinear *) rec->objRefs->element)->flags |= IROLF_Used;
}
}
}
@@ -248,7 +248,7 @@ static void MarkSubs1(IROLinear *linear) {
rec = IRO_InitAddrRecordPointer(linear);
IRO_DecomposeAddressExpression(linear, rec);
if (rec->numObjRefs == 1 && IS_LINEAR_ENODE(linear->u.diadic.left, EOBJREF))
- rec->objRefs->element->flags |= IROLF_Ind;
+ ((IROLinear *) rec->objRefs->element)->flags |= IROLF_Ind;
}
}
diff --git a/compiler_and_linker/unsorted/IroPointerAnalysisADTs.c b/compiler_and_linker/unsorted/IroPointerAnalysisADTs.c
index cf54aca..fe5d4bb 100644
--- a/compiler_and_linker/unsorted/IroPointerAnalysisADTs.c
+++ b/compiler_and_linker/unsorted/IroPointerAnalysisADTs.c
@@ -1392,7 +1392,7 @@ inline LocationSet *LocationSet_bitfieldOf(LocationSet *ls) {
return ls->u.unknown.bitfieldOf;
}
-inline LocationSetSet *LocationSetSet_New() {
+inline LocationSetSet *LocationSetSet_New(void) {
LocationSetSet *lss = IRO_malloc(sizeof(LocationSetSet));
IRO_ASSERT(2356, lss != NULL);
@@ -2446,7 +2446,7 @@ inline Boolean PointsToFunctions_Match(PointsToFunction *pointsToFunc1, PointsTo
return 1;
}
-inline PartialTransferFunction *PartialTransferFunction_New() {
+inline PartialTransferFunction *PartialTransferFunction_New(void) {
PartialTransferFunction *ptf = IRO_malloc(sizeof(PartialTransferFunction));
IRO_ASSERT(4110, ptf != NULL);
diff --git a/compiler_and_linker/unsorted/LiveVariables.c b/compiler_and_linker/unsorted/LiveVariables.c
new file mode 100644
index 0000000..210761e
--- /dev/null
+++ b/compiler_and_linker/unsorted/LiveVariables.c
@@ -0,0 +1,157 @@
+#include "compiler/LiveInfo.h"
+#include "compiler/BitVectors.h"
+#include "compiler/Coloring.h"
+#include "compiler/CompilerTools.h"
+#include "compiler/PCode.h"
+#include "compiler/Registers.h"
+#include "compiler/objects.h"
+#include "compiler/types.h"
+#include "compiler/CParser.h"
+
+LiveInfo *liveinfo;
+
+static void allocateliveinfo(void) {
+ UInt32 regs;
+ LiveInfo *info;
+ int i;
+
+ regs = used_virtual_registers[coloring_class];
+
+ liveinfo = oalloc(sizeof(LiveInfo) * pcblockcount);
+ for (i = 0, info = liveinfo; i < pcblockcount; i++, info++) {
+ bitvectorinitialize(info->use = oalloc(4 * ((regs + 31) >> 5)), regs, 0);
+ bitvectorinitialize(info->def = oalloc(4 * ((regs + 31) >> 5)), regs, 0);
+ bitvectorinitialize(info->in = oalloc(4 * ((regs + 31) >> 5)), regs, 0);
+ bitvectorinitialize(info->out = oalloc(4 * ((regs + 31) >> 5)), regs, 0);
+ }
+}
+
+static void computelocalusedef(void) {
+ LiveInfo *info;
+ PCodeBlock *block;
+ PCode *instr;
+ UInt32 *use;
+ UInt32 *def;
+ PCodeArg *op;
+ int i;
+
+ for (block = pcbasicblocks; block; block = block->nextBlock) {
+ info = &liveinfo[block->blockIndex];
+ use = info->use;
+ def = info->def;
+
+ for (instr = block->firstPCode; instr; instr = instr->nextPCode) {
+ op = instr->args;
+ i = instr->argCount;
+ while (i--) {
+ if (PC_OP_IS_READ_ANY_REGISTER(op, coloring_class) && !bitvectorgetbit(op->data.reg.reg, def))
+ bitvectorsetbit(op->data.reg.reg, use);
+ op++;
+ }
+
+ op = instr->args;
+ i = instr->argCount;
+ while (i--) {
+ if (PC_OP_IS_WRITE_ANY_REGISTER(op, coloring_class) && !bitvectorgetbit(op->data.reg.reg, use))
+ bitvectorsetbit(op->data.reg.reg, def);
+ op++;
+ }
+ }
+ }
+}
+
+static void computeglobalinout(void) {
+ UInt32 regs;
+ LiveInfo *info;
+ UInt32 *use;
+ UInt32 *def;
+ UInt32 *in;
+ UInt32 *out;
+ int bitvecsize;
+ int blockIndex;
+ int i;
+ int flag;
+ PCodeBlock *block;
+ PCLink *link;
+ UInt32 val;
+
+ regs = used_virtual_registers[coloring_class];
+ bitvecsize = (regs + 31) >> 5;
+ flag = 1;
+ while (flag) {
+ flag = 0;
+ blockIndex = pcblockcount;
+ while (blockIndex) {
+ if ((block = depthfirstordering[--blockIndex])) {
+ info = &liveinfo[block->blockIndex];
+ if ((link = block->successors)) {
+ out = info->out;
+ bitvectorcopy(out, liveinfo[link->block->blockIndex].in, regs);
+ for (link = link->nextLink; link; link = link->nextLink)
+ bitvectorunion(out, liveinfo[link->block->blockIndex].in, regs);
+ }
+
+ out = info->out;
+ in = info->in;
+ use = info->use;
+ def = info->def;
+ for (i = 0; i < bitvecsize; i++) {
+ val = *use | (*out & ~*def);
+ if (val != *in) {
+ *in = val;
+ flag = 1;
+ }
+ in++;
+ out++;
+ use++;
+ def++;
+ }
+ }
+ }
+ }
+}
+
+void computelivevariables(Object *proc) {
+ Type *returnType;
+
+ returnType = TYPE_FUNC(proc->type)->functype;
+ computedepthfirstordering();
+ allocateliveinfo();
+ computelocalusedef();
+
+ if (coloring_class == RegClass_GPR && TYPE_FITS_IN_REGISTER(returnType)) {
+ bitvectorsetbit(3, liveinfo[epilogue->blockIndex].use);
+ if (TYPE_IS_8BYTES(returnType))
+ bitvectorsetbit(4, liveinfo[pclastblock->blockIndex].use);
+ } else if (coloring_class == RegClass_FPR && IS_TYPE_FLOAT(returnType)) {
+ bitvectorsetbit(1, liveinfo[epilogue->blockIndex].use);
+ } else if (coloring_class == RegClass_VR && IS_TYPE_VECTOR(returnType)) {
+ bitvectorsetbit(2, liveinfo[epilogue->blockIndex].use);
+ }
+
+ computeglobalinout();
+}
+
+int dead(PCode *instr, RegClass rclass, UInt32 *vec) {
+ int i;
+ PCodeArg *op;
+
+ if (instr->flags & (fIsBranch | fIsWrite | fIsCall | fIsVolatile | fSideEffects))
+ return 0;
+ if (instr->block->flags & (fIsProlog | fIsEpilogue))
+ return 0;
+
+ op = instr->args;
+ i = instr->argCount;
+ while (i--) {
+ if (
+ op->kind == PCOp_REGISTER &&
+ (op->data.reg.effect & EffectWrite) &&
+ (rclass != op->arg || bitvectorgetbit(op->data.reg.reg, vec))
+ )
+ return 0;
+ op++;
+ }
+
+ return copts.optimizationlevel > 0;
+}
diff --git a/compiler_and_linker/unsorted/LoopDetection.c b/compiler_and_linker/unsorted/LoopDetection.c
index 5df2524..1d8244a 100644
--- a/compiler_and_linker/unsorted/LoopDetection.c
+++ b/compiler_and_linker/unsorted/LoopDetection.c
@@ -15,7 +15,7 @@ static BlockList *loopheaders;
static int nloopheaders;
static PCodeBlock **loopstack;
BitVector *LoopTemp;
-void *LoopList_First;
+struct LoopList *LoopList_First;
static void computedominators(void) {
int i;
@@ -316,7 +316,7 @@ void insertpreheaderblock(Loop *loop) {
if (
(!block28->nextBlock || !bitvectorgetbit(block28->nextBlock->blockIndex, loop->memberblocks)) &&
block28->lastPCode &&
- (block28->lastPCode->flags & fPCodeFlag1) &&
+ (block28->lastPCode->flags & fIsBranch) &&
block28->lastPCode->op != PC_BDNZ
) {
i = block28->lastPCode->argCount;
@@ -851,10 +851,10 @@ void analyzeloop(Loop *loop) {
if (pcode->op == PC_BCTRL || pcode->op == PC_BCTR || pcode->op == PC_BCCTR || pcode->op == PC_MTCTR || pcode->op == PC_MFCTR) {
loop->x4E = 1;
- } else if (pcode->flags & fPCodeFlag2) {
+ } else if (pcode->flags & fIsRead) {
if (pcode->op == PC_LBZX || pcode->op == PC_LHZX || pcode->op == PC_LHAX || pcode->op == PC_LWZX || pcode->op == PC_LFSX || pcode->op == PC_LFDX)
loop->x53 = 1;
- } else if (pcode->flags & fPCodeFlag4) {
+ } else if (pcode->flags & fIsWrite) {
if (pcode->op == PC_STBX || pcode->op == PC_STHX || pcode->op == PC_STWX || pcode->op == PC_STFSX || pcode->op == PC_STFDX)
loop->x54 = 1;
} else {
@@ -883,4 +883,3 @@ void analyzeloopsinflowgraph(void) {
if (loopsinflowgraph)
analyzeloops(loopsinflowgraph);
}
-
diff --git a/compiler_and_linker/unsorted/LoopOptimization.c b/compiler_and_linker/unsorted/LoopOptimization.c
index c2a360f..9db7c53 100644
--- a/compiler_and_linker/unsorted/LoopOptimization.c
+++ b/compiler_and_linker/unsorted/LoopOptimization.c
@@ -175,7 +175,7 @@ static void skiplooptest(Loop *loop) {
loop->bodySize--;
}
- for (instr = instr->nextPCode; instr && !(instr->flags & fPCodeFlag1); instr = instr->nextPCode)
+ for (instr = instr->nextPCode; instr && !(instr->flags & fIsBranch); instr = instr->nextPCode)
insertpcodebefore(loop->preheader->lastPCode, copypcode(instr));
}
@@ -206,7 +206,7 @@ static void unrollloop(Loop *loop) {
if (firstInstr->op != PC_CMP && firstInstr->op != PC_CMPL && firstInstr->op != PC_CMPI && firstInstr->op != PC_CMPLI)
CError_FATAL(450);
- for (instr = firstInstr->nextPCode; instr && !(instr->flags & fPCodeFlag1); instr = instr->nextPCode)
+ for (instr = firstInstr->nextPCode; instr && !(instr->flags & fIsBranch); instr = instr->nextPCode)
appendpcode(newBlock, copypcode(instr));
for (block = loop->preheader->successors->block; block != loop->body; block = block->successors->block) {
@@ -384,7 +384,7 @@ static void unrollloopconditional(Loop *loop) {
for (j = 0; j < inputBlockCount; j++) {
for (instr = blocks[j]->firstPCode; instr; instr = instr->nextPCode) {
- if (instr->flags & fPCodeFlag1) {
+ if (instr->flags & fIsBranch) {
PCodeArg *op;
int opID;
instrCopy = copypcode(instr);
@@ -425,7 +425,7 @@ static void unrollloopconditional(Loop *loop) {
if (firstInstr->op != PC_CMP && firstInstr->op != PC_CMPL && firstInstr->op != PC_CMPI && firstInstr->op != PC_CMPLI)
CError_FATAL(764);
- for (instr = firstInstr->nextPCode; instr && !(instr->flags & fPCodeFlag1); instr = instr->nextPCode)
+ for (instr = firstInstr->nextPCode; instr && !(instr->flags & fIsBranch); instr = instr->nextPCode)
appendpcode(blocks2[inputBlockCount - 1], copypcode(instr));
for (j = 0; j < inputBlockCount; j++) {
@@ -465,7 +465,7 @@ static void unrollloopconditional(Loop *loop) {
for (i = 0; i < inputBlockCount; i++) {
for (instr = blocks[i]->firstPCode; instr; instr = instr->nextPCode) {
- if (instr->flags & fPCodeFlag1) {
+ if (instr->flags & fIsBranch) {
PCodeArg *op;
int opID;
op = NULL;
@@ -1293,7 +1293,7 @@ void changearraytoregisters(void) {
if ((arrays = scanforlocalarrays())) {
for (block = pcbasicblocks; block; block = block->nextBlock) {
for (instr = block->firstPCode; instr; instr = instr->nextPCode) {
- if (!(instr->flags & fPCodeFlag1) && instr->argCount) {
+ if (!(instr->flags & fIsBranch) && instr->argCount) {
op = instr->args;
i = instr->argCount;
while (i--) {
@@ -1304,7 +1304,7 @@ void changearraytoregisters(void) {
!array->invalid
) {
if (
- (instr->flags & (fPCodeFlag2 | fPCodeFlag4)) &&
+ (instr->flags & (fIsRead | fIsWrite)) &&
(op->data.mem.offset % array->elementSize) == 0 &&
op->data.mem.offset < array->arraySize
) {
@@ -1460,9 +1460,9 @@ void changearraytoregisters(void) {
for (block = pcbasicblocks; block; block = block->nextBlock) {
for (instr = block->firstPCode; instr; instr = instr->nextPCode) {
if (
- !(instr->flags & fPCodeFlag1) &&
+ !(instr->flags & fIsBranch) &&
instr->argCount &&
- (instr->flags & (fPCodeFlag2 | fPCodeFlag4)) &&
+ (instr->flags & (fIsRead | fIsWrite)) &&
instr->args[2].kind == PCOp_MEMORY &&
(PCOpMemoryArg) instr->args[2].arg == PCOpMemory1 &&
(array = lookup_array_object(arrays, instr->args[2].data.mem.obj)) &&
diff --git a/compiler_and_linker/unsorted/MachineSimulation601.c b/compiler_and_linker/unsorted/MachineSimulation601.c
new file mode 100644
index 0000000..2d54678
--- /dev/null
+++ b/compiler_and_linker/unsorted/MachineSimulation601.c
@@ -0,0 +1,552 @@
+#include "compiler/Scheduler.h"
+#include "compiler/PCode.h"
+#include "compiler/PCodeInfo.h"
+
+// https://stuff.mit.edu/afs/sipb/contrib/doc/specs/ic/cpu/powerpc/mpc601.pdf
+// https://www.nxp.com/docs/en/user-guide/MPC601UMAD.pdf
+
+typedef enum Stage {
+ IU, // Integer Unit
+ FD, // FP Decode
+ FPM, // FP Multiply
+ FPA, // FP Add
+ FWA, // FP Arithmetic Writeback
+ BPU, // Branch Processing Unit
+ NumStages,
+ Serialize, // special form for instructions that use IU but are serialised
+ Unsupported // instructions not supported by this processor
+} Stage;
+
+static struct {
+ // the instruction currently in this pipeline stage
+ PCode *instr;
+
+ // how many cycles are left for this instruction to finish
+ int remaining;
+} pipeline[NumStages];
+
+static struct {
+ // the initial stage for this instruction
+ Stage stage;
+
+ // the total amount of cycles required by this instruction
+ char latency;
+
+ // how long it takes to finish each stage
+ char cycles[4];
+} instruction_timing[OPCODE_MAX] = {
+ BPU, 0, 0, 0, 0, 1, // PC_B
+ BPU, 0, 0, 0, 0, 1, // PC_BL
+ BPU, 0, 0, 0, 0, 1, // PC_BC
+ BPU, 0, 0, 0, 0, 1, // PC_BCLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BT
+ BPU, 0, 0, 0, 0, 1, // PC_BTLR
+ BPU, 0, 0, 0, 0, 1, // PC_BTCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BF
+ BPU, 0, 0, 0, 0, 1, // PC_BFLR
+ BPU, 0, 0, 0, 0, 1, // PC_BFCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZF
+ BPU, 0, 0, 0, 0, 1, // PC_BDZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDZF
+ BPU, 0, 0, 0, 0, 1, // PC_BLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTRL
+ BPU, 0, 0, 0, 0, 1, // PC_BLRL
+ IU, 2, 1, 0, 0, 0, // PC_LBZ
+ IU, 2, 1, 0, 0, 0, // PC_LBZU
+ IU, 2, 1, 0, 0, 0, // PC_LBZX
+ IU, 2, 1, 0, 0, 0, // PC_LBZUX
+ IU, 2, 1, 0, 0, 0, // PC_LHZ
+ IU, 2, 1, 0, 0, 0, // PC_LHZU
+ IU, 2, 1, 0, 0, 0, // PC_LHZX
+ IU, 2, 1, 0, 0, 0, // PC_LHZUX
+ IU, 2, 1, 0, 0, 0, // PC_LHA
+ IU, 2, 1, 0, 0, 0, // PC_LHAU
+ IU, 2, 1, 0, 0, 0, // PC_LHAX
+ IU, 2, 1, 0, 0, 0, // PC_LHAUX
+ IU, 2, 1, 0, 0, 0, // PC_LHBRX
+ IU, 2, 1, 0, 0, 0, // PC_LWZ
+ IU, 2, 1, 0, 0, 0, // PC_LWZU
+ IU, 2, 1, 0, 0, 0, // PC_LWZX
+ IU, 2, 1, 0, 0, 0, // PC_LWZUX
+ IU, 2, 1, 0, 0, 0, // PC_LWBRX
+ IU, 1, 1, 0, 0, 0, // PC_LMW
+ IU, 1, 1, 0, 0, 0, // PC_STB
+ IU, 1, 1, 0, 0, 0, // PC_STBU
+ IU, 1, 1, 0, 0, 0, // PC_STBX
+ IU, 1, 1, 0, 0, 0, // PC_STBUX
+ IU, 1, 1, 0, 0, 0, // PC_STH
+ IU, 1, 1, 0, 0, 0, // PC_STHU
+ IU, 1, 1, 0, 0, 0, // PC_STHX
+ IU, 1, 1, 0, 0, 0, // PC_STHUX
+ IU, 1, 1, 0, 0, 0, // PC_STHBRX
+ IU, 1, 1, 0, 0, 0, // PC_STW
+ IU, 1, 1, 0, 0, 0, // PC_STWU
+ IU, 1, 1, 0, 0, 0, // PC_STWX
+ IU, 1, 1, 0, 0, 0, // PC_STWUX
+ IU, 1, 1, 0, 0, 0, // PC_STWBRX
+ IU, 1, 1, 0, 0, 0, // PC_STMW
+ IU, 2, 1, 0, 0, 0, // PC_DCBF
+ IU, 2, 1, 0, 0, 0, // PC_DCBST
+ IU, 2, 1, 0, 0, 0, // PC_DCBT
+ IU, 2, 1, 0, 0, 0, // PC_DCBTST
+ IU, 2, 1, 0, 0, 0, // PC_DCBZ
+ IU, 1, 1, 0, 0, 0, // PC_ADD
+ IU, 1, 1, 0, 0, 0, // PC_ADDC
+ IU, 1, 1, 0, 0, 0, // PC_ADDE
+ IU, 1, 1, 0, 0, 0, // PC_ADDI
+ IU, 1, 1, 0, 0, 0, // PC_ADDIC
+ IU, 1, 1, 0, 0, 0, // PC_ADDICR
+ IU, 1, 1, 0, 0, 0, // PC_ADDIS
+ IU, 1, 1, 0, 0, 0, // PC_ADDME
+ IU, 1, 1, 0, 0, 0, // PC_ADDZE
+ IU, 36, 36, 0, 0, 0, // PC_DIVW
+ IU, 36, 36, 0, 0, 0, // PC_DIVWU
+ IU, 5, 5, 0, 0, 0, // PC_MULHW
+ IU, 5, 5, 0, 0, 0, // PC_MULHWU
+ IU, 5, 5, 0, 0, 0, // PC_MULLI
+ IU, 5, 5, 0, 0, 0, // PC_MULLW
+ IU, 1, 1, 0, 0, 0, // PC_NEG
+ IU, 1, 1, 0, 0, 0, // PC_SUBF
+ IU, 1, 1, 0, 0, 0, // PC_SUBFC
+ IU, 1, 1, 0, 0, 0, // PC_SUBFE
+ IU, 1, 1, 0, 0, 0, // PC_SUBFIC
+ IU, 1, 1, 0, 0, 0, // PC_SUBFME
+ IU, 1, 1, 0, 0, 0, // PC_SUBFZE
+ IU, 3, 1, 0, 0, 0, // PC_CMPI
+ IU, 3, 1, 0, 0, 0, // PC_CMP
+ IU, 3, 1, 0, 0, 0, // PC_CMPLI
+ IU, 3, 1, 0, 0, 0, // PC_CMPL
+ IU, 1, 1, 0, 0, 0, // PC_ANDI
+ IU, 1, 1, 0, 0, 0, // PC_ANDIS
+ IU, 1, 1, 0, 0, 0, // PC_ORI
+ IU, 1, 1, 0, 0, 0, // PC_ORIS
+ IU, 1, 1, 0, 0, 0, // PC_XORI
+ IU, 1, 1, 0, 0, 0, // PC_XORIS
+ IU, 1, 1, 0, 0, 0, // PC_AND
+ IU, 1, 1, 0, 0, 0, // PC_OR
+ IU, 1, 1, 0, 0, 0, // PC_XOR
+ IU, 1, 1, 0, 0, 0, // PC_NAND
+ IU, 1, 1, 0, 0, 0, // PC_NOR
+ IU, 1, 1, 0, 0, 0, // PC_EQV
+ IU, 1, 1, 0, 0, 0, // PC_ANDC
+ IU, 1, 1, 0, 0, 0, // PC_ORC
+ IU, 1, 1, 0, 0, 0, // PC_EXTSB
+ IU, 1, 1, 0, 0, 0, // PC_EXTSH
+ IU, 1, 1, 0, 0, 0, // PC_CNTLZW
+ IU, 1, 1, 0, 0, 0, // PC_RLWINM
+ IU, 1, 1, 0, 0, 0, // PC_RLWNM
+ IU, 1, 1, 0, 0, 0, // PC_RLWIMI
+ IU, 1, 1, 0, 0, 0, // PC_SLW
+ IU, 1, 1, 0, 0, 0, // PC_SRW
+ IU, 1, 1, 0, 0, 0, // PC_SRAWI
+ IU, 1, 1, 0, 0, 0, // PC_SRAW
+ IU, 1, 1, 0, 0, 0, // PC_CRAND
+ IU, 1, 1, 0, 0, 0, // PC_CRANDC
+ IU, 1, 1, 0, 0, 0, // PC_CREQV
+ IU, 1, 1, 0, 0, 0, // PC_CRNAND
+ IU, 1, 1, 0, 0, 0, // PC_CRNOR
+ IU, 1, 1, 0, 0, 0, // PC_CROR
+ IU, 1, 1, 0, 0, 0, // PC_CRORC
+ IU, 1, 1, 0, 0, 0, // PC_CRXOR
+ IU, 1, 1, 0, 0, 0, // PC_MCRF
+ IU, 4, 1, 0, 0, 0, // PC_MTXER
+ IU, 4, 1, 0, 0, 0, // PC_MTCTR
+ IU, 4, 1, 0, 0, 0, // PC_MTLR
+ IU, 2, 1, 0, 0, 0, // PC_MTCRF
+ IU, 1, 0, 0, 0, 0, // PC_MTMSR
+ IU, 1, 0, 0, 0, 0, // PC_MTSPR
+ IU, 1, 0, 0, 0, 0, // PC_MFMSR
+ IU, 1, 0, 0, 0, 0, // PC_MFSPR
+ IU, 1, 1, 0, 0, 0, // PC_MFXER
+ IU, 1, 1, 0, 0, 0, // PC_MFCTR
+ IU, 1, 1, 0, 0, 0, // PC_MFLR
+ IU, 1, 1, 0, 0, 0, // PC_MFCR
+ FD, 4, 1, 1, 1, 1, // PC_MFFS
+ FD, 4, 1, 1, 1, 1, // PC_MTFSF
+ Serialize, 1, 1, 0, 0, 1, // PC_EIEIO
+ Serialize, 1, 1, 0, 0, 1, // PC_ISYNC
+ Serialize, 1, 1, 0, 0, 1, // PC_SYNC
+ Serialize, 0, 0, 0, 0, 1, // PC_RFI
+ IU, 1, 1, 0, 0, 0, // PC_LI
+ IU, 1, 1, 0, 0, 0, // PC_LIS
+ IU, 1, 1, 0, 0, 0, // PC_MR
+ IU, 1, 1, 0, 0, 0, // PC_NOP
+ IU, 1, 1, 0, 0, 0, // PC_NOT
+ IU, 3, 1, 0, 0, 0, // PC_LFS
+ IU, 3, 1, 0, 0, 0, // PC_LFSU
+ IU, 3, 1, 0, 0, 0, // PC_LFSX
+ IU, 3, 1, 0, 0, 0, // PC_LFSUX
+ IU, 3, 1, 0, 0, 0, // PC_LFD
+ IU, 3, 1, 0, 0, 0, // PC_LFDU
+ IU, 3, 1, 0, 0, 0, // PC_LFDX
+ IU, 3, 1, 0, 0, 0, // PC_LFDUX
+ IU, 1, 1, 0, 0, 0, // PC_STFS
+ IU, 1, 1, 0, 0, 0, // PC_STFSU
+ IU, 1, 1, 0, 0, 0, // PC_STFSX
+ IU, 1, 1, 0, 0, 0, // PC_STFSUX
+ IU, 1, 1, 0, 0, 0, // PC_STFD
+ IU, 1, 1, 0, 0, 0, // PC_STFDU
+ IU, 1, 1, 0, 0, 0, // PC_STFDX
+ IU, 1, 1, 0, 0, 0, // PC_STFDUX
+ FD, 4, 1, 1, 1, 1, // PC_FMR
+ FD, 4, 1, 1, 1, 1, // PC_FABS
+ FD, 4, 1, 1, 1, 1, // PC_FNEG
+ FD, 4, 1, 1, 1, 1, // PC_FNABS
+ FD, 4, 1, 1, 1, 1, // PC_FADD
+ FD, 4, 1, 1, 1, 1, // PC_FADDS
+ FD, 4, 1, 1, 1, 1, // PC_FSUB
+ FD, 4, 1, 1, 1, 1, // PC_FSUBS
+ FD, 5, 1, 1, 2, 1, // PC_FMUL
+ FD, 4, 1, 1, 1, 1, // PC_FMULS
+ FD, 31, 1, 1, 28, 1, // PC_FDIV
+ FD, 17, 1, 1, 14, 1, // PC_FDIVS
+ FD, 5, 1, 1, 2, 1, // PC_FMADD
+ FD, 4, 1, 1, 1, 1, // PC_FMADDS
+ FD, 5, 1, 1, 2, 1, // PC_FMSUB
+ FD, 4, 1, 1, 1, 1, // PC_FMSUBS
+ FD, 5, 1, 1, 2, 1, // PC_FNMADD
+ FD, 4, 1, 1, 1, 1, // PC_FNMADDS
+ FD, 5, 1, 1, 2, 1, // PC_FNMSUB
+ FD, 4, 1, 1, 1, 1, // PC_FNMSUBS
+ FD, 4, 1, 1, 1, 1, // PC_FRES
+ FD, 4, 1, 1, 1, 1, // PC_FRSQRTE
+ FD, 4, 1, 1, 1, 1, // PC_FSEL
+ FD, 4, 1, 1, 1, 1, // PC_FRSP
+ FD, 4, 1, 1, 1, 1, // PC_FCTIW
+ FD, 4, 1, 1, 1, 1, // PC_FCTIWZ
+ FD, 6, 1, 1, 1, 1, // PC_FCMPU
+ FD, 6, 1, 1, 1, 1, // PC_FCMPO
+ IU, 0, 0, 0, 0, 0, // PC_LWARX
+ IU, 0, 0, 0, 0, 0, // PC_LSWI
+ IU, 0, 0, 0, 0, 0, // PC_LSWX
+ IU, 0, 0, 0, 0, 0, // PC_STFIWX
+ IU, 0, 0, 0, 0, 0, // PC_STSWI
+ IU, 0, 0, 0, 0, 0, // PC_STSWX
+ IU, 0, 0, 0, 0, 0, // PC_STWCX
+ IU, 0, 0, 0, 0, 0, // PC_ECIWX
+ IU, 0, 0, 0, 0, 0, // PC_ECOWX
+ IU, 0, 0, 0, 0, 0, // PC_DCBI
+ IU, 0, 0, 0, 0, 0, // PC_ICBI
+ IU, 0, 0, 0, 0, 0, // PC_MCRFS
+ IU, 0, 0, 0, 0, 0, // PC_MCRXR
+ IU, 0, 0, 0, 0, 0, // PC_MFTB
+ IU, 0, 0, 0, 0, 0, // PC_MFSR
+ IU, 0, 0, 0, 0, 0, // PC_MTSR
+ IU, 0, 0, 0, 0, 0, // PC_MFSRIN
+ IU, 0, 0, 0, 0, 0, // PC_MTSRIN
+ IU, 0, 0, 0, 0, 0, // PC_MTFSB0
+ IU, 0, 0, 0, 0, 0, // PC_MTFSB1
+ IU, 0, 0, 0, 0, 0, // PC_MTFSFI
+ Serialize, 0, 0, 0, 0, 0, // PC_SC
+ IU, 0, 0, 0, 0, 0, // PC_FSQRT
+ IU, 0, 0, 0, 0, 0, // PC_FSQRTS
+ IU, 0, 0, 0, 0, 0, // PC_TLBIA
+ IU, 0, 0, 0, 0, 0, // PC_TLBIE
+ IU, 0, 0, 0, 0, 0, // PC_TLBLD
+ IU, 0, 0, 0, 0, 0, // PC_TLBLI
+ IU, 0, 0, 0, 0, 0, // PC_TLBSYNC
+ Serialize, 0, 0, 0, 0, 0, // PC_TW
+ Serialize, 0, 0, 0, 0, 0, // PC_TRAP
+ Serialize, 0, 0, 0, 0, 0, // PC_TWI
+ Serialize, 0, 0, 0, 0, 0, // PC_OPWORD
+ IU, 0, 0, 0, 0, 0, // PC_MFROM
+ IU, 0, 0, 0, 0, 0, // PC_DSA
+ IU, 0, 0, 0, 0, 0, // PC_ESA
+ IU, 0, 0, 0, 0, 0, // PC_DCCCI
+ IU, 0, 0, 0, 0, 0, // PC_DCREAD
+ IU, 0, 0, 0, 0, 0, // PC_ICBT
+ IU, 0, 0, 0, 0, 0, // PC_ICCCI
+ IU, 0, 0, 0, 0, 0, // PC_ICREAD
+ IU, 0, 0, 0, 0, 0, // PC_RFCI
+ IU, 0, 0, 0, 0, 0, // PC_TLBRE
+ IU, 0, 0, 0, 0, 0, // PC_TLBSX
+ IU, 0, 0, 0, 0, 0, // PC_TLBWE
+ IU, 0, 0, 0, 0, 0, // PC_WRTEE
+ IU, 0, 0, 0, 0, 0, // PC_WRTEEI
+ IU, 0, 0, 0, 0, 0, // PC_MFDCR
+ IU, 0, 0, 0, 0, 0, // PC_MTDCR
+ Unsupported, 0, 0, 0, 0, 0, // PC_DCBA
+ Unsupported, 0, 0, 0, 0, 0, // PC_DSS
+ Unsupported, 0, 0, 0, 0, 0, // PC_DSSALL
+ Unsupported, 0, 0, 0, 0, 0, // PC_DST
+ Unsupported, 0, 0, 0, 0, 0, // PC_DSTT
+ Unsupported, 0, 0, 0, 0, 0, // PC_DSTST
+ Unsupported, 0, 0, 0, 0, 0, // PC_DSTSTT
+ Unsupported, 0, 0, 0, 0, 0, // PC_LVEBX
+ Unsupported, 0, 0, 0, 0, 0, // PC_LVEHX
+ Unsupported, 0, 0, 0, 0, 0, // PC_LVEWX
+ Unsupported, 0, 0, 0, 0, 0, // PC_LVSL
+ Unsupported, 0, 0, 0, 0, 0, // PC_LVSR
+ Unsupported, 0, 0, 0, 0, 0, // PC_LVX
+ Unsupported, 0, 0, 0, 0, 0, // PC_LVXL
+ Unsupported, 0, 0, 0, 0, 0, // PC_STVEBX
+ Unsupported, 0, 0, 0, 0, 0, // PC_STVEHX
+ Unsupported, 0, 0, 0, 0, 0, // PC_STVEWX
+ Unsupported, 0, 0, 0, 0, 0, // PC_STVX
+ Unsupported, 0, 0, 0, 0, 0, // PC_STVXL
+ Unsupported, 0, 0, 0, 0, 0, // PC_MFVSCR
+ Unsupported, 0, 0, 0, 0, 0, // PC_MTVSCR
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDCUW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDSBS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDSHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDSWS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDUBM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDUBS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDUHM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDUHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDUWM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VADDUWS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VAND
+ Unsupported, 0, 0, 0, 0, 0, // PC_VANDC
+ Unsupported, 0, 0, 0, 0, 0, // PC_VAVGSB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VAVGSH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VAVGSW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VAVGUB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VAVGUH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VAVGUW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCFSX
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCFUX
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPBFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPEQFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPEQUB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPEQUH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPEQUW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGEFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTSB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTSH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTSW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTUB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTUH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCMPGTUW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCTSXS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VCTUXS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VEXPTEFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VLOGEFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMAXFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMAXSB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMAXSH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMAXSW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMAXUB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMAXUH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMAXUW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMINFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMINSB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMINSH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMINSW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMINUB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMINUH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMINUW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMRGHB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMRGHH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMRGHW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMRGLB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMRGLH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMRGLW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMULESB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMULESH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMULEUB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMULEUH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMULOSB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMULOSH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMULOUB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMULOUH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VNOR
+ Unsupported, 0, 0, 0, 0, 0, // PC_VOR
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKPX
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKSHSS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKSHUS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKSWSS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKSWUS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKUHUM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKUHUS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKUWUM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPKUWUS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VREFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VRFIM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VRFIN
+ Unsupported, 0, 0, 0, 0, 0, // PC_VRFIP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VRFIZ
+ Unsupported, 0, 0, 0, 0, 0, // PC_VRLB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VRLH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VRLW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VRSQRTEFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSL
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSLB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSLH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSLO
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSLW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTISB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTISH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSPLTISW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSR
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSRAB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSRAH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSRAW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSRB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSRH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSRO
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSRW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBCUW
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBSBS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBSHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBSWS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUBM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUBS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUHM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUWM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUBUWS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUMSWS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUFPMSWS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUFWASBS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUFWASHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSUFWAUBS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VUPKHPX
+ Unsupported, 0, 0, 0, 0, 0, // PC_VUPKHSB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VUPKHSH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VUPKLPX
+ Unsupported, 0, 0, 0, 0, 0, // PC_VUPKLSB
+ Unsupported, 0, 0, 0, 0, 0, // PC_VUPKLSH
+ Unsupported, 0, 0, 0, 0, 0, // PC_VXOR
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMADDFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMHADDSHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMHRADDSHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMLADDUHM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMMBM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMSHM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMSHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMUBM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMUHM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMSUMUHS
+ Unsupported, 0, 0, 0, 0, 0, // PC_VNMSUBFP
+ Unsupported, 0, 0, 0, 0, 0, // PC_VPERM
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSEL
+ Unsupported, 0, 0, 0, 0, 0, // PC_VSLDOI
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMR
+ Unsupported, 0, 0, 0, 0, 0, // PC_VMRP
+ IU, 0, 0, 0, 0, 0, // PC_SLE
+ IU, 0, 0, 0, 0, 0, // PC_SLEQ
+ IU, 0, 0, 0, 0, 0, // PC_SLIQ
+ IU, 0, 0, 0, 0, 0, // PC_SLLIQ
+ IU, 0, 0, 0, 0, 0, // PC_SLLQ
+ IU, 0, 0, 0, 0, 0, // PC_SLQ
+ IU, 0, 0, 0, 0, 0, // PC_SRAIQ
+ IU, 0, 0, 0, 0, 0, // PC_SRAQ
+ IU, 0, 0, 0, 0, 0, // PC_SRE
+ IU, 0, 0, 0, 0, 0, // PC_SREA
+ IU, 0, 0, 0, 0, 0, // PC_SREQ
+ IU, 0, 0, 0, 0, 0, // PC_SRIQ
+ IU, 0, 0, 0, 0, 0, // PC_SRLIQ
+ IU, 0, 0, 0, 0, 0, // PC_SRLQ
+ IU, 0, 0, 0, 0, 0, // PC_SRQ
+ IU, 0, 0, 0, 0, 0, // PC_MASKG
+ IU, 0, 0, 0, 0, 0, // PC_MASKIR
+ IU, 0, 0, 0, 0, 0, // PC_LSCBX
+ IU, 0, 0, 0, 0, 0, // PC_DIV
+ IU, 0, 0, 0, 0, 0, // PC_DIVS
+ IU, 0, 0, 0, 0, 0, // PC_DOZ
+ IU, 0, 0, 0, 0, 0, // PC_MUL
+ IU, 0, 0, 0, 0, 0, // PC_NABS
+ IU, 0, 0, 0, 0, 0, // PC_ABS
+ IU, 0, 0, 0, 0, 0, // PC_CLCS
+ IU, 0, 0, 0, 0, 0, // PC_DOZI
+ IU, 0, 0, 0, 0, 0, // PC_RLMI
+ IU, 0, 0, 0, 0, 0, // PC_RRIB
+};
+
+static void advance(int stageCount, int oldStage, int newStage) {
+ PCode *instr = pipeline[oldStage].instr;
+ int cycles = instruction_timing[instr->op].cycles[newStage - stageCount];
+ pipeline[newStage].instr = instr;
+ pipeline[newStage].remaining = cycles;
+ pipeline[oldStage].instr = NULL;
+}
+
+static void complete_instruction(int stage) {
+ pipeline[stage].instr = NULL;
+}
+
+static int latency(PCode *instr) {
+ int cycles = instruction_timing[instr->op].latency;
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
+ cycles += 2;
+ if (instr->op == PC_LMW || instr->op == PC_STMW)
+ cycles += instr->argCount - 2;
+ return cycles;
+}
+
+static void initialize(void) {
+ int stage;
+
+ for (stage = 0; stage < NumStages; stage++)
+ pipeline[stage].instr = NULL;
+}
+
+static int can_issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ if (stage == Serialize)
+ stage = IU;
+ if (pipeline[stage].instr)
+ return 0;
+ return 1;
+}
+
+static void issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ int cycles = instruction_timing[instr->op].cycles[IU];
+ if (stage == Serialize)
+ stage = IU;
+ pipeline[stage].instr = instr;
+ pipeline[stage].remaining = cycles;
+}
+
+static void advance_clock(void) {
+ int stage;
+
+ for (stage = 0; stage < NumStages; stage++) {
+ if (pipeline[stage].instr && pipeline[stage].remaining)
+ --pipeline[stage].remaining;
+ }
+
+ if (pipeline[IU].instr && pipeline[IU].remaining == 0)
+ complete_instruction(IU);
+ if (pipeline[FWA].instr && pipeline[FWA].remaining == 0)
+ complete_instruction(FWA);
+ if (pipeline[BPU].instr && pipeline[BPU].remaining == 0)
+ complete_instruction(BPU);
+
+ if (pipeline[FPA].instr && pipeline[FPA].remaining == 0 && !pipeline[FWA].instr)
+ advance(1, FPA, FWA);
+ if (pipeline[FPM].instr && pipeline[FPM].remaining == 0 && !pipeline[FPA].instr)
+ advance(1, FPM, FPA);
+ if (pipeline[FD].instr && pipeline[FD].remaining == 0 && !pipeline[FPM].instr)
+ advance(1, FD, FPM);
+}
+
+static int serializes(PCode *instr) {
+ return instruction_timing[instr->op].stage == Serialize;
+}
+
+MachineInfo machine601 = {
+ 2,
+ 0,
+ 0,
+ &latency,
+ &initialize,
+ &can_issue,
+ &issue,
+ &advance_clock,
+ &serializes,
+ &default_uses_vpermute_unit
+};
diff --git a/compiler_and_linker/unsorted/MachineSimulation603.c b/compiler_and_linker/unsorted/MachineSimulation603.c
new file mode 100644
index 0000000..49d1ea0
--- /dev/null
+++ b/compiler_and_linker/unsorted/MachineSimulation603.c
@@ -0,0 +1,626 @@
+#include "compiler/Scheduler.h"
+#include "compiler/PCode.h"
+#include "compiler/PCodeInfo.h"
+
+// this is actually for 603e, but i couldn't find the 603 doc
+// https://www.nxp.com/docs/en/reference-manual/MPC603EUM.pdf
+
+typedef enum Stage {
+ BPU, // Branch Prediction Unit
+ IU, // Integer Unit
+ LSU1, // Load/Store Unit
+ LSU2,
+ FPU1, // Floating Point Unit
+ FPU2,
+ FPU3,
+ SRU, // System Register Unit
+ NumStages
+} Stage;
+
+static struct {
+ // the instruction currently in this pipeline stage
+ PCode *instr;
+
+ // how many cycles are left for this instruction to finish
+ int remaining;
+} pipeline[NumStages];
+
+enum {
+ MaxEntries = 5
+};
+
+static struct {
+ // how many entries remain unused in the queue
+ unsigned int free;
+
+ // how many entries are currently used in the queue
+ unsigned int used;
+
+ // the index of the next instruction that will be retired
+ unsigned int nextToRetire;
+
+ // the index of the next free slot that will be used when an instruction is dispatched
+ unsigned int nextFreeSlot;
+
+ // circular array of entries in the completion queue
+ struct {
+ PCode *instr;
+ int completed;
+ } entries[MaxEntries];
+} completionbuffers;
+
+static struct {
+ // the initial stage for this instruction
+ Stage stage;
+
+ // the total amount of cycles required by this instruction
+ char latency;
+
+ // how long it takes to finish each stage
+ char cycles[3];
+
+ // does this instruction serialise?
+ char serializes;
+} instruction_timing[OPCODE_MAX] = {
+ BPU, 0, 0, 0, 0, 1, // PC_B
+ BPU, 0, 0, 0, 0, 1, // PC_BL
+ BPU, 0, 0, 0, 0, 1, // PC_BC
+ BPU, 0, 0, 0, 0, 1, // PC_BCLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BT
+ BPU, 0, 0, 0, 0, 1, // PC_BTLR
+ BPU, 0, 0, 0, 0, 1, // PC_BTCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BF
+ BPU, 0, 0, 0, 0, 1, // PC_BFLR
+ BPU, 0, 0, 0, 0, 1, // PC_BFCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZF
+ BPU, 0, 0, 0, 0, 1, // PC_BDZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDZF
+ BPU, 0, 0, 0, 0, 1, // PC_BLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTRL
+ BPU, 0, 0, 0, 0, 1, // PC_BLRL
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHA
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LMW
+ LSU1, 2, 1, 1, 0, 0, // PC_STB
+ LSU1, 2, 1, 1, 0, 0, // PC_STBU
+ LSU1, 2, 1, 1, 0, 0, // PC_STBX
+ LSU1, 2, 1, 1, 0, 0, // PC_STBUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STH
+ LSU1, 2, 1, 1, 0, 0, // PC_STHU
+ LSU1, 2, 1, 1, 0, 0, // PC_STHX
+ LSU1, 2, 1, 1, 0, 0, // PC_STHUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STW
+ LSU1, 2, 1, 1, 0, 0, // PC_STWU
+ LSU1, 2, 1, 1, 0, 0, // PC_STWX
+ LSU1, 2, 1, 1, 0, 0, // PC_STWUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STMW
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBF
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBT
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBTST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBZ
+ IU, 1, 1, 0, 0, 0, // PC_ADD
+ IU, 1, 1, 0, 0, 0, // PC_ADDC
+ IU, 1, 1, 0, 0, 0, // PC_ADDE
+ IU, 1, 1, 0, 0, 0, // PC_ADDI
+ IU, 1, 1, 0, 0, 0, // PC_ADDIC
+ IU, 1, 1, 0, 0, 0, // PC_ADDICR
+ IU, 1, 1, 0, 0, 0, // PC_ADDIS
+ IU, 1, 1, 0, 0, 0, // PC_ADDME
+ IU, 1, 1, 0, 0, 0, // PC_ADDZE
+ IU, 37, 37, 0, 0, 0, // PC_DIVW
+ IU, 37, 37, 0, 0, 0, // PC_DIVWU
+ IU, 5, 5, 0, 0, 0, // PC_MULHW
+ IU, 5, 5, 0, 0, 0, // PC_MULHWU
+ IU, 3, 3, 0, 0, 0, // PC_MULLI
+ IU, 5, 5, 0, 0, 0, // PC_MULLW
+ IU, 1, 1, 0, 0, 0, // PC_NEG
+ IU, 1, 1, 0, 0, 0, // PC_SUBF
+ IU, 1, 1, 0, 0, 0, // PC_SUBFC
+ IU, 1, 1, 0, 0, 0, // PC_SUBFE
+ IU, 1, 1, 0, 0, 0, // PC_SUBFIC
+ IU, 1, 1, 0, 0, 0, // PC_SUBFME
+ IU, 1, 1, 0, 0, 0, // PC_SUBFZE
+ IU, 3, 1, 0, 0, 0, // PC_CMPI
+ IU, 3, 1, 0, 0, 0, // PC_CMP
+ IU, 3, 1, 0, 0, 0, // PC_CMPLI
+ IU, 3, 1, 0, 0, 0, // PC_CMPL
+ IU, 1, 1, 0, 0, 0, // PC_ANDI
+ IU, 1, 1, 0, 0, 0, // PC_ANDIS
+ IU, 1, 1, 0, 0, 0, // PC_ORI
+ IU, 1, 1, 0, 0, 0, // PC_ORIS
+ IU, 1, 1, 0, 0, 0, // PC_XORI
+ IU, 1, 1, 0, 0, 0, // PC_XORIS
+ IU, 1, 1, 0, 0, 0, // PC_AND
+ IU, 1, 1, 0, 0, 0, // PC_OR
+ IU, 1, 1, 0, 0, 0, // PC_XOR
+ IU, 1, 1, 0, 0, 0, // PC_NAND
+ IU, 1, 1, 0, 0, 0, // PC_NOR
+ IU, 1, 1, 0, 0, 0, // PC_EQV
+ IU, 1, 1, 0, 0, 0, // PC_ANDC
+ IU, 1, 1, 0, 0, 0, // PC_ORC
+ IU, 1, 1, 0, 0, 0, // PC_EXTSB
+ IU, 1, 1, 0, 0, 0, // PC_EXTSH
+ IU, 1, 1, 0, 0, 0, // PC_CNTLZW
+ IU, 1, 1, 0, 0, 0, // PC_RLWINM
+ IU, 1, 1, 0, 0, 0, // PC_RLWNM
+ IU, 1, 1, 0, 0, 0, // PC_RLWIMI
+ IU, 1, 1, 0, 0, 0, // PC_SLW
+ IU, 1, 1, 0, 0, 0, // PC_SRW
+ IU, 1, 1, 0, 0, 0, // PC_SRAWI
+ IU, 1, 1, 0, 0, 0, // PC_SRAW
+ SRU, 1, 1, 0, 0, 0, // PC_CRAND
+ SRU, 1, 1, 0, 0, 0, // PC_CRANDC
+ SRU, 1, 1, 0, 0, 0, // PC_CREQV
+ SRU, 1, 1, 0, 0, 0, // PC_CRNAND
+ SRU, 1, 1, 0, 0, 0, // PC_CRNOR
+ SRU, 1, 1, 0, 0, 0, // PC_CROR
+ SRU, 1, 1, 0, 0, 0, // PC_CRORC
+ SRU, 1, 1, 0, 0, 0, // PC_CRXOR
+ SRU, 1, 1, 0, 0, 0, // PC_MCRF
+ SRU, 2, 2, 0, 0, 0, // PC_MTXER
+ SRU, 2, 2, 0, 0, 0, // PC_MTCTR
+ SRU, 2, 2, 0, 0, 0, // PC_MTLR
+ SRU, 1, 1, 0, 0, 0, // PC_MTCRF
+ SRU, 1, 1, 0, 0, 1, // PC_MTMSR
+ SRU, 1, 1, 0, 0, 1, // PC_MTSPR
+ SRU, 1, 1, 0, 0, 1, // PC_MFMSR
+ SRU, 1, 1, 0, 0, 1, // PC_MFSPR
+ SRU, 1, 1, 0, 0, 0, // PC_MFXER
+ SRU, 1, 1, 0, 0, 0, // PC_MFCTR
+ SRU, 1, 1, 0, 0, 0, // PC_MFLR
+ SRU, 1, 1, 0, 0, 0, // PC_MFCR
+ FPU1, 3, 1, 1, 1, 0, // PC_MFFS
+ FPU1, 3, 1, 1, 1, 0, // PC_MTFSF
+ SRU, 1, 1, 0, 0, 1, // PC_EIEIO
+ SRU, 1, 1, 0, 0, 1, // PC_ISYNC
+ SRU, 1, 1, 0, 0, 1, // PC_SYNC
+ SRU, 1, 1, 0, 0, 1, // PC_RFI
+ IU, 1, 1, 0, 0, 0, // PC_LI
+ IU, 1, 1, 0, 0, 0, // PC_LIS
+ IU, 1, 1, 0, 0, 0, // PC_MR
+ IU, 1, 1, 0, 0, 0, // PC_NOP
+ IU, 1, 1, 0, 0, 0, // PC_NOT
+ LSU1, 2, 1, 1, 0, 0, // PC_LFS
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSU
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFD
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDU
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFS
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSU
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFD
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDU
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDUX
+ FPU1, 3, 1, 1, 1, 0, // PC_FMR
+ FPU1, 3, 1, 1, 1, 0, // PC_FABS
+ FPU1, 3, 1, 1, 1, 0, // PC_FNEG
+ FPU1, 3, 1, 1, 1, 0, // PC_FNABS
+ FPU1, 3, 1, 1, 1, 0, // PC_FADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FADDS
+ FPU1, 3, 1, 1, 1, 0, // PC_FSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FSUBS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMUL
+ FPU1, 3, 1, 1, 1, 0, // PC_FMULS
+ FPU1, 33, 33, 0, 0, 0, // PC_FDIV
+ FPU1, 18, 18, 0, 0, 0, // PC_FDIVS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FMADDS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FMSUBS
+ FPU1, 4, 2, 1, 1, 0, // PC_FNMADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMADDS
+ FPU1, 4, 2, 1, 1, 0, // PC_FNMSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMSUBS
+ FPU1, 18, 18, 0, 0, 0, // PC_FRES
+ FPU1, 3, 1, 1, 1, 0, // PC_FRSQRTE
+ FPU1, 3, 1, 1, 1, 0, // PC_FSEL
+ FPU1, 3, 1, 1, 1, 0, // PC_FRSP
+ FPU1, 3, 1, 1, 1, 0, // PC_FCTIW
+ FPU1, 3, 1, 1, 1, 0, // PC_FCTIWZ
+ FPU1, 5, 1, 1, 1, 0, // PC_FCMPU
+ FPU1, 5, 1, 1, 1, 0, // PC_FCMPO
+ LSU1, 1, 1, 0, 0, 0, // PC_LWARX
+ LSU1, 1, 1, 0, 0, 0, // PC_LSWI
+ LSU1, 1, 1, 0, 0, 0, // PC_LSWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STFIWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STSWI
+ LSU1, 1, 1, 0, 0, 0, // PC_STSWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STWCX
+ IU, 1, 1, 0, 0, 1, // PC_ECIWX
+ IU, 1, 1, 0, 0, 1, // PC_ECOWX
+ IU, 1, 1, 0, 0, 0, // PC_DCBI
+ IU, 1, 1, 0, 0, 0, // PC_ICBI
+ IU, 1, 1, 0, 0, 0, // PC_MCRFS
+ IU, 1, 1, 0, 0, 0, // PC_MCRXR
+ IU, 1, 1, 0, 0, 0, // PC_MFTB
+ IU, 1, 1, 0, 0, 0, // PC_MFSR
+ IU, 1, 1, 0, 0, 0, // PC_MTSR
+ IU, 1, 1, 0, 0, 0, // PC_MFSRIN
+ IU, 1, 1, 0, 0, 0, // PC_MTSRIN
+ IU, 1, 1, 0, 0, 0, // PC_MTFSB0
+ IU, 1, 1, 0, 0, 0, // PC_MTFSB1
+ IU, 1, 1, 0, 0, 0, // PC_MTFSFI
+ IU, 1, 1, 0, 0, 1, // PC_SC
+ FPU1, 1, 1, 0, 0, 0, // PC_FSQRT
+ FPU1, 1, 1, 0, 0, 0, // PC_FSQRTS
+ IU, 1, 1, 0, 0, 0, // PC_TLBIA
+ IU, 1, 1, 0, 0, 0, // PC_TLBIE
+ IU, 1, 1, 0, 0, 0, // PC_TLBLD
+ IU, 1, 1, 0, 0, 0, // PC_TLBLI
+ IU, 1, 1, 0, 0, 0, // PC_TLBSYNC
+ IU, 1, 1, 0, 0, 1, // PC_TW
+ IU, 1, 1, 0, 0, 1, // PC_TRAP
+ IU, 1, 1, 0, 0, 1, // PC_TWI
+ IU, 1, 1, 0, 0, 1, // PC_OPWORD
+ IU, 1, 1, 0, 0, 0, // PC_MFROM
+ IU, 1, 1, 0, 0, 1, // PC_DSA
+ IU, 1, 1, 0, 0, 1, // PC_ESA
+ IU, 0, 0, 0, 0, 0, // PC_DCCCI
+ IU, 0, 0, 0, 0, 0, // PC_DCREAD
+ IU, 0, 0, 0, 0, 0, // PC_ICBT
+ IU, 0, 0, 0, 0, 0, // PC_ICCCI
+ IU, 0, 0, 0, 0, 0, // PC_ICREAD
+ IU, 0, 0, 0, 0, 0, // PC_RFCI
+ IU, 0, 0, 0, 0, 0, // PC_TLBRE
+ IU, 0, 0, 0, 0, 0, // PC_TLBSX
+ IU, 0, 0, 0, 0, 0, // PC_TLBWE
+ IU, 0, 0, 0, 0, 0, // PC_WRTEE
+ IU, 0, 0, 0, 0, 0, // PC_WRTEEI
+ IU, 0, 0, 0, 0, 0, // PC_MFDCR
+ IU, 0, 0, 0, 0, 0, // PC_MTDCR
+ IU, 0, 0, 0, 0, 0, // PC_DCBA
+ BPU, 0, 0, 0, 0, 0, // PC_DSS
+ BPU, 0, 0, 0, 0, 0, // PC_DSSALL
+ BPU, 0, 0, 0, 0, 0, // PC_DST
+ BPU, 0, 0, 0, 0, 0, // PC_DSTT
+ BPU, 0, 0, 0, 0, 0, // PC_DSTST
+ BPU, 0, 0, 0, 0, 0, // PC_DSTSTT
+ BPU, 0, 0, 0, 0, 0, // PC_LVEBX
+ BPU, 0, 0, 0, 0, 0, // PC_LVEHX
+ BPU, 0, 0, 0, 0, 0, // PC_LVEWX
+ BPU, 0, 0, 0, 0, 0, // PC_LVSL
+ BPU, 0, 0, 0, 0, 0, // PC_LVSR
+ BPU, 0, 0, 0, 0, 0, // PC_LVX
+ BPU, 0, 0, 0, 0, 0, // PC_LVXL
+ BPU, 0, 0, 0, 0, 0, // PC_STVEBX
+ BPU, 0, 0, 0, 0, 0, // PC_STVEHX
+ BPU, 0, 0, 0, 0, 0, // PC_STVEWX
+ BPU, 0, 0, 0, 0, 0, // PC_STVX
+ BPU, 0, 0, 0, 0, 0, // PC_STVXL
+ BPU, 0, 0, 0, 0, 0, // PC_MFVSCR
+ BPU, 0, 0, 0, 0, 0, // PC_MTVSCR
+ BPU, 0, 0, 0, 0, 0, // PC_VADDCUW
+ BPU, 0, 0, 0, 0, 0, // PC_VADDFP
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSBS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUBS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUWM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUWS
+ BPU, 0, 0, 0, 0, 0, // PC_VAND
+ BPU, 0, 0, 0, 0, 0, // PC_VANDC
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSB
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSH
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSW
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUB
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUH
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCFSX
+ BPU, 0, 0, 0, 0, 0, // PC_VCFUX
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSW
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCTSXS
+ BPU, 0, 0, 0, 0, 0, // PC_VCTUXS
+ BPU, 0, 0, 0, 0, 0, // PC_VEXPTEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VLOGEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSW
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUW
+ BPU, 0, 0, 0, 0, 0, // PC_VMINFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSW
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUW
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHB
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHH
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHW
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLB
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLH
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLW
+ BPU, 0, 0, 0, 0, 0, // PC_VMULESB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULESH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULEUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULEUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOUH
+ BPU, 0, 0, 0, 0, 0, // PC_VNOR
+ BPU, 0, 0, 0, 0, 0, // PC_VOR
+ BPU, 0, 0, 0, 0, 0, // PC_VPKPX
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSHSS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSHUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSWSS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSWUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUHUM
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUHUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUWUM
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUWUS
+ BPU, 0, 0, 0, 0, 0, // PC_VREFP
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIM
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIN
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIP
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIZ
+ BPU, 0, 0, 0, 0, 0, // PC_VRLB
+ BPU, 0, 0, 0, 0, 0, // PC_VRLH
+ BPU, 0, 0, 0, 0, 0, // PC_VRLW
+ BPU, 0, 0, 0, 0, 0, // PC_VRSQRTEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VSL
+ BPU, 0, 0, 0, 0, 0, // PC_VSLB
+ BPU, 0, 0, 0, 0, 0, // PC_VSLH
+ BPU, 0, 0, 0, 0, 0, // PC_VSLO
+ BPU, 0, 0, 0, 0, 0, // PC_VSLW
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTB
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTH
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTW
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISB
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISH
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISW
+ BPU, 0, 0, 0, 0, 0, // PC_VSR
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAB
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAH
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAW
+ BPU, 0, 0, 0, 0, 0, // PC_VSRB
+ BPU, 0, 0, 0, 0, 0, // PC_VSRH
+ BPU, 0, 0, 0, 0, 0, // PC_VSRO
+ BPU, 0, 0, 0, 0, 0, // PC_VSRW
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBCUW
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUWM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUMSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM2SWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4SBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4SHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4UBS
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHPX
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHSB
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHSH
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLPX
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLSB
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLSH
+ BPU, 0, 0, 0, 0, 0, // PC_VXOR
+ BPU, 0, 0, 0, 0, 0, // PC_VMADDFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMHADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMHRADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMLADDUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMMBM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMSHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VNMSUBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VPERM
+ BPU, 0, 0, 0, 0, 0, // PC_VSEL
+ BPU, 0, 0, 0, 0, 0, // PC_VSLDOI
+ BPU, 0, 0, 0, 0, 0, // PC_VMR
+ BPU, 0, 0, 0, 0, 0, // PC_VMRP
+ BPU, 0, 0, 0, 0, 0, // PC_SLE
+ BPU, 0, 0, 0, 0, 0, // PC_SLEQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRAIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRAQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRE
+ BPU, 0, 0, 0, 0, 0, // PC_SREA
+ BPU, 0, 0, 0, 0, 0, // PC_SREQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRQ
+ BPU, 0, 0, 0, 0, 0, // PC_MASKG
+ BPU, 0, 0, 0, 0, 0, // PC_MASKIR
+ BPU, 0, 0, 0, 0, 0, // PC_LSCBX
+ BPU, 0, 0, 0, 0, 0, // PC_DIV
+ BPU, 0, 0, 0, 0, 0, // PC_DIVS
+ BPU, 0, 0, 0, 0, 0, // PC_DOZ
+ BPU, 0, 0, 0, 0, 0, // PC_MUL
+ BPU, 0, 0, 0, 0, 0, // PC_NABS
+ BPU, 0, 0, 0, 0, 0, // PC_ABS
+ BPU, 0, 0, 0, 0, 0, // PC_CLCS
+ BPU, 0, 0, 0, 0, 0, // PC_DOZI
+ BPU, 0, 0, 0, 0, 0, // PC_RLMI
+ BPU, 0, 0, 0, 0, 0, // PC_RRIB
+};
+
+static void advance(int firstStage, int oldStage, int newStage) {
+ PCode *instr = pipeline[oldStage].instr;
+ int cycles = instruction_timing[instr->op].cycles[newStage - firstStage];
+ pipeline[newStage].instr = instr;
+ pipeline[newStage].remaining = cycles;
+ pipeline[oldStage].instr = NULL;
+}
+
+static void assign_completion_buffer(PCode *instr) {
+ completionbuffers.used++;
+ completionbuffers.free--;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].instr = instr;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].completed = 0;
+ completionbuffers.nextFreeSlot = (completionbuffers.nextFreeSlot + 1) % MaxEntries;
+}
+
+static void complete_instruction(int stage) {
+ PCode *instr = pipeline[stage].instr;
+ int buf = 0;
+ while (buf < MaxEntries && completionbuffers.entries[buf].instr != instr)
+ buf++;
+
+ completionbuffers.entries[buf].completed = 1;
+ pipeline[stage].instr = NULL;
+}
+
+static void retire_instruction(void) {
+ completionbuffers.entries[completionbuffers.nextToRetire].instr = NULL;
+ completionbuffers.used--;
+ completionbuffers.free++;
+ completionbuffers.nextToRetire = (completionbuffers.nextToRetire + 1) % MaxEntries;
+}
+
+static int latency(PCode *instr) {
+ int cycles = instruction_timing[instr->op].latency;
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
+ cycles += 2;
+ if (instr->op == PC_LMW || instr->op == PC_STMW)
+ cycles += instr->argCount - 2;
+ return cycles;
+}
+
+static void initialize(void) {
+ int stage;
+ int i;
+
+ for (stage = 0; stage < NumStages; stage++)
+ pipeline[stage].instr = NULL;
+
+ completionbuffers.free = 5;
+ completionbuffers.used = 0;
+ completionbuffers.nextToRetire = 0;
+ completionbuffers.nextFreeSlot = 0;
+ for (i = 0; i < MaxEntries; i++)
+ completionbuffers.entries[i].instr = NULL;
+}
+
+static int can_issue(PCode *instr) {
+ if (completionbuffers.free == 0)
+ return 0;
+ if (pipeline[instruction_timing[instr->op].stage].instr)
+ return 0;
+ if ((instr->flags & fIsWrite) && pipeline[LSU2].instr && (pipeline[LSU2].instr->flags & fIsWrite))
+ return 0;
+ return 1;
+}
+
+static void issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ int cycles = instruction_timing[instr->op].cycles[0];
+ assign_completion_buffer(instr);
+ pipeline[stage].instr = instr;
+ pipeline[stage].remaining = cycles;
+}
+
+static void advance_clock(void) {
+ int stage;
+
+ for (stage = 0; stage < NumStages; stage++) {
+ if (pipeline[stage].instr && pipeline[stage].remaining)
+ --pipeline[stage].remaining;
+ }
+
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ }
+ }
+
+ if (pipeline[IU].instr && pipeline[IU].remaining == 0)
+ complete_instruction(IU);
+ if (pipeline[LSU2].instr && pipeline[LSU2].remaining == 0)
+ complete_instruction(LSU2);
+ if (pipeline[FPU3].instr && pipeline[FPU3].remaining == 0)
+ complete_instruction(FPU3);
+ if (pipeline[SRU].instr && pipeline[SRU].remaining == 0)
+ complete_instruction(SRU);
+ if (pipeline[BPU].instr && pipeline[BPU].remaining == 0)
+ complete_instruction(BPU);
+
+ if (
+ pipeline[FPU1].instr &&
+ pipeline[FPU1].remaining == 0 &&
+ (pipeline[FPU1].instr->op == PC_FDIV || pipeline[FPU1].instr->op == PC_FDIVS)
+ )
+ complete_instruction(FPU1);
+
+ if (pipeline[FPU2].instr && pipeline[FPU2].remaining == 0 && !pipeline[FPU3].instr)
+ advance(FPU1, FPU2, FPU3);
+ if (pipeline[FPU1].instr && pipeline[FPU1].remaining == 0 && !pipeline[FPU2].instr)
+ advance(FPU1, FPU1, FPU2);
+ if (pipeline[LSU1].instr && pipeline[LSU1].remaining == 0 && !pipeline[LSU2].instr)
+ advance(LSU1, LSU1, LSU2);
+}
+
+static int serializes(PCode *instr) {
+ return instruction_timing[instr->op].serializes;
+}
+
+MachineInfo machine603 = {
+ 2,
+ 1,
+ 0,
+ &latency,
+ &initialize,
+ &can_issue,
+ &issue,
+ &advance_clock,
+ &serializes,
+ &default_uses_vpermute_unit
+};
diff --git a/compiler_and_linker/unsorted/MachineSimulation603e.c b/compiler_and_linker/unsorted/MachineSimulation603e.c
new file mode 100644
index 0000000..d3e1e47
--- /dev/null
+++ b/compiler_and_linker/unsorted/MachineSimulation603e.c
@@ -0,0 +1,650 @@
+#include "compiler/Scheduler.h"
+#include "compiler/PCode.h"
+#include "compiler/PCodeInfo.h"
+
+// https://www.nxp.com/docs/en/reference-manual/MPC603EUM.pdf
+
+typedef enum Stage {
+ BPU, // Branch Prediction Unit
+ IU, // Integer Unit
+ LSU1, // Load/Store Unit
+ LSU2,
+ FPU1, // Floating Point Unit
+ FPU2,
+ FPU3,
+ SRU, // System Register Unit
+ NumStages
+} Stage;
+
+static struct {
+ // the instruction currently in this pipeline stage
+ PCode *instr;
+
+ // how many cycles are left for this instruction to finish
+ int remaining;
+} pipeline[NumStages];
+
+enum {
+ MaxEntries = 5
+};
+
+static struct {
+ // how many entries remain unused in the queue
+ unsigned int free;
+
+ // how many entries are currently used in the queue
+ unsigned int used;
+
+ // the index of the next instruction that will be retired
+ unsigned int nextToRetire;
+
+ // the index of the next free slot that will be used when an instruction is dispatched
+ unsigned int nextFreeSlot;
+
+ // circular array of entries in the completion queue
+ struct {
+ PCode *instr;
+ int completed;
+ } entries[MaxEntries];
+} completionbuffers;
+
+static struct {
+ // the initial stage for this instruction
+ Stage stage;
+
+ // the total amount of cycles required by this instruction
+ char latency;
+
+ // how long it takes to finish each stage
+ char cycles[3];
+
+ // does this instruction serialise?
+ char serializes;
+} instruction_timing[OPCODE_MAX] = {
+ BPU, 0, 0, 0, 0, 1, // PC_B
+ BPU, 0, 0, 0, 0, 1, // PC_BL
+ BPU, 0, 0, 0, 0, 1, // PC_BC
+ BPU, 0, 0, 0, 0, 1, // PC_BCLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BT
+ BPU, 0, 0, 0, 0, 1, // PC_BTLR
+ BPU, 0, 0, 0, 0, 1, // PC_BTCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BF
+ BPU, 0, 0, 0, 0, 1, // PC_BFLR
+ BPU, 0, 0, 0, 0, 1, // PC_BFCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZF
+ BPU, 0, 0, 0, 0, 1, // PC_BDZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDZF
+ BPU, 0, 0, 0, 0, 1, // PC_BLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTRL
+ BPU, 0, 0, 0, 0, 1, // PC_BLRL
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHA
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LMW
+ LSU1, 2, 1, 1, 0, 0, // PC_STB
+ LSU1, 2, 1, 1, 0, 0, // PC_STBU
+ LSU1, 2, 1, 1, 0, 0, // PC_STBX
+ LSU1, 2, 1, 1, 0, 0, // PC_STBUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STH
+ LSU1, 2, 1, 1, 0, 0, // PC_STHU
+ LSU1, 2, 1, 1, 0, 0, // PC_STHX
+ LSU1, 2, 1, 1, 0, 0, // PC_STHUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STW
+ LSU1, 2, 1, 1, 0, 0, // PC_STWU
+ LSU1, 2, 1, 1, 0, 0, // PC_STWX
+ LSU1, 2, 1, 1, 0, 0, // PC_STWUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STMW
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBF
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBT
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBTST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBZ
+ IU, 1, 1, 0, 0, 0, // PC_ADD
+ IU, 1, 1, 0, 0, 0, // PC_ADDC
+ IU, 1, 1, 0, 0, 0, // PC_ADDE
+ IU, 1, 1, 0, 0, 0, // PC_ADDI
+ IU, 1, 1, 0, 0, 0, // PC_ADDIC
+ IU, 1, 1, 0, 0, 0, // PC_ADDICR
+ IU, 1, 1, 0, 0, 0, // PC_ADDIS
+ IU, 1, 1, 0, 0, 0, // PC_ADDME
+ IU, 1, 1, 0, 0, 0, // PC_ADDZE
+ IU, 37, 37, 0, 0, 0, // PC_DIVW
+ IU, 37, 37, 0, 0, 0, // PC_DIVWU
+ IU, 5, 5, 0, 0, 0, // PC_MULHW
+ IU, 5, 5, 0, 0, 0, // PC_MULHWU
+ IU, 3, 3, 0, 0, 0, // PC_MULLI
+ IU, 5, 5, 0, 0, 0, // PC_MULLW
+ IU, 1, 1, 0, 0, 0, // PC_NEG
+ IU, 1, 1, 0, 0, 0, // PC_SUBF
+ IU, 1, 1, 0, 0, 0, // PC_SUBFC
+ IU, 1, 1, 0, 0, 0, // PC_SUBFE
+ IU, 1, 1, 0, 0, 0, // PC_SUBFIC
+ IU, 1, 1, 0, 0, 0, // PC_SUBFME
+ IU, 1, 1, 0, 0, 0, // PC_SUBFZE
+ IU, 3, 1, 0, 0, 0, // PC_CMPI
+ IU, 3, 1, 0, 0, 0, // PC_CMP
+ IU, 3, 1, 0, 0, 0, // PC_CMPLI
+ IU, 3, 1, 0, 0, 0, // PC_CMPL
+ IU, 1, 1, 0, 0, 0, // PC_ANDI
+ IU, 1, 1, 0, 0, 0, // PC_ANDIS
+ IU, 1, 1, 0, 0, 0, // PC_ORI
+ IU, 1, 1, 0, 0, 0, // PC_ORIS
+ IU, 1, 1, 0, 0, 0, // PC_XORI
+ IU, 1, 1, 0, 0, 0, // PC_XORIS
+ IU, 1, 1, 0, 0, 0, // PC_AND
+ IU, 1, 1, 0, 0, 0, // PC_OR
+ IU, 1, 1, 0, 0, 0, // PC_XOR
+ IU, 1, 1, 0, 0, 0, // PC_NAND
+ IU, 1, 1, 0, 0, 0, // PC_NOR
+ IU, 1, 1, 0, 0, 0, // PC_EQV
+ IU, 1, 1, 0, 0, 0, // PC_ANDC
+ IU, 1, 1, 0, 0, 0, // PC_ORC
+ IU, 1, 1, 0, 0, 0, // PC_EXTSB
+ IU, 1, 1, 0, 0, 0, // PC_EXTSH
+ IU, 1, 1, 0, 0, 0, // PC_CNTLZW
+ IU, 1, 1, 0, 0, 0, // PC_RLWINM
+ IU, 1, 1, 0, 0, 0, // PC_RLWNM
+ IU, 1, 1, 0, 0, 0, // PC_RLWIMI
+ IU, 1, 1, 0, 0, 0, // PC_SLW
+ IU, 1, 1, 0, 0, 0, // PC_SRW
+ IU, 1, 1, 0, 0, 0, // PC_SRAWI
+ IU, 1, 1, 0, 0, 0, // PC_SRAW
+ SRU, 1, 1, 0, 0, 0, // PC_CRAND
+ SRU, 1, 1, 0, 0, 0, // PC_CRANDC
+ SRU, 1, 1, 0, 0, 0, // PC_CREQV
+ SRU, 1, 1, 0, 0, 0, // PC_CRNAND
+ SRU, 1, 1, 0, 0, 0, // PC_CRNOR
+ SRU, 1, 1, 0, 0, 0, // PC_CROR
+ SRU, 1, 1, 0, 0, 0, // PC_CRORC
+ SRU, 1, 1, 0, 0, 0, // PC_CRXOR
+ SRU, 1, 1, 0, 0, 0, // PC_MCRF
+ SRU, 2, 2, 0, 0, 0, // PC_MTXER
+ SRU, 2, 2, 0, 0, 0, // PC_MTCTR
+ SRU, 2, 2, 0, 0, 0, // PC_MTLR
+ SRU, 1, 1, 0, 0, 0, // PC_MTCRF
+ SRU, 1, 1, 0, 0, 1, // PC_MTMSR
+ SRU, 1, 1, 0, 0, 1, // PC_MTSPR
+ SRU, 1, 1, 0, 0, 1, // PC_MFMSR
+ SRU, 1, 1, 0, 0, 1, // PC_MFSPR
+ SRU, 1, 1, 0, 0, 0, // PC_MFXER
+ SRU, 1, 1, 0, 0, 0, // PC_MFCTR
+ SRU, 1, 1, 0, 0, 0, // PC_MFLR
+ SRU, 1, 1, 0, 0, 0, // PC_MFCR
+ FPU1, 3, 1, 1, 1, 0, // PC_MFFS
+ FPU1, 3, 1, 1, 1, 0, // PC_MTFSF
+ SRU, 1, 1, 0, 0, 1, // PC_EIEIO
+ SRU, 1, 1, 0, 0, 1, // PC_ISYNC
+ SRU, 1, 1, 0, 0, 1, // PC_SYNC
+ SRU, 1, 1, 0, 0, 1, // PC_RFI
+ IU, 1, 1, 0, 0, 0, // PC_LI
+ IU, 1, 1, 0, 0, 0, // PC_LIS
+ IU, 1, 1, 0, 0, 0, // PC_MR
+ IU, 1, 1, 0, 0, 0, // PC_NOP
+ IU, 1, 1, 0, 0, 0, // PC_NOT
+ LSU1, 2, 1, 1, 0, 0, // PC_LFS
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSU
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFD
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDU
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFS
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSU
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFD
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDU
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDUX
+ FPU1, 3, 1, 1, 1, 0, // PC_FMR
+ FPU1, 3, 1, 1, 1, 0, // PC_FABS
+ FPU1, 3, 1, 1, 1, 0, // PC_FNEG
+ FPU1, 3, 1, 1, 1, 0, // PC_FNABS
+ FPU1, 3, 1, 1, 1, 0, // PC_FADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FADDS
+ FPU1, 3, 1, 1, 1, 0, // PC_FSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FSUBS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMUL
+ FPU1, 3, 1, 1, 1, 0, // PC_FMULS
+ FPU1, 33, 33, 0, 0, 0, // PC_FDIV
+ FPU1, 18, 18, 0, 0, 0, // PC_FDIVS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FMADDS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FMSUBS
+ FPU1, 4, 2, 1, 1, 0, // PC_FNMADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMADDS
+ FPU1, 4, 2, 1, 1, 0, // PC_FNMSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMSUBS
+ FPU1, 18, 18, 0, 0, 0, // PC_FRES
+ FPU1, 3, 1, 1, 1, 0, // PC_FRSQRTE
+ FPU1, 3, 1, 1, 1, 0, // PC_FSEL
+ FPU1, 3, 1, 1, 1, 0, // PC_FRSP
+ FPU1, 3, 1, 1, 1, 0, // PC_FCTIW
+ FPU1, 3, 1, 1, 1, 0, // PC_FCTIWZ
+ FPU1, 5, 1, 1, 1, 0, // PC_FCMPU
+ FPU1, 5, 1, 1, 1, 0, // PC_FCMPO
+ LSU1, 1, 1, 0, 0, 0, // PC_LWARX
+ LSU1, 1, 1, 0, 0, 0, // PC_LSWI
+ LSU1, 1, 1, 0, 0, 0, // PC_LSWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STFIWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STSWI
+ LSU1, 1, 1, 0, 0, 0, // PC_STSWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STWCX
+ IU, 1, 1, 0, 0, 1, // PC_ECIWX
+ IU, 1, 1, 0, 0, 1, // PC_ECOWX
+ IU, 1, 1, 0, 0, 0, // PC_DCBI
+ IU, 1, 1, 0, 0, 0, // PC_ICBI
+ IU, 1, 1, 0, 0, 0, // PC_MCRFS
+ IU, 1, 1, 0, 0, 0, // PC_MCRXR
+ IU, 1, 1, 0, 0, 0, // PC_MFTB
+ IU, 1, 1, 0, 0, 0, // PC_MFSR
+ IU, 1, 1, 0, 0, 0, // PC_MTSR
+ IU, 1, 1, 0, 0, 0, // PC_MFSRIN
+ IU, 1, 1, 0, 0, 0, // PC_MTSRIN
+ IU, 1, 1, 0, 0, 0, // PC_MTFSB0
+ IU, 1, 1, 0, 0, 0, // PC_MTFSB1
+ IU, 1, 1, 0, 0, 0, // PC_MTFSFI
+ IU, 1, 1, 0, 0, 1, // PC_SC
+ FPU1, 1, 1, 0, 0, 0, // PC_FSQRT
+ FPU1, 1, 1, 0, 0, 0, // PC_FSQRTS
+ IU, 1, 1, 0, 0, 0, // PC_TLBIA
+ IU, 1, 1, 0, 0, 0, // PC_TLBIE
+ IU, 1, 1, 0, 0, 0, // PC_TLBLD
+ IU, 1, 1, 0, 0, 0, // PC_TLBLI
+ IU, 1, 1, 0, 0, 0, // PC_TLBSYNC
+ IU, 1, 1, 0, 0, 1, // PC_TW
+ IU, 1, 1, 0, 0, 1, // PC_TRAP
+ IU, 1, 1, 0, 0, 1, // PC_TWI
+ IU, 1, 1, 0, 0, 1, // PC_OPWORD
+ IU, 1, 1, 0, 0, 0, // PC_MFROM
+ IU, 1, 1, 0, 0, 1, // PC_DSA
+ IU, 1, 1, 0, 0, 1, // PC_ESA
+ IU, 0, 0, 0, 0, 0, // PC_DCCCI
+ IU, 0, 0, 0, 0, 0, // PC_DCREAD
+ IU, 0, 0, 0, 0, 0, // PC_ICBT
+ IU, 0, 0, 0, 0, 0, // PC_ICCCI
+ IU, 0, 0, 0, 0, 0, // PC_ICREAD
+ IU, 0, 0, 0, 0, 0, // PC_RFCI
+ IU, 0, 0, 0, 0, 0, // PC_TLBRE
+ IU, 0, 0, 0, 0, 0, // PC_TLBSX
+ IU, 0, 0, 0, 0, 0, // PC_TLBWE
+ IU, 0, 0, 0, 0, 0, // PC_WRTEE
+ IU, 0, 0, 0, 0, 0, // PC_WRTEEI
+ IU, 0, 0, 0, 0, 0, // PC_MFDCR
+ IU, 0, 0, 0, 0, 0, // PC_MTDCR
+ IU, 0, 0, 0, 0, 0, // PC_DCBA
+ BPU, 0, 0, 0, 0, 0, // PC_DSS
+ BPU, 0, 0, 0, 0, 0, // PC_DSSALL
+ BPU, 0, 0, 0, 0, 0, // PC_DST
+ BPU, 0, 0, 0, 0, 0, // PC_DSTT
+ BPU, 0, 0, 0, 0, 0, // PC_DSTST
+ BPU, 0, 0, 0, 0, 0, // PC_DSTSTT
+ BPU, 0, 0, 0, 0, 0, // PC_LVEBX
+ BPU, 0, 0, 0, 0, 0, // PC_LVEHX
+ BPU, 0, 0, 0, 0, 0, // PC_LVEWX
+ BPU, 0, 0, 0, 0, 0, // PC_LVSL
+ BPU, 0, 0, 0, 0, 0, // PC_LVSR
+ BPU, 0, 0, 0, 0, 0, // PC_LVX
+ BPU, 0, 0, 0, 0, 0, // PC_LVXL
+ BPU, 0, 0, 0, 0, 0, // PC_STVEBX
+ BPU, 0, 0, 0, 0, 0, // PC_STVEHX
+ BPU, 0, 0, 0, 0, 0, // PC_STVEWX
+ BPU, 0, 0, 0, 0, 0, // PC_STVX
+ BPU, 0, 0, 0, 0, 0, // PC_STVXL
+ BPU, 0, 0, 0, 0, 0, // PC_MFVSCR
+ BPU, 0, 0, 0, 0, 0, // PC_MTVSCR
+ BPU, 0, 0, 0, 0, 0, // PC_VADDCUW
+ BPU, 0, 0, 0, 0, 0, // PC_VADDFP
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSBS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUBS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUWM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUWS
+ BPU, 0, 0, 0, 0, 0, // PC_VAND
+ BPU, 0, 0, 0, 0, 0, // PC_VANDC
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSB
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSH
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSW
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUB
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUH
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCFSX
+ BPU, 0, 0, 0, 0, 0, // PC_VCFUX
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSW
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCTSXS
+ BPU, 0, 0, 0, 0, 0, // PC_VCTUXS
+ BPU, 0, 0, 0, 0, 0, // PC_VEXPTEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VLOGEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSW
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUW
+ BPU, 0, 0, 0, 0, 0, // PC_VMINFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSW
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUW
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHB
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHH
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHW
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLB
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLH
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLW
+ BPU, 0, 0, 0, 0, 0, // PC_VMULESB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULESH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULEUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULEUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOUH
+ BPU, 0, 0, 0, 0, 0, // PC_VNOR
+ BPU, 0, 0, 0, 0, 0, // PC_VOR
+ BPU, 0, 0, 0, 0, 0, // PC_VPKPX
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSHSS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSHUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSWSS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSWUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUHUM
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUHUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUWUM
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUWUS
+ BPU, 0, 0, 0, 0, 0, // PC_VREFP
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIM
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIN
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIP
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIZ
+ BPU, 0, 0, 0, 0, 0, // PC_VRLB
+ BPU, 0, 0, 0, 0, 0, // PC_VRLH
+ BPU, 0, 0, 0, 0, 0, // PC_VRLW
+ BPU, 0, 0, 0, 0, 0, // PC_VRSQRTEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VSL
+ BPU, 0, 0, 0, 0, 0, // PC_VSLB
+ BPU, 0, 0, 0, 0, 0, // PC_VSLH
+ BPU, 0, 0, 0, 0, 0, // PC_VSLO
+ BPU, 0, 0, 0, 0, 0, // PC_VSLW
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTB
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTH
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTW
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISB
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISH
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISW
+ BPU, 0, 0, 0, 0, 0, // PC_VSR
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAB
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAH
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAW
+ BPU, 0, 0, 0, 0, 0, // PC_VSRB
+ BPU, 0, 0, 0, 0, 0, // PC_VSRH
+ BPU, 0, 0, 0, 0, 0, // PC_VSRO
+ BPU, 0, 0, 0, 0, 0, // PC_VSRW
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBCUW
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUWM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUMSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM2SWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4SBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4SHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4UBS
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHPX
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHSB
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHSH
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLPX
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLSB
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLSH
+ BPU, 0, 0, 0, 0, 0, // PC_VXOR
+ BPU, 0, 0, 0, 0, 0, // PC_VMADDFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMHADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMHRADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMLADDUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMMBM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMSHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VNMSUBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VPERM
+ BPU, 0, 0, 0, 0, 0, // PC_VSEL
+ BPU, 0, 0, 0, 0, 0, // PC_VSLDOI
+ BPU, 0, 0, 0, 0, 0, // PC_VMR
+ BPU, 0, 0, 0, 0, 0, // PC_VMRP
+ BPU, 0, 0, 0, 0, 0, // PC_SLE
+ BPU, 0, 0, 0, 0, 0, // PC_SLEQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRAIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRAQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRE
+ BPU, 0, 0, 0, 0, 0, // PC_SREA
+ BPU, 0, 0, 0, 0, 0, // PC_SREQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRQ
+ BPU, 0, 0, 0, 0, 0, // PC_MASKG
+ BPU, 0, 0, 0, 0, 0, // PC_MASKIR
+ BPU, 0, 0, 0, 0, 0, // PC_LSCBX
+ BPU, 0, 0, 0, 0, 0, // PC_DIV
+ BPU, 0, 0, 0, 0, 0, // PC_DIVS
+ BPU, 0, 0, 0, 0, 0, // PC_DOZ
+ BPU, 0, 0, 0, 0, 0, // PC_MUL
+ BPU, 0, 0, 0, 0, 0, // PC_NABS
+ BPU, 0, 0, 0, 0, 0, // PC_ABS
+ BPU, 0, 0, 0, 0, 0, // PC_CLCS
+ BPU, 0, 0, 0, 0, 0, // PC_DOZI
+ BPU, 0, 0, 0, 0, 0, // PC_RLMI
+ BPU, 0, 0, 0, 0, 0, // PC_RRIB
+};
+
+static void advance(int firstStage, int oldStage, int newStage) {
+ PCode *instr = pipeline[oldStage].instr;
+ int cycles = instruction_timing[instr->op].cycles[newStage - firstStage];
+ pipeline[newStage].instr = instr;
+ pipeline[newStage].remaining = cycles;
+ pipeline[oldStage].instr = NULL;
+}
+
+static void assign_completion_buffer(PCode *instr) {
+ completionbuffers.used++;
+ completionbuffers.free--;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].instr = instr;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].completed = 0;
+ completionbuffers.nextFreeSlot = (completionbuffers.nextFreeSlot + 1) % MaxEntries;
+}
+
+static void complete_instruction(int stage) {
+ PCode *instr = pipeline[stage].instr;
+ int buf = 0;
+ while (buf < MaxEntries && completionbuffers.entries[buf].instr != instr)
+ buf++;
+
+ completionbuffers.entries[buf].completed = 1;
+ pipeline[stage].instr = NULL;
+}
+
+static void retire_instruction(void) {
+ completionbuffers.entries[completionbuffers.nextToRetire].instr = NULL;
+ completionbuffers.used--;
+ completionbuffers.free++;
+ completionbuffers.nextToRetire = (completionbuffers.nextToRetire + 1) % MaxEntries;
+}
+
+static int latency(PCode *instr) {
+ int cycles = instruction_timing[instr->op].latency;
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
+ cycles += 2;
+ if (instr->op == PC_LMW || instr->op == PC_STMW)
+ cycles += instr->argCount - 2;
+ return cycles;
+}
+
+static void initialize(void) {
+ int stage;
+ int i;
+
+ for (stage = 0; stage < NumStages; stage++)
+ pipeline[stage].instr = NULL;
+
+ completionbuffers.free = MaxEntries;
+ completionbuffers.used = 0;
+ completionbuffers.nextToRetire = 0;
+ completionbuffers.nextFreeSlot = 0;
+ for (i = 0; i < MaxEntries; i++)
+ completionbuffers.entries[i].instr = NULL;
+}
+
+static int can_issue(PCode *instr) {
+ int stage;
+
+ if (completionbuffers.free == 0)
+ return 0;
+
+ stage = instruction_timing[instr->op].stage;
+ if (pipeline[stage].instr) {
+ if (stage == IU) {
+ switch (instr->op) {
+ case PC_ADD:
+ case PC_ADDC:
+ case PC_ADDI:
+ case PC_ADDIS:
+ case PC_CMPI:
+ case PC_CMP:
+ case PC_CMPLI:
+ case PC_CMPL:
+ if (is_dependent(instr, pipeline[IU].instr, RegClass_GPR))
+ return 0;
+ if (!pipeline[SRU].instr)
+ return 1;
+ }
+ }
+ return 0;
+ }
+
+ if ((instr->flags & fIsWrite) && pipeline[LSU2].instr && (pipeline[LSU2].instr->flags & fIsWrite))
+ return 0;
+
+ return 1;
+}
+
+static void issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ int cycles = instruction_timing[instr->op].cycles[0];
+ if (stage == IU && pipeline[IU].instr)
+ stage = SRU;
+ assign_completion_buffer(instr);
+ pipeline[stage].instr = instr;
+ pipeline[stage].remaining = cycles;
+}
+
+static void advance_clock(void) {
+ int stage;
+
+ for (stage = 0; stage < NumStages; stage++) {
+ if (pipeline[stage].instr && pipeline[stage].remaining)
+ --pipeline[stage].remaining;
+ }
+
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ }
+ }
+
+ if (pipeline[IU].instr && pipeline[IU].remaining == 0)
+ complete_instruction(IU);
+ if (pipeline[LSU2].instr && pipeline[LSU2].remaining == 0)
+ complete_instruction(LSU2);
+ if (pipeline[FPU3].instr && pipeline[FPU3].remaining == 0)
+ complete_instruction(FPU3);
+ if (pipeline[SRU].instr && pipeline[SRU].remaining == 0)
+ complete_instruction(SRU);
+ if (pipeline[BPU].instr && pipeline[BPU].remaining == 0)
+ complete_instruction(BPU);
+
+ if (
+ pipeline[FPU1].instr &&
+ pipeline[FPU1].remaining == 0 &&
+ (pipeline[FPU1].instr->op == PC_FDIV || pipeline[FPU1].instr->op == PC_FDIVS)
+ )
+ complete_instruction(FPU1);
+
+ if (pipeline[FPU2].instr && pipeline[FPU2].remaining == 0 && !pipeline[FPU3].instr)
+ advance(FPU1, FPU2, FPU3);
+ if (pipeline[FPU1].instr && pipeline[FPU1].remaining == 0 && !pipeline[FPU2].instr)
+ advance(FPU1, FPU1, FPU2);
+ if (pipeline[LSU1].instr && pipeline[LSU1].remaining == 0 && !pipeline[LSU2].instr)
+ advance(LSU1, LSU1, LSU2);
+}
+
+static int serializes(PCode *instr) {
+ return instruction_timing[instr->op].serializes;
+}
+
+MachineInfo machine603e = {
+ 2,
+ 1,
+ 0,
+ &latency,
+ &initialize,
+ &can_issue,
+ &issue,
+ &advance_clock,
+ &serializes,
+ &default_uses_vpermute_unit
+};
diff --git a/compiler_and_linker/unsorted/MachineSimulation604.c b/compiler_and_linker/unsorted/MachineSimulation604.c
new file mode 100644
index 0000000..9775c9e
--- /dev/null
+++ b/compiler_and_linker/unsorted/MachineSimulation604.c
@@ -0,0 +1,670 @@
+#include "compiler/Scheduler.h"
+#include "compiler/PCode.h"
+#include "compiler/PCodeInfo.h"
+
+// https://archive.org/details/bitsavers_motorolaPosManualNov94_22719504
+
+typedef enum Stage {
+ SCIU, // Single-Cycle Integer Unit 1
+ SCIU2, // Single-Cycle Integer Unit 2
+ MCIU, // Multiple-Cycle Integer Unit
+ FPU1, // Floating Point Unit
+ FPU2,
+ FPU3,
+ LSU1, // Load/Store Unit
+ LSU2,
+ BPU, // Branch Prediction Unit
+ NumStages
+} Stage;
+
+static struct {
+ // the instruction currently in this pipeline stage
+ PCode *instr;
+
+ // how many cycles are left for this instruction to finish
+ int remaining;
+} pipeline[NumStages];
+
+enum {
+ MaxEntries = 16
+};
+
+static struct {
+ // how many entries remain unused in the queue
+ unsigned int free;
+
+ // how many entries are currently used in the queue
+ unsigned int used;
+
+ // the index of the next instruction that will be retired
+ unsigned int nextToRetire;
+
+ // the index of the next free slot that will be used when an instruction is dispatched
+ unsigned int nextFreeSlot;
+
+ // circular array of entries in the completion queue
+ struct {
+ PCode *instr;
+ int completed;
+ } entries[MaxEntries];
+} completionbuffers;
+
+static PCode *sciu_completed_instruction;
+static PCode *sciu2_completed_instruction;
+
+static struct {
+ // the initial stage for this instruction
+ Stage stage;
+
+ // the total amount of cycles required by this instruction
+ char latency;
+
+ // how long it takes to finish each stage
+ char cycles[3];
+
+ // does this instruction serialise?
+ char serializes;
+} instruction_timing[OPCODE_MAX] = {
+ BPU, 0, 0, 0, 0, 1, // PC_B
+ BPU, 0, 0, 0, 0, 1, // PC_BL
+ BPU, 0, 0, 0, 0, 1, // PC_BC
+ BPU, 0, 0, 0, 0, 1, // PC_BCLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BT
+ BPU, 0, 0, 0, 0, 1, // PC_BTLR
+ BPU, 0, 0, 0, 0, 1, // PC_BTCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BF
+ BPU, 0, 0, 0, 0, 1, // PC_BFLR
+ BPU, 0, 0, 0, 0, 1, // PC_BFCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZF
+ BPU, 0, 0, 0, 0, 1, // PC_BDZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDZF
+ BPU, 0, 0, 0, 0, 1, // PC_BLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTRL
+ BPU, 0, 0, 0, 0, 1, // PC_BLRL
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHA
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LMW
+ LSU1, 3, 1, 1, 0, 0, // PC_STB
+ LSU1, 3, 1, 1, 0, 0, // PC_STBU
+ LSU1, 3, 1, 1, 0, 0, // PC_STBX
+ LSU1, 3, 1, 1, 0, 0, // PC_STBUX
+ LSU1, 3, 1, 1, 0, 0, // PC_STH
+ LSU1, 3, 1, 1, 0, 0, // PC_STHU
+ LSU1, 3, 1, 1, 0, 0, // PC_STHX
+ LSU1, 3, 1, 1, 0, 0, // PC_STHUX
+ LSU1, 3, 1, 1, 0, 0, // PC_STHBRX
+ LSU1, 3, 1, 1, 0, 0, // PC_STW
+ LSU1, 3, 1, 1, 0, 0, // PC_STWU
+ LSU1, 3, 1, 1, 0, 0, // PC_STWX
+ LSU1, 3, 1, 1, 0, 0, // PC_STWUX
+ LSU1, 3, 1, 1, 0, 0, // PC_STWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STMW
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBF
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBT
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBTST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBZ
+ SCIU, 1, 1, 0, 0, 0, // PC_ADD
+ SCIU, 1, 1, 0, 0, 0, // PC_ADDC
+ SCIU, 1, 1, 0, 0, 0, // PC_ADDE
+ SCIU, 1, 1, 0, 0, 0, // PC_ADDI
+ SCIU, 1, 1, 0, 0, 0, // PC_ADDIC
+ SCIU, 1, 1, 0, 0, 0, // PC_ADDICR
+ SCIU, 1, 1, 0, 0, 0, // PC_ADDIS
+ SCIU, 1, 1, 0, 0, 0, // PC_ADDME
+ SCIU, 1, 1, 0, 0, 0, // PC_ADDZE
+ MCIU, 20, 20, 0, 0, 0, // PC_DIVW
+ MCIU, 20, 20, 0, 0, 0, // PC_DIVWU
+ MCIU, 4, 4, 0, 0, 0, // PC_MULHW
+ MCIU, 4, 4, 0, 0, 0, // PC_MULHWU
+ MCIU, 3, 3, 0, 0, 0, // PC_MULLI
+ MCIU, 4, 4, 0, 0, 0, // PC_MULLW
+ SCIU, 1, 1, 0, 0, 0, // PC_NEG
+ SCIU, 1, 1, 0, 0, 0, // PC_SUBF
+ SCIU, 1, 1, 0, 0, 0, // PC_SUBFC
+ SCIU, 1, 1, 0, 0, 0, // PC_SUBFE
+ SCIU, 1, 1, 0, 0, 0, // PC_SUBFIC
+ SCIU, 1, 1, 0, 0, 0, // PC_SUBFME
+ SCIU, 1, 1, 0, 0, 0, // PC_SUBFZE
+ SCIU, 3, 1, 0, 0, 0, // PC_CMPI
+ SCIU, 3, 1, 0, 0, 0, // PC_CMP
+ SCIU, 3, 1, 0, 0, 0, // PC_CMPLI
+ SCIU, 3, 1, 0, 0, 0, // PC_CMPL
+ SCIU, 1, 1, 0, 0, 0, // PC_ANDI
+ SCIU, 1, 1, 0, 0, 0, // PC_ANDIS
+ SCIU, 1, 1, 0, 0, 0, // PC_ORI
+ SCIU, 1, 1, 0, 0, 0, // PC_ORIS
+ SCIU, 1, 1, 0, 0, 0, // PC_XORI
+ SCIU, 1, 1, 0, 0, 0, // PC_XORIS
+ SCIU, 1, 1, 0, 0, 0, // PC_AND
+ SCIU, 1, 1, 0, 0, 0, // PC_OR
+ SCIU, 1, 1, 0, 0, 0, // PC_XOR
+ SCIU, 1, 1, 0, 0, 0, // PC_NAND
+ SCIU, 1, 1, 0, 0, 0, // PC_NOR
+ SCIU, 1, 1, 0, 0, 0, // PC_EQV
+ SCIU, 1, 1, 0, 0, 0, // PC_ANDC
+ SCIU, 1, 1, 0, 0, 0, // PC_ORC
+ SCIU, 1, 1, 0, 0, 0, // PC_EXTSB
+ SCIU, 1, 1, 0, 0, 0, // PC_EXTSH
+ SCIU, 1, 1, 0, 0, 0, // PC_CNTLZW
+ SCIU, 1, 1, 0, 0, 0, // PC_RLWINM
+ SCIU, 1, 1, 0, 0, 0, // PC_RLWNM
+ SCIU, 1, 1, 0, 0, 0, // PC_RLWIMI
+ SCIU, 1, 1, 0, 0, 0, // PC_SLW
+ SCIU, 1, 1, 0, 0, 0, // PC_SRW
+ SCIU, 1, 1, 0, 0, 0, // PC_SRAWI
+ SCIU, 1, 1, 0, 0, 0, // PC_SRAW
+ BPU, 1, 1, 0, 0, 0, // PC_CRAND
+ BPU, 1, 1, 0, 0, 0, // PC_CRANDC
+ BPU, 1, 1, 0, 0, 0, // PC_CREQV
+ BPU, 1, 1, 0, 0, 0, // PC_CRNAND
+ BPU, 1, 1, 0, 0, 0, // PC_CRNOR
+ BPU, 1, 1, 0, 0, 0, // PC_CROR
+ BPU, 1, 1, 0, 0, 0, // PC_CRORC
+ BPU, 1, 1, 0, 0, 0, // PC_CRXOR
+ BPU, 1, 1, 0, 0, 0, // PC_MCRF
+ MCIU, 1, 1, 0, 0, 0, // PC_MTXER
+ MCIU, 1, 1, 0, 0, 0, // PC_MTCTR
+ MCIU, 1, 1, 0, 0, 0, // PC_MTLR
+ MCIU, 1, 1, 0, 0, 0, // PC_MTCRF
+ MCIU, 1, 1, 0, 0, 0, // PC_MTMSR
+ MCIU, 1, 1, 0, 0, 0, // PC_MTSPR
+ MCIU, 1, 1, 0, 0, 0, // PC_MFMSR
+ MCIU, 1, 1, 0, 0, 0, // PC_MFSPR
+ MCIU, 3, 3, 0, 0, 0, // PC_MFXER
+ MCIU, 3, 3, 0, 0, 0, // PC_MFCTR
+ MCIU, 3, 3, 0, 0, 0, // PC_MFLR
+ MCIU, 3, 3, 0, 0, 0, // PC_MFCR
+ FPU1, 3, 1, 1, 1, 0, // PC_MFFS
+ FPU1, 3, 1, 1, 1, 0, // PC_MTFSF
+ LSU1, 1, 0, 0, 0, 1, // PC_EIEIO
+ LSU1, 1, 0, 0, 0, 1, // PC_ISYNC
+ LSU1, 1, 0, 0, 0, 1, // PC_SYNC
+ LSU1, 1, 1, 0, 0, 1, // PC_RFI
+ SCIU, 1, 1, 0, 0, 0, // PC_LI
+ SCIU, 1, 1, 0, 0, 0, // PC_LIS
+ SCIU, 1, 1, 0, 0, 0, // PC_MR
+ SCIU, 1, 1, 0, 0, 0, // PC_NOP
+ SCIU, 1, 1, 0, 0, 0, // PC_NOT
+ LSU1, 3, 1, 1, 0, 0, // PC_LFS
+ LSU1, 3, 1, 1, 0, 0, // PC_LFSU
+ LSU1, 3, 1, 1, 0, 0, // PC_LFSX
+ LSU1, 3, 1, 1, 0, 0, // PC_LFSUX
+ LSU1, 3, 1, 1, 0, 0, // PC_LFD
+ LSU1, 3, 1, 1, 0, 0, // PC_LFDU
+ LSU1, 3, 1, 1, 0, 0, // PC_LFDX
+ LSU1, 3, 1, 1, 0, 0, // PC_LFDUX
+ LSU1, 3, 1, 1, 0, 0, // PC_STFS
+ LSU1, 3, 1, 1, 0, 0, // PC_STFSU
+ LSU1, 3, 1, 1, 0, 0, // PC_STFSX
+ LSU1, 3, 1, 1, 0, 0, // PC_STFSUX
+ LSU1, 3, 1, 1, 0, 0, // PC_STFD
+ LSU1, 3, 1, 1, 0, 0, // PC_STFDU
+ LSU1, 3, 1, 1, 0, 0, // PC_STFDX
+ LSU1, 3, 1, 1, 0, 0, // PC_STFDUX
+ FPU1, 3, 1, 1, 1, 0, // PC_FMR
+ FPU1, 3, 1, 1, 1, 0, // PC_FABS
+ FPU1, 3, 1, 1, 1, 0, // PC_FNEG
+ FPU1, 3, 1, 1, 1, 0, // PC_FNABS
+ FPU1, 3, 1, 1, 1, 0, // PC_FADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FADDS
+ FPU1, 3, 1, 1, 1, 0, // PC_FSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FSUBS
+ FPU1, 3, 1, 1, 1, 0, // PC_FMUL
+ FPU1, 3, 1, 1, 1, 0, // PC_FMULS
+ FPU1, 32, 32, 0, 0, 0, // PC_FDIV
+ FPU1, 18, 18, 0, 0, 0, // PC_FDIVS
+ FPU1, 3, 1, 1, 1, 0, // PC_FMADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FMADDS
+ FPU1, 3, 1, 1, 1, 0, // PC_FMSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FMSUBS
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMADDS
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMSUBS
+ FPU1, 18, 18, 0, 0, 0, // PC_FRES
+ FPU1, 3, 1, 1, 1, 0, // PC_FRSQRTE
+ FPU1, 3, 1, 1, 1, 0, // PC_FSEL
+ FPU1, 3, 1, 1, 1, 0, // PC_FRSP
+ FPU1, 3, 1, 1, 1, 0, // PC_FCTIW
+ FPU1, 3, 1, 1, 1, 0, // PC_FCTIWZ
+ FPU1, 5, 1, 1, 1, 0, // PC_FCMPU
+ FPU1, 5, 1, 1, 1, 0, // PC_FCMPO
+ LSU1, 1, 1, 0, 0, 0, // PC_LWARX
+ LSU1, 1, 1, 0, 0, 0, // PC_LSWI
+ LSU1, 1, 1, 0, 0, 0, // PC_LSWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STFIWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STSWI
+ LSU1, 1, 1, 0, 0, 0, // PC_STSWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STWCX
+ MCIU, 1, 1, 0, 0, 1, // PC_ECIWX
+ MCIU, 1, 1, 0, 0, 1, // PC_ECOWX
+ MCIU, 1, 1, 0, 0, 0, // PC_DCBI
+ MCIU, 1, 1, 0, 0, 0, // PC_ICBI
+ MCIU, 1, 1, 0, 0, 0, // PC_MCRFS
+ MCIU, 1, 1, 0, 0, 0, // PC_MCRXR
+ MCIU, 1, 1, 0, 0, 0, // PC_MFTB
+ MCIU, 1, 1, 0, 0, 0, // PC_MFSR
+ MCIU, 1, 1, 0, 0, 0, // PC_MTSR
+ MCIU, 1, 1, 0, 0, 0, // PC_MFSRIN
+ MCIU, 1, 1, 0, 0, 0, // PC_MTSRIN
+ MCIU, 1, 1, 0, 0, 0, // PC_MTFSB0
+ MCIU, 1, 1, 0, 0, 0, // PC_MTFSB1
+ MCIU, 1, 1, 0, 0, 0, // PC_MTFSFI
+ MCIU, 1, 1, 0, 0, 1, // PC_SC
+ FPU1, 1, 1, 0, 0, 0, // PC_FSQRT
+ FPU1, 1, 1, 0, 0, 0, // PC_FSQRTS
+ MCIU, 1, 1, 0, 0, 0, // PC_TLBIA
+ MCIU, 1, 1, 0, 0, 0, // PC_TLBIE
+ MCIU, 1, 1, 0, 0, 0, // PC_TLBLD
+ MCIU, 1, 1, 0, 0, 0, // PC_TLBLI
+ MCIU, 1, 1, 0, 0, 0, // PC_TLBSYNC
+ MCIU, 1, 1, 0, 0, 1, // PC_TW
+ MCIU, 1, 1, 0, 0, 1, // PC_TRAP
+ MCIU, 1, 1, 0, 0, 1, // PC_TWI
+ MCIU, 1, 1, 0, 0, 1, // PC_OPWORD
+ MCIU, 1, 1, 0, 0, 0, // PC_MFROM
+ MCIU, 1, 1, 0, 0, 1, // PC_DSA
+ MCIU, 1, 1, 0, 0, 1, // PC_ESA
+ MCIU, 0, 0, 0, 0, 0, // PC_DCCCI
+ MCIU, 0, 0, 0, 0, 0, // PC_DCREAD
+ MCIU, 0, 0, 0, 0, 0, // PC_ICBT
+ MCIU, 0, 0, 0, 0, 0, // PC_ICCCI
+ MCIU, 0, 0, 0, 0, 0, // PC_ICREAD
+ MCIU, 0, 0, 0, 0, 0, // PC_RFCI
+ MCIU, 0, 0, 0, 0, 0, // PC_TLBRE
+ MCIU, 0, 0, 0, 0, 0, // PC_TLBSX
+ MCIU, 0, 0, 0, 0, 0, // PC_TLBWE
+ MCIU, 0, 0, 0, 0, 0, // PC_WRTEE
+ MCIU, 0, 0, 0, 0, 0, // PC_WRTEEI
+ MCIU, 0, 0, 0, 0, 0, // PC_MFDCR
+ MCIU, 0, 0, 0, 0, 0, // PC_MTDCR
+ MCIU, 0, 0, 0, 0, 0, // PC_DCBA
+ SCIU, 0, 0, 0, 0, 0, // PC_DSS
+ SCIU, 0, 0, 0, 0, 0, // PC_DSSALL
+ SCIU, 0, 0, 0, 0, 0, // PC_DST
+ SCIU, 0, 0, 0, 0, 0, // PC_DSTT
+ SCIU, 0, 0, 0, 0, 0, // PC_DSTST
+ SCIU, 0, 0, 0, 0, 0, // PC_DSTSTT
+ SCIU, 0, 0, 0, 0, 0, // PC_LVEBX
+ SCIU, 0, 0, 0, 0, 0, // PC_LVEHX
+ SCIU, 0, 0, 0, 0, 0, // PC_LVEWX
+ SCIU, 0, 0, 0, 0, 0, // PC_LVSL
+ SCIU, 0, 0, 0, 0, 0, // PC_LVSR
+ SCIU, 0, 0, 0, 0, 0, // PC_LVX
+ SCIU, 0, 0, 0, 0, 0, // PC_LVXL
+ SCIU, 0, 0, 0, 0, 0, // PC_STVEBX
+ SCIU, 0, 0, 0, 0, 0, // PC_STVEHX
+ SCIU, 0, 0, 0, 0, 0, // PC_STVEWX
+ SCIU, 0, 0, 0, 0, 0, // PC_STVX
+ SCIU, 0, 0, 0, 0, 0, // PC_STVXL
+ SCIU, 0, 0, 0, 0, 0, // PC_MFVSCR
+ SCIU, 0, 0, 0, 0, 0, // PC_MTVSCR
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDCUW
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDSBS
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDSHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDSWS
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDUBM
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDUBS
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDUHM
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDUHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDUWM
+ SCIU, 0, 0, 0, 0, 0, // PC_VADDUWS
+ SCIU, 0, 0, 0, 0, 0, // PC_VAND
+ SCIU, 0, 0, 0, 0, 0, // PC_VANDC
+ SCIU, 0, 0, 0, 0, 0, // PC_VAVGSB
+ SCIU, 0, 0, 0, 0, 0, // PC_VAVGSH
+ SCIU, 0, 0, 0, 0, 0, // PC_VAVGSW
+ SCIU, 0, 0, 0, 0, 0, // PC_VAVGUB
+ SCIU, 0, 0, 0, 0, 0, // PC_VAVGUH
+ SCIU, 0, 0, 0, 0, 0, // PC_VAVGUW
+ SCIU, 0, 0, 0, 0, 0, // PC_VCFSX
+ SCIU, 0, 0, 0, 0, 0, // PC_VCFUX
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPBFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPEQFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPEQUB
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPEQUH
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPEQUW
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPGEFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPGTFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPGTSB
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPGTSH
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPGTSW
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPGTUB
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPGTUH
+ SCIU, 0, 0, 0, 0, 0, // PC_VCMPGTUW
+ SCIU, 0, 0, 0, 0, 0, // PC_VCTSXS
+ SCIU, 0, 0, 0, 0, 0, // PC_VCTUXS
+ SCIU, 0, 0, 0, 0, 0, // PC_VEXPTEFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VLOGEFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VMAXFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VMAXSB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMAXSH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMAXSW
+ SCIU, 0, 0, 0, 0, 0, // PC_VMAXUB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMAXUH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMAXUW
+ SCIU, 0, 0, 0, 0, 0, // PC_VMINFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VMINSB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMINSH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMINSW
+ SCIU, 0, 0, 0, 0, 0, // PC_VMINUB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMINUH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMINUW
+ SCIU, 0, 0, 0, 0, 0, // PC_VMRGHB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMRGHH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMRGHW
+ SCIU, 0, 0, 0, 0, 0, // PC_VMRGLB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMRGLH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMRGLW
+ SCIU, 0, 0, 0, 0, 0, // PC_VMULESB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMULESH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMULEUB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMULEUH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMULOSB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMULOSH
+ SCIU, 0, 0, 0, 0, 0, // PC_VMULOUB
+ SCIU, 0, 0, 0, 0, 0, // PC_VMULOUH
+ SCIU, 0, 0, 0, 0, 0, // PC_VNOR
+ SCIU, 0, 0, 0, 0, 0, // PC_VOR
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKPX
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKSHSS
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKSHUS
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKSWSS
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKSWUS
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKUHUM
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKUHUS
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKUWUM
+ SCIU, 0, 0, 0, 0, 0, // PC_VPKUWUS
+ SCIU, 0, 0, 0, 0, 0, // PC_VREFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VRFIM
+ SCIU, 0, 0, 0, 0, 0, // PC_VRFIN
+ SCIU, 0, 0, 0, 0, 0, // PC_VRFIP
+ SCIU, 0, 0, 0, 0, 0, // PC_VRFIZ
+ SCIU, 0, 0, 0, 0, 0, // PC_VRLB
+ SCIU, 0, 0, 0, 0, 0, // PC_VRLH
+ SCIU, 0, 0, 0, 0, 0, // PC_VRLW
+ SCIU, 0, 0, 0, 0, 0, // PC_VRSQRTEFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VSL
+ SCIU, 0, 0, 0, 0, 0, // PC_VSLB
+ SCIU, 0, 0, 0, 0, 0, // PC_VSLH
+ SCIU, 0, 0, 0, 0, 0, // PC_VSLO
+ SCIU, 0, 0, 0, 0, 0, // PC_VSLW
+ SCIU, 0, 0, 0, 0, 0, // PC_VSPLTB
+ SCIU, 0, 0, 0, 0, 0, // PC_VSPLTH
+ SCIU, 0, 0, 0, 0, 0, // PC_VSPLTW
+ SCIU, 0, 0, 0, 0, 0, // PC_VSPLTISB
+ SCIU, 0, 0, 0, 0, 0, // PC_VSPLTISH
+ SCIU, 0, 0, 0, 0, 0, // PC_VSPLTISW
+ SCIU, 0, 0, 0, 0, 0, // PC_VSR
+ SCIU, 0, 0, 0, 0, 0, // PC_VSRAB
+ SCIU, 0, 0, 0, 0, 0, // PC_VSRAH
+ SCIU, 0, 0, 0, 0, 0, // PC_VSRAW
+ SCIU, 0, 0, 0, 0, 0, // PC_VSRB
+ SCIU, 0, 0, 0, 0, 0, // PC_VSRH
+ SCIU, 0, 0, 0, 0, 0, // PC_VSRO
+ SCIU, 0, 0, 0, 0, 0, // PC_VSRW
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBCUW
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBSBS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBSHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBSWS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBUBM
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBUBS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBUHM
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBUHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBUWM
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUBUWS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUMSWS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUM2SWS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUM4SBS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUM4SHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VSUM4UBS
+ SCIU, 0, 0, 0, 0, 0, // PC_VUPKHPX
+ SCIU, 0, 0, 0, 0, 0, // PC_VUPKHSB
+ SCIU, 0, 0, 0, 0, 0, // PC_VUPKHSH
+ SCIU, 0, 0, 0, 0, 0, // PC_VUPKLPX
+ SCIU, 0, 0, 0, 0, 0, // PC_VUPKLSB
+ SCIU, 0, 0, 0, 0, 0, // PC_VUPKLSH
+ SCIU, 0, 0, 0, 0, 0, // PC_VXOR
+ SCIU, 0, 0, 0, 0, 0, // PC_VMADDFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VMHADDSHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VMHRADDSHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VMLADDUHM
+ SCIU, 0, 0, 0, 0, 0, // PC_VMSUMMBM
+ SCIU, 0, 0, 0, 0, 0, // PC_VMSUMSHM
+ SCIU, 0, 0, 0, 0, 0, // PC_VMSUMSHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VMSUMUBM
+ SCIU, 0, 0, 0, 0, 0, // PC_VMSUMUHM
+ SCIU, 0, 0, 0, 0, 0, // PC_VMSUMUHS
+ SCIU, 0, 0, 0, 0, 0, // PC_VNMSUBFP
+ SCIU, 0, 0, 0, 0, 0, // PC_VPERM
+ SCIU, 0, 0, 0, 0, 0, // PC_VSEL
+ SCIU, 0, 0, 0, 0, 0, // PC_VSLDOI
+ SCIU, 0, 0, 0, 0, 0, // PC_VMR
+ SCIU, 0, 0, 0, 0, 0, // PC_VMRP
+ SCIU, 0, 0, 0, 0, 0, // PC_SLE
+ SCIU, 0, 0, 0, 0, 0, // PC_SLEQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SLIQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SLLIQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SLLQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SLQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SRAIQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SRAQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SRE
+ SCIU, 0, 0, 0, 0, 0, // PC_SREA
+ SCIU, 0, 0, 0, 0, 0, // PC_SREQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SRIQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SRLIQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SRLQ
+ SCIU, 0, 0, 0, 0, 0, // PC_SRQ
+ SCIU, 0, 0, 0, 0, 0, // PC_MASKG
+ SCIU, 0, 0, 0, 0, 0, // PC_MASKIR
+ SCIU, 0, 0, 0, 0, 0, // PC_LSCBX
+ SCIU, 0, 0, 0, 0, 0, // PC_DIV
+ SCIU, 0, 0, 0, 0, 0, // PC_DIVS
+ SCIU, 0, 0, 0, 0, 0, // PC_DOZ
+ SCIU, 0, 0, 0, 0, 0, // PC_MUL
+ SCIU, 0, 0, 0, 0, 0, // PC_NABS
+ SCIU, 0, 0, 0, 0, 0, // PC_ABS
+ SCIU, 0, 0, 0, 0, 0, // PC_CLCS
+ SCIU, 0, 0, 0, 0, 0, // PC_DOZI
+ SCIU, 0, 0, 0, 0, 0, // PC_RLMI
+ SCIU, 0, 0, 0, 0, 0, // PC_RRIB
+};
+
+static void advance(int firstStage, int oldStage, int newStage) {
+ PCode *instr = pipeline[oldStage].instr;
+ int cycles = instruction_timing[instr->op].cycles[newStage - firstStage];
+ pipeline[newStage].instr = instr;
+ pipeline[newStage].remaining = cycles;
+ pipeline[oldStage].instr = NULL;
+}
+
+static void assign_completion_buffer(PCode *instr) {
+ completionbuffers.used++;
+ completionbuffers.free--;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].instr = instr;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].completed = 0;
+ completionbuffers.nextFreeSlot = (completionbuffers.nextFreeSlot + 1) % MaxEntries;
+}
+
+static void complete_instruction(int stage) {
+ PCode *instr = pipeline[stage].instr;
+ int buf = 0;
+ while (buf < MaxEntries && completionbuffers.entries[buf].instr != instr)
+ buf++;
+
+ completionbuffers.entries[buf].completed = 1;
+ pipeline[stage].instr = NULL;
+
+ if (stage == SCIU)
+ sciu_completed_instruction = instr;
+ else if (stage == SCIU2)
+ sciu2_completed_instruction = instr;
+}
+
+static void retire_instruction(void) {
+ completionbuffers.entries[completionbuffers.nextToRetire].instr = NULL;
+ completionbuffers.used--;
+ completionbuffers.free++;
+ completionbuffers.nextToRetire = (completionbuffers.nextToRetire + 1) % MaxEntries;
+}
+
+static int latency(PCode *instr) {
+ int cycles = instruction_timing[instr->op].latency;
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
+ cycles += 2;
+ if (instr->op == PC_LMW || instr->op == PC_STMW)
+ cycles += instr->argCount - 2;
+ return cycles;
+}
+
+static void initialize(void) {
+ int stage;
+ int i;
+
+ for (stage = 0; stage < NumStages; stage++)
+ pipeline[stage].instr = NULL;
+
+ completionbuffers.free = MaxEntries;
+ completionbuffers.used = 0;
+ completionbuffers.nextToRetire = 0;
+ completionbuffers.nextFreeSlot = 0;
+ for (i = 0; i < MaxEntries; i++)
+ completionbuffers.entries[i].instr = NULL;
+
+ sciu_completed_instruction = NULL;
+ sciu2_completed_instruction = NULL;
+}
+
+static int can_issue(PCode *instr) {
+ PCode *check;
+ int stage = instruction_timing[instr->op].stage;
+
+ if (completionbuffers.free == 0)
+ return 0;
+
+ if (stage == SCIU) {
+ int isClear1 = !pipeline[SCIU].instr;
+ int isClear2 = !pipeline[SCIU2].instr;
+ if (!isClear1 && !isClear2)
+ return 0;
+ if (isClear1 && isClear2)
+ return 1;
+
+ if (isClear1)
+ check = pipeline[SCIU2].instr;
+ else
+ check = pipeline[SCIU].instr;
+
+ if (is_dependent(instr, check, RegClass_GPR))
+ return 0;
+ if (is_dependent(instr, sciu_completed_instruction, RegClass_GPR))
+ return 0;
+ if (is_dependent(instr, sciu2_completed_instruction, RegClass_GPR))
+ return 0;
+ } else {
+ if (pipeline[stage].instr)
+ return 0;
+ }
+
+ return 1;
+}
+
+static void issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ int cycles = instruction_timing[instr->op].cycles[0];
+ if (stage == SCIU && pipeline[SCIU].instr)
+ stage = SCIU2;
+ assign_completion_buffer(instr);
+ pipeline[stage].instr = instr;
+ pipeline[stage].remaining = cycles;
+}
+
+static void advance_clock(void) {
+ int stage;
+ int i;
+
+ sciu_completed_instruction = NULL;
+ sciu2_completed_instruction = NULL;
+
+ for (stage = 0; stage < NumStages; stage++) {
+ if (pipeline[stage].instr && pipeline[stage].remaining)
+ --pipeline[stage].remaining;
+ }
+
+ for (i = 0; i < 5; i++) {
+ if (completionbuffers.used == 0)
+ break;
+ if (completionbuffers.entries[completionbuffers.nextToRetire].completed == 0)
+ break;
+ retire_instruction();
+ }
+
+ if (pipeline[SCIU].instr && pipeline[SCIU].remaining == 0)
+ complete_instruction(SCIU);
+ if (pipeline[SCIU2].instr && pipeline[SCIU2].remaining == 0)
+ complete_instruction(SCIU2);
+ if (pipeline[MCIU].instr && pipeline[MCIU].remaining == 0)
+ complete_instruction(MCIU);
+ if (pipeline[LSU2].instr && pipeline[LSU2].remaining == 0)
+ complete_instruction(LSU2);
+ if (pipeline[FPU3].instr && pipeline[FPU3].remaining == 0)
+ complete_instruction(FPU3);
+ if (pipeline[BPU].instr && pipeline[BPU].remaining == 0)
+ complete_instruction(BPU);
+
+ if (
+ pipeline[FPU1].instr &&
+ pipeline[FPU1].remaining == 0 &&
+ (pipeline[FPU1].instr->op == PC_FDIV || pipeline[FPU1].instr->op == PC_FDIVS)
+ )
+ complete_instruction(FPU1);
+
+ if (pipeline[FPU2].instr && pipeline[FPU2].remaining == 0 && !pipeline[FPU3].instr)
+ advance(FPU1, FPU2, FPU3);
+ if (pipeline[FPU1].instr && pipeline[FPU1].remaining == 0 && !pipeline[FPU2].instr)
+ advance(FPU1, FPU1, FPU2);
+ if (pipeline[LSU1].instr && pipeline[LSU1].remaining == 0 && !pipeline[LSU2].instr)
+ advance(LSU1, LSU1, LSU2);
+}
+
+static int serializes(PCode *instr) {
+ return instruction_timing[instr->op].serializes;
+}
+
+MachineInfo machine604 = {
+ 4,
+ 1,
+ 0,
+ &latency,
+ &initialize,
+ &can_issue,
+ &issue,
+ &advance_clock,
+ &serializes,
+ &default_uses_vpermute_unit
+};
diff --git a/compiler_and_linker/unsorted/MachineSimulation7400.c b/compiler_and_linker/unsorted/MachineSimulation7400.c
new file mode 100644
index 0000000..56b375c
--- /dev/null
+++ b/compiler_and_linker/unsorted/MachineSimulation7400.c
@@ -0,0 +1,744 @@
+#include "compiler/Scheduler.h"
+#include "compiler/PCode.h"
+#include "compiler/PCodeInfo.h"
+
+// https://www.nxp.com/docs/en/reference-manual/MPC7410UM.pdf
+
+typedef enum Stage {
+ BPU, // Branch Prediction Unit
+ IU1, // Integer Unit 1
+ IU2, // Integer Unit 2
+
+ LSU1, // Load/Store Unit
+ LSU2,
+
+ FPU1, // Floating Point Unit
+ FPU2,
+ FPU3,
+
+ SRU, // System Register Unit
+ VSIU, // Vector Simple Integer Unit
+ VPU, // AltiVec Permute Unit
+
+ VCIU1, // Vector Complex Integer Unit
+ VCIU2,
+ VCIU3,
+
+ VFPU1, // Vector Floating-Point Unit
+ VFPU2,
+ VFPU3,
+ VFPU4,
+
+ NumStages
+} Stage;
+
+static struct {
+ // the instruction currently in this pipeline stage
+ PCode *instr;
+
+ // how many cycles are left for this instruction to finish
+ int remaining;
+} pipeline[NumStages];
+
+static PCode *iu1_completed_instruction;
+static PCode *iu2_completed_instruction;
+
+enum {
+ MaxEntries = 8
+};
+
+static struct {
+ // how many entries remain unused in the queue
+ unsigned int free;
+
+ // how many entries are currently used in the queue
+ unsigned int used;
+
+ // the index of the next instruction that will be retired
+ unsigned int nextToRetire;
+
+ // the index of the next free slot that will be used when an instruction is dispatched
+ unsigned int nextFreeSlot;
+
+ // circular array of entries in the completion queue
+ struct {
+ PCode *instr;
+ int completed;
+ } entries[MaxEntries];
+} completionbuffers;
+
+static struct {
+ // the initial stage for this instruction
+ Stage stage;
+
+ // the total amount of cycles required by this instruction
+ char latency;
+
+ // how long it takes to finish each stage
+ char cycles[4];
+
+ // does this instruction serialise?
+ char serializes;
+
+ char unused;
+} instruction_timing[OPCODE_MAX] = {
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_B
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BL
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BC
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BCLR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BCCTR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BT
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BTLR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BTCTR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BF
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BFLR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BFCTR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDNZ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDNZT
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDNZF
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDZ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDZT
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDZF
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BLR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BCTR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BCTRL
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BLRL
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LBZ
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LBZU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LBZX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LBZUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHZ
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHZU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHZX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHZUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHA
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHAU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHAX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHAUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LHBRX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LWZ
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LWZU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LWZX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LWZUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LWBRX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LMW
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STB
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STBU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STBX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STBUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STH
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STHU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STHX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STHUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STHBRX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STW
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STWU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STWX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STWUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STWBRX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STMW
+ LSU1, 3, 1, 2, 0, 0, 0, 0, // PC_DCBF
+ LSU1, 3, 1, 2, 0, 0, 0, 0, // PC_DCBST
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_DCBT
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_DCBTST
+ LSU1, 3, 1, 2, 0, 0, 0, 0, // PC_DCBZ
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADD
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADDC
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADDE
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADDI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADDIC
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADDICR
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADDIS
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADDME
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ADDZE
+ IU1, 19, 19, 0, 0, 0, 0, 0, // PC_DIVW
+ IU1, 19, 19, 0, 0, 0, 0, 0, // PC_DIVWU
+ IU1, 5, 5, 0, 0, 0, 0, 0, // PC_MULHW
+ IU1, 6, 5, 0, 0, 0, 0, 0, // PC_MULHWU
+ IU1, 3, 3, 0, 0, 0, 0, 0, // PC_MULLI
+ IU1, 5, 5, 0, 0, 0, 0, 0, // PC_MULLW
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_NEG
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SUBF
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFC
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFE
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFIC
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFME
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFZE
+ IU2, 3, 1, 0, 0, 0, 0, 0, // PC_CMPI
+ IU2, 3, 1, 0, 0, 0, 0, 0, // PC_CMP
+ IU2, 3, 1, 0, 0, 0, 0, 0, // PC_CMPLI
+ IU2, 3, 1, 0, 0, 0, 0, 0, // PC_CMPL
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ANDI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ANDIS
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ORI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ORIS
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_XORI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_XORIS
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_AND
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_OR
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_XOR
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_NAND
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_NOR
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_EQV
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ANDC
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ORC
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_EXTSB
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_EXTSH
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_CNTLZW
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_RLWINM
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_RLWNM
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_RLWIMI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SLW
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SRW
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SRAWI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_SRAW
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_CRAND
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_CRANDC
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_CREQV
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_CRNAND
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_CRNOR
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_CROR
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_CRORC
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_CRXOR
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MCRF
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_MTXER
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_MTCTR
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_MTLR
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MTCRF
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MTMSR
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_MTSPR
+ SRU, 1, 1, 0, 0, 0, 0, 0, // PC_MFMSR
+ SRU, 3, 3, 0, 0, 0, 1, 0, // PC_MFSPR
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MFXER
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MFCTR
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MFLR
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MFCR
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_MFFS
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_MTFSF
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_EIEIO
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_ISYNC
+ SRU, 3, 3, 0, 0, 0, 1, 0, // PC_SYNC
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_RFI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_LI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_LIS
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_MR
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_NOP
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_NOT
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LFS
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LFSU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LFSX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LFSUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LFD
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LFDU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LFDX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LFDUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFS
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFSU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFSX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFSUX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFD
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFDU
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFDX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFDUX
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FMR
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FABS
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FNEG
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FNABS
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FADD
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FADDS
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FSUB
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FSUBS
+ FPU1, 4, 2, 1, 1, 0, 0, 0, // PC_FMUL
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FMULS
+ FPU1, 31, 31, 0, 0, 0, 0, 0, // PC_FDIV
+ FPU1, 17, 17, 0, 0, 0, 0, 0, // PC_FDIVS
+ FPU1, 4, 2, 1, 1, 0, 0, 0, // PC_FMADD
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FMADDS
+ FPU1, 4, 2, 1, 1, 0, 0, 0, // PC_FMSUB
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FMSUBS
+ FPU1, 4, 2, 1, 1, 0, 0, 0, // PC_FNMADD
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FNMADDS
+ FPU1, 4, 2, 1, 1, 0, 0, 0, // PC_FNMSUB
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FNMSUBS
+ FPU1, 10, 10, 0, 0, 0, 0, 0, // PC_FRES
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FRSQRTE
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FSEL
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FRSP
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FCTIW
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FCTIWZ
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FCMPU
+ FPU1, 3, 1, 1, 1, 0, 0, 0, // PC_FCMPO
+ LSU1, 2, 1, 1, 0, 0, 1, 0, // PC_LWARX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LSWI
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LSWX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STFIWX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STSWI
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STSWX
+ LSU1, 2, 1, 1, 0, 0, 1, 0, // PC_STWCX
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ECIWX
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ECOWX
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_DCBI
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ICBI
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MCRFS
+ SRU, 1, 1, 0, 0, 0, 1, 0, // PC_MCRXR
+ SRU, 1, 1, 0, 0, 0, 0, 0, // PC_MFTB
+ SRU, 3, 3, 0, 0, 0, 0, 0, // PC_MFSR
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_MTSR
+ SRU, 3, 3, 0, 0, 0, 0, 0, // PC_MFSRIN
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_MTSRIN
+ FPU1, 1, 1, 0, 0, 0, 0, 0, // PC_MTFSB0
+ FPU1, 1, 1, 0, 0, 0, 0, 0, // PC_MTFSB1
+ FPU1, 1, 1, 0, 0, 0, 0, 0, // PC_MTFSFI
+ SRU, 2, 2, 0, 0, 0, 1, 0, // PC_SC
+ FPU1, 1, 1, 0, 0, 0, 0, 0, // PC_FSQRT
+ FPU1, 1, 1, 0, 0, 0, 0, 0, // PC_FSQRTS
+ LSU1, 1, 1, 0, 0, 0, 0, 0, // PC_TLBIA
+ LSU1, 1, 1, 0, 0, 0, 0, 0, // PC_TLBIE
+ LSU1, 1, 1, 0, 0, 0, 0, 0, // PC_TLBLD
+ LSU1, 1, 1, 0, 0, 0, 0, 0, // PC_TLBLI
+ LSU1, 1, 1, 0, 0, 0, 1, 0, // PC_TLBSYNC
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_TW
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_TRAP
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_TWI
+ IU2, 1, 1, 0, 0, 0, 1, 0, // PC_OPWORD
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_MFROM
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_DSA
+ IU2, 1, 1, 0, 0, 0, 0, 0, // PC_ESA
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_DCCCI
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_DCREAD
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_ICBT
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_ICCCI
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_ICREAD
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_RFCI
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_TLBRE
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_TLBSX
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_TLBWE
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_WRTEE
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_WRTEEI
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_MFDCR
+ IU2, 1, 0, 0, 0, 0, 0, 0, // PC_MTDCR
+ LSU1, 3, 1, 2, 0, 0, 0, 0, // PC_DCBA
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_DSS
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_DSSALL
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_DST
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_DSTT
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_DSTST
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_DSTSTT
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LVEBX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LVEHX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LVEWX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LVSL
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LVSR
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LVX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_LVXL
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STVEBX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STVEHX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STVEWX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STVX
+ LSU1, 2, 1, 1, 0, 0, 0, 0, // PC_STVXL
+ VSIU, 1, 1, 0, 0, 0, 1, 0, // PC_MFVSCR
+ VSIU, 1, 1, 0, 0, 0, 1, 0, // PC_MTVSCR
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDCUW
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VADDFP
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDSBS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDSHS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDSWS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUBM
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUBS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUHM
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUHS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUWM
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUWS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VAND
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VANDC
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGSB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGSH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGSW
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGUB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGUH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGUW
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VCFSX
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VCFUX
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VCMPBFP
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VCMPEQFP
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPEQUB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPEQUH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPEQUW
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VCMPGEFP
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VCMPGTFP
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTSB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTSH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTSW
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTUB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTUH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTUW
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VCTSXS
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VCTUXS
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VEXPTEFP
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VLOGEFP
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VMAXFP
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXSB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXSH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXSW
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXUB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXUH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXUW
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VMINFP
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMINSB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMINSH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMINSW
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMINUB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMINUH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMINUW
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VMRGHB
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VMRGHH
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VMRGHW
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VMRGLB
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VMRGLH
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VMRGLW
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMULESB
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMULESH
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMULEUB
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMULEUH
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMULOSB
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMULOSH
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMULOUB
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMULOUH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VNOR
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VOR
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKPX
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKSHSS
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKSHUS
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKSWSS
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKSWUS
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKUHUM
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKUHUS
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKUWUM
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPKUWUS
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VREFP
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VRFIM
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VRFIN
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VRFIP
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VRFIZ
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VRLB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VRLH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VRLW
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VRSQRTEFP
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSL
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSLB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSLH
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSLO
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSLW
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSPLTB
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSPLTH
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSPLTW
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSPLTISB
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSPLTISH
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSPLTISW
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSR
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSRAB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSRAH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSRAW
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSRB
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSRH
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSRO
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSRW
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBCUW
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VSUBFP
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBSBS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBSHS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBSWS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUBM
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUBS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUHM
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUHS
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUWM
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUWS
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VSUMSWS
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VSUM2SWS
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VSUM4SBS
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VSUM4SHS
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VSUM4UBS
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VUPKHPX
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VUPKHSB
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VUPKHSH
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VUPKLPX
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VUPKLSB
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VUPKLSH
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VXOR
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VMADDFP
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMHADDSHS
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMHRADDSHS
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMLADDUHM
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMSUMMBM
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMSUMSHM
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMSUMSHS
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMSUMUBM
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMSUMUHM
+ VCIU1, 3, 1, 1, 1, 0, 0, 0, // PC_VMSUMUHS
+ VFPU1, 4, 1, 1, 1, 1, 0, 0, // PC_VNMSUBFP
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VPERM
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VSEL
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VSLDOI
+ VSIU, 1, 1, 0, 0, 0, 0, 0, // PC_VMR
+ VPU, 1, 1, 0, 0, 0, 0, 0, // PC_VMRP
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SLE
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SLEQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SLIQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SLLIQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SLLQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SLQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SRAIQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SRAQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SRE
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SREA
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SREQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SRIQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SRLIQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SRLQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_SRQ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_MASKG
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_MASKIR
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_LSCBX
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_DIV
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_DIVS
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_DOZ
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_MUL
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_NABS
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_ABS
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_CLCS
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_DOZI
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_RLMI
+ BPU, 0, 0, 0, 0, 0, 0, 0, // PC_RRIB
+};
+
+static void advance(int firstStage, int oldStage, int newStage) {
+ PCode *instr = pipeline[oldStage].instr;
+ int cycles = instruction_timing[instr->op].cycles[newStage - firstStage];
+ pipeline[newStage].instr = instr;
+ pipeline[newStage].remaining = cycles;
+ pipeline[oldStage].instr = NULL;
+}
+
+static void assign_completion_buffer(PCode *instr) {
+ completionbuffers.used++;
+ completionbuffers.free--;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].instr = instr;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].completed = 0;
+ completionbuffers.nextFreeSlot = (completionbuffers.nextFreeSlot + 1) % MaxEntries;
+}
+
+static void complete_instruction(int stage) {
+ PCode *instr = pipeline[stage].instr;
+ int buf = 0;
+ while (buf < MaxEntries && completionbuffers.entries[buf].instr != instr)
+ buf++;
+
+ completionbuffers.entries[buf].completed = 1;
+ pipeline[stage].instr = NULL;
+
+ if (stage == IU1)
+ iu1_completed_instruction = instr;
+ else if (stage == IU2)
+ iu2_completed_instruction = instr;
+}
+
+static void retire_instruction(void) {
+ completionbuffers.entries[completionbuffers.nextToRetire].instr = NULL;
+ completionbuffers.used--;
+ completionbuffers.free++;
+ completionbuffers.nextToRetire = (completionbuffers.nextToRetire + 1) % MaxEntries;
+}
+
+static int latency(PCode *instr) {
+ int cycles = instruction_timing[instr->op].latency;
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
+ cycles += 2;
+ if (instr->op == PC_LMW || instr->op == PC_STMW)
+ cycles += instr->argCount - 2;
+ return cycles;
+}
+
+static void initialize(void) {
+ int stage;
+ int i;
+
+ for (stage = 0; stage < NumStages; stage++)
+ pipeline[stage].instr = NULL;
+
+ completionbuffers.free = MaxEntries;
+ completionbuffers.used = 0;
+ completionbuffers.nextToRetire = 0;
+ completionbuffers.nextFreeSlot = 0;
+ for (i = 0; i < MaxEntries; i++)
+ completionbuffers.entries[i].instr = NULL;
+
+ iu1_completed_instruction = NULL;
+ iu2_completed_instruction = NULL;
+}
+
+static int can_issue(PCode *instr) {
+ int stage;
+
+ if (completionbuffers.free == 0)
+ return 0;
+
+ stage = instruction_timing[instr->op].stage;
+
+ if (stage == IU2) {
+ PCode *check;
+ int isClear1 = !pipeline[IU1].instr;
+ int isClear2 = !pipeline[IU2].instr;
+ if (!isClear1 && !isClear2)
+ return 0;
+ if (isClear1 && isClear2)
+ return 1;
+
+ if (isClear1)
+ check = pipeline[IU2].instr;
+ else
+ check = pipeline[IU1].instr;
+
+ if (is_dependent(instr, check, RegClass_GPR))
+ return 0;
+ if (is_dependent(instr, iu1_completed_instruction, RegClass_GPR))
+ return 0;
+ if (is_dependent(instr, iu2_completed_instruction, RegClass_GPR))
+ return 0;
+ } else if (stage == VFPU1 || stage == VCIU1 || stage == VSIU || stage == VPU) {
+ PCode *check;
+ int isVpuClear = !pipeline[VPU].instr;
+ int isVFpuClear = !pipeline[VFPU1].instr;
+ int isVCiuClear = !pipeline[VCIU1].instr;
+ int isVSiuClear = !pipeline[VSIU].instr;
+
+ if (stage == VPU) {
+ if (!isVpuClear)
+ return 0;
+
+ if (!isVFpuClear)
+ check = pipeline[VFPU1].instr;
+ else if (!isVCiuClear)
+ check = pipeline[VCIU1].instr;
+ else if (!isVSiuClear)
+ check = pipeline[VSIU].instr;
+ else
+ check = NULL;
+
+ if (is_dependent(instr, check, RegClass_VR))
+ return 0;
+ } else {
+ if (!isVFpuClear || !isVCiuClear || !isVSiuClear)
+ return 0;
+
+ if (!isVpuClear && is_dependent(instr, pipeline[VPU].instr, RegClass_VR))
+ return 0;
+ }
+ } else {
+ if (pipeline[stage].instr)
+ return 0;
+ }
+
+ if ((instr->flags & fIsWrite) && pipeline[LSU2].instr && (pipeline[LSU2].instr->flags & fIsWrite))
+ return 0;
+
+ return 1;
+}
+
+static void issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ int cycles = instruction_timing[instr->op].cycles[0];
+ assign_completion_buffer(instr);
+ if (stage == IU2 && !pipeline[IU1].instr)
+ stage = IU1;
+ pipeline[stage].instr = instr;
+ pipeline[stage].remaining = cycles;
+}
+
+static void advance_clock(void) {
+ int stage;
+
+ iu1_completed_instruction = NULL;
+ iu2_completed_instruction = NULL;
+
+ for (stage = 0; stage < NumStages; stage++) {
+ if (pipeline[stage].instr && pipeline[stage].remaining)
+ --pipeline[stage].remaining;
+ }
+
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ }
+ }
+
+ if (pipeline[IU1].instr && pipeline[IU1].remaining == 0)
+ complete_instruction(IU1);
+ if (pipeline[VPU].instr && pipeline[VPU].remaining == 0)
+ complete_instruction(VPU);
+ if (pipeline[LSU2].instr && pipeline[LSU2].remaining == 0)
+ complete_instruction(LSU2);
+ if (pipeline[FPU3].instr && pipeline[FPU3].remaining == 0)
+ complete_instruction(FPU3);
+ if (pipeline[SRU].instr && pipeline[SRU].remaining == 0)
+ complete_instruction(SRU);
+ if (pipeline[BPU].instr && pipeline[BPU].remaining == 0)
+ complete_instruction(BPU);
+ if (pipeline[VSIU].instr && pipeline[VSIU].remaining == 0)
+ complete_instruction(VSIU);
+ if (pipeline[VCIU3].instr && pipeline[VCIU3].remaining == 0)
+ complete_instruction(VCIU3);
+ if (pipeline[VFPU4].instr && pipeline[VFPU4].remaining == 0)
+ complete_instruction(VFPU4);
+ if (pipeline[IU2].instr && pipeline[IU2].remaining == 0)
+ complete_instruction(IU2);
+
+ if (
+ pipeline[FPU1].instr &&
+ pipeline[FPU1].remaining == 0 &&
+ (pipeline[FPU1].instr->op == PC_FDIV || pipeline[FPU1].instr->op == PC_FDIVS)
+ )
+ complete_instruction(FPU1);
+
+ if (pipeline[FPU2].instr && pipeline[FPU2].remaining == 0 && !pipeline[FPU3].instr)
+ advance(FPU1, FPU2, FPU3);
+ if (pipeline[FPU1].instr && pipeline[FPU1].remaining == 0 && !pipeline[FPU2].instr)
+ advance(FPU1, FPU1, FPU2);
+
+ if (pipeline[LSU1].instr && pipeline[LSU1].remaining == 0 && !pipeline[LSU2].instr)
+ advance(LSU1, LSU1, LSU2);
+
+ if (pipeline[VCIU2].instr && pipeline[VCIU2].remaining == 0 && !pipeline[VCIU3].instr)
+ advance(VCIU1, VCIU2, VCIU3);
+ if (pipeline[VCIU1].instr && pipeline[VCIU1].remaining == 0 && !pipeline[VCIU2].instr)
+ advance(VCIU1, VCIU1, VCIU2);
+
+ if (pipeline[VFPU3].instr && pipeline[VFPU3].remaining == 0 && !pipeline[VFPU4].instr)
+ advance(VFPU1, VFPU3, VFPU4);
+ if (pipeline[VFPU2].instr && pipeline[VFPU2].remaining == 0 && !pipeline[VFPU3].instr)
+ advance(VFPU1, VFPU2, VFPU3);
+ if (pipeline[VFPU1].instr && pipeline[VFPU1].remaining == 0 && !pipeline[VFPU2].instr)
+ advance(VFPU1, VFPU1, VFPU2);
+}
+
+static int serializes(PCode *instr) {
+ return instruction_timing[instr->op].serializes;
+}
+
+static int uses_vpermute_unit_7400(PCode *instr) {
+ return instruction_timing[instr->op].stage == VPU;
+}
+
+MachineInfo machine7400 = {
+ 2,
+ 1,
+ 0,
+ &latency,
+ &initialize,
+ &can_issue,
+ &issue,
+ &advance_clock,
+ &serializes,
+ &uses_vpermute_unit_7400
+};
diff --git a/compiler_and_linker/unsorted/MachineSimulation750.c b/compiler_and_linker/unsorted/MachineSimulation750.c
new file mode 100644
index 0000000..d412df3
--- /dev/null
+++ b/compiler_and_linker/unsorted/MachineSimulation750.c
@@ -0,0 +1,678 @@
+#include "compiler/Scheduler.h"
+#include "compiler/PCode.h"
+#include "compiler/PCodeInfo.h"
+
+// https://www.nxp.com/docs/en/reference-manual/MPC750UM.pdf
+
+typedef enum Stage {
+ BPU, // Branch Prediction Unit
+ IU1, // Integer Unit 1
+ IU2, // Integer Unit 2
+
+ LSU1, // Load/Store Unit
+ LSU2,
+
+ FPU1, // Floating Point Unit
+ FPU2,
+ FPU3,
+
+ SRU, // System Register Unit
+
+ NumStages
+} Stage;
+
+static struct {
+ // the instruction currently in this pipeline stage
+ PCode *instr;
+
+ // how many cycles are left for this instruction to finish
+ int remaining;
+} pipeline[NumStages];
+
+static PCode *iu1_completed_instruction;
+static PCode *iu2_completed_instruction;
+
+enum {
+ MaxEntries = 6
+};
+
+static struct {
+ // how many entries remain unused in the queue
+ unsigned int free;
+
+ // how many entries are currently used in the queue
+ unsigned int used;
+
+ // the index of the next instruction that will be retired
+ unsigned int nextToRetire;
+
+ // the index of the next free slot that will be used when an instruction is dispatched
+ unsigned int nextFreeSlot;
+
+ // circular array of entries in the completion queue
+ struct {
+ PCode *instr;
+ int completed;
+ } entries[MaxEntries];
+} completionbuffers;
+
+static struct {
+ // the initial stage for this instruction
+ Stage stage;
+
+ // the total amount of cycles required by this instruction
+ char latency;
+
+ // how long it takes to finish each stage
+ char cycles[3];
+
+ // does this instruction serialise?
+ char serializes;
+} instruction_timing[OPCODE_MAX] = {
+ BPU, 0, 0, 0, 0, 1, // PC_B
+ BPU, 0, 0, 0, 0, 1, // PC_BL
+ BPU, 0, 0, 0, 0, 1, // PC_BC
+ BPU, 0, 0, 0, 0, 1, // PC_BCLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BT
+ BPU, 0, 0, 0, 0, 1, // PC_BTLR
+ BPU, 0, 0, 0, 0, 1, // PC_BTCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BF
+ BPU, 0, 0, 0, 0, 1, // PC_BFLR
+ BPU, 0, 0, 0, 0, 1, // PC_BFCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDNZF
+ BPU, 0, 0, 0, 0, 1, // PC_BDZ
+ BPU, 0, 0, 0, 0, 1, // PC_BDZT
+ BPU, 0, 0, 0, 0, 1, // PC_BDZF
+ BPU, 0, 0, 0, 0, 1, // PC_BLR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTR
+ BPU, 0, 0, 0, 0, 1, // PC_BCTRL
+ BPU, 0, 0, 0, 0, 1, // PC_BLRL
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHA
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LMW
+ LSU1, 2, 1, 1, 0, 0, // PC_STB
+ LSU1, 2, 1, 1, 0, 0, // PC_STBU
+ LSU1, 2, 1, 1, 0, 0, // PC_STBX
+ LSU1, 2, 1, 1, 0, 0, // PC_STBUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STH
+ LSU1, 2, 1, 1, 0, 0, // PC_STHU
+ LSU1, 2, 1, 1, 0, 0, // PC_STHX
+ LSU1, 2, 1, 1, 0, 0, // PC_STHUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STW
+ LSU1, 2, 1, 1, 0, 0, // PC_STWU
+ LSU1, 2, 1, 1, 0, 0, // PC_STWX
+ LSU1, 2, 1, 1, 0, 0, // PC_STWUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STMW
+ LSU1, 3, 1, 2, 0, 0, // PC_DCBF
+ LSU1, 3, 1, 2, 0, 0, // PC_DCBST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBT
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBTST
+ LSU1, 3, 1, 2, 0, 0, // PC_DCBZ
+ IU2, 1, 1, 0, 0, 0, // PC_ADD
+ IU2, 1, 1, 0, 0, 0, // PC_ADDC
+ IU2, 1, 1, 0, 0, 0, // PC_ADDE
+ IU2, 1, 1, 0, 0, 0, // PC_ADDI
+ IU2, 1, 1, 0, 0, 0, // PC_ADDIC
+ IU2, 1, 1, 0, 0, 0, // PC_ADDICR
+ IU2, 1, 1, 0, 0, 0, // PC_ADDIS
+ IU2, 1, 1, 0, 0, 0, // PC_ADDME
+ IU2, 1, 1, 0, 0, 0, // PC_ADDZE
+ IU1, 19, 19, 0, 0, 0, // PC_DIVW
+ IU1, 19, 19, 0, 0, 0, // PC_DIVWU
+ IU1, 5, 5, 0, 0, 0, // PC_MULHW
+ IU1, 6, 5, 0, 0, 0, // PC_MULHWU
+ IU1, 3, 3, 0, 0, 0, // PC_MULLI
+ IU1, 5, 5, 0, 0, 0, // PC_MULLW
+ IU2, 1, 1, 0, 0, 0, // PC_NEG
+ IU2, 1, 1, 0, 0, 0, // PC_SUBF
+ IU2, 1, 1, 0, 0, 0, // PC_SUBFC
+ IU2, 1, 1, 0, 0, 0, // PC_SUBFE
+ IU2, 1, 1, 0, 0, 0, // PC_SUBFIC
+ IU2, 1, 1, 0, 0, 0, // PC_SUBFME
+ IU2, 1, 1, 0, 0, 0, // PC_SUBFZE
+ IU2, 3, 1, 0, 0, 0, // PC_CMPI
+ IU2, 3, 1, 0, 0, 0, // PC_CMP
+ IU2, 3, 1, 0, 0, 0, // PC_CMPLI
+ IU2, 3, 1, 0, 0, 0, // PC_CMPL
+ IU2, 1, 1, 0, 0, 0, // PC_ANDI
+ IU2, 1, 1, 0, 0, 0, // PC_ANDIS
+ IU2, 1, 1, 0, 0, 0, // PC_ORI
+ IU2, 1, 1, 0, 0, 0, // PC_ORIS
+ IU2, 1, 1, 0, 0, 0, // PC_XORI
+ IU2, 1, 1, 0, 0, 0, // PC_XORIS
+ IU2, 1, 1, 0, 0, 0, // PC_AND
+ IU2, 1, 1, 0, 0, 0, // PC_OR
+ IU2, 1, 1, 0, 0, 0, // PC_XOR
+ IU2, 1, 1, 0, 0, 0, // PC_NAND
+ IU2, 1, 1, 0, 0, 0, // PC_NOR
+ IU2, 1, 1, 0, 0, 0, // PC_EQV
+ IU2, 1, 1, 0, 0, 0, // PC_ANDC
+ IU2, 1, 1, 0, 0, 0, // PC_ORC
+ IU2, 1, 1, 0, 0, 0, // PC_EXTSB
+ IU2, 1, 1, 0, 0, 0, // PC_EXTSH
+ IU2, 1, 1, 0, 0, 0, // PC_CNTLZW
+ IU2, 1, 1, 0, 0, 0, // PC_RLWINM
+ IU2, 1, 1, 0, 0, 0, // PC_RLWNM
+ IU2, 1, 1, 0, 0, 0, // PC_RLWIMI
+ IU2, 1, 1, 0, 0, 0, // PC_SLW
+ IU2, 1, 1, 0, 0, 0, // PC_SRW
+ IU2, 1, 1, 0, 0, 0, // PC_SRAWI
+ IU2, 1, 1, 0, 0, 0, // PC_SRAW
+ SRU, 1, 1, 0, 0, 1, // PC_CRAND
+ SRU, 1, 1, 0, 0, 1, // PC_CRANDC
+ SRU, 1, 1, 0, 0, 1, // PC_CREQV
+ SRU, 1, 1, 0, 0, 1, // PC_CRNAND
+ SRU, 1, 1, 0, 0, 1, // PC_CRNOR
+ SRU, 1, 1, 0, 0, 1, // PC_CROR
+ SRU, 1, 1, 0, 0, 1, // PC_CRORC
+ SRU, 1, 1, 0, 0, 1, // PC_CRXOR
+ SRU, 1, 1, 0, 0, 1, // PC_MCRF
+ SRU, 2, 2, 0, 0, 1, // PC_MTXER
+ SRU, 2, 2, 0, 0, 1, // PC_MTCTR
+ SRU, 2, 2, 0, 0, 1, // PC_MTLR
+ SRU, 1, 1, 0, 0, 1, // PC_MTCRF
+ SRU, 1, 1, 0, 0, 0, // PC_MTMSR
+ SRU, 1, 1, 0, 0, 1, // PC_MTSPR
+ SRU, 1, 1, 0, 0, 1, // PC_MFMSR
+ SRU, 1, 1, 0, 0, 1, // PC_MFSPR
+ SRU, 1, 1, 0, 0, 1, // PC_MFXER
+ SRU, 1, 1, 0, 0, 1, // PC_MFCTR
+ SRU, 1, 1, 0, 0, 1, // PC_MFLR
+ SRU, 1, 1, 0, 0, 1, // PC_MFCR
+ FPU1, 3, 1, 1, 1, 0, // PC_MFFS
+ FPU1, 3, 1, 1, 1, 0, // PC_MTFSF
+ SRU, 1, 1, 0, 0, 1, // PC_EIEIO
+ SRU, 2, 2, 0, 0, 1, // PC_ISYNC
+ SRU, 3, 3, 0, 0, 1, // PC_SYNC
+ SRU, 1, 1, 0, 0, 1, // PC_RFI
+ IU2, 1, 1, 0, 0, 0, // PC_LI
+ IU2, 1, 1, 0, 0, 0, // PC_LIS
+ IU2, 1, 1, 0, 0, 0, // PC_MR
+ IU2, 1, 1, 0, 0, 0, // PC_NOP
+ IU2, 1, 1, 0, 0, 0, // PC_NOT
+ LSU1, 2, 1, 1, 0, 0, // PC_LFS
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSU
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFD
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDU
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFS
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSU
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFD
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDU
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFDUX
+ FPU1, 3, 1, 1, 1, 0, // PC_FMR
+ FPU1, 3, 1, 1, 1, 0, // PC_FABS
+ FPU1, 3, 1, 1, 1, 0, // PC_FNEG
+ FPU1, 3, 1, 1, 1, 0, // PC_FNABS
+ FPU1, 3, 1, 1, 1, 0, // PC_FADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FADDS
+ FPU1, 3, 1, 1, 1, 0, // PC_FSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FSUBS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMUL
+ FPU1, 3, 1, 1, 1, 0, // PC_FMULS
+ FPU1, 31, 31, 0, 0, 0, // PC_FDIV
+ FPU1, 17, 17, 0, 0, 0, // PC_FDIVS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FMADDS
+ FPU1, 4, 2, 1, 1, 0, // PC_FMSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FMSUBS
+ FPU1, 4, 2, 1, 1, 0, // PC_FNMADD
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMADDS
+ FPU1, 4, 2, 1, 1, 0, // PC_FNMSUB
+ FPU1, 3, 1, 1, 1, 0, // PC_FNMSUBS
+ FPU1, 10, 10, 0, 0, 0, // PC_FRES
+ FPU1, 3, 1, 1, 1, 0, // PC_FRSQRTE
+ FPU1, 3, 1, 1, 1, 0, // PC_FSEL
+ FPU1, 3, 1, 1, 1, 0, // PC_FRSP
+ FPU1, 3, 1, 1, 1, 0, // PC_FCTIW
+ FPU1, 3, 1, 1, 1, 0, // PC_FCTIWZ
+ FPU1, 3, 1, 1, 1, 0, // PC_FCMPU
+ FPU1, 3, 1, 1, 1, 0, // PC_FCMPO
+ LSU1, 1, 1, 0, 0, 0, // PC_LWARX
+ LSU1, 1, 1, 0, 0, 0, // PC_LSWI
+ LSU1, 1, 1, 0, 0, 0, // PC_LSWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STFIWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STSWI
+ LSU1, 1, 1, 0, 0, 0, // PC_STSWX
+ LSU1, 1, 1, 0, 0, 0, // PC_STWCX
+ IU1, 1, 1, 0, 0, 1, // PC_ECIWX
+ IU1, 1, 1, 0, 0, 1, // PC_ECOWX
+ IU1, 1, 1, 0, 0, 0, // PC_DCBI
+ IU1, 1, 1, 0, 0, 0, // PC_ICBI
+ IU1, 1, 1, 0, 0, 0, // PC_MCRFS
+ IU1, 1, 1, 0, 0, 0, // PC_MCRXR
+ IU1, 1, 1, 0, 0, 0, // PC_MFTB
+ IU1, 1, 1, 0, 0, 0, // PC_MFSR
+ IU1, 1, 1, 0, 0, 0, // PC_MTSR
+ IU1, 1, 1, 0, 0, 0, // PC_MFSRIN
+ IU1, 1, 1, 0, 0, 0, // PC_MTSRIN
+ IU1, 1, 1, 0, 0, 0, // PC_MTFSB0
+ IU1, 1, 1, 0, 0, 0, // PC_MTFSB1
+ IU1, 1, 1, 0, 0, 0, // PC_MTFSFI
+ IU1, 1, 1, 0, 0, 1, // PC_SC
+ FPU1, 1, 1, 0, 0, 0, // PC_FSQRT
+ FPU1, 1, 1, 0, 0, 0, // PC_FSQRTS
+ IU1, 1, 1, 0, 0, 0, // PC_TLBIA
+ IU1, 1, 1, 0, 0, 0, // PC_TLBIE
+ IU1, 1, 1, 0, 0, 0, // PC_TLBLD
+ IU1, 1, 1, 0, 0, 0, // PC_TLBLI
+ IU1, 1, 1, 0, 0, 0, // PC_TLBSYNC
+ IU1, 1, 1, 0, 0, 1, // PC_TW
+ IU1, 1, 1, 0, 0, 1, // PC_TRAP
+ IU1, 1, 1, 0, 0, 1, // PC_TWI
+ IU1, 1, 1, 0, 0, 1, // PC_OPWORD
+ IU1, 1, 1, 0, 0, 0, // PC_MFROM
+ IU1, 1, 1, 0, 0, 1, // PC_DSA
+ IU1, 1, 1, 0, 0, 1, // PC_ESA
+ IU1, 0, 0, 0, 0, 0, // PC_DCCCI
+ IU1, 0, 0, 0, 0, 0, // PC_DCREAD
+ IU1, 0, 0, 0, 0, 0, // PC_ICBT
+ IU1, 0, 0, 0, 0, 0, // PC_ICCCI
+ IU1, 0, 0, 0, 0, 0, // PC_ICREAD
+ IU1, 0, 0, 0, 0, 0, // PC_RFCI
+ IU1, 0, 0, 0, 0, 0, // PC_TLBRE
+ IU1, 0, 0, 0, 0, 0, // PC_TLBSX
+ IU1, 0, 0, 0, 0, 0, // PC_TLBWE
+ IU1, 0, 0, 0, 0, 0, // PC_WRTEE
+ IU1, 0, 0, 0, 0, 0, // PC_WRTEEI
+ IU1, 0, 0, 0, 0, 0, // PC_MFDCR
+ IU1, 0, 0, 0, 0, 0, // PC_MTDCR
+ IU1, 0, 0, 0, 0, 0, // PC_DCBA
+ BPU, 0, 0, 0, 0, 0, // PC_DSS
+ BPU, 0, 0, 0, 0, 0, // PC_DSSALL
+ BPU, 0, 0, 0, 0, 0, // PC_DST
+ BPU, 0, 0, 0, 0, 0, // PC_DSTT
+ BPU, 0, 0, 0, 0, 0, // PC_DSTST
+ BPU, 0, 0, 0, 0, 0, // PC_DSTSTT
+ BPU, 0, 0, 0, 0, 0, // PC_LVEBX
+ BPU, 0, 0, 0, 0, 0, // PC_LVEHX
+ BPU, 0, 0, 0, 0, 0, // PC_LVEWX
+ BPU, 0, 0, 0, 0, 0, // PC_LVSL
+ BPU, 0, 0, 0, 0, 0, // PC_LVSR
+ BPU, 0, 0, 0, 0, 0, // PC_LVX
+ BPU, 0, 0, 0, 0, 0, // PC_LVXL
+ BPU, 0, 0, 0, 0, 0, // PC_STVEBX
+ BPU, 0, 0, 0, 0, 0, // PC_STVEHX
+ BPU, 0, 0, 0, 0, 0, // PC_STVEWX
+ BPU, 0, 0, 0, 0, 0, // PC_STVX
+ BPU, 0, 0, 0, 0, 0, // PC_STVXL
+ BPU, 0, 0, 0, 0, 0, // PC_MFVSCR
+ BPU, 0, 0, 0, 0, 0, // PC_MTVSCR
+ BPU, 0, 0, 0, 0, 0, // PC_VADDCUW
+ BPU, 0, 0, 0, 0, 0, // PC_VADDFP
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSBS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUBS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUWM
+ BPU, 0, 0, 0, 0, 0, // PC_VADDUWS
+ BPU, 0, 0, 0, 0, 0, // PC_VAND
+ BPU, 0, 0, 0, 0, 0, // PC_VANDC
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSB
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSH
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGSW
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUB
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUH
+ BPU, 0, 0, 0, 0, 0, // PC_VAVGUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCFSX
+ BPU, 0, 0, 0, 0, 0, // PC_VCFUX
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPEQUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTFP
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTSW
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUB
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUH
+ BPU, 0, 0, 0, 0, 0, // PC_VCMPGTUW
+ BPU, 0, 0, 0, 0, 0, // PC_VCTSXS
+ BPU, 0, 0, 0, 0, 0, // PC_VCTUXS
+ BPU, 0, 0, 0, 0, 0, // PC_VEXPTEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VLOGEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXSW
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMAXUW
+ BPU, 0, 0, 0, 0, 0, // PC_VMINFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMINSW
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMINUW
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHB
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHH
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGHW
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLB
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLH
+ BPU, 0, 0, 0, 0, 0, // PC_VMRGLW
+ BPU, 0, 0, 0, 0, 0, // PC_VMULESB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULESH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULEUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULEUH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOSB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOSH
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOUB
+ BPU, 0, 0, 0, 0, 0, // PC_VMULOUH
+ BPU, 0, 0, 0, 0, 0, // PC_VNOR
+ BPU, 0, 0, 0, 0, 0, // PC_VOR
+ BPU, 0, 0, 0, 0, 0, // PC_VPKPX
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSHSS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSHUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSWSS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKSWUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUHUM
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUHUS
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUWUM
+ BPU, 0, 0, 0, 0, 0, // PC_VPKUWUS
+ BPU, 0, 0, 0, 0, 0, // PC_VREFP
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIM
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIN
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIP
+ BPU, 0, 0, 0, 0, 0, // PC_VRFIZ
+ BPU, 0, 0, 0, 0, 0, // PC_VRLB
+ BPU, 0, 0, 0, 0, 0, // PC_VRLH
+ BPU, 0, 0, 0, 0, 0, // PC_VRLW
+ BPU, 0, 0, 0, 0, 0, // PC_VRSQRTEFP
+ BPU, 0, 0, 0, 0, 0, // PC_VSL
+ BPU, 0, 0, 0, 0, 0, // PC_VSLB
+ BPU, 0, 0, 0, 0, 0, // PC_VSLH
+ BPU, 0, 0, 0, 0, 0, // PC_VSLO
+ BPU, 0, 0, 0, 0, 0, // PC_VSLW
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTB
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTH
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTW
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISB
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISH
+ BPU, 0, 0, 0, 0, 0, // PC_VSPLTISW
+ BPU, 0, 0, 0, 0, 0, // PC_VSR
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAB
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAH
+ BPU, 0, 0, 0, 0, 0, // PC_VSRAW
+ BPU, 0, 0, 0, 0, 0, // PC_VSRB
+ BPU, 0, 0, 0, 0, 0, // PC_VSRH
+ BPU, 0, 0, 0, 0, 0, // PC_VSRO
+ BPU, 0, 0, 0, 0, 0, // PC_VSRW
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBCUW
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUWM
+ BPU, 0, 0, 0, 0, 0, // PC_VSUBUWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUMSWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM2SWS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4SBS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4SHS
+ BPU, 0, 0, 0, 0, 0, // PC_VSUM4UBS
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHPX
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHSB
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKHSH
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLPX
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLSB
+ BPU, 0, 0, 0, 0, 0, // PC_VUPKLSH
+ BPU, 0, 0, 0, 0, 0, // PC_VXOR
+ BPU, 0, 0, 0, 0, 0, // PC_VMADDFP
+ BPU, 0, 0, 0, 0, 0, // PC_VMHADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMHRADDSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMLADDUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMMBM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMSHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMSHS
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUBM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUHM
+ BPU, 0, 0, 0, 0, 0, // PC_VMSUMUHS
+ BPU, 0, 0, 0, 0, 0, // PC_VNMSUBFP
+ BPU, 0, 0, 0, 0, 0, // PC_VPERM
+ BPU, 0, 0, 0, 0, 0, // PC_VSEL
+ BPU, 0, 0, 0, 0, 0, // PC_VSLDOI
+ BPU, 0, 0, 0, 0, 0, // PC_VMR
+ BPU, 0, 0, 0, 0, 0, // PC_VMRP
+ BPU, 0, 0, 0, 0, 0, // PC_SLE
+ BPU, 0, 0, 0, 0, 0, // PC_SLEQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRAIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRAQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRE
+ BPU, 0, 0, 0, 0, 0, // PC_SREA
+ BPU, 0, 0, 0, 0, 0, // PC_SREQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRLIQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRLQ
+ BPU, 0, 0, 0, 0, 0, // PC_SRQ
+ BPU, 0, 0, 0, 0, 0, // PC_MASKG
+ BPU, 0, 0, 0, 0, 0, // PC_MASKIR
+ BPU, 0, 0, 0, 0, 0, // PC_LSCBX
+ BPU, 0, 0, 0, 0, 0, // PC_DIV
+ BPU, 0, 0, 0, 0, 0, // PC_DIVS
+ BPU, 0, 0, 0, 0, 0, // PC_DOZ
+ BPU, 0, 0, 0, 0, 0, // PC_MUL
+ BPU, 0, 0, 0, 0, 0, // PC_NABS
+ BPU, 0, 0, 0, 0, 0, // PC_ABS
+ BPU, 0, 0, 0, 0, 0, // PC_CLCS
+ BPU, 0, 0, 0, 0, 0, // PC_DOZI
+ BPU, 0, 0, 0, 0, 0, // PC_RLMI
+ BPU, 0, 0, 0, 0, 0, // PC_RRIB
+};
+
+static void advance(int firstStage, int oldStage, int newStage) {
+ PCode *instr = pipeline[oldStage].instr;
+ int cycles = instruction_timing[instr->op].cycles[newStage - firstStage];
+ pipeline[newStage].instr = instr;
+ pipeline[newStage].remaining = cycles;
+ pipeline[oldStage].instr = NULL;
+}
+
+static void assign_completion_buffer(PCode *instr) {
+ completionbuffers.used++;
+ completionbuffers.free--;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].instr = instr;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].completed = 0;
+ completionbuffers.nextFreeSlot = (completionbuffers.nextFreeSlot + 1) % MaxEntries;
+}
+
+static void complete_instruction(int stage) {
+ PCode *instr = pipeline[stage].instr;
+ int buf = 0;
+ while (buf < MaxEntries && completionbuffers.entries[buf].instr != instr)
+ buf++;
+
+ completionbuffers.entries[buf].completed = 1;
+ pipeline[stage].instr = NULL;
+
+ if (stage == IU1)
+ iu1_completed_instruction = instr;
+ else if (stage == IU2)
+ iu2_completed_instruction = instr;
+}
+
+static void retire_instruction(void) {
+ completionbuffers.entries[completionbuffers.nextToRetire].instr = NULL;
+ completionbuffers.used--;
+ completionbuffers.free++;
+ completionbuffers.nextToRetire = (completionbuffers.nextToRetire + 1) % MaxEntries;
+}
+
+static int latency(PCode *instr) {
+ int cycles = instruction_timing[instr->op].latency;
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
+ cycles += 2;
+ if (instr->op == PC_LMW || instr->op == PC_STMW)
+ cycles += instr->argCount - 2;
+ return cycles;
+}
+
+static void initialize(void) {
+ int stage;
+ int i;
+
+ for (stage = 0; stage < NumStages; stage++)
+ pipeline[stage].instr = NULL;
+
+ completionbuffers.free = MaxEntries;
+ completionbuffers.used = 0;
+ completionbuffers.nextToRetire = 0;
+ completionbuffers.nextFreeSlot = 0;
+ for (i = 0; i < MaxEntries; i++)
+ completionbuffers.entries[i].instr = NULL;
+
+ iu1_completed_instruction = NULL;
+ iu2_completed_instruction = NULL;
+}
+
+static int can_issue(PCode *instr) {
+ int stage;
+
+ if (completionbuffers.free == 0)
+ return 0;
+
+ stage = instruction_timing[instr->op].stage;
+
+ if (stage == IU2) {
+ PCode *check;
+ int isClear1 = !pipeline[IU1].instr;
+ int isClear2 = !pipeline[IU2].instr;
+ if (!isClear1 && !isClear2)
+ return 0;
+ if (isClear1 && isClear2)
+ return 1;
+
+ if (isClear1)
+ check = pipeline[IU2].instr;
+ else
+ check = pipeline[IU1].instr;
+
+ if (is_dependent(instr, check, RegClass_GPR))
+ return 0;
+ if (is_dependent(instr, iu1_completed_instruction, RegClass_GPR))
+ return 0;
+ if (is_dependent(instr, iu2_completed_instruction, RegClass_GPR))
+ return 0;
+ } else {
+ if (pipeline[stage].instr)
+ return 0;
+ }
+
+ if ((instr->flags & fIsWrite) && pipeline[LSU2].instr && (pipeline[LSU2].instr->flags & fIsWrite))
+ return 0;
+
+ return 1;
+}
+
+static void issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ int cycles = instruction_timing[instr->op].cycles[0];
+ assign_completion_buffer(instr);
+ if (stage == IU2 && !pipeline[IU1].instr)
+ stage = IU1;
+ pipeline[stage].instr = instr;
+ pipeline[stage].remaining = cycles;
+}
+
+static void advance_clock(void) {
+ int stage;
+
+ iu1_completed_instruction = NULL;
+ iu2_completed_instruction = NULL;
+
+ for (stage = 0; stage < NumStages; stage++) {
+ if (pipeline[stage].instr && pipeline[stage].remaining)
+ --pipeline[stage].remaining;
+ }
+
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ }
+ }
+
+ if (pipeline[IU1].instr && pipeline[IU1].remaining == 0)
+ complete_instruction(IU1);
+ if (pipeline[LSU2].instr && pipeline[LSU2].remaining == 0)
+ complete_instruction(LSU2);
+ if (pipeline[FPU3].instr && pipeline[FPU3].remaining == 0)
+ complete_instruction(FPU3);
+ if (pipeline[SRU].instr && pipeline[SRU].remaining == 0)
+ complete_instruction(SRU);
+ if (pipeline[BPU].instr && pipeline[BPU].remaining == 0)
+ complete_instruction(BPU);
+ if (pipeline[IU2].instr && pipeline[IU2].remaining == 0)
+ complete_instruction(IU2);
+
+ if (
+ pipeline[FPU1].instr &&
+ pipeline[FPU1].remaining == 0 &&
+ (pipeline[FPU1].instr->op == PC_FDIV || pipeline[FPU1].instr->op == PC_FDIVS)
+ )
+ complete_instruction(FPU1);
+
+ if (pipeline[FPU2].instr && pipeline[FPU2].remaining == 0 && !pipeline[FPU3].instr)
+ advance(FPU1, FPU2, FPU3);
+ if (pipeline[FPU1].instr && pipeline[FPU1].remaining == 0 && !pipeline[FPU2].instr)
+ advance(FPU1, FPU1, FPU2);
+
+ if (pipeline[LSU1].instr && pipeline[LSU1].remaining == 0 && !pipeline[LSU2].instr)
+ advance(LSU1, LSU1, LSU2);
+}
+
+static int serializes(PCode *instr) {
+ return instruction_timing[instr->op].serializes;
+}
+
+MachineInfo machine750 = {
+ 2,
+ 1,
+ 0,
+ &latency,
+ &initialize,
+ &can_issue,
+ &issue,
+ &advance_clock,
+ &serializes,
+ &default_uses_vpermute_unit
+};
diff --git a/compiler_and_linker/unsorted/MachineSimulation821.c b/compiler_and_linker/unsorted/MachineSimulation821.c
new file mode 100644
index 0000000..bbf0509
--- /dev/null
+++ b/compiler_and_linker/unsorted/MachineSimulation821.c
@@ -0,0 +1,615 @@
+#include "compiler/Scheduler.h"
+#include "compiler/PCode.h"
+#include "compiler/PCodeInfo.h"
+
+// https://www.nxp.com/docs/en/user-guide/MPC821UM.pdf
+
+typedef enum Stage {
+ BranchUnit,
+ Stage1,
+ Stage2,
+ LSU1,
+ LSU2,
+ CRUnit,
+ NumStages,
+ Stage7
+} Stage;
+
+static struct {
+ // the instruction currently in this pipeline stage
+ PCode *instr;
+
+ // how many cycles are left for this instruction to finish
+ int remaining;
+} pipeline[NumStages];
+
+enum {
+ MaxEntries = 6
+};
+
+static struct {
+ // how many entries remain unused in the queue
+ unsigned int free;
+
+ // how many entries are currently used in the queue
+ unsigned int used;
+
+ // the index of the next instruction that will be retired
+ unsigned int nextToRetire;
+
+ // the index of the next free slot that will be used when an instruction is dispatched
+ unsigned int nextFreeSlot;
+
+ // circular array of entries in the completion queue
+ struct {
+ PCode *instr;
+ int completed;
+ } entries[MaxEntries];
+} completionbuffers;
+
+static struct {
+ // the initial stage for this instruction
+ Stage stage;
+
+ // the total amount of cycles required by this instruction
+ char latency;
+
+ // how long it takes to finish each stage
+ char cycles[3];
+
+ // does this instruction serialise?
+ char serializes;
+} instruction_timing[OPCODE_MAX] = {
+ BranchUnit, 0, 0, 0, 0, 0, // PC_B
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BC
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BCLR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BCCTR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BT
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BTLR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BTCTR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BF
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BFLR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BFCTR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BDNZ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BDNZT
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BDNZF
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BDZ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BDZT
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BDZF
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BLR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BCTR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BCTRL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_BLRL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LBZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LBZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHA
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAU
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHAUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZ
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZU
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWZUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_LMW
+ LSU1, 2, 1, 1, 0, 0, // PC_STB
+ LSU1, 2, 1, 1, 0, 0, // PC_STBU
+ LSU1, 2, 1, 1, 0, 0, // PC_STBX
+ LSU1, 2, 1, 1, 0, 0, // PC_STBUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STH
+ LSU1, 2, 1, 1, 0, 0, // PC_STHU
+ LSU1, 2, 1, 1, 0, 0, // PC_STHX
+ LSU1, 2, 1, 1, 0, 0, // PC_STHUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STHBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STW
+ LSU1, 2, 1, 1, 0, 0, // PC_STWU
+ LSU1, 2, 1, 1, 0, 0, // PC_STWX
+ LSU1, 2, 1, 1, 0, 0, // PC_STWUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STWBRX
+ LSU1, 2, 1, 1, 0, 0, // PC_STMW
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBF
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBT
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBTST
+ LSU1, 2, 1, 1, 0, 0, // PC_DCBZ
+ LSU1, 2, 1, 1, 0, 0, // PC_ADD
+ Stage1, 1, 1, 0, 0, 0, // PC_ADDC
+ Stage1, 1, 1, 0, 0, 0, // PC_ADDE
+ Stage1, 1, 1, 0, 0, 0, // PC_ADDI
+ Stage1, 1, 1, 0, 0, 0, // PC_ADDIC
+ Stage1, 1, 1, 0, 0, 0, // PC_ADDICR
+ Stage1, 1, 1, 0, 0, 0, // PC_ADDIS
+ Stage1, 1, 1, 0, 0, 0, // PC_ADDME
+ Stage1, 1, 1, 0, 0, 0, // PC_ADDZE
+ Stage1, 1, 1, 0, 0, 0, // PC_DIVW
+ Stage1, 37, 37, 0, 0, 0, // PC_DIVWU
+ Stage1, 37, 37, 0, 0, 0, // PC_MULHW
+ Stage1, 5, 5, 0, 0, 0, // PC_MULHWU
+ Stage1, 5, 5, 0, 0, 0, // PC_MULLI
+ Stage1, 3, 3, 0, 0, 0, // PC_MULLW
+ Stage1, 5, 5, 0, 0, 0, // PC_NEG
+ Stage1, 1, 1, 0, 0, 0, // PC_SUBF
+ Stage1, 1, 1, 0, 0, 0, // PC_SUBFC
+ Stage1, 1, 1, 0, 0, 0, // PC_SUBFE
+ Stage1, 1, 1, 0, 0, 0, // PC_SUBFIC
+ Stage1, 1, 1, 0, 0, 0, // PC_SUBFME
+ Stage1, 1, 1, 0, 0, 0, // PC_SUBFZE
+ Stage1, 1, 1, 0, 0, 0, // PC_CMPI
+ Stage1, 3, 1, 0, 0, 0, // PC_CMP
+ Stage1, 3, 1, 0, 0, 0, // PC_CMPLI
+ Stage1, 3, 1, 0, 0, 0, // PC_CMPL
+ Stage1, 3, 1, 0, 0, 0, // PC_ANDI
+ Stage1, 1, 1, 0, 0, 0, // PC_ANDIS
+ Stage1, 1, 1, 0, 0, 0, // PC_ORI
+ Stage1, 1, 1, 0, 0, 0, // PC_ORIS
+ Stage1, 1, 1, 0, 0, 0, // PC_XORI
+ Stage1, 1, 1, 0, 0, 0, // PC_XORIS
+ Stage1, 1, 1, 0, 0, 0, // PC_AND
+ Stage1, 1, 1, 0, 0, 0, // PC_OR
+ Stage1, 1, 1, 0, 0, 0, // PC_XOR
+ Stage1, 1, 1, 0, 0, 0, // PC_NAND
+ Stage1, 1, 1, 0, 0, 0, // PC_NOR
+ Stage1, 1, 1, 0, 0, 0, // PC_EQV
+ Stage1, 1, 1, 0, 0, 0, // PC_ANDC
+ Stage1, 1, 1, 0, 0, 0, // PC_ORC
+ Stage1, 1, 1, 0, 0, 0, // PC_EXTSB
+ Stage1, 1, 1, 0, 0, 0, // PC_EXTSH
+ Stage1, 1, 1, 0, 0, 0, // PC_CNTLZW
+ Stage1, 1, 1, 0, 0, 0, // PC_RLWINM
+ Stage1, 1, 1, 0, 0, 0, // PC_RLWNM
+ Stage1, 1, 1, 0, 0, 0, // PC_RLWIMI
+ Stage1, 1, 1, 0, 0, 0, // PC_SLW
+ Stage1, 1, 1, 0, 0, 0, // PC_SRW
+ Stage1, 1, 1, 0, 0, 0, // PC_SRAWI
+ Stage1, 1, 1, 0, 0, 0, // PC_SRAW
+ Stage1, 1, 1, 0, 0, 0, // PC_CRAND
+ CRUnit, 1, 1, 0, 0, 0, // PC_CRANDC
+ CRUnit, 1, 1, 0, 0, 0, // PC_CREQV
+ CRUnit, 1, 1, 0, 0, 0, // PC_CRNAND
+ CRUnit, 1, 1, 0, 0, 0, // PC_CRNOR
+ CRUnit, 1, 1, 0, 0, 0, // PC_CROR
+ CRUnit, 1, 1, 0, 0, 0, // PC_CRORC
+ CRUnit, 1, 1, 0, 0, 0, // PC_CRXOR
+ CRUnit, 1, 1, 0, 0, 0, // PC_MCRF
+ CRUnit, 1, 1, 0, 0, 0, // PC_MTXER
+ Stage1, 1, 1, 0, 0, 0, // PC_MTCTR
+ BranchUnit, 2, 2, 0, 0, 0, // PC_MTLR
+ BranchUnit, 2, 2, 0, 0, 0, // PC_MTCRF
+ Stage1, 1, 1, 0, 0, 0, // PC_MTMSR
+ Stage1, 1, 1, 0, 0, 0, // PC_MTSPR
+ Stage1, 1, 1, 0, 0, 0, // PC_MFMSR
+ Stage1, 1, 1, 0, 0, 0, // PC_MFSPR
+ Stage1, 1, 1, 0, 0, 0, // PC_MFXER
+ Stage7, 3, 1, 1, 1, 0, // PC_MFCTR
+ Stage7, 3, 1, 1, 1, 0, // PC_MFLR
+ Stage1, 1, 1, 0, 0, 0, // PC_MFCR
+ Stage1, 1, 1, 0, 0, 0, // PC_MFFS
+ Stage1, 1, 1, 0, 0, 0, // PC_MTFSF
+ Stage1, 1, 1, 0, 0, 0, // PC_EIEIO
+ Stage1, 1, 1, 0, 0, 0, // PC_ISYNC
+ Stage1, 1, 1, 0, 0, 0, // PC_SYNC
+ Stage1, 1, 1, 0, 0, 0, // PC_RFI
+ Stage1, 1, 1, 0, 0, 0, // PC_LI
+ LSU1, 2, 1, 1, 0, 0, // PC_LIS
+ LSU1, 2, 1, 1, 0, 0, // PC_MR
+ LSU1, 2, 1, 1, 0, 0, // PC_NOP
+ LSU1, 2, 1, 1, 0, 0, // PC_NOT
+ LSU1, 2, 1, 1, 0, 0, // PC_LFS
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSU
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFSUX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFD
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDU
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDX
+ LSU1, 2, 1, 1, 0, 0, // PC_LFDUX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFS
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSU
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSX
+ LSU1, 2, 1, 1, 0, 0, // PC_STFSUX
+ Stage7, 3, 1, 1, 1, 0, // PC_STFD
+ Stage7, 3, 1, 1, 1, 0, // PC_STFDU
+ Stage7, 3, 1, 1, 1, 0, // PC_STFDX
+ Stage7, 3, 1, 1, 1, 0, // PC_STFDUX
+ Stage7, 3, 1, 1, 1, 0, // PC_FMR
+ Stage7, 3, 1, 1, 1, 0, // PC_FABS
+ Stage7, 3, 1, 1, 1, 0, // PC_FNEG
+ Stage7, 3, 1, 1, 1, 0, // PC_FNABS
+ Stage7, 4, 2, 1, 1, 0, // PC_FADD
+ Stage7, 3, 1, 1, 1, 0, // PC_FADDS
+ Stage7, 33, 33, 0, 0, 0, // PC_FSUB
+ Stage7, 18, 18, 0, 0, 0, // PC_FSUBS
+ Stage7, 4, 2, 1, 1, 0, // PC_FMUL
+ Stage7, 3, 1, 1, 1, 0, // PC_FMULS
+ Stage7, 4, 2, 1, 1, 0, // PC_FDIV
+ Stage7, 3, 1, 1, 1, 0, // PC_FDIVS
+ Stage7, 4, 2, 1, 1, 0, // PC_FMADD
+ Stage7, 3, 1, 1, 1, 0, // PC_FMADDS
+ Stage7, 4, 2, 1, 1, 0, // PC_FMSUB
+ Stage7, 3, 1, 1, 1, 0, // PC_FMSUBS
+ Stage7, 18, 18, 0, 0, 0, // PC_FNMADD
+ Stage7, 3, 1, 1, 1, 0, // PC_FNMADDS
+ Stage7, 3, 1, 1, 1, 0, // PC_FNMSUB
+ Stage7, 3, 1, 1, 1, 0, // PC_FNMSUBS
+ Stage7, 3, 1, 1, 1, 0, // PC_FRES
+ Stage7, 3, 1, 1, 1, 0, // PC_FRSQRTE
+ Stage7, 5, 1, 1, 1, 0, // PC_FSEL
+ Stage7, 5, 1, 1, 1, 0, // PC_FRSP
+ LSU1, 1, 0, 0, 0, 0, // PC_FCTIW
+ LSU1, 1, 0, 0, 0, 0, // PC_FCTIWZ
+ LSU1, 1, 0, 0, 0, 0, // PC_FCMPU
+ LSU1, 1, 0, 0, 0, 0, // PC_FCMPO
+ LSU1, 1, 0, 0, 0, 0, // PC_LWARX
+ LSU1, 1, 0, 0, 0, 0, // PC_LSWI
+ LSU1, 1, 0, 0, 0, 0, // PC_LSWX
+ Stage1, 1, 0, 0, 0, 0, // PC_STFIWX
+ Stage1, 1, 0, 0, 0, 0, // PC_STSWI
+ Stage1, 1, 0, 0, 0, 0, // PC_STSWX
+ Stage1, 1, 0, 0, 0, 0, // PC_STWCX
+ Stage1, 1, 0, 0, 0, 0, // PC_ECIWX
+ Stage1, 1, 0, 0, 0, 0, // PC_ECOWX
+ Stage1, 1, 0, 0, 0, 0, // PC_DCBI
+ Stage1, 1, 0, 0, 0, 0, // PC_ICBI
+ Stage1, 1, 0, 0, 0, 0, // PC_MCRFS
+ Stage1, 1, 0, 0, 0, 0, // PC_MCRXR
+ Stage1, 1, 0, 0, 0, 0, // PC_MFTB
+ Stage1, 1, 0, 0, 0, 0, // PC_MFSR
+ Stage1, 1, 0, 0, 0, 0, // PC_MTSR
+ Stage1, 1, 0, 0, 0, 0, // PC_MFSRIN
+ Stage1, 1, 0, 0, 0, 0, // PC_MTSRIN
+ Stage1, 1, 0, 0, 0, 0, // PC_MTFSB0
+ Stage1, 1, 0, 0, 0, 0, // PC_MTFSB1
+ Stage1, 1, 0, 0, 0, 0, // PC_MTFSFI
+ Stage1, 1, 0, 0, 0, 1, // PC_SC
+ Stage1, 1, 0, 0, 0, 1, // PC_FSQRT
+ Stage1, 1, 0, 0, 0, 0, // PC_FSQRTS
+ Stage1, 1, 0, 0, 0, 0, // PC_TLBIA
+ Stage1, 1, 0, 0, 0, 0, // PC_TLBIE
+ Stage1, 1, 0, 0, 0, 0, // PC_TLBLD
+ Stage1, 1, 0, 0, 0, 0, // PC_TLBLI
+ Stage1, 1, 0, 0, 0, 0, // PC_TLBSYNC
+ Stage1, 1, 0, 0, 0, 0, // PC_TW
+ Stage1, 1, 0, 0, 0, 1, // PC_TRAP
+ Stage1, 1, 0, 0, 0, 1, // PC_TWI
+ Stage1, 1, 0, 0, 0, 1, // PC_OPWORD
+ Stage1, 1, 0, 0, 0, 1, // PC_MFROM
+ Stage1, 1, 0, 0, 0, 0, // PC_DSA
+ Stage1, 1, 0, 0, 0, 0, // PC_ESA
+ Stage1, 1, 0, 0, 0, 0, // PC_DCCCI
+ Stage1, 0, 0, 0, 0, 0, // PC_DCREAD
+ Stage1, 0, 0, 0, 0, 0, // PC_ICBT
+ Stage1, 0, 0, 0, 0, 0, // PC_ICCCI
+ Stage1, 0, 0, 0, 0, 0, // PC_ICREAD
+ Stage1, 0, 0, 0, 0, 0, // PC_RFCI
+ Stage1, 0, 0, 0, 0, 0, // PC_TLBRE
+ Stage1, 0, 0, 0, 0, 0, // PC_TLBSX
+ Stage1, 0, 0, 0, 0, 0, // PC_TLBWE
+ Stage1, 0, 0, 0, 0, 0, // PC_WRTEE
+ Stage1, 0, 0, 0, 0, 0, // PC_WRTEEI
+ Stage1, 0, 0, 0, 0, 0, // PC_MFDCR
+ Stage1, 0, 0, 0, 0, 0, // PC_MTDCR
+ Stage1, 0, 0, 0, 0, 0, // PC_DCBA
+ Stage1, 0, 0, 0, 0, 0, // PC_DSS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DSSALL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DST
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DSTT
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DSTST
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DSTSTT
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LVEBX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LVEHX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LVEWX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LVSL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LVSR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LVX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LVXL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_STVEBX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_STVEHX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_STVEWX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_STVX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_STVXL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_MFVSCR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_MTVSCR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDCUW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDSBS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDSHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDSWS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDUBM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDUBS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDUHM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDUHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDUWM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VADDUWS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VAND
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VANDC
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VAVGSB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VAVGSH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VAVGSW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VAVGUB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VAVGUH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VAVGUW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCFSX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCFUX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPBFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPEQFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPEQUB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPEQUH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPEQUW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPGEFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPGTFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPGTSB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPGTSH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPGTSW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPGTUB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPGTUH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCMPGTUW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCTSXS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VCTUXS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VEXPTEFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VLOGEFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMAXFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMAXSB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMAXSH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMAXSW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMAXUB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMAXUH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMAXUW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMINFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMINSB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMINSH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMINSW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMINUB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMINUH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMINUW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMRGHB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMRGHH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMRGHW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMRGLB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMRGLH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMRGLW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMULESB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMULESH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMULEUB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMULEUH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMULOSB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMULOSH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMULOUB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMULOUH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VNOR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VOR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKPX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKSHSS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKSHUS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKSWSS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKSWUS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKUHUM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKUHUS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKUWUM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPKUWUS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VREFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VRFIM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VRFIN
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VRFIP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VRFIZ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VRLB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VRLH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VRLW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VRSQRTEFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSLB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSLH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSLO
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSLW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSPLTB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSPLTH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSPLTW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSPLTISB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSPLTISH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSPLTISW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSRAB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSRAH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSRAW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSRB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSRH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSRO
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSRW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBCUW
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBSBS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBSHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBSWS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBUBM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBUBS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBUHM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBUHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBUWM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUBUWS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUMSWS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUM2SWS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUM4SBS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUM4SHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSUM4UBS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VUPKHPX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VUPKHSB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VUPKHSH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VUPKLPX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VUPKLSB
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VUPKLSH
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VXOR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMADDFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMHADDSHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMHRADDSHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMLADDUHM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMSUMMBM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMSUMSHM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMSUMSHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMSUMUBM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMSUMUHM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMSUMUHS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VNMSUBFP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VPERM
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSEL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VSLDOI
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_VMRP
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SLE
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SLEQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SLIQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SLLIQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SLLQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SLQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SRAIQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SRAQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SRE
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SREA
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SREQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SRIQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SRLIQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SRLQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_SRQ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_MASKG
+ BranchUnit, 0, 0, 0, 0, 0, // PC_MASKIR
+ BranchUnit, 0, 0, 0, 0, 0, // PC_LSCBX
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DIV
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DIVS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DOZ
+ BranchUnit, 0, 0, 0, 0, 0, // PC_MUL
+ BranchUnit, 0, 0, 0, 0, 0, // PC_NABS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_ABS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_CLCS
+ BranchUnit, 0, 0, 0, 0, 0, // PC_DOZI
+ BranchUnit, 0, 0, 0, 0, 0, // PC_RLMI
+ BranchUnit, 0, 0, 0, 0, 0, // PC_RRIB
+};
+
+static void advance(int firstStage, int oldStage, int newStage) {
+ PCode *instr = pipeline[oldStage].instr;
+ int cycles = instruction_timing[instr->op].cycles[newStage - firstStage];
+ pipeline[newStage].instr = instr;
+ pipeline[newStage].remaining = cycles;
+ pipeline[oldStage].instr = NULL;
+}
+
+static void assign_completion_buffer(PCode *instr) {
+ completionbuffers.used++;
+ completionbuffers.free--;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].instr = instr;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].completed = 0;
+ completionbuffers.nextFreeSlot = (completionbuffers.nextFreeSlot + 1) % MaxEntries;
+}
+
+static void complete_instruction(int stage) {
+ PCode *instr = pipeline[stage].instr;
+ int buf = 0;
+ while (buf < MaxEntries && completionbuffers.entries[buf].instr != instr)
+ buf++;
+
+ completionbuffers.entries[buf].completed = 1;
+ pipeline[stage].instr = NULL;
+}
+
+static void retire_instruction(void) {
+ completionbuffers.entries[completionbuffers.nextToRetire].instr = NULL;
+ completionbuffers.used--;
+ completionbuffers.free++;
+ completionbuffers.nextToRetire = (completionbuffers.nextToRetire + 1) % MaxEntries;
+}
+
+static int latency(PCode *instr) {
+ int cycles = instruction_timing[instr->op].latency;
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
+ cycles += 2;
+ if (instr->op == PC_LMW || instr->op == PC_STMW)
+ cycles += instr->argCount - 2;
+ return cycles;
+}
+
+static void initialize(void) {
+ int stage;
+ int i;
+
+ for (stage = 0; stage < NumStages; stage++)
+ pipeline[stage].instr = NULL;
+
+ completionbuffers.free = MaxEntries;
+ completionbuffers.used = 0;
+ completionbuffers.nextToRetire = 0;
+ completionbuffers.nextFreeSlot = 0;
+ for (i = 0; i < MaxEntries; i++)
+ completionbuffers.entries[i].instr = NULL;
+}
+
+static int can_issue(PCode *instr) {
+ int stage;
+
+ if (completionbuffers.free == 0)
+ return 0;
+
+ stage = instruction_timing[instr->op].stage;
+ if (pipeline[stage].instr)
+ return 0;
+
+ if ((instr->flags & fIsWrite) && pipeline[LSU2].instr && (pipeline[LSU2].instr->flags & fIsWrite))
+ return 0;
+
+ return 1;
+}
+
+static void issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ int cycles = instruction_timing[instr->op].cycles[0];
+ assign_completion_buffer(instr);
+ pipeline[stage].instr = instr;
+ pipeline[stage].remaining = cycles;
+}
+
+static void advance_clock(void) {
+ int stage;
+
+ for (stage = 0; stage < NumStages; stage++) {
+ if (pipeline[stage].instr && pipeline[stage].remaining)
+ --pipeline[stage].remaining;
+ }
+
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ if (completionbuffers.used && completionbuffers.entries[completionbuffers.nextToRetire].completed) {
+ retire_instruction();
+ }
+ }
+
+ if (pipeline[Stage1].instr && pipeline[Stage1].remaining == 0)
+ complete_instruction(Stage1);
+ if (pipeline[LSU2].instr && pipeline[LSU2].remaining == 0)
+ complete_instruction(LSU2);
+ if (pipeline[BranchUnit].instr && pipeline[BranchUnit].remaining == 0)
+ complete_instruction(BranchUnit);
+
+ if (pipeline[LSU1].instr && pipeline[LSU1].remaining == 0 && !pipeline[LSU2].instr)
+ advance(LSU1, LSU1, LSU2);
+}
+
+static int serializes(PCode *instr) {
+ return instruction_timing[instr->op].serializes;
+}
+
+MachineInfo machine821 = {
+ 1,
+ 0,
+ 0,
+ &latency,
+ &initialize,
+ &can_issue,
+ &issue,
+ &advance_clock,
+ &serializes,
+ &default_uses_vpermute_unit
+};
diff --git a/compiler_and_linker/unsorted/MachineSimulationAltiVec.c b/compiler_and_linker/unsorted/MachineSimulationAltiVec.c
new file mode 100644
index 0000000..d261ee9
--- /dev/null
+++ b/compiler_and_linker/unsorted/MachineSimulationAltiVec.c
@@ -0,0 +1,752 @@
+#include "compiler/Scheduler.h"
+#include "compiler/CError.h"
+#include "compiler/PCode.h"
+#include "compiler/PCodeInfo.h"
+
+// https://www.nxp.com/docs/en/reference-manual/MPC7450UM.pdf
+
+typedef enum Stage {
+ BPU, // Branch Prediction Unit
+
+ IU2_1, // Multiple-Cycle Integer Unit
+ IU2_2,
+ IU2_3,
+
+ IU1a, // Single-Cycle Integer Unit
+ IU1b, // Single-Cycle Integer Unit
+ IU1c, // Single-Cycle Integer Unit
+
+ LSU_1, // Load/Store Unit
+ LSU_2,
+ LSU_3,
+ LSU_4,
+
+ FPU_1, // Floating-Point Unit
+ FPU_2,
+ FPU_3,
+ FPU_4,
+
+ VIU1, // Vector Simple Integer Unit
+
+ VPU_1, // Vector Permute Unit
+ VPU_2,
+
+ VIU2_1, // Vector Complex Integer Unit
+ VIU2_2,
+ VIU2_3,
+ VIU2_4,
+
+ VFPU_1, // Vector Floating-Point Unit
+ VFPU_2,
+ VFPU_3,
+ VFPU_4,
+
+ NumStages
+} Stage;
+
+static struct {
+ // the instruction currently in this pipeline stage
+ PCode *instr;
+
+ // how many cycles are left for this instruction to finish
+ int remaining;
+} pipeline_altivec[NumStages];
+
+enum {
+ Queue0,
+ Queue1,
+ Queue2,
+ Queue3,
+ Queue4,
+ Queue5,
+ Queue6,
+ Queue7,
+ NumQueues
+};
+
+static int fetchqueues[NumQueues];
+
+enum {
+ MaxEntries = 16
+};
+
+static struct {
+ // how many entries remain unused in the queue
+ unsigned int free;
+
+ // how many entries are currently used in the queue
+ unsigned int used;
+
+ // the index of the next instruction that will be retired
+ unsigned int nextToRetire;
+
+ // the index of the next free slot that will be used when an instruction is dispatched
+ unsigned int nextFreeSlot;
+
+ // circular array of entries in the completion queue
+ struct {
+ PCode *instr;
+ int completed;
+ } entries[MaxEntries];
+} completionbuffers;
+
+static struct {
+ short index;
+
+ // the initial stage for this instruction
+ Stage stage;
+
+ // the total amount of cycles required by this instruction
+ char latency;
+
+ // how long it takes to finish each stage
+ char cycles[4];
+
+ // does this instruction serialise?
+ char serializes;
+
+ char unused;
+} instruction_timing[] = {
+ 0, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_B
+ 1, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BL
+ 2, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BC
+ 3, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BCLR
+ 4, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BCCTR
+ 5, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BT
+ 6, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BTLR
+ 7, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BTCTR
+ 8, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BF
+ 9, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BFLR
+ 10, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BFCTR
+ 11, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDNZ
+ 12, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDNZT
+ 13, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDNZF
+ 14, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDZ
+ 15, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDZT
+ 16, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BDZF
+ 17, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BLR
+ 18, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BCTR
+ 19, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BCTRL
+ 20, BPU, 0, 0, 0, 0, 0, 0, 0, // PC_BLRL
+ 21, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LBZ
+ 22, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LBZU
+ 23, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LBZX
+ 24, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LBZUX
+ 25, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHZ
+ 26, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHZU
+ 27, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHZX
+ 28, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHZUX
+ 29, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHA
+ 30, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHAU
+ 31, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHAX
+ 32, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHAUX
+ 33, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LHBRX
+ 34, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LWZ
+ 35, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LWZU
+ 36, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LWZX
+ 37, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LWZUX
+ 38, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LWBRX
+ 39, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_LMW
+ 40, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STB
+ 41, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STBU
+ 42, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STBX
+ 43, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STBUX
+ 44, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STH
+ 45, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STHU
+ 46, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STHX
+ 47, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STHUX
+ 48, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STHBRX
+ 49, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STW
+ 50, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STWU
+ 51, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STWX
+ 52, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STWUX
+ 53, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STWBRX
+ 54, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STMW
+ 55, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_DCBF
+ 56, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_DCBST
+ 57, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DCBT
+ 58, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DCBTST
+ 59, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DCBZ
+ 60, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADD
+ 61, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADDC
+ 62, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADDE
+ 63, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADDI
+ 64, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADDIC
+ 65, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADDICR
+ 66, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADDIS
+ 67, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADDME
+ 68, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ADDZE
+ 69, IU2_1, 23, 23, 0, 0, 0, 0, 0, // PC_DIVW
+ 70, IU2_1, 23, 23, 0, 0, 0, 0, 0, // PC_DIVWU
+ 71, IU2_1, 4, 2, 2, 0, 0, 0, 0, // PC_MULHW
+ 72, IU2_1, 4, 2, 2, 0, 0, 0, 0, // PC_MULHWU
+ 73, IU2_1, 3, 1, 1, 1, 0, 0, 0, // PC_MULLI
+ 74, IU2_1, 4, 2, 2, 0, 0, 0, 0, // PC_MULLW
+ 75, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_NEG
+ 76, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_SUBF
+ 77, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFC
+ 78, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFE
+ 79, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFIC
+ 80, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFME
+ 81, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_SUBFZE
+ 82, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_CMPI
+ 83, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_CMP
+ 84, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_CMPLI
+ 85, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_CMPL
+ 86, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ANDI
+ 87, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ANDIS
+ 88, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ORI
+ 89, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ORIS
+ 90, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_XORI
+ 91, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_XORIS
+ 92, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_AND
+ 93, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_OR
+ 94, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_XOR
+ 95, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_NAND
+ 96, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_NOR
+ 97, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_EQV
+ 98, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ANDC
+ 99, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ORC
+ 100, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_EXTSB
+ 101, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_EXTSH
+ 102, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_CNTLZW
+ 103, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_RLWINM
+ 104, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_RLWNM
+ 105, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_RLWIMI
+ 106, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_SLW
+ 107, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_SRW
+ 108, IU1a, 2, 2, 0, 0, 0, 0, 0, // PC_SRAWI
+ 109, IU1a, 2, 2, 0, 0, 0, 0, 0, // PC_SRAW
+ 110, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_CRAND
+ 111, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_CRANDC
+ 112, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_CREQV
+ 113, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_CRNAND
+ 114, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_CRNOR
+ 115, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_CROR
+ 116, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_CRORC
+ 117, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_CRXOR
+ 118, IU2_1, 1, 1, 0, 0, 0, 1, 0, // PC_MCRF
+ 119, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_MTXER
+ 120, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_MTCTR
+ 121, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_MTLR
+ 122, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_MTCRF
+ 123, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_MTMSR
+ 124, IU2_1, 3, 3, 0, 0, 0, 1, 0, // PC_MTSPR
+ 125, IU2_1, 3, 2, 1, 0, 0, 0, 0, // PC_MFMSR
+ 126, IU2_1, 3, 3, 0, 0, 0, 1, 0, // PC_MFSPR
+ 127, IU2_1, 1, 1, 0, 0, 0, 1, 0, // PC_MFXER
+ 128, IU2_1, 1, 1, 0, 0, 0, 1, 0, // PC_MFCTR
+ 129, IU2_1, 1, 1, 0, 0, 0, 1, 0, // PC_MFLR
+ 130, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_MFCR
+ 131, FPU_1, 5, 5, 0, 0, 0, 1, 0, // PC_MFFS
+ 132, FPU_1, 5, 5, 0, 0, 0, 1, 0, // PC_MTFSF
+ 133, LSU_1, 3, 3, 0, 0, 0, 1, 0, // PC_EIEIO
+ 134, IU2_1, 1, 1, 0, 0, 0, 1, 0, // PC_ISYNC
+ 135, LSU_1, 35, 35, 0, 0, 0, 1, 0, // PC_SYNC
+ 136, IU2_1, 1, 1, 0, 0, 0, 1, 0, // PC_RFI
+ 137, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_LI
+ 138, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_LIS
+ 139, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_MR
+ 140, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_NOP
+ 141, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_NOT
+ 142, LSU_1, 4, 1, 1, 1, 1, 0, 0, // PC_LFS
+ 143, LSU_1, 4, 1, 1, 1, 1, 0, 0, // PC_LFSU
+ 144, LSU_1, 4, 1, 1, 1, 1, 0, 0, // PC_LFSX
+ 145, LSU_1, 4, 1, 1, 1, 1, 0, 0, // PC_LFSUX
+ 146, LSU_1, 4, 1, 1, 1, 1, 0, 0, // PC_LFD
+ 147, LSU_1, 4, 1, 1, 1, 1, 0, 0, // PC_LFDU
+ 148, LSU_1, 4, 1, 1, 1, 1, 0, 0, // PC_LFDX
+ 149, LSU_1, 4, 1, 1, 1, 1, 0, 0, // PC_LFDUX
+ 150, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STFS
+ 151, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STFSU
+ 152, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STFSX
+ 153, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STFSUX
+ 154, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STFD
+ 155, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STFDU
+ 156, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STFDX
+ 157, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STFDUX
+ 158, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FMR
+ 159, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FABS
+ 160, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FNEG
+ 161, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FNABS
+ 162, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FADD
+ 163, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FADDS
+ 164, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FSUB
+ 165, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FSUBS
+ 166, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FMUL
+ 167, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FMULS
+ 168, FPU_1, 35, 35, 0, 0, 0, 0, 0, // PC_FDIV
+ 169, FPU_1, 21, 21, 0, 0, 0, 0, 0, // PC_FDIVS
+ 170, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FMADD
+ 171, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FMADDS
+ 172, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FMSUB
+ 173, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FMSUBS
+ 174, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FNMADD
+ 175, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FNMADDS
+ 176, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FNMSUB
+ 177, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FNMSUBS
+ 178, FPU_1, 14, 14, 0, 0, 0, 0, 0, // PC_FRES
+ 179, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FRSQRTE
+ 180, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FSEL
+ 181, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FRSP
+ 182, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FCTIW
+ 183, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FCTIWZ
+ 184, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FCMPU
+ 185, FPU_1, 5, 1, 1, 1, 2, 0, 0, // PC_FCMPO
+ 186, LSU_1, 3, 3, 0, 0, 0, 1, 0, // PC_LWARX
+ 187, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LSWI
+ 188, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_LSWX
+ 189, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STFIWX
+ 190, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STSWI
+ 191, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_STSWX
+ 192, LSU_1, 3, 1, 1, 1, 0, 1, 0, // PC_STWCX
+ 193, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_ECIWX
+ 194, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_ECOWX
+ 195, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_DCBI
+ 196, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_ICBI
+ 197, IU2_1, 5, 5, 0, 0, 0, 1, 0, // PC_MCRFS
+ 198, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_MCRXR
+ 199, IU2_1, 5, 5, 0, 0, 0, 0, 0, // PC_MFTB
+ 200, IU2_1, 4, 1, 3, 0, 0, 0, 0, // PC_MFSR
+ 201, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_MTSR
+ 202, IU2_1, 4, 1, 3, 0, 0, 0, 0, // PC_MFSRIN
+ 203, IU2_1, 2, 2, 0, 0, 0, 1, 0, // PC_MTSRIN
+ 204, FPU_1, 5, 5, 0, 0, 0, 1, 0, // PC_MTFSB0
+ 205, FPU_1, 5, 5, 0, 0, 0, 1, 0, // PC_MTFSB1
+ 206, FPU_1, 5, 5, 0, 0, 0, 0, 0, // PC_MTFSFI
+ 207, IU2_1, 1, 1, 0, 0, 0, 1, 0, // PC_SC
+ 208, FPU_1, 1, 1, 0, 0, 0, 0, 0, // PC_FSQRT
+ 209, FPU_1, 1, 1, 0, 0, 0, 0, 0, // PC_FSQRTS
+ 210, LSU_1, 1, 1, 0, 0, 0, 0, 0, // PC_TLBIA
+ 211, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_TLBIE
+ 212, LSU_1, 3, 3, 0, 0, 0, 0, 0, // PC_TLBLD
+ 213, LSU_1, 3, 3, 0, 0, 0, 1, 0, // PC_TLBLI
+ 214, LSU_1, 3, 3, 0, 0, 0, 1, 0, // PC_TLBSYNC
+ 215, IU1a, 2, 2, 0, 0, 0, 0, 0, // PC_TW
+ 216, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_TRAP
+ 217, IU1a, 2, 2, 0, 0, 0, 0, 0, // PC_TWI
+ 218, IU1a, 1, 1, 0, 0, 0, 1, 0, // PC_OPWORD
+ 219, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_MFROM
+ 220, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_DSA
+ 221, IU1a, 1, 1, 0, 0, 0, 0, 0, // PC_ESA
+ 222, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_DCCCI
+ 223, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_DCREAD
+ 224, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_ICBT
+ 225, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_ICCCI
+ 226, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_ICREAD
+ 227, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_RFCI
+ 228, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_TLBRE
+ 229, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_TLBSX
+ 230, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_TLBWE
+ 231, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_WRTEE
+ 232, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_WRTEEI
+ 233, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_MFDCR
+ 234, IU1a, 1, 0, 0, 0, 0, 0, 0, // PC_MTDCR
+ 235, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DCBA
+ 236, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DSS
+ 237, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DSSALL
+ 238, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DST
+ 239, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DSTT
+ 240, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DSTST
+ 241, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_DSTSTT
+ 242, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LVEBX
+ 243, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LVEHX
+ 244, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LVEWX
+ 245, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LVSL
+ 246, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LVSR
+ 247, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LVX
+ 248, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_LVXL
+ 249, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STVEBX
+ 250, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STVEHX
+ 251, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STVEWX
+ 252, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STVX
+ 253, LSU_1, 3, 1, 1, 1, 0, 0, 0, // PC_STVXL
+ 254, VFPU_1, 2, 2, 0, 0, 0, 1, 0, // PC_MFVSCR
+ 255, VFPU_1, 2, 2, 0, 0, 0, 1, 0, // PC_MTVSCR
+ 256, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDCUW
+ 257, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VADDFP
+ 258, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDSBS
+ 259, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDSHS
+ 260, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDSWS
+ 261, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUBM
+ 262, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUBS
+ 263, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUHM
+ 264, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUHS
+ 265, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUWM
+ 266, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VADDUWS
+ 267, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VAND
+ 268, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VANDC
+ 269, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGSB
+ 270, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGSH
+ 271, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGSW
+ 272, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGUB
+ 273, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGUH
+ 274, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VAVGUW
+ 275, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VCFSX
+ 276, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VCFUX
+ 277, VFPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VCMPBFP
+ 278, VFPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VCMPEQFP
+ 279, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPEQUB
+ 280, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPEQUH
+ 281, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPEQUW
+ 282, VFPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VCMPGEFP
+ 283, VFPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VCMPGTFP
+ 284, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTSB
+ 285, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTSH
+ 286, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTSW
+ 287, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTUB
+ 288, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTUH
+ 289, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VCMPGTUW
+ 290, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VCTSXS
+ 291, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VCTUXS
+ 292, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VEXPTEFP
+ 293, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VLOGEFP
+ 294, VFPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMAXFP
+ 295, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXSB
+ 296, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXSH
+ 297, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXSW
+ 298, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXUB
+ 299, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXUH
+ 300, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMAXUW
+ 301, VFPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMINFP
+ 302, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMINSB
+ 303, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMINSH
+ 304, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMINSW
+ 305, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMINUB
+ 306, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMINUH
+ 307, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMINUW
+ 308, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMRGHB
+ 309, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMRGHH
+ 310, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMRGHW
+ 311, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMRGLB
+ 312, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMRGLH
+ 313, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMRGLW
+ 314, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMULESB
+ 315, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMULESH
+ 316, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMULEUB
+ 317, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMULEUH
+ 318, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMULOSB
+ 319, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMULOSH
+ 320, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMULOUB
+ 321, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMULOUH
+ 322, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VNOR
+ 323, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VOR
+ 324, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKPX
+ 325, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKSHSS
+ 326, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKSHUS
+ 327, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKSWSS
+ 328, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKSWUS
+ 329, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKUHUM
+ 330, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKUHUS
+ 331, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKUWUM
+ 332, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPKUWUS
+ 333, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VREFP
+ 334, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VRFIM
+ 335, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VRFIN
+ 336, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VRFIP
+ 337, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VRFIZ
+ 338, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VRLB
+ 339, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VRLH
+ 340, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VRLW
+ 341, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VRSQRTEFP
+ 342, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSL
+ 343, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSLB
+ 344, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSLH
+ 345, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSLO
+ 346, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSLW
+ 347, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSPLTB
+ 348, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSPLTH
+ 349, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSPLTW
+ 350, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSPLTISB
+ 351, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSPLTISH
+ 352, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSPLTISW
+ 353, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSR
+ 354, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSRAB
+ 355, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSRAH
+ 356, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSRAW
+ 357, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSRB
+ 358, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSRH
+ 359, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSRO
+ 360, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSRW
+ 361, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBCUW
+ 362, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VSUBFP
+ 363, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBSBS
+ 364, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBSHS
+ 365, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBSWS
+ 366, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUBM
+ 367, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUBS
+ 368, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUHM
+ 369, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUHS
+ 370, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUWM
+ 371, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSUBUWS
+ 372, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VSUMSWS
+ 373, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VSUM2SWS
+ 374, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VSUM4SBS
+ 375, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VSUM4SHS
+ 376, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VSUM4UBS
+ 377, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VUPKHPX
+ 378, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VUPKHSB
+ 379, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VUPKHSH
+ 380, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VUPKLPX
+ 381, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VUPKLSB
+ 382, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VUPKLSH
+ 383, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VXOR
+ 384, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMADDFP
+ 385, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMHADDSHS
+ 386, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMHRADDSHS
+ 387, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMLADDUHM
+ 388, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMSUMMBM
+ 389, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMSUMSHM
+ 390, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMSUMSHS
+ 391, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMSUMUBM
+ 392, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMSUMUHM
+ 393, VIU2_1, 4, 1, 1, 1, 1, 0, 0, // PC_VMSUMUHS
+ 394, VFPU_1, 4, 1, 1, 1, 1, 0, 0, // PC_VNMSUBFP
+ 395, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VPERM
+ 396, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VSEL
+ 397, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VSLDOI
+ 398, VIU1, 1, 1, 0, 0, 0, 0, 0, // PC_VMR
+ 399, VPU_1, 2, 1, 1, 0, 0, 0, 0, // PC_VMRP
+ -1, IU2_1, 1, 1, 0, 0, 0, 1, 0
+};
+
+enum { NumPipelineUnits = 6 };
+static struct {
+ Stage start, end;
+} pipeline_units[8] = {
+ IU2_1, IU2_3,
+ LSU_1, LSU_4,
+ FPU_1, FPU_4,
+ VPU_1, VPU_2,
+ VIU2_1, VIU2_4,
+ VFPU_1, VFPU_4
+};
+
+enum { NumFinalStages = 11 };
+static Stage finalstages[16] = {
+ BPU, IU2_3, IU1a, IU1b,
+ IU1c, LSU_4, FPU_4, VIU1,
+ VPU_2, VIU2_4, VFPU_4
+};
+
+// forward decl
+static void complete_instruction(int stage);
+
+static void advance(int firstStage, int oldStage, int newStage) {
+ PCode *instr = pipeline_altivec[oldStage].instr;
+ int cycles = instruction_timing[instr->op].cycles[newStage - firstStage];
+ pipeline_altivec[newStage].instr = instr;
+ pipeline_altivec[newStage].remaining = cycles;
+ pipeline_altivec[oldStage].instr = NULL;
+ pipeline_altivec[oldStage].remaining = 0;
+ if (cycles == 0)
+ complete_instruction(newStage);
+}
+
+static void assign_completion_buffer(PCode *instr) {
+ completionbuffers.used++;
+ completionbuffers.free--;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].instr = instr;
+ completionbuffers.entries[completionbuffers.nextFreeSlot].completed = 0;
+ completionbuffers.nextFreeSlot = (completionbuffers.nextFreeSlot + 1) % MaxEntries;
+}
+
+static void complete_instruction(int stage) {
+ PCode *instr = pipeline_altivec[stage].instr;
+ int buf = 0;
+ while (buf < MaxEntries && completionbuffers.entries[buf].instr != instr)
+ buf++;
+
+ completionbuffers.entries[buf].completed = 1;
+ pipeline_altivec[stage].instr = NULL;
+}
+
+static void retire_instruction(void) {
+ completionbuffers.entries[completionbuffers.nextToRetire].instr = NULL;
+ completionbuffers.entries[completionbuffers.nextToRetire].completed = 0;
+ completionbuffers.used--;
+ completionbuffers.free++;
+ completionbuffers.nextToRetire = (completionbuffers.nextToRetire + 1) % MaxEntries;
+}
+
+static int latency(PCode *instr) {
+ int cycles = instruction_timing[instr->op].latency;
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
+ cycles += 1;
+ if (instr->op == PC_LMW || instr->op == PC_STMW)
+ cycles += instr->argCount - 2;
+ return cycles;
+}
+
+static void initialize(void) {
+ int stage;
+ int i;
+
+ fetchqueues[Queue0] = 1;
+ for (i = 1; i < NumQueues; i++)
+ fetchqueues[i] = 0;
+
+ for (stage = 0; stage < NumStages; stage++)
+ pipeline_altivec[stage].instr = NULL;
+
+ completionbuffers.free = MaxEntries;
+ completionbuffers.used = 0;
+ completionbuffers.nextToRetire = 0;
+ completionbuffers.nextFreeSlot = 0;
+ for (i = 0; i < MaxEntries; i++) {
+ completionbuffers.entries[i].instr = NULL;
+ completionbuffers.entries[i].completed = 0;
+ }
+}
+
+static int can_issue(PCode *instr) {
+ int stage;
+
+ if (completionbuffers.free == 0)
+ return 0;
+
+ stage = instruction_timing[instr->op].stage;
+
+ if (stage == IU1a) {
+ int isClear1 = !pipeline_altivec[IU1a].instr;
+ int isClear2 = !pipeline_altivec[IU1b].instr;
+ if (!isClear1 && !isClear2)
+ return 0;
+ } else {
+ if (pipeline_altivec[stage].instr)
+ return 0;
+ }
+
+ if (fetchqueues[Queue1] <= 0)
+ return 0;
+
+ if (stage == FPU_1) {
+ if (fetchqueues[Queue2] < 1 || fetchqueues[Queue5] >= 1)
+ return 0;
+ } else if (stage >= VIU1 && stage <= VFPU_1) {
+ if (fetchqueues[Queue4] < 1 || fetchqueues[Queue7] >= 2)
+ return 0;
+ } else if (stage != BPU) {
+ if (fetchqueues[Queue3] < 1 || fetchqueues[Queue6] >= 3)
+ return 0;
+ }
+
+ return 1;
+}
+
+static void issue(PCode *instr) {
+ int stage = instruction_timing[instr->op].stage;
+ int cycles = instruction_timing[instr->op].cycles[0];
+ assign_completion_buffer(instr);
+
+ CError_ASSERT(879, --fetchqueues[Queue1] >= 0);
+
+ if (stage == FPU_1) {
+ fetchqueues[Queue2]--;
+ fetchqueues[Queue5]++;
+ } else if (stage >= VIU1 && stage <= VFPU_1) {
+ fetchqueues[Queue4]--;
+ fetchqueues[Queue7]++;
+ } else if (stage != BPU) {
+ fetchqueues[Queue3]--;
+ fetchqueues[Queue6]++;
+ }
+
+ fetchqueues[Queue2] = (fetchqueues[Queue1] < fetchqueues[Queue2]) ? fetchqueues[Queue1] : fetchqueues[Queue2];
+ fetchqueues[Queue3] = (fetchqueues[Queue1] < fetchqueues[Queue3]) ? fetchqueues[Queue1] : fetchqueues[Queue3];
+ fetchqueues[Queue4] = (fetchqueues[Queue1] < fetchqueues[Queue4]) ? fetchqueues[Queue1] : fetchqueues[Queue4];
+
+ if (stage == IU1a) {
+ if (!pipeline_altivec[IU1a].instr)
+ stage = IU1a;
+ else if (!pipeline_altivec[IU1b].instr)
+ stage = IU1b;
+ else if (!pipeline_altivec[IU1c].instr)
+ stage = IU1c;
+ }
+
+ pipeline_altivec[stage].instr = instr;
+ pipeline_altivec[stage].remaining = cycles;
+}
+
+static void advance_clock(void) {
+ int num;
+ int i;
+ unsigned int unit;
+
+ for (i = 0; i < NumStages; i++) {
+ if (pipeline_altivec[i].instr && pipeline_altivec[i].remaining)
+ --pipeline_altivec[i].remaining;
+ }
+
+ for (i = 0; i < 3; i++) {
+ if (completionbuffers.used == 0)
+ break;
+ if (completionbuffers.entries[completionbuffers.nextToRetire].completed == 0)
+ break;
+ retire_instruction();
+ }
+
+ unit = 0;
+ do {
+ if (pipeline_altivec[finalstages[unit]].instr && pipeline_altivec[finalstages[unit]].remaining == 0)
+ complete_instruction(finalstages[unit]);
+ } while (++unit < NumFinalStages);
+
+ unit = 0;
+ do {
+ Stage first;
+ Stage current;
+ first = pipeline_units[unit].start;
+ for (current = first; current < pipeline_units[unit].end; current++) {
+ if (pipeline_altivec[current].instr && pipeline_altivec[current].remaining == 0 && !pipeline_altivec[current + 1].instr)
+ advance(first, current, current + 1);
+ }
+ } while (++unit < NumPipelineUnits);
+
+ fetchqueues[Queue5] = 0;
+ fetchqueues[Queue6] = 0;
+ fetchqueues[Queue7] = 0;
+
+#define CHEAP_MIN(a, b) ( ((a) < (b)) ? (a) : (b) )
+ num = 2 - fetchqueues[Queue2];
+ num += 6 - fetchqueues[Queue3];
+ num += 4 - fetchqueues[Queue4];
+ num = (num > 3) ? 3 : num;
+ num = (completionbuffers.free < num) ? completionbuffers.free : num;
+ if (fetchqueues[Queue0] < num)
+ num = fetchqueues[Queue0];
+
+ fetchqueues[Queue1] += num;
+ fetchqueues[Queue0] -= num;
+
+ fetchqueues[Queue2] = CHEAP_MIN(fetchqueues[Queue1], CHEAP_MIN(2, fetchqueues[Queue2] + num));
+ fetchqueues[Queue3] = CHEAP_MIN(fetchqueues[Queue1], CHEAP_MIN(6, fetchqueues[Queue3] + num));
+ fetchqueues[Queue4] = CHEAP_MIN(fetchqueues[Queue1], CHEAP_MIN(4, fetchqueues[Queue4] + num));
+
+ CError_ASSERT(991, fetchqueues[Queue1] <= (fetchqueues[Queue2] + fetchqueues[Queue3] + fetchqueues[Queue4]));
+
+ if (fetchqueues[Queue0] <= 8)
+ fetchqueues[Queue0] += 4;
+}
+
+static int serializes(PCode *instr) {
+ return instruction_timing[instr->op].serializes;
+}
+
+static int uses_vpermute_unit_altivec(PCode *instr) {
+ return instruction_timing[instr->op].stage == VPU_1;
+}
+
+MachineInfo machine7450 = {
+ 6,
+ 1,
+ 4,
+ &latency,
+ &initialize,
+ &can_issue,
+ &issue,
+ &advance_clock,
+ &serializes,
+ &uses_vpermute_unit_altivec
+};
diff --git a/compiler_and_linker/unsorted/ObjGenMachO.c b/compiler_and_linker/unsorted/ObjGenMachO.c
index 890c06e..0a2c843 100644
--- a/compiler_and_linker/unsorted/ObjGenMachO.c
+++ b/compiler_and_linker/unsorted/ObjGenMachO.c
@@ -186,7 +186,7 @@ static char ObjGen_ComputePrivFlag(UInt8 objectFlags) {
case 0:
case 1:
if (
- (objectFlags & OBJECT_FLAGS_UNUSED) &&
+ (objectFlags & OBJECT_FLAGS_1) &&
(objectFlags & OBJECT_FLAGS_2) &&
!(objectFlags & OBJECT_FLAGS_4)
)
@@ -199,7 +199,7 @@ static char ObjGen_ComputePrivFlag(UInt8 objectFlags) {
if ((objectFlags & OBJECT_FLAGS_40) == OBJECT_FLAGS_40)
return 0;
if (
- (objectFlags & OBJECT_FLAGS_UNUSED) &&
+ (objectFlags & OBJECT_FLAGS_1) &&
(objectFlags & OBJECT_FLAGS_2) &&
!(objectFlags & OBJECT_FLAGS_4)
)
diff --git a/compiler_and_linker/unsorted/OpcodeInfo.c b/compiler_and_linker/unsorted/OpcodeInfo.c
new file mode 100644
index 0000000..14d9032
--- /dev/null
+++ b/compiler_and_linker/unsorted/OpcodeInfo.c
@@ -0,0 +1,435 @@
+#include "compiler/PCodeInfo.h"
+#include "compiler/PCode.h"
+
+OpcodeInfo opcodeinfo[] = {
+ "B", "l;p", 2, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x48000000,
+ "BL", "#,m;p", 2, 0, fIsCall | fLink | fCanLink | fCanBeAbsolute, 0x48000001,
+ "BC", "B,Q,l;p", 5, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x40000000,
+ "BCLR", "B,Q;L", 4, 0, fIsBranch | fCanLink, 0x4C000020,
+ "BCCTR", "B,Q;Cp", 5, 0, fIsBranch | fCanLink, 0x4C000420,
+ "BT", "Q,l;p", 4, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x41800000,
+ "BTLR", "Q;L", 3, 0, fIsBranch | fCanLink, 0x4D800020,
+ "BTCTR", "Q;Cp", 4, 0, fIsBranch | fCanLink, 0x4D800420,
+ "BF", "Q,l;p", 4, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x40800000,
+ "BFLR", "Q;L", 3, 0, fIsBranch | fCanLink, 0x4C800020,
+ "BFCTR", "Q;Cp", 4, 0, fIsBranch | fCanLink, 0x4C800420,
+ "BDNZ", "l;Cp", 3, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x42000000,
+ "BDNZT", "Q,l;Cp", 4, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x41000000,
+ "BDNZF", "Q,l;Cp", 4, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x40000000,
+ "BDZ", "l;Cp", 2, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x42400000,
+ "BDZT", "Q,l;Cp", 4, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x41400000,
+ "BDZF", "Q,l;Cp", 4, 0, fIsBranch | fCanLink | fCanBeAbsolute, 0x40400000,
+ "BLR", ";L", 1, 0, fIsBranch | fCanLink, 0x4E800020,
+ "BCTR", ";Cmp", 3, 0, fIsBranch | fCanLink, 0x4E800420,
+ "BCTRL", "#;C=L", 2, 0, fIsCall | fLink | fCanLink, 0x4E800421,
+ "BLRL", "#;+L", 1, 0, fIsCall | fLink | fCanLink, 0x4E800021,
+ "LBZ", "=r,d(b)", 3, 3, fIsRead, 0x88000000,
+ "LBZU", "=r,d(+b)", 3, 3, fIsRead | fUpdatesPtr, 0x8C000000,
+ "LBZX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C0000AE,
+ "LBZUX", "=r,(+b,r)", 3, 3, fIsRead | fIsPtrOp | fUpdatesPtr, 0x7C0000EE,
+ "LHZ", "=r,d(b)", 3, 3, fIsRead, 0xA0000000,
+ "LHZU", "=r,d(+b)", 3, 3, fIsRead | fUpdatesPtr, 0xA4000000,
+ "LHZX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C00022E,
+ "LHZUX", "=r,(+b,r)", 3, 3, fIsRead | fIsPtrOp | fUpdatesPtr, 0x7C00026E,
+ "LHA", "=r,d(b)", 3, 3, fIsRead, 0xA8000000,
+ "LHAU", "=r,d(+b)", 3, 3, fIsRead | fUpdatesPtr, 0xAC000000,
+ "LHAX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C0002AE,
+ "LHAUX", "=r,(+b,r)", 3, 3, fIsRead | fIsPtrOp | fUpdatesPtr, 0x7C0002EE,
+ "LHBRX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C00062C,
+ "LWZ", "=r,d(b)", 3, 3, fIsRead, 0x80000000,
+ "LWZU", "=r,d(+b)", 3, 3, fIsRead | fUpdatesPtr, 0x84000000,
+ "LWZX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C00002E,
+ "LWZUX", "=r,(+b,r)", 3, 3, fIsRead | fIsPtrOp | fUpdatesPtr, 0x7C00006E,
+ "LWBRX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C00042C,
+ "LMW", "#,=r,d(b);=V", 3, 3, fIsRead, 0xB8000000,
+ "STB", "r,d(b)", 3, 1, fIsWrite, 0x98000000,
+ "STBU", "r,d(+b)", 3, 2, fIsWrite | fUpdatesPtr, 0x9C000000,
+ "STBX", "r,(b,r)", 3, 1, fIsWrite | fIsPtrOp, 0x7C0001AE,
+ "STBUX", "r,(+b,r)", 3, 2, fIsWrite | fIsPtrOp | fUpdatesPtr, 0x7C0001EE,
+ "STH", "r,d(b)", 3, 1, fIsWrite, 0xB0000000,
+ "STHU", "r,d(+b)", 3, 2, fIsWrite | fUpdatesPtr, 0xB4000000,
+ "STHX", "r,(b,r)", 3, 1, fIsWrite | fIsPtrOp, 0x7C00032E,
+ "STHUX", "r,(+b,r)", 3, 2, fIsWrite | fIsPtrOp | fUpdatesPtr, 0x7C00036E,
+ "STHBRX", "r,(b,r)", 3, 1, fIsWrite | fIsPtrOp, 0x7C00072C,
+ "STW", "r,d(b)", 3, 1, fIsWrite, 0x90000000,
+ "STWU", "r,d(+b)", 3, 2, fIsWrite | fUpdatesPtr, 0x94000000,
+ "STWX", "r,(b,r)", 3, 1, fIsWrite | fIsPtrOp, 0x7C00012E,
+ "STWUX", "r,(+b,r)", 3, 2, fIsWrite | fIsPtrOp | fUpdatesPtr, 0x7C00016E,
+ "STWBRX", "r,(b,r)", 3, 1, fIsWrite | fIsPtrOp, 0x7C00052C,
+ "STMW", "#,r,d(b);V", 3, 1, fIsWrite, 0xBC000000,
+ "DCBF", "b,r", 2, 1, fSideEffects | fOpTypeGPR, 0x7C0000AC,
+ "DCBST", "b,r", 2, 1, fSideEffects | fOpTypeGPR, 0x7C00006C,
+ "DCBT", "b,r", 2, 1, fSideEffects | fOpTypeGPR, 0x7C00022C,
+ "DCBTST", "b,r", 2, 1, fSideEffects | fOpTypeGPR, 0x7C0001EC,
+ "DCBZ", "b,r", 2, 1, fSideEffects | fOpTypeGPR, 0x7C0007EC,
+ "ADD", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C000214,
+ "ADDC", "=r,r,r;+X", 4, 2, fCanSetCarry | fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C000014,
+ "ADDE", "=r,r,r;+X", 4, 2, fCanSetCarry | fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C000114,
+ "ADDI", "=r,b,m;p", 4, 2, fIsCSE | fPCodeFlag400000 | fCanSetRecordBit | fOpTypeGPR, 0x38000000,
+ "ADDIC", "=r,r,i;+X", 4, 2, fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x30000000,
+ "ADDICR", "=r,r,n;+X=Z", 5, 2, fCanSetRecordBit | fSetsCarry | fRecordBit | fOpTypeGPR, 0x34000000,
+ "ADDIS", "=r,b,M", 3, 2, fIsCSE | fPCodeFlag400000 | fOpTypeGPR, 0x3C000000,
+ "ADDME", "=r,r;+X", 3, 2, fCanSetCarry | fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C0001D4,
+ "ADDZE", "=r,r;+X", 3, 2, fCanSetCarry | fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C000194,
+ "DIVW", "=r,r,r", 3, 2, fIsCSE | fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C0003D6,
+ "DIVWU", "=r,r,r", 3, 2, fIsCSE | fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C000396,
+ "MULHW", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000096,
+ "MULHWU", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000016,
+ "MULLI", "=r,r,i", 3, 2, fIsCSE | fOpTypeGPR, 0x1C000000,
+ "MULLW", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C0001D6,
+ "NEG", "=r,r", 2, 2, fIsCSE | fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C0000D0,
+ "SUBF", "=r,r,r", 3, 2, fIsCSE | fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C000050,
+ "SUBFC", "=r,r,r;+X", 4, 2, fCanSetCarry | fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C000010,
+ "SUBFE", "=r,r,r;+X", 4, 2, fCanSetCarry | fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C000110,
+ "SUBFIC", "=r,r,i;+X", 4, 2, fSetsCarry | fOpTypeGPR, 0x20000000,
+ "SUBFME", "=r,r;+X", 3, 2, fCanSetCarry | fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C0001D0,
+ "SUBFZE", "=r,r;+X", 3, 2, fCanSetCarry | fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C000190,
+ "CMPI", "=?c,Or,i", 3, 1, fIsCSE | fOpTypeGPR, 0x2C000000,
+ "CMP", "=?c,Or,r", 3, 1, fIsCSE | fOpTypeGPR, 0x7C000000,
+ "CMPLI", "=?c,Or,u", 3, 1, fIsCSE | fOpTypeGPR, 0x28000000,
+ "CMPL", "=?c,Or,r", 3, 1, fIsCSE | fOpTypeGPR, 0x7C000040,
+ "ANDI", "=r,r,x;=Z", 4, 2, fCanSetRecordBit | fRecordBit | fOpTypeGPR, 0x70000000,
+ "ANDIS", "=r,r,x;=Z", 4, 2, fCanSetRecordBit | fRecordBit | fOpTypeGPR, 0x74000000,
+ "ORI", "=r,r,x", 3, 2, fIsCSE | fOpTypeGPR, 0x60000000,
+ "ORIS", "=r,r,x", 3, 2, fIsCSE | fOpTypeGPR, 0x64000000,
+ "XORI", "=r,r,x", 3, 2, fIsCSE | fOpTypeGPR, 0x68000000,
+ "XORIS", "=r,r,x", 3, 2, fIsCSE | fOpTypeGPR, 0x6C000000,
+ "AND", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000038,
+ "OR", "=r,r,r;pp", 5, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000378,
+ "XOR", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000278,
+ "NAND", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C0003B8,
+ "NOR", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C0000F8,
+ "EQV", "=r,r,r", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000238,
+ "ANDC", "=r,r,r", 3, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000078,
+ "ORC", "=r,r,r", 3, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000338,
+ "EXTSB", "=r,r", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000774,
+ "EXTSH", "=r,r", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000734,
+ "CNTLZW", "=r,r", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000034,
+ "RLWINM", "=r,r,u5,u5,u5", 5, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x54000000,
+ "RLWNM", "=r,r,r,u5,u5", 5, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x5C000000,
+ "RLWIMI", "+r,r,u5,u5,u5", 5, 2, fCanSetRecordBit | fOpTypeGPR, 0x50000000,
+ "SLW", "=r,r,r", 3, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000030,
+ "SRW", "=r,r,r", 3, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C000430,
+ "SRAWI", "=r,r,u5;+X", 4, 2, fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C000670,
+ "SRAW", "=r,r,r;+X", 4, 2, fCanSetRecordBit | fSetsCarry | fOpTypeGPR, 0x7C000630,
+ "CRAND", "=Q,Q,Q", 6, 2, fCommutative | fIsCSE | fOpTypeGPR, 0x4C000202,
+ "CRANDC", "=Q,Q,Q", 6, 2, fIsCSE | fOpTypeGPR, 0x4C000102,
+ "CREQV", "=Q,Q,Q", 6, 2, fCommutative | fIsCSE | fOpTypeGPR, 0x4C000242,
+ "CRNAND", "=Q,Q,Q", 6, 2, fCommutative | fIsCSE | fOpTypeGPR, 0x4C0001C2,
+ "CRNOR", "=Q,Q,Q", 6, 2, fCommutative | fIsCSE | fOpTypeGPR, 0x4C000042,
+ "CROR", "=Q,Q,Q", 6, 2, fCommutative | fIsCSE | fOpTypeGPR, 0x4C000382,
+ "CRORC", "=Q,Q,Q", 6, 2, fIsCSE | fOpTypeGPR, 0x4C000342,
+ "CRXOR", "=Q,Q,Q", 6, 2, fCommutative | fIsCSE | fOpTypeGPR, 0x4C000182,
+ "MCRF", "=c,c", 2, 1, fIsMove | fOpTypeGPR, 0x4C000000,
+ "MTXER", "r;=X", 2, 1, fSetsCarry | fOpTypeGPR, 0x7C0103A6,
+ "MTCTR", "r;=C", 2, 1, fOpTypeGPR, 0x7C0903A6,
+ "MTLR", "r;=L", 2, 1, fOpTypeGPR, 0x7C0803A6,
+ "MTCRF", "x8,r;=Y", 10, 1, fOpTypeGPR, 0x7C000120,
+ "MTMSR", "r", 1, 4, fSideEffects | fOpTypeGPR, 0x7C000124,
+ "MTSPR", "=s,r", 2, 4, fOpTypeGPR, 0x7C0003A6,
+ "MFMSR", "=r", 1, 4, fOpTypeGPR, 0x7C0000A6,
+ "MFSPR", "=r,s", 2, 4, fOpTypeGPR, 0x7C0002A6,
+ "MFXER", "=r;X", 2, 4, fOpTypeGPR, 0x7C0102A6,
+ "MFCTR", "=r;C", 2, 4, fOpTypeGPR, 0x7C0902A6,
+ "MFLR", "=r;L", 2, 4, fOpTypeGPR, 0x7C0802A6,
+ "MFCR", "=r;Y", 9, 4, fOpTypeGPR, 0x7C000026,
+ "MFFS", "=f", 1, 4, fCanSetRecordBit | fOpTypeFPR, 0xFC00048E,
+ "MTFSF", "x8,f", 2, 1, fSideEffects | fCanSetRecordBit | fOpTypeFPR, 0xFC00058E,
+ "EIEIO", "", 0, 0, fSideEffects | fOpTypeGPR, 0x7C0006AC,
+ "ISYNC", "", 0, 0, fSideEffects | fOpTypeGPR, 0x4C00012C,
+ "SYNC", "", 0, 0, fSideEffects | fOpTypeGPR, 0x7C0004AC,
+ "RFI", "", 0, 0, fSideEffects, 0x4C000064,
+ "LI", "=r,n", 2, 4, fIsCSE | fOpTypeGPR, 0x38000000,
+ "LIS", "=r,M", 2, 4, fIsCSE | fOpTypeGPR, 0x3C000000,
+ "MR", "=r,r;p", 3, 0, fIsMove | fCanSetRecordBit | fOpTypeGPR, 0x7C000378,
+ "NOP", "", 0, 0, fSideEffects | fOpTypeGPR, 0x60000000,
+ "NOT", "=r,r", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeGPR, 0x7C0000F8,
+ "LFS", "=f,d(b)", 3, 3, fIsRead, 0xC0000000,
+ "LFSU", "=f,d(+b)", 3, 3, fIsRead | fUpdatesPtr, 0xC4000000,
+ "LFSX", "=f,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C00042E,
+ "LFSUX", "=f,(+b,r)", 3, 3, fIsRead | fIsPtrOp | fUpdatesPtr, 0x7C00046E,
+ "LFD", "=f,d(b)", 3, 3, fIsRead, 0xC8000000,
+ "LFDU", "=f,d(+b)", 3, 3, fIsRead | fUpdatesPtr, 0xCC000000,
+ "LFDX", "=f,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C0004AE,
+ "LFDUX", "=f,(+b,r)", 3, 3, fIsRead | fIsPtrOp | fUpdatesPtr, 0x7C0004EE,
+ "STFS", "f,d(b)", 3, 1, fIsWrite, 0xD0000000,
+ "STFSU", "f,d(+b)", 3, 2, fIsWrite | fUpdatesPtr, 0xD4000000,
+ "STFSX", "f,(b,r)", 3, 1, fIsWrite | fIsPtrOp, 0x7C00052E,
+ "STFSUX", "f,(+b,r)", 3, 2, fIsWrite | fIsPtrOp | fUpdatesPtr, 0x7C00056E,
+ "STFD", "f,d(b)", 3, 1, fIsWrite, 0xD8000000,
+ "STFDU", "f,d(+b)", 3, 2, fIsWrite | fUpdatesPtr, 0xDC000000,
+ "STFDX", "f,(b,r)", 3, 1, fIsWrite | fIsPtrOp, 0x7C0005AE,
+ "STFDUX", "f,(+b,r)", 3, 2, fIsWrite | fIsPtrOp | fUpdatesPtr, 0x7C0005EE,
+ "FMR", "=f,f", 2, 0, fIsMove | fCanSetRecordBit | fOpTypeFPR, 0xFC000090,
+ "FABS", "=f,f", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC000210,
+ "FNEG", "=f,f", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC000050,
+ "FNABS", "=f,f", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC000110,
+ "FADD", "=f,f,f", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC00002A,
+ "FADDS", "=f,f,f", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xEC00002A,
+ "FSUB", "=f,f,f", 3, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC000028,
+ "FSUBS", "=f,f,f", 3, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xEC000028,
+ "FMUL", "=f,f,f", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC000032,
+ "FMULS", "=f,f,f", 3, 2, fCommutative | fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xEC000032,
+ "FDIV", "=f,f,f", 3, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC000024,
+ "FDIVS", "=f,f,f", 3, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xEC000024,
+ "FMADD", "=f,f,f,f", 4, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC00003A,
+ "FMADDS", "=f,f,f,f", 4, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xEC00003A,
+ "FMSUB", "=f,f,f,f", 4, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC000038,
+ "FMSUBS", "=f,f,f,f", 4, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xEC000038,
+ "FNMADD", "=f,f,f,f", 4, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC00003E,
+ "FNMADDS", "=f,f,f,f", 4, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xEC00003E,
+ "FNMSUB", "=f,f,f,f", 4, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC00003C,
+ "FNMSUBS", "=f,f,f,f", 4, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xEC00003C,
+ "FRES", "=f,f", 2, 2, fCanSetRecordBit | fOpTypeFPR, 0xEC000030,
+ "FRSQRTE", "=f,f", 2, 2, fCanSetRecordBit | fOpTypeFPR, 0xFC000034,
+ "FSEL", "=f,f,f,f", 4, 2, fCanSetRecordBit | fOpTypeFPR, 0xFC00002E,
+ "FRSP", "=f,f", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC000018,
+ "FCTIW", "=f,f", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC00001C,
+ "FCTIWZ", "=f,f", 2, 2, fIsCSE | fCanSetRecordBit | fOpTypeFPR, 0xFC00001E,
+ "FCMPU", "=?c,f,f", 3, 1, fIsCSE | fOpTypeFPR, 0xFC000000,
+ "FCMPO", "=?c,f,f", 3, 1, fIsCSE | fOpTypeFPR, 0xFC000040,
+ "LWARX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C000028,
+ "LSWI", "=r,b,N", 3, 3, fIsRead | fIsPtrOp | fSideEffects, 0x7C0004AA,
+ "LSWX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp | fSideEffects, 0x7C00042A,
+ "STFIWX", "f,(b,r)", 3, 3, fIsWrite | fIsPtrOp, 0x7C0007AE,
+ "STSWI", "r,b,N", 3, 3, fIsWrite | fIsPtrOp, 0x7C0005AA,
+ "STSWX", "r,(b,r)", 3, 3, fIsWrite | fIsPtrOp, 0x7C00052A,
+ "STWCX", "r,(b,r);=Z", 4, 3, fIsWrite | fIsPtrOp | fCanSetRecordBit | fRecordBit, 0x7C00012D,
+ "ECIWX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp, 0x7C00026C,
+ "ECOWX", "r,(b,r)", 3, 1, fIsWrite | fIsPtrOp | fSideEffects, 0x7C00036C,
+ "DCBI", "b,r", 2, 1, fSideEffects | fOpTypeGPR, 0x7C0003AC,
+ "ICBI", "b,r", 2, 1, fSideEffects | fOpTypeGPR, 0x7C0007AC,
+ "MCRFS", "=c,x3", 2, 1, fSideEffects | fOpTypeGPR, 0xFC000080,
+ "MCRXR", "=c;+X", 2, 1, fOpTypeGPR, 0x7C000400,
+ "MFTB", "=r?T", 2, 4, fOpTypeGPR, 0x7C0002E6,
+ "MFSR", "=r,u4", 2, 4, fOpTypeGPR, 0x7C0004A6,
+ "MTSR", "u4,r", 2, 4, fSideEffects | fOpTypeGPR, 0x7C0001A4,
+ "MFSRIN", "=r,r", 2, 4, fOpTypeGPR, 0x7C000526,
+ "MTSRIN", "r,r", 2, 4, fSideEffects | fOpTypeGPR, 0x7C0001E4,
+ "MTFSB0", "u5", 1, 4, fSideEffects | fCanSetRecordBit | fOpTypeGPR, 0xFC00008C,
+ "MTFSB1", "u5", 1, 4, fSideEffects | fCanSetRecordBit | fOpTypeGPR, 0xFC00004C,
+ "MTFSFI", "c,x4", 2, 1, fSideEffects | fCanSetRecordBit | fOpTypeGPR, 0xFC00010C,
+ "SC", "", 0, 0, fIsCall | fSideEffects, 0x44000002,
+ "FSQRT", "=f,f", 2, 2, fCanSetRecordBit | fOpTypeFPR, 0xFC00002C,
+ "FSQRTS", "=f,f", 2, 2, fCanSetRecordBit | fOpTypeFPR, 0xEC00002C,
+ "TLBIA", "", 0, 1, fSideEffects, 0x7C0002E4,
+ "TLBIE", "r", 1, 1, fSideEffects, 0x7C000264,
+ "TLBLD", "r", 1, 1, fSideEffects, 0x7C0007A4,
+ "TLBLI", "r", 1, 1, fSideEffects, 0x7C0007E4,
+ "TLBSYNC", "", 0, 1, fSideEffects, 0x7C00046C,
+ "TW", "t,r,r", 3, 1, fIsCall | fSideEffects, 0x7C000008,
+ "TRAP", "", 0, 1, fIsCall | fSideEffects, 0x7FE00008,
+ "TWI", "t,r,x", 3, 1, fIsCall | fSideEffects, 0x0C000000,
+ "OPWORD", "w", 1, 0, fSideEffects, 0x00000000,
+ "MFROM", "=r,r", 2, 4, fIsRead, 0x7C000212,
+ "DSA", "", 0, 0, fSideEffects | fOpTypeGPR, 0x7C0004E8,
+ "ESA", "", 0, 0, fSideEffects | fOpTypeGPR, 0x7C0004A8,
+ "DCCCI", "b,r", 2, 0, fSideEffects | fOpTypeGPR, 0x7C00038C,
+ "DCREAD", "=r,(b,r)", 3, 0, fSideEffects | fPCodeFlag400000 | fOpTypeGPR, 0x7C0003CC,
+ "ICBT", "b,r", 2, 0, fSideEffects | fOpTypeGPR, 0x7C00020C,
+ "ICCCI", "b,r", 2, 0, fSideEffects | fOpTypeGPR, 0x7C00078C,
+ "ICREAD", "b,r", 2, 0, fSideEffects | fOpTypeGPR, 0x7C0007CC,
+ "RFCI", "", 0, 0, fSideEffects | fOpTypeGPR, 0x4C000066,
+ "TLBRE", "=r,r,u1", 3, 0, fSideEffects | fOpTypeGPR, 0x7C000764,
+ "TLBSX", "=r,(b,r)", 3, 0, fSideEffects | fPCodeFlag400000 | fCanSetRecordBit | fOpTypeGPR, 0x7C000724,
+ "TLBWE", "=r,r,i", 3, 0, fSideEffects | fOpTypeGPR, 0x7C0007A4,
+ "WRTEE", "r", 1, 0, fSideEffects | fOpTypeGPR, 0x7C000106,
+ "WRTEEI", "u1", 1, 0, fSideEffects | fOpTypeGPR, 0x7C000146,
+ "MFDCR", "=r,D", 2, 4, fSideEffects | fOpTypeGPR, 0x7C000286,
+ "MTDCR", "D,r", 2, 4, fSideEffects | fOpTypeGPR, 0x7C000386,
+ "DCBA", "b,r", 2, 1, fSideEffects | fOpTypeGPR, 0x7C0005EC,
+ "DSS", "u2?u2", 2, 1, fSideEffects | fOpTypeGPR, 0x7C00066C,
+ "DSSALL", "", 0, 1, fSideEffects | fOpTypeGPR, 0x7E00066C,
+ "DST", "b,r,u2?u2", 4, 1, fSideEffects | fOpTypeGPR, 0x7C0002AC,
+ "DSTT", "b,r,u2", 3, 1, fSideEffects | fOpTypeGPR, 0x7E0002AC,
+ "DSTST", "b,r,u2?u2", 4, 1, fSideEffects | fOpTypeGPR, 0x7C0002EC,
+ "DSTSTT", "b,r,u2", 3, 1, fSideEffects | fOpTypeGPR, 0x7E0002EC,
+ "LVEBX", "=v,(b,r)", 3, 3, fIsRead | fIsPtrOp | fOpTypeVR, 0x7C00000E,
+ "LVEHX", "=v,(b,r)", 3, 3, fIsRead | fIsPtrOp | fOpTypeVR, 0x7C00004E,
+ "LVEWX", "=v,(b,r)", 3, 3, fIsRead | fIsPtrOp | fOpTypeVR, 0x7C00008E,
+ "LVSL", "=v,(b,r)", 3, 3, fPCodeFlag400000 | fOpTypeVR, 0x7C00000C,
+ "LVSR", "=v,(b,r)", 3, 3, fPCodeFlag400000 | fOpTypeVR, 0x7C00004C,
+ "LVX", "=v,(b,r)", 3, 3, fIsRead | fIsPtrOp | fOpTypeVR, 0x7C0000CE,
+ "LVXL", "=v,(b,r)", 3, 3, fIsRead | fIsPtrOp | fOpTypeVR, 0x7C0002CE,
+ "STVEBX", "v,(b,r)", 3, 1, fIsWrite | fIsPtrOp | fOpTypeVR, 0x7C00010E,
+ "STVEHX", "v,(b,r)", 3, 1, fIsWrite | fIsPtrOp | fOpTypeVR, 0x7C00014E,
+ "STVEWX", "v,(b,r)", 3, 1, fIsWrite | fIsPtrOp | fOpTypeVR, 0x7C00018E,
+ "STVX", "v,(b,r)", 3, 1, fIsWrite | fIsPtrOp | fOpTypeVR, 0x7C0001CE,
+ "STVXL", "v,(b,r)", 3, 1, fIsWrite | fIsPtrOp | fOpTypeVR, 0x7C0003CE,
+ "MFVSCR", "=v", 1, 3, fSideEffects | fOpTypeVR, 0x10000604,
+ "MTVSCR", "v", 1, 3, fSideEffects | fOpTypeVR, 0x10000644,
+ "VADDCUW", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000180,
+ "VADDFP", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x1000000A,
+ "VADDSBS", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000300,
+ "VADDSHS", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000340,
+ "VADDSWS", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000380,
+ "VADDUBM", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000000,
+ "VADDUBS", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000200,
+ "VADDUHM", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000040,
+ "VADDUHS", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000240,
+ "VADDUWM", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000080,
+ "VADDUWS", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000280,
+ "VAND", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000404,
+ "VANDC", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000444,
+ "VAVGSB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000502,
+ "VAVGSH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000542,
+ "VAVGSW", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000582,
+ "VAVGUB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000402,
+ "VAVGUH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000442,
+ "VAVGUW", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000482,
+ "VCFSX", "=v,v,u5", 3, 2, fIsCSE | fOpTypeVR, 0x1000034A,
+ "VCFUX", "=v,v,u5", 3, 2, fIsCSE | fOpTypeVR, 0x1000030A,
+ "VCMPBFP", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x100003C6,
+ "VCMPEQFP", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x100000C6,
+ "VCMPEQUB", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000006,
+ "VCMPEQUH", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000046,
+ "VCMPEQUW", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000086,
+ "VCMPGEFP", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x100001C6,
+ "VCMPGTFP", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x100002C6,
+ "VCMPGTSB", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000306,
+ "VCMPGTSH", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000346,
+ "VCMPGTSW", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000386,
+ "VCMPGTUB", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000206,
+ "VCMPGTUH", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000246,
+ "VCMPGTUW", "=v,v,v", 3, 2, fCanSetRecordBit | fOpTypeVR, 0x10000286,
+ "VCTSXS", "=v,v,u5", 3, 2, fIsCSE | fOpTypeVR, 0x100003CA,
+ "VCTUXS", "=v,v,u5", 3, 2, fIsCSE | fOpTypeVR, 0x1000038A,
+ "VEXPTEFP", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000018A,
+ "VLOGEFP", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x100001CA,
+ "VMAXFP", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x1000040A,
+ "VMAXSB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000102,
+ "VMAXSH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000142,
+ "VMAXSW", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000182,
+ "VMAXUB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000002,
+ "VMAXUH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000042,
+ "VMAXUW", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000082,
+ "VMINFP", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x1000044A,
+ "VMINSB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000302,
+ "VMINSH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000342,
+ "VMINSW", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000382,
+ "VMINUB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000202,
+ "VMINUH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000242,
+ "VMINUW", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000282,
+ "VMRGHB", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000000C,
+ "VMRGHH", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000004C,
+ "VMRGHW", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000008C,
+ "VMRGLB", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000010C,
+ "VMRGLH", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000014C,
+ "VMRGLW", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000018C,
+ "VMULESB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000308,
+ "VMULESH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000348,
+ "VMULEUB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000208,
+ "VMULEUH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000248,
+ "VMULOSB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000108,
+ "VMULOSH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000148,
+ "VMULOUB", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000008,
+ "VMULOUH", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000048,
+ "VNOR", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000504,
+ "VOR", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x10000484,
+ "VPKPX", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000030E,
+ "VPKSHSS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000018E,
+ "VPKSHUS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000010E,
+ "VPKSWSS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x100001CE,
+ "VPKSWUS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000014E,
+ "VPKUHUM", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000000E,
+ "VPKUHUS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000008E,
+ "VPKUWUM", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000004E,
+ "VPKUWUS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x100000CE,
+ "VREFP", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000010A,
+ "VRFIM", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x100002CA,
+ "VRFIN", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000020A,
+ "VRFIP", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000028A,
+ "VRFIZ", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000024A,
+ "VRLB", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000004,
+ "VRLH", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000044,
+ "VRLW", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000084,
+ "VRSQRTEFP", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000014A,
+ "VSL", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x100001C4,
+ "VSLB", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000104,
+ "VSLH", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000144,
+ "VSLO", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000040C,
+ "VSLW", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000184,
+ "VSPLTB", "=v,v,u5", 3, 2, fIsCSE | fOpTypeVR, 0x1000020C,
+ "VSPLTH", "=v,v,u5", 3, 2, fIsCSE | fOpTypeVR, 0x1000024C,
+ "VSPLTW", "=v,v,u5", 3, 2, fIsCSE | fOpTypeVR, 0x1000028C,
+ "VSPLTISB", "=v,i5", 2, 2, fIsCSE | fOpTypeVR, 0x1000030C,
+ "VSPLTISH", "=v,i5", 2, 2, fIsCSE | fOpTypeVR, 0x1000034C,
+ "VSPLTISW", "=v,i5", 2, 2, fIsCSE | fOpTypeVR, 0x1000038C,
+ "VSR", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x100002C4,
+ "VSRAB", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000304,
+ "VSRAH", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000344,
+ "VSRAW", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000384,
+ "VSRB", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000204,
+ "VSRH", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000244,
+ "VSRO", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000044C,
+ "VSRW", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000284,
+ "VSUBCUW", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000580,
+ "VSUBFP", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x1000004A,
+ "VSUBSBS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000700,
+ "VSUBSHS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000740,
+ "VSUBSWS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000780,
+ "VSUBUBM", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000400,
+ "VSUBUBS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000600,
+ "VSUBUHM", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000440,
+ "VSUBUHS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000640,
+ "VSUBUWM", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000480,
+ "VSUBUWS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000680,
+ "VSUMSWS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000788,
+ "VSUM2SWS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000688,
+ "VSUM4SBS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000708,
+ "VSUM4SHS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000648,
+ "VSUM4UBS", "=v,v,v", 3, 2, fIsCSE | fOpTypeVR, 0x10000608,
+ "VUPKHPX", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000034E,
+ "VUPKHSB", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000020E,
+ "VUPKHSH", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000024E,
+ "VUPKLPX", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x100003CE,
+ "VUPKLSB", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x1000028E,
+ "VUPKLSH", "=v,v", 2, 2, fIsCSE | fOpTypeVR, 0x100002CE,
+ "VXOR", "=v,v,v", 3, 2, fCommutative | fIsCSE | fOpTypeVR, 0x100004C4,
+ "VMADDFP", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x1000002E,
+ "VMHADDSHS", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000020,
+ "VMHRADDSHS", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000021,
+ "VMLADDUHM", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000022,
+ "VMSUMMBM", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000025,
+ "VMSUMSHM", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000028,
+ "VMSUMSHS", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000029,
+ "VMSUMUBM", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000024,
+ "VMSUMUHM", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000026,
+ "VMSUMUHS", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x10000027,
+ "VNMSUBFP", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x1000002F,
+ "VPERM", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x1000002B,
+ "VSEL", "=v,v,v,v", 4, 2, fIsCSE | fOpTypeVR, 0x1000002A,
+ "VSLDOI", "=v,v,v,u4", 4, 2, fIsCSE | fOpTypeVR, 0x1000002C,
+ "VMR", "=v,v", 2, 2, fIsMove | fOpTypeVR, 0x10000484,
+ "VMRP", "=v,v", 2, 2, fIsMove | fOpTypeVR, 0x1000002C,
+ "SLE", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000132,
+ "SLEQ", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C0001B2,
+ "SLIQ", "=r,r,u5", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000170,
+ "SLLIQ", "=r,r,u5", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C0001F0,
+ "SLLQ", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C0001B0,
+ "SLQ", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000130,
+ "SRAIQ", "=r,r,u5", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000770,
+ "SRAQ", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000730,
+ "SRE", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000532,
+ "SREA", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000732,
+ "SREQ", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C0005B2,
+ "SRIQ", "=r,r,u5", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000570,
+ "SRLIQ", "=r,r,u5", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C0005F0,
+ "SRLQ", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C0005B0,
+ "SRQ", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000530,
+ "MASKG", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C00003A,
+ "MASKIR", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C00043A,
+ "LSCBX", "=r,(b,r)", 3, 3, fIsRead | fIsPtrOp | fSideEffects | fCanSetRecordBit, 0x7C00022A,
+ "DIV", "=r,r,r", 3, 2, fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C000296,
+ "DIVS", "=r,r,r", 3, 2, fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C0002D6,
+ "DOZ", "=r,r,r", 3, 2, fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C000210,
+ "MUL", "=r,r,r", 3, 2, fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C0000D6,
+ "NABS", "=r,r", 2, 2, fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C0003D0,
+ "ABS", "=r,r", 2, 2, fCanSetCarry | fCanSetRecordBit | fOpTypeGPR, 0x7C0002D0,
+ "CLCS", "=r,r", 2, 2, fOpTypeGPR, 0x7C000426,
+ "DOZI", "=r,r,u5", 3, 2, fOpTypeGPR, 0x24000000,
+ "RLMI", "+r,r,r,u5,u5", 5, 2, fCanSetRecordBit | fOpTypeGPR, 0x58000000,
+ "RRIB", "=r,r,r", 3, 2, fCanSetRecordBit | fOpTypeGPR, 0x7C000432,
+ "PENTRY", "", 0, 0, 0, 0x00000000,
+ "PEXIT", "", 0, 0, 0, 0x00000000
+};
diff --git a/compiler_and_linker/unsorted/Operands.c b/compiler_and_linker/unsorted/Operands.c
index bdf75f9..d1e96ef 100644
--- a/compiler_and_linker/unsorted/Operands.c
+++ b/compiler_and_linker/unsorted/Operands.c
@@ -2,15 +2,17 @@
#include "compiler/CError.h"
#include "compiler/CMachine.h"
#include "compiler/CParser.h"
+#include "compiler/CodeGen.h"
+#include "compiler/CompilerTools.h"
#include "compiler/PCode.h"
#include "compiler/PCodeInfo.h"
#include "compiler/PCodeUtilities.h"
+#include "compiler/RegisterInfo.h"
#include "compiler/Registers.h"
#include "compiler/StackFrame.h"
+#include "compiler/TOC.h"
#include "compiler/enode.h"
#include "compiler/objects.h"
-#include "compiler/CodeGen.h"
-#include "compiler/RegisterInfo.h"
unsigned long long uns_to_float_cc = 0x4330000000000000;
unsigned long long int_to_float_cc = 0x4330000080000000;
@@ -65,7 +67,7 @@ void indirect(Operand *op, ENode *expr) {
case OpndType_IndirectGPR_Indexed:
case OpndType_IndirectSymbol:
if (op->optype)
- Coerce_to_register(op, (Type *) &void_ptr, 0);
+ Coerce_to_register(op, TYPE(&void_ptr), 0);
case OpndType_GPR:
op->immOffset = 0;
op->object = NULL;
@@ -345,7 +347,7 @@ void coerce_to_addressable(Operand *op) {
void Coerce_to_register(Operand *op, Type *type, short output_reg) {
SInt32 offset;
- short opcode;
+ Opcode opcode;
short reg;
short tmp;
short cond_neg;
@@ -581,7 +583,7 @@ void coerce_to_register_pair(Operand *op, Type *type, short output_reg, short ou
}
}
-void Coerce_to_fp_register(Operand *op, TypeIntegral *tint, short output_reg) {
+void Coerce_to_fp_register(Operand *op, Type *type, short output_reg) {
short reg;
coerce_to_addressable(op);
@@ -592,12 +594,12 @@ void Coerce_to_fp_register(Operand *op, TypeIntegral *tint, short output_reg) {
break;
case OpndType_IndirectGPR_ImmOffset:
reg = output_reg ? output_reg : used_virtual_registers[RegClass_FPR]++;
- load_store_register((tint->size == 4) ? PC_LFS : PC_LFD, reg, op->reg, op->object, op->immOffset);
+ load_store_register((type->size == 4) ? PC_LFS : PC_LFD, reg, op->reg, op->object, op->immOffset);
setpcodeflags(op->flags);
break;
case OpndType_IndirectGPR_Indexed:
reg = output_reg ? output_reg : used_virtual_registers[RegClass_FPR]++;
- emitpcode((tint->size == 4) ? PC_LFSX : PC_LFDX, reg, op->reg, op->regOffset, 0, 0x390);
+ emitpcode((type->size == 4) ? PC_LFSX : PC_LFDX, reg, op->reg, op->regOffset, 0, 0x390);
setpcodeflags(op->flags);
break;
default:
@@ -608,7 +610,7 @@ void Coerce_to_fp_register(Operand *op, TypeIntegral *tint, short output_reg) {
op->reg = reg;
}
-void Coerce_to_v_register(Operand *op, TypeStruct *tstruct, short output_reg) {
+void Coerce_to_v_register(Operand *op, Type *type, short output_reg) {
short reg;
coerce_to_addressable(op);
@@ -629,7 +631,7 @@ void Coerce_to_v_register(Operand *op, TypeStruct *tstruct, short output_reg) {
break;
case OpndType_Absolute:
reg = output_reg ? output_reg : used_virtual_registers[RegClass_VR]++;
- switch (tstruct->stype) {
+ switch (TYPE_STRUCT(type)->stype) {
case STRUCT_TYPE_4:
case STRUCT_TYPE_5:
case STRUCT_TYPE_6:
@@ -663,7 +665,7 @@ void Coerce_to_v_register(Operand *op, TypeStruct *tstruct, short output_reg) {
}
void store(short reg, Operand *op, Type *type) {
- short opcode;
+ Opcode opcode;
coerce_to_addressable(op);
switch (op->optype) {
@@ -732,15 +734,15 @@ void store_pair(short reg, short regHi, Operand *op, Type *type) {
}
}
-void store_fp(short reg, Operand *op, Type *tint) {
+void store_fp(short reg, Operand *op, Type *type) {
coerce_to_addressable(op);
switch (op->optype) {
case OpndType_IndirectGPR_ImmOffset:
- load_store_register((tint->size == 4) ? PC_STFS : PC_STFD, reg, op->reg, op->object, op->immOffset);
+ load_store_register((type->size == 4) ? PC_STFS : PC_STFD, reg, op->reg, op->object, op->immOffset);
setpcodeflags(op->flags);
break;
case OpndType_IndirectGPR_Indexed:
- emitpcode((tint->size == 4) ? PC_STFSX : PC_STFDX, reg, op->reg, op->regOffset);
+ emitpcode((type->size == 4) ? PC_STFSX : PC_STFDX, reg, op->reg, op->regOffset);
setpcodeflags(op->flags);
break;
default:
@@ -855,26 +857,56 @@ void extend64(Operand *op, Type *type, short output_reg, short output_regHi) {
op->regHi = regHi;
}
-void load_floating_constant(short reg, Type *type, double *data) {
- // do me AFTER
+void load_floating_constant(short reg, Type *type, Float *data) {
+ Object *object;
+ Object *indObject;
+ Operand op1;
+ Operand op2;
+ Operand op3;
+ SInt32 offset = 0;
+
+ memclrw(&op1, sizeof(Operand));
+
+ object = CreateFloatConst(type, data, &offset);
+ indObject = createIndirect(object, 0, 1);
+
+ if (indObject) {
+ symbol_operand(&op1, indObject);
+ indirect(&op1, NULL);
+ } else {
+ symbol_operand(&op1, object);
+ }
+
+ if (offset) {
+ op2 = op1;
+ memclrw(&op3, sizeof(Operand));
+ op3.optype = OpndType_Absolute;
+ op3.immediate = offset;
+ if (op2.optype != OpndType_GPR)
+ Coerce_to_register(&op2, TYPE(&void_ptr), 0);
+ combine(&op2, &op3, 0, &op1);
+ }
+
+ indirect(&op1, NULL);
+ if (op1.optype != OpndType_FPR)
+ Coerce_to_fp_register(&op1, type, reg);
}
void convert_integer_to_floating(Operand *op, Boolean is_single, short output_reg) {
- // issue with matching the PC_FSUB/PC_FSUBS ternary
Operand temp_op;
- double d;
+ Float d;
int const_reg;
int tmp_reg;
int work_reg;
int result_reg;
- short opcode;
+ Opcode opcode;
- symbol_operand(&temp_op, maketemporary((Type *) &stdouble));
+ symbol_operand(&temp_op, maketemporary(TYPE(&stdouble)));
coerce_to_addressable(&temp_op);
- d = *((double *) &int_to_float_cc);
+ d.value = *((double *) &int_to_float_cc);
const_reg = used_virtual_registers[RegClass_FPR]++;
- load_floating_constant(const_reg, &stdouble, &d);
+ load_floating_constant(const_reg, TYPE(&stdouble), &d);
tmp_reg = used_virtual_registers[RegClass_GPR]++;
emitpcode(PC_XORIS, tmp_reg, op->reg, 0x8000);
@@ -886,10 +918,6 @@ void convert_integer_to_floating(Operand *op, Boolean is_single, short output_re
load_store_register(PC_LFD, work_reg = used_virtual_registers[RegClass_FPR]++, temp_op.reg, temp_op.object, 0);
result_reg = output_reg ? output_reg : used_virtual_registers[RegClass_FPR]++;
- //opcode = PC_FSUB;
- //if (is_single)
- // opcode = PC_FSUBS;
- //opcode = (is_single != 0) ? PC_FSUBS : PC_FSUB;
if (is_single != 0)
opcode = PC_FSUBS;
else
@@ -901,21 +929,20 @@ void convert_integer_to_floating(Operand *op, Boolean is_single, short output_re
}
void convert_unsigned_to_floating(Operand *op, Boolean is_single, short output_reg) {
- // issue with matching the PC_FSUB/PC_FSUBS ternary
Operand temp_op;
- double d;
+ Float d;
int const_reg;
int tmp_reg;
int work_reg;
int result_reg;
- short opcode;
+ Opcode opcode;
- symbol_operand(&temp_op, maketemporary((Type *) &stdouble));
+ symbol_operand(&temp_op, maketemporary(TYPE(&stdouble)));
coerce_to_addressable(&temp_op);
- d = *((double *) &uns_to_float_cc);
+ d.value = *((double *) &uns_to_float_cc);
const_reg = used_virtual_registers[RegClass_FPR]++;
- load_floating_constant(const_reg, &stdouble, &d);
+ load_floating_constant(const_reg, TYPE(&stdouble), &d);
load_store_register(PC_STW, op->reg, temp_op.reg, temp_op.object, low_offset);
@@ -925,10 +952,6 @@ void convert_unsigned_to_floating(Operand *op, Boolean is_single, short output_r
load_store_register(PC_LFD, work_reg = used_virtual_registers[RegClass_FPR]++, temp_op.reg, temp_op.object, 0);
result_reg = output_reg ? output_reg : used_virtual_registers[RegClass_FPR]++;
- //opcode = PC_FSUB;
- //if (is_single)
- // opcode = PC_FSUBS;
- //opcode = (is_single != 0) ? PC_FSUBS : PC_FSUB;
if (is_single != 0)
opcode = PC_FSUBS;
else
@@ -944,7 +967,7 @@ void convert_floating_to_integer(Operand *op, short output_reg) {
int tmp_reg;
int result_reg;
- symbol_operand(&temp_op, maketemporary((Type *) &stdouble));
+ symbol_operand(&temp_op, maketemporary(TYPE(&stdouble)));
coerce_to_addressable(&temp_op);
tmp_reg = used_virtual_registers[RegClass_FPR]++;
@@ -1004,11 +1027,10 @@ void load_address(short dest_reg, Operand *op) {
coerce_to_addressable(op);
if (op->optype == OpndType_IndirectGPR_ImmOffset) {
if (!op->immOffset && !op->object) {
- if (op->reg != dest_reg) {
+ if (op->reg != dest_reg)
emitpcode(PC_MR, dest_reg, op->reg);
- }
} else {
- add_immediate(dest_reg, op->reg, op->object, op->immOffset);
+ add_immediate(dest_reg, op->reg, op->object, (SInt16) op->immOffset);
}
} else if (op->optype == OpndType_IndirectGPR_Indexed) {
emitpcode(PC_ADD, dest_reg, op->reg, op->regOffset);
diff --git a/compiler_and_linker/unsorted/PCode.c b/compiler_and_linker/unsorted/PCode.c
index c35cac4..ee5b8e0 100644
--- a/compiler_and_linker/unsorted/PCode.c
+++ b/compiler_and_linker/unsorted/PCode.c
@@ -51,7 +51,7 @@ PCode *copypcode(PCode *pcode) {
int i;
extra_arg = 0;
- if ((PCODE_FLAG_SET_F(pcode) & fPCodeFlag8000000) && !(PCODE_FLAG_SET_F(pcode) & fPCodeFlag20000000))
+ if ((PCODE_FLAG_SET_F(pcode) & fCanSetRecordBit) && !(PCODE_FLAG_SET_F(pcode) & fRecordBit))
extra_arg = 1;
newpc = lalloc(sizeof(PCode) + sizeof(PCodeArg) * (pcode->argCount + extra_arg));
@@ -148,7 +148,7 @@ void deleteblock(PCodeBlock *block) {
block->prevBlock->nextBlock = block->nextBlock;
if (block->nextBlock)
block->nextBlock->prevBlock = block->prevBlock;
- block->flags |= fPCBlockFlag20;
+ block->flags |= fDeleted;
}
void deleteunreachableblocks(void) {
@@ -157,7 +157,7 @@ void deleteunreachableblocks(void) {
computedepthfirstordering();
for (block = pcbasicblocks->nextBlock; block; block = block->nextBlock) {
- if (!(block->flags & fPCBlockFlag4))
+ if (!(block->flags & fVisited))
deleteblock(block);
}
}
@@ -193,7 +193,7 @@ void deletepcode(PCode *pcode) {
pcode->block = 0;
block->pcodeCount--;
- block->flags &= ~fPCBlockFlag8;
+ block->flags &= ~fScheduled;
}
void insertpcodebefore(PCode *anchor, PCode *newpcode) {
@@ -211,7 +211,7 @@ void insertpcodebefore(PCode *anchor, PCode *newpcode) {
newpcode->block = block;
block->pcodeCount++;
- block->flags &= ~fPCBlockFlag8;
+ block->flags &= ~fScheduled;
}
void insertpcodeafter(PCode *anchor, PCode *newpcode) {
@@ -229,13 +229,13 @@ void insertpcodeafter(PCode *anchor, PCode *newpcode) {
newpcode->block = block;
block->pcodeCount++;
- block->flags &= ~fPCBlockFlag8;
+ block->flags &= ~fScheduled;
}
void setpcodeflags(int flags) {
pclastblock->lastPCode->flags |= flags;
if (flags & fSideEffects)
- pclastblock->lastPCode->flags &= ~(fIsCSE | fCommutative | fPCodeFlag10);
+ pclastblock->lastPCode->flags &= ~(fIsCSE | fCommutative | fIsMove);
}
void clearpcodeflags(int flags) {
@@ -273,11 +273,11 @@ void computedepthfirstordering(void) {
depthfirstorder = pcblockcount;
for (block = pcbasicblocks; block; block = block->nextBlock) {
- block->flags &= ~fPCBlockFlag4;
+ block->flags &= ~fVisited;
}
dfo = (DFO *) oalloc(sizeof(DFO) * pcblockcount);
- pcbasicblocks->flags |= fPCBlockFlag4;
+ pcbasicblocks->flags |= fVisited;
dfo->block = pcbasicblocks;
dfo->link = pcbasicblocks->successors;
@@ -286,8 +286,8 @@ void computedepthfirstordering(void) {
if ((link = dfo[index - 1].link)) {
dfo[index - 1].link = link->nextLink;
block = link->block;
- if (!(block->flags & fPCBlockFlag4)) {
- block->flags |= fPCBlockFlag4;
+ if (!(block->flags & fVisited)) {
+ block->flags |= fVisited;
dfo[index].block = block;
dfo[index].link = block->successors;
index++;
diff --git a/compiler_and_linker/unsorted/PCodeAssembly.c b/compiler_and_linker/unsorted/PCodeAssembly.c
index 922e9cf..2c87ce3 100644
--- a/compiler_and_linker/unsorted/PCodeAssembly.c
+++ b/compiler_and_linker/unsorted/PCodeAssembly.c
@@ -361,7 +361,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 16;
bits |= instr->args[2].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -403,7 +403,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[1].data.reg.reg << 16;
if (PCODE_FLAG_SET_F(instr) & fOverflow)
bits |= 0x400;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -459,7 +459,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 16;
bits |= instr->args[1].data.reg.reg << 21;
bits |= instr->args[2].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -468,7 +468,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
case PC_CNTLZW:
bits |= instr->args[0].data.reg.reg << 16;
bits |= instr->args[1].data.reg.reg << 21;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -476,7 +476,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 16;
bits |= instr->args[1].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -484,7 +484,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 16;
bits |= instr->args[1].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -492,7 +492,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 16;
bits |= instr->args[1].data.reg.reg << 21;
bits |= (instr->args[2].data.imm.value & 31) << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -503,7 +503,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= (instr->args[2].data.imm.value & 31) << 11;
bits |= (instr->args[3].data.imm.value & 31) << 6;
bits |= (instr->args[4].data.imm.value & 31) << 1;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -513,7 +513,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[2].data.reg.reg << 11;
bits |= (instr->args[3].data.imm.value & 31) << 6;
bits |= (instr->args[4].data.imm.value & 31) << 1;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -545,7 +545,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
case PC_MFFS:
bits |= instr->args[0].data.reg.reg << 21;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -557,7 +557,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
case PC_MTFSF:
bits |= (instr->args[0].data.imm.value & 0xFF) << 17;
bits |= instr->args[1].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -572,7 +572,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
case PC_FCTIWZ:
bits |= instr->args[0].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -585,7 +585,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 16;
bits |= instr->args[2].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -604,7 +604,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 16;
bits |= instr->args[2].data.reg.reg << 6;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -714,14 +714,14 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
case PC_MTFSB0:
case PC_MTFSB1:
bits |= (instr->args[0].data.imm.value & 31) << 21;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
case PC_MTFSFI:
bits |= instr->args[0].data.reg.reg << 23;
bits |= (instr->args[1].data.imm.value & 15) << 12;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -729,7 +729,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
case PC_FSQRTS:
bits |= instr->args[0].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -761,7 +761,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[1].data.reg.reg << 21;
bits |= instr->args[0].data.reg.reg << 16;
bits |= instr->args[2].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -769,7 +769,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 16;
bits |= instr->args[2].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -782,7 +782,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[2].data.reg.reg << 11;
if (PCODE_FLAG_SET_F(instr) & fOverflow)
bits |= 0x400;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -792,14 +792,14 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[1].data.reg.reg << 16;
if (PCODE_FLAG_SET_F(instr) & fOverflow)
bits |= 0x400;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
case PC_CLCS:
bits |= instr->args[0].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 16;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -815,7 +815,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[2].data.reg.reg << 11;
bits |= (instr->args[3].data.imm.value & 31) << 6;
bits |= (instr->args[4].data.imm.value & 31) << 1;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -833,7 +833,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[1].data.reg.reg << 21;
bits |= instr->args[0].data.reg.reg << 16;
bits |= instr->args[2].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -845,7 +845,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[1].data.reg.reg << 21;
bits |= instr->args[0].data.reg.reg << 16;
bits |= (instr->args[2].data.imm.value & 31) << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 1;
break;
@@ -1048,7 +1048,7 @@ UInt32 assemblepcode(PCode *instr, UInt32 offset, WeirdOperand *wop) {
bits |= instr->args[0].data.reg.reg << 21;
bits |= instr->args[1].data.reg.reg << 16;
bits |= instr->args[2].data.reg.reg << 11;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
bits |= 0x400;
break;
@@ -1172,13 +1172,13 @@ static void insertlongbranches(SInt32 mask) {
block->codeOffset = i;
if (block->pcodeCount) {
i += block->pcodeCount * 4;
- if (block->pcodeCount && (block->lastPCode->flags & fPCodeFlag1))
+ if (block->pcodeCount && (block->lastPCode->flags & fIsBranch))
i += 4;
}
}
for (block = pcbasicblocks; block; block = block->nextBlock) {
- if (block->pcodeCount && (block->lastPCode->flags & fPCodeFlag1)) {
+ if (block->pcodeCount && (block->lastPCode->flags & fIsBranch)) {
switch (block->lastPCode->op) {
case PC_BT:
case PC_BF:
@@ -1313,7 +1313,7 @@ SInt32 optimizefinalbranches(SInt32 codesize) {
continue;
instr = block->lastPCode;
- if (!(instr->flags & fPCodeFlag1))
+ if (!(instr->flags & fIsBranch))
continue;
offset = block->codeOffset + (block->pcodeCount - 1) * 4;
diff --git a/compiler_and_linker/unsorted/PCodeInfo.c b/compiler_and_linker/unsorted/PCodeInfo.c
index c93176c..b11288b 100644
--- a/compiler_and_linker/unsorted/PCodeInfo.c
+++ b/compiler_and_linker/unsorted/PCodeInfo.c
@@ -126,10 +126,10 @@ PCode *vformatpcode(short opcode, va_list argList) {
int tmp;
int tmp2; // r19
int i;
- int thing;
- int thing2;
- int thing3;
- int thing4;
+ SInt32 thing;
+ SInt32 thing2;
+ SInt32 thing3;
+ SInt32 thing4;
Object *obj;
PCodeLabel *label;
char c;
@@ -146,7 +146,7 @@ PCode *vformatpcode(short opcode, va_list argList) {
format++;
}
- if (info->flags & fPCodeFlag8000000)
+ if (info->flags & fCanSetRecordBit)
unkreg_r22 = 1;
if ((argcount + unkreg_r22) < 5)
@@ -474,7 +474,7 @@ PCode *vformatpcode(short opcode, va_list argList) {
arg->data.mem.obj = obj;
arg->data.mem.offset = va_arg(argList, SInt32);
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000)) {
+ if (pcode->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000)) {
pcode->alias = make_alias(obj, arg->data.mem.offset, nbytes_loaded_or_stored_by(pcode));
if (is_volatile_object(obj))
pcode->flags |= fIsVolatile;
@@ -486,7 +486,7 @@ PCode *vformatpcode(short opcode, va_list argList) {
pcode->alias = make_alias(obj, arg->data.mem.offset, 1);
}
CError_ASSERT(536, obj->datatype == DLOCAL || arg->data.mem.offset == 0);
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag4)) {
+ if (pcode->flags & (fIsRead | fIsWrite)) {
//if ((obj->type->type == TYPEPOINTER || obj->type->type == TYPEARRAY) ? (TYPE_POINTER(obj->type)->qual & Q_VOLATILE) : (obj->qual & Q_VOLATILE))
if (OBJ_GET_TARGET_VOLATILE(obj))
pcode->flags |= fIsVolatile;
@@ -495,7 +495,7 @@ PCode *vformatpcode(short opcode, va_list argList) {
pcode->flags |= fIsConst;
}
- if (pcode->flags & (fPCodeFlag1 | fPCodeFlag8)) {
+ if (pcode->flags & (fIsBranch | fIsCall)) {
arg->arg = RefType_4;
} else if (obj->datatype == DLOCAL) {
if (!local_is_16bit_offset(obj))
@@ -510,8 +510,8 @@ PCode *vformatpcode(short opcode, va_list argList) {
arg->kind = PCOp_IMMEDIATE;
arg->data.imm.value = va_arg(argList, SInt32);
arg->data.imm.obj = NULL;
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag4))
- pcode->flags |= fPCodeFlag20;
+ if (pcode->flags & (fIsRead | fIsWrite))
+ pcode->flags |= fIsPtrOp;
}
break;
@@ -530,7 +530,7 @@ PCode *vformatpcode(short opcode, va_list argList) {
arg->data.mem.offset = va_arg(argList, SInt32);
CError_ASSERT(590, obj->datatype == DLOCAL || arg->data.mem.offset == 0);
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag4)) {
+ if (pcode->flags & (fIsRead | fIsWrite)) {
//if ((obj->type->type == TYPEPOINTER || obj->type->type == TYPEARRAY) ? (TYPE_POINTER(obj->type)->qual & Q_VOLATILE) : (obj->qual & Q_VOLATILE))
if (OBJ_GET_TARGET_VOLATILE(obj))
pcode->flags |= fIsVolatile;
@@ -549,8 +549,8 @@ PCode *vformatpcode(short opcode, va_list argList) {
arg->kind = PCOp_IMMEDIATE;
arg->data.imm.value = va_arg(argList, SInt32);
arg->data.imm.obj = NULL;
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag4))
- pcode->flags |= fPCodeFlag20;
+ if (pcode->flags & (fIsRead | fIsWrite))
+ pcode->flags |= fIsPtrOp;
}
break;
@@ -800,9 +800,9 @@ void formatoperands(PCode *pcode, char *buf, int showBasicBlocks) {
int i;
int tmp;
int tmp2;
- int thing;
- int thing2;
- int thing4;
+ SInt32 thing;
+ SInt32 thing2;
+ SInt32 thing4;
char c;
int flagSetT;
int flagSetF;
@@ -1048,7 +1048,7 @@ void formatoperands(PCode *pcode, char *buf, int showBasicBlocks) {
buf += expectandformatoperand(pa, PCOp_MEMORY, 0, -1, buf);
else if (pa->kind == PCOp_LABELDIFF)
buf += expectandformatoperand(pa, PCOp_LABELDIFF, 0, -1, buf);
- else if ((pcode->flags & (fPCodeFlag1 | fPCodeFlag8)) && (pa->kind == PCOp_LABEL))
+ else if ((pcode->flags & (fIsBranch | fIsCall)) && (pa->kind == PCOp_LABEL))
buf += expectandformatoperand(pa, PCOp_LABEL, 0, -1, buf);
else
buf += expectandformatoperand(pa, PCOp_IMMEDIATE, 0, -1, buf);
@@ -1122,6 +1122,7 @@ void formatoperands(PCode *pcode, char *buf, int showBasicBlocks) {
if (pcode->flags & fCommutative)
buf += sprintf(buf, "; fCommutative");
+ // i think these are the wrong way round lol
if (flagSetT & fIsPtrOp)
buf += sprintf(buf, "; fIsPtrOp");
@@ -1158,7 +1159,7 @@ int can_reuse_stored_value(PCode *a, PCode *b) {
int nbytes_loaded_or_stored_by(PCode *pcode) {
OpcodeInfo *oinfo = opcodeinfo + pcode->op;
- if (oinfo->flags & (fPCodeFlag2 | fPCodeFlag4)) {
+ if (oinfo->flags & (fIsRead | fIsWrite)) {
switch (pcode->op) {
case PC_LBZ:
case PC_LBZU:
@@ -1265,7 +1266,7 @@ void change_num_operands(PCode *pcode, int newNum) {
void change_opcode(PCode *pcode, short opcode) {
pcode->flags = (pcode->flags & ~(opcodeinfo[pcode->op].flags & ~fIsPtrOp)) | opcodeinfo[opcode].flags;
- if ((pcode->flags & fPCodeFlag10) && (PCODE_FLAG_SET_F(pcode) & fPCodeFlag20000000))
- pcode->flags &= ~fPCodeFlag10;
+ if ((pcode->flags & fIsMove) && (PCODE_FLAG_SET_F(pcode) & fRecordBit))
+ pcode->flags &= ~fIsMove;
pcode->op = opcode;
}
diff --git a/compiler_and_linker/unsorted/PCodeListing.c b/compiler_and_linker/unsorted/PCodeListing.c
index c95400d..ffaec79 100644
--- a/compiler_and_linker/unsorted/PCodeListing.c
+++ b/compiler_and_linker/unsorted/PCodeListing.c
@@ -55,7 +55,7 @@ static void pclistblock(PCodeBlock *block, char *format, UInt32 vecSize) {
UInt32 opcode;
MachineInfo *mi;
char buf[500];
- PCodeArg dummyArg;
+ WeirdOperand dummyArg;
fprintf(pcfile, ":{%4.4x}::::::::::::::::::::::::::::::::::::::::LOOPWEIGHT=%ld\n", block->flags, block->loopWeight);
fprintf(pcfile, "B%ld: ", block->blockIndex);
@@ -107,7 +107,7 @@ static void pclistblock(PCodeBlock *block, char *format, UInt32 vecSize) {
for (offset = block->codeOffset, instr = block->firstPCode; instr; instr = instr->nextPCode, offset += 4) {
latency = mi->latency(instr);
formatoperands(instr, buf, 1);
- chr = (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) ? '.' : ' ';
+ chr = (PCODE_FLAG_SET_F(instr) & fRecordBit) ? '.' : ' ';
if (coloring)
opcode = 0;
else
@@ -145,7 +145,7 @@ static void pclistonoff(int flag) {
fprintf(pcfile, "Off\n");
}
-void pcinitlisting(void) {
+void pcinitlisting() {
// unknown args, etc
}
@@ -155,58 +155,58 @@ void pccleanuplisting(void) {
void pclistblocks(char *name1, char *name2) {
}
-void pclistdataflow(void) {
+void pclistdataflow() {
// unknown args
}
void pclistinterferences(char *class_format, int regcount) {
}
-void pclistspill(void) {
+void pclistspill() {
// unknown args
}
-void pclistcopypropitem(void) {
+void pclistcopypropitem() {
// unknown args
}
-void pclistcoalesce(void) {
+void pclistcoalesce() {
// unknown args
}
-void pclistusedefs(void) {
+void pclistusedefs() {
// unknown args
}
-void pclistpropinfo(void) {
+void pclistpropinfo() {
// unknown args
}
-static void listloop(void) {
+static void listloop() {
// unknown args
}
-static void listloops(void) {
+static void listloops() {
// unknown args
}
-void pclistloops(void) {
+void pclistloops() {
// unknown args
}
-static void listswitchtables(void) {
+static void listswitchtables() {
// unknown args
}
-void pclistswitchtables(void) {
+void pclistswitchtables() {
// unknown args
}
-void pclistdominators(void) {
+void pclistdominators() {
// unknown args
}
-void pclistbackedge(void) {
+void pclistbackedge() {
// unknown args
}
@@ -264,15 +264,15 @@ static char *GetInterferenceFlags(IGNode *node) {
return buf;
}
-void pclistinterferencegraphnode(void) {
+void pclistinterferencegraphnode() {
// unknown args
}
-void pclistinterferencegraph(void) {
+void pclistinterferencegraph() {
// unknown args
}
-void pclistblock_scheduler(void) {
+void pclistblock_scheduler() {
// unknown args
}
@@ -284,15 +284,15 @@ void pclistblocks_end_scheduler(void) {
CError_FATAL(1318);
}
-static void printheapsize(void) {
+static void printheapsize() {
// unknown args
}
-void pctotalheap(void) {
+void pctotalheap() {
// unknown args
}
-void pctotalmemory(void) {
+void pctotalmemory() {
// unknown args
}
@@ -468,7 +468,7 @@ int dumpalias(Alias *alias, int len, Boolean flag1, Boolean flag2) {
}
}
-void pcformatset(void) {
+void pcformatset() {
// unknown args
}
@@ -506,11 +506,11 @@ int GetLineOffset(char *str, int lineNum, int len) {
return 0;
}
-void DumpSourceCode(void) {
+void DumpSourceCode() {
// unknown args
}
-int DumpIR_SrcBreak(void) {
+int DumpIR_SrcBreak() {
// unknown args
return 0;
}
diff --git a/compiler_and_linker/unsorted/PCodeUtilities.c b/compiler_and_linker/unsorted/PCodeUtilities.c
index 89c4c1f..b1f8ffb 100644
--- a/compiler_and_linker/unsorted/PCodeUtilities.c
+++ b/compiler_and_linker/unsorted/PCodeUtilities.c
@@ -1,6 +1,9 @@
#include "compiler/PCodeUtilities.h"
#include "compiler/CError.h"
+#include "compiler/CFunc.h"
#include "compiler/CParser.h"
+#include "compiler/CodeGen.h"
+#include "compiler/Exceptions.h"
#include "compiler/PCode.h"
#include "compiler/PCodeInfo.h"
#include "compiler/Registers.h"
@@ -13,20 +16,20 @@ void pcsetrecordbit(PCode *pc) {
short argCount;
int argIdx;
- pc->flags &= ~(fPCodeFlag10 | fCommutative | fIsCSE);
- if ((pc->flags & (fPCodeFlag80000000 | fPCodeFlag40000000)) == fPCodeFlag40000000) {
+ pc->flags &= ~(fIsMove | fCommutative | fIsCSE);
+ if ((pc->flags & fOpTypeMask) == fOpTypeFPR) {
reg = 1;
- } else if ((pc->flags & (fPCodeFlag80000000 | fPCodeFlag40000000)) == (fPCodeFlag80000000 | fPCodeFlag40000000)) {
+ } else if ((pc->flags & fOpTypeMask) == fOpTypeVR) {
reg = 6;
} else {
reg = 0;
}
if (pc->op == PC_ANDI || pc->op == PC_ANDIS) {
- pc->flags |= fPCodeFlag20000000;
+ pc->flags |= fRecordBit;
} else if (pc->op == PC_ADDI || pc->op == PC_ADDIC) {
- pc->flags |= fPCodeFlag10000000;
- pc->flags |= fPCodeFlag20000000;
+ pc->flags |= fSetsCarry;
+ pc->flags |= fRecordBit;
change_num_operands(pc, 5);
pc->op = PC_ADDICR;
@@ -46,7 +49,7 @@ void pcsetrecordbit(PCode *pc) {
while (arg->kind != PCOp_PLACEHOLDEROPERAND && argIdx) {
if (arg->kind == PCOp_REGISTER && arg->arg == RegClass_CRFIELD && arg->data.reg.reg == reg) {
arg->data.reg.effect |= EffectWrite;
- pc->flags |= fPCodeFlag20000000;
+ pc->flags |= fRecordBit;
return;
}
arg++;
@@ -64,12 +67,12 @@ void pcsetrecordbit(PCode *pc) {
arg->data.reg.reg = reg;
arg->data.reg.effect = EffectWrite;
if (pc->op != PC_ADDICR)
- pc->flags |= fPCodeFlag20000000;
+ pc->flags |= fRecordBit;
}
}
void pcsetsideeffects(PCode *pc) {
- pc->flags &= ~(fPCodeFlag10 | fCommutative | fIsCSE);
+ pc->flags &= ~(fIsMove | fCommutative | fIsCSE);
pc->flags |= fSideEffects;
}
@@ -107,9 +110,9 @@ void pcsetlinkbit(PCode *pc) {
arg->data.reg.reg = 1;
arg->data.reg.effect = EffectWrite;
- if (opcodeinfo[pc->op].flags & fPCodeFlag8) {
- pc->flags &= ~fPCodeFlag1;
- pc->flags |= fPCodeFlag8;
+ if (opcodeinfo[pc->op].flags & fIsCall) {
+ pc->flags &= ~fIsBranch;
+ pc->flags |= fIsCall;
}
pc->flags |= fLink;
}
diff --git a/compiler_and_linker/unsorted/Peephole.c b/compiler_and_linker/unsorted/Peephole.c
index 3779d39..0480c80 100644
--- a/compiler_and_linker/unsorted/Peephole.c
+++ b/compiler_and_linker/unsorted/Peephole.c
@@ -188,9 +188,9 @@ static int dead(PCode *instr, UInt32 *masks) {
int i;
PCodeArg *op;
- if (instr->block->flags & (fPCBlockFlag1 | fPCBlockFlag2))
+ if (instr->block->flags & (fIsProlog | fIsEpilogue))
return 0;
- if (instr->flags & (fPCodeFlag1 | fPCodeFlag4 | fPCodeFlag8 | fIsVolatile | fSideEffects))
+ if (instr->flags & (fIsBranch | fIsWrite | fIsCall | fIsVolatile | fSideEffects))
return 0;
if (!instr->block->predecessors)
return 1;
@@ -354,10 +354,10 @@ static int canuseupdatetest(PCodeBlock *block, PCode *instr, int count1, int cou
return 1;
}
- if (instr->flags & (fPCodeFlag2 | fPCodeFlag4)) {
+ if (instr->flags & (fIsRead | fIsWrite)) {
if (++count4 > 1)
return 1;
- } else if (instr->flags & fPCodeFlag1) {
+ } else if (instr->flags & fIsBranch) {
if (++count2 > 2)
return 1;
@@ -389,7 +389,7 @@ static int canuseupdate(PCode *instr) {
static int MR_Rx_Rx(PCode *instr, UInt32 *masks) {
if (
instr->args[0].data.reg.reg == instr->args[1].data.reg.reg &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit)
)
{
deletepcode(instr);
@@ -402,7 +402,7 @@ static int MR_Rx_Rx(PCode *instr, UInt32 *masks) {
static int FMR_Fx_Fx(PCode *instr, UInt32 *masks) {
if (
instr->args[0].data.reg.reg == instr->args[1].data.reg.reg &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit)
)
{
deletepcode(instr);
@@ -415,7 +415,7 @@ static int FMR_Fx_Fx(PCode *instr, UInt32 *masks) {
static int VMR_Vx_Vx(PCode *instr, UInt32 *masks) {
if (
instr->args[0].data.reg.reg == instr->args[1].data.reg.reg &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit)
)
{
deletepcode(instr);
@@ -432,7 +432,7 @@ static int MR_MR(PCode *instr, UInt32 *masks) {
defInstr->op == PC_MR &&
instr->args[0].data.reg.reg == defInstr->args[1].data.reg.reg &&
!definedbetween(instr, defInstr, &instr->args[0]) &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit)
)
{
deletepcode(instr);
@@ -448,7 +448,7 @@ static int FMR_FMR(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_FMR &&
instr->args[0].data.reg.reg == defInstr->args[1].data.reg.reg &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
!definedbetween(instr, defInstr, &instr->args[0])
)
{
@@ -465,7 +465,7 @@ static int VMR_VMR(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_VMR &&
instr->args[0].data.reg.reg == defInstr->args[1].data.reg.reg &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
!definedbetween(instr, defInstr, &instr->args[0])
)
{
@@ -485,11 +485,11 @@ static int VMR_VMRP(PCode *instr, UInt32 *masks) {
int nextPermute = 0;
if (prev) {
- prevFlag = (prev->flags & fPCodeFlagC0000000) == fPCodeFlagC0000000;
+ prevFlag = (prev->flags & fOpTypeMask) == fOpTypeVR;
prevPermute = uses_vpermute_unit(prev);
}
if (next) {
- nextFlag = (next->flags & fPCodeFlagC0000000) == fPCodeFlagC0000000;
+ nextFlag = (next->flags & fOpTypeMask) == fOpTypeVR;
nextPermute = uses_vpermute_unit(next);
}
@@ -529,7 +529,7 @@ static int MR_CMPI(PCode *instr, UInt32 *masks) {
if (
instr->args[0].data.reg.reg == 0 &&
instr->args[2].data.imm.value == 0 &&
- (PCODE_FLAG_SET_F(defInstr) & (fSideEffects | fPCodeFlag8000000 | fPCodeFlag80000000)) == (fPCodeFlag8000000 | fPCodeFlag80000000) &&
+ (PCODE_FLAG_SET_F(defInstr) & (fSideEffects | fCanSetRecordBit | fOpTypeGPR)) == (fCanSetRecordBit | fOpTypeGPR) &&
!usedbetween(instr, defInstr, &instr->args[0]) &&
!definedbetween(instr, defInstr, &instr->args[0])
)
@@ -557,7 +557,7 @@ static int EXTSB_RLWINM(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_EXTSB &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!definedbetween(instr, defInstr, &defInstr->args[1]) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
(extractedbits(instr) & 0xFFFFFF00) == 0
@@ -578,7 +578,7 @@ static int EXTSH_RLWINM(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_EXTSH &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!definedbetween(instr, defInstr, &defInstr->args[1]) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
(extractedbits(instr) & 0xFFFF0000) == 0
@@ -601,7 +601,7 @@ static int LBZ_RLWINM(PCode *instr, UInt32 *masks) {
instr->args[2].data.imm.value == 0 &&
instr->args[3].data.imm.value <= 24 &&
instr->args[4].data.imm.value == 31 &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
!definedbetween(instr, defInstr, &instr->args[0]) &&
@@ -624,7 +624,7 @@ static int LHZ_RLWINM(PCode *instr, UInt32 *masks) {
instr->args[2].data.imm.value == 0 &&
instr->args[3].data.imm.value <= 16 &&
instr->args[4].data.imm.value == 31 &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
!definedbetween(instr, defInstr, &instr->args[0]) &&
@@ -644,7 +644,7 @@ static int LHA_EXTSH(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_LHA &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
!definedbetween(instr, defInstr, &instr->args[0]) &&
@@ -658,7 +658,7 @@ static int LHA_EXTSH(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_EXTSB &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit)
)
{
if (defInstr->args[0].data.reg.reg == defInstr->args[1].data.reg.reg) {
@@ -739,7 +739,7 @@ static int ADDI_L_S(PCode *instr, UInt32 *masks) {
if (defInstr->args[2].kind == PCOp_MEMORY) {
instr->args[2] = defInstr->args[2];
instr->args[2].data.mem.offset += addright;
- if (instr->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000)) {
+ if (instr->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000)) {
instr->alias = make_alias(
instr->args[2].data.mem.obj,
instr->args[2].data.mem.offset,
@@ -768,7 +768,7 @@ static int ADDI_L_S(PCode *instr, UInt32 *masks) {
if (defInstr->args[2].kind == PCOp_MEMORY) {
instr->args[2] = defInstr->args[2];
instr->args[2].data.mem.offset += addright;
- if (instr->flags & (fPCodeFlag2 | fPCodeFlag4 | fPCodeFlag20000 | fPCodeFlag40000)) {
+ if (instr->flags & (fIsRead | fIsWrite | fPCodeFlag20000 | fPCodeFlag40000)) {
instr->alias = make_alias(
instr->args[2].data.mem.obj,
instr->args[2].data.mem.offset,
@@ -930,7 +930,7 @@ static int RLWINM_CMPLI_BC(PCode *instr, UInt32 *masks) {
if (defInstr->op == PC_CMPLI && defInstr->args[0].data.reg.reg == 0 && defInstr->args[2].data.imm.value == 0) {
defInstr2 = defininginstruction[defInstr->defID + 1];
if (
- (PCODE_FLAG_SET_F(defInstr2) & (fSideEffects | fPCodeFlag8000000 | fPCodeFlag80000000)) == (fPCodeFlag8000000 | fPCodeFlag80000000) &&
+ (PCODE_FLAG_SET_F(defInstr2) & (fSideEffects | fCanSetRecordBit | fOpTypeGPR)) == (fCanSetRecordBit | fOpTypeGPR) &&
!usedbetween(defInstr, defInstr2, &defInstr->args[0]) &&
!definedbetween(defInstr, defInstr2, &defInstr->args[0])
)
@@ -961,7 +961,7 @@ static int LBZ_EXTSB_CMPI_BC(PCode *instr, UInt32 *masks) {
||
(
(defInstr->op == PC_EXTSB || defInstr->op == PC_EXTSH) &&
- (PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000)
+ (PCODE_FLAG_SET_F(defInstr) & fRecordBit)
)
)
{
@@ -992,7 +992,7 @@ static int FRSP_STFS(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_FRSP &&
!(masks[RegClass_FPR] & (1 << defInstr->args[0].data.reg.reg)) &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!definedbetween(instr, defInstr, &defInstr->args[1]) &&
!usedbetween(instr, defInstr, &defInstr->args[0])
)
@@ -1012,7 +1012,7 @@ static int NOT_AND(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_NOT &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!definedbetween(instr, defInstr, &defInstr->args[1]) &&
!usedbetween(instr, defInstr, &defInstr->args[0])
)
@@ -1033,7 +1033,7 @@ static int LI_MR(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_LI &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
!usedbetween(instr, defInstr, &defInstr->args[0])
)
{
@@ -1054,7 +1054,7 @@ static int VSPLTIS_VMR(PCode *instr, UInt32 *masks) {
if (
(opcode == PC_VSPLTISB || opcode == PC_VSPLTISH || opcode == PC_VSPLTISW) &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_VR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
!usedbetween(instr, defInstr, &defInstr->args[0])
)
{
@@ -1072,9 +1072,9 @@ static int L_MR(PCode *instr, UInt32 *masks) {
PCode *defInstr = defininginstruction[instr->defID + 1];
if (
- (defInstr->flags & fPCodeFlag2) &&
+ (defInstr->flags & fIsRead) &&
!(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg)) &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
!usedbetween(instr, defInstr, &instr->args[0]) &&
!definedbetween(instr, defInstr, &instr->args[0])
@@ -1092,9 +1092,9 @@ static int L_FMR(PCode *instr, UInt32 *masks) {
PCode *defInstr = defininginstruction[instr->defID + 1];
if (
- (defInstr->flags & fPCodeFlag2) &&
+ (defInstr->flags & fIsRead) &&
!(masks[RegClass_FPR] & (1 << defInstr->args[0].data.reg.reg)) &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
!usedbetween(instr, defInstr, &instr->args[0]) &&
!definedbetween(instr, defInstr, &instr->args[0])
@@ -1119,13 +1119,13 @@ static int L_S(PCode *instr, UInt32 *masks) {
SInt32 scanOffset;
SInt32 storeSize;
- if (PCODE_FLAG_SET_F(instr) & (fIsVolatile | fSideEffects | fPCodeFlag2000000))
+ if (PCODE_FLAG_SET_F(instr) & (fIsVolatile | fSideEffects | fUpdatesPtr))
return 0;
- if (PCODE_FLAG_SET_F(defInstr) & (fIsVolatile | fSideEffects | fPCodeFlag2000000))
+ if (PCODE_FLAG_SET_F(defInstr) & (fIsVolatile | fSideEffects | fUpdatesPtr))
return 0;
if (
- (defInstr->flags & fPCodeFlag2) &&
+ (defInstr->flags & fIsRead) &&
PC_OP_IS_REGISTER(&defInstr->args[1], RegClass_GPR, instr->args[1].data.reg.reg) &&
defInstr->args[2].kind == instr->args[2].kind &&
!definedbetween(instr, defInstr, &instr->args[1])
@@ -1231,7 +1231,7 @@ static int L_S(PCode *instr, UInt32 *masks) {
}
for (scan = instr->prevPCode; scan && scan != defInstr; scan = scan->prevPCode) {
- if (scan->flags & fPCodeFlag4) {
+ if (scan->flags & fIsWrite) {
if (scan->args[1].data.reg.reg != instr->args[1].data.reg.reg)
return 0;
if (scan->args[2].kind != defInstr->args[2].kind)
@@ -1306,7 +1306,7 @@ static int RLWINM_RLWINM(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_RLWINM &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!definedbetween(instr, defInstr, &defInstr->args[1]) &&
!(
defInstr->args[0].data.reg.reg == defInstr->args[1].data.reg.reg &&
@@ -1358,7 +1358,7 @@ static int RLWINM_RLWINM(PCode *instr, UInt32 *masks) {
if (
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!usedbetween(instr, defInstr, &defInstr->args[0])
)
deletepcode(defInstr);
@@ -1375,7 +1375,7 @@ static int MULLI_MULLI(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_MULLI &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!definedbetween(instr, defInstr, &defInstr->args[1]) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
FITS_IN_SHORT(instr->args[2].data.imm.value * defInstr->args[2].data.imm.value)
@@ -1398,7 +1398,7 @@ static int ADDI_ADDI(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_ADDI &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!definedbetween(instr, defInstr, &defInstr->args[1]) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
instr->args[2].kind == PCOp_IMMEDIATE &&
@@ -1423,7 +1423,7 @@ static int SRAWI_SRAWI(PCode *instr, UInt32 *masks) {
if (
defInstr->op == PC_SRAWI &&
(defInstr->args[0].data.reg.reg == instr->args[0].data.reg.reg || !(masks[RegClass_GPR] & (1 << defInstr->args[0].data.reg.reg))) &&
- !(PCODE_FLAG_SET_F(defInstr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(defInstr) & fRecordBit) &&
!definedbetween(instr, defInstr, &defInstr->args[1]) &&
!usedbetween(instr, defInstr, &defInstr->args[0]) &&
instr->args[2].kind == PCOp_IMMEDIATE &&
@@ -1451,12 +1451,12 @@ static int MR_ADDI(PCode *instr, UInt32 *masks) {
if (copts.cpu == CPU_PPC603e) {
if (prev)
- prevFlag = (prev->flags & fPCodeFlagC0000000) == fPCodeFlag80000000;
+ prevFlag = (prev->flags & fOpTypeMask) == fOpTypeGPR;
if (next)
- nextFlag = (next->flags & fPCodeFlagC0000000) == fPCodeFlag80000000;
+ nextFlag = (next->flags & fOpTypeMask) == fOpTypeGPR;
if (
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
instr->argCount >= 2 &&
instr->args[1].data.reg.reg != 0 &&
(prevFlag || nextFlag)
@@ -1528,7 +1528,7 @@ static int SRW_SUBFIC_RLW_OR(PCode *instr, UInt32 *masks) {
PCode *defInstr1 = defininginstruction[instr->defID + 1];
PCode *defInstr2 = defininginstruction[instr->defID + 2];
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
return 0;
if (
@@ -2151,12 +2151,12 @@ static void adjustforward(PCodeBlock *block) {
scan->args[2].data.imm.value == 0
)
{
- if (PCODE_FLAG_SET_F(scan) & fPCodeFlag20000000) {
+ if (PCODE_FLAG_SET_F(scan) & fRecordBit) {
if (!flag1) {
pcsetrecordbit(instr);
change_opcode(scan, PC_MR);
- scan->flags &= ~fPCodeFlag20000000;
- scan->flags |= fPCodeFlag10;
+ scan->flags &= ~fRecordBit;
+ scan->flags |= fIsMove;
change_num_operands(scan, 2);
} else {
change_opcode(scan, PC_MR);
@@ -2201,7 +2201,7 @@ static void adjustforward(PCodeBlock *block) {
PC_RLWINM, scan->args[0].data.reg.reg, reg1,
32 - scan->args[2].data.imm.value, start, end
));
- if (PCODE_FLAG_SET_F(scan) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(scan) & fRecordBit)
pcsetrecordbit(scan->nextPCode);
deletepcode(scan);
}
@@ -2209,8 +2209,8 @@ static void adjustforward(PCodeBlock *block) {
opcode == PC_OR &&
!flag2 &&
reg0 != reg1 &&
- !(PCODE_FLAG_SET_F(scan) & fPCodeFlag20000000) &&
- !(PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000) &&
+ !(PCODE_FLAG_SET_F(scan) & fRecordBit) &&
+ !(PCODE_FLAG_SET_F(instr) & fRecordBit) &&
scan->args[0].data.reg.reg != instr->args[1].data.reg.reg
)
{
@@ -2313,10 +2313,10 @@ static void adjustforward(PCodeBlock *block) {
)
{
change_opcode(scan, PC_MR);
- if ((PCODE_FLAG_SET_F(scan) & fPCodeFlag20000000) && !flag1) {
+ if ((PCODE_FLAG_SET_F(scan) & fRecordBit) && !flag1) {
pcsetrecordbit(instr);
- scan->flags &= ~fPCodeFlag20000000;
- scan->flags |= fPCodeFlag10;
+ scan->flags &= ~fRecordBit;
+ scan->flags |= fIsMove;
change_num_operands(scan, 2);
}
}
@@ -2329,10 +2329,10 @@ static void adjustforward(PCodeBlock *block) {
)
{
change_opcode(scan, PC_MR);
- if ((PCODE_FLAG_SET_F(scan) & fPCodeFlag20000000) && !flag1) {
+ if ((PCODE_FLAG_SET_F(scan) & fRecordBit) && !flag1) {
pcsetrecordbit(instr);
- scan->flags &= ~fPCodeFlag20000000;
- scan->flags |= fPCodeFlag10;
+ scan->flags &= ~fRecordBit;
+ scan->flags |= fIsMove;
change_num_operands(scan, 2);
}
}
@@ -2371,10 +2371,10 @@ static void adjustforward(PCodeBlock *block) {
)
{
change_opcode(scan, PC_MR);
- if ((PCODE_FLAG_SET_F(scan) & fPCodeFlag20000000) && !flag) {
+ if ((PCODE_FLAG_SET_F(scan) & fRecordBit) && !flag) {
pcsetrecordbit(instr);
- scan->flags &= ~fPCodeFlag20000000;
- scan->flags |= fPCodeFlag10;
+ scan->flags &= ~fRecordBit;
+ scan->flags |= fIsMove;
change_num_operands(scan, 2);
}
}
@@ -2410,10 +2410,10 @@ static void adjustforward(PCodeBlock *block) {
else if (scan->op == PC_EXTSH && scan->args[1].data.reg.reg == reg0)
{
change_opcode(scan, PC_MR);
- if ((PCODE_FLAG_SET_F(scan) & fPCodeFlag20000000) && !flag) {
+ if ((PCODE_FLAG_SET_F(scan) & fRecordBit) && !flag) {
pcsetrecordbit(instr);
- scan->flags &= ~fPCodeFlag20000000;
- scan->flags |= fPCodeFlag10;
+ scan->flags &= ~fRecordBit;
+ scan->flags |= fIsMove;
change_num_operands(scan, 2);
}
}
@@ -2443,11 +2443,11 @@ static void adjustforward(PCodeBlock *block) {
SInt32 val2 = instr->args[2].data.imm.value;
for (scan = instr->nextPCode; scan; scan = scan->nextPCode) {
- if ((scan->flags & fPCodeFlag4) && scan->args[0].data.reg.reg == reg0)
+ if ((scan->flags & fIsWrite) && scan->args[0].data.reg.reg == reg0)
break;
if (
- (scan->flags & (fPCodeFlag2 | fPCodeFlag4)) &&
+ (scan->flags & (fIsRead | fIsWrite)) &&
scan->args[1].data.reg.reg == reg0 &&
scan->args[2].kind == PCOp_IMMEDIATE &&
FITS_IN_SHORT(val2 + scan->args[2].data.imm.value)
@@ -2456,7 +2456,7 @@ static void adjustforward(PCodeBlock *block) {
scan->args[2].data.imm.value += val2;
tmp = instr->prevPCode;
if (
- (scan->flags & fPCodeFlag2) &&
+ (scan->flags & fIsRead) &&
scan->args[0].data.reg.reg == reg0 &&
scan->args[0].kind == PCOp_REGISTER &&
scan->args[0].arg == RegClass_GPR
@@ -2490,7 +2490,7 @@ static void adjustforward(PCodeBlock *block) {
break;
}
- if (scan->flags & (fPCodeFlag1 | fPCodeFlag8)) {
+ if (scan->flags & (fIsBranch | fIsCall)) {
if (flag1 && scan->prevPCode != instr) {
tmp = instr->prevPCode;
deletepcode(instr);
@@ -2653,14 +2653,14 @@ void peepholemergeblocks(Object *func, Boolean flag) {
next = block->nextBlock;
if (!flag) {
- flag2 = next && (next->flags & fPCBlockFlag2);
- if (block->flags & fPCBlockFlag1)
+ flag2 = next && (next->flags & fIsEpilogue);
+ if (block->flags & fIsProlog)
continue;
}
if (block->pcodeCount > 0) {
for (instr = block->firstPCode; instr; instr = instr->nextPCode) {
- if (instr->flags & (fPCodeFlag8 | fSideEffects))
+ if (instr->flags & (fIsCall | fSideEffects))
break;
}
@@ -2676,7 +2676,7 @@ void peepholemergeblocks(Object *func, Boolean flag) {
}
instr = block->lastPCode;
- if (instr && (instr->flags & fPCodeFlag1) && instr->op != PC_B)
+ if (instr && (instr->flags & fIsBranch) && instr->op != PC_B)
continue;
while (
@@ -2692,7 +2692,7 @@ void peepholemergeblocks(Object *func, Boolean flag) {
if (next->pcodeCount > 0) {
for (instr = next->firstPCode; instr; instr = nextinstr) {
nextinstr = instr->nextPCode;
- if (instr->flags & (fPCodeFlag8 | fSideEffects))
+ if (instr->flags & (fIsCall | fSideEffects))
break;
deletepcode(instr);
@@ -2727,11 +2727,11 @@ void peepholemergeblocks(Object *func, Boolean flag) {
if (block->nextBlock)
block->nextBlock->prevBlock = block;
- next->flags |= fPCBlockFlag20;
+ next->flags |= fDeleted;
next = block->nextBlock;
if (!flag)
- flag2 = next && (next->flags & fPCBlockFlag2);
+ flag2 = next && (next->flags & fIsEpilogue);
}
}
}
diff --git a/compiler_and_linker/unsorted/RegisterInfo.c b/compiler_and_linker/unsorted/RegisterInfo.c
index 91d775f..13c519d 100644
--- a/compiler_and_linker/unsorted/RegisterInfo.c
+++ b/compiler_and_linker/unsorted/RegisterInfo.c
@@ -311,7 +311,7 @@ UInt32 colored_vrs_as_vrsave(PCodeBlock *block) {
while (block) {
for (pc = block->firstPCode; pc; pc = pc->nextPCode) {
- if (pc->flags & (fPCodeFlag40000000 | fPCodeFlag80000000)) {
+ if (pc->flags & fOpTypeVR) {
for (i = 0; i < pc->argCount; i++) {
if (pc->args[i].kind == PCOp_REGISTER && pc->args[i].arg == RegClass_VR)
mask |= 1 << (31 - pc->args[i].data.reg.reg);
diff --git a/compiler_and_linker/unsorted/Scheduler.c b/compiler_and_linker/unsorted/Scheduler.c
index e3c8ac7..791ba28 100644
--- a/compiler_and_linker/unsorted/Scheduler.c
+++ b/compiler_and_linker/unsorted/Scheduler.c
@@ -170,7 +170,7 @@ static void addsuccessor(DGNode *a, DGNode *b, Boolean flag) {
a->successors = succ;
succ->x8 = r29;
- if (flag && (succ->node->instr->flags & fPCodeFlag1))
+ if (flag && (succ->node->instr->flags & fIsBranch))
succ->x8 += MI->x8;
b->predCount++;
@@ -290,9 +290,9 @@ static void findsuccessors(DGNode *nodes, DGNode *node) {
}
}
- if (instr->flags & (fPCodeFlag2 | fPCodeFlag20000))
+ if (instr->flags & (fIsRead | fPCodeFlag20000))
serialize_load(node);
- else if (instr->flags & (fPCodeFlag4 | fPCodeFlag40000))
+ else if (instr->flags & (fIsWrite | fPCodeFlag40000))
serialize_store(node);
if (instr->flags & fIsVolatile) {
@@ -301,7 +301,7 @@ static void findsuccessors(DGNode *nodes, DGNode *node) {
}
if (
- ((instr->flags & fPCodeFlag8 | fPCodeFlag1) && (instr->flags & fLink)) ||
+ ((instr->flags & fIsCall | fIsBranch) && (instr->flags & fLink)) ||
(instr->flags & fSideEffects) ||
MI->serializes(instr)
)
@@ -424,7 +424,7 @@ static void scheduleblock(PCodeBlock *block) {
for (instr = block->lastPCode; instr; instr = instr->prevPCode) {
DGNode *n = makedgnode(instr);
findsuccessors(head, n);
- if (instr->flags & fPCodeFlag1)
+ if (instr->flags & fIsBranch)
defaultsuccessor = n;
head = adddgnode(head, n);
}
@@ -492,12 +492,12 @@ void scheduleinstructions(Boolean flag) {
for (block = pcbasicblocks; block; block = block->nextBlock) {
if (
block->pcodeCount > 2 &&
- (flag || !(block->flags & (fPCBlockFlag1 | fPCBlockFlag2))) &&
- !(block->flags & fPCBlockFlag8)
+ (flag || !(block->flags & (fIsProlog | fIsEpilogue))) &&
+ !(block->flags & fScheduled)
)
{
scheduleblock(block);
- block->flags |= fPCBlockFlag8;
+ block->flags |= fScheduled;
}
}
}
diff --git a/compiler_and_linker/unsorted/SpillCode.c b/compiler_and_linker/unsorted/SpillCode.c
index bfafbac..477d391 100644
--- a/compiler_and_linker/unsorted/SpillCode.c
+++ b/compiler_and_linker/unsorted/SpillCode.c
@@ -50,7 +50,7 @@ void estimatespillcosts(void) {
while (i--) {
if (PC_OP_IS_WRITE_ANY_REGISTER(op, coloring_class)) {
node = interferencegraph[op->data.reg.reg];
- if (node->instr8 || (instr->flags & fPCodeFlag8000))
+ if (node->instr8 || (instr->flags & fIsArgInit))
node->spillCost -= weight;
else
node->spillCost += weight;
@@ -291,7 +291,7 @@ static void spillinstruction(PCodeBlock *block, PCode *instr) {
}
if (writeCounter) {
- if (node->instr8 || (instr->flags & fPCodeFlag8000))
+ if (node->instr8 || (instr->flags & fIsArgInit))
flag = 1;
else
insert_store_spilled_register(instr, 0, reg2, node);
@@ -440,9 +440,9 @@ void insertspillcode(void) {
if (coloring_class == RegClass_VR && rTEMP_for_VR_spill == 0)
rTEMP_for_VR_spill = used_virtual_registers[RegClass_GPR]++;
- if (instr->flags & fPCodeFlag10)
+ if (instr->flags & fIsMove)
spillcopy(block, instr);
- else if (instr->flags & fPCodeFlag8)
+ else if (instr->flags & fIsCall)
spillcall(block, instr);
else
spillinstruction(block, instr);
diff --git a/compiler_and_linker/unsorted/StackFrame.c b/compiler_and_linker/unsorted/StackFrame.c
index 91b15da..e9feb2e 100644
--- a/compiler_and_linker/unsorted/StackFrame.c
+++ b/compiler_and_linker/unsorted/StackFrame.c
@@ -293,7 +293,7 @@ void compute_frame_sizes(void) {
genuine_frame_size = frame_size;
}
if (!large_stack && frame_size > 0x7FFF)
- CError_ErrorTerm(210);
+ CError_ErrorTerm(CErrorStr210);
}
static void allocate_new_frame(int reg1, int reg2) {
@@ -427,7 +427,7 @@ void generate_prologue(PCodeBlock *block, Boolean has_varargs) {
if (large_stack)
do_allocate_dynamic_stack_space(1, 11, 0, large_data_near_size);
- block->flags |= fPCBlockFlag1;
+ block->flags |= fIsProlog;
pclastblock = save_block;
current_statement = save_statement;
}
@@ -498,7 +498,7 @@ void generate_epilogue(PCodeBlock *block, Boolean add_blr) {
setpcodeflags(fIsVolatile);
}
- block->flags |= fPCBlockFlag2;
+ block->flags |= fIsEpilogue;
pclastblock = save_block;
current_statement = save_statement;
}
@@ -832,7 +832,7 @@ void move_varargs_to_memory(void) {
dummyvaparam = galloc(sizeof(Object));
memclrw(dummyvaparam, sizeof(Object));
- dummyvaparam->type = (Type *) &stvoid;
+ dummyvaparam->type = TYPE(&stvoid);
dummyvaparam->otype = OT_OBJECT;
dummyvaparam->name = GetHashNameNode("<vaparam>");
dummyvaparam->datatype = DLOCAL;
@@ -843,7 +843,7 @@ void move_varargs_to_memory(void) {
for (reg = last_argument_register[RegClass_GPR] + 1; (int)reg <= 10; reg++) {
emitpcode(PC_STW, reg, local_base_register(dummyvaparam), dummyvaparam, (reg - 3) * 4);
- setpcodeflags(fPCodeFlag20 | fPCodeFlag8000);
+ setpcodeflags(fIsPtrOp | fIsArgInit);
}
}
diff --git a/compiler_and_linker/unsorted/StrengthReduction.c b/compiler_and_linker/unsorted/StrengthReduction.c
index 462653a..2b68dca 100644
--- a/compiler_and_linker/unsorted/StrengthReduction.c
+++ b/compiler_and_linker/unsorted/StrengthReduction.c
@@ -143,7 +143,7 @@ static int isinductionvariable(BasicInductionVar *biv, int useID, SInt32 *result
return 0;
if (instr->args[4].data.imm.value != (31 - instr->args[2].data.imm.value))
return 0;
- if (PCODE_FLAG_SET_F(instr) & fPCodeFlag20000000)
+ if (PCODE_FLAG_SET_F(instr) & fRecordBit)
return 0;
*result1 = 1 << instr->args[2].data.imm.value;
break;
@@ -222,7 +222,7 @@ static void addinductionvariable(BasicInductionVar *biv, PCode *instr, SInt32 va
iv->x18 = val2;
iv->x1A = val3;
iv->someloop = val4;
- if (instr->flags & (fPCodeFlag2 | fPCodeFlag4))
+ if (instr->flags & (fIsRead | fIsWrite))
iv->x1C = -1;
else
iv->x1C = instr->args[0].data.reg.reg;
@@ -343,7 +343,7 @@ static void incrementinductionvariable(InductionVar *iv) {
}
static void copyinductionvariable(InductionVar *iv) {
- if (iv->instr->flags & (fPCodeFlag2 | fPCodeFlag4)) {
+ if (iv->instr->flags & (fIsRead | fIsWrite)) {
iv->instr->op -= 2;
iv->instr->args[1].data.reg.reg = iv->x1E;
iv->instr->args[2].kind = PCOp_IMMEDIATE;
@@ -658,7 +658,7 @@ static void combineinductionvariables(Loop *loop, BasicInductionVar *biv1, Basic
}
}
- if (loop->body->lastPCode->flags & fPCodeFlag1) {
+ if (loop->body->lastPCode->flags & fIsBranch) {
nextBlock = NULL;
for (i = 0; i < loop->body->lastPCode->argCount; i++) {
diff --git a/compiler_and_linker/unsorted/UseDefChains.c b/compiler_and_linker/unsorted/UseDefChains.c
index 1525005..7d87fa9 100644
--- a/compiler_and_linker/unsorted/UseDefChains.c
+++ b/compiler_and_linker/unsorted/UseDefChains.c
@@ -82,13 +82,13 @@ static void precomputememoryusedefs(void) {
for (block = pcbasicblocks; block; block = block->nextBlock) {
for (pcode = block->firstPCode; pcode; pcode = pcode->nextPCode) {
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag4)) {
+ if (pcode->flags & (fIsRead | fIsWrite)) {
if (pcode->alias) {
if (pcode->alias->type == AliasType2 || pcode->alias->size != nbytes_loaded_or_stored_by(pcode))
- pcode->flags |= fPCodeFlag20;
+ pcode->flags |= fIsPtrOp;
addaliasusedef(pcode->alias);
} else {
- pcode->flags |= fPCodeFlag20;
+ pcode->flags |= fIsPtrOp;
}
}
}
@@ -109,7 +109,7 @@ static void precomputeusedefcounts(int flag) {
for (block = pcbasicblocks; block; block = block->nextBlock) {
for (pcode = block->firstPCode; pcode; pcode = pcode->nextPCode) {
- if (!(pcode->flags & fPCodeFlag1) && pcode->argCount) {
+ if (!(pcode->flags & fIsBranch) && pcode->argCount) {
pcode->useID = number_of_Uses;
pcode->defID = number_of_Defs;
op = pcode->args;
@@ -125,8 +125,8 @@ static void precomputeusedefcounts(int flag) {
}
if (flag) {
- if (pcode->flags & fPCodeFlag2) {
- if (pcode->flags & fPCodeFlag20) {
+ if (pcode->flags & fIsRead) {
+ if (pcode->flags & fIsPtrOp) {
for (oud = objectusedeflist; oud; oud = oud->next) {
if (may_alias_object(pcode, oud->object))
number_of_Uses++;
@@ -134,8 +134,8 @@ static void precomputeusedefcounts(int flag) {
} else {
number_of_Uses++;
}
- } else if (pcode->flags & fPCodeFlag4) {
- if (pcode->flags & fPCodeFlag20) {
+ } else if (pcode->flags & fIsWrite) {
+ if (pcode->flags & fIsPtrOp) {
for (oud = objectusedeflist; oud; oud = oud->next) {
if (may_alias_object(pcode, oud->object))
number_of_Defs++;
@@ -143,7 +143,7 @@ static void precomputeusedefcounts(int flag) {
} else {
number_of_Defs++;
}
- } else if (pcode->flags & fPCodeFlag8) {
+ } else if (pcode->flags & fIsCall) {
for (oud = objectusedeflist; oud; oud = oud->next) {
if (
oud->object->datatype == DDATA ||
@@ -207,7 +207,7 @@ static void computeusedeflists(int flag) {
for (block = pcbasicblocks; block; block = block->nextBlock) {
for (pcode = block->firstPCode; pcode; pcode = pcode->nextPCode) {
- if (!(pcode->flags & fPCodeFlag1) && pcode->argCount) {
+ if (!(pcode->flags & fIsBranch) && pcode->argCount) {
use = &Uses[useID = pcode->useID];
def = &Defs[defID = pcode->defID];
@@ -244,8 +244,8 @@ static void computeusedeflists(int flag) {
}
if (flag) {
- if (pcode->flags & fPCodeFlag2) {
- if (pcode->flags & fPCodeFlag20) {
+ if (pcode->flags & fIsRead) {
+ if (pcode->flags & fIsPtrOp) {
for (oud = objectusedeflist; oud; oud = oud->next) {
if (may_alias_object(pcode, object = oud->object)) {
use->pcode = pcode;
@@ -272,8 +272,8 @@ static void computeusedeflists(int flag) {
list->next = tmp->uses;
tmp->uses = list;
}
- } else if (pcode->flags & fPCodeFlag4) {
- if (pcode->flags & fPCodeFlag20) {
+ } else if (pcode->flags & fIsWrite) {
+ if (pcode->flags & fIsPtrOp) {
for (oud = objectusedeflist; oud; oud = oud->next) {
if (may_alias_object(pcode, object = oud->object)) {
def->pcode = pcode;
@@ -300,7 +300,7 @@ static void computeusedeflists(int flag) {
list->next = tmp->defs;
tmp->defs = list;
}
- } else if (pcode->flags & fPCodeFlag8) {
+ } else if (pcode->flags & fIsCall) {
for (oud = objectusedeflist; oud; oud = oud->next) {
object = oud->object;
if (
@@ -396,7 +396,7 @@ static void computelocalusedefinfo(void) {
bitvectorinitialize(info->usevec1C, number_of_Uses, 0);
for (pcode = block->firstPCode; pcode; pcode = pcode->nextPCode) {
- if (!(pcode->flags & fPCodeFlag1) && pcode->argCount) {
+ if (!(pcode->flags & fIsBranch) && pcode->argCount) {
for (use = &Uses[useID = pcode->useID]; useID < number_of_Uses && use->pcode == pcode; use++, useID++) {
bitvectorsetbit(useID, usevec10);
if (use->v.kind == PCOp_REGISTER) {
diff --git a/compiler_and_linker/unsorted/ValueNumbering.c b/compiler_and_linker/unsorted/ValueNumbering.c
index 670471d..0907fa1 100644
--- a/compiler_and_linker/unsorted/ValueNumbering.c
+++ b/compiler_and_linker/unsorted/ValueNumbering.c
@@ -265,7 +265,7 @@ static int matchvalues(AvailableValue *av, PCode *match) {
}
}
- if ((match->flags & (fPCodeFlag2 | fPCodeFlag20000)) && match->alias->valuenumber != av->aliasnumber)
+ if ((match->flags & (fIsRead | fPCodeFlag20000)) && match->alias->valuenumber != av->aliasnumber)
return 0;
return 1;
@@ -331,7 +331,7 @@ static void addavailablevalue(PCode *pcode) {
av->opnumbers[i] = regvalue[op->arg][op->data.reg.reg].number;
}
- if (pcode->flags & (fPCodeFlag2 | fPCodeFlag20000))
+ if (pcode->flags & (fIsRead | fPCodeFlag20000))
av->aliasnumber = pcode->alias->valuenumber;
op = &pcode->args[0];
@@ -368,7 +368,7 @@ static int isCSEop(PCode *pcode) {
break;
}
- if (PCODE_FLAG_SET_F(pcode) & (fIsVolatile | fSideEffects | fOverflow | fPCodeFlag10000000 | fPCodeFlag20000000))
+ if (PCODE_FLAG_SET_F(pcode) & (fIsVolatile | fSideEffects | fOverflow | fSetsCarry | fRecordBit))
return 0;
for (i = 0, op = &pcode->args[0]; i < pcode->argCount; i++, op++) {
@@ -542,17 +542,17 @@ static void removecsesfrombasicblock(PCodeBlock *block) {
for (pcode = block->firstPCode; pcode; pcode = next) {
next = pcode->nextPCode;
propagatecopiesto(pcode);
- if (pcode->flags & fPCodeFlag10) {
+ if (pcode->flags & fIsMove) {
registercopy(pcode);
- } else if ((pcode->flags & fPCodeFlag8) && (pcode->flags & (fLink | fSideEffects))) {
+ } else if ((pcode->flags & fIsCall) && (pcode->flags & (fLink | fSideEffects))) {
functioncall(pcode);
- } else if (pcode->flags & fPCodeFlag2) {
- if (pcode->flags & fPCodeFlag20)
+ } else if (pcode->flags & fIsRead) {
+ if (pcode->flags & fIsPtrOp)
pointerload(pcode);
else
simpleload(pcode);
- } else if (pcode->flags & fPCodeFlag4) {
- if (pcode->flags & fPCodeFlag20)
+ } else if (pcode->flags & fIsWrite) {
+ if (pcode->flags & fIsPtrOp)
pointerstore(pcode);
else
simplestore(pcode);
@@ -567,7 +567,7 @@ static void removecsesfrombasicblock(PCodeBlock *block) {
}
}
- block->flags |= fPCBlockFlag4;
+ block->flags |= fVisited;
}
static void getvaluestate(State *state) {
@@ -621,7 +621,7 @@ static void removecsesfromextendedbasicblock(PCodeBlock *block) {
counter = 0;
for (succ = block->successors; succ; succ = succ->nextLink) {
- if (!(succ->block->flags & fPCBlockFlag4) && succ->block->predecessors && !succ->block->predecessors->nextLink)
+ if (!(succ->block->flags & fVisited) && succ->block->predecessors && !succ->block->predecessors->nextLink)
counter++;
}
@@ -629,7 +629,7 @@ static void removecsesfromextendedbasicblock(PCodeBlock *block) {
getvaluestate(&state);
forkvaluestate(nextvaluenumber);
for (succ = block->successors; succ; succ = succ->nextLink) {
- if (!(succ->block->flags & fPCBlockFlag4) && succ->block->predecessors && !succ->block->predecessors->nextLink) {
+ if (!(succ->block->flags & fVisited) && succ->block->predecessors && !succ->block->predecessors->nextLink) {
removecsesfromextendedbasicblock(succ->block);
regressvaluestate();
}
@@ -647,10 +647,10 @@ void removecommonsubexpressions(Object *proc, int flag) {
allocatecsedatastructures();
for (block = pcbasicblocks; block; block = block->nextBlock)
- block->flags &= ~fPCBlockFlag4;
+ block->flags &= ~fVisited;
for (block = pcbasicblocks; block; block = block->nextBlock) {
- if (!(block->flags & fPCBlockFlag4)) {
+ if (!(block->flags & fVisited)) {
initializecsedatastructures();
removecsesfromextendedbasicblock(block);
}
diff --git a/compiler_and_linker/unsorted/VectorArraysToRegs.c b/compiler_and_linker/unsorted/VectorArraysToRegs.c
index c6c4735..fde27f1 100644
--- a/compiler_and_linker/unsorted/VectorArraysToRegs.c
+++ b/compiler_and_linker/unsorted/VectorArraysToRegs.c
@@ -110,7 +110,7 @@ static void scaninstructions(LocalVectorArray *arrays) {
firstaddinblock[block->blockIndex] = number_of_ADDIs;
counter = 0;
for (instr = block->firstPCode; instr; instr = instr->nextPCode) {
- if (!(instr->flags & fPCodeFlag1) && instr->argCount) {
+ if (!(instr->flags & fIsBranch) && instr->argCount) {
op = instr->args;
i = instr->argCount;
while (i--) {
@@ -168,7 +168,7 @@ static void computeaddilist(LocalVectorArray *arrays) {
bitvectorcopy(vec, usedefinfo[block->blockIndex].usevec1C, number_of_Uses);
addi = &ADDIs[firstaddinblock[block->blockIndex] + naddsinblock[block->blockIndex] - 1];
for (instr = block->lastPCode; instr; instr = instr->prevPCode) {
- if (!(instr->flags & fPCodeFlag1) && instr->argCount) {
+ if (!(instr->flags & fIsBranch) && instr->argCount) {
int reg; // r18
if (
instr->op == PC_ADDI &&
@@ -245,7 +245,7 @@ static void computelocalvectorpropinfo(LocalVectorArray *arrays) {
index = firstaddinblock[block->blockIndex];
for (instr = block->firstPCode; instr; instr = instr->nextPCode) {
- if (!(instr->flags & fPCodeFlag1) && instr->argCount) {
+ if (!(instr->flags & fIsBranch) && instr->argCount) {
i = instr->argCount;
op = instr->args;
while (i--) {
diff --git a/compiler_and_linker/unsorted/uDump.c b/compiler_and_linker/unsorted/uDump.c
index 52ab09f..86a6e68 100644
--- a/compiler_and_linker/unsorted/uDump.c
+++ b/compiler_and_linker/unsorted/uDump.c
@@ -429,7 +429,7 @@ static void spell(Type *type, char *buf) {
strcat(buf, TYPE_ENUM(type)->enumname->name);
break;
case TYPESTRUCT:
- if (IS_TYPESTRUCT_VECTOR(type)) {
+ if (IS_TYPESTRUCT_VECTOR(TYPE_STRUCT(type))) {
switch (TYPE_STRUCT(type)->stype) {
case STRUCT_TYPE_4:
strcpy(buf, "vector unsigned char ");