aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2014-01-11 00:45:50 +0100
committerDrahflow <drahflow@gmx.de>2014-01-11 00:45:50 +0100
commit58763b56119d08a04a097139c897f0aa10db87b3 (patch)
treea12affe8392e3d5f3d5ece47f7d0baa8ddde0e4a /compiler
parent5a97fed922105d94c387641e5f8514169ec58faa (diff)
Can now pass doubles to C libraries
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasAsmOps.ey94
-rw-r--r--compiler/elymasGlobalSysAsm.ey16
-rw-r--r--compiler/standardClient.ey66
3 files changed, 129 insertions, 47 deletions
diff --git a/compiler/elymasAsmOps.ey b/compiler/elymasAsmOps.ey
index b26aff8..3abf27f 100644
--- a/compiler/elymasAsmOps.ey
+++ b/compiler/elymasAsmOps.ey
@@ -13,23 +13,26 @@
< [ /al /cl /dl /bl /spl /ah /bpl /ch /sil /dh /dil /bh /r8b /r9b /r10b /r11b /r12b /r13b /r14b /r15b ] { 1 -01 defv }' each > ==:bit8table
{ bit8table -01 . -- } /bit8assert deff
+< [ /xmm0 /xmm1 /xmm2 /xmm3 /xmm4 /xmm5 /xmm6 /xmm7 /xmm8 /xmm9 /xmm10 /xmm11 /xmm12 /xmm13 /xmm14 /xmm15 ] { 1 -01 defv }' each > ==:xmmTable
+{ xmmTable -01 . -- } /xmmAssert deff
+
<
- [ /zero /al /ax /eax /rax /none ] { 0 -01 defv }' each
- [ /one /cl /cx /ecx /rcx ] { 1 -01 defv }' each
- [ /two /dl /dx /edx /rdx ] { 2 -01 defv }' each
- [ /three /bl /bx /ebx /rbx ] { 3 -01 defv }' each
- [ /four /sib /spl /ah /sp /esp /rsp ] { 4 -01 defv }' each
- [ /five /bpl /bp /ebp /rbp ] { 5 -01 defv }' each
- [ /six /sil /si /esi /rsi ] { 6 -01 defv }' each
- [ /seven /dil /di /edi /rdi ] { 7 -01 defv }' each
- [ /r8b /r8w /r8d /r8 ] { 8 -01 defv }' each
- [ /r9b /r9w /r9d /r9 ] { 9 -01 defv }' each
- [ /r10b /r10w /r10d /r10 ] { 10 -01 defv }' each
- [ /r11b /r11w /r11d /r11 ] { 11 -01 defv }' each
- [ /r12b /r12w /r12d /r12 ] { 12 -01 defv }' each
- [ /r13b /r13w /r13d /r13 ] { 13 -01 defv }' each
- [ /r14b /r14w /r14d /r14 ] { 14 -01 defv }' each
- [ /r15b /r15w /r15d /r15 ] { 15 -01 defv }' each
+ [ /zero /al /ax /eax /rax /none /xmm0 ] { 0 -01 defv }' each
+ [ /one /cl /cx /ecx /rcx /xmm1 ] { 1 -01 defv }' each
+ [ /two /dl /dx /edx /rdx /xmm2 ] { 2 -01 defv }' each
+ [ /three /bl /bx /ebx /rbx /xmm3 ] { 3 -01 defv }' each
+ [ /four /sib /spl /ah /sp /esp /rsp /xmm4 ] { 4 -01 defv }' each
+ [ /five /bpl /bp /ebp /rbp /xmm5 ] { 5 -01 defv }' each
+ [ /six /sil /si /esi /rsi /xmm6 ] { 6 -01 defv }' each
+ [ /seven /dil /di /edi /rdi /xmm7 ] { 7 -01 defv }' each
+ [ /r8b /r8w /r8d /r8 /xmm8 ] { 8 -01 defv }' each
+ [ /r9b /r9w /r9d /r9 /xmm9 ] { 9 -01 defv }' each
+ [ /r10b /r10w /r10d /r10 /xmm10 ] { 10 -01 defv }' each
+ [ /r11b /r11w /r11d /r11 /xmm11 ] { 11 -01 defv }' each
+ [ /r12b /r12w /r12d /r12 /xmm12 ] { 12 -01 defv }' each
+ [ /r13b /r13w /r13d /r13 /xmm13 ] { 13 -01 defv }' each
+ [ /r14b /r14w /r14d /r14 /xmm14 ] { 14 -01 defv }' each
+ [ /r15b /r15w /r15d /r15 /xmm15 ] { 15 -01 defv }' each
> ==:regnoTable
{ regnoTable -01 . } /regno deff
@@ -350,7 +353,7 @@
} /defAsmAddq deff
{ ==modrmOpcode ==mnemonic
- { ==reg =i
+ { ==reg ==i
reg bit8assert
i 256 lt not { "Imm8 too large" die } rep
@@ -707,6 +710,17 @@ memoryAddressingVariants keys { ==variant memoryAddressingVariants variant . =*p
/cmp %39 defAsmAddq
/cmp /seven defAsmAddImm
+{ ==dst ==src
+ src bit64assert
+ dst xmmAssert
+
+ 1 src /none dst rex
+ %F2
+ %0F
+ %2A
+ src dst modrm11
+} /cvtsi2sdqRegXmm deff
+
{ ==mem
mem bit64assert
@@ -993,6 +1007,52 @@ memoryAddressingVariants keys { ==variant memoryAddressingVariants variant . =*p
/mov %89 defAsmAddl
/mov %89 defAsmAddq
+{ ==dst ==src
+ src bit64assert
+ dst xmmAssert
+
+ %66
+ 1 dst /none src rex
+ %0F
+ %6E
+ dst src modrm11
+} /movqRegXmm deff
+
+memoryAddressingVariants keys { ==variant memoryAddressingVariants variant . =*parse
+ { ==dst parse ==mem
+ dst xmmAssert
+
+ %66
+ 1 dst mem .idx mem .base rex
+ %0F
+ %6E
+ dst mem .encode
+ } /movq variant "Xmm" cat defOp
+} each
+
+{ ==dst ==src
+ src xmmAssert
+ dst bit64assert
+
+ %66
+ 1 src /none dst rex
+ %0F
+ %7E
+ src dst modrm11
+} /movqXmmReg deff
+
+memoryAddressingVariants keys { ==variant memoryAddressingVariants variant . =*parse
+ { parse ==mem ==src
+ src xmmAssert
+
+ %66
+ 1 src mem .idx mem .base rex
+ %0F
+ %7E
+ src mem .encode
+ } /movqXmm variant defOp
+} each
+
{
%A4
} /movsb deff
diff --git a/compiler/elymasGlobalSysAsm.ey b/compiler/elymasGlobalSysAsm.ey
index 1b2ae53..e865f34 100644
--- a/compiler/elymasGlobalSysAsm.ey
+++ b/compiler/elymasGlobalSysAsm.ey
@@ -444,6 +444,22 @@
:retn
]] /eyinternalAllocateString defv
+ # returns internalAllocateFloat into userspace
+ # 0 <- ::internalAllocateFloat as integer
+ [[
+ /rbx :popqReg
+
+ ::internalAllocateInteger /rax :movqImmReg
+ /rax :callqReg
+ /rax :pushqReg
+
+ ::internalAllocateFloat /rdx :movqImmReg
+ /rdx 8 /rax :movqRegMemDisp8
+
+ /rbx :pushqReg
+ :retn
+ ]] /eyinternalAllocateFloat defv
+
# returns internalAllocateScope into userspace
# 0 <- ::internalAllocateScope as integer
[[
diff --git a/compiler/standardClient.ey b/compiler/standardClient.ey
index b950261..9cbc82b 100644
--- a/compiler/standardClient.ey
+++ b/compiler/standardClient.ey
@@ -797,39 +797,45 @@
sys .typed .type [
{ o base16encode64 sys .err .writeall } # integer
{ "\"" o "\"" cat cat sys .err .writeall } # string
- { o ==f 0 ==e "+" ==s
+ { o ==f 0 ==e "+" ==s 0 ==i
f 0 FLOAT lt { 0 FLOAT f sub =f "-" =s } rep
- { f 1 FLOAT lt } { f 10 FLOAT mul =f e 1 sub =e } loop
- { f 10 FLOAT ge } { f 10 FLOAT div =f e 1 add =e } loop
+ { f 1 FLOAT lt i 500 lt and } { f 10 FLOAT mul =f e 1 sub =e i 1 add =i } loop
+ { f 10 FLOAT ge i 500 lt and } { f 10 FLOAT div =f e 1 add =e i 1 add =i } loop
+
+ i 500 eq {
+ s
+ f 1 FLOAT lt "0.0e0" "inf" ?
+ cat sys .err .writeall
+ } {
+ {
+ 0 ==d
+ 1 10 range { ==i f i FLOAT gt { i =d } rep } each
+ f d sub =f
+ f 10 FLOAT mul =f
+ d base10digits *
+ } /extractDigit deffst
- {
- 0 ==d
- 1 10 range { ==i f i FLOAT gt { i =d } rep } each
- f d sub =f
- f 10 FLOAT mul =f
- d base10digits *
- } /extractDigit deffst
-
- [
- 0 s *
- extractDigit
- 0 "." *
- 10 |extractDigit rep
- 0 "e" *
- e 0 lt {
- 0 e sub =e
- 0 "-" *
- } rep
- e 0 eq {
- 0 "0" *
- } rep
[
- { e } {
- e 10 mod base10digits *
- e 10 div =e
- } loop
- ] reverse _ len dearray
- ] str .fromArray sys .err .writeall
+ 0 s *
+ extractDigit
+ 0 "." *
+ 10 |extractDigit rep
+ 0 "e" *
+ e 0 lt {
+ 0 e sub =e
+ 0 "-" *
+ } rep
+ e 0 eq {
+ 0 "0" *
+ } rep
+ [
+ { e } {
+ e 10 mod base10digits *
+ e 10 div =e
+ } loop
+ ] reverse _ len dearray
+ ] str .fromArray sys .err .writeall
+ } ? *
} # float
unknown
invalid # extension area