Patch title: i386 optimizer v24
Abstract:
Enhancements to the core optimizer for i386.
File: /pliant/language/generator/generator_context.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


  void display_argument(struct Argument *a) {
    struct Str temp; Char buffer[16];
    if(a->where==Argument_constant && a->type==G.type_Int) {
      console(Str_map_area(&temp,buffer,Int_str2(*(Int *)a->
    orif(a->where==Argument_register) 
      consolen(Z,registers[a->u.cpu_register],END);
    orif(a->where==Argument_indirect) 
      consolen(Z,"[",END);
      display_argument(a->u.indirect.pointer);
      consolen(Z,"+",S,Str_map_area(&temp,buffer,Int_str2(a-
    other
      if(Str_len(&a->name)==0)
// 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


  void display_argument(struct Argument *a) {
    struct Str temp; Char buffer[16];
    if(a->where==Argument_constant && a->type==G.type_Int) {
      console(Str_map_area(&temp,buffer,Int_str2(*(Int *)a->
    orif(a->where==Argument_register) 
      consolen(Z,registers[a->u.cpu_register],END);
    orif(a->where==Argument_indirect) 
      consolen(Z,"[",END);
      display_argument(a->u.indirect.pointer);
      consolen(Z,"+",S,Str_map_area(&temp,buffer,Int_str2(a-
    other
      if(Str_len(&a->name)==0)
        Str_concat(&a->name,Z,a->where==Argument_a_register 
        Str_concat(&a->name,Z,a->where==Argument_a_register ? "r" : a->where==Argument_constant ? "c" : "a",S,Str_map_area(&temp,buffer,Int_str2(G.listing_counter++,10,buffer)),END);
      console(&a->name); }
    if(a->user_field!=null && a->user_field!=(Address)a) {
      consolen(Z,"->",END); display_argument((struct Argumen
      console(&a->name); }
    if(a->user_field!=null && a->user_field!=(Address)a) {
      consolen(Z,"->",END); display_argument((struct Argumen
 

  static Void optimize_listing_instruction(struct Instruction *instr) {
    struct Function *f;
    struct Str temp; Char buffer[16]; struct Str t;
    Int i; Arrow *c;
    f=instr->function;
    consolen(Z," L",S,Str_map_area(&temp,buffer,Int_str2(instr->order,16,buffer)),Z,": ",S,&f->name,END);
    for(i=0; i<instr->arguments.nb; i++) {
      consolen(Z," ",END);
      display_argument(IARG(instr,i)); }
    if(instr->jump!=null)
      consolen(Z," => L",S,Str_map_area(&temp,buffer,Int_str2(instr->jump->order,16,buffer)),END);
    for(c=List_first(&instr->backward_jumps); c!=G.null_constant; c=List_next(c)) {
      consolen(Z," <= L",S,Str_map_area(&temp,buffer,Int_str2(((struct Instruction *)*c)->order,16,buffer)),END); }
    consolen(Z,"  (",END);
    for(i=0; i<f->nb_argres; i++)
      if(f->arguments[i].type!=null) {
        if (i==f->nb_arg)
          consolen(Z,"-> ",END);
        consolen(S,&f->arguments[i].type->name,Z," ",END); }
    Str_build(&t);
    ListingPosition_get(&f->position,&t);
    consolen(Z," ",S,&t,END);
    ListingPositions_get(&instr->position,&t);
    consolen(Z,") at ",S,&t,EOL);
    Str_destroy(&t); }

  static Void optimize_listing(struct GeneratorContext *gc) 
    struct Function *function; struct Array *arguments;
    struct Instruction *instr; struct Function *f;
    Int i; Arrow *c;
    struct Str temp; Char buffer[16]; struct Str t;
    Str_build(&t);
    function=gc->function;
    ListingPosition_get(&function->position,&t);
    consolen(S,&function->name,Z," (",S,&t,Z,")",END);
    c=Module_first(gc->module,Str_map_string(&temp,"pliant a
    if(c!=G.null_constant) {
      arguments=(struct Array *)*c;
      for(i=0; i<function->nb_argres; i++) {
  static Void optimize_listing(struct GeneratorContext *gc) 
    struct Function *function; struct Array *arguments;
    struct Instruction *instr; struct Function *f;
    Int i; Arrow *c;
    struct Str temp; Char buffer[16]; struct Str t;
    Str_build(&t);
    function=gc->function;
    ListingPosition_get(&function->position,&t);
    consolen(S,&function->name,Z," (",S,&t,Z,")",END);
    c=Module_first(gc->module,Str_map_string(&temp,"pliant a
    if(c!=G.null_constant) {
      arguments=(struct Array *)*c;
      for(i=0; i<function->nb_argres; i++) {
        consolen(Z," ",END);
        consolen(Z, i==function->nb_arg ? " -> " : " ",END);
        display_argument((struct Argument *)Array_get_index(
    consolen(Z,":",EOL);
    for(instr=gc->first_instruction; instr!=null; instr=inst
      if(instr->order!=0) break;
    if(instr==null)
      for(instr=gc->first_instruction,i=0; instr!=null; inst
        instr->order=i;
        display_argument((struct Argument *)Array_get_index(
    consolen(Z,":",EOL);
    for(instr=gc->first_instruction; instr!=null; instr=inst
      if(instr->order!=0) break;
    if(instr==null)
      for(instr=gc->first_instruction,i=0; instr!=null; inst
        instr->order=i;
    for(instr=gc->first_instruction; instr!=null; instr=inst
      f=instr->function;
      consolen(Z,"  ",S,Str_map_area(&temp,buffer,Int_str2(i
      for(i=0; i<instr->arguments.nb; i++) {
        consolen(Z," ",END);
        display_argument(IARG(instr,i)); }
      if(instr->jump!=null)
        consolen(Z," => ",S,Str_map_area(&temp,buffer,Int_st
      for(c=List_first(&instr->backward_jumps); c!=G.null_co
        consolen(Z," <= ",S,Str_map_area(&temp,buffer,Int_st
      consolen(Z,"  (",END);
      for(i=0; i<f->nb_argres; i++)
        if(f->arguments[i].type!=null)
          consolen(S,&f->arguments[i].type->name,Z," ",END);
      ListingPosition_get(&f->position,&t);
      consolen(Z," ",S,&t,END);
      ListingPositions_get(&instr->position,&t);
      consolen(Z,") at ",S,&t,EOL); }
    for(instr=gc->first_instruction; instr!=null; instr=instr->next_instruction)
      optimize_listing_instruction(instr);
    Str_destroy(&t); }

    Str_destroy(&t); }


  static Void optimize_initial_listing(struct GeneratorConte
    if(Str_len(&gc->function->name)!=0 && compare_str(&gc->f
      optimize_listing(gc); }


  static Void optimize_initial_listing(struct GeneratorConte
    if(Str_len(&gc->function->name)!=0 && compare_str(&gc->f
      optimize_listing(gc); }