diff options
| author | Drahflow <drahflow@gmx.de> | 2014-01-11 00:45:50 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2014-01-11 00:45:50 +0100 |
| commit | 58763b56119d08a04a097139c897f0aa10db87b3 (patch) | |
| tree | a12affe8392e3d5f3d5ece47f7d0baa8ddde0e4a /compiler | |
| parent | 5a97fed922105d94c387641e5f8514169ec58faa (diff) | |
Can now pass doubles to C libraries
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/elymasAsmOps.ey | 94 | ||||
| -rw-r--r-- | compiler/elymasGlobalSysAsm.ey | 16 | ||||
| -rw-r--r-- | compiler/standardClient.ey | 66 |
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 |
