~ubuntu-branches/ubuntu/feisty/fpc/feisty

« back to all changes in this revision

Viewing changes to compiler/x86/nx86mat.pas

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2007-01-27 20:08:50 UTC
  • mfrom: (1.2.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070127200850-9mrptaqqjsx9nwa7
Tags: 2.0.4-5
* Fixed Build-Depends.
* Add myself to Uploaders in debian/control.
* Make sure that the sources are really patched before building them.
* Build unit 'libc' on powerpc too.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
{
2
 
    $Id: nx86mat.pas,v 1.10 2005/02/14 17:13:10 peter Exp $
3
2
    Copyright (c) 1998-2002 by Florian Klaempfl
4
3
 
5
4
    Generate x86 code for math nodes
48
47
  implementation
49
48
 
50
49
    uses
 
50
      globtype,
51
51
      systems,
52
52
      cutils,verbose,globals,
53
 
      symconst,aasmbase,aasmtai,defutil,
 
53
      symconst,symdef,
 
54
      aasmbase,aasmtai,defutil,
54
55
      cgbase,pass_1,pass_2,
55
56
      ncon,
56
57
      cpubase,
109
110
      begin
110
111
        secondpass(left);
111
112
        location_reset(location,LOC_MMXREGISTER,OS_NO);
112
 
        hreg:=cg.getmmxregister(exprasmlist,OS_M64);
 
113
        hreg:=tcgx86(cg).getmmxregister(exprasmlist);
113
114
        emit_reg_reg(A_PXOR,S_NO,hreg,hreg);
114
115
        case left.location.loc of
115
116
          LOC_MMXREGISTER:
118
119
            end;
119
120
          LOC_CMMXREGISTER:
120
121
            begin
121
 
               location.register:=cg.getmmxregister(exprasmlist,OS_M64);
 
122
               location.register:=tcgx86(cg).getmmxregister(exprasmlist);
122
123
               emit_reg_reg(A_MOVQ,S_NO,left.location.register,location.register);
123
124
            end;
124
125
          LOC_REFERENCE,
125
126
          LOC_CREFERENCE:
126
127
            begin
127
 
               reference_release(exprasmlist,left.location.reference);
128
 
               location.register:=cg.getmmxregister(exprasmlist,OS_M64);
 
128
               location.register:=tcgx86(cg).getmmxregister(exprasmlist);
129
129
               emit_ref_reg(A_MOVQ,S_NO,left.location.reference,location.register);
130
130
            end;
131
131
          else
152
152
               op:=A_PSUBD;
153
153
          end;
154
154
        emit_reg_reg(op,S_NO,location.register,hreg);
155
 
        cg.ungetregister(exprasmlist,hreg);
156
155
        emit_reg_reg(A_MOVQ,S_NO,hreg,location.register);
157
156
      end;
158
157
{$endif SUPPORT_MMX}
172
171
            location_reset(location,LOC_MMREGISTER,def_cgsize(resulttype.def));
173
172
 
174
173
            { make life of register allocator easier }
175
 
            location.register:=cg.getmmregister(exprasmlist,OS_M128);
 
174
            location.register:=cg.getmmregister(exprasmlist,def_cgsize(resulttype.def));
176
175
            cg.a_loadmm_reg_reg(exprasmlist,def_cgsize(resulttype.def),def_cgsize(resulttype.def),left.location.register,location.register,mms_movescalar);
177
176
 
178
 
            reg:=cg.getmmregister(exprasmlist,OS_M128);
 
177
            reg:=cg.getmmregister(exprasmlist,def_cgsize(resulttype.def));
179
178
 
180
179
            objectlibrary.getdatalabel(l1);
181
180
            consts.concat(Tai_label.Create(l1));
294
293
          location_copy(location,left.location);
295
294
        LOC_CMMXREGISTER:
296
295
          begin
297
 
            location.register:=cg.getmmxregister(exprasmlist,OS_M64);
 
296
            location.register:=tcgx86(cg).getmmxregister(exprasmlist);
298
297
            emit_reg_reg(A_MOVQ,S_NO,left.location.register,location.register);
299
298
          end;
300
299
        LOC_REFERENCE,
301
300
        LOC_CREFERENCE:
302
301
          begin
303
 
            location_release(exprasmlist,left.location);
304
 
            location.register:=cg.getmmxregister(exprasmlist,OS_M64);
 
302
            location.register:=tcgx86(cg).getmmxregister(exprasmlist);
305
303
            emit_ref_reg(A_MOVQ,S_NO,left.location.reference,location.register);
306
304
          end;
307
305
      end;
308
306
      { load mask }
309
 
      hreg:=cg.getmmxregister(exprasmlist,OS_M64);
 
307
      hreg:=tcgx86(cg).getmmxregister(exprasmlist);
310
308
      emit_reg_reg(A_MOVD,S_NO,r,hreg);
311
 
      cg.ungetregister(exprasmlist,r);
312
309
      { lower 32 bit }
313
 
      emit_reg_reg(A_PXOR,S_D,hreg,location.register);
 
310
      emit_reg_reg(A_PXOR,S_NO,hreg,location.register);
314
311
      { shift mask }
315
 
      emit_const_reg(A_PSLLQ,S_NO,32,hreg);
 
312
      emit_const_reg(A_PSLLQ,S_B,32,hreg);
316
313
      { higher 32 bit }
317
 
      cg.ungetregister(exprasmlist,hreg);
318
 
      emit_reg_reg(A_PXOR,S_D,hreg,location.register);
 
314
      emit_reg_reg(A_PXOR,S_NO,hreg,location.register);
319
315
    end;
320
316
{$endif SUPPORT_MMX}
321
317
end.
322
 
 
323
 
 
324
 
{
325
 
  $Log: nx86mat.pas,v $
326
 
  Revision 1.10  2005/02/14 17:13:10  peter
327
 
    * truncate log
328
 
 
329
 
}