<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2016-04-22 0:50 GMT+02:00 Levente Uzonyi <span dir="ltr"><<a href="mailto:leves@caesar.elte.hu" target="_blank">leves@caesar.elte.hu</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
On Thu, 21 Apr 2016, <a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a> wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1830.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1830.mcz</a><br>
<br>
</blockquote>
<br>
snip<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+ ----- Method: VMPluginCodeGenerator>>preDeclareMacrosForFastClassChekingOn: (in category 'C code generator') -----<br>
+ preDeclareMacrosForFastClassChekingOn: aStream<br>
+ "These macros can be used to check for various case of Integer type.<br>
+ Since they can be defined based on existing API, this is a good trade off:<br>
+ - avoid extending the interpreterProxy API like mad<br>
+ - provide fast type checking"<br>
+<br>
+ "Fast-up generated code by using a macro for this well known function unconditionnally"<br>
+ aStream cr; nextPutAll: '#define isIntegerObject(oop) (oop & 1)'; cr.<br>
+<br>
+ aStream cr; nextPutAll: '#if SPURVM && defined(SQUEAK_BUILTIN_PLUGIN)'.<br>
+<br>
+ "Compact class index are hardcoded because there is no guaranty that the pool values at generation time are that of SPUR..<br>
+ Make sure they are in sync with SpurMemoryManager class>>initializeCompactClassIndices"<br>
+ aStream cr; nextPutAll: '# define LargeNegativeIntegerClassIndex 32'.<br>
+ aStream cr; nextPutAll: '# define LargePositiveIntegerClassIndex 33'.<br>
+ aStream cr; nextPutAll: 'extern sqInt classIndexOf(sqInt);'.<br>
+ aStream cr; nextPutAll: '# define isKindOfInteger(oop) (isImmediate(oop) ? isIntegerObject(oop) : (unsigned)(classIndexOf(oop) - LargeNegativeIntegerClassIndex) <= 1)'.<br>
+ aStream cr; nextPutAll: '# define isLargeIntegerObject(oop) (!!isImmediate(oop) && (unsigned)(classIndexOf(oop) - LargeNegativeIntegerClassIndex) <= 1)'.<br>
+ aStream cr; nextPutAll: '# define isLargeNegativeIntegerObject(oop) (!!isImmediate(oop) && classIndexOf(oop) == LargeNegativeIntegerClassIndex)'.<br>
+ aStream cr; nextPutAll: '# define isLargePositiveIntegerObject(oop) (!!isImmediate(oop) && classIndexOf(oop) == LargePositiveIntegerClassIndex)'.<br>
+<br>
+ aStream cr; nextPutAll: '#else /* defined(SQUEAK_BUILTIN_PLUGIN) && defined(SPURVM) */'.<br>
</blockquote>
<br>
These macros look pretty good. I wonder if we can have more, e.g. #classIndexOf:. IIRC that's part of the object header in Spur. If so, then we could use a macro for that as well, couldn't we?<br></blockquote><div><br></div><div>Yes, I was thinking of it.<br>Ideally I would have wanted this macro to be automatically generated from current source.<br></div><div>That means picking the right set of vm classes (the plugins are not necessarily generated from spur)<br></div><div>Then transform the method and sent methods, inline, check if it can be generated as macro (no temp vars, no side effect,...), remove return & parameter type declarations, appropriately place parentheses and protect intermediate end of lines \<br><br></div><div>For sure, for just a function it's not worth, better duplicate code...<br></div><div>But this scheme would be extensible.<br><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Btw, the comment here and below don't match the actual #if.<br></blockquote><div><br></div><div>Ah good eyes, I modified only the first and forgot the two others<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Also, there's a "c" missing from the name of the method: Cheking vs Checking.<br>
<br></blockquote><div>excellent eyes, I missed it.<br><br></div><div>I'll fix it when I'll have something else to commit.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Levente<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+ aStream cr; nextPutAll: '# define isLargeNegativeIntegerObject(oop) (fetchClassOf(oop) == classLargeNegativeInteger())'.<br>
+ aStream cr; nextPutAll: '# define isLargePositiveIntegerObject(oop) (fetchClassOf(oop) == classLargePositiveInteger())'.<br>
+ aStream cr; nextPutAll: '# define isLargeIntegerObject(oop) (isLargeNegativeIntegerObject(oop) || isLargePositiveIntegerObject(oop))'.<br>
+ aStream cr; nextPutAll: '# define isKindOfInteger(oop) (isIntegerObject(oop) || isLargeNegativeIntegerObject(oop) || isLargePositiveIntegerObject(oop))'.<br>
+<br>
+ aStream cr; nextPutAll: '#endif /* defined(SQUEAK_BUILTIN_PLUGIN) && defined(SPURVM) */'; cr<br>
+ !<br>
<br>
Item was added:<br>
+ ----- Method: VMPluginCodeGenerator>>selectorsThatAreGeneratedAsMacros (in category 'public') -----<br>
+ selectorsThatAreGeneratedAsMacros<br>
+ "Answer a list of selectors that are generated as a C macro rather than as an interpreterProxy function call."<br>
+<br>
+ ^#(isKindOfInteger: isIntegerObject: isLargeIntegerObject: isLargeNegativeIntegerObject: isLargePositiveIntegerObject:)!<br>
<br>
<br>
</blockquote>
</blockquote></div><br></div></div>