-
Notifications
You must be signed in to change notification settings - Fork 414
Expand file tree
/
Copy pathsystem.reds
More file actions
199 lines (178 loc) · 7.3 KB
/
Copy pathsystem.reds
File metadata and controls
199 lines (178 loc) · 7.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
Red/System [
Title: "Red/System OS-independent runtime"
Author: "Nenad Rakocevic"
File: %system.reds
Tabs: 4
Rights: "Copyright (C) 2011-2018 Red Foundation. All rights reserved."
License: {
Distributed under the Boost Software License, Version 1.0.
See https://github.com/red/red/blob/master/BSL-License.txt
}
]
;-- FPU types returned by system/fpu/type
#define FPU_TYPE_X87 1 ;-- Intel x87 unit
#define FPU_TYPE_SSE 2 ;-- Intel SSE floating point unit
#define FPU_TYPE_VFP 3 ;-- ARM Vector Floating Point unit
;-- FPU values for system/fpu/option/rounding
#define FPU_X87_ROUNDING_NEAREST 0 ;-- (even) rounded result is the closest to the infinitely precise result
#define FPU_X87_ROUNDING_DOWN 1 ;-- (toward -INF) rounded result is the closest to but no greater than the infinitely precise result
#define FPU_X87_ROUNDING_UP 2 ;-- (toward +INF) rounded result is the closest to but no less than the infinitely precise result
#define FPU_X87_ROUNDING_ZERO 3 ;-- (truncate) rounded result is the closest to but no greater in absolute value than the infinitely precise result
#define FPU_VFP_ROUNDING_NEAREST 0 ;-- (even) rounded result is the closest to the infinitely precise result
#define FPU_VFP_ROUNDING_UP 1 ;-- (toward +INF) rounded result is the closest to but no less than the infinitely precise result
#define FPU_VFP_ROUNDING_DOWN 2 ;-- (toward -INF) rounded result is the closest to but no greater than the infinitely precise result
#define FPU_VFP_ROUNDING_ZERO 3 ;-- (truncate) rounded result is the closest to but no greater in absolute value than the infinitely precise result
;-- FPU values for system/fpu/option/precision
#define FPU_X87_PRECISION_SINGLE 0 ;-- 32-bit float, 24-bit mantissa
#define FPU_X87_PRECISION_DOUBLE 2 ;-- 64-bit float, 53-bit mantissa
#define FPU_X87_PRECISION_DOUBLE_EXT 3 ;-- 80-bit float, 64-bit mantissa
;-- FPU values for system/fpu/status
#either target = 'ARM [
#define FPU_EXCEPTION_INVALID_OP 1 ;-- Invalid Operation
#define FPU_EXCEPTION_ZERO_DIVIDE 2 ;-- Zero Divide
#define FPU_EXCEPTION_OVERFLOW 4 ;-- Overflow
#define FPU_EXCEPTION_UNDERFLOW 8 ;-- Underflow
#define FPU_EXCEPTION_PRECISION 16 ;-- Precision
#define FPU_EXCEPTION_DENORMAL_OP 128 ;-- Denormalized Operand
][
#define FPU_EXCEPTION_INVALID_OP 1 ;-- Invalid Operation
#define FPU_EXCEPTION_DENORMAL_OP 2 ;-- Denormalized Operand
#define FPU_EXCEPTION_ZERO_DIVIDE 4 ;-- Zero Divide
#define FPU_EXCEPTION_OVERFLOW 8 ;-- Overflow
#define FPU_EXCEPTION_UNDERFLOW 16 ;-- Underflow
#define FPU_EXCEPTION_PRECISION 32 ;-- Precision
]
heap-frame!: alias struct! [ ;-- LibC malloc frame header
prev [heap-frame!] ;-- previous frame or null
next [heap-frame!] ;-- next frame or null
size [integer!] ;-- size of allocated buffer in bytes
padding [integer!] ;-- preserve eventual 128-bit alignment
]
__heap!: alias struct! [
head [heap-frame!] ;-- first element of heap-allocated frames list
tail [heap-frame!] ;-- last element of heap-allocated frames list
]
__stack!: alias struct! [
top [int-ptr!]
frame [int-ptr!]
align [int-ptr!]
]
__image!: alias struct! [
base [byte-ptr!] ;-- base image address in memory
code [integer!] ;-- code segment offset
code-size [integer!] ;-- code segment size
data [integer!] ;-- data segment offset
data-size [integer!] ;-- data segment size
bitarray [integer!] ;-- offset for function args+locals pointer! bitmaps
rodata [integer!] ;-- protected data offset (dylib: mprotect'd RO on load)
rodata-size [integer!] ;-- protected data size (0 if none / already RO)
]
FPU-exceptions-mask!: alias struct! [ ;-- standard exception mask (true => mask exception)
precision [logic!]
underflow [logic!]
overflow [logic!]
zero-divide [logic!]
denormal [logic!]
invalid-op [logic!]
]
#switch target [
IA-32 [
x87-option!: alias struct! [
rounding [integer!]
precision [integer!]
]
__fpu-struct!: alias struct! [
type [integer!]
option [x87-option!]
mask [FPU-exceptions-mask!]
status [integer!]
control-word [integer!] ;-- direct access to whole control word
epsilon [integer!] ;-- Ulp threshold for almost-equal op (not used yet)
update [integer!] ;-- action simulated using a read-only member
init [integer!] ;-- action simulated using a read-only member
]
__cpu-struct!: alias struct! [
eax [integer!]
ebx [integer!]
ecx [integer!]
edx [integer!]
esp [integer!]
ebp [integer!]
esi [integer!]
edi [integer!]
overflow? [logic!]
]
]
ARM [
VFP-option!: alias struct! [
rounding [integer!]
flush-to-zero [logic!]
NaN-mode [logic!]
]
__fpu-struct!: alias struct! [
type [integer!]
option [VFP-option!]
mask [FPU-exceptions-mask!]
status [integer!]
control-word [integer!] ;-- direct access to whole control word
epsilon [integer!] ;-- Ulp threshold for almost-equal op (not used yet)
update [integer!] ;-- action simulated using a read-only member
init [integer!] ;-- action simulated using a read-only member
]
__cpu-struct!: alias struct! [
r0 [integer!]
r1 [integer!]
r2 [integer!]
r3 [integer!]
r4 [integer!]
r5 [integer!]
r6 [integer!]
r7 [integer!]
r8 [integer!]
r9 [integer!]
r10 [integer!]
r11 [integer!]
r12 [integer!]
r13 [integer!]
r14 [integer!]
r15 [integer!]
overflow? [logic!]
]
]
]
system!: alias struct! [ ;-- store runtime accessible system values
args-count [integer!] ;-- command-line arguments count (do not move member)
args-list [str-array!] ;-- command-line arguments array pointer (do not move member)
env-vars [str-array!] ;-- environment variables array pointer (always null for Windows)
stack [__stack!] ;-- stack virtual access
pc [byte-ptr!] ;-- CPU program counter value
cpu [__cpu-struct!] ;-- CPU registers
fpu [__fpu-struct!] ;-- FPU settings
alias [integer!] ;-- aliases ID virtual access
words [integer!] ;-- global context accessor (dummy type)
thrown [integer!] ;-- last THROWn value
boot-data [byte-ptr!] ;-- Redbin encoded boot data (only for Red programs)
debug [__stack!] ;-- stack info for debugging (set on runtime error only, internal use)
image [__image!] ;-- executable image memory layout info
lib-image [__image!] ;-- executable image memory layout info
heap [__heap!] ;-- dynamically allocated memory frames
stk-root [int-ptr!]
]
#either any [all [libRedRT? = yes type = 'dll] dev-mode? = no red-pass? = no][
system: declare system!
#if all [libRedRT? = yes type = 'dll][#export [system]] ;-- exclude it from libRed
][
#import [LIBREDRT-file stdcall [system: "system" [system!]]]
]
***-exec-image: declare __image! ;-- reference ***-exec-image used by compiler to fill the slots
#either type = 'dll [
***-init-system-image: func [][ ;-- must use a wrapping function so ` copy-memory` is reachable
system/lib-image: declare __image!
copy-memory as byte-ptr! system/lib-image as byte-ptr! system/image size? __image!
]
][ ;-- for libraries, it's set at library loading time.
system/image: ***-exec-image
]
system/heap: declare __heap!
system/heap/head: null
system/heap/tail: null