X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Farm%2Farm_spec.pl;h=f4746d44cb62973892962fc2c5f7541710ef7d3d;hb=ce6161a7e42a48f7422b7babcc64d8ace18e2687;hp=944059b425a7ecde28c17c875c1d65abd1270e51;hpb=637450acaf2ef255b2841785a6c6e6b809c9ac27;p=libfirm diff --git a/ir/be/arm/arm_spec.pl b/ir/be/arm/arm_spec.pl index 944059b42..f4746d44c 100644 --- a/ir/be/arm/arm_spec.pl +++ b/ir/be/arm/arm_spec.pl @@ -12,48 +12,40 @@ $mode_gp = "mode_Iu"; $mode_flags = "mode_Bu"; $mode_fp = "mode_E"; -# register types: -$normal = 0; # no special type -$caller_save = 1; # caller save (register must be saved by the caller of a function) -$callee_save = 2; # callee save (register must be saved by the called function) -$ignore = 4; # ignore (do not assign this register) -$arbitrary = 8; # emitter can choose an arbitrary register of this class -$virtual = 16; # the register is a virtual one -$state = 32; # register represents a state # NOTE: Last entry of each class is the largest Firm-Mode a register can hold %reg_classes = ( gp => [ - { name => "r0", type => $caller_save }, - { name => "r1", type => $caller_save }, - { name => "r2", type => $caller_save }, - { name => "r3", type => $caller_save }, - { name => "r4", type => $callee_save }, - { name => "r5", type => $callee_save }, - { name => "r6", type => $callee_save }, - { name => "r7", type => $callee_save }, - { name => "r8", type => $callee_save }, - { name => "r9", type => $callee_save }, - { name => "r10", type => $callee_save }, - { name => "r11", type => $callee_save }, - { name => "r12", type => $ignore }, # reserved for linker/immediate fixups - { name => "sp", type => $ignore }, # this is our stack pointer - { name => "lr", type => $callee_save | $caller_save }, # this is our return address - { name => "pc", type => $ignore }, # this is our program counter + { name => "r0" }, + { name => "r1" }, + { name => "r2" }, + { name => "r3" }, + { name => "r4" }, + { name => "r5" }, + { name => "r6" }, + { name => "r7" }, + { name => "r8" }, + { name => "r9" }, + { name => "r10" }, + { name => "r11" }, + { name => "r12" }, + { name => "sp" }, + { name => "lr" }, + { name => "pc" }, { mode => $mode_gp } ], fpa => [ - { name => "f0", type => $caller_save }, - { name => "f1", type => $caller_save }, - { name => "f2", type => $caller_save }, - { name => "f3", type => $caller_save }, - { name => "f4", type => $caller_save }, - { name => "f5", type => $caller_save }, - { name => "f6", type => $caller_save }, - { name => "f7", type => $caller_save }, + { name => "f0" }, + { name => "f1" }, + { name => "f2" }, + { name => "f3" }, + { name => "f4" }, + { name => "f5" }, + { name => "f6" }, + { name => "f7" }, { mode => $mode_fp } ], flags => [ - { name => "fl", type => 0 }, + { name => "fl" }, { mode => $mode_flags, flags => "manual_ra" } ], ); @@ -304,6 +296,13 @@ Mvn => { constructors => \%unop_shifter_operand_constructors, }, +Clz => { + irn_flags => [ "rematerializable" ], + reg_req => { in => [ "gp" ], out => [ "gp" ] }, + emit =>'. clz %D0, %S0', + mode => $mode_gp, +}, + # mov lr, pc\n mov pc, XXX -- This combination is used for calls to function # pointers LinkMovPC => { @@ -419,7 +418,8 @@ SwitchJmp => { mode => "mode_T", attr => "int n_projs, long def_proj_num", init_attr => "\tset_arm_SwitchJmp_n_projs(res, n_projs);\n". - "\tset_arm_SwitchJmp_default_proj_num(res, def_proj_num);", + "\tset_arm_SwitchJmp_default_proj_num(res, def_proj_num);\n". + "\tinfo->out_infos = NULL;", reg_req => { in => [ "gp" ], out => [ "none" ] }, attr_type => "arm_SwitchJmp_attr_t", }, @@ -560,7 +560,7 @@ Stf => { fConst => { op_flags => [ "constlike" ], irn_flags => [ "rematerializable" ], - attr => "tarval *tv", + attr => "ir_tarval *tv", init_attr => "attr->tv = tv;", mode => "get_tarval_mode(tv)", reg_req => { out => [ "fpa" ] },