Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/optimizer/extra.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# 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 Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# 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 Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


function copy_int src dest
  arg Int src ; arg_w Int dest
  gcc_inline "$2 = $1;"
  dest := src

function copy_int8 src dest
  arg Int src ; arg_w Int dest
  gcc_inline "*(char *)@2 = (char)$1;"


function optimize_copy gc
  arg_rw GeneratorContext gc
  var Pointer:Instruction instr :> gc first_instruction
  while addressof:instr<>null
    if (addressof instr:function)=addressof:(the_function 'c
      var Pointer:Argument targ :> instr 2 ; check targ:wher
      var Int size := instr:2:constant map Int
      if size=0
        instr :> gc remove instr
      eif size=1
        if gcc_is_active
          gc insert_after_instruction instr (instruction (th
          instr :> gc remove instr
        eif processor_name="i386"
          var Link:Argument arg :> argument a_register
          var Pointer:Instruction cur :> gc insert_after_ins
          gc insert_after_instruction cur (instruction (the_
          instr :> gc remove instr
      eif processor_name="i386" and size=2
        if gcc_is_active
          gc insert_after_instruction instr (instruction (th
          instr :> gc remove instr
        else
          var Link:Argument arg :> argument a_register
          var Pointer:Instruction cur :> gc insert_after_ins
          gc insert_after_instruction cur (instruction (the_
          instr :> gc remove instr
      eif size=Int:size
function copy_int8 src dest
  arg Int src ; arg_w Int dest
  gcc_inline "*(char *)@2 = (char)$1;"


function optimize_copy gc
  arg_rw GeneratorContext gc
  var Pointer:Instruction instr :> gc first_instruction
  while addressof:instr<>null
    if (addressof instr:function)=addressof:(the_function 'c
      var Pointer:Argument targ :> instr 2 ; check targ:wher
      var Int size := instr:2:constant map Int
      if size=0
        instr :> gc remove instr
      eif size=1
        if gcc_is_active
          gc insert_after_instruction instr (instruction (th
          instr :> gc remove instr
        eif processor_name="i386"
          var Link:Argument arg :> argument a_register
          var Pointer:Instruction cur :> gc insert_after_ins
          gc insert_after_instruction cur (instruction (the_
          instr :> gc remove instr
      eif processor_name="i386" and size=2
        if gcc_is_active
          gc insert_after_instruction instr (instruction (th
          instr :> gc remove instr
        else
          var Link:Argument arg :> argument a_register
          var Pointer:Instruction cur :> gc insert_after_ins
          gc insert_after_instruction cur (instruction (the_
          instr :> gc remove instr
      eif size=Int:size
        gc insert_after_instruction instr (instruction (the_
        gc insert_after_instruction instr (instruction (the_function 'copy atomic' Int Int) instr:0 instr:1)
        instr :> gc remove instr
      else
        instr :> instr next_instruction
    else
      instr :> instr next_instruction



record_optimizer_function optimize_constant "pliant optimize
record_optimizer_function optimize_copy "pliant optimizer re
record_optimizer_function optimize_translate "pliant optimiz
record_optimizer_function optimize_drop "pliant optimizer re
record_optimizer_function optimize_drop "pliant optimizer re
        instr :> gc remove instr
      else
        instr :> instr next_instruction
    else
      instr :> instr next_instruction



record_optimizer_function optimize_constant "pliant optimize
record_optimizer_function optimize_copy "pliant optimizer re
record_optimizer_function optimize_translate "pliant optimiz
record_optimizer_function optimize_drop "pliant optimizer re
record_optimizer_function optimize_drop "pliant optimizer re