projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
add extra info for immediate float mode
[libfirm]
/
ir
/
be
/
arm
/
arm_emitter.c
diff --git
a/ir/be/arm/arm_emitter.c
b/ir/be/arm/arm_emitter.c
index
498dffd
..
14b3fd5
100644
(file)
--- a/
ir/be/arm/arm_emitter.c
+++ b/
ir/be/arm/arm_emitter.c
@@
-52,6
+52,7
@@
#include "../be_dbgout.h"
#include "arm_emitter.h"
#include "../be_dbgout.h"
#include "arm_emitter.h"
+#include "arm_optimize.h"
#include "gen_arm_emitter.h"
#include "arm_nodes_attr.h"
#include "arm_new_nodes.h"
#include "gen_arm_emitter.h"
#include "arm_nodes_attr.h"
#include "arm_new_nodes.h"
@@
-174,13
+175,11
@@
void arm_emit_dest_register(const ir_node *node, int pos) {
*/
void arm_emit_offset(const ir_node *node) {
int offset = 0;
*/
void arm_emit_offset(const ir_node *node) {
int offset = 0;
- ir_op
*irn_op = get_irn_op
(node);
+ ir_op
code opc = get_irn_opcode
(node);
- if (
irn_op == op_be_Reload || irn_op == op_be
_Spill) {
+ if (
opc == beo_Reload || opc == beo
_Spill) {
ir_entity *ent = be_get_frame_entity(node);
offset = get_entity_offset(ent);
ir_entity *ent = be_get_frame_entity(node);
offset = get_entity_offset(ent);
- } else if (irn_op == op_be_IncSP) {
- offset = - be_get_IncSP_offset(node);
} else {
assert(!"unimplemented arm_emit_offset for this node type");
panic("unimplemented arm_emit_offset for this node type");
} else {
assert(!"unimplemented arm_emit_offset for this node type");
panic("unimplemented arm_emit_offset for this node type");
@@
-193,12
+192,13
@@
void arm_emit_offset(const ir_node *node) {
*/
static void arm_emit_fpa_postfix(const ir_mode *mode) {
int bits = get_mode_size_bits(mode);
*/
static void arm_emit_fpa_postfix(const ir_mode *mode) {
int bits = get_mode_size_bits(mode);
+ char c = 'e';
+
if (bits == 32)
if (bits == 32)
-
be_emit_char('s')
;
+
c = 's'
;
else if (bits == 64)
else if (bits == 64)
- be_emit_char('d');
- else
- be_emit_char('e');
+ c = 'd';
+ be_emit_char(c);
}
/**
}
/**
@@
-713,19
+713,22
@@
static void emit_be_Call(const ir_node *irn) {
/** Emit an IncSP node */
static void emit_be_IncSP(const ir_node *irn) {
/** Emit an IncSP node */
static void emit_be_IncSP(const ir_node *irn) {
- int offs = be_get_IncSP_offset(irn);
+ int offs =
-
be_get_IncSP_offset(irn);
if (offs != 0) {
if (offs != 0) {
- be_emit_cstring("\tadd ");
+ if (offs < 0) {
+ be_emit_cstring("\tsub ");
+ offs = -offs;
+ } else {
+ be_emit_cstring("\tadd ");
+ }
arm_emit_dest_register(irn, 0);
be_emit_cstring(", ");
arm_emit_source_register(irn, 0);
arm_emit_dest_register(irn, 0);
be_emit_cstring(", ");
arm_emit_source_register(irn, 0);
- be_emit_cstring(", #");
- arm_emit_offset(irn);
+ be_emit_irprintf(", #%x", offs);
} else {
} else {
- be_emit_cstring("\t/* omitted IncSP(");
- arm_emit_offset(irn);
- be_emit_cstring(") */");
+ /* omitted IncSP(0) */
+ return;
}
be_emit_finish_line_gas(irn);
}
}
be_emit_finish_line_gas(irn);
}
@@
-734,11
+737,7
@@
static void emit_be_Copy(const ir_node *irn) {
ir_mode *mode = get_irn_mode(irn);
if (get_in_reg(irn, 0) == get_out_reg(irn, 0)) {
ir_mode *mode = get_irn_mode(irn);
if (get_in_reg(irn, 0) == get_out_reg(irn, 0)) {
- be_emit_cstring("\t/* omitted Copy: ");
- arm_emit_source_register(irn, 0);
- be_emit_cstring(" -> ");
- arm_emit_dest_register(irn, 0);
- be_emit_finish_line_gas(irn);
+ /* omitted Copy */
return;
}
return;
}