Explorar o código

+ MIPS: initial target-specific unary minus node.

git-svn-id: trunk@24417 -
sergei %!s(int64=12) %!d(string=hai) anos
pai
achega
1f8bd4a2d1
Modificáronse 1 ficheiros con 24 adicións e 2 borrados
  1. 24 2
      compiler/mips/ncpumat.pas

+ 24 - 2
compiler/mips/ncpumat.pas

@@ -28,7 +28,7 @@ unit ncpumat;
 interface
 
 uses
-  node, nmat, ncgmat;
+  node, nmat, ncgmat, cgbase;
 
 type
   tMIPSELmoddivnode = class(tmoddivnode)
@@ -45,6 +45,10 @@ type
     procedure second_boolean; override;
   end;
 
+  TMIPSunaryminusnode = class(tcgunaryminusnode)
+    procedure emit_float_sign_change(r: tregister; _size : tcgsize);override;
+  end;
+
 implementation
 
 uses
@@ -54,7 +58,7 @@ uses
   aasmbase, aasmcpu, aasmtai, aasmdata,
   defutil,
   procinfo,
-  cgbase, cgobj, hlcgobj, pass_2,
+  cgobj, hlcgobj, pass_2,
   ncon,
   cpubase,
   ncgutil, cgcpu, cgutils;
@@ -322,8 +326,26 @@ begin
 end;
 
 
+{*****************************************************************************
+                               TMIPSunaryminusnode
+*****************************************************************************}
+
+procedure TMIPSunaryminusnode.emit_float_sign_change(r: tregister; _size : tcgsize);
+begin
+  case _size of
+    OS_F32:
+      current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_NEG_s,r,r));
+    OS_F64:
+      current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_NEG_d,r,r));
+  else
+    internalerror(2013030501);
+  end;
+end;
+
+
 begin
   cmoddivnode := tMIPSELmoddivnode;
   cshlshrnode := tMIPSELshlshrnode;
   cnotnode    := tMIPSELnotnode;
+  cunaryminusnode := TMIPSunaryminusnode;
 end.