diff options
| author | Drahflow <drahflow@gmx.de> | 2013-09-10 10:55:17 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-09-10 10:55:17 +0200 |
| commit | b7b2ef2c65a4b6e3d97c1e835ca82484f33f037c (patch) | |
| tree | 8401f9df87bd5c6ab0bba50c9961085d46067a3f | |
| parent | 97d0ff2a4340a96be3753ed1fefec20b452fada0 (diff) | |
Bitfield operations on strings
(maybe moving into bin .* one day)
| -rw-r--r-- | compiler/elymasAsm.ey | 11 | ||||
| -rw-r--r-- | compiler/elymasGlobalStr.ey | 75 |
2 files changed, 86 insertions, 0 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey index 0fdf307..a54fbe1 100644 --- a/compiler/elymasAsm.ey +++ b/compiler/elymasAsm.ey @@ -981,6 +981,13 @@ } /rolqClReg deff { ==reg + reg regno %07 gt reg rexreqbyte or { 0 reg /none /none rex } rep + %0F + %92 + /zero reg modrm11 + } /setcbReg deff + + { ==reg reg bit64assert 1 /none /none reg rex @@ -1025,6 +1032,10 @@ } /shrqImm8Reg deff { + %AA + } /stosb deff + + { 1 /none /none /none rex %AB } /stosq deff diff --git a/compiler/elymasGlobalStr.ey b/compiler/elymasGlobalStr.ey index b3407e5..01d2f17 100644 --- a/compiler/elymasGlobalStr.ey +++ b/compiler/elymasGlobalStr.ey @@ -264,6 +264,81 @@ /rbx :pushqReg :retn ]] /eyfromArray defv + + ## Bitfield style functions + + # reset a string to all-zero + # 0 -> string to reset + [[ + /rbx :popqReg + + /rax /rax :xorqRegReg + /rdi :popqReg + 16 /rdi /rcx :movqMemDisp8Reg + 24 /rdi :addqImm8Reg + :reprcx :stosb + + /rbx :pushqReg + :retn + ]] /eyzero defv + + # bit test + # 0 -> string to extract bit from + # 1 -> bit index to extract + [[ + /rbx :popqReg + + ::internalAllocateInteger /rax :movqImmReg + /rax :callqReg + /rax /rdx :movqRegReg + + /rdi :popqReg + /rax :popqReg + 8 /rax /rax :movqMemDisp8Reg + + /rdx :pushqReg + + /rcx /rcx :xorqRegReg + /rax 24 /rdi :btqRegMemDisp8 + /cl :setcbReg + + /rcx 8 /rdx :movqRegMemDisp8 + + /rbx :pushqReg + :retn + ]] /eybitTest defv + + # bit set + # 0 -> string to extract bit from + # 1 -> bit index to set + [[ + /rbx :popqReg + + /rdi :popqReg + /rax :popqReg + 8 /rax /rax :movqMemDisp8Reg + + /rax 24 /rdi :btsqRegMemDisp8 + + /rbx :pushqReg + :retn + ]] /eybitSet defv + + # bit reset + # 0 -> string to extract bit from + # 1 -> bit index to set + [[ + /rbx :popqReg + + /rdi :popqReg + /rax :popqReg + 8 /rax /rax :movqMemDisp8Reg + + /rax 24 /rdi :btrqRegMemDisp8 + + /rbx :pushqReg + :retn + ]] /eybitReset defv > _ ==globalFunctions { defv }' ::allocateOffsetStruct [ |
