[Vm-dev] [commit][3376] CogVM source as per VMMaker.oscog-eem.1354

commits at squeakvm.org commits at squeakvm.org
Tue Jun 16 02:42:36 UTC 2015


Revision: 3376
Author:   eliot
Date:     2015-06-15 19:42:34 -0700 (Mon, 15 Jun 2015)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1354

Cogit:
Fix bug in rewriting compiler primitives on module unload, etc.  The old code
didn't change the assignment to the primitiveFunctionPointer, which is needed
for correct management of failing primitive calls on Spur.  Simplify the post
compile hook to eliminate the label parameter; this is local to the Cogit.

ARM Cogit:
Replace CogInLineLiteralsARMCompiler with CogOutOfLineLiteralsARMCompiler.

Fix some bugs with PushCw, and AndCqR.

Move the calculation of which address to annotate for an annotated instruction
into the instruction, allowing CogOutOfLineLiteralsARMCompiler to annotate the
out-of-line literal, rather than the instruction following, and implement
literal update on GC for out-of-line literals.

Slang:
Eliminate blank lines coming from conditional dead code elimination.

Modified Paths:
--------------
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cogitARMv5.c
    branches/Cog/nsspursrc/vm/cogitIA32.c
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cogitARMv5.c
    branches/Cog/spursistasrc/vm/cogitIA32.c
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cogitARMv5.c
    branches/Cog/spursrc/vm/cogitIA32.c
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/cogit.h
    branches/Cog/src/vm/cogitARMv5.c
    branches/Cog/src/vm/cogitIA32.c
    branches/Cog/src/vm/cointerp.c
    branches/Cog/src/vm/cointerp.h
    branches/Cog/src/vm/cointerpmt.c
    branches/Cog/src/vm/cointerpmt.h
    branches/Cog/src/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/gcc3x-cointerpmt.c

Property Changed:
----------------
    branches/Cog/platforms/Cross/vm/sqSCCSVersion.h

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2015-06-12 01:39:23 UTC (rev 3375)
+++ branches/Cog/nsspursrc/vm/cogit.h	2015-06-16 02:42:34 UTC (rev 3376)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1349 uuid: c4bacc64-8f85-425f-b5b9-47504c99cabe
+	CCodeGenerator VMMaker.oscog-eem.1354 uuid: 33807720-0fc7-43d4-98b3-1230281feaf6
  */
 
 
@@ -62,7 +62,7 @@
 extern void printTrampolineTable(void);
 extern sqInt recordPrimTraceFunc(void);
 extern void setBreakMethod(sqInt anObj);
-extern void setPostCompileHook(void (*aFunction)(CogMethod *, void *));
+extern void setPostCompileHook(void (*aFunction)(CogMethod *));
 extern void setSelectorOfto(CogMethod *cogMethod, sqInt aSelectorOop);
 extern sqInt traceLinkedSendOffset(void);
 extern void unlinkAllSends(void);
@@ -86,7 +86,7 @@
 extern sqInt genQuickReturnConst(void);
 extern sqInt genQuickReturnInstVar(void);
 extern sqInt genQuickReturnSelf(void);
-extern void recordCallOffsetInof(CogMethod *cogMethod, void *callLabelArg);
+extern void recordCallOffsetIn(CogMethod *cogMethod);
 extern void rewritePrimInvocationInto(CogMethod *cogMethod, void (*primFunctionPointer)(void));
 extern void voidCogCompiledCode(void);
 extern void callCogCodePopReceiverArg0Regs(void);

Modified: branches/Cog/nsspursrc/vm/cogitARMv5.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitARMv5.c	2015-06-12 01:39:23 UTC (rev 3375)
+++ branches/Cog/nsspursrc/vm/cogitARMv5.c	2015-06-16 02:42:34 UTC (rev 3376)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1349 uuid: c4bacc64-8f85-425f-b5b9-47504c99cabe
+	CCodeGenerator VMMaker.oscog-eem.1354 uuid: 33807720-0fc7-43d4-98b3-1230281feaf6
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1349 uuid: c4bacc64-8f85-425f-b5b9-47504c99cabe
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1354 uuid: 33807720-0fc7-43d4-98b3-1230281feaf6
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1349 uuid: c4bacc64-8f85-425f-b5b9-47504c99cabe " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1354 uuid: 33807720-0fc7-43d4-98b3-1230281feaf6 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -33,7 +33,7 @@
 	unsigned long		machineCode [5];
  } AbstractInstruction;
 
-#define CogARMCompiler AbstractInstruction
+#define CogOutOfLineLiteralsARMCompiler AbstractInstruction
 
 
 typedef struct {
@@ -410,7 +410,6 @@
 static AbstractInstruction * relocateJumpLongBeforeFollowingAddressby(AbstractInstruction * self_in_relocateJumpLongBeforeFollowingAddressby, sqInt pc, sqInt delta) NoDbgRegParms;
 static AbstractInstruction * resolveJumpTarget(AbstractInstruction * self_in_resolveJumpTarget) NoDbgRegParms;
 static sqInt setLabelOffset(AbstractInstruction * self_in_setLabelOffset, sqInt aValue) NoDbgRegParms;
-static AbstractInstruction * updateLabel(AbstractInstruction * self_in_updateLabel, AbstractInstruction *labelInstruction) NoDbgRegParms;
 static sqInt abstractRegisterForConcreteRegister(AbstractInstruction * self_in_abstractRegisterForConcreteRegister, sqInt reg) NoDbgRegParms;
 static sqInt addsrnimmror(AbstractInstruction * self_in_addsrnimmror, sqInt destReg, sqInt srcReg, sqInt immediate, sqInt rot) NoDbgRegParms;
 static sqInt addrnimmror(AbstractInstruction * self_in_addrnimmror, sqInt destReg, sqInt srcReg, sqInt immediate, sqInt rot) NoDbgRegParms;
@@ -468,6 +467,7 @@
 static sqInt hasLinkRegister(AbstractInstruction * self_in_hasLinkRegister) NoDbgRegParms;
 static sqInt hasPCDependentInstruction(AbstractInstruction * self_in_hasPCDependentInstruction) NoDbgRegParms;
 static sqInt hasPCRegister(AbstractInstruction * self_in_hasPCRegister) NoDbgRegParms;
+static sqInt instructionBeforeAddress(AbstractInstruction * self_in_instructionBeforeAddress, sqInt followingAddress) NoDbgRegParms;
 static sqInt instructionIsBLX(AbstractInstruction * self_in_instructionIsBLX, sqInt instr) NoDbgRegParms;
 static sqInt instructionIsBL(AbstractInstruction * self_in_instructionIsBL, sqInt instr) NoDbgRegParms;
 static sqInt instructionIsBX(AbstractInstruction * self_in_instructionIsBX, sqInt instr) NoDbgRegParms;
@@ -653,6 +653,7 @@
 static AbstractInstruction * genoperandoperand(sqInt opcode, sqInt operandOne, sqInt operandTwo) NoDbgRegParms;
 static AbstractInstruction * genoperandoperandoperand(sqInt opcode, sqInt operandOne, sqInt operandTwo, sqInt operandThree) NoDbgRegParms;
 static sqInt getLiteral(sqInt litIndex) NoDbgRegParms;
+static sqInt getOpcodeIndex(void);
 static sqInt incrementUsageOfTargetIfLinkedSendmcpcignored(sqInt annotation, char *mcpc, sqInt superfluity) NoDbgRegParms;
 static sqInt initialClosedPICUsageCount(void);
 static void initializeBackend(void);
@@ -742,7 +743,7 @@
 static AbstractInstruction * gSubCwR(sqInt wordConstant, sqInt reg) NoDbgRegParms;
 static sqInt scanForCleanBlocks(void);
 extern void setBreakMethod(sqInt anObj);
-extern void setPostCompileHook(void (*aFunction)(CogMethod *, void *));
+extern void setPostCompileHook(void (*aFunction)(CogMethod *));
 extern void setSelectorOfto(CogMethod *cogMethod, sqInt aSelectorOop);
 static sqInt spanForCleanBlockStartingAt(sqInt startPC) NoDbgRegParms;
 extern sqInt traceLinkedSendOffset(void);
@@ -895,12 +896,34 @@
 static sqInt shouldAnnotateObjectReference(sqInt anOop) NoDbgRegParms;
 static sqInt slotOffsetOfInstVarIndex(sqInt index) NoDbgRegParms;
 static sqInt smallIntegerIsOnlyImmediateType(void);
+static AbstractInstruction * concretizeLiteral(AbstractInstruction * self_in_concretizeLiteral) NoDbgRegParms;
+static sqInt inlineCacheTagAt(AbstractInstruction * self_in_inlineCacheTagAt, sqInt followingAddress) NoDbgRegParms;
+static sqInt isPCDependent(AbstractInstruction * self_in_isPCDependent) NoDbgRegParms;
+static sqInt isSharable(AbstractInstruction * self_in_isSharable) NoDbgRegParms;
+static sqInt literalLoadInstructionBytes(AbstractInstruction * self_in_literalLoadInstructionBytes) NoDbgRegParms;
+static sqInt outOfLineLiteralOpcodeLimit(AbstractInstruction * self_in_outOfLineLiteralOpcodeLimit) NoDbgRegParms;
+static sqInt pcRelativeAddressAt(AbstractInstruction * self_in_pcRelativeAddressAt, sqInt instrAddress) NoDbgRegParms;
+static sqInt rewriteFullTransferAttargetexpectedInstruction(AbstractInstruction * self_in_rewriteFullTransferAttargetexpectedInstruction, usqInt callSiteReturnAddress, usqInt callTargetAddress, sqInt expectedInstruction) NoDbgRegParms;
+static sqInt rewriteInlineCacheAttagtarget(AbstractInstruction * self_in_rewriteInlineCacheAttagtarget, usqInt callSiteReturnAddress, sqInt cacheTag, usqInt callTargetAddress) NoDbgRegParms;
+static usqInt sizePCDependentInstructionAt(AbstractInstruction * self_in_sizePCDependentInstructionAt, sqInt eventualAbsoluteAddress) NoDbgRegParms;
+static AbstractInstruction * storeLiteralbeforeFollowingAddress(AbstractInstruction * self_in_storeLiteralbeforeFollowingAddress, sqInt literal, sqInt followingAddress) NoDbgRegParms;
+static AbstractInstruction * updateLabel(AbstractInstruction * self_in_updateLabel, AbstractInstruction *labelInstruction) NoDbgRegParms;
+static sqInt usesOutOfLineLiteral(AbstractInstruction * self_in_usesOutOfLineLiteral) NoDbgRegParms;
 static CogSimStackEntry * ensureSpilledAtfrom(CogSimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffset, sqInt baseRegister) NoDbgRegParms;
 static CogSimStackEntry * mergeAtfrom(CogSimStackEntry * self_in_mergeAtfrom, sqInt baseOffset, sqInt baseRegister) NoDbgRegParms;
 static CogSimStackEntry * popToReg(CogSimStackEntry * self_in_popToReg, sqInt reg) NoDbgRegParms;
 static sqInt registerMask(CogSimStackEntry * self_in_registerMask) NoDbgRegParms;
 static sqInt registerOrNil(CogSimStackEntry * self_in_registerOrNil) NoDbgRegParms;
 static CogSimStackEntry * storeToReg(CogSimStackEntry * self_in_storeToReg, sqInt reg) NoDbgRegParms;
+static AbstractInstruction * allocateLiteral(sqInt aLiteral) NoDbgRegParms;
+static AbstractInstruction * checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction) NoDbgRegParms;
+static AbstractInstruction * checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction) NoDbgRegParms;
+static sqInt dumpLiterals(sqInt generateBranchAround) NoDbgRegParms;
+static sqInt literalInstructionInRange(sqInt litInst) NoDbgRegParms;
+static AbstractInstruction * locateLiteral(sqInt aLiteral) NoDbgRegParms;
+static sqInt mustDumpLiterals(sqInt currentOpcodeIndex) NoDbgRegParms;
+static sqInt resetForBlockCompile(void);
+static sqInt saveForBlockCompile(void);
 static sqInt compileBlockDispatch(void);
 static sqInt compileFallbackToInterpreterPrimitive(void);
 static void compileGetErrorCode(void);
@@ -997,7 +1020,7 @@
 static sqInt genStoreAndPopTemporaryVariableBytecode(void);
 static sqInt genStoreRemoteTempLongBytecode(void);
 static void maybeCompileAllocFillerCheck(void);
-extern void recordCallOffsetInof(CogMethod *cogMethod, void *callLabelArg);
+extern void recordCallOffsetIn(CogMethod *cogMethod);
 static sqInt registerisInMask(sqInt reg, sqInt mask) NoDbgRegParms;
 static sqInt returnRegForStoreCheck(void);
 extern void rewritePrimInvocationInto(CogMethod *cogMethod, void (*primFunctionPointer)(void));
@@ -1255,7 +1278,9 @@
 static sqInt extB;
 static sqInt externalPrimCallOffsets[MaxNumArgs + 1];
 static sqInt externalPrimJumpOffsets[MaxNumArgs + 1];
+static sqInt externalSetPrimOffsets[MaxNumArgs + 1];
 static sqInt firstCPICCaseOffset;
+static sqInt firstOpcodeIndex;
 static sqInt firstSend;
 static BytecodeFixup * fixups;
 static BytecodeDescriptor generatorTable[512] = {
@@ -1779,8 +1804,11 @@
 static sqInt indexOfIRC;
 static sqInt initialPC;
 static int labelCounter;
+static sqInt lastDumpedLiteralIndex;
 static sqInt lastSend;
 static usqInt limitAddress;
+static sqInt literals;
+static sqInt literalsSize;
 static sqInt maxLitIndex;
 static sqInt methodAbortTrampolines[4];
 static sqInt methodBytesFreedSinceLastCompaction;
@@ -1794,6 +1822,7 @@
 sqInt missOffset;
 static usqInt mzFreeStart;
 static sqInt needsFrame;
+static sqInt nextLiteralIndex;
 static AbstractInstruction * noCheckEntry;
 static sqInt numAbstractOpcodes;
 static sqInt numIRCs;
@@ -1809,10 +1838,11 @@
 static AbstractInstruction * picInterpretAbort;
 static sqInt picMissTrampolines[4];
 static AbstractInstruction * picMNUAbort;
-static void (*postCompileHook)(CogMethod *, void *);
+static void (*postCompileHook)(CogMethod *);
 static BytecodeDescriptor * prevBCDescriptor;
 static AbstractInstruction * primInvokeLabel;
 static sqInt primitiveIndex;
+static AbstractInstruction * primSetFunctionLabel;
 void (*realCECallCogCodePopReceiverAndClassRegs)(void);
 void (*realCECallCogCodePopReceiverArg0Regs)(void);
 void (*realCECallCogCodePopReceiverArg1Arg0Regs)(void);
@@ -1820,6 +1850,9 @@
 void (*realCEEnterCogCodePopReceiverReg)(void);
 static sqInt regArgsHaveBeenPushed;
 static sqInt runtimeObjectRefIndex;
+static sqInt savedFirstOpcodeIndex;
+static sqInt savedLastDumpedLiteralIndex;
+static sqInt savedNextLiteralIndex;
 static sqInt selfSendTrampolines[NumSendTrampolines];
 static AbstractInstruction * sendMiss;
 static CogSimStackEntry simSelf;
@@ -1916,6 +1949,7 @@
 #define roundUpLength(numBytes) ((numBytes) + 7 & -8)
 #define youngReferrers() youngReferrers
 #define maybeConstant(sse) ((sse)->constant)
+#define literalInstructionAt(index) (&literals[index])
 #define fixupAt(index) (&fixups[index])
 #define simStackAt(index) (simStack + (index))
 #define traceDescriptor(ign) 0
@@ -2116,30 +2150,6 @@
 	return ((self_in_setLabelOffset->operands))[1] = aValue;
 }
 
-
-/*	Update an instruction that depends on a label outside of
-	generated code (e.g. a method or block header). */
-
-	/* CogAbstractInstruction>>#updateLabel: */
-static AbstractInstruction *
-updateLabel(AbstractInstruction * self_in_updateLabel, AbstractInstruction *labelInstruction)
-{
-    unsigned long offsetAddress;
-
-	offsetAddress = ((labelInstruction->address)) + (labelOffset(labelInstruction));
-	
-	switch ((self_in_updateLabel->opcode)) {
-	case MoveCwR:
-	case PushCw:
-	case FillFromWord:
-		((self_in_updateLabel->operands))[0] = offsetAddress;
-		break;
-	default:
-		error("Case not found and no otherwise clause");
-	}
-	return self_in_updateLabel;
-}
-
 	/* CogARMCompiler>>#abstractRegisterForConcreteRegister: */
 static sqInt
 abstractRegisterForConcreteRegister(AbstractInstruction * self_in_abstractRegisterForConcreteRegister, sqInt reg)
@@ -2350,12 +2360,14 @@
     sqInt constant4;
     sqInt constant5;
     sqInt constant6;
+    sqInt constant7;
     sqInt i;
     sqInt i1;
     sqInt i2;
     sqInt i3;
     sqInt i4;
     sqInt i5;
+    sqInt i6;
     sqInt n;
     sqInt r;
     sqInt u;
@@ -2363,6 +2375,7 @@
     sqInt value1;
     sqInt value2;
     sqInt value3;
+    sqInt value4;
 
 	
 	switch ((self_in_computeMaximumSize->opcode)) {
@@ -2443,7 +2456,7 @@
 	case XorCwR:
 	case MoveRdM64r:
 	case MoveM64rRd:
-		return (literalLoadInstructionBytes()) + 4;
+		return 4 + 4;
 
 	case JumpFPEqual:
 	case JumpFPNotEqual:
@@ -2485,7 +2498,7 @@
 			 && (constant != 0))) break;
 			value = -constant;
 		}
-		return (literalLoadInstructionBytes()) + 4;
+		return 4 + 4;
 
 	case AndCqR:
 	case AndCqRR:
@@ -2513,11 +2526,7 @@
 				? -1 - constant1
 				: (unsigned int)~constant1);
 		}
-		return ((literalLoadInstructionBytes()) == 4
-			? 8
-			: ((1 << (highBit(((self_in_computeMaximumSize->operands))[0]))) == ((((self_in_computeMaximumSize->operands))[0]) + 1)
-					? 8
-					: (literalLoadInstructionBytes()) + 4));
+		return 8;
 
 	case OrCqR:
 	case TstCqR:
@@ -2533,57 +2542,24 @@
 				return 4;
 			}
 		}
-		return (literalLoadInstructionBytes()) + 4;
+		return 4 + 4;
 
 	case MoveCqR:
-		return ((literalLoadInstructionBytes()) == 4
-			? literalLoadInstructionBytes()
-			: (/* begin rotateable8bitBitwiseImmediate:ifTrue:ifFalse: */
-				(constant3 = ((self_in_computeMaximumSize->operands))[0]),
-				(value2 = constant3),
-				while (1) {
-						if ((value2 & 0xFF) == value2) {
-							n = constant3 != value2;
-							4;
+		return 4;
 
-							goto l1;
-						}
-						for (i4 = 2; i4 <= 30; i4 += 2) {
-							if ((value2 & (((0xFF << i4) & 0xFFFFFFFFUL) | (((usqInt) 0xFF) >> (32 - i4)))) == value2) {
-								r = 32 - i4;
-								i = (((usqInt) value2) >> i4) | ((value2 << (32 - i4)) & 0xFFFFFFFFUL);
-								n = constant3 != value2;
-								4;
-
-								goto l1;
-							}
-						}
-						if (!(value2 == constant3)) break;
-						value2 = (constant3 < 0
-							? -1 - constant3
-							: (unsigned int)~constant3);
-					}
-				literalLoadInstructionBytes(),
-			l1:	/* end rotateable8bitBitwiseImmediate:ifTrue:ifFalse: */));
-
 	case MoveCwR:
-		return ((literalLoadInstructionBytes()) == 4
-			? literalLoadInstructionBytes()
-			: ((isAnInstruction(self_in_computeMaximumSize, ((self_in_computeMaximumSize->operands))[0]))
-				 || (addressIsInCurrentCompilation(((self_in_computeMaximumSize->operands))[0]))
-					? 4
-					: literalLoadInstructionBytes()));
+		return 4;
 
 	case MoveAwR:
 	case PrefetchAw:
 		return (isAddressRelativeToVarBase(self_in_computeMaximumSize, ((self_in_computeMaximumSize->operands))[0])
 			? 4
-			: (literalLoadInstructionBytes()) + 4);
+			: 4 + 4);
 
 	case MoveRAw:
 		return (isAddressRelativeToVarBase(self_in_computeMaximumSize, ((self_in_computeMaximumSize->operands))[1])
 			? 4
-			: (literalLoadInstructionBytes()) + 4);
+			: 4 + 4);
 
 	case MoveRMwr:
 	case MoveRMbr:
@@ -2601,7 +2577,7 @@
 			}
 		}
 		else {
-			return (literalLoadInstructionBytes()) + 4;
+			return 4 + 4;
 		}
 
 	case MoveMbrR:
@@ -2620,48 +2596,15 @@
 			}
 		}
 		else {
-			return (literalLoadInstructionBytes()) + 4;
+			return 4 + 4;
 		}
 
 	case PushCw:
-		return ((literalLoadInstructionBytes()) == 4
-			? (literalLoadInstructionBytes()) + 4
-			: ((isAnInstruction(self_in_computeMaximumSize, ((self_in_computeMaximumSize->operands))[0]))
-				 || (addressIsInCurrentCompilation(((self_in_computeMaximumSize->operands))[0]))
-					? 8
-					: (literalLoadInstructionBytes()) + 4));
+		return 4 + 4;
 
 	case PushCq:
-		return ((literalLoadInstructionBytes()) == 4
-			? (literalLoadInstructionBytes()) + 4
-			: (/* begin rotateable8bitBitwiseImmediate:ifTrue:ifFalse: */
-				(constant6 = ((self_in_computeMaximumSize->operands))[0]),
-				(value3 = constant6),
-				while (1) {
-						if ((value3 & 0xFF) == value3) {
-							n = constant6 != value3;
-							8;
+		return 4 + 4;
 
-							goto l2;
-						}
-						for (i5 = 2; i5 <= 30; i5 += 2) {
-							if ((value3 & (((0xFF << i5) & 0xFFFFFFFFUL) | (((usqInt) 0xFF) >> (32 - i5)))) == value3) {
-								r = 32 - i5;
-								i = (((usqInt) value3) >> i5) | ((value3 << (32 - i5)) & 0xFFFFFFFFUL);
-								n = constant6 != value3;
-								8;
-
-								goto l2;
-							}
-						}
-						if (!(value3 == constant6)) break;
-						value3 = (constant6 < 0
-							? -1 - constant6
-							: (unsigned int)~constant6);
-					}
-				(literalLoadInstructionBytes()) + 4,
-			l2:	/* end rotateable8bitBitwiseImmediate:ifTrue:ifFalse: */));
-
 	default:
 		error("Case not found and no otherwise clause");
 	}
@@ -3051,6 +2994,10 @@
     sqInt aWord118;
     sqInt aWord119;
     sqInt aWord12;
+    sqInt aWord120;
+    sqInt aWord121;
+    sqInt aWord122;
+    sqInt aWord123;
     sqInt aWord13;
     sqInt aWord14;
     sqInt aWord15;
@@ -3063,6 +3010,8 @@
     sqInt aWord21;
     sqInt aWord210;
     sqInt aWord211;
+    sqInt aWord212;
+    sqInt aWord213;
     sqInt aWord22;
     sqInt aWord23;
     sqInt aWord24;
@@ -3074,6 +3023,8 @@
     sqInt aWord3;
     sqInt aWord30;
     sqInt aWord31;
+    sqInt aWord310;
+    sqInt aWord311;
     sqInt aWord32;
     sqInt aWord33;
     sqInt aWord34;
@@ -3086,8 +3037,31 @@
     sqInt aWord40;
     sqInt aWord41;
     sqInt aWord42;
+    sqInt aWord43;
+    sqInt aWord44;
+    sqInt aWord45;
+    sqInt aWord46;
+    sqInt aWord47;
+    sqInt aWord48;
+    sqInt aWord49;
     sqInt aWord5;
+    sqInt aWord50;
+    sqInt aWord51;
+    sqInt aWord52;
+    sqInt aWord53;
+    sqInt aWord54;
+    sqInt aWord55;
+    sqInt aWord56;
+    sqInt aWord57;
+    sqInt aWord58;
+    sqInt aWord59;
     sqInt aWord6;
+    sqInt aWord60;
+    sqInt aWord61;
+    sqInt aWord62;
+    sqInt aWord63;
+    sqInt aWord64;
+    sqInt aWord65;
     sqInt aWord7;
     sqInt aWord8;
     sqInt aWord9;
@@ -3097,8 +3071,8 @@
     sqInt base3;
     sqInt baseReg;
     sqInt baseReg1;
-    sqInt constant;
-    unsigned long constant1;
+    usqInt constant;
+    usqInt constant1;
     unsigned long constant10;
     unsigned long constant11;
     unsigned long constant12;
@@ -3147,11 +3121,16 @@
     sqInt hb3;
     sqInt hb4;
     sqInt hb5;
+    sqInt hb6;
+    sqInt hb7;
     sqInt i;
     sqInt i1;
     sqInt i10;
     sqInt i11;
     sqInt i12;
+    sqInt i13;
+    sqInt i14;
+    sqInt i15;
     sqInt i2;
     sqInt i3;
     sqInt i4;
@@ -3169,6 +3148,9 @@
     sqInt immediate14;
     sqInt immediate15;
     sqInt immediate16;
+    sqInt immediate17;
+    sqInt immediate18;
+    sqInt immediate19;
     sqInt immediate2;
     sqInt immediate3;
     sqInt immediate4;
@@ -3181,37 +3163,38 @@
     sqInt index1;
     sqInt index2;
     sqInt index3;
-    sqInt instrOffset;
-    sqInt instrOffset1;
-    sqInt instrOffset10;
-    sqInt instrOffset11;
-    sqInt instrOffset12;
-    sqInt instrOffset13;
-    sqInt instrOffset14;
-    sqInt instrOffset15;
-    sqInt instrOffset16;
-    sqInt instrOffset17;
-    sqInt instrOffset18;
-    sqInt instrOffset19;
-    sqInt instrOffset2;
-    sqInt instrOffset20;
-    sqInt instrOffset21;
-    sqInt instrOffset22;
-    sqInt instrOffset23;
-    sqInt instrOffset24;
-    sqInt instrOffset25;
-    sqInt instrOffset26;
-    sqInt instrOffset3;
-    sqInt instrOffset4;
+    usqInt instrOffset;
+    usqInt instrOffset1;
+    usqInt instrOffset10;
+    usqInt instrOffset11;
+    usqInt instrOffset12;
+    usqInt instrOffset13;
+    usqInt instrOffset14;
+    usqInt instrOffset15;
+    usqInt instrOffset16;
+    usqInt instrOffset17;
+    usqInt instrOffset18;
+    usqInt instrOffset19;
+    usqInt instrOffset2;
+    usqInt instrOffset20;
+    usqInt instrOffset21;
+    usqInt instrOffset22;
+    usqInt instrOffset23;
+    usqInt instrOffset24;
+    usqInt instrOffset25;
+    usqInt instrOffset26;
+    usqInt instrOffset3;
+    usqInt instrOffset4;
     sqInt instrOffset5;
-    sqInt instrOffset6;
-    sqInt instrOffset7;
-    sqInt instrOffset8;
-    sqInt instrOffset9;
+    usqInt instrOffset6;
+    usqInt instrOffset7;
+    usqInt instrOffset8;
+    usqInt instrOffset9;
     sqInt invert;
     sqInt invert1;
     sqInt invert2;
     sqInt invert3;
+    sqInt invert4;
     sqInt invVal;
     AbstractInstruction *jumpTarget;
     AbstractInstruction *jumpTarget1;
@@ -3297,6 +3280,8 @@
     sqInt rd20;
     sqInt rd21;
     sqInt rd22;
+    sqInt rd23;
+    sqInt rd24;
     sqInt rd3;
     sqInt rd4;
     sqInt rd5;
@@ -3330,6 +3315,8 @@
     sqInt rn22;
     sqInt rn23;
     sqInt rn24;
+    sqInt rn25;
+    sqInt rn26;
     sqInt rn3;
     sqInt rn4;
     sqInt rn5;
@@ -3340,6 +3327,9 @@
     sqInt rot;
     sqInt rot1;
     sqInt rot10;
+    sqInt rot11;
+    sqInt rot12;
+    sqInt rot13;
     sqInt rot2;
     sqInt rot3;
     sqInt rot4;
@@ -3378,15 +3368,19 @@
      long val3;
      long val4;
      long val5;
+     long val6;
+     long val7;
     sqInt value;
     sqInt value1;
     sqInt value2;
     sqInt value3;
     sqInt value4;
     sqInt value5;
+    sqInt value6;
     sqInt word;
     unsigned long word1;
     sqInt word2;
+    unsigned long word3;
 
 	if (!(((self_in_dispatchConcretize->conditionOrNil)) == null)) {
 		concretizeConditionalInstruction(self_in_dispatchConcretize);
@@ -3405,7 +3399,7 @@
 		return;
 
 	case Literal:
-		concretizeLiteral();
+		concretizeLiteral(self_in_dispatchConcretize);
 		return;
 
 	case AlignmentNops:
@@ -3464,14 +3458,19 @@
 		}
 		assert(jumpTarget1 != 0);
 		jumpTarget = jumpTarget1;
-
-		/* blx ConcreteIPReg */
-
-		instrOffset6 = moveCwintoR(jumpTarget, ConcreteIPReg);
+		/* begin moveCw:intoR: */
+		assert(addressIsInCurrentCompilation((((self_in_dispatchConcretize->dependent))->address)));
 		/* begin machineCodeAt:put: */
+		aWord42 = ldrrnplusimm(self_in_dispatchConcretize, ConcreteIPReg, PC, (((((self_in_dispatchConcretize->dependent))->address)) >= (((self_in_dispatchConcretize->address)) + 8)
+			? 1
+			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord42;
+		self_in_dispatchConcretize;
+		instrOffset6 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		/* begin machineCodeAt:put: */
 		((self_in_dispatchConcretize->machineCode))[instrOffset6 / 4] = ((AL << 28) | ((19922704 | ((1 & 1) << 5)) | ConcreteIPReg));
 		self_in_dispatchConcretize;
-		assert(instrOffset6 == (literalLoadInstructionBytes()));
+		assert(instrOffset6 == (literalLoadInstructionBytes(self_in_dispatchConcretize)));
 		((self_in_dispatchConcretize->machineCodeSize) = instrOffset6 + 4);
 		return;
 
@@ -3497,11 +3496,16 @@
 		}
 		assert(jumpTarget11 != 0);
 		jumpTarget2 = jumpTarget11;
-
-		/* bx ConcreteIPReg */
-
-		instrOffset7 = moveCwintoR(jumpTarget2, ConcreteIPReg);
+		/* begin moveCw:intoR: */
+		assert(addressIsInCurrentCompilation((((self_in_dispatchConcretize->dependent))->address)));
 		/* begin machineCodeAt:put: */
+		aWord43 = ldrrnplusimm(self_in_dispatchConcretize, ConcreteIPReg, PC, (((((self_in_dispatchConcretize->dependent))->address)) >= (((self_in_dispatchConcretize->address)) + 8)
+			? 1
+			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord43;
+		self_in_dispatchConcretize;
+		instrOffset7 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		/* begin machineCodeAt:put: */
 		((self_in_dispatchConcretize->machineCode))[instrOffset7 / 4] = ((AL << 28) | ((19922704 | ((0 & 1) << 5)) | ConcreteIPReg));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = instrOffset7 + 4);
@@ -3520,10 +3524,10 @@
 		}
 		assert(jumpTarget12 != 0);
 		jumpTarget3 = jumpTarget12;
-		offset16 = (((sqInt) jumpTarget3)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset16));
+		offset14 = (((sqInt) jumpTarget3)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset14));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((AL << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset16) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((AL << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset14) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3541,10 +3545,10 @@
 		}
 		assert(jumpTarget13 != 0);
 		jumpTarget4 = jumpTarget13;
-		offset17 = (((sqInt) jumpTarget4)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset17));
+		offset15 = (((sqInt) jumpTarget4)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset15));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((EQ << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset17) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((EQ << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset15) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3562,10 +3566,10 @@
 		}
 		assert(jumpTarget14 != 0);
 		jumpTarget5 = jumpTarget14;
-		offset18 = (((sqInt) jumpTarget5)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset18));
+		offset16 = (((sqInt) jumpTarget5)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset16));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((NE << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset18) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((NE << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset16) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3582,10 +3586,10 @@
 		}
 		assert(jumpTarget15 != 0);
 		jumpTarget6 = jumpTarget15;
-		offset19 = (((sqInt) jumpTarget6)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset19));
+		offset17 = (((sqInt) jumpTarget6)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset17));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((MI << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset19) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((MI << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset17) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3602,10 +3606,10 @@
 		}
 		assert(jumpTarget16 != 0);
 		jumpTarget7 = jumpTarget16;
-		offset20 = (((sqInt) jumpTarget7)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset20));
+		offset18 = (((sqInt) jumpTarget7)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset18));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((PL << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset20) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((PL << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset18) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3622,10 +3626,10 @@
 		}
 		assert(jumpTarget17 != 0);
 		jumpTarget8 = jumpTarget17;
-		offset21 = (((sqInt) jumpTarget8)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset21));
+		offset19 = (((sqInt) jumpTarget8)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset19));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((VS << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset21) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((VS << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset19) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3642,10 +3646,10 @@
 		}
 		assert(jumpTarget18 != 0);
 		jumpTarget9 = jumpTarget18;
-		offset22 = (((sqInt) jumpTarget9)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset22));
+		offset20 = (((sqInt) jumpTarget9)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset20));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((VC << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset22) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((VC << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset20) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3663,10 +3667,10 @@
 		}
 		assert(jumpTarget19 != 0);
 		jumpTarget10 = jumpTarget19;
-		offset23 = (((sqInt) jumpTarget10)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset23));
+		offset21 = (((sqInt) jumpTarget10)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset21));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((CS << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset23) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((CS << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset21) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3684,10 +3688,10 @@
 		}
 		assert(jumpTarget110 != 0);
 		jumpTarget20 = jumpTarget110;
-		offset24 = (((sqInt) jumpTarget20)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset24));
+		offset22 = (((sqInt) jumpTarget20)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset22));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((CC << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset24) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((CC << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset22) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3704,10 +3708,10 @@
 		}
 		assert(jumpTarget111 != 0);
 		jumpTarget21 = jumpTarget111;
-		offset25 = (((sqInt) jumpTarget21)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset25));
+		offset23 = (((sqInt) jumpTarget21)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset23));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((LT << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset25) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((LT << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset23) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3724,10 +3728,10 @@
 		}
 		assert(jumpTarget112 != 0);
 		jumpTarget22 = jumpTarget112;
-		offset26 = (((sqInt) jumpTarget22)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset26));
+		offset24 = (((sqInt) jumpTarget22)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset24));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((GE << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset26) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((GE << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset24) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3744,10 +3748,10 @@
 		}
 		assert(jumpTarget113 != 0);
 		jumpTarget23 = jumpTarget113;
-		offset27 = (((sqInt) jumpTarget23)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset27));
+		offset25 = (((sqInt) jumpTarget23)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset25));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((GT << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset27) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((GT << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset25) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3764,10 +3768,10 @@
 		}
 		assert(jumpTarget114 != 0);
 		jumpTarget24 = jumpTarget114;
-		offset28 = (((sqInt) jumpTarget24)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset28));
+		offset26 = (((sqInt) jumpTarget24)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset26));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((LE << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset28) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((LE << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset26) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3784,10 +3788,10 @@
 		}
 		assert(jumpTarget115 != 0);
 		jumpTarget25 = jumpTarget115;
-		offset29 = (((sqInt) jumpTarget25)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset29));
+		offset27 = (((sqInt) jumpTarget25)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset27));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((HI << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset29) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((HI << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset27) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -3804,10 +3808,10 @@
 		}
 		assert(jumpTarget116 != 0);
 		jumpTarget26 = jumpTarget116;
-		offset30 = (((sqInt) jumpTarget26)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
-		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset30));
+		offset28 = (((sqInt) jumpTarget26)) - (((sqInt) (((self_in_dispatchConcretize->address)) + 8)));
+		assert(isInImmediateJumpRange(self_in_dispatchConcretize, offset28));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((LS << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset30) >> 2) & 0xFFFFFF)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = ((LS << 28) | (((10 | (0 & 1)) << 24) | ((((usqInt) offset28) >> 2) & 0xFFFFFF)));
 		self_in_dispatchConcretize;
 		((self_in_dispatchConcretize->machineCodeSize) = 4);
 		return;
@@ -4056,11 +4060,19 @@
 		constant1 = ((self_in_dispatchConcretize->operands))[0];
 		rn4 = concreteRegister(self_in_dispatchConcretize, ((self_in_dispatchConcretize->operands))[1]);
 		rd2 = rn4;
-		instrOffset12 = moveCwintoR(constant1, ConcreteIPReg);
+		/* begin moveCw:intoR: */
+		assert(addressIsInCurrentCompilation((((self_in_dispatchConcretize->dependent))->address)));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[instrOffset12 / 4] = ((((AL << 28) | ((0 << 25) | ((AddOpcode << 21) | (1 << 20)))) | ((rn4 << 16) | (rd2 << 12))) | (ConcreteIPReg & 0xFFF));
+		aWord44 = ldrrnplusimm(self_in_dispatchConcretize, ConcreteIPReg, PC, (((((self_in_dispatchConcretize->dependent))->address)) >= (((self_in_dispatchConcretize->address)) + 8)
+			? 1
+			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord44;
 		self_in_dispatchConcretize;
-		((self_in_dispatchConcretize->machineCodeSize) = instrOffset12 + 4);
+		instrOffset8 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		/* begin machineCodeAt:put: */
+		((self_in_dispatchConcretize->machineCode))[instrOffset8 / 4] = ((((AL << 28) | ((0 << 25) | ((AddOpcode << 21) | (1 << 20)))) | ((rn4 << 16) | (rd2 << 12))) | (ConcreteIPReg & 0xFFF));
+		self_in_dispatchConcretize;
+		((self_in_dispatchConcretize->machineCodeSize) = instrOffset8 + 4);
 		return;
 
 	l1:	/* end rotateable8bitSignedImmediate:ifTrue:ifFalse: */;
@@ -4134,17 +4146,81 @@
 				return;
 			}
 		}
-		/* begin concretizeDataOperationCwR: */
-		constant2 = ((self_in_dispatchConcretize->operands))[0];
+		/* begin concretizeDataOperationCqR: */
+		val5 = ((self_in_dispatchConcretize->operands))[0];
 		rn5 = concreteRegister(self_in_dispatchConcretize, ((self_in_dispatchConcretize->operands))[1]);
-		rd3 = rn5;
-		instrOffset13 = moveCwintoR(constant2, ConcreteIPReg);
+
+		/* Extra note - if ever a version of this code wants to NOT set the Set flag - Cmp must always have it set or it will pretend to be a SMALALBT and Very Bad Things might happen */
+
+		rd3 = (((self_in_dispatchConcretize->opcode)) == CmpOpcode
+			? 0
+			: rn5);
+		/* begin rotateable8bitImmediate:ifTrue:ifFalse: */
+		if ((val5 & 0xFF) == val5) {
+			/* begin machineCodeAt:put: */
+			((self_in_dispatchConcretize->machineCode))[0 / 4] = ((((AL << 28) | ((1 << 25) | ((AndOpcode << 21) | (1 << 20)))) | ((rn5 << 16) | (rd3 << 12))) | ((((((usqInt) 0) >> 1) << 8) | val5) & 0xFFF));
+			self_in_dispatchConcretize;
+			((self_in_dispatchConcretize->machineCodeSize) = 4);
+			return;
+
+			goto l21;
+		}
+		for (i13 = 2; i13 <= 30; i13 += 2) {
+			if ((val5 & (((0xFF << i13) & 0xFFFFFFFFUL) | (((usqInt) 0xFF) >> (32 - i13)))) == val5) {
+				rot11 = 32 - i13;
+				immediate14 = (((usqInt) val5) >> i13) | ((val5 << (32 - i13)) & 0xFFFFFFFFUL);
+				/* begin machineCodeAt:put: */
+				((self_in_dispatchConcretize->machineCode))[0 / 4] = ((((AL << 28) | ((1 << 25) | ((AndOpcode << 21) | (1 << 20)))) | ((rn5 << 16) | (rd3 << 12))) | ((((((usqInt) rot11) >> 1) << 8) | immediate14) & 0xFFF));
+				self_in_dispatchConcretize;
+				((self_in_dispatchConcretize->machineCodeSize) = 4);
+				return;
+
+				goto l21;
+			}
+		}
+		
+		/* let's try to see if the constant can be made from a simple shift of 0xFFFFFFFF */
+
+		if (val5 > 0) {
+			hb5 = highBit(val5);
+			if ((1 << hb5) == (val5 + 1)) {
+
+				/* MVN temp,  #0, making 0xffffffff */
+
+				/* begin machineCodeAt:put: */
+				aWord45 = mvnimmror(self_in_dispatchConcretize, ConcreteIPReg, 0, 0);
+				((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord45;
+				self_in_dispatchConcretize;
+				/* begin machineCodeAt:put: */
+				aWord116 = dataOpTyperdrnrmlsr(self_in_dispatchConcretize, AndOpcode, rd3, rn5, ConcreteIPReg, 32 - hb5);
+				((self_in_dispatchConcretize->machineCode))[4 / 4] = aWord116;
+				self_in_dispatchConcretize;
+				((self_in_dispatchConcretize->machineCodeSize) = 8);
+				return;
+			}
+		}
+		/* begin concretizeDataOperationCwR: */
+		constant12 = ((self_in_dispatchConcretize->operands))[0];
+		rn24 = concreteRegister(self_in_dispatchConcretize, ((self_in_dispatchConcretize->operands))[1]);
+		rd22 = rn24;
+		/* begin moveCw:intoR: */
+		assert(addressIsInCurrentCompilation((((self_in_dispatchConcretize->dependent))->address)));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[instrOffset13 / 4] = ((((AL << 28) | ((0 << 25) | ((AndOpcode << 21) | (1 << 20)))) | ((rn5 << 16) | (rd3 << 12))) | (ConcreteIPReg & 0xFFF));
+		aWord63 = ldrrnplusimm(self_in_dispatchConcretize, ConcreteIPReg, PC, (((((self_in_dispatchConcretize->dependent))->address)) >= (((self_in_dispatchConcretize->address)) + 8)
+			? 1
+			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord63;
 		self_in_dispatchConcretize;
-		((self_in_dispatchConcretize->machineCodeSize) = instrOffset13 + 4);
+		instrOffset24 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		/* begin machineCodeAt:put: */
+		((self_in_dispatchConcretize->machineCode))[instrOffset24 / 4] = ((((AL << 28) | ((0 << 25) | ((AndOpcode << 21) | (1 << 20)))) | ((rn24 << 16) | (rd22 << 12))) | (ConcreteIPReg & 0xFFF));
+		self_in_dispatchConcretize;
+		((self_in_dispatchConcretize->machineCodeSize) = instrOffset24 + 4);
 		return;
 
+	l21:	/* end rotateable8bitImmediate:ifTrue:ifFalse: */;
+		return;
+
 	l2:	/* end rotateable8bitBitwiseImmediate:ifTrue:ifFalse: */;
 		return;
 
@@ -4212,14 +4288,22 @@
 		}
 		else {
 			/* begin concretizeDataOperationCwR: */
-			constant3 = ((self_in_dispatchConcretize->operands))[0];
+			constant2 = ((self_in_dispatchConcretize->operands))[0];
 			rn6 = concreteRegister(self_in_dispatchConcretize, ((self_in_dispatchConcretize->operands))[1]);
 			rd4 = rn6;
-			instrOffset14 = moveCwintoR(constant3, ConcreteIPReg);
+			/* begin moveCw:intoR: */
+			assert(addressIsInCurrentCompilation((((self_in_dispatchConcretize->dependent))->address)));
 			/* begin machineCodeAt:put: */
-			((self_in_dispatchConcretize->machineCode))[instrOffset14 / 4] = ((((AL << 28) | ((0 << 25) | ((AndOpcode << 21) | (1 << 20)))) | ((rn6 << 16) | (rd4 << 12))) | (ConcreteIPReg & 0xFFF));
+			aWord46 = ldrrnplusimm(self_in_dispatchConcretize, ConcreteIPReg, PC, (((((self_in_dispatchConcretize->dependent))->address)) >= (((self_in_dispatchConcretize->address)) + 8)
+				? 1
+				: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
+			((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord46;
 			self_in_dispatchConcretize;
-			((self_in_dispatchConcretize->machineCodeSize) = instrOffset14 + 4);
+			instrOffset9 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+			/* begin machineCodeAt:put: */
+			((self_in_dispatchConcretize->machineCode))[instrOffset9 / 4] = ((((AL << 28) | ((0 << 25) | ((AndOpcode << 21) | (1 << 20)))) | ((rn6 << 16) | (rd4 << 12))) | (ConcreteIPReg & 0xFFF));
+			self_in_dispatchConcretize;
+			((self_in_dispatchConcretize->machineCodeSize) = instrOffset9 + 4);
 			return;
 		}
 
@@ -4300,14 +4384,22 @@
 			}
 		}
 		/* begin concretizeDataOperationCwR: */
-		constant4 = ((self_in_dispatchConcretize->operands))[0];
+		constant3 = ((self_in_dispatchConcretize->operands))[0];
 		rn7 = concreteRegister(self_in_dispatchConcretize, ((self_in_dispatchConcretize->operands))[1]);
 		rd5 = 0;
-		instrOffset15 = moveCwintoR(constant4, ConcreteIPReg);
+		/* begin moveCw:intoR: */
+		assert(addressIsInCurrentCompilation((((self_in_dispatchConcretize->dependent))->address)));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[instrOffset15 / 4] = ((((AL << 28) | ((0 << 25) | ((CmpOpcode << 21) | (1 << 20)))) | ((rn7 << 16) | (rd5 << 12))) | (ConcreteIPReg & 0xFFF));
+		aWord47 = ldrrnplusimm(self_in_dispatchConcretize, ConcreteIPReg, PC, (((((self_in_dispatchConcretize->dependent))->address)) >= (((self_in_dispatchConcretize->address)) + 8)
+			? 1
+			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord47;
 		self_in_dispatchConcretize;
-		((self_in_dispatchConcretize->machineCodeSize) = instrOffset15 + 4);
+		instrOffset10 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		/* begin machineCodeAt:put: */
+		((self_in_dispatchConcretize->machineCode))[instrOffset10 / 4] = ((((AL << 28) | ((0 << 25) | ((CmpOpcode << 21) | (1 << 20)))) | ((rn7 << 16) | (rd5 << 12))) | (ConcreteIPReg & 0xFFF));
+		self_in_dispatchConcretize;
+		((self_in_dispatchConcretize->machineCodeSize) = instrOffset10 + 4);
 		return;
 
 	l4:	/* end rotateable8bitSignedImmediate:ifTrue:ifFalse: */;
@@ -4315,7 +4407,7 @@
 
 	case OrCqR:
 		/* begin concretizeDataOperationCqR: */
-		val5 = ((self_in_dispatchConcretize->operands))[0];
+		val6 = ((self_in_dispatchConcretize->operands))[0];
 		rn8 = concreteRegister(self_in_dispatchConcretize, ((self_in_dispatchConcretize->operands))[1]);
 
 		/* Extra note - if ever a version of this code wants to NOT set the Set flag - Cmp must always have it set or it will pretend to be a SMALALBT and Very Bad Things might happen */
@@ -4324,21 +4416,21 @@
 			? 0
 			: rn8);
 		/* begin rotateable8bitImmediate:ifTrue:ifFalse: */
-		if ((val5 & 0xFF) == val5) {
+		if ((val6 & 0xFF) == val6) {
 			/* begin machineCodeAt:put: */
-			((self_in_dispatchConcretize->machineCode))[0 / 4] = ((((AL << 28) | ((1 << 25) | ((OrOpcode << 21) | (1 << 20)))) | ((rn8 << 16) | (rd6 << 12))) | ((((((usqInt) 0) >> 1) << 8) | val5) & 0xFFF));
+			((self_in_dispatchConcretize->machineCode))[0 / 4] = ((((AL << 28) | ((1 << 25) | ((OrOpcode << 21) | (1 << 20)))) | ((rn8 << 16) | (rd6 << 12))) | ((((((usqInt) 0) >> 1) << 8) | val6) & 0xFFF));
 			self_in_dispatchConcretize;
 			((self_in_dispatchConcretize->machineCodeSize) = 4);
 			return;
 
 			goto l17;
 		}
-		for (i10 = 2; i10 <= 30; i10 += 2) {
-			if ((val5 & (((0xFF << i10) & 0xFFFFFFFFUL) | (((usqInt) 0xFF) >> (32 - i10)))) == val5) {
-				rot10 = 32 - i10;
-				immediate15 = (((usqInt) val5) >> i10) | ((val5 << (32 - i10)) & 0xFFFFFFFFUL);
+		for (i14 = 2; i14 <= 30; i14 += 2) {
+			if ((val6 & (((0xFF << i14) & 0xFFFFFFFFUL) | (((usqInt) 0xFF) >> (32 - i14)))) == val6) {
+				rot12 = 32 - i14;
+				immediate15 = (((usqInt) val6) >> i14) | ((val6 << (32 - i14)) & 0xFFFFFFFFUL);
 				/* begin machineCodeAt:put: */
-				((self_in_dispatchConcretize->machineCode))[0 / 4] = ((((AL << 28) | ((1 << 25) | ((OrOpcode << 21) | (1 << 20)))) | ((rn8 << 16) | (rd6 << 12))) | ((((((usqInt) rot10) >> 1) << 8) | immediate15) & 0xFFF));
+				((self_in_dispatchConcretize->machineCode))[0 / 4] = ((((AL << 28) | ((1 << 25) | ((OrOpcode << 21) | (1 << 20)))) | ((rn8 << 16) | (rd6 << 12))) | ((((((usqInt) rot12) >> 1) << 8) | immediate15) & 0xFFF));
 				self_in_dispatchConcretize;
 				((self_in_dispatchConcretize->machineCodeSize) = 4);
 				return;
@@ -4349,33 +4441,41 @@
 		
 		/* let's try to see if the constant can be made from a simple shift of 0xFFFFFFFF */
 
-		if (val5 > 0) {
-			hb5 = highBit(val5);
-			if ((1 << hb5) == (val5 + 1)) {
+		if (val6 > 0) {
+			hb6 = highBit(val6);
+			if ((1 << hb6) == (val6 + 1)) {
 
 				/* MVN temp,  #0, making 0xffffffff */
 
 				/* begin machineCodeAt:put: */
-				aWord41 = mvnimmror(self_in_dispatchConcretize, ConcreteIPReg, 0, 0);
-				((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord41;
+				aWord48 = mvnimmror(self_in_dispatchConcretize, ConcreteIPReg, 0, 0);
+				((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord48;
 				self_in_dispatchConcretize;
 				/* begin machineCodeAt:put: */
-				aWord119 = dataOpTyperdrnrmlsr(self_in_dispatchConcretize, OrOpcode, rd6, rn8, ConcreteIPReg, 32 - hb5);
-				((self_in_dispatchConcretize->machineCode))[4 / 4] = aWord119;
+				aWord117 = dataOpTyperdrnrmlsr(self_in_dispatchConcretize, OrOpcode, rd6, rn8, ConcreteIPReg, 32 - hb6);
+				((self_in_dispatchConcretize->machineCode))[4 / 4] = aWord117;
 				self_in_dispatchConcretize;
 				((self_in_dispatchConcretize->machineCodeSize) = 8);
 				return;
 			}
 		}
 		/* begin concretizeDataOperationCwR: */
-		constant14 = ((self_in_dispatchConcretize->operands))[0];
-		rn24 = concreteRegister(self_in_dispatchConcretize, ((self_in_dispatchConcretize->operands))[1]);
-		rd22 = rn24;
-		instrOffset26 = moveCwintoR(constant14, ConcreteIPReg);
+		constant13 = ((self_in_dispatchConcretize->operands))[0];
+		rn25 = concreteRegister(self_in_dispatchConcretize, ((self_in_dispatchConcretize->operands))[1]);
+		rd23 = rn25;
+		/* begin moveCw:intoR: */
+		assert(addressIsInCurrentCompilation((((self_in_dispatchConcretize->dependent))->address)));
 		/* begin machineCodeAt:put: */
-		((self_in_dispatchConcretize->machineCode))[instrOffset26 / 4] = ((((AL << 28) | ((0 << 25) | ((OrOpcode << 21) | (1 << 20)))) | ((rn24 << 16) | (rd22 << 12))) | (ConcreteIPReg & 0xFFF));
+		aWord64 = ldrrnplusimm(self_in_dispatchConcretize, ConcreteIPReg, PC, (((((self_in_dispatchConcretize->dependent))->address)) >= (((self_in_dispatchConcretize->address)) + 8)
+			? 1
+			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
+		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord64;
 		self_in_dispatchConcretize;
-		((self_in_dispatchConcretize->machineCodeSize) = instrOffset26 + 4);
+		instrOffset25 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		/* begin machineCodeAt:put: */

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list