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 545, Thu Feb 24 13:56:44 2000 UTC revision 579, Wed Mar 22 06:33:08 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 110  Line 110 
110     | LabelEA    of LabelExp.labexp     | LabelEA    of LabelExp.labexp
111     | Direct     of $GP     | Direct     of $GP
112     | FDirect    of $FP     | FDirect    of $FP
113       | ST         of $FP
114     | MemReg     of int (* pseudo memory register *)     | MemReg     of int (* pseudo memory register *)
115     | Displace   of {base: $GP, disp:operand, mem:Region.region}     | Displace   of {base: $GP, disp:operand, mem:Region.region}
116     | Indexed    of {base: $GP option, index: $GP, scale:int, disp:operand,     | Indexed    of {base: $GP option, index: $GP, scale:int, disp:operand,
# Line 142  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  | FADD  | FIADD        FADDP   | FADDS
147      | FMULP  | FMUL  | FIMUL      | FMULP   | FMULS
148      | FSUBP  | FSUB  | FISUB    (* ST(1) := ST-ST(1); [pop] *)                | FCOMS
149      | FSUBRP | FSUBR | FISUBR   (* ST(1) := ST(1)-ST; [pop] *)                | FCOMPS
150      | FDIVP  | FDIV  | FIDIV    (* ST(1) := ST/ST(1); [pop] *)      | FSUBP   | FSUBS   (* ST(1) := ST-ST(1); [pop] *)
151      | FDIVRP | FDIVR | FIDIVR   (* ST(1) := ST(1)/ST; [pop] *)      | FSUBRP  | FSUBRS  (* ST(1) := ST(1)-ST; [pop] *)
152        | FDIVP   | FDIVS   (* ST(1) := ST/ST(1); [pop] *)
153        | FDIVRP  | FDIVRS  (* ST(1) := ST(1)/ST; [pop] *)
154                  | FADDL
155                  | FMULL
156                  | FCOML
157                  | 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 187  Line 204 
204         | I.Relative _ => error "emit_operand"         | I.Relative _ => error "emit_operand"
205         | I.Direct r => emit_GP r         | I.Direct r => emit_GP r
206         | I.MemReg r => emit_operand(memReg opn)         | I.MemReg r => emit_operand(memReg opn)
207         | I.FDirect f =>         | I.ST f => emit_FP f
208              let val f' = regmap f         | I.FDirect f => emit_operand(memReg opn)
             in  if f' < (32+8) then emit_FP f' else emit_operand(memReg opn) end  
209         | I.Displace{base,disp,mem,...} =>         | I.Displace{base,disp,mem,...} =>
210             (emit_disp disp; emit "("; emit_GP base; emit ")";             (emit_disp disp; emit "("; emit_GP base; emit ")";
211              emit_region mem)              emit_region mem)
212         | I.Indexed{base=NONE,index,scale,disp,mem,...} =>         | I.Indexed{base,index,scale,disp,mem,...} =>
213            (emit_disp disp; emit "("; emit_GP index; comma();            (emit_disp disp; emit "(";
214               case base of
215                 NONE => ()
216               | SOME base => emit_GP base;
217               comma();
218               emit_GP index; comma();
219             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)  
220    
221        and emit_disp(I.Immed 0) = ()        and emit_disp(I.Immed 0) = ()
222          | emit_disp(I.Immed i) = emitInt32 i          | emit_disp(I.Immed i) = emitInt32 i
# Line 213  Line 230 
230          | stupidGas(I.LabelEA _) = error "stupidGas"          | stupidGas(I.LabelEA _) = error "stupidGas"
231          | stupidGas opnd = emit_operand opnd          | stupidGas opnd = emit_operand opnd
232    
233         (* Display the floating point binary opcode *)
234          fun isMemOpnd(I.MemReg _) = true
235            | isMemOpnd(I.FDirect f) = true
236            | isMemOpnd(I.LabelEA _) = true
237            | isMemOpnd(I.Displace _) = true
238            | isMemOpnd(I.Indexed _) = true
239            | isMemOpnd _ = false
240          fun chop fbinOp =
241              let val n = size fbinOp
242              in  case Char.toLower(String.sub(fbinOp,n-1)) of
243                    (#"s" | #"l") => String.substring(fbinOp,0,n-1)
244                  | _ => fbinOp
245              end
246    
247        val emit_dst = emit_operand        val emit_dst = emit_operand
248        val emit_src = emit_operand        val emit_src = emit_operand
249        val emit_opnd = emit_operand        val emit_opnd = emit_operand
# Line 332  Line 363 
363    
364     (* floating *)     (* floating *)
365      | FBINARY of {binOp:fbinOp, src:operand, dst:operand}      | FBINARY of {binOp:fbinOp, src:operand, dst:operand}
366          ``<binOp>\t<src>, <dst>''          asm: (if isMemOpnd src then ``<binOp>\t<src>''
367                  else ``<emit(chop(asm_fbinOp binOp))>\t<src>, <dst>''
368                 )
369    
370        | FIBINARY of {binOp:fibinOp, src:operand}
371            asm: ``<binOp>\t<src>'' (* the implied destination is %ST(0) *)
372    
373      | FUNARY of funOp      | FUNARY of funOp
374          ``<funOp>''          ``<funOp>''
# Line 340  Line 376 
376      | FUCOMPP      | FUCOMPP
377          ``fucompp''          ``fucompp''
378    
     | FCOM  
         ``fcom''  
   
379      | FCOMPP      | FCOMPP
380          ``fcompp''          ``fcompp''
381    
# Line 355  Line 388 
388      | FSTPS of operand      | FSTPS of operand
389          ``fstps\t<operand>''          ``fstps\t<operand>''
390    
391        | FSTPT of operand
392            ``fstps\t<operand>''
393    
394        | FSTL of operand
395            ``fstl\t<operand>''
396    
397        | FSTS of operand
398            ``fsts\t<operand>''
399    
400        | FLD1
401            ``fld1''
402    
403        | FLDL2E
404            ``fldl2e''
405    
406        | FLDL2T
407            ``fldl2t''
408    
409        | FLDLG2
410            ``fldlg2''
411    
412        | FLDLN2
413            ``fldln2''
414    
415        | FLDPI
416            ``fldpi''
417    
418        | FLDZ
419            ``fldz''
420    
421      | FLDL of operand      | FLDL of operand
422          ``fldl\t<operand>''          ``fldl\t<operand>''
423    
424      | FLDS of operand      | FLDS of operand
425          ``flds\t<operand>''          ``flds\t<operand>''
426    
427        | FLDT of operand
428            ``fldt\t<operand>''
429    
430      | FILD of operand      | FILD of operand
431          ``fild\t<operand>''          ``fild\t<operand>''
432    
433        | FILDL of operand
434            ``fildl\t<operand>''
435    
436        | FILDLL of operand
437            ``fildll\t<operand>''
438    
439      | FNSTSW      | FNSTSW
440          ``fnstsw''          ``fnstsw''
441    

Legend:
Removed from v.545  
changed lines
  Added in v.579

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