[Vm-dev] VM Maker: VMMaker.oscog-eem.2071.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Jan 5 01:41:00 UTC 2017


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2071.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.2071
Author: eem
Time: 4 January 2017, 5:40:04.754725 pm
UUID: f96e66a4-24c6-4c44-925c-116a07bf1d27
Ancestors: VMMaker.oscog-eem.2070

Slang:
To make code more readable when implementing SpurPlanningCompactor, markedBitShift was made a macro.  That caused Slang to generate a bogus versuon of nullHeaderForMachineCodeMethod because it could no longer infer the type of the shift operand for the marked bit, and so generated 1UL << 55 instead of 1ULL << 55.  Consequently nullHeaderForMachineCodeMethod answered 0 (!!).

Add TParseNode>>constantNumbericValueIfAtAllPossibleOrNilIn: that provides a vaue for defines and methods answerinf constants as well as explicit constants and use it in generateShiftLeft:on:indent:, hence fixing nullHeaderForMachineCodeMethod.

=============== Diff against VMMaker.oscog-eem.2070 ===============

Item was changed:
  ----- Method: CCodeGenerator>>generateShiftLeft:on:indent: (in category 'C translation') -----
  generateShiftLeft: msgNode on: aStream indent: level
  	"Generate a C bitShift.  If we can determine the result
  	 would overflow the word size, cast to a long integer."
  	| rcvr arg castToLong type mustCastBackToSign mustCastToUnsigned canSuffixTheConstant typeIsUnsigned |
  	rcvr := msgNode receiver.
  	arg := msgNode args first.
  	castToLong := false.
+ 	(rcvr constantNumbericValueIfAtAllPossibleOrNilIn: self) ifNotNil:
- 	rcvr constantNumbericValueOrNil ifNotNil:
  		[:rcvrVal |
+ 		 (arg constantNumbericValueIfAtAllPossibleOrNilIn: self)
- 		 arg constantNumbericValueOrNil
  			ifNil: [castToLong := vmClass notNil and: [vmClass objectMemoryClass wordSize = 8]]
  			ifNotNil:
  				[:argVal |
  				| valueBeyondInt |
  				valueBeyondInt := 1 bitShift: 32. "The default type of const << N is int."
  				castToLong := rcvrVal < valueBeyondInt
  								  and: [(rcvrVal bitShift: argVal) >= valueBeyondInt]]].
  	canSuffixTheConstant := rcvr isConstant and: [rcvr name isEmpty and: [rcvr value >= 0]].
  	canSuffixTheConstant
  		ifTrue:
  			[aStream nextPutAll: (self cLiteralForUnsignedInteger: rcvr value longlong: castToLong).
  			aStream nextPutAll: ' << '.
  			self emitCExpression: arg on: aStream indent: level.
  			^self].
  	type := self typeFor: rcvr in: currentMethod.
  	castToLong := castToLong and: [(self sizeOfIntegralCType: type) < (self sizeOfIntegralCType: #usqLong)].
  	typeIsUnsigned := type first = $u.
  	mustCastToUnsigned := typeIsUnsigned not
  		or: [castToLong
  		or: [(self sizeOfIntegralCType: type) < (self sizeOfIntegralCType: #usqInt)]].
  	mustCastBackToSign := typeIsUnsigned not.
  	mustCastBackToSign
  		ifTrue:
  			[| promotedType |
  			promotedType := castToLong
  				ifTrue: [#sqLong]
  				ifFalse: [(self sizeOfIntegralCType: type) < (self sizeOfIntegralCType: #sqInt)
  					ifTrue: [#sqInt]
  					ifFalse: [type]].
  			aStream nextPutAll: '(('; nextPutAll: promotedType; nextPut: $)].
  	mustCastToUnsigned
  		ifTrue:
  			[| unsigned |
  			unsigned := castToLong
  				ifTrue: [#usqLong]
  				ifFalse: [(self sizeOfIntegralCType: type) < (self sizeOfIntegralCType: #usqLong)
  					ifTrue: [#usqInt]
  					ifFalse: [self unsignedTypeForIntegralType: type]].
  			aStream nextPutAll: '(('; nextPutAll: unsigned; nextPutAll: ')('].
  	self emitCExpression: rcvr on: aStream indent: level.
  	mustCastToUnsigned ifTrue: [aStream nextPut: $)].
  		aStream nextPutAll: ' << '.
  		self emitCExpression: arg on: aStream indent: level.
  	mustCastToUnsigned ifTrue: [aStream nextPut: $)].
  	mustCastBackToSign ifTrue: [aStream nextPut: $)].!

Item was added:
+ ----- Method: TConstantNode>>constantNumbericValueIfAtAllPossibleOrNilIn: (in category 'accessing') -----
+ constantNumbericValueIfAtAllPossibleOrNilIn: aCCodeGen
+ 	"This is a version of constantNumbericValueOrNil for type checking rather than code generation.
+ 	 It aims to yield a value if at all possible.  This should /not/ be overridden in TDefineNode."
+ 	^value isNumber ifTrue: [value]!

Item was changed:
+ ----- Method: TConstantNode>>constantNumbericValueOrNil (in category 'accessing') -----
- ----- Method: TConstantNode>>constantNumbericValueOrNil (in category 'testing') -----
  constantNumbericValueOrNil
  
  	^value isNumber ifTrue: [value]!

Item was changed:
+ ----- Method: TDefineNode>>constantNumbericValueOrNil (in category 'accessing') -----
- ----- Method: TDefineNode>>constantNumbericValueOrNil (in category 'testing') -----
  constantNumbericValueOrNil
  	"Override so that named constants don't get elided."
  	^nil!

Item was added:
+ ----- Method: TParseNode>>constantNumbericValueIfAtAllPossibleOrNilIn: (in category 'accessing') -----
+ constantNumbericValueIfAtAllPossibleOrNilIn: aCCodeGen
+ 	"This is a version of constantNumbericValueOrNil for type checking rather than code generation.
+ 	 It aims to yield a value if at all possible."
+ 	^self constantNumbericValueOrNil!

Item was changed:
+ ----- Method: TParseNode>>constantNumbericValueOrNil (in category 'accessing') -----
- ----- Method: TParseNode>>constantNumbericValueOrNil (in category 'testing') -----
  constantNumbericValueOrNil
  
  	^nil!

Item was added:
+ ----- Method: TSendNode>>constantNumbericValueIfAtAllPossibleOrNilIn: (in category 'accessing') -----
+ constantNumbericValueIfAtAllPossibleOrNilIn: aCCodeGen
+ 	"This is a version of constantNumbericValueOrNil for type checking rather than code generation.
+ 	 It aims to yield a value if at all possible."
+ 	(#(* // + - << >> bitAnd: bitOr: bitShift:) includes: selector) ifTrue:
+ 		[(receiver constantNumbericValueIfAtAllPossibleOrNilIn: aCCodeGen) ifNotNil:
+ 			[:rval|
+ 			(arguments first constantNumbericValueIfAtAllPossibleOrNilIn: aCCodeGen) ifNotNil:
+ 				[:aval|
+ 				^rval perform: selector with: aval]]].
+ 	^(aCCodeGen anyMethodNamed: selector) ifNotNil:
+ 		[:m|
+ 		 m isReturnConstant ifTrue:
+ 			[m statements last expression constantNumbericValueIfAtAllPossibleOrNilIn: aCCodeGen]]!

Item was changed:
+ ----- Method: TSendNode>>constantNumbericValueOrNil (in category 'accessing') -----
- ----- Method: TSendNode>>constantNumbericValueOrNil (in category 'C code generation') -----
  constantNumbericValueOrNil
  	(#(* // + -) includes: selector) ifTrue:
  		[receiver constantNumbericValueOrNil ifNotNil:
  			[:rval|
  			arguments first constantNumbericValueOrNil ifNotNil:
  				[:aval|
  				^rval perform: selector with: aval]]].
  	^nil!



More information about the Vm-dev mailing list