c1/DragonFly__C1Compiler.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 20 Apr 2016 23:36:17 +0100
changeset 18 81ed8ce0852f
parent 17 54798ae989cc
child 26 8eb6716029aa
permissions -rw-r--r--
C1: Added context setup code.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"{ Package: 'jv:dragonfly/c1' }"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
"{ NameSpace: DragonFly }"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
Object subclass:#C1Compiler
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
     6
	instanceVariableNames:'method module function asm prologue epilogue contextSetup context
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
     7
		stack'
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
	classVariableNames:'SelectorSpecialCharMappingTable'
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
     9
	poolDictionaries:'DragonFly::C1LLVMTypes LLVMIntPredicate VMData VMOffsets'
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
	category:'DragonFly-C1'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
!C1Compiler class methodsFor:'class initialization'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
initialize
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
    "Invoked at system start or when the class is dynamically loaded."
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
    "/ please change as required (and remove this comment)
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
    SelectorSpecialCharMappingTable := Dictionary withKeysAndValues:
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
                #($+ 'pl'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
                  $- 'mi'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
                  $* 'mu'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
                  $/ 'di'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
                  $, 'co'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
                  $@ 'at'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
                  $< 'le'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
                  $> 'gr'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
                  $= 'eq'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
                  $~ 'ne'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
                  $| 'pi'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
                  $\ 'mo'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
                  $& 'am').
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
    "Created: / 09-02-2016 / 08:43:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
!C1Compiler class methodsFor:'compilation'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
compile: method
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
    ^ self new compile: method
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
    "Created: / 09-02-2016 / 08:47:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
!C1Compiler class methodsFor:'utilities'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
functionNameForClass: class selector: selector      
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
    "For given class name and selector, returns the name 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
     used by LLVM"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
    ^ String streamContents:[ :s|
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
        s nextPutAll: '__M_D_'.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
        s nextPutAll: (class name copyReplaceAll: $: with: $_).
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
        s nextPut: $_.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
        selector isBinarySelector ifTrue:[ 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
            selector do:[:c |     
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
                s nextPutAll: (SelectorSpecialCharMappingTable at: c)
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
            ].
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
        ] ifFalse:[ 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
            selector do:[:c |  
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
                c isAlphaNumeric ifTrue:[ 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
                    s nextPut: c 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
                ] ifFalse:[
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
                    s nextPut: $_.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
                    c == $: ifFalse:[ 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
                        c codePoint printOn: s.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
                    ]
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
                ].
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
            ]
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
        ].
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
    ].
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
    "
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
    C1Compiler functionNameForClass: C1Compiler selector: #functionNameForClass:selector: 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
    C1Compiler functionNameForClass: SmallInteger selector: #+
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
    C1Compiler functionNameForClass: Object selector: #~=
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
    C1Compiler functionNameForClass: JavaVM selector: #_ALOAD:
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
    "
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
    "Created: / 09-02-2016 / 08:44:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    85
!C1Compiler methodsFor:'accessing'!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    86
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    87
functionSEND: nArgs
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    88
    | f |
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    89
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    90
    self assert: (nArgs between: 0 and:15).
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    91
    f := module getFunctionNamed: '_SEND', nArgs printString.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    92
    f isNil ifTrue:[ 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    93
        f := module addFunctionNamed: '_SEND', nArgs printString type: (TyOBJFUNCs at: nArgs + 1).
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    94
    ].
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    95
    ^ f
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    96
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    97
    "Created: / 20-04-2016 / 21:39:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    98
! !
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    99
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
!C1Compiler methodsFor:'compilation'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
compile: aMethod
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
    | name |
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
    method := aMethod.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
    name := self class functionNameForClass: method mclass ? UndefinedObject selector: method selector ? '<unbound>'.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
    module := LLVMModule newWithName: name.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
    function := module addFunctionNamed: name type: (TyOBJFUNCs at: method numArgs + 1).
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
    asm := LLVMIRBuilder new.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
    self prologue.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
    self epilogue.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
    "Created: / 09-02-2016 / 08:52:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
    "Modified: / 15-04-2016 / 23:38:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
!C1Compiler methodsFor:'private'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
epilogue
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   120
    epilogue isNil ifTrue:[ 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   121
        epilogue := function addBasicBlockNamed: 'epilogue'.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   122
    ].
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   123
    asm continue: epilogue.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   124
    asm ret: self loadReceiver
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
    "Created: / 15-04-2016 / 23:38:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   127
    "Modified: / 20-04-2016 / 22:12:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
prologue
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
    | classOfReceiver classInILC classCheckFailedBlock classCheckPassedBlock classCheck |
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
    prologue := function addBasicBlockNamed: 'prologue'.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
    asm block: prologue.
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   134
    classOfReceiver := self loadClassOf:(function parameterAt:OBJFUNCArgIndexReceiver).
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   135
    classInILC := self loadClassFromILC:(function parameterAt:OBJFUNCArgIndexILC).
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
    classCheckFailedBlock := function addBasicBlockNamed: 'prologue.class-check-failed'. 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
    classCheckPassedBlock := function addBasicBlockNamed: 'prologue.class-check-passed'.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
    classCheck := asm icmp: (asm ptr: classOfReceiver toInt: LLVMType intptr)
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
                         _: (asm ptr: classInILC toInt: LLVMType intptr)
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
                      cond: LLVMIntEQ.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
    asm if: classCheck then: classCheckPassedBlock else: classCheckFailedBlock.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
    "/ Class check failed, call _SENDX()"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
    asm block: classCheckFailedBlock.
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   145
    asm ret: (
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   146
        asm call: (self functionSEND:method numArgs) _: { 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   147
            function parameterAt: OBJFUNCArgIndexReceiver.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   148
            function parameterAt: OBJFUNCArgIndexSelector.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   149
            function parameterAt: OBJFUNCArgIndexSearchClass.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   150
            function parameterAt: OBJFUNCArgIndexILC } , 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   151
            (1 to: method numArgs collect:[:i | function parameterAt: OBJFUNCArgIndexArgBase + i ])
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   152
    ).
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
    "/ Classes match, continue.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
    asm block: classCheckPassedBlock.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   156
    self contextSetup.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   157
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
    "Created: / 09-02-2016 / 17:07:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   159
    "Modified: / 20-04-2016 / 23:32:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   162
!C1Compiler methodsFor:'private-context setup'!
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   164
contextSetup
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   165
    contextSetup := function addBasicBlockNamed:'context-setup'.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   166
    asm continue:contextSetup.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   167
    context := asm alloca:(C1LLVMTypes 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   168
                    tyContext:(method numArgs + method numVars + method numTemps))
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   169
            as:'__context'.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   170
    asm store:self loadReceiver
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   171
        _:(asm gep:context at:{ 0 . TyContextFieldIndexReceiver }).
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   172
    asm store:self loadSelector
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   173
        _:(asm gep:context at:{ 0 . TyContextFieldIndexSelector }).
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   174
    asm store:self loadSearchClass
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   175
        _:(asm gep:context at:{ 0 . TyContextFieldIndexSearchClass }).
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   176
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   177
    "Created: / 20-04-2016 / 23:12:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   178
! !
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   179
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   180
!C1Compiler methodsFor:'private-load / store'!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   181
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   182
loadClassFromILC:pIlc 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   183
    self assert:pIlc type = TyInlineCachePtr.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   184
    ^ asm load:(asm gep:pIlc at:{ 0 . TyInlineCacheIndexClass })
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   185
             "Created: / 12-02-2016 / 13:19:19 / Jan Vrany <jan.vrany@fit.cvut.cz>" "Modified: / 15-04-2016 / 23:18:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   186
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   188
loadClassOf:obj 
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
    ^ asm 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   190
        select:(self isSmallIntegerObject:obj)
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   191
        then:self loadClassSmallInteger
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   192
        else:(asm load:(asm gep:obj at:{ 0 . TyInstanceFieldIndexClass })).
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
    "Created: / 09-02-2016 / 17:25:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   195
    "Modified: / 20-04-2016 / 21:45:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   196
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   197
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   198
loadClassSmallInteger
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   199
    | addr |
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   200
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   201
    addr := asm int:(LLVMConstant uintptr:ADDR_SmallInteger)
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   202
            toPtr:TyOBJ pointer.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   203
    ^ asm load:addr.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   204
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   205
    "Created: / 12-02-2016 / 11:54:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   206
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   207
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   208
loadNil
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   209
    ^ asm int: (LLVMConstant uintptr: 0) toPtr:TyOBJ pointer.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   210
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   211
    "Created: / 20-04-2016 / 22:08:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   212
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   213
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   214
loadReceiver
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   215
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   216
        ifTrue:[ function parameterAt: OBJFUNCArgIndexReceiver ]
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   217
        ifFalse:[ asm load: (asm gep: context at:{ 0 . TyContextFieldIndexReceiver }) ]
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   218
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   219
    "Created: / 20-04-2016 / 22:09:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   220
    "Modified: / 20-04-2016 / 23:25:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   221
!
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   222
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   223
loadSearchClass
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   224
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   225
        ifTrue:[ function parameterAt: OBJFUNCArgIndexSearchClass ]
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   226
        ifFalse:[ asm load: (asm gep: context at:{ 0 . TyContextFieldIndexSearchClass }) ]
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   227
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   228
    "Created: / 20-04-2016 / 23:27:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   229
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   230
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   231
loadSelector
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   232
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   233
        ifTrue:[ function parameterAt: OBJFUNCArgIndexSelector ]
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   234
        ifFalse:[ asm load: (asm gep: context at:{ 0 . TyContextFieldIndexSelector }) ]
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   235
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   236
    "Created: / 20-04-2016 / 23:24:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   237
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   239
!C1Compiler methodsFor:'private-testing'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   240
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   241
isSmallIntegerObject: value
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   242
    self assert: value type = TyOBJ.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   243
    ^ asm icmp: (asm and: (asm ptr: value toInt: LLVMType intptr) _: (LLVMConstant uintptr: 1))
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   244
             _: (LLVMConstant uintptr: 1)
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   245
          cond: LLVMIntEQ
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   246
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   247
    "Created: / 09-02-2016 / 17:30:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   248
    "Modified: / 12-02-2016 / 11:55:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   249
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   250
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   251
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   252
C1Compiler initialize!