asm/extensions.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 15 Jun 2016 23:46:29 +0100
changeset 23 d2d9a2d4d6bf
parent 4 f2d0d2859193
permissions -rw-r--r--
Added README, licenses and copyright notices.

"{ Package: 'jv:dragonfly/asm' }"!

!Boolean methodsFor:'Compatibility-Squeak'!

asBit
    ^ self subclassResponsibility

    "Created: / 15-12-2015 / 23:41:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!False methodsFor:'Compatibility-Squeak'!

asBit
    ^ 0

    "Created: / 15-12-2015 / 23:41:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!Integer methodsFor:'*AsmJit-Extension'!

asAJOperand

    "Convert receiver into operand: a signed immediate"
    ^ AJImmediate new ivalue: self
! !

!Integer methodsFor:'*AsmJit-Extension'!

asByte
    ^ self asTwosComplement: 16rFF
! !

!Integer methodsFor:'*AsmJit-Extension'!

asDoubleWord
    ^ self asTwosComplement: 16rFFFFFFFF
! !

!Integer methodsFor:'*AsmJit-Extension'!

asImm

    "Convert integer value into a signed immediate operand"
    ^ AJImmediate new ivalue: self
! !

!Integer methodsFor:'*AsmJit-Extension'!

asImm16

    "Convert integer value into a signed immediate word operand "
    ^ AJImmediate new ivalue: self; size: 2
! !

!Integer methodsFor:'*AsmJit-Extension'!

asImm32

    "Convert integer value into a signed immediate operand"
    ^ AJImmediate new ivalue: self; size: 4
! !

!Integer methodsFor:'*AsmJit-Extension'!

asImm8

    "Convert integer value into a signed immediate operand"
    ^ AJImmediate new ivalue: self; size: 1
! !

!Integer methodsFor:'*AsmJit-Extension'!

asQuadWord
    ^ self asTwosComplement: 16rFFFFFFFFFFFFFFFF
! !

!Integer methodsFor:'*AsmJit-Extension'!

asTwosComplement: mask
    "return the two's completemented cropped version.
    Example for a byte value:
        -5 asTwosComplement: 16rFF "
    | bound |
    bound := (mask + 1).
    
    self * 2 >= bound 
        ifTrue: [Error signal: self printString , ' too big for signed ', mask highBit printString,  'bit value'].
         
    (self >= 0)
        ifTrue: [ ^ self bitAnd: mask ].
        
    self * 2 < bound negated 
        ifTrue: [Error signal: self printString , ' too small for signed ', mask highBit printString, 'bit value'].
        
    ^ (self + mask + 1) bitAnd: mask
! !

!Integer methodsFor:'*AsmJit-Extension'!

asUImm

    "Convert integer value into an unsigned immediate operand"
    ^ AJImmediate new uvalue: self
! !

!Integer methodsFor:'*AsmJit-Extension'!

asUImm16

    "Convert integer value into an unsigned immediate operand"
    ^ AJImmediate new uvalue: self; size: 2
! !

!Integer methodsFor:'*AsmJit-Extension'!

asUImm32

    "Convert integer value into an unsigned immediate operand"
    ^ AJImmediate new uvalue: self; size: 4
! !

!Integer methodsFor:'*AsmJit-Extension'!

asUImm8

    "Convert integer value into an unsigned immediate operand"
    ^ AJImmediate new uvalue: self; size: 1
! !

!Integer methodsFor:'*AsmJit-Extension'!

asWord
    ^ self asTwosComplement: 16rFFFF
! !

!Integer methodsFor:'*AsmJit-Extension'!

bin
    "Print the receiver as hex, prefixed with 2r."
    ^self storeStringBase: 2
! !

!Integer methodsFor:'*AsmJit-Extension'!

isByte
    ^ self >= 0 and: [ self <= 255 ]
! !

!Integer methodsFor:'*AsmJit-Extension'!

printAsOperandOn: aStream
    aStream print: self.
! !

!True methodsFor:'Compatibility-Squeak'!

asBit
    ^ 1

    "Created: / 15-12-2015 / 23:42:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!WriteStream methodsFor:'*AsmJit-Extension'!

asLineStream
    ^ AJLineStream on: self
! !

!jv_dragonfly_asm class methodsFor:'documentation'!

extensionsVersion_HG

    ^ '$Changeset: <not expanded> $'
! !