c1/DragonFly__C1Compiler.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 17 Jun 2016 23:50:59 +0100
changeset 27 73e7acbd16ff
parent 26 8eb6716029aa
child 28 4bdee0ee3d83
permissions -rw-r--r--
Simple method prologue / epilogue implementation * prologue always allocate a new context and updates __thisContext register. * epilogue always fetches return value from retvalTemp and calls __MKREALCONTEXT5() This should do for now, even though this is not always the most effective way of doing things.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     1
"
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     2
    Copyright (C) 2016-now Jan Vrany
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     3
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     4
    This code is not an open-source (yet). You may use this code
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     5
    for your own experiments and projects, given that:
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     6
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     7
    * all modification to the code will be sent to the
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     8
      original author for inclusion in future releases
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
     9
    * this is not used in any commercial software
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    10
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    11
    This license is provisional and may (will) change in
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    12
    a future.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    13
"
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
"{ Package: 'jv:dragonfly/c1' }"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
"{ NameSpace: DragonFly }"
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
Object subclass:#C1Compiler
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
    19
	instanceVariableNames:'method module function asm prologue epilogue contextSetup
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
    20
		literals context stack'
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
	classVariableNames:'SelectorSpecialCharMappingTable'
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
    22
	poolDictionaries:'DragonFly::C1LLVMTypes LLVMIntPredicate VMData VMOffsets
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
    23
		VMConstants'
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
	category:'DragonFly-C1'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
23
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    27
!C1Compiler class methodsFor:'documentation'!
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    28
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    29
copyright
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    30
"
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    31
    Copyright (C) 2016-now Jan Vrany
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    32
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    33
    This code is not an open-source (yet). You may use this code
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    34
    for your own experiments and projects, given that:
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    35
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    36
    * all modification to the code will be sent to the
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    37
      original author for inclusion in future releases
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    38
    * this is not used in any commercial software
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    39
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    40
    This license is provisional and may (will) change in
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    41
    a future.
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    42
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    43
"
d2d9a2d4d6bf Added README, licenses and copyright notices.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
    44
! !
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
    45
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
!C1Compiler class methodsFor:'class initialization'!
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
initialize
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
    "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
    50
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
    "/ 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
    52
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
    SelectorSpecialCharMappingTable := Dictionary withKeysAndValues:
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
                #($+ 'pl'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
                  $- 'mi'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
                  $* 'mu'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
                  $/ 'di'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
                  $, 'co'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
                  $@ 'at'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
                  $< 'le'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
                  $> 'gr'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
                  $= 'eq'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
                  $~ 'ne'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
                  $| 'pi'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
                  $\ 'mo'
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
                  $& 'am').
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
    "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
    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
!C1Compiler class methodsFor:'compilation'!
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
compile: method
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
    ^ self new compile: method
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
    "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
    77
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
!C1Compiler class methodsFor:'utilities'!
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
functionNameForClass: class selector: selector      
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
    "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
    83
     used by LLVM"
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
    ^ String streamContents:[ :s|
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
        s nextPutAll: '__M_D_'.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
        s nextPutAll: (class name copyReplaceAll: $: with: $_).
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
        s nextPut: $_.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
        selector isBinarySelector ifTrue:[ 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
            selector do:[:c |     
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
                s nextPutAll: (SelectorSpecialCharMappingTable at: c)
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
            ].
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
        ] ifFalse:[ 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    94
            selector do:[:c |  
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
                c isAlphaNumeric ifTrue:[ 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
                    s nextPut: c 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
                ] ifFalse:[
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
                    s nextPut: $_.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
                    c == $: ifFalse:[ 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
                        c codePoint printOn: s.
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
                ].
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
            ]
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   104
        ].
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
    ].
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
    "
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
    C1Compiler functionNameForClass: C1Compiler selector: #functionNameForClass:selector: 
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
    C1Compiler functionNameForClass: SmallInteger selector: #+
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
    C1Compiler functionNameForClass: Object selector: #~=
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
    C1Compiler functionNameForClass: JavaVM selector: #_ALOAD:
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
    "
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   114
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
    "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
   116
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   118
!C1Compiler methodsFor:'accessing'!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   119
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   120
functionSEND: nArgs
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   121
    | name |
18
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
    self assert: (nArgs between: 0 and:15).
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   124
    name := '_SEND', nArgs printString.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   125
    ^ self functionNamed: name type: (TyOBJFUNCs at: nArgs + 1).
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   126
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   127
    "Created: / 20-04-2016 / 21:39:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   128
    "Modified: / 17-06-2016 / 23:25:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   129
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   130
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   131
function__MKREALCONTEXT5
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   132
    ^ self functionNamed: '__MKREALCONTEXT5' type: TyMKREALCONTEXT5
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   133
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   134
    "Created: / 17-06-2016 / 23:25:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
26
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23 18
diff changeset
   135
!
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23 18
diff changeset
   136
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   137
method
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   138
    ^ method
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   139
!
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   140
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   141
method:aMethod
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   142
    method := aMethod.
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   143
! !
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   144
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
!C1Compiler methodsFor:'compilation'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
compile: aMethod
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   148
    self method: aMethod.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   149
    self prepare.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   150
    self prologue.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   151
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   152
    self epilogue.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   153
    self finish.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   154
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   155
    "Created: / 09-02-2016 / 08:52:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   156
    "Modified: / 21-04-2016 / 09:18:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   157
!
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   158
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   159
finish
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   160
    "Finish the compilation, i.e., generate machine code
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   161
     and update method's code pointer"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   162
    | opts mm object jit literalsSection |
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   163
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   164
    module verify.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   165
    object := CompiledCodeObject forCompiledCode: method text: 0 literals: literals size ilcs: 0.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   166
    literalsSection := object literals.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   167
    1 to: literals size do:[:i | 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   168
        literalsSection at: i put: (literals at: i).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   169
    ].
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   170
    mm := C1LLVMMCJITMemoryManager for: object.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   171
    opts := LLVMMCJITCompilerOptions new.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   172
    opts MCJMM: mm.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   173
    jit := LLVMExecutionEngine newForModule: module options: opts.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   174
    method code: (jit addressOfFunction: function).
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   175
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   176
    "Created: / 21-04-2016 / 09:19:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   177
    "Modified: / 18-06-2016 / 22:27:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   178
!
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   179
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   180
prepare
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   181
    | name |
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   182
    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
   183
    module := LLVMModule newWithName: name.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   184
    function := module addFunctionNamed: name type: (TyOBJFUNCs at: method numArgs + 1).
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   185
    (function parameterAt: OBJFUNCArgIndexReceiver) name: 'zelf'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   186
    (function parameterAt: OBJFUNCArgIndexSelector) name: 'selector'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   187
    (function parameterAt: OBJFUNCArgIndexSearchClass) name: 'searchClass'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   188
    (function parameterAt: OBJFUNCArgIndexILC) name: 'pilc'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   189
    1 to: method numArgs do:[:i | (function parameterAt: OBJFUNCArgIndexArgBase + i) name: 'arg' , i printString ].
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   190
    asm := function builder.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   191
    literals := OrderedCollection with: method.
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   192
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   193
    "Created: / 21-04-2016 / 09:17:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   194
    "Modified: / 18-06-2016 / 22:26:21 / 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
   195
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   197
!C1Compiler methodsFor:'private'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   198
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   199
epilogue
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   200
    asm continue: epilogue.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   201
    asm ret: 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   202
        (asm call: self function__MKREALCONTEXT5
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   203
                _: { self loadRetvalTemp })
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   204
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   205
    "Created: / 15-04-2016 / 23:38:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   206
    "Modified: / 17-06-2016 / 23:27:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   207
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   208
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   209
functionNamed: name type: type
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   210
    | f |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   211
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   212
    f := module getFunctionNamed: name.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   213
    f isNil ifTrue:[ 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   214
        f := module addFunctionNamed: name type: type
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   215
    ].
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   216
    ^ f
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   217
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   218
    "Created: / 17-06-2016 / 23:23:41 / 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
   219
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   220
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   221
prologue
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   222
    | classOfReceiver classInILC classCheck |
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   223
    prologue := function addBasicBlockNamed: 'prologue'.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   224
    epilogue := function addBasicBlockNamed: 'epilogue'.
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   225
    asm continue: prologue.
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   226
    classOfReceiver := self loadClassOf:(function parameterAt:OBJFUNCArgIndexReceiver).
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   227
    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
   228
    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
   229
                         _: (asm ptr: classInILC toInt: LLVMType intptr)
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   230
                      cond: LLVMIntNE.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   231
    asm if: classCheck"failed" then: [
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   232
        "/ Class check failed, call _SENDX()"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   233
        asm ret: (
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   234
            asm call: (self functionSEND:method numArgs) _: { 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   235
                function parameterAt: OBJFUNCArgIndexReceiver.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   236
                function parameterAt: OBJFUNCArgIndexSelector.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   237
                function parameterAt: OBJFUNCArgIndexSearchClass.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   238
                function parameterAt: OBJFUNCArgIndexILC } , 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   239
                (1 to: method numArgs collect:[:i | function parameterAt: OBJFUNCArgIndexArgBase + i ])
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   240
        ).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   241
    ].
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   242
    self contextSetup.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   243
    asm continue: (function addBasicBlockNamed:'body').
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   244
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   245
    "Created: / 09-02-2016 / 17:07:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   246
    "Modified: / 17-06-2016 / 23:32:13 / 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
   247
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   248
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   249
!C1Compiler methodsFor:'private-context setup'!
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   250
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   251
contextSetup
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   252
    | flags |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   253
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   254
    contextSetup := function addBasicBlockNamed:'context-setup'.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   255
    asm continue:contextSetup.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   256
    context := asm alloca:(C1LLVMTypes tyContext:(method numArgs + method numVars + method numTemps))
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   257
                       as:'__context'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   258
    flags :=   (method isJavaMethod ifTrue:[ __LAZYJCON ] ifFalse:[ method isBlock ifTrue:[ __LAZYBCON ] ifFalse:[ __LAZYMCON ]])
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   259
             | __CANNOT_RETURN "/ For now, we don't (yet) fill setjmp() buffer
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   260
             | (method numArgs  bitShift: __NARG_SHIFT)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   261
             | (method numVars  bitShift: __NVAR_SHIFT)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   262
             | (method numTemps bitShift: __NTMP_SHIFT).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   263
    asm store:(self loadSmallInteger: flags)  
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   264
           at:(asm gep:context at:{ 0 . TyContextFieldIndexFlags }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   265
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   266
    asm store:self loadReceiver
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   267
          at:(asm gep:context at:{ 0 . TyContextFieldIndexReceiver }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   268
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   269
    asm store:self loadSelector
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   270
           at:(asm gep:context at:{ 0 . TyContextFieldIndexSelector }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   271
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   272
    asm store:self loadSearchClass
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   273
           at:(asm gep:context at:{ 0 . TyContextFieldIndexSearchClass }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   274
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   275
    asm store:(asm bitcast: self loadThisContext to: LLVMType intptr pointer)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   276
           at:(asm gep:context at:{ 0 . TyContextFieldIndexSenderS }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   277
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   278
    self storeThisContext: context.
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   279
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   280
    "Created: / 20-04-2016 / 23:12:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   281
    "Modified: / 18-06-2016 / 23:43:15 / 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
   282
! !
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   283
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   284
!C1Compiler methodsFor:'private-load / store'!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   285
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   286
loadClassFromILC:pIlc 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   287
    self assert:pIlc type = TyInlineCachePtr.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   288
    ^ 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
   289
             "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
   290
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   291
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   292
loadClassOf:obj
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   293
    | class1 class2 class3 class23|
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   294
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   295
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   296
    asm if: (self isNilObject: obj) then:[ 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   297
        class1 := self loadClassUndefinedObject.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   298
    ] else: [ 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   299
        asm if: (self isSmallIntegerObject:obj) then: [
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   300
            class2 := self loadClassSmallInteger.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   301
        ] else:[  
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   302
            class3 := (asm load:(asm gep:obj at:{ 0 . TyInstanceFieldIndexClass })).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   303
        ].
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   304
        class23 := asm phi: { class2 . class3 }.
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   305
    ].
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   306
    ^ asm phi: { class1 . class23 }
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   307
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   308
    "Created: / 09-02-2016 / 17:25:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   309
    "Modified: / 18-06-2016 / 20:50:51 / 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
   310
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   311
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   312
loadClassSmallInteger
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   313
    | addr |
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   314
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   315
    addr := asm 
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   316
                int:(LLVMConstant uintptr:ADDR_SmallInteger)
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   317
                toPtr:TyOBJ pointer
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   318
                as:'ADDR_SmallInteger'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   319
    ^ asm load:addr as: 'SmallInteger'.
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   320
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   321
    "Created: / 12-02-2016 / 11:54:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   322
    "Modified: / 21-04-2016 / 17:03:02 / 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
   323
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   324
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   325
loadClassUndefinedObject
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   326
    | addr |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   327
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   328
    addr := asm 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   329
                int:(LLVMConstant uintptr:ADDR_UndefinedObject )
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   330
                toPtr:TyOBJ pointer
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   331
                as:'ADDR_UndefinedObject'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   332
    ^ asm load:addr as: 'UndefinedObject'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   333
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   334
    "Created: / 18-06-2016 / 00:47:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   335
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   336
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   337
loadNil
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   338
    ^ asm int:(LLVMConstant uintptr:0) toPtr:TyOBJ.
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   339
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   340
    "Created: / 21-04-2016 / 13:59:08 / 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
   341
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   342
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   343
loadReceiver
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   344
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   345
        ifTrue:[ function parameterAt: OBJFUNCArgIndexReceiver ]
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   346
        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
   347
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   348
    "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
   349
    "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
   350
!
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   351
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   352
loadRetvalTemp
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   353
    self assert: context notNil description: 'No context!!'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   354
    ^ asm load: (asm gep: context at:{ 0 . TyContextFieldIndexRetvalTemp }) as: 'retvalTemp'
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   355
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   356
    "Created: / 17-06-2016 / 23:13:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   357
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   358
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   359
loadSearchClass
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   360
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   361
        ifTrue:[ function parameterAt: OBJFUNCArgIndexSearchClass ]
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   362
        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
   363
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   364
    "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
   365
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   366
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   367
loadSelector
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   368
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   369
        ifTrue:[ function parameterAt: OBJFUNCArgIndexSelector ]
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   370
        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
   371
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   372
    "Created: / 20-04-2016 / 23:24:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   373
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   374
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   375
loadSmallInteger: value
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   376
    self assert: (value between: SmallInteger minVal and: SmallInteger maxVal).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   377
    ^asm int: (LLVMConstant sintptr: (value << 1) + 1) toPtr: TyOBJ
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   378
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   379
    "Created: / 18-06-2016 / 22:15:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   380
    "Modified: / 18-06-2016 / 23:30:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   381
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   382
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   383
loadThisContext
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   384
    | addr |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   385
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   386
    addr := asm 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   387
                int:(LLVMConstant uintptr:ADDR___thisContext)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   388
                toPtr:TyOBJ pointer
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   389
                as:'ADDR___thisContext'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   390
    ^ asm load:addr as: '__thisContext'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   391
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   392
    "Created: / 17-06-2016 / 23:38:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   393
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   394
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   395
storeRetvalTemp: value
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   396
    self assert: context notNil description: 'No context!!'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   397
    ^ asm store: value at: (asm gep: context at:{ 0 . TyContextFieldIndexRetvalTemp })
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   398
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   399
    "Created: / 17-06-2016 / 23:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   400
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   401
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   402
storeThisContext: value
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   403
    | addr valueAsOBJ |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   404
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   405
    valueAsOBJ := value type = TyOBJ 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   406
        ifTrue:[ value ]
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   407
        ifFalse:[ asm bitcast: value to: TyOBJ ].
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   408
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   409
    addr := asm 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   410
                int:(LLVMConstant uintptr:ADDR___thisContext)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   411
                toPtr:TyOBJ pointer
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   412
                as:'ADDR___thisContext'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   413
    asm store: valueAsOBJ at: addr.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   414
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   415
    "Created: / 17-06-2016 / 23:38:50 / 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
   416
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   417
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   418
!C1Compiler methodsFor:'private-testing'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   419
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   420
isNilObject: value
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   421
    self assert: value type = TyOBJ.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   422
    ^ asm icmp: (asm ptr: value toInt: LLVMType intptr)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   423
             _: (LLVMConstant uintptr: 0)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   424
          cond: LLVMIntEQ
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   425
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   426
    "Created: / 18-06-2016 / 00:48:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   427
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   428
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   429
isSmallIntegerObject: value
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   430
    self assert: value type = TyOBJ.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   431
    ^ 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
   432
             _: (LLVMConstant uintptr: 1)
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   433
          cond: LLVMIntEQ
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   434
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   435
    "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
   436
    "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
   437
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   438
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   439
!C1Compiler class methodsFor:'documentation'!
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   440
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   441
version_HG
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   442
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   443
    ^ '$Changeset: <not expanded> $'
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   444
! !
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   445
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   446
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   447
C1Compiler initialize!