aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2015-07-10 12:20:27 +0200
committerDrahflow <drahflow@gmx.de>2015-07-10 12:20:27 +0200
commit670c560397aaa4f492d2d306e865c60f18591288 (patch)
tree96cd34f846c005de2076b09aedc77fbf66bc40a0 /compiler
parent6ffad6c1458ed20eccdb7c7079d9747bd1bccaa3 (diff)
SHA512
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasAsmOps.ey53
-rw-r--r--compiler/elymasGlobalSysAsm.ey2
2 files changed, 54 insertions, 1 deletions
diff --git a/compiler/elymasAsmOps.ey b/compiler/elymasAsmOps.ey
index f3fe043..150a863 100644
--- a/compiler/elymasAsmOps.ey
+++ b/compiler/elymasAsmOps.ey
@@ -382,6 +382,16 @@
i imm8
} mnemonic /qImm8Reg defOp
+ { ==reg ==i
+ reg bit64assert
+ i 65536 65536 mul lt not { "Imm32 too large" die } rep
+
+ 1 /none /none reg rex
+ %81
+ modrmOpcode reg modrm11
+ i imm32
+ } mnemonic /qImm32Reg defOp
+
memoryAddressingVariants keys { ==variant memoryAddressingVariants variant . =*parse
{ parse ==mem ==i
i 256 lt not { "Imm8 too large" die } rep
@@ -412,6 +422,15 @@
modrmOpcode mem .encode
i imm8
} mnemonic /qImm8 variant cat defOp
+
+ { parse ==mem ==i
+ i 65536 65536 mul lt not { "Imm32 too large" die } rep
+
+ 1 /none mem .idx mem .base rex
+ %81
+ modrmOpcode mem .encode
+ i imm32
+ } mnemonic /qImm32 variant cat defOp
} each
} /defAsmAddImm deff
@@ -515,6 +534,14 @@
/bsf %0F %BC defAsmBsfq
/bsr %0F %BD defAsmBsfq
+{ ==reg
+ reg bit64assert
+
+ 1 /none /none reg rex
+ %0F
+ %C8 reg regno %07 band add
+} /bswapqReg deff
+
{ ==off
%E8
off imm32
@@ -1343,6 +1370,32 @@ memoryAddressingVariants keys { ==variant memoryAddressingVariants variant . =*p
i imm8
} /rolqImm8Reg deff
+{ ==reg
+ reg bit8assert
+
+ reg regno %07 gt reg rexreqbyte or { 0 reg /none /none rex } rep
+ %D2
+ /one reg modrm11
+} /rorbClReg deff
+
+{ ==reg
+ reg bit64assert
+
+ 1 /none /none reg rex
+ %D3
+ /one reg modrm11
+} /rorqClReg deff
+
+{ ==reg ==i
+ reg bit64assert
+ i 64 lt not { "Shift immediate too large" die } rep
+
+ 1 /none /none reg rex
+ %C1
+ /one reg modrm11
+ i imm8
+} /rorqImm8Reg deff
+
{
%AE
} /scasb deff
diff --git a/compiler/elymasGlobalSysAsm.ey b/compiler/elymasGlobalSysAsm.ey
index 9fe2f2d..112b440 100644
--- a/compiler/elymasGlobalSysAsm.ey
+++ b/compiler/elymasGlobalSysAsm.ey
@@ -356,7 +356,7 @@
@referencesCopyLoop
/rsi /rax :movqMemReg
- 8 /rax /rax :movqMemDisp8Reg
+ 8 /rax /rax :movqMemDisp8Reg # FIXME: this should be parallel to replace
:stosq
8 /rsi :addqImm8Reg
/referencesCopyLoop :loopLbl8