7 $mode_flags = "mode_Bu";
8 $mode_fpflags = "mode_Bu";
13 # available SPARC registers: 8 globals, 24 window regs (8 ins, 8 outs, 8 locals)
49 { name => "frame_pointer", realname => "fp" },
54 { name => "fpflags" },
55 { mode => $mode_fpflags, flags => "manual_ra" }
59 { mode => $mode_flags, flags => "manual_ra" }
63 { mode => $mode_gp, flags => "manual_ra" }
65 # fp registers can be accessed any time
104 # emit source reg or imm dep. on node's arity
105 RI => "${arch}_emit_reg_or_imm(node, -1);",
106 R1I => "${arch}_emit_reg_or_imm(node, 1);",
107 R2I => "${arch}_emit_reg_or_imm(node, 2);",
108 S0 => "${arch}_emit_source_register(node, 0);",
109 S1 => "${arch}_emit_source_register(node, 1);",
110 D0 => "${arch}_emit_dest_register(node, 0);",
111 D1 => "${arch}_emit_dest_register(node, 1);",
112 HIM => "${arch}_emit_high_immediate(node);",
113 LM => "${arch}_emit_load_mode(node);",
114 SM => "${arch}_emit_store_mode(node);",
115 FLSM => "${arch}_emit_float_load_store_mode(node);",
116 FPM => "${arch}_emit_fp_mode_suffix(node);",
117 FCONVS => "${arch}_emit_fp_conv_source(node);",
118 FCONVD => "${arch}_emit_fp_conv_destination(node);",
119 O1 => "${arch}_emit_offset(node, 1);",
120 O2 => "${arch}_emit_offset(node, 2);",
121 S0O1 => "${arch}_emit_source_reg_and_offset(node, 0, 1);",
122 S1O2 => "${arch}_emit_source_reg_and_offset(node, 1, 2);",
124 $indent_line_func = "sparc_emit_indent()";
126 $default_attr_type = "sparc_attr_t";
127 $default_copy_attr = "sparc_copy_attr";
130 sparc_attr_t => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);",
131 sparc_load_store_attr_t => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);",
132 sparc_jmp_cond_attr_t => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);",
133 sparc_switch_jmp_attr_t => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);\n".
134 "\tinit_sparc_switch_jmp_attributes(res, default_pn, jump_table);\n",
135 sparc_fp_attr_t => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);\n".
136 "\tinit_sparc_fp_attributes(res, fp_mode);\n",
137 sparc_fp_conv_attr_t => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);".
138 "\tinit_sparc_fp_conv_attributes(res, src_mode, dest_mode);\n",
142 sparc_attr_t => "cmp_attr_sparc",
143 sparc_load_store_attr_t => "cmp_attr_sparc_load_store",
144 sparc_jmp_cond_attr_t => "cmp_attr_sparc_jmp_cond",
145 sparc_switch_jmp_attr_t => "cmp_attr_sparc_switch_jmp",
146 sparc_fp_attr_t => "cmp_attr_sparc_fp",
147 sparc_fp_conv_attr_t => "cmp_attr_sparc_fp_conv",
150 %custom_irn_flags = (
151 modifies_flags => "(arch_irn_flags_t)sparc_arch_irn_flag_modifies_flags",
152 modifies_fp_flags => "(arch_irn_flags_t)sparc_arch_irn_flag_modifies_fp_flags",
153 has_delay_slot => "(arch_irn_flags_t)sparc_arch_irn_flag_has_delay_slot",
156 my %cmp_operand_constructors = (
158 attr => "ir_entity *immediate_entity, int32_t immediate_value",
159 custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);",
160 reg_req => { in => [ "gp" ], out => [ "flags" ] },
164 reg_req => { in => [ "gp", "gp" ], out => [ "flags" ] },
165 ins => [ "left", "right" ],
169 my %binop_operand_constructors = (
171 attr => "ir_entity *immediate_entity, int32_t immediate_value",
172 custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);",
173 reg_req => { in => [ "gp" ], out => [ "gp" ] },
177 reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
178 ins => [ "left", "right" ],
182 my %binopcc_operand_constructors = (
184 attr => "ir_entity *immediate_entity, int32_t immediate_value",
185 custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);",
186 reg_req => { in => [ "gp" ], out => [ "gp", "flags" ] },
190 reg_req => { in => [ "gp", "gp" ], out => [ "gp", "flags" ] },
191 ins => [ "left", "right" ],
195 my %binopx_operand_constructors = (
197 attr => "ir_entity *immediate_entity, int32_t immediate_value",
198 custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);",
199 reg_req => { in => [ "gp", "flags" ], out => [ "gp" ] },
200 ins => [ "left", "carry" ],
203 reg_req => { in => [ "gp", "gp", "flags" ], out => [ "gp" ] },
204 ins => [ "left", "right", "carry" ],
209 my %binopcczero_operand_constructors = (
211 attr => "ir_entity *immediate_entity, int32_t immediate_value",
212 custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);",
213 reg_req => { in => [ "gp" ], out => [ "flags" ] },
217 reg_req => { in => [ "gp", "gp" ], out => [ "flags" ] },
218 ins => [ "left", "right" ],
222 my %div_operand_constructors = (
224 attr => "ir_entity *immediate_entity, int32_t immediate_value",
225 custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);",
226 reg_req => { in => [ "gp", "gp" ], out => [ "gp" ] },
229 reg_req => { in => [ "gp", "gp", "gp" ], out => [ "gp" ] },
233 my %float_binop_constructors = (
235 reg_req => { in => [ "fp", "fp" ], out => [ "fp" ] },
239 reg_req => { in => [ "fp:a|2", "fp:a|2" ], out => [ "fp:a|2" ] },
243 reg_req => { in => [ "fp:a|4", "fp:a|4" ], out => [ "fp:a|4" ] },
248 my %float_unop_constructors = (
250 reg_req => { in => [ "fp" ], out => [ "fp" ] },
254 reg_req => { in => [ "fp:a|2" ], out => [ "fp:a|2" ] },
258 reg_req => { in => [ "fp:a|4" ], out => [ "fp:a|4" ] },
266 irn_flags => [ "rematerializable" ],
268 emit => '. add %S0, %R1I, %D0',
269 constructors => \%binop_operand_constructors,
273 irn_flags => [ "rematerializable", "modifies_flags" ],
274 emit => '. addcc %S0, %R1I, %D0',
275 outs => [ "res", "flags" ],
276 constructors => \%binopcc_operand_constructors,
280 irn_flags => [ "rematerializable", "modifies_flags" ],
281 emit => '. addcc %S0, %R1I, %%g0',
283 constructors => \%binopcczero_operand_constructors,
287 # At the moment not rematerializable because of assert in beflags.c/
288 # (it claims that spiller can't rematerialize flag stuff correctly)
289 #irn_flags => [ "rematerializable" ],
290 emit => '. addx %S0, %R1I, %D0',
291 constructors => \%binopx_operand_constructors,
296 ins => [ "left", "right" ],
297 outs => [ "res", "flags" ],
303 ins => [ "left", "right", "flags_input" ],
309 irn_flags => [ "rematerializable" ],
311 emit => '. sub %S0, %R1I, %D0',
312 constructors => \%binop_operand_constructors,
316 irn_flags => [ "rematerializable", "modifies_flags" ],
317 emit => '. subcc %S0, %R1I, %D0',
318 outs => [ "res", "flags" ],
319 constructors => \%binopcc_operand_constructors,
323 irn_flags => [ "rematerializable", "modifies_flags" ],
324 emit => '. subcc %S0, %R1I, %%g0',
326 constructors => \%binopcczero_operand_constructors,
330 # Not rematerializable (see AddX)
331 emit => '. subx %S0, %R1I, %D0',
332 constructors => \%binopx_operand_constructors,
337 ins => [ "left", "right" ],
338 outs => [ "res", "flags" ],
344 ins => [ "left", "right", "flags_input" ],
351 op_flags => [ "labeled" ],
352 state => "exc_pinned",
355 reg_req => { in => [ "gp", "none" ], out => [ "gp", "none" ] },
356 ins => [ "ptr", "mem" ],
357 attr => "ir_mode *ls_mode, ir_entity *entity, int32_t offset, bool is_frame_entity",
358 custominit => "init_sparc_load_store_attributes(res, ls_mode, entity, offset, is_frame_entity, false);",
361 reg_req => { in => [ "gp", "gp", "none" ], out => [ "gp", "none" ] },
362 ins => [ "ptr", "ptr2", "mem" ],
363 attr => "ir_mode *ls_mode",
364 custominit => "init_sparc_load_store_attributes(res, ls_mode, NULL, 0, false, true);",
367 ins => [ "ptr", "mem" ],
368 outs => [ "res", "M" ],
369 attr_type => "sparc_load_store_attr_t",
370 emit => '. ld%LM [%S0O1], %D0'
374 irn_flags => [ "rematerializable" ],
377 reg_req => { in => [], out => [ "gp" ] },
378 attr => "ir_entity *entity, int32_t immediate_value",
379 custominit => "sparc_set_attr_imm(res, entity, immediate_value);",
380 emit => '. sethi %HIM, %D0'
384 op_flags => [ "labeled" ],
386 state => "exc_pinned",
389 reg_req => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
390 ins => [ "val", "ptr", "mem" ],
391 attr => "ir_mode *ls_mode, ir_entity *entity, int32_t offset, bool is_frame_entity",
392 custominit => "init_sparc_load_store_attributes(res, ls_mode, entity, offset, is_frame_entity, false);",
395 reg_req => { in => [ "gp", "gp", "gp", "none" ], out => [ "none" ] },
396 ins => [ "val", "ptr", "ptr2", "mem" ],
397 attr => "ir_mode *ls_mode",
398 custominit => "init_sparc_load_store_attributes(res, ls_mode, NULL, 0, false, true);",
401 ins => [ "val", "ptr", "mem" ],
403 attr_type => "sparc_load_store_attr_t",
404 emit => '. st%SM %S0, [%S1O2]'
408 emit => '. save %S0, %R1I, %D0',
413 attr => "ir_entity *immediate_entity, int32_t immediate_value",
414 custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);",
415 reg_req => { in => [ "sp" ], out => [ "sp:I|S" ] },
419 reg_req => { in => [ "sp", "gp" ], out => [ "sp:I|S" ] },
420 ins => [ "stack", "increment" ],
427 outs => [ "stack", "res" ],
430 attr => "ir_entity *immediate_entity, int32_t immediate_value",
431 custominit => "sparc_set_attr_imm(res, immediate_entity, immediate_value);",
432 reg_req => { in => [ "frame_pointer", "gp" ], out => [ "sp:I|S", "gp" ] },
433 ins => [ "frame_pointer", "left" ],
436 reg_req => { in => [ "frame_pointer", "gp", "gp" ], out => [ "sp:I|S", "gp" ] },
437 ins => [ "frame_pointer", "left", "right" ],
443 reg_req => { in => [ "frame_pointer" ], out => [ "sp:I|S" ] },
444 ins => [ "frame_pointer" ],
451 reg_req => { in => [ "sp", "gp" ], out => [ "sp:I|S" ] },
452 ins => [ "stack", "size" ],
454 emit => ". sub %S0, %S1, %D0\n",
459 reg_req => { in => [ "sp", "gp" ], out => [ "sp:I|S" ] },
460 ins => [ "stack", "size" ],
462 emit => ". add %S0, %S1, %D0\n",
467 op_flags => [ "constlike" ],
468 irn_flags => [ "rematerializable" ],
469 attr => "ir_entity *entity, int32_t offset",
470 reg_req => { in => [ "gp" ], out => [ "gp" ] },
472 attr_type => "sparc_attr_t",
473 custominit => "sparc_set_attr_imm(res, entity, offset);",
478 op_flags => [ "labeled", "cfopcode", "forking" ],
479 irn_flags => [ "has_delay_slot" ],
482 attr_type => "sparc_jmp_cond_attr_t",
483 attr => "ir_relation relation, bool is_unsigned",
484 init_attr => "\tinit_sparc_jmp_cond_attr(res, relation, is_unsigned);",
485 reg_req => { in => [ "flags" ], out => [ "none", "none" ] },
487 outs => [ "false", "true" ],
491 op_flags => [ "labeled", "cfopcode", "forking" ],
492 irn_flags => [ "has_delay_slot" ],
495 attr_type => "sparc_jmp_cond_attr_t",
496 attr => "ir_relation relation",
497 init_attr => "\tinit_sparc_jmp_cond_attr(res, relation, false);",
498 reg_req => { in => [ "fpflags" ], out => [ "none", "none" ] },
500 outs => [ "false", "true" ],
504 # Note: has_delay_slot depends on wether it is a fallthrough or not, so we
505 # have special code for this in sparc_emitter
507 op_flags => [ "cfopcode" ],
508 irn_flags => [ "simple_jump" ],
509 reg_req => { out => [ "none" ] },
515 out_arity => "variable",
519 # This is a Jump instruction, but with the addition that you can add custom
520 # register constraints to model your calling conventions
523 op_flags => [ "cfopcode" ],
524 irn_flags => [ "has_delay_slot" ],
529 attr => "ir_entity *entity, int32_t offset",
530 custominit => "\tsparc_set_attr_imm(res, entity, offset);",
532 reg_req => { out => [ "none" ] },
536 reg_req => { out => [ "none" ] },
541 # This is a JumpLink instruction, but with the addition that you can add custom
542 # register constraints to model your calling conventions
544 irn_flags => [ "modifies_flags", "modifies_fp_flags", "has_delay_slot" ],
545 state => "exc_pinned",
547 out_arity => "variable",
550 attr => "ir_entity *entity, int32_t offset, bool aggregate_return",
551 custominit => "\tsparc_set_attr_imm(res, entity, offset);".
552 "\tif (aggregate_return) arch_add_irn_flags(res, sparc_arch_irn_flag_aggregate_return);",
554 out_arity => "variable",
557 attr => "bool aggregate_return",
559 out_arity => "variable",
560 custominit => "\tif (aggregate_return) arch_add_irn_flags(res, sparc_arch_irn_flag_aggregate_return);",
565 Cmp => { # aka SubccZero
566 irn_flags => [ "rematerializable", "modifies_flags" ],
567 emit => '. cmp %S0, %R1I',
569 constructors => \%binopcczero_operand_constructors,
573 op_flags => [ "labeled", "cfopcode", "forking" ],
574 irn_flags => [ "has_delay_slot" ],
577 reg_req => { in => [ "gp" ], out => [ ] },
578 attr_type => "sparc_switch_jmp_attr_t",
579 attr => "long default_pn, ir_entity *jump_table",
580 init_attr => "info->out_infos = NULL;", # XXX ugly hack for out requirements
584 irn_flags => [ "rematerializable" ],
586 emit => '. sll %S0, %R1I, %D0',
587 constructors => \%binop_operand_constructors,
591 irn_flags => [ "rematerializable" ],
593 emit => '. srl %S0, %R1I, %D0',
594 constructors => \%binop_operand_constructors,
598 irn_flags => [ "rematerializable" ],
600 emit => '. sra %S0, %R1I, %D0',
601 constructors => \%binop_operand_constructors,
605 irn_flags => [ "rematerializable" ],
607 emit => '. and %S0, %R1I, %D0',
608 constructors => \%binop_operand_constructors,
612 irn_flags => [ "rematerializable", "modifies_flags" ],
613 emit => '. andcc %S0, %R1I, %%g0',
615 constructors => \%binopcczero_operand_constructors,
619 irn_flags => [ "rematerializable" ],
621 emit => '. andn %S0, %R1I, %D0',
622 constructors => \%binop_operand_constructors,
626 irn_flags => [ "rematerializable", "modifies_flags" ],
627 emit => '. andncc %S0, %R1I, %%g0',
629 constructors => \%binopcczero_operand_constructors,
633 irn_flags => [ "rematerializable" ],
635 emit => '. or %S0, %R1I, %D0',
636 constructors => \%binop_operand_constructors,
640 irn_flags => [ "rematerializable", "modifies_flags" ],
641 emit => '. orcc %S0, %R1I, %%g0',
643 constructors => \%binopcczero_operand_constructors,
647 irn_flags => [ "rematerializable" ],
649 emit => '. orn %S0, %R1I, %D0',
650 constructors => \%binop_operand_constructors,
654 irn_flags => [ "rematerializable", "modifies_flags" ],
655 emit => '. orncc %S0, %R1I, %%g0',
657 constructors => \%binopcczero_operand_constructors,
661 irn_flags => [ "rematerializable" ],
663 emit => '. xor %S0, %R1I, %D0',
664 constructors => \%binop_operand_constructors,
668 irn_flags => [ "rematerializable", "modifies_flags" ],
669 emit => '. xorcc %S0, %R1I, %%g0',
671 constructors => \%binopcczero_operand_constructors,
675 irn_flags => [ "rematerializable" ],
677 emit => '. xnor %S0, %R1I, %D0',
678 constructors => \%binop_operand_constructors,
682 irn_flags => [ "rematerializable", "modifies_flags" ],
683 emit => '. xnorcc %S0, %R1I, %%g0',
685 constructors => \%binopcczero_operand_constructors,
689 irn_flags => [ "rematerializable" ],
691 emit => '. smul %S0, %R1I, %D0',
692 constructors => \%binop_operand_constructors,
696 irn_flags => [ "rematerializable", "modifies_flags" ],
697 emit => '. smulcc %S0, %R1I, %%g0',
699 constructors => \%binopcczero_operand_constructors,
703 irn_flags => [ "rematerializable" ],
704 outs => [ "low", "high" ],
705 constructors => \%binop_operand_constructors,
709 irn_flags => [ "rematerializable" ],
710 outs => [ "low", "high" ],
711 constructors => \%binop_operand_constructors,
715 irn_flags => [ "rematerializable", "has_delay_slot" ],
716 state => "exc_pinned",
717 ins => [ "dividend_high", "dividend_low", "divisor" ],
718 outs => [ "res", "M" ],
719 constructors => \%div_operand_constructors,
723 irn_flags => [ "rematerializable", "has_delay_slot" ],
724 state => "exc_pinned",
725 ins => [ "dividend_high", "dividend_low", "divisor" ],
726 outs => [ "res", "M" ],
727 constructors => \%div_operand_constructors,
731 irn_flags => [ "rematerializable", "modifies_fp_flags" ],
732 emit => '. fcmp%FPM %S0, %S1',
733 attr_type => "sparc_fp_attr_t",
734 attr => "ir_mode *fp_mode",
735 mode => $mode_fpflags,
738 reg_req => { in => [ "fp", "fp" ], out => [ "fpflags" ] },
741 reg_req => { in => [ "fp:a|2", "fp:a|2" ], out => [ "fpflags" ] },
744 reg_req => { in => [ "fp:a|4", "fp:a|4" ], out => [ "fpflags" ] },
750 op_flags => [ "commutative" ],
751 irn_flags => [ "rematerializable" ],
752 emit => '. fadd%FPM %S0, %S1, %D0',
753 attr_type => "sparc_fp_attr_t",
754 attr => "ir_mode *fp_mode",
755 ins => [ "left", "right" ],
756 constructors => \%float_binop_constructors,
760 irn_flags => [ "rematerializable" ],
761 emit => '. fsub%FPM %S0, %S1, %D0',
762 attr_type => "sparc_fp_attr_t",
763 attr => "ir_mode *fp_mode",
764 ins => [ "left", "right" ],
765 constructors => \%float_binop_constructors,
769 irn_flags => [ "rematerializable" ],
770 op_flags => [ "commutative" ],
771 emit =>'. fmul%FPM %S0, %S1, %D0',
772 attr_type => "sparc_fp_attr_t",
773 attr => "ir_mode *fp_mode",
774 ins => [ "left", "right" ],
775 constructors => \%float_binop_constructors,
779 irn_flags => [ "rematerializable" ],
780 emit => '. fdiv%FPM %S0, %S1, %D0',
781 attr_type => "sparc_fp_attr_t",
782 attr => "ir_mode *fp_mode",
783 ins => [ "left", "right" ],
784 outs => [ "res", "M" ],
787 reg_req => { in => [ "fp", "fp" ], out => [ "fp", "none" ] },
790 reg_req => { in => [ "fp:a|2", "fp:a|2" ], out => [ "fp:a|2", "none" ] },
793 reg_req => { in => [ "fp:a|4", "fp:a|4" ], out => [ "fp:a|4", "none" ] },
799 irn_flags => [ "rematerializable" ],
800 reg_req => { in => [ "fp" ], out => [ "fp" ] },
801 # note that we only need the first register even for wide-values
802 emit => '. fnegs %S0, %D0',
803 attr_type => "sparc_fp_attr_t",
804 attr => "ir_mode *fp_mode",
806 constructors => \%float_unop_constructors,
810 irn_flags => [ "rematerializable" ],
811 # note that we only need the first register even for wide-values
812 emit => '. fabs %S0, %D0',
813 attr_type => "sparc_fp_attr_t",
814 attr => "ir_mode *fp_mode",
816 constructors => \%float_unop_constructors,
820 irn_flags => [ "rematerializable" ],
821 emit => '. f%FCONVS%.to%FCONVD %S0, %D0',
822 attr_type => "sparc_fp_conv_attr_t",
823 attr => "ir_mode *src_mode, ir_mode *dest_mode",
826 reg_req => { in => [ "fp" ], out => [ "fp:a|2" ] },
830 reg_req => { in => [ "fp" ], out => [ "fp:a|2" ] },
834 reg_req => { in => [ "fp:a|2" ], out => [ "fp" ] },
838 reg_req => { in => [ "fp:a|2" ], out => [ "fp:a|4" ] },
842 reg_req => { in => [ "fp:a|4" ], out => [ "fp" ] },
846 reg_req => { in => [ "fp:a|4" ], out => [ "fp:a|2" ] },
853 irn_flags => [ "rematerializable" ],
854 emit => '. fito%FPM %S0, %D0',
855 attr_type => "sparc_fp_attr_t",
856 attr => "ir_mode *fp_mode",
859 reg_req => { in => [ "fp" ], out => [ "fp" ] },
863 reg_req => { in => [ "fp" ], out => [ "fp:a|2" ] },
867 reg_req => { in => [ "fp" ], out => [ "fp:a|4" ] },
874 irn_flags => [ "rematerializable" ],
875 emit => '. f%FPM%.toi %S0, %D0',
876 attr_type => "sparc_fp_attr_t",
877 attr => "ir_mode *fp_mode",
881 reg_req => { in => [ "fp" ], out => [ "fp" ] },
884 reg_req => { in => [ "fp:a|2" ], out => [ "fp" ] },
887 reg_req => { in => [ "fp:a|4" ], out => [ "fp" ] },
893 op_flags => [ "labeled" ],
894 state => "exc_pinned",
897 reg_req => { in => [ "gp", "none" ], out => [ "fp", "none" ] },
900 reg_req => { in => [ "gp", "none" ], out => [ "fp:a|2", "none" ] },
903 reg_req => { in => [ "gp", "none" ], out => [ "fp:a|4", "none" ] },
906 ins => [ "ptr", "mem" ],
907 outs => [ "res", "M" ],
908 attr_type => "sparc_load_store_attr_t",
909 attr => "ir_mode *ls_mode, ir_entity *entity, int32_t offset, bool is_frame_entity",
910 custominit => "init_sparc_load_store_attributes(res, ls_mode, entity, offset, is_frame_entity, false);",
911 emit => '. ld%FLSM [%S0%O1], %D0'
915 op_flags => [ "labeled" ],
916 state => "exc_pinned",
919 reg_req => { in => [ "fp", "gp", "none" ], out => [ "none" ] },
922 reg_req => { in => [ "fp:a|2", "gp", "none" ], out => [ "none" ] },
925 reg_req => { in => [ "fp:a|4", "gp", "none" ], out => [ "none" ] },
928 ins => [ "val", "ptr", "mem" ],
930 attr_type => "sparc_load_store_attr_t",
931 attr => "ir_mode *ls_mode, ir_entity *entity, int32_t offset, bool is_frame_entity",
932 custominit => "init_sparc_load_store_attributes(res, ls_mode, entity, offset, is_frame_entity, false);",
933 emit => '. st%FLSM %S0, [%S1%O2]',