+static void emit_tarval_data(ir_type *type, ir_tarval *tv)
+{
+ size_t size = get_type_size_bytes(type);
+ if (size == 12) {
+ /* this should be an x86 extended float */
+ assert(be_get_backend_param()->byte_order_big_endian == 0);
+
+ /* Beware: Mixed endian output! One little endian number emitted as
+ * three longs. Each long initializer is written in big endian. */
+ be_emit_irprintf(
+ "\t.long\t0x%02x%02x%02x%02x\n"
+ "\t.long\t0x%02x%02x%02x%02x\n"
+ "\t.long\t0x%02x%02x%02x%02x\n",
+ get_tarval_sub_bits(tv, 3), get_tarval_sub_bits(tv, 2),
+ get_tarval_sub_bits(tv, 1), get_tarval_sub_bits(tv, 0),
+ get_tarval_sub_bits(tv, 7), get_tarval_sub_bits(tv, 6),
+ get_tarval_sub_bits(tv, 5), get_tarval_sub_bits(tv, 4),
+ get_tarval_sub_bits(tv, 11), get_tarval_sub_bits(tv, 10),
+ get_tarval_sub_bits(tv, 9), get_tarval_sub_bits(tv, 8)
+ );
+ be_emit_write_line();
+ } else if (size == 16) {
+ if (be_get_backend_param()->byte_order_big_endian) {
+ be_emit_irprintf(
+ "\t.long\t0x%02x%02x%02x%02x\n"
+ "\t.long\t0x%02x%02x%02x%02x\n"
+ "\t.long\t0x%02x%02x%02x%02x\n"
+ "\t.long\t0x%02x%02x%02x%02x\n",
+ get_tarval_sub_bits(tv, 15), get_tarval_sub_bits(tv, 14),
+ get_tarval_sub_bits(tv, 13), get_tarval_sub_bits(tv, 12),
+ get_tarval_sub_bits(tv, 11), get_tarval_sub_bits(tv, 10),
+ get_tarval_sub_bits(tv, 9), get_tarval_sub_bits(tv, 8),
+ get_tarval_sub_bits(tv, 7), get_tarval_sub_bits(tv, 6),
+ get_tarval_sub_bits(tv, 5), get_tarval_sub_bits(tv, 4),
+ get_tarval_sub_bits(tv, 3), get_tarval_sub_bits(tv, 2),
+ get_tarval_sub_bits(tv, 1), get_tarval_sub_bits(tv, 0)
+ );
+ } else {
+ /* Beware: Mixed endian output! One little endian number emitted as
+ * three longs. Each long initializer is written in big endian. */
+ be_emit_irprintf(
+ "\t.long\t0x%02x%02x%02x%02x\n"
+ "\t.long\t0x%02x%02x%02x%02x\n"
+ "\t.long\t0x%02x%02x%02x%02x\n"
+ "\t.long\t0x%02x%02x%02x%02x\n",
+ get_tarval_sub_bits(tv, 3), get_tarval_sub_bits(tv, 2),
+ get_tarval_sub_bits(tv, 1), get_tarval_sub_bits(tv, 0),
+ get_tarval_sub_bits(tv, 7), get_tarval_sub_bits(tv, 6),
+ get_tarval_sub_bits(tv, 5), get_tarval_sub_bits(tv, 4),
+ get_tarval_sub_bits(tv, 11), get_tarval_sub_bits(tv, 10),
+ get_tarval_sub_bits(tv, 9), get_tarval_sub_bits(tv, 8),
+ get_tarval_sub_bits(tv, 15), get_tarval_sub_bits(tv, 14),
+ get_tarval_sub_bits(tv, 13), get_tarval_sub_bits(tv, 12)
+ );
+ }
+ be_emit_write_line();
+ return;
+ } else {
+ /* default case */
+ emit_size_type(size);
+ emit_arith_tarval(tv, size);
+ be_emit_char('\n');
+ be_emit_write_line();
+ }
+}
+
+/**
+ * Emit an atomic value.
+ *
+ * @param env the gas output environment
+ * @param init a node representing the atomic value (on the const code irg)
+ */
+static void emit_node_data(be_gas_decl_env_t *env, ir_node *init, ir_type *type)
+{
+ size_t size = get_type_size_bytes(type);
+ if (size == 12 || size == 16) {
+ ir_tarval *tv;
+ if (!is_Const(init)) {
+ panic("12/16byte initializers only support Const nodes yet");
+ }
+ tv = get_Const_tarval(init);
+ emit_tarval_data(type, tv);
+ return;
+ }
+
+ emit_size_type(size);
+ emit_init_expression(env, init);
+ be_emit_char('\n');
+ be_emit_write_line();
+}
+