+ switch(attr->imm_type) {
+ case MIPS_IMM_CONST:
+ be_emit_irprintf("%d", attr->val);
+ break;
+ case MIPS_IMM_SYMCONST_LO:
+ be_emit_cstring("%lo($");
+ be_emit_ident(get_entity_ld_ident(attr->entity));
+ if(attr->val != 0) {
+ be_emit_irprintf("%+d", attr->val);
+ }
+ be_emit_char(')');
+ break;
+ case MIPS_IMM_SYMCONST_HI:
+ be_emit_cstring("%hi($");
+ be_emit_ident(get_entity_ld_ident(attr->entity));
+ if(attr->val != 0) {
+ be_emit_irprintf("%+d", attr->val);
+ }
+ be_emit_char(')');
+ break;
+ default:
+ panic("invalid immediate type found");
+ }
+}
+
+/**
+ * Emit the name of the destination register at given output position.
+ */
+void mips_emit_source_register_or_immediate(const ir_node *node, int pos)
+{
+ const ir_node *op = get_irn_n(node, pos);
+ if(is_mips_Immediate(op)) {
+ mips_emit_immediate(op);