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.md
ViewVC logotype

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

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

revision 555, Fri Mar 3 16:10:30 2000 UTC revision 624, Fri Apr 21 03:06:21 2000 UTC
# Line 52  Line 52 
52                        | (r,_) => "%"^Int.toString r                        | (r,_) => "%"^Int.toString r
53                      )                      )
54     |  FP "f" = 32 cells of 80 bits in cellset called "floating point register"     |  FP "f" = 32 cells of 80 bits in cellset called "floating point register"
55                 assembly as (fn (f,_) =>                 assembly as (fn (0,_) => "%st"
56                                      if f = 0 then "%st"                               | (f,_) =>
57                                      else if f < 8 then "%st("^Int.toString f^")"                                  if f < 8 then "%st("^Int.toString f^")"
58                                      else "%f"^Int.toString f                                      else "%f"^Int.toString f
59                                          (* pseudo register *)                                          (* pseudo register *)
60                             )                             )
# Line 131  Line 131 
131     | ADDW | SUBW | ANDW | ORW | XORW | SHLW | SARW | SHRW     | ADDW | SUBW | ANDW | ORW | XORW | SHLW | SARW | SHRW
132     | ADDB | SUBB | ANDB | ORB | XORB | SHLB | SARB | SHRB     | ADDB | SUBB | ANDB | ORB | XORB | SHLB | SARB | SHRB
133    
134    datatype multDivOp! = UMUL | IDIV | UDIV    datatype multDivOp! = MULL | IDIVL | DIVL
135    
136    datatype unaryOp! = DECL | INCL | NEGL | NOTL | NOTW | NOTB    datatype unaryOp! = DECL | INCL | NEGL | NOTL | NOTW | NOTB
137    
# Line 143  Line 143 
143    
144   (* The Intel manual is incorrect on the description of FDIV and FDIVR *)   (* The Intel manual is incorrect on the description of FDIV and FDIVR *)
145    datatype fbinOp! =    datatype fbinOp! =
146        FADDP   | FADDS   | FIADDS        FADDP   | FADDS
147      | FMULP   | FMULS   | FIMULS      | FMULP   | FMULS
148      | FSUBP   | FSUBS   | FISUBS        (* ST(1) := ST-ST(1); [pop] *)                | FCOMS
149      | FSUBRP  | FSUBRS  | FISUBRS       (* ST(1) := ST(1)-ST; [pop] *)                | FCOMPS
150      | FDIVP   | FDIVS   | FIDIVS        (* ST(1) := ST/ST(1); [pop] *)      | FSUBP   | FSUBS   (* ST(1) := ST-ST(1); [pop] *)
151      | FDIVRP  | FDIVRS  | FIDIVRS       (* ST(1) := ST(1)/ST; [pop] *)      | FSUBRP  | FSUBRS  (* ST(1) := ST(1)-ST; [pop] *)
152                | FADDL   | FIADDL      | FDIVP   | FDIVS   (* ST(1) := ST/ST(1); [pop] *)
153                | FMULL   | FIMULL      | FDIVRP  | FDIVRS  (* ST(1) := ST(1)/ST; [pop] *)
154                | FSUBL   | FISUBL        (* ST(1) := ST-ST(1); [pop] *)                | FADDL
155                | FSUBRL  | FISUBRL       (* ST(1) := ST(1)-ST; [pop] *)                | FMULL
156                | FDIVL   | FIDIVL        (* ST(1) := ST/ST(1); [pop] *)                | FCOML
157                | FDIVRL  | FIDIVRL       (* ST(1) := ST(1)/ST; [pop] *)                | FCOMPL
158                  | FSUBL   (* ST(1) := ST-ST(1); [pop] *)
159                  | FSUBRL  (* ST(1) := ST(1)-ST; [pop] *)
160                  | FDIVL   (* ST(1) := ST/ST(1); [pop] *)
161                  | FDIVRL  (* ST(1) := ST(1)/ST; [pop] *)
162    
163      datatype fibinOp! =
164          FIADDS | FIMULS   | FICOMS | FICOMPS
165        | FISUBS | FISUBRS  | FIDIVS | FIDIVRS
166        | FIADDL | FIMULL   | FICOML | FICOMPL
167        | FISUBL | FISUBRL  | FIDIVL | FIDIVRL
168    
169    datatype funOp! = FABS | FCHS    datatype funOp! = FABS | FCHS
170                    | FSIN | FCOS | FTAN                    | FSIN | FCOS | FTAN
# Line 166  Line 176 
176    
177    end (* struct Instruction *)    end (* struct Instruction *)
178    
179      (*
180       * Instruction encoding on the x86
181       * Because of variable width instructions.
182       * We decompose each byte field into a seperate format first, then combine
183       * then to form the real instructions
184       *)
185      instruction formats 8 bits
186        modrm{mod:2, reg:3, rm:3}
187      | sib{ss:2, index:3, base:3}
188      | immed8{imm:8}
189    
190      instruction formats 32 bits
191        immed32{imm:32}
192    
193    (* A bunch of routines for emitting assembly *)    (* A bunch of routines for emitting assembly *)
194    functor Assembly    functor Assembly
195       (structure MemRegs : MEMORY_REGISTERS where I = Instr) =       (structure MemRegs : MEMORY_REGISTERS where I = Instr) =
# Line 199  Line 223 
223         | I.Displace{base,disp,mem,...} =>         | I.Displace{base,disp,mem,...} =>
224             (emit_disp disp; emit "("; emit_GP base; emit ")";             (emit_disp disp; emit "("; emit_GP base; emit ")";
225              emit_region mem)              emit_region mem)
226         | I.Indexed{base=NONE,index,scale,disp,mem,...} =>         | I.Indexed{base,index,scale,disp,mem,...} =>
227            (emit_disp disp; emit "("; emit_GP index; comma();            (emit_disp disp; emit "(";
228               case base of
229                 NONE => ()
230               | SOME base => emit_GP base;
231               comma();
232               emit_GP index; comma();
233             emitScale scale; emit ")"; emit_region mem)             emitScale scale; emit ")"; emit_region mem)
        | I.Indexed{base=SOME base,index,scale,disp,mem,...} =>  
          (emit_disp disp; emit "("; emit_GP base;  
           comma(); emit_GP index; comma(); emitScale scale; emit ")";  
           emit_region mem)  
234    
235        and emit_disp(I.Immed 0) = ()        and emit_disp(I.Immed 0) = ()
236          | emit_disp(I.Immed i) = emitInt32 i          | emit_disp(I.Immed i) = emitInt32 i
# Line 216  Line 241 
241        * labels in certain instructions.        * labels in certain instructions.
242        *)        *)
243        fun stupidGas(I.ImmedLabel lexp) = emit_labexp lexp        fun stupidGas(I.ImmedLabel lexp) = emit_labexp lexp
244          | stupidGas(I.LabelEA _) = error "stupidGas"          | stupidGas opnd = (emit "*"; emit_operand opnd)
         | stupidGas opnd = emit_operand opnd  
245    
246       (* Display the floating point binary opcode *)       (* Display the floating point binary opcode *)
247        fun isMemOpnd(I.MemReg _) = true        fun isMemOpnd(I.MemReg _) = true
# Line 226  Line 250 
250          | isMemOpnd(I.Displace _) = true          | isMemOpnd(I.Displace _) = true
251          | isMemOpnd(I.Indexed _) = true          | isMemOpnd(I.Indexed _) = true
252          | isMemOpnd _ = false          | isMemOpnd _ = false
253        fun showFbinOp(fbinOp, src) =        fun chop fbinOp =
         emit(  
           if isMemOpnd src then fbinOp  
           else  
254            let val n = size fbinOp            let val n = size fbinOp
255            in  case String.sub(fbinOp,n-1) of            in  case Char.toLower(String.sub(fbinOp,n-1)) of
256                 (#"s" | #"t") => String.substring(fbinOp,0,n-1)                  (#"s" | #"l") => String.substring(fbinOp,0,n-1)
257                | _ => fbinOp                | _ => fbinOp
258            end)            end
259    
260        val emit_dst = emit_operand        val emit_dst = emit_operand
261        val emit_src = emit_operand        val emit_src = emit_operand
# Line 261  Line 282 
282            emit_defs(cellset1)><            emit_defs(cellset1)><
283            emit_uses(cellset2)>''            emit_uses(cellset2)>''
284    
285        | ENTER of {src1:operand, src2:operand}
286            ``enter\t<emit_operand src1>, <emit_operand src2>''
287    
288      | LEAVE      | LEAVE
289          ``leave''          ``leave''
290    
# Line 303  Line 327 
327               )               )
328    
329      | MULTDIV of {multDivOp:multDivOp, src:operand}      | MULTDIV of {multDivOp:multDivOp, src:operand}
330          ``<multDivOp>l\t<src>''          ``<multDivOp>\t<src>''
331    
332      | MUL3 of {dst: $GP, src2: Int32.int option, src1:operand}      | MUL3 of {dst: $GP, src2: Int32.int option, src1:operand}
333          (* Fermin: constant operand must go first *)          (* Fermin: constant operand must go first *)
# Line 355  Line 379 
379    
380     (* floating *)     (* floating *)
381      | FBINARY of {binOp:fbinOp, src:operand, dst:operand}      | FBINARY of {binOp:fbinOp, src:operand, dst:operand}
382          ``<showFbinOp(asm_fbinOp binOp,src)>\t<src>, <dst>''          asm: (if isMemOpnd src then ``<binOp>\t<src>''
383                  else ``<emit(chop(asm_fbinOp binOp))>\t<src>, <dst>''
384                 )
385    
386        | FIBINARY of {binOp:fibinOp, src:operand}
387            asm: ``<binOp>\t<src>'' (* the implied destination is %ST(0) *)
388    
389      | FUNARY of funOp      | FUNARY of funOp
390          ``<funOp>''          ``<funOp>''
# Line 363  Line 392 
392      | FUCOMPP      | FUCOMPP
393          ``fucompp''          ``fucompp''
394    
     | FCOM  
         ``fcom''  
   
395      | FCOMPP      | FCOMPP
396          ``fcompp''          ``fcompp''
397    
# Line 381  Line 407 
407      | FSTPT of operand      | FSTPT of operand
408          ``fstps\t<operand>''          ``fstps\t<operand>''
409    
410        | FSTL of operand
411            ``fstl\t<operand>''
412    
413        | FSTS of operand
414            ``fsts\t<operand>''
415    
416        | FLD1
417            ``fld1''
418    
419        | FLDL2E
420            ``fldl2e''
421    
422        | FLDL2T
423            ``fldl2t''
424    
425        | FLDLG2
426            ``fldlg2''
427    
428        | FLDLN2
429            ``fldln2''
430    
431        | FLDPI
432            ``fldpi''
433    
434        | FLDZ
435            ``fldz''
436    
437      | FLDL of operand      | FLDL of operand
438          ``fldl\t<operand>''          ``fldl\t<operand>''
439    
# Line 393  Line 446 
446      | FILD of operand      | FILD of operand
447          ``fild\t<operand>''          ``fild\t<operand>''
448    
449        | FILDL of operand
450            ``fildl\t<operand>''
451    
452        | FILDLL of operand
453            ``fildll\t<operand>''
454    
455      | FNSTSW      | FNSTSW
456          ``fnstsw''          ``fnstsw''
457    
# Line 405  Line 464 
464    
465     (* annotations *)     (* annotations *)
466      | ANNOTATION of {i:instruction, a:Annotations.annotation}      | ANNOTATION of {i:instruction, a:Annotations.annotation}
467          asm: (emitInstr i; comment(Annotations.toString a))          asm: (comment(Annotations.toString a); nl(); emitInstr i)
468    
469        | SOURCE of {}
470            asm: ``source''
471            mc:  ()
472    
473        | SINK of {}
474            asm: ``sink''
475            mc:  ()
476    
477        | PHI of {}
478            asm: ``phi''
479            mc:  ()
480    
481  end  end
482    

Legend:
Removed from v.555  
changed lines
  Added in v.624

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