Patch title: i386 optimizer v24
Abstract:
Enhancements to the core optimizer for i386.
File: /pliant/language/basic/basic.c
Key:
    Removed line
    Added line
   
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it an
// modify it under the terms of the GNU General Public Licen
// as published by the Free Software Foundation.
// 
// This program is distributed in the hope that it will be u
// but WITHOUT ANY WARRANTY; without even the implied warran
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// version 2 along with this program; if not, write to the F
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA


static Void set_meta(struct Expression *e) {
  struct Expression *var,*value; struct Type *type;
  struct Argument *targ; struct Instruction *instr;
  if(e->arguments.nb!=2) return;
  var=EARG(e,0),value=EARG(e,1);
  Expression_compile(var); if(error_notified() || !(var->acc
  Expression_compile(value); if(error_notified()) return;
/*
doc
  [The next line is important and means that ':=' never appl
  listing
    var Int i := 2
    var Pointer:Int j :> i
    var Int k := 3
    var Pointer:Int l :> k
    j := l
    console i eol
  [would display 3.]
*/
  type=Type_real_data_type(var->result->type);
  if(!Expression_cast(var,type) || !(var->access&Access_writ
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it an
// modify it under the terms of the GNU General Public Licen
// as published by the Free Software Foundation.
// 
// This program is distributed in the hope that it will be u
// but WITHOUT ANY WARRANTY; without even the implied warran
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public
// version 2 along with this program; if not, write to the F
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA


static Void set_meta(struct Expression *e) {
  struct Expression *var,*value; struct Type *type;
  struct Argument *targ; struct Instruction *instr;
  if(e->arguments.nb!=2) return;
  var=EARG(e,0),value=EARG(e,1);
  Expression_compile(var); if(error_notified() || !(var->acc
  Expression_compile(value); if(error_notified()) return;
/*
doc
  [The next line is important and means that ':=' never appl
  listing
    var Int i := 2
    var Pointer:Int j :> i
    var Int k := 3
    var Pointer:Int l :> k
    j := l
    console i eol
  [would display 3.]
*/
  type=Type_real_data_type(var->result->type);
  if(!Expression_cast(var,type) || !(var->access&Access_writ
  Expression_suckup(e,value);
  // MAX: changed the order of the next two Expression_suckup()
  //      allows for much better optimization
  Expression_suckup(e,var);
  Expression_suckup(e,var);
  Expression_suckup(e,value);
  targ=argument(G.type_Type,Argument_constant,type);
  instr=instruction(G.function_copy_universal,value->result,
  Expression_add(e,instr);
  Expression_set_void_result(e); }



/*
doc
  targ=argument(G.type_Type,Argument_constant,type);
  instr=instruction(G.function_copy_universal,value->result,
  Expression_add(e,instr);
  Expression_set_void_result(e); }



/*
doc
  ['translate Univeral' is extracting the address of the obj
  ['translate Universal' is extracting the address of the object, just like 'address Universal' then translate it.]
  [It's mainly used to set the pointer field of an indirect 
*/


  [It's mainly used to set the pointer field of an indirect 
*/