]> gitweb.factorcode.org Git - factor.git/commitdiff
cpu.x86.assembler: add MOVABS instruction
authorJoe Groff <arcata@gmail.com>
Tue, 18 Oct 2011 00:11:12 +0000 (17:11 -0700)
committerJoe Groff <arcata@gmail.com>
Fri, 28 Oct 2011 04:14:45 +0000 (21:14 -0700)
MOVABS generates the one-byte opcode version of MOV eAX, [absolute] or MOV [absolute], eAX, which saves a byte per safepoint on x86-32.

basis/cpu/x86/32/bootstrap.factor
basis/cpu/x86/assembler/assembler-tests.factor
basis/cpu/x86/assembler/assembler.factor

index 2943bf9c48895c1771be37c3388dd1021eac2f58..184c0e6b3346798bd89343521929a5bebbb7e9f7 100755 (executable)
@@ -360,7 +360,7 @@ IN: bootstrap.x86
     jit-jump-quot ;
 
 : jit-safepoint ( -- )
-    0 [] EAX MOV rc-absolute rel-safepoint ;
+    0 EAX MOVABS rc-absolute rel-safepoint ;
 
 [
     jit-start-context-and-delete
index f0309c2e5837d60981125809b47f9af245614666..eee964197a1933028d2d120988532b0b606f727d 100644 (file)
@@ -235,9 +235,57 @@ cell 4 = [
 
 bootstrap-cell 4 = [
     [ { 100 199 5 0 0 0 0 123 0 0 0 } ] [ [ 0 [] FS 123 MOV ] { } make ] unit-test
+
+    [ { HEX: a0 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ AL HEX: 0123,4567 MOVABS ] { } make ] unit-test
+
+    [ { HEX: 66 HEX: a1 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ AX HEX: 0123,4567 MOVABS ] { } make ] unit-test
+
+    [ { HEX: a1 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ EAX HEX: 0123,4567 MOVABS ] { } make ] unit-test
+
+    [ { HEX: 48 HEX: a1 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ RAX HEX: 0123,4567 MOVABS ] { } make ] unit-test
+
+    [ { HEX: a2 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ HEX: 0123,4567 AL MOVABS ] { } make ] unit-test
+
+    [ { HEX: 66 HEX: a3 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ HEX: 0123,4567 AX MOVABS ] { } make ] unit-test
+
+    [ { HEX: a3 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ HEX: 0123,4567 EAX MOVABS ] { } make ] unit-test
+
+    [ { HEX: 48 HEX: a3 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ HEX: 0123,4567 RAX MOVABS ] { } make ] unit-test
 ] when
 
 bootstrap-cell 8 = [
     [ { 72 137 13 123 0 0 0 } ] [ [ 123 [RIP+] RCX MOV ] { } make ] unit-test
     [ { 101 72 137 12 37 123 0 0 0 } ] [ [ 123 [] GS RCX MOV ] { } make ] unit-test
+
+    [ { HEX: a0 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ AL HEX: 0123,4567,89ab,cdef MOVABS ] { } make ] unit-test
+
+    [ { HEX: 66 HEX: a1 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ AX HEX: 0123,4567,89ab,cdef MOVABS ] { } make ] unit-test
+
+    [ { HEX: a1 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ EAX HEX: 0123,4567,89ab,cdef MOVABS ] { } make ] unit-test
+
+    [ { HEX: 48 HEX: a1 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ RAX HEX: 0123,4567,89ab,cdef MOVABS ] { } make ] unit-test
+
+    [ { HEX: a2 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ HEX: 0123,4567,89ab,cdef AL MOVABS ] { } make ] unit-test
+
+    [ { HEX: 66 HEX: a3 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ HEX: 0123,4567,89ab,cdef AX MOVABS ] { } make ] unit-test
+
+    [ { HEX: a3 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ HEX: 0123,4567,89ab,cdef EAX MOVABS ] { } make ] unit-test
+
+    [ { HEX: 48 HEX: a3 HEX: ef HEX: cd HEX: ab HEX: 89 HEX: 67 HEX: 45 HEX: 23 HEX: 01 } ]
+    [ [ HEX: 0123,4567,89ab,cdef RAX MOVABS ] { } make ] unit-test
 ] when
index 35613ac1636dee81d95c192359f93e8711ee1376..dc04271db1d607dc5547857c9a135ee2d6b1babd 100644 (file)
@@ -231,6 +231,27 @@ GENERIC: MOV ( dst src -- )
 M: immediate MOV (MOV-I) ;
 M: operand MOV HEX: 88 2-operand ;
 
+ERROR: bad-movabs-operands dst src ;
+
+GENERIC: MOVABS ( dst src -- )
+M: object MOVABS bad-movabs-operands ;
+M: register MOVABS
+    {
+        { AL [ HEX: a2 , cell, ] }
+        { AX [ HEX: 66 , HEX: a3 , cell, ] }
+        { EAX [ HEX: a3 , cell, ] }
+        { RAX [ HEX: 48 , HEX: a3 , cell, ] }
+        [ swap bad-movabs-operands ]
+    } case ;
+M: integer MOVABS
+    swap {
+        { AL [ HEX: a0 , cell, ] }
+        { AX [ HEX: 66 , HEX: a1 , cell, ] }
+        { EAX [ HEX: a1 , cell, ] }
+        { RAX [ HEX: 48 , HEX: a1 , cell, ] }
+        [ swap bad-movabs-operands ]
+    } case ;
+
 : LEA ( dst src -- ) swap HEX: 8d 2-operand ;
 
 ! Control flow