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

scope "/pliant/language/" "/pliant/install/"
module "/pliant/install/ring2.pli"

function new_argument_immediat t v -> a
  arg Type t ; arg Universal v ; arg_RW Argument a
  a :> new Argument
  a locate t argument_constant
  a constant := entry_new t
  t copy_instance addressof:v a:constant

function new_argument_mapped t v -> a
  arg Type t ; arg Universal v ; arg_RW Argument a
  a :> new Argument
  a locate t argument_constant
  a constant := addressof:v

function new_argument_local t -> a
  arg Type t ; arg_RW Argument a
  a :> new Argument
  a locate t argument_local

function new_argument_indirect t p o -> a
  arg Type t ; arg Argument p ; arg Int o ; arg_RW Argument a
  a :> new Argument
  a locate t argument_indirect
  a pointer :> p
  a offset := o

function new_argument_a_register -> a
  arg_RW Argument a
  a :> new Argument
  a locate Int argument_a_register

function new_argument_register r -> a
  arg Int r; arg_RW Argument a
  a :> new Argument
  a locate Int argument_register
  a register := r


public

meta argument e
  if e:size=0
    return
  if addressof:(entry_type e:0:value)<>addressof:Ident
    return
  var Link:Instruction i :> new Instruction
  var Str id := cast (e:0:value map Ident) Str
  if id="constant" or id="mapped_constant"
    if e:size<>3
      return
    var Pointer:Type t :> (e:1 constant Type) map Type
    if addressof:t=null
      return
    if not (e:2 cast t)
      return
    if id="constant"
      i function :> the_function new_argument_immediat Type Universal -> Argument
    eif id="mapped_constant"
      i function :> the_function new_argument_mapped Type Universal -> Argument
    else
      error error_id_unexpected "bug"
    i 'size :=' 3
    var Link:Argument a :> new Argument
    a locate Type argument_constant
    a constant := addressof t
    i 0 :> a
    e suckup e:2
    i 1 :> e:2:result
  eif id="local"
    if e:size<>2 or not (e:1 cast Type)
      return
    i function :> the_function new_argument_local Type -> Argument
    i 'size :=' 2
    e suckup e:1
    i 0 :> e:1:result
  eif id="indirect"
    if e:size<>4 or not (e:1 cast Type) or not (e:2 cast Argument) or not (e:3 cast Int)
      return
    i function :> the_function new_argument_indirect Type Argument Int -> Argument
    i 'size :=' 4
    e suckup e:1
    e suckup e:2
    e suckup e:3
    i 0 :> e:1:result
    i 1 :> e:2:result
    i 2 :> e:3:result
  eif id="a_register"
    if e:size<>1
      return
    i function :> the_function new_argument_a_register -> Argument
    i 'size :=' 1
  eif id="register"
    if e:size<>2 or not (e:1 cast Int)
      return
    i function :> the_function new_argument_register Int -> Argument
    i 'size :=' 2
    e suckup e:1
    i 0 :> e:1:result
  else
    error error_id_unexpected "unknown argument location"
    error error_id_unexpected "unknown argument location: "+id
    return
  var Link:Argument adr :> new Argument
  adr locate Address argument_local
  var Link:Argument a :> new Argument
  a locate Argument argument_indirect
  a pointer :> adr ; a offset := 0
  i i:size-1 :> a
  e add i
  e set_result a access_read+access_write