1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
|
Info file gcc.info, produced by Makeinfo, -*- Text -*- from input
file gcc.texinfo.
This file documents the use and the internals of the GNU compiler.
Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.
Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided also
that the sections entitled "GNU General Public License" and "Protect
Your Freedom--Fight `Look And Feel'" are included exactly as in the
original, and provided that the entire resulting derived work is
distributed under the terms of a permission notice identical to this
one.
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that the sections entitled "GNU General Public
License" and "Protect Your Freedom--Fight `Look And Feel'" and this
permission notice may be included in translations approved by the
Free Software Foundation instead of in the original English.
File: gcc.info, Node: Addressing Modes, Next: Delayed Branch, Prev: Library Calls, Up: Machine Macros
Addressing Modes
================
`HAVE_POST_INCREMENT'
Define this macro if the machine supports post-increment
addressing.
`HAVE_PRE_INCREMENT'
`HAVE_POST_DECREMENT'
`HAVE_PRE_DECREMENT'
Similar for other kinds of addressing.
`CONSTANT_ADDRESS_P (X)'
A C expression that is 1 if the RTX X is a constant whose value
is an integer. This includes integers whose values are not
explicitly known, such as `symbol_ref' and `label_ref'
expressions and `const' arithmetic expressions.
On most machines, this can be defined as `CONSTANT_P (X)', but a
few machines are more restrictive in which constant addresses
are supported.
`MAX_REGS_PER_ADDRESS'
A number, the maximum number of registers that can appear in a
valid memory address. Note that it is up to you to specify a
value equal to the maximum number that
`go_if_legitimate_address' would ever accept.
`GO_IF_LEGITIMATE_ADDRESS (MODE, X, LABEL)'
A C compound statement with a conditional `goto LABEL;' executed
if X (an RTX) is a legitimate memory address on the target
machine for a memory operand of mode MODE.
It usually pays to define several simpler macros to serve as
subroutines for this one. Otherwise it may be too complicated
to understand.
This macro must exist in two variants: a strict variant and a
non-strict one. The strict variant is used in the reload pass.
It must be defined so that any pseudo-register that has not been
allocated a hard register is considered a memory reference. In
contexts where some kind of register is required, a
pseudo-register with no hard register must be rejected.
The non-strict variant is used in other passes. It must be
defined to accept all pseudo-registers in every context where
some kind of register is required.
Compiler source files that want to use the strict variant of
this macro define the macro `REG_OK_STRICT'. You should use an
`#ifdef REG_OK_STRICT' conditional to define the strict variant
in that case and the non-strict variant otherwise.
Typically among the subroutines used to define
`GO_IF_LEGITIMATE_ADDRESS' are subroutines to check for
acceptable registers for various purposes (one for base
registers, one for index registers, and so on). Then only these
subroutine macros need have two variants; the higher levels of
macros may be the same whether strict or not.
Normally, constant addresses which are the sum of a `symbol_ref'
and an integer are stored inside a `const' RTX to mark them as
constant. Therefore, there is no need to recognize such sums as
legitimate addresses.
Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle
constant sums that are not marked with `const'. It assumes
that a naked `plus' indicates indexing. If so, then you *must*
reject such naked constant sums as illegitimate addresses, so
that none of them will be given to `PRINT_OPERAND_ADDRESS'.
`REG_OK_FOR_BASE_P (X)'
A C expression that is nonzero if X (assumed to be a `reg' RTX)
is valid for use as a base register. For hard registers, it
should always accept those which the hardware permits and reject
the others. Whether the macro accepts or rejects pseudo
registers must be controlled by `REG_OK_STRICT' as described
above. This usually requires two variant definitions, of which
`REG_OK_STRICT' controls the one actually used.
`REG_OK_FOR_INDEX_P (X)'
A C expression that is nonzero if X (assumed to be a `reg' RTX)
is valid for use as an index register.
The difference between an index register and a base register is
that the index register may be scaled. If an address involves
the sum of two registers, neither one of them scaled, then
either one may be labeled the "base" and the other the "index";
but whichever labeling is used must fit the machine's
constraints of which registers may serve in each capacity. The
compiler will try both labelings, looking for one that is valid,
and will reload one or both registers only if neither labeling
works.
`LEGITIMIZE_ADDRESS (X, OLDX, MODE, WIN)'
A C compound statement that attempts to replace X with a valid
memory address for an operand of mode MODE. WIN will be a C
statement label elsewhere in the code; the macro definition may
use
GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN);
to avoid further processing if the address has become legitimate.
X will always be the result of a call to
`break_out_memory_refs', and OLDX will be the operand that was
given to that function to produce X.
The code generated by this macro should not alter the
substructure of X. If it transforms X into a more legitimate
form, it should assign X (which will always be a C variable) a
new value.
It is not necessary for this macro to come up with a legitimate
address. The compiler has standard ways of doing so in all
cases. In fact, it is safe for this macro to do nothing. But
often a machine-dependent strategy can generate better code.
`GO_IF_MODE_DEPENDENT_ADDRESS (ADDR, LABEL)'
A C statement or compound statement with a conditional `goto
LABEL;' executed if memory address X (an RTX) can have different
meanings depending on the machine mode of the memory reference
it is used for.
Autoincrement and autodecrement addresses typically have
mode-dependent effects because the amount of the increment or
decrement is the size of the operand being addressed. Some
machines have other mode-dependent addresses. Many RISC
machines have no mode-dependent addresses.
You may assume that ADDR is a valid address for the machine.
`LEGITIMATE_CONSTANT_P (X)'
A C expression that is nonzero if X is a legitimate constant for
an immediate operand on the target machine. You can assume that
either X is a `const_double' or it satisfies `CONSTANT_P', so
you need not check these things. In fact, `1' is a suitable
definition for this macro on machines where any `const_double'
is valid and anything `CONSTANT_P' is valid.
File: gcc.info, Node: Delayed Branch, Next: Condition Code, Prev: Addressing Modes, Up: Machine Macros
Parameters for Delayed Branch Optimization
==========================================
`HAVE_DELAYED_BRANCH'
Define this macro if the target machine has delayed branches,
that is, a branch does not take effect immediately, and the
actual branch instruction may be followed by one or more
instructions that will be issued before the PC is actually
changed.
If defined, this allows a special scheduling pass to be run
after the second jump optimization to attempt to reorder
instructions to exploit this. Defining this macro also requires
the definition of certain other macros described below.
`DBR_SLOTS_AFTER (INSN)'
This macro must be defined if `HAVE_DELAYED_BRANCH' is defined.
Its definition should be a C expression returning the number of
available delay slots following the instruction(s) output by the
pattern for INSN. The definition of "slot" is
machine-dependent, and may denote instructions, bytes, or
whatever.
`DBR_INSN_SLOTS (INSN)'
This macro must be defined if `HAVE_DELAYED_BRANCH' is defined.
It should be a C expression returning the number of slots
(typically the number of machine instructions) consumed by INSN.
You may assume that INSN is truly an insn, not a note, label,
barrier, dispatch table, `use', or `clobber'.
`DBR_INSN_ELIGIBLE_P (INSN, DINSN)'
A C expression whose value is non-zero if it is legitimate to
put INSN in the delay slot following DINSN.
You do not need to take account of data flow considerations in
the definition of this macro, because the delayed branch
optimizer always does that. This macro is needed only when
certain insns may not be placed in certain delay slots for
reasons not evident from the RTL expressions themselves. If
there are no such problems, you don't need to define this macro.
You may assume that INSN is truly an insn, not a note, label,
barrier, dispatch table, `use', or `clobber'. You may assume
that DINSN is a jump insn with a delay slot.
`DBR_OUTPUT_SEQEND(FILE)'
A C statement, to be executed after all slot-filler instructions
have been output. If necessary, call `dbr_sequence_length' to
determine the number of slots filled in a sequence (zero if not
currently outputting a sequence), to decide how many no-ops to
output, or whatever.
Don't define this macro if it has nothing to do, but it is
helpful in reading assembly output if the extent of the delay
sequence is made explicit (e.g. with white space).
Note that output routines for instructions with delay slots must
be prepared to deal with not being output as part of a sequence
(i.e. when the scheduling pass is not run, or when no slot
fillers could be found.) The variable `final_sequence' is null
when not processing a sequence, otherwise it contains the
`sequence' rtx being output.
File: gcc.info, Node: Condition Code, Next: Cross-compilation, Prev: Delayed Branch, Up: Machine Macros
Condition Code Information
==========================
The file `conditions.h' defines a variable `cc_status' to describe
how the condition code was computed (in case the interpretation of
the condition code depends on the instruction that it was set by).
This variable contains the RTL expressions on which the condition
code is currently based, and several standard flags.
Sometimes additional machine-specific flags must be defined in the
machine description header file. It can also add additional
machine-specific information by defining `CC_STATUS_MDEP'.
`CC_STATUS_MDEP'
C code for a data type which is used for declaring the `mdep'
component of `cc_status'. It defaults to `int'.
`CC_STATUS_MDEP_INIT'
A C expression to initialize the `mdep' field to "empty". The
default definition does nothing, since most machines don't use
the field anyway. If you want to use the field, you should
probably define this macro to initialize it.
`NOTICE_UPDATE_CC (EXP, INSN)'
A C compound statement to set the components of `cc_status'
appropriately for an insn INSN whose body is EXP. It is this
macro's responsibility to recognize insns that set the condition
code as a byproduct of other activity as well as those that
explicitly set `(cc0)'.
If there are insn that do not set the condition code but do
alter other machine registers, this macro must check to see
whether they invalidate the expressions that the condition code
is recorded as reflecting. For example, on the 68000, insns
that store in address registers do not set the condition code,
which means that usually `NOTICE_UPDATE_CC' can leave
`cc_status' unaltered for such insns. But suppose that the
previous insn set the condition code based on location
`a4@(102)' and the current insn stores a new value in `a4'.
Although the condition code is not changed by this, it will no
longer be true that it reflects the contents of `a4@(102)'.
Therefore, `NOTICE_UPDATE_CC' must alter `cc_status' in this
case to say that nothing is known about the condition code value.
The definition of `NOTICE_UPDATE_CC' must be prepared to deal
with the results of peephole optimization: insns whose patterns
are `parallel' RTXs containing various `reg', `mem' or constants
which are just the operands. The RTL structure of these insns
is not sufficient to indicate what the insns actually do. What
`NOTICE_UPDATE_CC' should do when it sees one is just to run
`CC_STATUS_INIT'.
File: gcc.info, Node: Cross-compilation, Next: Misc, Prev: Condition Code, Up: Machine Macros
Cross Compilation and Floating-Point Format
===========================================
While all modern machines use 2's complement representation for
integers, there are a variety of representations for floating point
numbers. This means that in a cross-compiler the representation of
floating point numbers in the compiled program may be different from
that used in the machine doing the compilation.
Because different representation systems may offer different
amounts of range and precision, the cross compiler cannot safely use
the host machine's floating point arithmetic. Therefore, floating
point constants must be represented in the target machine's format.
This means that the cross compiler cannot use `atof' to parse a
floating point constant; it must have its own special routine to use
instead. Also, constant folding must emulate the target machine's
arithmetic (or must not be done at all).
The macros in the following table should be defined only if you
are cross compiling between different floating point formats.
Otherwise, don't define them. Then default definitions will be set
up which use `double' as the data type, `==' to test for equality, etc.
You don't need to worry about how many times you use an operand of
any of these macros. The compiler never uses operands which have
side effects.
`REAL_VALUE_TYPE'
A macro for the C data type to be used to hold a floating point
value in the target machine's format. Typically this would be a
`struct' containing an array of `int'.
`REAL_VALUES_EQUAL (X, Y)'
A macro for a C expression which compares for equality the two
values, X and Y, both of type `REAL_VALUE_TYPE'.
`REAL_VALUES_LESS (X, Y)'
A macro for a C expression which tests whether X is less than Y,
both values being of type `REAL_VALUE_TYPE' and interpreted as
floating point numbers in the target machine's representation.
`REAL_VALUE_LDEXP (X, SCALE)'
A macro for a C expression which performs the standard library
function `ldexp', but using the target machine's floating point
representation. Both X and the value of the expression have
type `REAL_VALUE_TYPE'. The second argument, SCALE, is an
integer.
`REAL_VALUE_ATOF (STRING)'
A macro for a C expression which converts STRING, an expression
of type `char *', into a floating point number in the target
machine's representation. The value has type `REAL_VALUE_TYPE'.
Define the following additional macros if you want to make
floating point constant folding work while cross compiling. If you
don't define them, cross compilation is still possible, but constant
folding will not happen for floating point values.
`REAL_ARITHMETIC (OUTPUT, CODE, X, Y)'
A macro for a C statement which calculates an arithmetic
operation of the two floating point values X and Y, both of type
`REAL_VALUE_TYPE' in the target machine's representation, to
produce a result of the same type and representation which is
stored in OUTPUT (which will be a variable).
The operation to be performed is specified by CODE, a tree code
which will always be one of the following: `PLUS_EXPR',
`MINUS_EXPR', `MULT_EXPR', `RDIV_EXPR', `MAX_EXPR', `MIN_EXPR'.
The expansion of this macro is responsible for checking for
overflow. If overflow happens, the macro expansion should
execute the statement `return 0;', which indicates the inability
to perform the arithmetic operation requested.
`REAL_VALUE_NEGATE (X)'
A macro for a C expression which returns the negative of the
floating point value X. Both X and the value of the expression
have type `REAL_VALUE_TYPE' and are in the target machine's
floating point representation.
There is no way for this macro to report overflow, since
overflow can't happen in the negation operation.
`REAL_VALUE_TO_INT (LOW, HIGH, X)'
A macro for a C expression which converts a floating point value
X into a double-precision integer which is then stored into LOW
and HIGH, two variables of type INT.
`REAL_VALUE_FROM_INT (X, LOW, HIGH)'
A macro for a C expression which converts a double-precision
integer found in LOW and HIGH, two variables of type INT, into a
floating point value which is then stored into X.
File: gcc.info, Node: Misc, Next: Assembler Format, Prev: Cross-compilation, Up: Machine Macros
Miscellaneous Parameters
========================
`CASE_VECTOR_MODE'
An alias for a machine mode name. This is the machine mode that
elements of a jump-table should have.
`CASE_VECTOR_PC_RELATIVE'
Define this macro if jump-tables should contain relative
addresses.
`CASE_DROPS_THROUGH'
Define this if control falls through a `case' insn when the
index value is out of range. This means the specified
default-label is actually ignored by the `case' insn proper.
`IMPLICIT_FIX_EXPR'
An alias for a tree code that should be used by default for
conversion of floating point values to fixed point. Normally,
`FIX_ROUND_EXPR' is used.
`FIXUNS_TRUNC_LIKE_FIX_TRUNC'
Define this macro if the same instructions that convert a
floating point number to a signed fixed point number also
convert validly to an unsigned one.
`EASY_DIV_EXPR'
An alias for a tree code that is the easiest kind of division to
compile code for in the general case. It may be
`TRUNC_DIV_EXPR', `FLOOR_DIV_EXPR', `CEIL_DIV_EXPR' or
`ROUND_DIV_EXPR'. These four division operators differ in how
they round the result to an integer. `EASY_DIV_EXPR' is used
when it is permissible to use any of those kinds of division and
the choice should be made on the basis of efficiency.
`DEFAULT_SIGNED_CHAR'
An expression whose value is 1 or 0, according to whether the
type `char' should be signed or unsigned by default. The user
can always override this default with the options
`-fsigned-char' and `-funsigned-char'.
`SCCS_DIRECTIVE'
Define this if the preprocessor should ignore `#sccs' directives
and print no error message.
`HAVE_VPRINTF'
Define this if the library function `vprintf' is available on
your system.
`MOVE_MAX'
The maximum number of bytes that a single instruction can move
quickly from memory to memory.
`INT_TYPE_SIZE'
A C expression for the size in bits of the type `int' on the
target machine. If you don't define this, the default is one
word.
`SHORT_TYPE_SIZE'
A C expression for the size in bits of the type `short' on the
target machine. If you don't define this, the default is half a
word. (If this would be less than one storage unit, it is
rounded up to one unit.)
`LONG_TYPE_SIZE'
A C expression for the size in bits of the type `long' on the
target machine. If you don't define this, the default is one
word.
`LONG_LONG_TYPE_SIZE'
A C expression for the size in bits of the type `long long' on
the target machine. If you don't define this, the default is
two words.
`CHAR_TYPE_SIZE'
A C expression for the size in bits of the type `char' on the
target machine. If you don't define this, the default is one
quarter of a word. (If this would be less than one storage
unit, it is rounded up to one unit.)
`FLOAT_TYPE_SIZE'
A C expression for the size in bits of the type `float' on the
target machine. If you don't define this, the default is one
word.
`DOUBLE_TYPE_SIZE'
A C expression for the size in bits of the type `double' on the
target machine. If you don't define this, the default is two
words.
`LONG_DOUBLE_TYPE_SIZE'
A C expression for the size in bits of the type `long double' on
the target machine. If you don't define this, the default is
two words.
`SLOW_BYTE_ACCESS'
Define this macro as a C expression which is nonzero if
accessing less than a word of memory (i.e. a `char' or a
`short') is slow (requires more than one instruction).
`SLOW_ZERO_EXTEND'
Define this macro if zero-extension (of a `char' or `short' to
an `int') can be done faster if the destination is a register
that is known to be zero.
If you define this macro, you must have instruction patterns
that recognize RTL structures like this:
(set (strict-low-part (subreg:QI (reg:SI ...) 0)) ...)
and likewise for `HImode'.
`SHIFT_COUNT_TRUNCATED'
Define this macro if shift instructions ignore all but the
lowest few bits of the shift count. It implies that a
sign-extend or zero-extend instruction for the shift count can
be omitted.
`TRULY_NOOP_TRUNCATION (OUTPREC, INPREC)'
A C expression which is nonzero if on this machine it is safe to
"convert" an integer of INPREC bits to one of OUTPREC bits
(where OUTPREC is smaller than INPREC) by merely operating on it
as if it had only OUTPREC bits.
On many machines, this expression can be 1.
`NO_FUNCTION_CSE'
Define this macro if it is as good or better to call a constant
function address than to call an address kept in a register.
`PROMOTE_PROTOTYPES'
Define this macro if an argument declared as `char' or `short'
in a prototype should actually be passed as an `int'. In
addition to avoiding errors in certain cases of mismatch, it
also makes for better code on certain machines.
`STORE_FLAG_VALUE'
A C expression for the value stored by a store-flag instruction
(`sCOND') when the condition is true. This is usually 1 or -1;
it is required to be an odd number or a negative number.
Do not define `STORE_FLAG_VALUE' if the machine has no
store-flag instructions.
`Pmode'
An alias for the machine mode for pointers. Normally the
definition can be
#define Pmode SImode
`FUNCTION_MODE'
An alias for the machine mode used for memory references to
functions being called, in `call' RTL expressions. On most
machines this should be `QImode'.
`INSN_MACHINE_INFO'
This macro should expand into a C structure type to use for the
machine-dependent info field specified with the optional last
argument in `define_insn' and `define_peephole' patterns. For
example, it might expand into `struct machine_info'; then it
would be up to you to define this structure in the `tm.h' file.
You do not need to define this macro if you do not write the
optional last argument in any of the patterns in the machine
description.
`DEFAULT_MACHINE_INFO'
This macro should expand into a C initializer to use to
initialize the machine-dependent info for one insn pattern. It
is used for patterns that do not specify the machine-dependent
info.
If you do not define this macro, zero is used.
`CONST_COSTS (X, CODE)'
A part of a C `switch' statement that describes the relative
costs of constant RTL expressions. It must contain `case'
labels for expression codes `const_int', `const', `symbol_ref',
`label_ref' and `const_double'. Each case must ultimately reach
a `return' statement to return the relative cost of the use of
that kind of constant value in an expression. The cost may
depend on the precise value of the constant, which is available
for examination in X.
CODE is the expression code--redundant, since it can be obtained
with `GET_CODE (X)'.
`DOLLARS_IN_IDENTIFIERS'
Define this to be nonzero if the character `$' should be allowed
by default in identifier names.
File: gcc.info, Node: Assembler Format, Prev: Misc, Up: Machine Macros
Output of Assembler Code
========================
`ASM_SPEC'
A C string constant that tells the GNU CC driver program options
to pass to the assembler. It can also specify how to translate
options you give to GNU CC into options for GNU CC to pass to
the assembler. See the file `tm-sun3.h' for an example of this.
Do not define this macro if it does not need to do anything.
`LINK_SPEC'
A C string constant that tells the GNU CC driver program options
to pass to the linker. It can also specify how to translate
options you give to GNU CC into options for GNU CC to pass to
the linker.
Do not define this macro if it does not need to do anything.
`LIB_SPEC'
Another C string constant used much like `LINK_SPEC'. The
difference between the two is that `LIBS_SPEC' is used at the
end of the command given to the linker.
If this macro is not defined, a default is provided that loads
the standard C library from the usual place. See `gcc.c'.
`LIBG_SPEC'
Another C string constant used much like `LINK_SPEC'. This
controls whether to link `libg.a' when debugging. Some systems
expect this; others do not have any `libg.a'.
If this macro is not defined, a default is provided that loads
the `libg.a' provided `-g' is specified. See `gcc.c'.
`STARTFILE_SPEC'
Another C string constant used much like `LINK_SPEC'. The
difference between the two is that `STARTFILE_SPEC' is used at
the very beginning of the command given to the linker.
If this macro is not defined, a default is provided that loads
the standard C startup file from the usual place. See `gcc.c'.
`STANDARD_EXEC_PREFIX'
Define this macro as a C string constant if you wish to override
the standard choice of `/usr/local/lib/gcc-' as the default
prefix to try when searching for the executable files of the
compiler.
The prefix specified by the `-B' option, if any, is tried before
the default prefix. After the default prefix, if the executable
is not found that way, `/usr/lib/gcc-' is tried next; then the
directories in your search path for shell commands are searched.
`STANDARD_STARTFILE_PREFIX'
Define this macro as a C string constant if you wish to override
the standard choice of `/usr/local/lib/' as the default prefix
to try when searching for startup files such as `crt0.o'.
In this search, all the prefixes tried for executable files are
tried first. Then comes the default startfile prefix specified
by this macro, followed by the prefixes `/lib/' and `/usr/lib/'
as last resorts.
`ASM_FILE_START (STREAM)'
A C expression which outputs to the stdio stream STREAM some
appropriate text to go at the start of an assembler file.
Normally this macro is defined to output a line containing
`#NO_APP', which is a comment that has no effect on most
assemblers but tells the GNU assembler that it can save time by
not checking for certain assembler constructs.
On systems that use SDB, it is necessary to output certain
commands; see `tm-attasm.h'.
`ASM_FILE_END (STREAM)'
A C expression which outputs to the stdio stream STREAM some
appropriate text to go at the end of an assembler file.
If this macro is not defined, the default is to output nothing
special at the end of the file. Most systems don't require any
definition.
On systems that use SDB, it is necessary to output certain
commands; see `tm-attasm.h'.
`ASM_IDENTIFY_GCC (FILE)'
A C statement to output assembler commands which will identify
the object file as having been compiled with GNU CC (or another
GNU compiler).
If you don't define this macro, the string `gcc_compiled.:' is
output. This string is calculated to define a symbol which, on
BSD systems, will never be defined for any other reason. GDB
checks for the presence of this symbol when reading the symbol
table of an executable.
On non-BSD systems, you must arrange communication with GDB in
some other fashion. If GDB is not used on your system, you can
define this macro with an empty body.
`ASM_APP_ON'
A C string constant for text to be output before each `asm'
statement or group of consecutive ones. Normally this is
`"#APP"', which is a comment that has no effect on most
assemblers but tells the GNU assembler that it must check the
lines that follow for all valid assembler constructs.
`ASM_APP_OFF'
A C string constant for text to be output after each `asm'
statement or group of consecutive ones. Normally this is
`"#NO_APP"', which tells the GNU assembler to resume making the
time-saving assumptions that are valid for ordinary compiler
output.
`TEXT_SECTION_ASM_OP'
A C string constant for the assembler operation that should
precede instructions and read-only data. Normally `".text"' is
right.
`DATA_SECTION_ASM_OP'
A C string constant for the assembler operation to identify the
following data as writable initialized data. Normally `".data"'
is right.
`EXTRA_SECTIONS'
A list of names for sections other than the standard two, which
are `in_text' and `in_data'. You need not define this macro on
a system with no other sections (that GCC needs to use).
`EXTRA_SECTION_FUNCTIONS'
One or more functions to be defined in `varasm.c'. These
functions should do jobs analogous to those of `text_section'
and `data_section', for your additional sections. Do not define
this macro if you do not define `EXTRA_SECTIONS'.
`SELECT_SECTION (EXP)'
A C statement or statements to switch to the appropriate section
for output of EXP. You can assume that EXP is either a
`VAR_DECL' node or a constant of some sort. Select the section
by calling `text_section' or one of the alternatives for other
sections.
Do not define this macro if you use only the standard two
sections and put all read-only variables and constants in the
text section.
`SELECT_RTX_SECTION (MODE, RTX)'
A C statement or statements to switch to the appropriate section
for output of RTX in mode MODE. You can assume that RTX is some
kind of constant in RTL. The argument MODE is redundant except
in the case of a `const_int' rtx. Select the section by calling
`text_section' or one of the alternatives for other sections.
Do not define this macro if you use only the standard two
sections and put all constants in the text section.
`REGISTER_NAMES'
A C initializer containing the assembler's names for the machine
registers, each one as a C string constant. This is what
translates register numbers in the compiler into assembler
language.
`DBX_REGISTER_NUMBER (REGNO)'
A C expression that returns the DBX register number for the
compiler register number REGNO. In simple cases, the value of
this expression may be REGNO itself. But sometimes there are
some registers that the compiler knows about and DBX does not,
or vice versa. In such cases, some register may need to have
one number in the compiler and another for DBX.
`DBX_DEBUGGING_INFO'
Define this macro if GNU CC should produce debugging output for
DBX in response to the `-g' option.
`SDB_DEBUGGING_INFO'
Define this macro if GNU CC should produce debugging output for
SDB in response to the `-g' option.
`PUT_SDB_OP'
Define these macros to override the assembler syntax for the
special SDB assembler directives. See `sdbout.c' for a list of
these macros and their arguments. If the standard syntax is
used, you need not define them yourself.
`SDB_GENERATE_FAKE'
Define this macro to override the usual method of constructing a
dummy name for anonymous structure and union types. See
`sdbout.c' for more information.
`DBX_NO_XREFS'
Define this macro if DBX on your system does not support the
construct `xsTAGNAME'. On some systems, this construct is used
to describe a forward reference to a structure named TAGNAME.
On other systems, this construct is not supported at all.
`DBX_CONTIN_LENGTH'
A symbol name in DBX-format debugging information is normally
continued (split into two separate `.stabs' directives) when it
exceeds a certain length (by default, 80 characters). On some
operating systems, DBX requires this splitting; on others,
splitting must not be done. You can inhibit splitting by
defining this macro with the value zero. You can override the
default splitting-length by defining this macro as an expression
for the length you desire.
`DBX_CONTIN_CHAR'
Normally continuation is indicated by adding a `\' character to
the end of a `.stabs' string when a continuation follows. To
use a different character instead, define this macro as a
character constant for the character you want to use. Do not
define this macro if backslash is correct for your system.
`DBX_STATIC_STAB_DATA_SECTION'
Define this macro if it is necessary to go to the data section
before outputting the `.stabs' pseudo-op for a non-global static
variable.
`ASM_OUTPUT_LABEL (STREAM, NAME)'
A C statement (sans semicolon) to output to the stdio stream
STREAM the assembler definition of a label named NAME. Use the
expression `assemble_name (STREAM, NAME)' to output the name
itself; before and after that, output the additional assembler
syntax for defining the name, and a newline.
`ASM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL)'
A C statement (sans semicolon) to output to the stdio stream
STREAM any text necessary for declaring the name NAME of a
function which is being defined. This macro is responsible for
outputting the label definition (perhaps using
`ASM_OUTPUT_LABEL'). The argument DECL is the `FUNCTION_DECL'
tree node representing the function.
If this macro is not defined, then the function name is defined
in the usual manner as a label (by means of `ASM_OUTPUT_LABEL').
`ASM_GLOBALIZE_LABEL (STREAM, NAME)'
A C statement (sans semicolon) to output to the stdio stream
STREAM some commands that will make the label NAME global; that
is, available for reference from other files. Use the
expression `assemble_name (STREAM, NAME)' to output the name
itself; before and after that, output the additional assembler
syntax for making that name global, and a newline.
`ASM_OUTPUT_EXTERNAL (STREAM, DECL, NAME)'
A C statement (sans semicolon) to output to the stdio stream
STREAM any text necessary for declaring the name of an external
symbol named NAME which is referenced in this compilation but
not defined. The value of DECL is the tree node for the
declaration.
This macro need not be defined if it does not need to output
anything. The GNU assembler and most Unix assemblers don't
require anything.
`ASM_OUTPUT_LABELREF (STREAM, NAME)'
A C statement to output to the stdio stream STREAM a reference
in assembler syntax to a label named NAME. The character `_'
should be added to the front of the name, if that is customary
on your operating system, as it is in most Berkeley Unix
systems. This macro is used in `assemble_name'.
`ASM_GENERATE_INTERNAL_LABEL (STRING, PREFIX, NUM)'
A C statement to store into the string STRING a label whose name
is made from the string PREFIX and the number NUM.
This string, when output subsequently by `ASM_OUTPUT_LABELREF',
should produce the same output that `ASM_OUTPUT_INTERNAL_LABEL'
would produce with the same PREFIX and NUM.
`ASM_OUTPUT_INTERNAL_LABEL (STREAM, PREFIX, NUM)'
A C statement to output to the stdio stream STREAM a label whose
name is made from the string PREFIX and the number NUM. These
labels are used for internal purposes, and there is no reason
for them to appear in the symbol table of the object file. On
many systems, the letter `L' at the beginning of a label has
this effect. The usual definition of this macro is as follows:
fprintf (STREAM, "L%s%d:\n", PREFIX, NUM)
`ASM_OUTPUT_CASE_LABEL (STREAM, PREFIX, NUM, TABLE)'
Define this if the label before a jump-table needs to be output
specially. The first three arguments are the same as for
`ASM_OUTPUT_INTERNAL_LABEL'; the fourth argument is the
jump-table which follows (a `jump_insn' containing an `addr_vec'
or `addr_diff_vec').
This feature is used on system V to output a `swbeg' statement
for the table.
If this macro is not defined, these labels are output with
`ASM_OUTPUT_INTERNAL_LABEL'.
`ASM_OUTPUT_CASE_END (STREAM, NUM, TABLE)'
Define this if something special must be output at the end of a
jump-table. The definition should be a C statement to be
executed after the assembler code for the table is written. It
should write the appropriate code to stdio stream STREAM. The
argument TABLE is the jump-table insn, and NUM is the
label-number of the preceding label.
If this macro is not defined, nothing special is output at the
end of the jump-table.
`ASM_OUTPUT_ALIGN_CODE (FILE)'
A C expression to output text to align the location counter in
the way that is desirable at a point in the code that is reached
only by jumping.
This macro need not be defined if you don't want any special
alignment to be done at such a time. Most machine descriptions
do not currently define the macro.
`ASM_FORMAT_PRIVATE_NAME (OUTVAR, NAME, NUMBER)'
A C expression to assign to OUTVAR (which is a variable of type
`char *') a newly allocated string made from the string NAME and
the number NUMBER, with some suitable punctuation added. Use
`alloca' to get space for the string.
This string will be used as the argument to
`ASM_OUTPUT_LABELREF' to produce an assembler label for an
internal static variable whose name is NAME. Therefore, the
string must be such as to result in valid assembler code. The
argument NUMBER is different each time this macro is executed;
it prevents conflicts between similarly-named internal static
variables in different scopes.
Ideally this string should not be a valid C identifier, to
prevent any conflict with the user's own symbols. Most
assemblers allow periods or percent signs in assembler symbols;
putting at least one of these between the name and the number
will suffice.
`ASM_OUTPUT_REG_PUSH (STREAM, REGNO)'
A C expression to output to STREAM some assembler code which
will push hard register number REGNO onto the stack. The code
need not be optimal, since this macro is used only when profiling.
`ASM_OUTPUT_REG_POP (STREAM, REGNO)'
A C expression to output to STREAM some assembler code which
will pop hard register number REGNO off of the stack. The code
need not be optimal, since this macro is used only when profiling.
`ASM_OUTPUT_ADDR_DIFF_ELT (STREAM, VALUE, REL)'
This macro should be provided on machines where the addresses in
a dispatch table are relative to the table's own address.
The definition should be a C statement to output to the stdio
stream STREAM an assembler pseudo-instruction to generate a
difference between two labels. VALUE and REL are the numbers of
two internal labels. The definitions of these labels are output
using `ASM_OUTPUT_INTERNAL_LABEL', and they must be printed in
the same way here. For example,
fprintf (STREAM, "\t.word L%d-L%d\n",
VALUE, REL)
`ASM_OUTPUT_ADDR_VEC_ELT (STREAM, VALUE)'
This macro should be provided on machines where the addresses in
a dispatch table are absolute.
The definition should be a C statement to output to the stdio
stream STREAM an assembler pseudo-instruction to generate a
reference to a label. VALUE is the number of an internal label
whose definition is output using `ASM_OUTPUT_INTERNAL_LABEL'.
For example,
fprintf (STREAM, "\t.word L%d\n", VALUE)
`ASM_OUTPUT_DOUBLE (STREAM, VALUE)'
A C statement to output to the stdio stream STREAM an assembler
instruction to assemble a `double' constant whose value is
VALUE. VALUE will be a C expression of type `double'.
`ASM_OUTPUT_FLOAT (STREAM, VALUE)'
A C statement to output to the stdio stream STREAM an assembler
instruction to assemble a `float' constant whose value is VALUE.
vALUE will be a C expression of type `float'.
`ASM_OUTPUT_INT (STREAM, EXP)'
`ASM_OUTPUT_SHORT (STREAM, EXP)'
`ASM_OUTPUT_CHAR (STREAM, EXP)'
A C statement to output to the stdio stream STREAM an assembler
instruction to assemble a `int', `short' or `char' constant
whose value is VALUE. The argument EXP will be an RTL
expression which represents a constant value. Use
`output_addr_const (STREAM, EXP)' to output this value as an
assembler expression.
`ASM_OUTPUT_DOUBLE_INT (STREAM, EXP)'
A C statement to output to the stdio stream STREAM an assembler
instruction to assemble a `long long' constant whose value is
EXP. The argument EXP will be an RTL expression which
represents a constant value. It may be a `const_double' RTX, or
it may be an ordinary single-precision constant. In the latter
case, you should zero-extend it.
`ASM_OUTPUT_BYTE (STREAM, VALUE)'
A C statement to output to the stdio stream STREAM an assembler
instruction to assemble a single byte containing the number VALUE.
`ASM_OUTPUT_ASCII (STREAM, PTR, LEN)'
A C statement to output to the stdio stream STREAM an assembler
instruction to assemble a string constant containing the LEN
bytes at PTR. PTR will be a C expression of type `char *' and
LEN a C expression of type `int'.
If the assembler has a `.ascii' pseudo-op as found in the
Berkeley Unix assembler, do not define the macro
`ASM_OUTPUT_ASCII'.
`ASM_OUTPUT_SKIP (STREAM, NBYTES)'
A C statement to output to the stdio stream STREAM an assembler
instruction to advance the location counter by NBYTES bytes.
NBYTES will be a C expression of type `int'.
`ASM_OUTPUT_ALIGN (STREAM, POWER)'
A C statement to output to the stdio stream STREAM an assembler
instruction to advance the location counter to a multiple of 2
to the POWER bytes. POWER will be a C expression of type `int'.
`ASM_OUTPUT_COMMON (STREAM, NAME, SIZE, ROUNDED)'
A C statement (sans semicolon) to output to the stdio stream
STREAM the assembler definition of a common-label named NAME
whose size is SIZE bytes. The variable ROUNDED is the size
rounded up to whatever alignment the caller wants.
Use the expression `assemble_name (STREAM, NAME)' to output the
name itself; before and after that, output the additional
assembler syntax for defining the name, and a newline.
This macro controls how the assembler definitions of
uninitialized global variables are output.
`ASM_OUTPUT_LOCAL (STREAM, NAME, SIZE, ROUNDED)'
A C statement (sans semicolon) to output to the stdio stream
STREAM the assembler definition of a local-common-label named
NAME whose size is SIZE bytes. The variable ROUNDED is the size
rounded up to whatever alignment the caller wants.
Use the expression `assemble_name (STREAM, NAME)' to output the
name itself; before and after that, output the additional
assembler syntax for defining the name, and a newline.
This macro controls how the assembler definitions of
uninitialized static variables are output.
`ASM_OUTPUT_SOURCE_FILENAME (STREAM, NAME)'
A C statment to output DBX or SDB debugging information which
indicates that filename NAME is the current source file to the
stdio stream STREAM.
This macro need not be defined if the standard form of debugging
information for the debugger in use is appropriate.
`ASM_OUTPUT_SOURCE_LINE (STREAM, LINE)'
A C statment to output DBX or SDB debugging information before
code for line number LINE of the current source file to the
stdio stream STREAM.
This macro need not be defined if the standard form of debugging
information for the debugger in use is appropriate.
`ASM_OUTPUT_IDENT (STREAM, STRING)'
A C statement to output something to the assembler file to
handle a `#ident' directive containing the text STRING. If this
macro is not defined, nothing is output for a `#ident' directive.
`TARGET_BELL'
A C constant expression for the integer value for escape
sequence `\a'.
`TARGET_BS'
`TARGET_TAB'
`TARGET_NEWLINE'
C constant expressions for the integer values for escape
sequences `\b', `\t' and `\n'.
`TARGET_VT'
`TARGET_FF'
`TARGET_CR'
C constant expressions for the integer values for escape
sequences `\v', `\f' and `\r'.
`ASM_OUTPUT_OPCODE (STREAM, PTR)'
Define this macro if you are using an unusual assembler that
requires different names for the machine instructions.
The definition is a C statement or statements which output an
assembler instruction opcode to the stdio stream STREAM. The
macro-operand PTR is a variable of type `char *' which points to
the opcode name in its "internal" form--the form that is written
in the machine description. The definition should output the
opcode name to STREAM, performing any translation you desire,
and increment the variable PTR to point at the end of the opcode
so that it will not be output twice.
In fact, your macro definition may process less than the entire
opcode name, or more than the opcode name; but if you want to
process text that includes `%'-sequences to substitute operands,
you must take care of the substitution yourself. Just be sure
to increment PTR over whatever text should not be output normally.
If you need to look at the operand values, they can be found as
the elements of `recog_operand'.
If the macro definition does nothing, the instruction is output
in the usual way.
`FINAL_PRESCAN_INSN (INSN, OPVEC, NOPERANDS)'
If defined, a C statement to be executed just prior to the
output of assembler code for INSN, to modify the extracted
operands so they will be output differently.
Here the argument OPVEC is the vector containing the operands
extracted from INSN, and NOPERANDS is the number of elements of
the vector which contain meaningful data for this insn. The
contents of this vector are what will be used to convert the
insn template into assembler code, so you can change the
assembler output by changing the contents of the vector.
This macro is useful when various assembler syntaxes share a
single file of instruction patterns; by defining this macro
differently, you can cause a large class of instructions to be
output differently (such as with rearranged operands).
Naturally, variations in assembler syntax affecting individual
insn patterns ought to be handled by writing conditional output
routines in those patterns.
If this macro is not defined, it is equivalent to a null
statement.
`PRINT_OPERAND (STREAM, X, CODE)'
A C compound statement to output to stdio stream STREAM the
assembler syntax for an instruction operand X. X is an RTL
expression.
CODE is a value that can be used to specify one of several ways
of printing the operand. It is used when identical operands
must be printed differently depending on the context. CODE
comes from the `%' specification that was used to request
printing of the operand. If the specification was just `%DIGIT'
then CODE is 0; if the specification was `%LTR DIGIT' then CODE
is the ASCII code for LTR.
If X is a register, this macro should print the register's name.
The names can be found in an array `reg_names' whose type is
`char *[]'. `reg_names' is initialized from `REGISTER_NAMES'.
When the machine description has a specification `%PUNCT' (a `%'
followed by a punctuation character), this macro is called with
a null pointer for X and the punctuation character for CODE.
`PRINT_OPERAND_PUNCT_VALID_P (CODE)'
A C expression which evaluates to true if CODE is a valid
punctuation character for use in the `PRINT_OPERAND' macro. If
`PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no
punctuation characters (except for the standard one, `%') are
used in this way.
`PRINT_OPERAND_ADDRESS (STREAM, X)'
A C compound statement to output to stdio stream STREAM the
assembler syntax for an instruction operand that is a memory
reference whose address is X. X is an RTL expression.
`ASM_OPEN_PAREN'
`ASM_CLOSE_PAREN'
These macros are defined as C string constant, describing the
syntax in the assembler for grouping arithmetic expressions.
The following definitions are correct for most assemblers:
#define ASM_OPEN_PAREN "("
#define ASM_CLOSE_PAREN ")"
|