From e87ac5865f7932014b7434960085b0bc04dbf6bb Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Tue, 26 Jun 2007 16:13:07 +0000 Subject: [PATCH] preliminary support for floating point branches [r14766] --- ir/be/arm/arm_new_nodes.c | 14 ++++++------ ir/be/arm/arm_new_nodes.h | 6 ++--- ir/be/arm/arm_spec.pl | 48 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/ir/be/arm/arm_new_nodes.c b/ir/be/arm/arm_new_nodes.c index f7e0aec1f..8b6a4efb4 100644 --- a/ir/be/arm/arm_new_nodes.c +++ b/ir/be/arm/arm_new_nodes.c @@ -226,7 +226,7 @@ static int arm_dump_node(ir_node *n, FILE *F, dump_reason_t reason) { } } } - if (is_arm_CondJmp(n) && get_arm_CondJmp_proj_num(n) >= 0) { + if (is_arm_CmpBra(n) && get_arm_CondJmp_proj_num(n) >= 0) { fprintf(F, "proj_num = (%d)\n", get_arm_CondJmp_proj_num(n)); } /* TODO: dump all additional attributes */ @@ -276,13 +276,13 @@ const arm_SymConst_attr_t *get_arm_SymConst_attr_const(const ir_node *node) { } /* Returns the attributes of a CondJmp node. */ -arm_CondJmp_attr_t *get_arm_CondJmp_attr(ir_node *node) { - assert(is_arm_CondJmp(node)); +arm_CondJmp_attr_t *get_arm_CmpBra_attr(ir_node *node) { + assert(is_arm_CmpBra(node)); return get_irn_generic_attr(node); } -const arm_CondJmp_attr_t *get_arm_CondJmp_attr_const(const ir_node *node) { - assert(is_arm_CondJmp(node)); +const arm_CondJmp_attr_t *get_arm_CmpBra_attr_const(const ir_node *node) { + assert(is_arm_CmpBra(node)); return get_irn_generic_attr_const(node); } @@ -461,7 +461,7 @@ void set_arm_value(ir_node *node, tarval *tv) { * Returns the proj num */ int get_arm_CondJmp_proj_num(const ir_node *node) { - const arm_CondJmp_attr_t *attr = get_arm_CondJmp_attr_const(node); + const arm_CondJmp_attr_t *attr = get_arm_CmpBra_attr_const(node); return attr->proj_num; } @@ -469,7 +469,7 @@ int get_arm_CondJmp_proj_num(const ir_node *node) { * Sets the proj num */ void set_arm_CondJmp_proj_num(ir_node *node, int proj_num) { - arm_CondJmp_attr_t *attr = get_arm_CondJmp_attr(node); + arm_CondJmp_attr_t *attr = get_arm_CmpBra_attr(node); attr->proj_num = proj_num; } diff --git a/ir/be/arm/arm_new_nodes.h b/ir/be/arm/arm_new_nodes.h index b5c02b32b..ba0a81202 100644 --- a/ir/be/arm/arm_new_nodes.h +++ b/ir/be/arm/arm_new_nodes.h @@ -53,10 +53,10 @@ arm_SymConst_attr_t *get_arm_SymConst_attr(ir_node *node); const arm_SymConst_attr_t *get_arm_SymConst_attr_const(const ir_node *node); /** - * Returns the attributes of an ARM CondJmp node. + * Returns the attributes of an ARM CompareAndBranch node. */ -arm_CondJmp_attr_t *get_arm_CondJmp_attr(ir_node *node); -const arm_CondJmp_attr_t *get_arm_CondJmp_attr_const(const ir_node *node); +arm_CondJmp_attr_t *get_arm_CmpBra_attr(ir_node *node); +const arm_CondJmp_attr_t *get_arm_CmpBra_attr_const(const ir_node *node); /** * Returns the attributes of an ARM SwitchJmp node. diff --git a/ir/be/arm/arm_spec.pl b/ir/be/arm/arm_spec.pl index 60c7f0679..5a3d2a13f 100644 --- a/ir/be/arm/arm_spec.pl +++ b/ir/be/arm/arm_spec.pl @@ -565,10 +565,10 @@ SymConst => { attr_type => "arm_SymConst_attr_t", }, -CondJmp => { +CmpBra => { op_flags => "L|X|Y", state => "pinned", - comment => "construct conditional jump: CMP A, B && JMPxx LABEL", + comment => "construct conditional branch: CMP A, B && JMPxx LABEL", mode => "mode_T", attr => "int proj_num", init_attr => "\tset_arm_CondJmp_proj_num(res, proj_num);", @@ -831,6 +831,50 @@ fpaFix => { emit => '. fix %D0, %S0', }, +fpaCmfBra => { + op_flags => "L|X|Y", + state => "pinned", + comment => "construct floating point Compare and Branch: CMF A, B && JMPxx LABEL", + mode => "mode_T", + attr => "int proj_num", + init_attr => "\tset_arm_CondJmp_proj_num(res, proj_num);", + reg_req => { "in" => [ "fpa", "fpa" ], "out" => [ "none", "none"] }, + attr_type => "arm_CondJmp_attr_t", +}, + +fpaCnfBra => { + op_flags => "L|X|Y", + state => "pinned", + comment => "construct floating point Compare negative and Branch: CMF A, -B && JMPxx LABEL", + mode => "mode_T", + attr => "int proj_num", + init_attr => "\tset_arm_CondJmp_proj_num(res, proj_num);", + reg_req => { "in" => [ "fpa", "fpa" ], "out" => [ "none", "none"] }, + attr_type => "arm_CondJmp_attr_t", +}, + +fpaCmfeBra => { + op_flags => "L|X|Y", + state => "pinned", + comment => "construct floating point Compare and Branch: CMF A, -B && JMPxx LABEL", + mode => "mode_T", + attr => "int proj_num", + init_attr => "\tset_arm_CondJmp_proj_num(res, proj_num);", + reg_req => { "in" => [ "fpa", "fpa" ], "out" => [ "none", "none"] }, + attr_type => "arm_CondJmp_attr_t", +}, + +fpaCnfeBra => { + op_flags => "L|X|Y", + state => "pinned", + comment => "construct floating point Compare and Branch: CMF A, -B && JMPxx LABEL", + mode => "mode_T", + attr => "int proj_num", + init_attr => "\tset_arm_CondJmp_proj_num(res, proj_num);", + reg_req => { "in" => [ "fpa", "fpa" ], "out" => [ "none", "none"] }, + attr_type => "arm_CondJmp_attr_t", +}, + # Load / Store fpaLdf => { -- 2.20.1