From 99635bdbd50bf215c53727ff2f50df935e4fdd04 Mon Sep 17 00:00:00 2001 From: Drahflow Date: Tue, 15 Jan 2013 13:42:10 +0100 Subject: Array creation --- compiler/elymasAsm.ey | 38 ++++++++++++++++++++++++++++ compiler/elymasAsmLib.ey | 64 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 1 deletion(-) (limited to 'compiler') diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey index 62776ab..b307589 100644 --- a/compiler/elymasAsm.ey +++ b/compiler/elymasAsm.ey @@ -249,6 +249,26 @@ i imm8 } /cmpqImm8Reg deff + { ==reg ==mem ==idx + reg bit64assert + mem bit64assert + idx bit64assert + + 1 reg idx mem rex + %3B + reg /sib modrm00 + 1 idx mem sib + } /cmpqMemIndexReg deff + + { ==reg ==mem + reg bit64assert + mem bit64assert + + 1 reg /none mem rex + %3B + reg mem modrm00 + } /cmpqMemReg deff + { ==mem ==reg reg bit64assert mem bit64assert @@ -267,6 +287,14 @@ src dst modrm11 } /cmpqRegReg deff + { ==reg + reg bit64assert + + 1 /none /none reg rex + %FF + /one reg modrm11 + } /decqReg deff + { ==reg reg bit64assert @@ -512,6 +540,16 @@ /five reg modrm11 } /shrq1Reg deff + { ==reg ==i + reg bit64assert + i 64 lt assert + + 1 /none /none reg rex + %C1 + /five reg modrm11 + i imm8 + } /shrqImm8Reg deff + { ==reg ==i reg bit64assert i 256 lt assert diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey index 598be33..bc4d0d2 100644 --- a/compiler/elymasAsmLib.ey +++ b/compiler/elymasAsmLib.ey @@ -238,13 +238,29 @@ :retn ] /internalAllocateFunction defv + + # allocate array, expecting rdi/8 entries + # rdi -> expected number of entry bytes + # rax <- address of array on the heap + [ + 8 /rdi :addqImm8Reg + internalAllocate /rax :movqImmReg + /rax :callqReg + + # set type + %70 7 /rax :orbImmMemDisp8 + + :retn + ] /internalAllocateArray defv > { defv }' allocateOffsetStruct # elymas functions, stack based ABI + 1 ==ARRAYMARKER + # 0 -> integer # 1 -> integer - # 0 <- sum of the above + # 0 <- result of the arithmetic operation { ==opcodes [ /rbx :popqReg @@ -449,6 +465,52 @@ /rax :pushqReg :retn ] /eydump defv + + # array construction, push begin marker on stack + [ + /rax :popqReg + ARRAYMARKER :pushqImm32 + /rax :pushqReg + :retn + ] /ey[ defv + + # array construction, create array from begin marker onwards + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem + + ARRAYMARKER /rax :movqImmReg + /rsp /rdi :movqRegReg + 8 /rdi :subqImm8Reg + @search + 8 /rdi :addqImm8Reg + /rdi /rax :cmpqMemReg + /search :jneLbl8 + + /rdi /rcx :movqRegReg + /rsp /rdi :subqRegReg + /rcx :pushqReg + + # rdi == size of array + internalAllocateArray /rax :movqImmReg + /rax :callqReg + + /rdi :popqReg + /rax /rdi :movqRegMem # store array pointer instead of begin marker + + /rax /ecx :movlMemReg + 3 /rcx :shrqImm8Reg + /rcx :decqReg + + 8 /rax :addqImm8Reg + @copy + /rax :popqMem + /copy :loopLbl8 + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ] :labelResolve /ey] defv > _ ==globalFunctions { defv }' allocateOffsetStruct < -- cgit v1.2.3