c1/DragonFly__C1Compiler.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 20 Jun 2016 09:38:10 +0100
changeset 28 4bdee0ee3d83
parent 27 73e7acbd16ff
child 29 5693302d4e24
permissions -rw-r--r--
Initial support for literals
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
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
    20
		literals literalsBaseAddr 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
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   164
    object := CompiledCodeObject forCompiledCode: method text: 0 literals: literals size ilcs: 0.
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   165
    literals notEmptyOrNil ifTrue:[ 
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   166
        literalsSection := object literals.
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   167
        1 to: literals size do:[:i | 
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   168
            literalsSection at: i put: (literals at: i).
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   169
        ].
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   170
        literalsBaseAddr initializer: (LLVMConstant pointer: literalsSection address type: TyOBJVec)
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   171
    ].
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   172
    module verify.
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   173
    mm := C1LLVMMCJITMemoryManager for: object.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   174
    opts := LLVMMCJITCompilerOptions new.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   175
    opts MCJMM: mm.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   176
    jit := LLVMExecutionEngine newForModule: module options: opts.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   177
    method code: (jit addressOfFunction: function).
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
    "Created: / 21-04-2016 / 09:19:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   180
    "Modified: / 20-06-2016 / 09:22:34 / 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
   181
!
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   182
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   183
prepare
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   184
    | name |
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   185
    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
   186
    module := LLVMModule newWithName: name.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
    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
   188
    (function parameterAt: OBJFUNCArgIndexReceiver) name: 'zelf'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   189
    (function parameterAt: OBJFUNCArgIndexSelector) name: 'selector'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   190
    (function parameterAt: OBJFUNCArgIndexSearchClass) name: 'searchClass'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   191
    (function parameterAt: OBJFUNCArgIndexILC) name: 'pilc'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   192
    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
   193
    asm := function builder.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   194
    literals := OrderedCollection with: method.
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   195
    literalsBaseAddr := module addGlobalNamed: '__literals' value: (LLVMConstant null: TyOBJVec)
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   197
    "Created: / 21-04-2016 / 09:17:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   198
    "Modified: / 20-06-2016 / 20:28:18 / 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
   199
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   200
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   201
!C1Compiler methodsFor:'private'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   202
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   203
epilogue
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   204
    asm continue: epilogue.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   205
    asm ret: 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   206
        (asm call: self function__MKREALCONTEXT5
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   207
                _: { self loadRetvalTemp })
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   208
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   209
    "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
   210
    "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
   211
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   212
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   213
functionNamed: name type: type
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   214
    | f |
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 := module getFunctionNamed: name.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   217
    f isNil ifTrue:[ 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   218
        f := module addFunctionNamed: name type: type
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   219
    ].
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   220
    ^ f
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   221
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   222
    "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
   223
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   224
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   225
prologue
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   226
    | classOfReceiver classInILC classCheck |
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   227
    prologue := function addBasicBlockNamed: 'prologue'.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   228
    epilogue := function addBasicBlockNamed: 'epilogue'.
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   229
    asm continue: prologue.
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   230
    classOfReceiver := self loadClassOf:(function parameterAt:OBJFUNCArgIndexReceiver).
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   231
    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
   232
    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
   233
                         _: (asm ptr: classInILC toInt: LLVMType intptr)
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   234
                      cond: LLVMIntNE.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   235
    asm if: classCheck"failed" then: [
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   236
        "/ Class check failed, call _SENDX()"
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   237
        asm ret: (
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   238
            asm call: (self functionSEND:method numArgs) _: { 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   239
                function parameterAt: OBJFUNCArgIndexReceiver.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   240
                function parameterAt: OBJFUNCArgIndexSelector.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   241
                function parameterAt: OBJFUNCArgIndexSearchClass.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   242
                function parameterAt: OBJFUNCArgIndexILC } , 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   243
                (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
   244
        ).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   245
    ].
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   246
    self contextSetup.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   247
    asm continue: (function addBasicBlockNamed:'body').
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   248
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   249
    "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
   250
    "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
   251
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   252
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   253
!C1Compiler methodsFor:'private-context setup'!
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   254
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   255
contextSetup
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   256
    | flags |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   257
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   258
    contextSetup := function addBasicBlockNamed:'context-setup'.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   259
    asm continue:contextSetup.
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   260
    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
   261
                       as:'__context'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   262
    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
   263
             | __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
   264
             | (method numArgs  bitShift: __NARG_SHIFT)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   265
             | (method numVars  bitShift: __NVAR_SHIFT)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   266
             | (method numTemps bitShift: __NTMP_SHIFT).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   267
    asm store:(self loadSmallInteger: flags)  
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   268
           at:(asm gep:context at:{ 0 . TyContextFieldIndexFlags }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   269
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   270
     asm store:(self loadLiteral: method)  
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   271
          at:(asm gep:context at:{ 0 . TyContextFieldIndexMethod }).      
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   272
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   273
    asm store:self loadReceiver
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   274
          at:(asm gep:context at:{ 0 . TyContextFieldIndexReceiver }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   275
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   276
    asm store:self loadSelector
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   277
           at:(asm gep:context at:{ 0 . TyContextFieldIndexSelector }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   278
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   279
    asm store:self loadSearchClass
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   280
           at:(asm gep:context at:{ 0 . TyContextFieldIndexSearchClass }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   281
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   282
    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
   283
           at:(asm gep:context at:{ 0 . TyContextFieldIndexSenderS }).
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   284
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   285
    self storeThisContext: context.
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   286
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   287
    "Created: / 20-04-2016 / 23:12:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   288
    "Modified: / 20-06-2016 / 20:44:18 / 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
   289
! !
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   290
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   291
!C1Compiler methodsFor:'private-load / store'!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   292
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   293
loadClassFromILC:pIlc 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   294
    self assert:pIlc type = TyInlineCachePtr.
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   295
    ^ 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
   296
             "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
   297
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   298
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   299
loadClassOf:obj
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   300
    | class1 class2 class3 class23|
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   301
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   302
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   303
    asm if: (self isNilObject: obj) then:[ 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   304
        class1 := self loadClassUndefinedObject.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   305
    ] else: [ 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   306
        asm if: (self isSmallIntegerObject:obj) then: [
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   307
            class2 := self loadClassSmallInteger.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   308
        ] else:[  
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   309
            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
   310
        ].
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   311
        class23 := asm phi: { class2 . class3 }.
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   312
    ].
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   313
    ^ asm phi: { class1 . class23 }
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   314
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   315
    "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
   316
    "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
   317
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   318
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   319
loadClassSmallInteger
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   320
    | addr |
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   321
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   322
    addr := asm 
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   323
                int:(LLVMConstant uintptr:ADDR_SmallInteger)
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   324
                toPtr:TyOBJ pointer
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   325
                as:'ADDR_SmallInteger'.
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   326
    ^ asm load:addr as: 'SmallInteger'.
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   327
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   328
    "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
   329
    "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
   330
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   331
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   332
loadClassUndefinedObject
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   333
    | addr |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   334
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   335
    addr := asm 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   336
                int:(LLVMConstant uintptr:ADDR_UndefinedObject )
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   337
                toPtr:TyOBJ pointer
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   338
                as:'ADDR_UndefinedObject'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   339
    ^ asm load:addr as: 'UndefinedObject'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   340
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   341
    "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
   342
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   343
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   344
loadLiteral: anObject
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   345
    | index |
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   346
    anObject class == SmallInteger ifTrue:[ 
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   347
        ^ self loadSmallInteger: anObject.  
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   348
    ].
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   349
    anObject isNil ifTrue:[ 
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   350
        ^ self loadNil.
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   351
    ].
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   352
    index := literals identityIndexOf: anObject.
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   353
    index == 0 ifTrue:[
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   354
        literals add: anObject.
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   355
        index := literals size.
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   356
    ].
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   357
    ^ asm load: (asm gep: (asm load: literalsBaseAddr) at: index - 1)
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   358
            as: ('literal_', index printString)
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   359
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   360
    "Created: / 20-06-2016 / 20:41:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   361
    "Modified: / 20-06-2016 / 23:35:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   362
!
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   363
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   364
loadNil
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   365
    ^ asm int:(LLVMConstant uintptr:0) toPtr:TyOBJ as: 'nil'
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   366
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   367
    "Created: / 21-04-2016 / 13:59:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   368
    "Modified: / 20-06-2016 / 23:36: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
   369
!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   370
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   371
loadReceiver
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   372
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   373
        ifTrue:[ function parameterAt: OBJFUNCArgIndexReceiver ]
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   374
        ifFalse:[ asm load: (asm gep: context at:{ 0 . TyContextFieldIndexReceiver }) as: 'zelf' ]
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   375
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   376
    "Created: / 20-04-2016 / 22:09:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   377
    "Modified: / 20-06-2016 / 23:37: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
   378
!
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   379
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   380
loadRetvalTemp
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   381
    self assert: context notNil description: 'No context!!'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   382
    ^ 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
   383
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   384
    "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
   385
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   386
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   387
loadSearchClass
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   388
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   389
        ifTrue:[ function parameterAt: OBJFUNCArgIndexSearchClass ]
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   390
        ifFalse:[ asm load: (asm gep: context at:{ 0 . TyContextFieldIndexSearchClass }) as: 'searchClass' ]
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   391
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   392
    "Created: / 20-04-2016 / 23:27:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   393
    "Modified: / 20-06-2016 / 23:37:24 / 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
   394
!
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   395
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   396
loadSelector
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   397
    ^ context isNil 
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   398
        ifTrue:[ function parameterAt: OBJFUNCArgIndexSelector ]
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   399
        ifFalse:[ asm load: (asm gep: context at:{ 0 . TyContextFieldIndexSelector }) as: 'selector']
18
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   400
81ed8ce0852f C1: Added context setup code.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   401
    "Created: / 20-04-2016 / 23:24:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   402
    "Modified: / 20-06-2016 / 23:37:33 / 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
   403
!
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
loadSmallInteger: value
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   406
    self assert: (value between: SmallInteger minVal and: SmallInteger maxVal).
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   407
    ^asm int: (LLVMConstant sintptr: (value << 1) + 1) toPtr: TyOBJ as:'smallint_', value printString
27
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
    "Created: / 18-06-2016 / 22:15:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
28
4bdee0ee3d83 Initial support for literals
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 27
diff changeset
   410
    "Modified: / 20-06-2016 / 23:37:55 / 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
   411
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   412
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   413
loadThisContext
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   414
    | addr |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   415
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   416
    addr := asm 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   417
                int:(LLVMConstant uintptr:ADDR___thisContext)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   418
                toPtr:TyOBJ pointer
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   419
                as:'ADDR___thisContext'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   420
    ^ asm load:addr as: '__thisContext'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   421
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   422
    "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
   423
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   424
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   425
storeRetvalTemp: value
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   426
    self assert: context notNil description: 'No context!!'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   427
    ^ 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
   428
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   429
    "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
   430
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   431
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   432
storeThisContext: value
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   433
    | addr valueAsOBJ |
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   434
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   435
    valueAsOBJ := value type = TyOBJ 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   436
        ifTrue:[ value ]
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   437
        ifFalse:[ asm bitcast: value to: TyOBJ ].
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   438
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   439
    addr := asm 
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   440
                int:(LLVMConstant uintptr:ADDR___thisContext)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   441
                toPtr:TyOBJ pointer
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   442
                as:'ADDR___thisContext'.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   443
    asm store: valueAsOBJ at: addr.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   444
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   445
    "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
   446
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   447
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   448
!C1Compiler methodsFor:'private-testing'!
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   449
27
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   450
isNilObject: value
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   451
    self assert: value type = TyOBJ.
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   452
    ^ 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
   453
             _: (LLVMConstant uintptr: 0)
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   454
          cond: LLVMIntEQ
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   455
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   456
    "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
   457
!
73e7acbd16ff Simple method prologue / epilogue implementation
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 26
diff changeset
   458
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   459
isSmallIntegerObject: value
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   460
    self assert: value type = TyOBJ.
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   461
    ^ 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
   462
             _: (LLVMConstant uintptr: 1)
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   463
          cond: LLVMIntEQ
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   464
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   465
    "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
   466
    "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
   467
! !
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   468
19
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   469
!C1Compiler class methodsFor:'documentation'!
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   470
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   471
version_HG
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   472
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   473
    ^ '$Changeset: <not expanded> $'
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   474
! !
51a3540a2a10 C1: Added C1Compiler #prepare/#finish
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 17
diff changeset
   475
17
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   476
54798ae989cc Initial work on LLVM-based C1 compiler
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   477
C1Compiler initialize!