[Vm-dev] [commit][3635] CogVM source as per VMMaker.oscog-eem.1709

commits at squeakvm.org commits at squeakvm.org
Fri Mar 4 19:06:31 UTC 2016


Revision: 3635
Author:   eliot
Date:     2016-03-04 11:06:25 -0800 (Fri, 04 Mar 2016)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1709

General:
Nuke unused named prim primitiveOriginalMillisecondClock so VM can eliminate
ioOldMSecs.

Nuke ioOldMSecs and ioLowResMSecs to simplify the tiume management and avoid
mistakes were we use different versions of clocks for different parts of the
same basic io operations.  Nuke SqueakUIFlushUseHighPercisionClock preference.

Change vm parameter 65 to be a set of flags, not merely the boolean for
MULTIPLE_BYTECODE_SETS, and make the flags answer MULTIPLE_BYTECODE_SETS &
IMMUTABILITY.

Cogit:
Revise the register saving convention for trampoline calls.  Instead of passing
in a boolean to indicate if all registers should be saved or not (an aproach
Ryan correctly notes is bogus), pass in a register mask of registers to be
saved.  If the trampoline call has a machine code continuation then the
argument is usually callerSavedRegMask, and on MIPS and ARM this is empty.

Use the above to move the saving of registers in the store-check into the
store-check trampoline and out of the call of the trampoline.  Further, use
genJumpImmediate: in the immediate test, which saves an instruction.

Fix immutability support in the Cogit by making sure that the Slang output for
the bytecode generatorTable marks inst var store bytecode generators as mapped
if IMMUTABILITY is set.

Add a PC map printer to the Cogit (used to debug the above issue).

Plugins:
Update primitiveFileRead for Spur.  It doesn't need the PrimErrObjectMayMove
handling since Spur has pinning.

Build system:
Fix dependency files so that they apply to all builds, production, assert &
debug, not just the one during which they were generated.

Modified Paths:
--------------
    branches/Cog/build.macos32x86/common/Makefile.plugin
    branches/Cog/build.macos32x86/common/Makefile.rules
    branches/Cog/build.macos32x86/common/Makefile.vm
    branches/Cog/build.macos64x64/common/Makefile.plugin
    branches/Cog/build.macos64x64/common/Makefile.rules
    branches/Cog/build.macos64x64/common/Makefile.vm
    branches/Cog/build.win32x86/common/Makefile.rules
    branches/Cog/nsspur64src/vm/cogit.h
    branches/Cog/nsspur64src/vm/cogitX64.c
    branches/Cog/nsspur64src/vm/cointerp.c
    branches/Cog/nsspur64src/vm/cointerp.h
    branches/Cog/nsspur64src/vm/gcc3x-cointerp.c
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cogitARMv5.c
    branches/Cog/nsspursrc/vm/cogitIA32.c
    branches/Cog/nsspursrc/vm/cogitMIPSEL.c
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspurstack64src/vm/gcc3x-interp.c
    branches/Cog/nsspurstack64src/vm/interp.c
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/platforms/Cross/vm/sq.h
    branches/Cog/platforms/Mac OS/plugins/HostWindowPlugin/sqMacHostWindow.h
    branches/Cog/platforms/Mac OS/plugins/SocketPlugin/sqMacNetwork.c
    branches/Cog/platforms/Mac OS/vm/sqMacMain.c
    branches/Cog/platforms/Mac OS/vm/sqMacTime.c
    branches/Cog/platforms/Mac OS/vm/sqMacTime.h
    branches/Cog/platforms/Mac OS/vm/sqMacUIEvents.c
    branches/Cog/platforms/Mac OS/vm/sqMacUIEventsUniversal.c
    branches/Cog/platforms/Mac OS/vm/sqMacWindow.c
    branches/Cog/platforms/Mac OS/vm/sqMacWindowUniversal.c
    branches/Cog/platforms/Mac OS/vm/sqPlatformSpecific.h
    branches/Cog/platforms/Plan9/vm/sqPlan9io.c
    branches/Cog/platforms/Plan9/vm/sqPlatformSpecific.h
    branches/Cog/platforms/RiscOS/vm/sqPlatformSpecific.h
    branches/Cog/platforms/RiscOS/vm/sqRPCEvents.c
    branches/Cog/platforms/iOS/vm/Common/Classes/sqMacV2Time.c
    branches/Cog/platforms/iOS/vm/Common/Classes/sqSqueakMainApp.m
    branches/Cog/platforms/iOS/vm/Common/Classes/sqSqueakMainApplication.h
    branches/Cog/platforms/iOS/vm/Common/Classes/sqSqueakMainApplication.m
    branches/Cog/platforms/iOS/vm/OSX/Newspeak-Info.plist
    branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXInfoPlistInterface.m
    branches/Cog/platforms/unix/misc/threadValidate/sqUnixHeartbeat.c
    branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c
    branches/Cog/platforms/unix/vm/aio.c
    branches/Cog/platforms/unix/vm/sqPlatformSpecific.h
    branches/Cog/platforms/unix/vm/sqUnixEvent.c
    branches/Cog/platforms/unix/vm/sqUnixGlobals.h
    branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c
    branches/Cog/platforms/unix/vm/sqUnixITimerHeartbeat.c
    branches/Cog/platforms/unix/vm/sqUnixITimerTickerHeartbeat.c
    branches/Cog/platforms/unix/vm/sqUnixMain.c
    branches/Cog/platforms/unix/vm/sqaio.h
    branches/Cog/platforms/unix/vm-display-Quartz/sqUnixQuartz.m
    branches/Cog/platforms/unix/vm-display-X11/sqUnixX11.c
    branches/Cog/platforms/win32/vm/sqPlatformSpecific.h
    branches/Cog/platforms/win32/vm/sqWin32Heartbeat.c
    branches/Cog/platforms/win32/vm/sqWin32Time.c
    branches/Cog/spur64src/vm/cogit.h
    branches/Cog/spur64src/vm/cogitX64.c
    branches/Cog/spur64src/vm/cointerp.c
    branches/Cog/spur64src/vm/cointerp.h
    branches/Cog/spur64src/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/cogitMIPSEL.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/cogitMIPSEL.c
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spurstack64src/vm/gcc3x-interp.c
    branches/Cog/spurstack64src/vm/interp.c
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/src/plugins/FilePlugin/FilePlugin.c
    branches/Cog/src/vm/cogit.h
    branches/Cog/src/vm/cogitARMv5.c
    branches/Cog/src/vm/cogitIA32.c
    branches/Cog/src/vm/cogitMIPSEL.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
    branches/Cog/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c

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

Modified: branches/Cog/build.macos32x86/common/Makefile.plugin
===================================================================
--- branches/Cog/build.macos32x86/common/Makefile.plugin	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/build.macos32x86/common/Makefile.plugin	2016-03-04 19:06:25 UTC (rev 3635)
@@ -177,6 +177,9 @@
 	sed "s/\$$(VERSION)/`getversion VERSION_TAG`/" $< | \
 	sed "s/\$(LIBNAME)/$(LIBNAME)/" > $(PLUGINPLIST)
 
+getversion:
+	make -f ../common/Makefile.vm getversion
+
 else # ifeq ($(realpath $(PREREQUISITES)),$(PREREQUISITES))
 # If any prerequisites are missing simply create a .ignore file
 

Modified: branches/Cog/build.macos32x86/common/Makefile.rules
===================================================================
--- branches/Cog/build.macos32x86/common/Makefile.rules	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/build.macos32x86/common/Makefile.rules	2016-03-04 19:06:25 UTC (rev 3635)
@@ -13,8 +13,7 @@
 
 DEPFLAGS = -MT $@ -MMD -MP -MF deps/$(*F).Td
 ALLFLAGS = $(DEPFLAGS) $(WARNINGS) $(CFLAGS)
-#POSTCOMPILE = mv -f deps/$(*F).Td deps/$(*F).d
-POSTCOMPILE = sed '/^$$/d' <deps/$(*F).Td | sed '/^.*:$$/d' > deps/$(*F).d; rm deps/$(*F).Td; touch -r $< deps/$(*F).d
+POSTCOMPILE = sed '/^$$/d' <deps/$(*F).Td | sed '/^.*:$$/d' | sed 's/^build[^/]*/$$(BUILD)/' > deps/$(*F).d; rm deps/$(*F).Td; touch -r $< deps/$(*F).d
 
 $(OBJDIR)/%.o: %.c deps/%.d
 	$(CC) -x c $(ALLFLAGS) $(INCLUDES) -c $< -o $@

Modified: branches/Cog/build.macos32x86/common/Makefile.vm
===================================================================
--- branches/Cog/build.macos32x86/common/Makefile.vm	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/build.macos32x86/common/Makefile.vm	2016-03-04 19:06:25 UTC (rev 3635)
@@ -210,10 +210,7 @@
 # Internal plugin.  Build as lib then link in lib
 # Check for Makefile in iOS plugins directory otherwise use default Makefile
 # N.B.  PLATDIR *must* be a relative path for this to work
-$(OBJDIR)/%.lib: getversion $(call plugin-makefile,$(*F)) $(wildcard $(*F).ignore) \
-					$(wildcard $(PLUGINSRCDIR)/$(*F)/*.c) \
-					$(wildcard $(PLATDIR)/Cross/plugins/$(*F)/*.*) \
-					$(wildcard $(OSXPLUGINSDIR)/$(*F)/*.*)
+$(OBJDIR)/%.lib: FORCE
 	@-mkdir -p $(BLDDIR)/$(*F)
 	test $@ -ot $(call plugin-makefile,$(*F)) && rm -rf $(BUILD)/vm/$(*F).* || true
 	rm -f $(BUILD)/vm/$(*F).ignore
@@ -237,10 +234,7 @@
 
 # External plugin.  Build as bundle and copy to vm dir ($(OBJDIR)).
 # Check for Makefile in iOS plugins directory otherwise use default Makefile
-$(OBJDIR)/%.bundle:	getversion $(call plugin-makefile,$(*F)) $(wildcard $(*F).ignore) \
-					$(wildcard $(PLUGINSRCDIR)/$(*F)/*.c) \
-					$(wildcard $(PLATDIR)/Cross/plugins/$(*F)/*.*) \
-					$(wildcard $(OSXPLUGINSDIR)/$(*F)/*.*)
+$(OBJDIR)/%.bundle:	FORCE
 	@-mkdir -p $(BLDDIR)/$(*F)
 	test $@ -ot $(call plugin-makefile,$(*F)) && rm -rf $(BUILD)/vm/$(*F).* || true
 	rm -f $(BUILD)/vm/$(*F).ignore
@@ -256,6 +250,8 @@
 #%.bundle: $(OBJDIR)/%.bundle
 #	make $(MAKEFLAGS) $<
 
+FORCE:
+
 .PRECIOUS: $(OBJDIR)/%.lib $(OBJDIR)/%.bundle
 
 #############################################################################

Modified: branches/Cog/build.macos64x64/common/Makefile.plugin
===================================================================
--- branches/Cog/build.macos64x64/common/Makefile.plugin	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/build.macos64x64/common/Makefile.plugin	2016-03-04 19:06:25 UTC (rev 3635)
@@ -177,6 +177,9 @@
 	sed "s/\$$(VERSION)/`getversion VERSION_TAG`/" $< | \
 	sed "s/\$(LIBNAME)/$(LIBNAME)/" > $(PLUGINPLIST)
 
+getversion:
+	make -f ../common/Makefile.vm getversion
+
 else # ifeq ($(realpath $(PREREQUISITES)),$(PREREQUISITES))
 # If any prerequisites are missing simply create a .ignore file
 

Modified: branches/Cog/build.macos64x64/common/Makefile.rules
===================================================================
--- branches/Cog/build.macos64x64/common/Makefile.rules	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/build.macos64x64/common/Makefile.rules	2016-03-04 19:06:25 UTC (rev 3635)
@@ -14,7 +14,7 @@
 DEPFLAGS = -MT $@ -MMD -MP -MF deps/$(*F).Td
 ALLFLAGS = $(DEPFLAGS) $(WARNINGS) $(CFLAGS)
 #POSTCOMPILE = mv -f deps/$(*F).Td deps/$(*F).d
-POSTCOMPILE = sed '/^$$/d' <deps/$(*F).Td | sed '/^.*:$$/d' > deps/$(*F).d; rm deps/$(*F).Td; touch -r $< deps/$(*F).d
+POSTCOMPILE = sed '/^$$/d' <deps/$(*F).Td | sed '/^.*:$$/d' | sed 's/^build[^/]*/$$(BUILD)/' > deps/$(*F).d; rm deps/$(*F).Td; touch -r $< deps/$(*F).d
 
 $(OBJDIR)/%.o: %.c deps/%.d
 	$(CC) -x c $(ALLFLAGS) $(INCLUDES) -c $< -o $@

Modified: branches/Cog/build.macos64x64/common/Makefile.vm
===================================================================
--- branches/Cog/build.macos64x64/common/Makefile.vm	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/build.macos64x64/common/Makefile.vm	2016-03-04 19:06:25 UTC (rev 3635)
@@ -210,10 +210,7 @@
 # Internal plugin.  Build as lib then link in lib
 # Check for Makefile in iOS plugins directory otherwise use default Makefile
 # N.B.  PLATDIR *must* be a relative path for this to work
-$(OBJDIR)/%.lib: getversion $(call plugin-makefile,$(*F)) $(wildcard $(*F).ignore) \
-					$(wildcard $(PLUGINSRCDIR)/$(*F)/*.c) \
-					$(wildcard $(PLATDIR)/Cross/plugins/$(*F)/*.*) \
-					$(wildcard $(OSXPLUGINSDIR)/$(*F)/*.*)
+$(OBJDIR)/%.lib: FORCE
 	@-mkdir -p $(BLDDIR)/$(*F)
 	test $@ -ot $(call plugin-makefile,$(*F)) && rm -rf $(BUILD)/vm/$(*F).* || true
 	rm -f $(BUILD)/vm/$(*F).ignore
@@ -237,10 +234,7 @@
 
 # External plugin.  Build as bundle and copy to vm dir ($(OBJDIR)).
 # Check for Makefile in iOS plugins directory otherwise use default Makefile
-$(OBJDIR)/%.bundle:	getversion $(call plugin-makefile,$(*F)) $(wildcard $(*F).ignore) \
-					$(wildcard $(PLUGINSRCDIR)/$(*F)/*.c) \
-					$(wildcard $(PLATDIR)/Cross/plugins/$(*F)/*.*) \
-					$(wildcard $(OSXPLUGINSDIR)/$(*F)/*.*)
+$(OBJDIR)/%.bundle:	FORCE
 	@-mkdir -p $(BLDDIR)/$(*F)
 	test $@ -ot $(call plugin-makefile,$(*F)) && rm -rf $(BUILD)/vm/$(*F).* || true
 	rm -f $(BUILD)/vm/$(*F).ignore
@@ -256,6 +250,8 @@
 #%.bundle: $(OBJDIR)/%.bundle
 #	make $(MAKEFLAGS) $<
 
+FORCE:
+
 .PRECIOUS: $(OBJDIR)/%.lib $(OBJDIR)/%.bundle
 
 #############################################################################

Modified: branches/Cog/build.win32x86/common/Makefile.rules
===================================================================
--- branches/Cog/build.win32x86/common/Makefile.rules	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/build.win32x86/common/Makefile.rules	2016-03-04 19:06:25 UTC (rev 3635)
@@ -16,7 +16,7 @@
 
 DEPFLAGS = -MT $@ -MMD -MP -MF deps/$(*F).Td
 ALLFLAGS = $(DEPFLAGS) $(CFLAGS) $(INCLUDES) $(DEFS)
-POSTCOMPILE = sed '/^$$/d' <deps/$(*F).Td | sed '/^.*:$$/d' > deps/$(*F).d; rm deps/$(*F).Td; touch -r $< deps/$(*F).d
+POSTCOMPILE = sed '/^$$/d' <deps/$(*F).Td | sed '/^.*:$$/d' | sed 's/^build[^/]*/$$(BUILD)/' > deps/$(*F).d; rm deps/$(*F).Td; touch -r $< deps/$(*F).d
 
 $(OBJDIR)/%.o: %.c deps/%.d
 	$(CC) -x c $(ALLFLAGS) $(INCLUDES) -c $< -o $@

Modified: branches/Cog/nsspur64src/vm/cogit.h
===================================================================
--- branches/Cog/nsspur64src/vm/cogit.h	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/nsspur64src/vm/cogit.h	2016-03-04 19:06:25 UTC (rev 3635)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1703 uuid: 9bd9e03b-fbe7-450c-8adc-5e20f7d76cdf
+	CCodeGenerator VMMaker.oscog-eem.1709 uuid: 10ded6ee-4717-4e34-84d0-9c501aed252b
  */
 
 
@@ -58,6 +58,7 @@
 extern sqInt mnuOffset(void);
 extern sqInt patchToOpenPICFornumArgsreceiver(sqInt selector, sqInt numArgs, sqInt receiver);
 extern void printCogMethodFor(void *address);
+extern void printPCMapPairsFor(CogMethod *cogMethod);
 extern void printTrampolineTable(void);
 extern sqInt recordPrimTraceFunc(void);
 extern void setBreakMethod(sqInt anObj);

Modified: branches/Cog/nsspur64src/vm/cogitX64.c
===================================================================
--- branches/Cog/nsspur64src/vm/cogitX64.c	2016-02-28 21:58:34 UTC (rev 3634)
+++ branches/Cog/nsspur64src/vm/cogitX64.c	2016-03-04 19:06:25 UTC (rev 3635)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1703 uuid: 9bd9e03b-fbe7-450c-8adc-5e20f7d76cdf
+	CCodeGenerator VMMaker.oscog-eem.1707 uuid: 6073be04-c0ce-4791-8ada-b2d1ec54f4a4
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1703 uuid: 9bd9e03b-fbe7-450c-8adc-5e20f7d76cdf
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1707 uuid: 6073be04-c0ce-4791-8ada-b2d1ec54f4a4
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1703 uuid: 9bd9e03b-fbe7-450c-8adc-5e20f7d76cdf " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1707 uuid: 6073be04-c0ce-4791-8ada-b2d1ec54f4a4 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -108,6 +108,7 @@
 #define IsDirectedSuperSend 9
 #define IsDisplacementX2N 0
 #define IsNSDynamicSuperSend 11
+#define IsNSImplicitReceiverSend 12
 #define IsNSSelfSend 10
 #define IsNSSendCall 6
 #define IsObjectReference 2
@@ -401,7 +402,6 @@
 static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask);
 static AbstractInstruction * NoDbgRegParms cloneLiteralFrom(AbstractInstruction * self_in_cloneLiteralFrom, AbstractInstruction *existingLiteral);
 static sqInt NoDbgRegParms concretizeAt(AbstractInstruction * self_in_concretizeAt, sqInt actualAddress);
-static sqInt NoDbgRegParms genAlignCStackSavingRegistersnumArgswordAlignment(AbstractInstruction * self_in_genAlignCStackSavingRegistersnumArgswordAlignment, sqInt saveRegs, sqInt numArgs, sqInt alignment);
 static AbstractInstruction * NoDbgRegParms genWriteCResultIntoReg(AbstractInstruction * self_in_genWriteCResultIntoReg, sqInt abstractRegister);
 static AbstractInstruction * NoDbgRegParms getJmpTarget(AbstractInstruction * self_in_getJmpTarget);
 static sqInt NoDbgRegParms inCurrentCompilation(AbstractInstruction * self_in_inCurrentCompilation, sqInt operand);
@@ -454,7 +454,6 @@
 static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg);
 extern sqInt bytecodePCForstartBcpcin(sqInt mcpc, sqInt startbcpc, CogBlockMethod *cogMethod);
 static AbstractInstruction * NoDbgRegParms CallNewspeakSend(sqInt callTarget);
-static AbstractInstruction * NoDbgRegParms CallRTregistersToBeSavedMask(sqInt callTarget, sqInt registersToBeSaved);
 static AbstractInstruction * NoDbgRegParms gCall(sqInt callTarget);
 static AbstractInstruction * NoDbgRegParms gCmpCqR(sqInt quickConstant, sqInt reg);
 static AbstractInstruction * NoDbgRegParms gCmpCwR(sqInt wordConstant, sqInt reg);
@@ -485,12 +484,12 @@
 static AbstractInstruction * compileAbort(void);
 static sqInt NoDbgRegParms compileBlockDispatchFromto(sqInt lowBlockStartIndex, sqInt highBlockStartIndex);
 static void NoDbgRegParms compileBlockEntry(BlockStart *blockStart);
-static void NoDbgRegParms compileCallFornumArgsargargargargresultRegsaveRegs(void *aRoutine, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt resultRegOrNone, sqInt saveRegs);
+static void NoDbgRegParms compileCallFornumArgsargargargargresultRegregsToSave(void *aRoutine, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt resultRegOrNone, sqInt regMask);
 static AbstractInstruction * compileCPICEntry(void);
 static void compileEntry(void);
 static sqInt compileMethodBody(void);
 static sqInt NoDbgRegParms compilePICAbort(sqInt numArgs);
-static void NoDbgRegParms compileTrampolineFornumArgsargargargargsaveRegspushLinkRegresultReg(void *aRoutine, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt saveRegs, sqInt pushLinkReg, sqInt resultRegOrNone);
+static void NoDbgRegParms compileTrampolineFornumArgsargargargargregsToSavepushLinkRegresultReg(void *aRoutine, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt regMask, sqInt pushLinkReg, sqInt resultRegOrNone);
 static void computeEntryOffsets(void);
 static void computeMaximumSizes(void);
 static sqInt NoDbgRegParms configureCPICCase0Case1MethodtagisMNUCasenumArgsdelta(CogMethod *cPIC, CogMethod *case0CogMethod, sqInt case1Method, sqInt case1Tag, sqInt isMNUCase, sqInt numArgs, sqInt addrDelta);
@@ -541,16 +540,17 @@
 static sqInt genNonLocalReturnTrampoline(void);
 static sqInt NoDbgRegParms genNSSendTrampolineFornumArgsenclosingObjectCheckcalled(void *aRoutine, sqInt numArgs, sqInt eoCheckFlag, char *aString);
 static sqInt NoDbgRegParms genReturnTrampolineForcalledarg(void *aRoutine, char *aString, sqInt regOrConst0);
-static sqInt NoDbgRegParms genSafeTrampolineForcalled(void *aRoutine, char *aString);
-static sqInt NoDbgRegParms genSafeTrampolineForcalledarg(void *aRoutine, char *aString, sqInt regOrConst0);
-static sqInt NoDbgRegParms genSafeTrampolineForcalledargarg(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1);
 static sqInt NoDbgRegParms genSmalltalkToCStackSwitch(sqInt pushLinkReg);
 static sqInt NoDbgRegParms genTrampolineForcalled(void *aRoutine, char *aString);
 static sqInt NoDbgRegParms genTrampolineForcalledargargarg(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2);
 static sqInt NoDbgRegParms genTrampolineForcalledargargargresult(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt resultReg);
+static sqInt NoDbgRegParms genTrampolineForcalledargargregsToSave(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regMask);
 static sqInt NoDbgRegParms genTrampolineForcalledargargresult(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt resultReg);
+static sqInt NoDbgRegParms genTrampolineForcalledargregsToSave(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regMask);
+static sqInt NoDbgRegParms genTrampolineForcalledargregsToSaveresult(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regMask, sqInt resultReg);
 static sqInt NoDbgRegParms genTrampolineForcalledargresult(void *aRoutine, char *aString, sqInt regOrConst0, sqInt resultReg);
-static sqInt NoDbgRegParms genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(void *aRoutine, char *trampolineName, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt saveRegs, sqInt pushLinkReg, sqInt resultRegOrNone, sqInt appendBoolean);
+static sqInt NoDbgRegParms genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(void *aRoutine, char *trampolineName, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt regMask, sqInt pushLinkReg, sqInt resultRegOrNone, sqInt appendBoolean);
+static sqInt NoDbgRegParms genTrampolineForcalledregsToSave(void *aRoutine, char *aString, sqInt regMask);
 static AbstractInstruction * NoDbgRegParms gen(sqInt opcode);
 static AbstractInstruction * NoDbgRegParms genoperand(sqInt opcode, sqInt operand);
 static AbstractInstruction * NoDbgRegParms genoperandoperand(sqInt opcode, sqInt operandOne, sqInt operandTwo);
@@ -624,6 +624,7 @@
 static sqInt picInterpretAbortOffset(void);
 static AbstractInstruction * previousInstruction(void);
 extern void printCogMethodFor(void *address);
+extern void printPCMapPairsFor(CogMethod *cogMethod);
 extern void printTrampolineTable(void);
 static sqInt processorHasDivQuoRemAndMClassIsSmallInteger(void);
 static sqInt processorHasMultiplyAndMClassIsSmallInteger(void);
@@ -633,7 +634,6 @@
 static void recordRunTimeObjectReferences(void);
 static sqInt NoDbgRegParms registerMaskFor(sqInt reg);
 static sqInt NoDbgRegParms registerMaskForand(sqInt reg1, sqInt reg2);
-static sqInt NoDbgRegParms registerMaskForandandandandandandandand(sqInt reg1, sqInt reg2, sqInt reg3, sqInt reg4, sqInt reg5, sqInt reg6, sqInt reg7, sqInt reg8, sqInt reg9);
 static void NoDbgRegParms relocateCallsAndSelfReferencesInMethod(CogMethod *cogMethod);
 static void NoDbgRegParms relocateCallsInClosedPIC(CogMethod *cPIC);
 static sqInt NoDbgRegParms relocateIfCallOrMethodReferencemcpcdelta(sqInt annotation, char *mcpc, sqInt refDelta);
@@ -885,9 +885,9 @@
 static AbstractInstruction * NoDbgRegParms genPushRegisterArgsForAbortMissNumArgs(AbstractInstruction * self_in_genPushRegisterArgsForAbortMissNumArgs, sqInt numArgs);
 static AbstractInstruction * NoDbgRegParms genPushRegisterArgsForNumArgsscratchReg(AbstractInstruction * self_in_genPushRegisterArgsForNumArgsscratchReg, sqInt numArgs, sqInt scratchReg);
 static sqInt NoDbgRegParms genRemoveNArgsFromStack(AbstractInstruction * self_in_genRemoveNArgsFromStack, sqInt n);
-static sqInt NoDbgRegParms genRestoreRegs(AbstractInstruction * self_in_genRestoreRegs);
 static sqInt NoDbgRegParms genRestoreRegsExcept(AbstractInstruction * self_in_genRestoreRegsExcept, sqInt preservedReg);
-static sqInt NoDbgRegParms genSaveRegsForCCall(AbstractInstruction * self_in_genSaveRegsForCCall);
+static sqInt NoDbgRegParms genRestoreRegs(AbstractInstruction * self_in_genRestoreRegs, sqInt regMask);
+static sqInt NoDbgRegParms genSaveRegs(AbstractInstruction * self_in_genSaveRegs, sqInt regMask);
 static sqInt NoDbgRegParms genSaveStackPointers(AbstractInstruction * self_in_genSaveStackPointers);
 static AbstractInstruction * NoDbgRegParms genSubstituteReturnAddress(AbstractInstruction * self_in_genSubstituteReturnAddress, sqInt retpc);
 static sqInt NoDbgRegParms instructionSizeAt(AbstractInstruction * self_in_instructionSizeAt, sqInt pc);
@@ -1343,14 +1343,14 @@
 	{ genPushLiteralVariableBytecode, 0, needsFrameNever, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genPushLiteralVariableBytecode, 0, needsFrameNever, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genPushLiteralVariableBytecode, 0, needsFrameNever, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
 	{ genStoreAndPopTemporaryVariableBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genStoreAndPopTemporaryVariableBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genStoreAndPopTemporaryVariableBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
@@ -1376,8 +1376,8 @@
 	{ unknownBytecode, 0, 0, 0, Nop, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
 	{ unknownBytecode, 0, 0, 0, Nop, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
 	{ extendedPushBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ extendedStoreBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ extendedStoreAndPopBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+	{ extendedStoreBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ extendedStoreAndPopBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
 	{ genExtendedSendBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
 	{ doubleExtendedDoAnythingBytecode, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
 	{ genExtendedSuperBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 1, 0 },
@@ -1679,14 +1679,14 @@
 	{ genSendAbsentImplicit0ArgsBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
 	{ genSendAbsentImplicit0ArgsBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
 	{ genSendAbsentImplicit0ArgsBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genStoreAndPopReceiverVariableBytecode, 0, needsFrameIfImmutability, -1, 0, 1, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
 	{ genStoreAndPopTemporaryVariableBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genStoreAndPopTemporaryVariableBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genStoreAndPopTemporaryVariableBytecode, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
@@ -1735,11 +1735,11 @@
 	{ genExtPushIntegerBytecode, 0, needsFrameNever, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genLongPushTemporaryVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genPushNewArrayBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ genExtStoreReceiverVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genExtStoreLiteralVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+	{ genExtStoreReceiverVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genExtStoreLiteralVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 0, 0 },
 	{ genLongStoreTemporaryVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ genExtStoreAndPopReceiverVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ genExtStoreAndPopLiteralVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+	{ genExtStoreAndPopReceiverVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 1, 0 },
+	{ genExtStoreAndPopLiteralVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, IMMUTABILITY, 0, 0, 0, 0 },
 	{ genLongStoreAndPopTemporaryVariableBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genExtSendBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
 	{ genExtSendSuperBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
@@ -1925,19 +1925,19 @@
 availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask)
 {
 	flag("searching physical registers that are not assigned to abstract registers first will do a better job and allocate with fewer conflicts.  But this will be much easier if we use the same range for concrete and abstract registers (0-N) and simply number abstract registers the same as their corresponding concrete registers.");
-	if (!(liveRegsMask & (registerMaskFor(Arg1Reg)))) {
+	if (!(liveRegsMask & (1LL << Arg1Reg))) {
 		return Arg1Reg;
 	}
-	if (!(liveRegsMask & (registerMaskFor(Arg0Reg)))) {
+	if (!(liveRegsMask & (1LL << Arg0Reg))) {
 		return Arg0Reg;
 	}
-	if (!(liveRegsMask & (registerMaskFor(SendNumArgsReg)))) {
+	if (!(liveRegsMask & (1LL << SendNumArgsReg))) {
 		return SendNumArgsReg;
 	}
-	if (!(liveRegsMask & (registerMaskFor(ClassReg)))) {
+	if (!(liveRegsMask & (1LL << ClassReg))) {
 		return ClassReg;
 	}
-	if (!(liveRegsMask & (registerMaskFor(ReceiverResultReg)))) {
+	if (!(liveRegsMask & (1LL << ReceiverResultReg))) {
 		return ReceiverResultReg;
 	}
 	return NoReg;
@@ -1976,30 +1976,6 @@
 	return actualAddress + ((self_in_concretizeAt->machineCodeSize));
 }
 
-	/* CogAbstractInstruction>>#genAlignCStackSavingRegisters:numArgs:wordAlignment: */
-static sqInt NoDbgRegParms
-genAlignCStackSavingRegistersnumArgswordAlignment(AbstractInstruction * self_in_genAlignCStackSavingRegistersnumArgswordAlignment, sqInt saveRegs, sqInt numArgs, sqInt alignment)
-{
-    AbstractInstruction *anInstruction;
-    sqInt delta;
-    sqInt wordsPushedModAlignment;
-
-	if ((numIntRegArgs(self_in_genAlignCStackSavingRegistersnumArgswordAlignment)) >= ((saveRegs
-		? (numberOfSaveableRegisters(self_in_genAlignCStackSavingRegistersnumArgswordAlignment)) + numArgs
-		: numArgs))) {
-		return 0;
-	}
-	wordsPushedModAlignment = (((saveRegs
-	? numberOfSaveableRegisters(self_in_genAlignCStackSavingRegistersnumArgswordAlignment)
-	: 0)) + numArgs) % alignment;
-	if (wordsPushedModAlignment != 0) {
-		delta = alignment - wordsPushedModAlignment;
-		/* begin SubCq:R: */
-		anInstruction = genoperandoperand(SubCqR, delta * BytesPerWord, SPReg);
-	}
-	return 0;
-}
-
 	/* CogAbstractInstruction>>#genWriteCResultIntoReg: */
 static AbstractInstruction * NoDbgRegParms
 genWriteCResultIntoReg(AbstractInstruction * self_in_genWriteCResultIntoReg, sqInt abstractRegister)
@@ -2956,41 +2932,6 @@
 	return abstractInstruction;
 }
 
-	/* Cogit>>#CallRT:registersToBeSavedMask: */
-static AbstractInstruction * NoDbgRegParms
-CallRTregistersToBeSavedMask(sqInt callTarget, sqInt registersToBeSaved)
-{
-    AbstractInstruction *abstractInstruction;
-    sqInt callerSavedRegsToBeSaved;
-    AbstractInstruction *lastInst;
-    sqInt reg;
-    sqInt registersToBePushed;
-
-	callerSavedRegsToBeSaved = callerSavedRegMask & registersToBeSaved;
-	registersToBePushed = callerSavedRegsToBeSaved;
-	reg = 0;
-	while (registersToBePushed != 0) {
-		if (registersToBePushed & 1) {
-			/* begin PushR: */
-			genoperand(PushR, reg);
-		}
-		reg += 1;
-		registersToBePushed = ((sqInt) registersToBePushed) >> 1;
-	}
-	/* begin CallRT: */
-	abstractInstruction = genoperand(Call, callTarget);
-	(abstractInstruction->annotation = IsRelativeCall);
-	lastInst = abstractInstruction;
-	while (reg >= 0) {
-		if (callerSavedRegsToBeSaved & (1LL << reg)) {
-			/* begin PopR: */
-			lastInst = genoperand(PopR, reg);
-		}
-		reg -= 1;
-	}
-	return lastInst;
-}
-
 	/* Cogit>>#Call: */
 static AbstractInstruction * NoDbgRegParms
 gCall(sqInt callTarget)
@@ -4373,9 +4314,9 @@
 	non-negative value
 	indicates a constant. */
 
-	/* Cogit>>#compileCallFor:numArgs:arg:arg:arg:arg:resultReg:saveRegs: */
+	/* Cogit>>#compileCallFor:numArgs:arg:arg:arg:arg:resultReg:regsToSave: */
 static void NoDbgRegParms
-compileCallFornumArgsargargargargresultRegsaveRegs(void *aRoutine, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt resultRegOrNone, sqInt saveRegs)
+compileCallFornumArgsargargargargresultRegregsToSave(void *aRoutine, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt resultRegOrNone, sqInt regMask)
 {
     AbstractInstruction *anInstruction;
     AbstractInstruction *anInstruction1;
@@ -4384,23 +4325,47 @@
     AbstractInstruction *anInstruction4;
     AbstractInstruction *anInstruction5;
     AbstractInstruction *anInstruction6;
+    AbstractInstruction *anInstruction7;
     sqInt callTarget;
     const int cStackAlignment = STACK_ALIGN_BYTES;
+    sqInt delta;
+    usqInt numRegsPushed;
+    usqInt regMaskCopy;
+    sqInt regsToSave;
+    sqInt wordsPushedModAlignment;
 
+	regsToSave = (resultRegOrNone == NoReg
+		? regMask
+		: ((regMask | (1LL << resultRegOrNone)) - (1LL << resultRegOrNone)));
 	if (cStackAlignment > BytesPerWord) {
-		genAlignCStackSavingRegistersnumArgswordAlignment(backEnd, saveRegs, numArgs, cStackAlignment / BytesPerWord);
+		/* begin genAlignCStackSavingRegisters:numArgs:wordAlignment: */
+		regMaskCopy = ((usqInt)regsToSave);
+		numRegsPushed = 0;
+		while (regMaskCopy != 0) {
+			numRegsPushed += regMaskCopy & 1;
+			regMaskCopy = ((usqInt) regMaskCopy >> 1);
+		}
+		if ((numRegsPushed == 0)
+		 && ((numIntRegArgs(((AbstractInstruction *) backEnd))) >= numArgs)) {
+			goto l1;
+		}
+		wordsPushedModAlignment = (numRegsPushed + numArgs) % (cStackAlignment / BytesPerWord);
+		if (wordsPushedModAlignment != 0) {
+			delta = (cStackAlignment / BytesPerWord) - wordsPushedModAlignment;
+			/* begin SubCq:R: */
+			anInstruction = genoperandoperand(SubCqR, delta * BytesPerWord, SPReg);
+		}
+	l1:	/* end genAlignCStackSavingRegisters:numArgs:wordAlignment: */;
 	}
-	if (saveRegs) {
-		genSaveRegsForCCall(backEnd);
-	}
+	genSaveRegs(backEnd, regsToSave);
 	/* begin genMarshallNArgs:arg:arg:arg:arg: */
 	if (numArgs == 0) {
 		((AbstractInstruction *) backEnd);
-		goto l1;
+		goto l2;
 	}
 	if (regOrConst0 < NoReg) {
 		/* begin MoveCq:R: */
-		anInstruction = genoperandoperand(MoveCqR, -2 - regOrConst0, RDI);
+		anInstruction6 = genoperandoperand(MoveCqR, -2 - regOrConst0, RDI);
 	}
 	else {
 		if (regOrConst0 != RDI) {
@@ -4410,7 +4375,7 @@
 	}
 	if (numArgs == 1) {
 		((AbstractInstruction *) backEnd);
-		goto l1;
+		goto l2;
 	}
 	if (regOrConst1 < NoReg) {
 		/* begin MoveCq:R: */
@@ -4424,7 +4389,7 @@
 	}
 	if (numArgs == 2) {
 		((AbstractInstruction *) backEnd);
-		goto l1;
+		goto l2;
 	}
 	
 #  if ABI == SysV
@@ -4440,7 +4405,7 @@
 	}
 	if (numArgs == 3) {
 		((AbstractInstruction *) backEnd);
-		goto l1;
+		goto l2;
 	}
 	if (regOrConst3 < NoReg) {
 		/* begin MoveCq:R: */
@@ -4469,7 +4434,7 @@
 	}
 	if (numArgs == 3) {
 		((AbstractInstruction *) backEnd);
-		goto l1;
+		goto l2;
 	}
 	if (regOrConst3 < NoReg) {
 		/* begin MoveCq:R: */
@@ -4486,26 +4451,19 @@
 
 	assert(numArgs <= 4);
 	((AbstractInstruction *) backEnd);
-l1:	/* end genMarshallNArgs:arg:arg:arg:arg: */;
+l2:	/* end genMarshallNArgs:arg:arg:arg:arg: */;
 	/* begin CallFullRT: */
 	callTarget = ((usqInt)aRoutine);
 	/* begin CallFull: */
-	anInstruction6 = genoperand(CallFull, callTarget);
+	anInstruction7 = genoperand(CallFull, callTarget);
 
 	if (resultRegOrNone != NoReg) {
 		genWriteCResultIntoReg(backEnd, resultRegOrNone);
 	}
-	if (saveRegs) {
-		if (numArgs > 0) {
-			genRemoveNArgsFromStack(backEnd, numArgs);
-		}
-		if (resultRegOrNone != NoReg) {
-			genRestoreRegsExcept(backEnd, resultRegOrNone);
-		}
-		else {
-			genRestoreRegs(backEnd);
-		}
+	if (numArgs > 0) {
+		genRemoveNArgsFromStack(backEnd, numArgs);
 	}
+	genRestoreRegs(backEnd, regsToSave);
 }
 
 
@@ -4609,12 +4567,12 @@
 	Hack: a negative value indicates an abstract register, a non-negative
 	value indicates a constant. */
 
-	/* Cogit>>#compileTrampolineFor:numArgs:arg:arg:arg:arg:saveRegs:pushLinkReg:resultReg: */
+	/* Cogit>>#compileTrampolineFor:numArgs:arg:arg:arg:arg:regsToSave:pushLinkReg:resultReg: */
 static void NoDbgRegParms
-compileTrampolineFornumArgsargargargargsaveRegspushLinkRegresultReg(void *aRoutine, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt saveRegs, sqInt pushLinkReg, sqInt resultRegOrNone)
+compileTrampolineFornumArgsargargargargregsToSavepushLinkRegresultReg(void *aRoutine, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt regMask, sqInt pushLinkReg, sqInt resultRegOrNone)
 {
 	genSmalltalkToCStackSwitch(pushLinkReg);
-	compileCallFornumArgsargargargargresultRegsaveRegs(aRoutine, numArgs, regOrConst0, regOrConst1, regOrConst2, regOrConst3, resultRegOrNone, saveRegs);
+	compileCallFornumArgsargargargargresultRegregsToSave(aRoutine, numArgs, regOrConst0, regOrConst1, regOrConst2, regOrConst3, resultRegOrNone, regMask);
 	genLoadStackPointers(backEnd);
 	/* begin RetN: */
 	genoperand(RetN, 0);
@@ -5489,7 +5447,7 @@
 	/* begin gen:operand:literal: */
 	anInstruction1 = genoperandoperand(MoveRAw, TempReg, address1);
 
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(ceCheckForInterrupts, "ceCheckForInterruptsTrampoline", 0, null, null, null, null, 0, 0, NoReg, 1);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(ceCheckForInterrupts, "ceCheckForInterruptsTrampoline", 0, null, null, null, null, 0, 0, NoReg, 1);
 }
 
 	/* Cogit>>#genConditionalBranch:operand: */
@@ -5876,12 +5834,12 @@
 generateMapAtstart(sqInt addressOrNull, sqInt startAddress)
 {
     unsigned char annotation;
-    usqInt delta;
+    sqInt delta;
     sqInt i;
     AbstractInstruction *instruction;
     sqInt length;
-    usqInt location;
-    usqInt mapEntry;
+    sqInt location;
+    sqInt mapEntry;
     sqInt maxDelta;
     usqInt mcpc;
 
@@ -6161,9 +6119,9 @@
 	anInstruction = genoperandoperand(CmpCqR, 0, ClassReg);
 	/* begin JumpZero: */
 	jumpMNUCase = genConditionalBranchoperand(JumpZero, ((sqInt)0));
-	compileTrampolineFornumArgsargargargargsaveRegspushLinkRegresultReg(ceInterpretMethodFromPICreceiver, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, 0, NoReg);
+	compileTrampolineFornumArgsargargargargregsToSavepushLinkRegresultReg(ceInterpretMethodFromPICreceiver, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, 0, NoReg);
 	jmpTarget(jumpMNUCase, gLabel());
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(ceMNUFromPICMNUMethodreceiver, name, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, 0, NoReg, 1);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(ceMNUFromPICMNUMethodreceiver, name, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, 0, NoReg, 1);
 }
 
 	/* Cogit>>#genLoadCStackPointersForPrimCall */
@@ -6261,7 +6219,7 @@
 	/* begin gen:operand:literal: */
 	anInstruction1 = genoperandoperand(MoveRAw, TempReg, address1);
 
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(ceNonLocalReturn, "ceNonLocalReturnTrampoline", 1, ReceiverResultReg, null, null, null, 0, 0, NoReg, 1);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(ceNonLocalReturn, "ceNonLocalReturnTrampoline", 1, ReceiverResultReg, null, null, null, 0, 0, NoReg, 1);
 }
 
 
@@ -6331,7 +6289,7 @@
 	genEnsureOopInRegNotForwardedscratchRegupdatingMwr(ReceiverResultReg, TempReg, FoxMFReceiver, FPReg);
 	genPushRegisterArgsForNumArgsscratchReg(backEnd, numArgs, TempReg);
 
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, 1, NoReg, 1);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, 1, NoReg, 1);
 }
 
 
@@ -6343,43 +6301,10 @@
 static sqInt NoDbgRegParms
 genReturnTrampolineForcalledarg(void *aRoutine, char *aString, sqInt regOrConst0)
 {
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 1, regOrConst0, null, null, null, 0, 0, NoReg, 0);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 1, regOrConst0, null, null, null, 0, 0, NoReg, 0);
 }
 
 
-/*	Generate a trampoline with no arguments that will
-	save and restore all registers around the call */
-
-	/* Cogit>>#genSafeTrampolineFor:called: */
-static sqInt NoDbgRegParms
-genSafeTrampolineForcalled(void *aRoutine, char *aString)
-{
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 0, null, null, null, null, 1, 1, NoReg, 0);
-}
-
-
-/*	Generate a trampoline with one argument that will
-	save and restore all registers around the call */
-
-	/* Cogit>>#genSafeTrampolineFor:called:arg: */
-static sqInt NoDbgRegParms
-genSafeTrampolineForcalledarg(void *aRoutine, char *aString, sqInt regOrConst0)
-{
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 1, regOrConst0, null, null, null, 1, 1, NoReg, 0);
-}
-
-
-/*	Generate a trampoline with two arguments that
-	will save and restore all registers around the call */
-
-	/* Cogit>>#genSafeTrampolineFor:called:arg:arg: */
-static sqInt NoDbgRegParms
-genSafeTrampolineForcalledargarg(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1)
-{
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 2, regOrConst0, regOrConst1, null, null, 1, 1, NoReg, 0);
-}
-
-
 /*	If the client requires, then on an ARM-like RISC processor, the return
 	address needs to
 	be pushed to the stack so that the interpreter sees the same stack layout
@@ -6407,7 +6332,7 @@
 static sqInt NoDbgRegParms
 genTrampolineForcalled(void *aRoutine, char *aString)
 {
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 0, null, null, null, null, 0, 1, NoReg, 0);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 0, null, null, null, null, 0, 1, NoReg, 0);
 }
 
 
@@ -6419,7 +6344,7 @@
 static sqInt NoDbgRegParms
 genTrampolineForcalledargargarg(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2)
 {
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 3, regOrConst0, regOrConst1, regOrConst2, null, 0, 1, NoReg, 0);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 3, regOrConst0, regOrConst1, regOrConst2, null, 0, 1, NoReg, 0);
 }
 
 
@@ -6431,10 +6356,22 @@
 static sqInt NoDbgRegParms
 genTrampolineForcalledargargargresult(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt resultReg)
 {
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 3, regOrConst0, regOrConst1, regOrConst2, null, 0, 1, resultReg, 0);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 3, regOrConst0, regOrConst1, regOrConst2, null, 0, 1, resultReg, 0);
 }
 
 
+/*	Generate a trampoline with two arguments.
+	Hack: a negative value indicates an abstract register, a non-negative
+	value indicates a constant. */
+
+	/* Cogit>>#genTrampolineFor:called:arg:arg:regsToSave: */
+static sqInt NoDbgRegParms
+genTrampolineForcalledargargregsToSave(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regMask)
+{
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 2, regOrConst0, regOrConst1, null, null, regMask, 1, NoReg, 0);
+}
+
+
 /*	Generate a trampoline with two arguments that answers a result.
 	Hack: a negative value indicates an abstract register, a non-negative
 	value indicates a constant. */
@@ -6443,19 +6380,43 @@
 static sqInt NoDbgRegParms
 genTrampolineForcalledargargresult(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt resultReg)
 {
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 2, regOrConst0, regOrConst1, null, null, 0, 1, resultReg, 0);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 2, regOrConst0, regOrConst1, null, null, 0, 1, resultReg, 0);
 }
 
 
+/*	Generate a trampoline with one argument.
+	Hack: a negative value indicates an abstract register, a non-negative
+	value indicates a constant. */
+
+	/* Cogit>>#genTrampolineFor:called:arg:regsToSave: */
+static sqInt NoDbgRegParms
+genTrampolineForcalledargregsToSave(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regMask)
+{
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 1, regOrConst0, null, null, null, regMask, 1, NoReg, 0);
+}
+
+
 /*	Generate a trampoline with one argument that answers a result.
 	Hack: a negative value indicates an abstract register, a non-negative
 	value indicates a constant. */
 
+	/* Cogit>>#genTrampolineFor:called:arg:regsToSave:result: */
+static sqInt NoDbgRegParms
+genTrampolineForcalledargregsToSaveresult(void *aRoutine, char *aString, sqInt regOrConst0, sqInt regMask, sqInt resultReg)
+{
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 1, regOrConst0, null, null, null, regMask, 1, resultReg, 0);
+}
+
+
+/*	Generate a trampoline with one argument that answers a result.
+	Hack: a negative value indicates an abstract register, a non-negative
+	value indicates a constant. */
+
 	/* Cogit>>#genTrampolineFor:called:arg:result: */
 static sqInt NoDbgRegParms
 genTrampolineForcalledargresult(void *aRoutine, char *aString, sqInt regOrConst0, sqInt resultReg)
 {
-	return genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(aRoutine, aString, 1, regOrConst0, null, null, null, 0, 1, resultReg, 0);
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 1, regOrConst0, null, null, null, 0, 1, resultReg, 0);
 }
 
 
@@ -6467,9 +6428,9 @@
 	Hack: a negative value indicates an abstract register, a non-negative
 	value indicates a constant. */
 
-	/* Cogit>>#genTrampolineFor:called:numArgs:arg:arg:arg:arg:saveRegs:pushLinkReg:resultReg:appendOpcodes: */
+	/* Cogit>>#genTrampolineFor:called:numArgs:arg:arg:arg:arg:regsToSave:pushLinkReg:resultReg:appendOpcodes: */
 static sqInt NoDbgRegParms
-genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(void *aRoutine, char *trampolineName, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt saveRegs, sqInt pushLinkReg, sqInt resultRegOrNone, sqInt appendBoolean)
+genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(void *aRoutine, char *trampolineName, sqInt numArgs, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3, sqInt regMask, sqInt pushLinkReg, sqInt resultRegOrNone, sqInt appendBoolean)
 {
     sqInt startAddress;
 
@@ -6477,7 +6438,7 @@
 	if (!appendBoolean) {
 		zeroOpcodeIndex();
 	}
-	compileTrampolineFornumArgsargargargargsaveRegspushLinkRegresultReg(aRoutine, numArgs, regOrConst0, regOrConst1, regOrConst2, regOrConst3, saveRegs, pushLinkReg, resultRegOrNone);
+	compileTrampolineFornumArgsargargargargregsToSavepushLinkRegresultReg(aRoutine, numArgs, regOrConst0, regOrConst1, regOrConst2, regOrConst3, regMask, pushLinkReg, resultRegOrNone);
 	outputInstructionsForGeneratedRuntimeAt(startAddress);
 	recordGeneratedRunTimeaddress(trampolineName, startAddress);
 	recordRunTimeObjectReferences();
@@ -6485,6 +6446,16 @@
 }
 
 
+/*	Generate a trampoline with no arguments */
+
+	/* Cogit>>#genTrampolineFor:called:regsToSave: */
+static sqInt NoDbgRegParms
+genTrampolineForcalledregsToSave(void *aRoutine, char *aString, sqInt regMask)
+{
+	return genTrampolineForcallednumArgsargargargargregsToSavepushLinkRegresultRegappendOpcodes(aRoutine, aString, 0, null, null, null, null, regMask, 1, NoReg, 0);
+}
+
+
 /*	<Integer> */
 
 	/* Cogit>>#gen: */
@@ -8572,6 +8543,93 @@
 	}
 }
 
+	/* Cogit>>#printPCMapPairsFor: */
+void
+printPCMapPairsFor(CogMethod *cogMethod)
+{
+    sqInt annotation;
+    sqInt map;
+    sqInt mapByte;
+    sqInt mcpc;
+    sqInt value;
+
+	mcpc = (((sqInt)cogMethod)) + cmNoCheckEntryOffset;
+	map = ((((usqInt)cogMethod)) + ((cogMethod->blockSize))) - 1;
+	while (((mapByte = byteAt(map))) != MapEnd) {
+		annotation = ((usqInt) mapByte) >> AnnotationShift;
+		if (annotation == IsAnnotationExtension) {
+			value = (mapByte & DisplacementMask) + IsSendCall;
+		}
+		else {
+			value = annotation;
+			mcpc += 1 * ((annotation == IsDisplacementX2N
+	? ((long)(mapByte - DisplacementX2N)) << AnnotationShift
+	: mapByte & DisplacementMask));
+		}
+		printHexnp(map);
+		print(": ");
+		printf("%02x", mapByte);
+		printChar(' ');
+		printNum(annotation);
+		print(" (");
+		
+		switch (value) {
+		case IsDisplacementX2N:
+			print("IsDisplacementX2N");
+			break;
+		case IsAnnotationExtension:
+			print("IsAnnotationExtension");
+			break;
+		case IsObjectReference:
+			print("IsObjectReference");
+			break;
+		case IsAbsPCReference:
+			print("IsAbsPCReference");
+			break;
+		case HasBytecodePC:
+			print("HasBytecodePC");
+			break;
+		case IsRelativeCall:
+			print("IsRelativeCall");
+			break;
+		case IsNSSendCall:
+			print("IsNSSendCall");
+			break;
+		case IsSendCall:
+			print("IsSendCall");
+			break;
+		case IsSuperSend:
+			print("IsSuperSend");
+			break;
+		case IsDirectedSuperSend:
+			print("IsDirectedSuperSend");
+			break;
+		case IsNSSelfSend:
+			print("IsNSSelfSend");
+			break;
+		case IsNSDynamicSuperSend:
+			print("IsNSDynamicSuperSend");
+			break;
+		case IsNSImplicitReceiverSend:
+			print("IsNSImplicitReceiverSend");
+			break;
+		default:
+			print("??? ");
+			printHexnp(value);
+
+		}
+
+		print(") ");
+		printHexnp(mapByte & DisplacementMask);
+		printChar(' ');
+		putchar('@');
+		printHex(mcpc);
+		cr();
+		flush();
+		map -= 1;
+	}
+}
+
 	/* Cogit>>#printTrampolineTable */
 void
 printTrampolineTable(void)
@@ -8661,13 +8719,6 @@
 	return (1LL << reg1) | (1LL << reg2);
 }
 
-	/* Cogit>>#registerMaskFor:and:and:and:and:and:and:and:and: */
-static sqInt NoDbgRegParms
-registerMaskForandandandandandandandand(sqInt reg1, sqInt reg2, sqInt reg3, sqInt reg4, sqInt reg5, sqInt reg6, sqInt reg7, sqInt reg8, sqInt reg9)
-{
-	return ((((((((1LL << reg1) | (1LL << reg2)) | (1LL << reg3)) | (1LL << reg4)) | (1LL << reg5)) | (1LL << reg6)) | (1LL << reg7)) | (1LL << reg8)) | (1LL << reg9);
-}
-
 	/* Cogit>>#relocateCallsAndSelfReferencesInMethod: */
 static void NoDbgRegParms
 relocateCallsAndSelfReferencesInMethod(CogMethod *cogMethod)
@@ -14795,9 +14846,9 @@
 
 #  endif /* IMMUTABILITY */
 
-	ceStoreCheckTrampoline = genTrampolineForcalledargresult(remember, "ceStoreCheckTrampoline", ReceiverResultReg, returnRegForStoreCheck());
+	ceStoreCheckTrampoline = genTrampolineForcalledargregsToSaveresult(remember, "ceStoreCheckTrampoline", ReceiverResultReg, (((callerSavedRegMask()) | (1LL << ReceiverResultReg)) - (1LL << ReceiverResultReg)), returnRegForStoreCheck());
 	ceStoreCheckContextReceiverTrampoline = genStoreCheckContextReceiverTrampoline();
-	ceScheduleScavengeTrampoline = genSafeTrampolineForcalled(ceScheduleScavenge, "ceScheduleScavengeTrampoline");
+	ceScheduleScavengeTrampoline = genTrampolineForcalledregsToSave(ceScheduleScavenge, "ceScheduleScavengeTrampoline", callerSavedRegMask());
 	ceSmallActiveContextInMethodTrampoline = genActiveContextTrampolineLargeinBlockcalled(0, 0, "ceSmallMethodContext");
 	ceSmallActiveContextInBlockTrampoline = genActiveContextTrampolineLargeinBlockcalled(0, 1, "ceSmallBlockContext");
 	ceLargeActiveContextInMethodTrampoline = genActiveContextTrampolineLargeinBlockcalled(1, 0, "ceLargeMethodContext");
@@ -15875,33 +15926,27 @@
 static sqInt NoDbgRegParms
 genStoreCheckReceiverRegvalueRegscratchReginFrame(sqInt destReg, sqInt valueReg, sqInt scratchReg, sqInt inFrame)
 {
+    AbstractInstruction *abstractInstruction;
     AbstractInstruction *anInstruction;
     AbstractInstruction *anInstruction1;
     AbstractInstruction *anInstruction2;
-    AbstractInstruction *anInstruction3;
     AbstractInstruction *jmpAlreadyRemembered;
     AbstractInstruction *jmpDestYoung;
     AbstractInstruction *jmpImmediate;
     AbstractInstruction *jmpSourceOld;
     sqInt mask;
-    sqInt quickConstant;
     sqInt rememberedBitByteOffset;
     sqInt wordConstant;
 
 
-	/* Is value stored an integer?  If so we're done */
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, valueReg, scratchReg);
-	/* begin AndCq:R: */
-	quickConstant = tagMask();
-	/* begin gen:quickConstant:operand: */
-	anInstruction = genoperandoperand(AndCqR, quickConstant, scratchReg);
-	/* begin JumpNonZero: */
-	jmpImmediate = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
+	/* Is value stored an immediate?  If so we're done */
+
+	/* Get the old/new boundary in scratchReg */
+	jmpImmediate = genJumpImmediate(valueReg);
 	/* begin MoveCw:R: */
 	wordConstant = storeCheckBoundary();
 	/* begin gen:literal:operand: */
-	anInstruction1 = genoperandoperand(MoveCwR, wordConstant, scratchReg);
+	anInstruction = genoperandoperand(MoveCwR, wordConstant, scratchReg);
 	/* begin CmpR:R: */
 	genoperandoperand(CmpRR, scratchReg, destReg);
 	/* begin JumpBelow: */
@@ -15913,19 +15958,23 @@
 	rememberedBitByteOffset = (rememberedBitShift()) / 8;
 	mask = 1LL << ((rememberedBitShift()) % 8);
 	/* begin MoveMb:r:R: */
-	anInstruction2 = genoperandoperandoperand(MoveMbrR, rememberedBitByteOffset, destReg, scratchReg);

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list