]> gitweb.factorcode.org Git - factor.git/commitdiff
cpu.x86.assembler: AH CH DH BH register operands now work properly
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Tue, 18 May 2010 21:10:32 +0000 (17:10 -0400)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Tue, 18 May 2010 21:10:32 +0000 (17:10 -0400)
basis/cpu/x86/assembler/assembler-tests.factor
basis/cpu/x86/assembler/assembler.factor
basis/cpu/x86/assembler/operands/operands.factor
basis/cpu/x86/assembler/syntax/syntax.factor

index 8711c4d28f78d142943b50540c75936fc82daedd..1c9d2422a261555c5f425887755bb606ed5beeeb 100644 (file)
@@ -2,6 +2,15 @@ USING: cpu.x86.assembler cpu.x86.assembler.operands
 kernel tools.test namespaces make layouts ;
 IN: cpu.x86.assembler.tests
 
+! small registers
+[ { 128 192 12 } ] [ [ AL 12 <byte> ADD ] { } make ] unit-test
+[ { 128 196 12 } ] [ [ AH 12 <byte> ADD ] { } make ] unit-test
+[ { 176 12 } ] [ [ AL 12 <byte> MOV ] { } make ] unit-test
+[ { 180 12 } ] [ [ AH 12 <byte> MOV ] { } make ] unit-test
+[ { 198 0 12 } ] [ [ EAX [] 12 <byte> MOV ] { } make ] unit-test
+[ { 0 235 } ] [ [ BL CH ADD ] { } make ] unit-test
+[ { 136 235 } ] [ [ BL CH MOV ] { } make ] unit-test
+
 ! immediate operands
 cell 4 = [
     [ { HEX: b9 HEX: 01 HEX: 00 HEX: 00 HEX: 00 } ] [ [ ECX 1 MOV ] { } make ] unit-test
@@ -205,7 +214,6 @@ cell 4 = [
 [ { HEX: 0f HEX: a3 HEX: 18 } ] [ [ EAX [] EBX BT ] { } make ] unit-test
 
 ! x87 instructions
-
 [ { HEX: D8 HEX: C5 } ] [ [ ST0 ST5 FADD ] { } make ] unit-test
 [ { HEX: DC HEX: C5 } ] [ [ ST5 ST0 FADD ] { } make ] unit-test
 [ { HEX: D8 HEX: 00 } ] [ [ ST0 EAX [] FADD ] { } make ] unit-test
index 1cb8f67aa66cd5c0523ade8e1deb6aa4ee8ee9e3..b34ffeedd3c515c72d82fe1f26512b7f6c3663db 100644 (file)
@@ -214,7 +214,13 @@ M: operand POP { BIN: 000 f HEX: 8f } 1-operand ;
 <PRIVATE
 
 GENERIC# (MOV-I) 1 ( dst src -- )
-M: register (MOV-I) [ t HEX: b8 short-operand ] [ cell, ] bi* ;
+
+M: register (MOV-I)
+    dup byte?
+    [ [ t HEX: b0 short-operand ] [ 1, ] bi* ]
+    [ [ t HEX: b8 short-operand ] [ cell, ] bi* ]
+    if ;
+
 M: operand (MOV-I)
     { BIN: 000 t HEX: c6 }
     over byte? [ immediate-1 ] [ immediate-4 ] if ;
index dc9ee1ce4ce9f7c1ba6f636605ae36cf23a1874e..2a2faa4039911995af8fbe9884a9dc9eb6838729 100644 (file)
@@ -6,10 +6,7 @@ IN: cpu.x86.assembler.operands
 
 REGISTERS: 8 AL CL DL BL SPL BPL SIL DIL R8B R9B R10B R11B R12B R13B R14B R15B ;
 
-ALIAS: AH SPL
-ALIAS: CH BPL
-ALIAS: DH SIL
-ALIAS: BH DIL
+HI-REGISTERS: 8 AH CH DH BH ;
 
 REGISTERS: 16 AX CX DX BX SP BP SI DI R8W R9W R10W R11W R12W R13W R14W R15W ;
 
index 5b65c19155055aa3b9b9db9a0113fef44f168a18..9f9cea506b44ca4219e1af2be8a165d3bf214cb3 100644 (file)
@@ -1,7 +1,7 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel words words.symbol sequences lexer parser fry
-namespaces combinators assocs ;
+namespaces combinators assocs math ;
 IN: cpu.x86.assembler.syntax
 
 SYMBOL: registers
@@ -9,15 +9,21 @@ SYMBOL: registers
 registers [ H{ } clone ] initialize
 
 : define-register ( name num size -- word )
-    [ "cpu.x86.assembler.operands" create ] 2dip {
+    [ create-in ] 2dip {
         [ 2drop ]
         [ 2drop define-symbol ]
         [ drop "register" set-word-prop ]
         [ nip "register-size" set-word-prop ]
     } 3cleave ;
 
-: define-registers ( size names -- )
-    [ swap '[ _ define-register ] map-index ] [ drop ] 2bi
-    registers get set-at ;
+: (define-registers) ( names start size -- seq )
+    '[ _ + _ define-register ] map-index ;
 
-SYNTAX: REGISTERS: scan-word ";" parse-tokens define-registers ;
+: define-registers ( names size -- )
+    [ [ 0 ] dip (define-registers) ] [ drop ] 2bi registers get set-at ;
+
+SYNTAX: REGISTERS:
+    scan-word [ ";" parse-tokens ] dip define-registers ;
+
+SYNTAX: HI-REGISTERS:
+    scan-word [ ";" parse-tokens 4 ] dip (define-registers) drop ;