Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/MLRISC/x86/x86.mdl
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/x86/x86.mdl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 814, Tue May 1 15:44:45 2001 UTC revision 815, Fri May 4 05:09:10 2001 UTC
# Line 136  Line 136 
136             *)             *)
137    
138        datatype binaryOp! =        datatype binaryOp! =
139           ADDL | SUBL | ANDL | ORL | XORL | SHLL | SARL | SHRL | ADCL | SBBL           ADDL | SUBL | ANDL | ORL | XORL | SHLL | SARL | SHRL | MULL | IMULL
140         | ADDW | SUBW | ANDW | ORW | XORW | SHLW | SARW | SHRW         | ADCL | SBBL
141         | ADDB | SUBB | ANDB | ORB | XORB | SHLB | SARB | SHRB         | ADDW | SUBW | ANDW | ORW | XORW | SHLW | SARW | SHRW | MULW | IMULW
142           | ADDB | SUBB | ANDB | ORB | XORB | SHLB | SARB | SHRB | MULB | IMULB
143         | BTSW | BTCW | BTRW | BTSL | BTCL | BTRL         | BTSW | BTCW | BTRW | BTSL | BTCL | BTRL
144         | ROLW | RORW | ROLL | RORL         | ROLW | RORW | ROLL | RORL
145         | XCHGB | XCHGW | XCHGL         | XCHGB | XCHGW | XCHGL
# Line 170  Line 171 
171         | LOCK_XADDW "lock\n\txaddw"         | LOCK_XADDW "lock\n\txaddw"
172         | LOCK_XADDL "lock\n\txaddl"         | LOCK_XADDL "lock\n\txaddl"
173    
174        datatype multDivOp! = MULL | IDIVL | DIVL        (* One operand opcodes *)
175          datatype multDivOp! = MULL1 "mull" | IDIVL1 "idivl" | DIVL1 "divl"
176    
177        datatype unaryOp! = DECL | INCL | NEGL | NOTL        datatype unaryOp! = DECL | INCL | NEGL | NOTL
178                          | DECW | INCW | NEGW | NOTW                          | DECW | INCW | NEGW | NOTW
# Line 188  Line 190 
190        datatype move! = MOVL        datatype move! = MOVL
191                       | MOVB                       | MOVB
192                       | MOVW                       | MOVW
193                       | MOVSWL                       | MOVSWL  (* sx(word) -> long *)
194                       | MOVZWL  (* word -> long *)                       | MOVZWL  (* zx(word) -> long *)
195                       | MOVSBL                       | MOVSBL  (* sx(byte) -> long *)
196                       | MOVZBL  (* byte -> long *)                       | MOVZBL  (* zx(byte) -> long *)
197    
198       (* The Intel manual is incorrect on the description of FDIV and FDIVR *)       (* The Intel manual is incorrect on the description of FDIV and FDIVR *)
199        datatype fbinOp! =        datatype fbinOp! =
# Line 378  Line 380 
380    
381       (* Multiplication/division *)       (* Multiplication/division *)
382       rtl upperMultiply : #n bits * #n bits -> #n bits       rtl upperMultiply : #n bits * #n bits -> #n bits
383       rtl MULL{src}  = eax        := muls(eax, src) ||       rtl MULL1{src}  = eax        := muls(eax, src) ||
384                        edx        := upperMultiply(eax, src) ||                        edx        := upperMultiply(eax, src) ||
385                        $eflags[0] := ???                        $eflags[0] := ???
386       rtl IDIVL{src} = eax := divs(eax, src) ||       rtl IDIVL1{src} = eax := divs(eax, src) ||
387                        edx := rems(eax, src) ||                        edx := rems(eax, src) ||
388                        $eflags[0] := ???                        $eflags[0] := ???
389       rtl DIVL{src}  = edx := divu(eax, src) ||       rtl DIVL1{src}  = edx := divu(eax, src) ||
390                        edx := remu(eax, src) ||                        edx := remu(eax, src) ||
391                        $eflags[0] := ???                        $eflags[0] := ???
392    
# Line 575  Line 577 
577                | _ => fbinOp                | _ => fbinOp
578            end            end
579    
580        fun isST32 (I.ST r) = C.registerNum r = 32        fun isST0 (I.ST r) = C.registerNum r = 0
581          | isST32 _ = false          | isST0 _ = false
582    
583        (* Special syntax for binary operators *)        (* Special syntax for binary operators *)
584        fun emit_fbinaryOp(binOp,src,dst) =        fun emit_fbinaryOp(binOp,src,dst) =
585            if isMemOpnd src then            if isMemOpnd src then
586                (emit_fbinOp binOp; emit "\t"; emit_operand src)                (emit_fbinOp binOp; emit "\t"; emit_operand src)
587            else (emit(chop(asm_fbinOp binOp)); emit "\t";            else (emit(chop(asm_fbinOp binOp)); emit "\t";
588                  case (isST32 src, isST32 dst) of                  case (isST0 src, isST0 dst) of
589                    (_, true) => (emit_operand src; emit ", %st")                    (_, true) => (emit_operand src; emit ", %st")
590                  | (true, _) => (emit "%st, "; emit_operand dst)                  | (true, _) => (emit "%st, "; emit_operand dst)
591                  | _ => error "emit_fbinaryOp"                  | _ => error "emit_fbinaryOp"
# Line 644  Line 646 
646          rtl: ``J<cond>''          rtl: ``J<cond>''
647    
648      | CALL of {opnd: operand, defs: $cellset,uses: $cellset,      | CALL of {opnd: operand, defs: $cellset,uses: $cellset,
649                 cutsTo: Label.label list, mem: Region.region}                 return: $cellset, cutsTo: Label.label list, mem: Region.region}
650          asm: ``call\t<stupidGas opnd><mem><          asm: ``call\t<stupidGas opnd><mem><
651                  emit_defs(defs)><                  emit_defs(defs)><
652                  emit_uses(uses)><                  emit_uses(uses)><
653                    emit_cellset("return",return)><
654                  emit_cutsTo cutsTo>''                  emit_cutsTo cutsTo>''
655          rtl: ``CALL''          rtl: ``CALL''
656    
# Line 702  Line 705 
705                  I.SARB | I.SHRB | I.SHLB)) => ``<binOp>\t%cl, <dst>''                  I.SARB | I.SHRB | I.SHLB)) => ``<binOp>\t%cl, <dst>''
706               | _ => ``<binOp>\t<src>, <dst>''               | _ => ``<binOp>\t<src>, <dst>''
707               )               )
708          rtl: ``<binOp>''          (*rtl: ``<binOp>''*)
709    
710      | CMPXCHG of {lock:bool, sz:isize, src: operand, dst:operand}      | CMPXCHG of {lock:bool, sz:isize, src: operand, dst:operand}
711          asm: (if lock then ``lock\n\t'' else ();          asm: (if lock then ``lock\n\t'' else ();
# Line 717  Line 720 
720      | MULTDIV of {multDivOp:multDivOp, src:operand}      | MULTDIV of {multDivOp:multDivOp, src:operand}
721          asm: ``<multDivOp>\t<src>''          asm: ``<multDivOp>\t<src>''
722    
723      | MUL3 of {dst: $GP, src2: Int32.int option, src1:operand}      | MUL3 of {dst: $GP, src2: Int32.int, src1:operand}
724          (* Fermin: constant operand must go first *)          (* Fermin: constant operand must go first *)
725          asm: (case src2 of          asm: ``imul\t$<emitInt32 src2>, <src1>, <dst>''
                 NONE => ``imul\t<src1>, <dst>''  
               | SOME i => ``imul\t$<emitInt32 i>, <src1>, <dst>''  
              )  
726    
727      | UNARY of {unOp:unaryOp, opnd:operand}      | UNARY of {unOp:unaryOp, opnd:operand}
728          asm: ``<unOp>\t<opnd>''          asm: ``<unOp>\t<opnd>''
# Line 755  Line 755 
755          asm: ``pushb\t<operand>''          asm: ``pushb\t<operand>''
756          rtl: ``PUSHB''          rtl: ``PUSHB''
757    
758        | PUSHFD     (* push $eflags onto stack *)
759            ``pushfd''
760    
761        | POPFD     (* pop $eflags onto stack *)
762            ``popfd''
763    
764      | POP of operand      | POP of operand
765          asm: ``popl\t<operand>''          asm: ``popl\t<operand>''
766          rtl: ``POP''          rtl: ``POP''
# Line 894  Line 900 
900          (* rtl: [["FCMP" fsize]] *)          (* rtl: [["FCMP" fsize]] *)
901    
902     (* misc *)     (* misc *)
903      | SAHF      | SAHF        (* %flags -> %ah *)
904          ``sahf''          ``sahf''
905    
906        | LAHF        (* %ah -> %flags *)
907            ``lahf''
908    
909     (* annotations *)     (* annotations *)
910      | ANNOTATION of {i:instruction, a:Annotations.annotation}      | ANNOTATION of {i:instruction, a:Annotations.annotation}
911          asm: (comment(Annotations.toString a); nl(); emitInstr i)          asm: (comment(Annotations.toString a); nl(); emitInstr i)

Legend:
Removed from v.814  
changed lines
  Added in v.815

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0