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
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043
8044
8045
8046
8047
8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122
8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173
8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258
8259
8260
8261
8262
8263
8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276
8277
8278
8279
8280
8281
8282
8283
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363
8364
8365
8366
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
8383
8384
8385
8386
8387
8388
8389
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402
8403
8404
8405
8406
8407
8408
8409
8410
8411
8412
8413
8414
8415
8416
8417
8418
8419
8420
8421
8422
8423
8424
8425
8426
8427
8428
8429
8430
8431
8432
8433
8434
8435
8436
8437
8438
8439
8440
8441
8442
8443
8444
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
8501
8502
8503
8504
8505
8506
8507
8508
8509
8510
8511
8512
8513
8514
8515
8516
8517
8518
8519
8520
8521
8522
8523
8524
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
8733
8734
8735
8736
8737
8738
8739
8740
8741
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
8778
8779
8780
8781
8782
8783
8784
8785
8786
8787
8788
8789
8790
8791
8792
8793
8794
8795
8796
8797
8798
8799
8800
8801
8802
8803
8804
8805
8806
8807
8808
8809
8810
8811
8812
8813
8814
8815
8816
8817
8818
8819
8820
8821
8822
8823
8824
8825
8826
8827
8828
8829
8830
8831
8832
8833
8834
8835
8836
8837
8838
8839
8840
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622
9623
9624
9625
9626
9627
9628
9629
9630
9631
9632
9633
9634
9635
9636
9637
9638
9639
9640
9641
9642
9643
9644
9645
9646
9647
9648
9649
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
9759
9760
9761
9762
9763
9764
9765
9766
9767
9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797
9798
9799
9800
9801
9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813
9814
9815
9816
9817
9818
9819
9820
9821
9822
9823
9824
9825
9826
9827
9828
9829
9830
9831
9832
9833
9834
9835
9836
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857
9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897
9898
9899
9900
9901
9902
9903
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933
9934
9935
9936
9937
9938
9939
9940
9941
9942
9943
9944
9945
9946
9947
9948
9949
9950
9951
9952
9953
9954
9955
9956
9957
9958
9959
9960
9961
9962
9963
9964
9965
9966
9967
9968
9969
9970
9971
9972
9973
9974
9975
9976
9977
9978
9979
9980
9981
9982
9983
9984
9985
9986
9987
9988
9989
9990
9991
9992
9993
9994
9995
9996
9997
9998
9999
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010
10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
10025
10026
10027
10028
10029
10030
10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069
10070
10071
10072
10073
10074
10075
10076
10077
10078
10079
10080
10081
10082
10083
10084
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10106
10107
10108
10109
10110
10111
10112
10113
10114
10115
10116
10117
10118
10119
10120
10121
10122
10123
10124
10125
10126
10127
10128
10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153
10154
10155
10156
10157
10158
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184
10185
10186
10187
10188
10189
10190
10191
10192
10193
10194
10195
10196
10197
10198
10199
10200
10201
10202
10203
10204
10205
10206
10207
10208
10209
10210
10211
10212
10213
10214
10215
10216
10217
10218
10219
10220
10221
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
10232
10233
10234
10235
10236
10237
10238
10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272
10273
10274
10275
10276
10277
10278
10279
10280
10281
10282
10283
10284
10285
10286
10287
10288
10289
10290
10291
10292
10293
10294
10295
10296
10297
10298
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10324
10325
10326
10327
10328
10329
10330
10331
10332
10333
10334
10335
10336
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377
10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390
10391
10392
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426
10427
10428
10429
10430
10431
10432
10433
10434
10435
10436
10437
10438
10439
10440
10441
10442
10443
10444
10445
10446
10447
10448
10449
10450
10451
10452
10453
10454
10455
10456
10457
10458
10459
10460
10461
10462
10463
10464
10465
10466
10467
10468
10469
10470
10471
10472
10473
10474
10475
10476
10477
10478
10479
10480
10481
10482
10483
10484
10485
10486
10487
10488
10489
10490
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539
10540
10541
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10557
10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587
10588
10589
10590
10591
10592
10593
10594
10595
10596
10597
10598
10599
10600
10601
10602
10603
10604
10605
10606
10607
10608
10609
10610
10611
10612
10613
10614
10615
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625
10626
10627
10628
10629
10630
10631
10632
10633
10634
10635
10636
10637
10638
10639
10640
10641
10642
10643
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
10659
10660
10661
10662
10663
10664
10665
10666
10667
10668
10669
10670
10671
10672
10673
10674
10675
10676
10677
10678
10679
10680
10681
10682
10683
10684
10685
10686
10687
10688
10689
10690
10691
10692
10693
10694
10695
10696
10697
10698
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
10732
10733
10734
10735
10736
10737
10738
10739
10740
10741
10742
10743
10744
10745
10746
10747
10748
10749
10750
10751
10752
10753
10754
10755
10756
10757
10758
10759
10760
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772
10773
10774
10775
10776
10777
10778
10779
10780
10781
10782
10783
10784
10785
10786
10787
10788
10789
10790
10791
10792
10793
10794
10795
10796
10797
10798
10799
10800
10801
10802
10803
10804
10805
10806
10807
10808
10809
10810
10811
10812
10813
10814
10815
10816
10817
10818
10819
10820
10821
10822
10823
10824
10825
10826
10827
10828
10829
10830
10831
10832
10833
10834
10835
10836
10837
10838
10839
10840
10841
10842
10843
10844
10845
10846
10847
10848
10849
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862
10863
10864
10865
10866
10867
10868
10869
10870
10871
10872
10873
10874
10875
10876
10877
10878
10879
10880
10881
10882
10883
10884
10885
10886
10887
10888
10889
10890
10891
10892
10893
10894
10895
10896
10897
10898
10899
10900
10901
10902
10903
10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
10919
10920
10921
10922
10923
10924
10925
10926
10927
10928
10929
10930
10931
10932
10933
10934
10935
10936
10937
10938
10939
10940
10941
10942
10943
10944
10945
10946
10947
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957
10958
10959
10960
10961
10962
10963
10964
10965
10966
10967
10968
10969
10970
10971
10972
10973
10974
10975
10976
10977
10978
10979
10980
10981
10982
10983
10984
10985
10986
10987
10988
10989
10990
10991
10992
10993
10994
10995
10996
10997
10998
10999
11000
11001
11002
11003
11004
11005
11006
11007
11008
11009
11010
11011
11012
11013
11014
11015
11016
11017
11018
11019
11020
11021
11022
11023
11024
11025
11026
11027
11028
11029
11030
11031
11032
11033
11034
11035
11036
11037
11038
11039
11040
11041
11042
11043
11044
11045
11046
11047
11048
11049
11050
11051
11052
11053
11054
11055
11056
11057
11058
11059
11060
11061
11062
11063
11064
11065
11066
11067
11068
11069
11070
11071
11072
11073
11074
11075
11076
11077
11078
11079
11080
11081
11082
11083
11084
11085
11086
11087
11088
11089
11090
11091
11092
11093
11094
11095
11096
11097
11098
11099
11100
11101
11102
11103
11104
11105
11106
11107
11108
11109
11110
11111
11112
11113
11114
11115
11116
11117
11118
11119
11120
11121
11122
11123
11124
11125
11126
11127
11128
11129
11130
11131
11132
11133
11134
11135
11136
11137
11138
11139
11140
11141
11142
11143
11144
11145
11146
11147
11148
11149
11150
11151
11152
11153
11154
11155
11156
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171
11172
11173
11174
11175
11176
11177
11178
11179
11180
11181
11182
11183
11184
11185
11186
11187
11188
11189
11190
11191
11192
11193
11194
11195
11196
11197
11198
11199
11200
11201
11202
11203
11204
11205
11206
11207
11208
11209
11210
11211
11212
11213
11214
11215
11216
11217
11218
11219
11220
11221
11222
11223
11224
11225
11226
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271
11272
11273
11274
11275
11276
11277
11278
11279
11280
11281
11282
11283
11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
11294
11295
11296
11297
11298
11299
11300
11301
11302
11303
11304
11305
11306
11307
11308
11309
11310
11311
11312
11313
11314
11315
11316
11317
11318
11319
11320
11321
11322
11323
11324
11325
11326
11327
11328
11329
11330
11331
11332
11333
11334
11335
11336
11337
11338
11339
11340
11341
11342
11343
11344
11345
11346
11347
11348
11349
11350
11351
11352
11353
11354
11355
11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377
11378
11379
11380
11381
11382
11383
11384
11385
11386
11387
11388
11389
11390
11391
11392
11393
11394
11395
11396
11397
11398
11399
11400
11401
11402
11403
11404
11405
11406
11407
11408
11409
11410
11411
11412
11413
11414
11415
11416
11417
11418
11419
11420
11421
11422
11423
11424
11425
11426
11427
11428
11429
11430
11431
11432
11433
11434
11435
11436
11437
11438
11439
11440
11441
11442
11443
11444
11445
11446
11447
11448
11449
11450
11451
11452
11453
11454
11455
11456
11457
11458
11459
11460
11461
11462
11463
11464
11465
11466
11467
11468
11469
11470
11471
11472
11473
11474
11475
11476
11477
11478
11479
11480
11481
11482
11483
11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
11499
11500
11501
11502
11503
11504
11505
11506
11507
11508
11509
11510
11511
11512
11513
11514
11515
11516
11517
11518
11519
11520
11521
11522
11523
11524
11525
11526
11527
11528
11529
11530
11531
11532
11533
11534
11535
11536
11537
11538
11539
11540
11541
11542
11543
11544
11545
11546
11547
11548
11549
11550
11551
11552
11553
11554
11555
11556
11557
11558
11559
11560
11561
11562
11563
11564
11565
11566
11567
11568
11569
11570
11571
11572
11573
11574
11575
11576
11577
11578
11579
11580
11581
11582
11583
11584
11585
11586
11587
11588
11589
11590
11591
11592
11593
11594
11595
11596
11597
11598
11599
11600
11601
11602
11603
11604
11605
11606
11607
11608
11609
11610
11611
11612
11613
11614
11615
11616
11617
11618
11619
11620
11621
11622
11623
11624
11625
11626
11627
11628
11629
11630
11631
11632
11633
11634
11635
11636
11637
11638
11639
11640
11641
11642
11643
11644
11645
11646
11647
11648
11649
11650
11651
11652
11653
11654
11655
11656
11657
11658
11659
11660
11661
11662
11663
11664
11665
11666
11667
11668
11669
11670
11671
11672
11673
11674
11675
11676
11677
11678
11679
11680
11681
11682
11683
11684
11685
11686
11687
11688
11689
11690
11691
11692
11693
11694
11695
11696
11697
11698
11699
11700
11701
11702
11703
11704
11705
11706
11707
11708
11709
11710
11711
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11726
11727
11728
11729
11730
11731
11732
11733
11734
11735
11736
11737
11738
11739
11740
11741
11742
11743
11744
11745
11746
11747
11748
11749
11750
11751
11752
11753
11754
11755
11756
11757
11758
11759
11760
11761
11762
11763
11764
11765
11766
11767
11768
11769
11770
11771
11772
11773
11774
11775
11776
11777
11778
11779
11780
11781
11782
11783
11784
11785
11786
11787
11788
11789
11790
11791
11792
11793
11794
11795
11796
11797
11798
11799
11800
11801
11802
11803
11804
11805
11806
11807
11808
11809
11810
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821
11822
11823
11824
11825
11826
11827
11828
11829
11830
11831
11832
11833
11834
11835
11836
11837
11838
11839
11840
11841
11842
11843
11844
11845
11846
11847
11848
11849
11850
11851
11852
11853
11854
11855
11856
11857
11858
11859
11860
11861
11862
11863
11864
11865
11866
11867
11868
11869
11870
11871
11872
11873
11874
11875
11876
11877
11878
11879
11880
11881
11882
11883
11884
11885
11886
11887
11888
11889
11890
11891
11892
11893
11894
11895
11896
11897
11898
11899
11900
11901
11902
11903
11904
11905
11906
11907
11908
11909
11910
11911
11912
11913
11914
11915
11916
11917
11918
11919
11920
11921
11922
11923
11924
11925
11926
11927
11928
11929
11930
11931
11932
11933
11934
11935
11936
11937
11938
11939
11940
11941
11942
11943
11944
11945
11946
11947
11948
11949
11950
11951
11952
11953
11954
11955
11956
11957
11958
11959
11960
11961
11962
11963
11964
11965
11966
11967
11968
11969
11970
11971
11972
11973
11974
11975
11976
11977
11978
11979
11980
11981
11982
11983
11984
11985
11986
11987
11988
11989
11990
11991
11992
11993
11994
11995
11996
11997
11998
11999
12000
12001
12002
12003
12004
12005
12006
12007
12008
12009
12010
12011
12012
12013
12014
12015
12016
12017
12018
12019
12020
12021
12022
12023
12024
12025
12026
12027
12028
12029
12030
12031
12032
12033
12034
12035
12036
12037
12038
12039
12040
12041
12042
12043
12044
12045
12046
12047
12048
12049
12050
12051
12052
12053
12054
12055
12056
12057
12058
12059
12060
12061
12062
12063
12064
12065
12066
12067
12068
12069
12070
12071
12072
12073
12074
12075
12076
12077
12078
12079
12080
12081
12082
12083
12084
12085
12086
12087
12088
12089
12090
12091
12092
12093
12094
12095
12096
12097
12098
12099
12100
12101
12102
12103
12104
12105
12106
12107
12108
12109
12110
12111
12112
12113
12114
12115
12116
12117
12118
12119
12120
12121
12122
12123
12124
12125
12126
12127
12128
12129
12130
12131
12132
12133
12134
12135
12136
12137
12138
12139
12140
12141
12142
12143
12144
12145
12146
12147
12148
12149
12150
12151
12152
12153
12154
12155
12156
12157
12158
12159
12160
12161
12162
12163
12164
12165
12166
12167
12168
12169
12170
12171
12172
12173
12174
12175
12176
12177
12178
12179
12180
12181
12182
12183
12184
12185
12186
12187
12188
12189
12190
12191
12192
12193
12194
12195
12196
12197
12198
12199
12200
12201
12202
12203
12204
12205
12206
12207
12208
12209
12210
12211
12212
12213
12214
12215
12216
12217
12218
12219
12220
12221
12222
12223
12224
12225
12226
12227
12228
12229
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261
12262
12263
12264
12265
12266
12267
12268
12269
12270
12271
12272
12273
12274
12275
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289
12290
12291
12292
12293
12294
12295
12296
12297
12298
12299
12300
12301
12302
12303
12304
12305
12306
12307
12308
12309
12310
12311
12312
12313
12314
12315
12316
12317
12318
12319
12320
12321
12322
12323
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333
12334
12335
12336
12337
12338
12339
12340
12341
12342
12343
12344
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
12356
12357
12358
12359
12360
12361
12362
12363
12364
12365
12366
12367
12368
12369
12370
12371
12372
12373
12374
12375
12376
12377
12378
12379
12380
12381
12382
12383
12384
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
12410
12411
12412
12413
12414
12415
12416
12417
12418
12419
12420
12421
12422
12423
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448
12449
12450
12451
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12464
12465
12466
12467
12468
12469
12470
12471
12472
12473
12474
12475
12476
12477
12478
12479
12480
12481
12482
12483
12484
12485
12486
12487
12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12590
12591
12592
12593
12594
12595
12596
12597
12598
12599
12600
12601
12602
12603
12604
12605
12606
12607
12608
12609
12610
12611
12612
12613
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
12652
12653
12654
12655
12656
12657
12658
12659
12660
12661
12662
12663
12664
12665
12666
12667
12668
12669
12670
12671
12672
12673
12674
12675
12676
12677
12678
12679
12680
12681
12682
12683
12684
12685
12686
12687
12688
12689
12690
12691
12692
12693
12694
12695
12696
12697
12698
12699
12700
12701
12702
12703
12704
12705
12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12764
12765
12766
12767
12768
12769
12770
12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12781
12782
12783
12784
12785
12786
12787
12788
12789
12790
12791
12792
12793
12794
12795
12796
12797
12798
12799
12800
12801
12802
12803
12804
12805
12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
12821
12822
12823
12824
12825
12826
12827
12828
12829
12830
12831
12832
12833
12834
12835
12836
12837
12838
12839
12840
12841
12842
12843
12844
12845
12846
12847
12848
12849
12850
12851
12852
12853
12854
12855
12856
12857
12858
12859
12860
12861
12862
12863
12864
12865
12866
12867
12868
12869
12870
12871
12872
12873
12874
12875
12876
12877
12878
12879
12880
12881
12882
12883
12884
12885
12886
12887
12888
12889
12890
12891
12892
12893
12894
12895
12896
12897
12898
12899
12900
12901
12902
12903
12904
12905
12906
12907
12908
12909
12910
12911
12912
12913
12914
12915
12916
12917
12918
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945
12946
12947
12948
12949
12950
12951
12952
12953
12954
12955
12956
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12969
12970
12971
12972
12973
12974
12975
12976
12977
12978
12979
12980
12981
12982
12983
12984
12985
12986
12987
12988
12989
12990
12991
12992
12993
12994
12995
12996
12997
12998
12999
13000
13001
13002
13003
13004
13005
13006
13007
13008
13009
13010
13011
13012
13013
13014
13015
13016
13017
13018
13019
13020
13021
13022
13023
13024
13025
13026
13027
13028
13029
13030
13031
13032
13033
13034
13035
13036
13037
13038
13039
13040
13041
13042
13043
13044
13045
13046
13047
13048
13049
13050
13051
13052
13053
13054
13055
13056
13057
13058
13059
13060
13061
13062
13063
13064
13065
13066
13067
13068
13069
13070
13071
13072
13073
13074
13075
13076
13077
13078
13079
13080
13081
13082
13083
13084
13085
13086
13087
13088
13089
13090
13091
13092
13093
13094
13095
13096
13097
13098
13099
13100
13101
13102
13103
13104
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13125
13126
13127
13128
13129
13130
13131
13132
13133
13134
13135
13136
13137
13138
13139
13140
13141
13142
13143
13144
13145
13146
13147
13148
13149
13150
13151
13152
13153
13154
13155
13156
13157
13158
13159
13160
13161
13162
13163
13164
13165
13166
13167
13168
13169
13170
13171
13172
13173
13174
13175
13176
13177
13178
13179
13180
13181
13182
13183
13184
13185
13186
13187
13188
13189
13190
13191
13192
13193
13194
13195
13196
13197
13198
13199
13200
13201
13202
13203
13204
13205
13206
13207
13208
13209
13210
13211
13212
13213
13214
13215
13216
13217
13218
13219
13220
13221
13222
13223
13224
13225
13226
13227
13228
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265
13266
13267
13268
13269
13270
13271
13272
13273
13274
13275
13276
13277
13278
13279
13280
13281
13282
13283
13284
13285
13286
13287
13288
13289
13290
13291
13292
13293
13294
13295
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13317
13318
13319
13320
13321
13322
13323
13324
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
13341
13342
13343
13344
13345
13346
13347
13348
13349
13350
13351
13352
13353
13354
13355
13356
13357
13358
13359
13360
13361
13362
13363
13364
13365
13366
13367
13368
13369
13370
13371
13372
13373
13374
13375
13376
13377
13378
13379
13380
13381
13382
13383
13384
13385
13386
13387
13388
13389
13390
13391
13392
13393
13394
13395
13396
13397
13398
13399
13400
13401
13402
13403
13404
13405
13406
13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13461
13462
13463
13464
13465
13466
13467
13468
13469
13470
13471
13472
13473
13474
13475
13476
13477
13478
13479
13480
13481
13482
13483
13484
13485
13486
13487
13488
13489
13490
13491
13492
13493
13494
13495
13496
13497
13498
13499
13500
13501
13502
13503
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
13514
13515
13516
13517
13518
13519
13520
13521
13522
13523
13524
13525
13526
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543
13544
13545
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555
13556
13557
13558
13559
13560
13561
13562
13563
13564
13565
13566
13567
13568
13569
13570
13571
13572
13573
13574
13575
13576
13577
13578
13579
13580
13581
13582
13583
13584
13585
13586
13587
13588
13589
13590
13591
13592
13593
13594
13595
13596
13597
13598
13599
13600
13601
13602
13603
13604
13605
13606
13607
13608
13609
13610
13611
13612
13613
13614
13615
13616
13617
13618
13619
13620
13621
13622
13623
13624
13625
13626
13627
13628
13629
13630
13631
13632
13633
13634
13635
13636
13637
13638
13639
13640
13641
13642
13643
13644
13645
13646
13647
13648
13649
13650
13651
13652
13653
13654
13655
13656
13657
13658
13659
13660
13661
13662
13663
13664
13665
13666
13667
13668
13669
13670
13671
13672
13673
13674
13675
13676
13677
13678
13679
13680
13681
13682
13683
13684
13685
13686
13687
13688
13689
13690
13691
13692
13693
13694
13695
13696
13697
13698
13699
13700
13701
13702
13703
13704
13705
13706
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719
13720
13721
13722
13723
13724
13725
13726
13727
13728
13729
13730
13731
13732
13733
13734
13735
13736
13737
13738
13739
13740
13741
13742
13743
13744
13745
13746
13747
13748
13749
13750
13751
13752
13753
13754
13755
13756
13757
13758
13759
13760
13761
13762
13763
13764
13765
13766
13767
13768
13769
13770
13771
13772
13773
13774
13775
13776
13777
13778
13779
13780
13781
13782
13783
13784
13785
13786
13787
13788
13789
13790
13791
13792
13793
13794
13795
13796
13797
13798
13799
13800
13801
13802
13803
13804
13805
13806
13807
13808
13809
13810
13811
13812
13813
13814
13815
13816
13817
13818
13819
13820
13821
13822
13823
13824
13825
13826
13827
13828
13829
13830
13831
13832
13833
13834
13835
13836
13837
13838
13839
13840
13841
13842
13843
13844
13845
13846
13847
13848
13849
13850
13851
13852
13853
13854
13855
13856
13857
13858
13859
13860
13861
13862
13863
13864
13865
13866
13867
13868
13869
13870
13871
13872
13873
13874
13875
13876
13877
13878
13879
13880
13881
13882
13883
13884
13885
13886
13887
13888
13889
13890
13891
13892
13893
13894
13895
13896
13897
13898
13899
13900
13901
13902
13903
13904
13905
13906
13907
13908
13909
13910
13911
13912
13913
13914
13915
13916
13917
13918
13919
13920
13921
13922
13923
13924
13925
13926
13927
13928
13929
13930
13931
13932
13933
13934
13935
13936
13937
13938
13939
13940
13941
13942
13943
13944
13945
13946
13947
13948
13949
13950
13951
13952
13953
13954
13955
13956
13957
13958
13959
13960
13961
13962
13963
13964
13965
13966
13967
13968
13969
13970
13971
13972
13973
13974
13975
13976
13977
13978
13979
13980
13981
13982
13983
13984
13985
13986
13987
13988
13989
13990
13991
13992
13993
13994
13995
13996
13997
13998
13999
14000
14001
14002
14003
14004
14005
14006
14007
14008
14009
14010
14011
14012
14013
14014
14015
14016
14017
14018
14019
14020
14021
14022
14023
14024
14025
14026
14027
14028
14029
14030
14031
14032
14033
14034
14035
14036
14037
14038
14039
14040
14041
14042
14043
14044
14045
14046
14047
14048
14049
14050
14051
14052
14053
14054
14055
14056
14057
14058
14059
14060
14061
14062
14063
14064
14065
14066
14067
14068
14069
14070
14071
14072
14073
14074
14075
14076
14077
14078
14079
14080
14081
14082
14083
14084
14085
14086
14087
14088
14089
14090
14091
14092
14093
14094
14095
14096
14097
14098
14099
14100
14101
14102
14103
14104
14105
14106
14107
14108
14109
14110
14111
14112
14113
14114
14115
14116
14117
14118
14119
14120
14121
14122
14123
14124
14125
14126
14127
14128
14129
14130
14131
14132
14133
14134
14135
14136
14137
14138
14139
14140
14141
14142
14143
14144
14145
14146
14147
14148
14149
14150
14151
14152
14153
14154
14155
14156
14157
14158
14159
14160
14161
14162
14163
14164
14165
14166
14167
14168
14169
14170
14171
14172
14173
14174
14175
14176
14177
14178
14179
14180
14181
14182
14183
14184
14185
14186
14187
14188
14189
14190
14191
14192
14193
14194
14195
14196
14197
14198
14199
14200
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
14212
14213
14214
14215
14216
14217
14218
14219
14220
14221
14222
14223
14224
14225
14226
14227
14228
14229
14230
14231
14232
14233
14234
14235
14236
14237
14238
14239
14240
14241
14242
14243
14244
14245
14246
14247
14248
14249
14250
14251
14252
14253
14254
14255
14256
14257
14258
14259
14260
14261
14262
14263
14264
14265
14266
14267
14268
14269
14270
14271
14272
14273
14274
14275
14276
14277
14278
14279
14280
14281
14282
14283
14284
14285
14286
14287
14288
14289
14290
14291
14292
14293
14294
14295
14296
14297
14298
14299
14300
14301
14302
14303
14304
14305
14306
14307
14308
14309
14310
14311
14312
14313
14314
14315
14316
14317
14318
14319
14320
14321
14322
14323
14324
14325
14326
14327
14328
14329
14330
14331
14332
14333
14334
14335
14336
14337
14338
14339
14340
14341
14342
14343
14344
14345
14346
14347
14348
14349
14350
14351
14352
14353
14354
14355
14356
14357
14358
14359
14360
14361
14362
14363
14364
14365
14366
14367
14368
14369
14370
14371
14372
14373
14374
14375
14376
14377
14378
14379
14380
14381
14382
14383
14384
14385
14386
14387
14388
14389
14390
14391
14392
14393
14394
14395
14396
14397
14398
14399
14400
14401
14402
14403
14404
14405
14406
14407
14408
14409
14410
14411
14412
14413
14414
14415
14416
14417
14418
14419
14420
14421
14422
14423
14424
14425
14426
14427
14428
14429
14430
14431
14432
14433
14434
14435
14436
14437
14438
14439
14440
14441
14442
14443
14444
14445
14446
14447
14448
14449
14450
14451
14452
14453
14454
14455
14456
14457
14458
14459
14460
14461
14462
14463
14464
14465
14466
14467
14468
14469
14470
14471
14472
14473
14474
14475
14476
14477
14478
14479
14480
14481
14482
14483
14484
14485
14486
14487
14488
14489
14490
14491
14492
14493
14494
14495
14496
14497
14498
14499
14500
14501
14502
14503
14504
14505
14506
14507
14508
14509
14510
14511
14512
14513
14514
14515
14516
14517
14518
14519
14520
14521
14522
14523
14524
14525
14526
14527
14528
14529
14530
14531
14532
14533
14534
14535
14536
14537
14538
14539
14540
14541
14542
14543
14544
14545
14546
14547
14548
14549
14550
14551
14552
14553
14554
14555
14556
14557
14558
14559
14560
14561
14562
14563
14564
14565
14566
14567
14568
14569
14570
14571
14572
14573
14574
14575
14576
14577
14578
14579
14580
14581
14582
14583
14584
14585
14586
14587
14588
14589
14590
14591
14592
14593
14594
14595
14596
14597
14598
14599
14600
14601
14602
14603
14604
14605
14606
14607
14608
14609
14610
14611
14612
14613
14614
14615
14616
14617
14618
14619
14620
14621
14622
14623
14624
14625
14626
14627
14628
14629
14630
14631
14632
14633
14634
14635
14636
14637
14638
14639
14640
14641
14642
14643
14644
14645
14646
14647
14648
14649
14650
14651
14652
14653
14654
14655
14656
14657
14658
14659
14660
14661
14662
14663
14664
14665
14666
14667
14668
14669
14670
14671
14672
14673
14674
14675
14676
14677
14678
14679
14680
14681
14682
14683
14684
14685
14686
14687
14688
14689
14690
14691
14692
14693
14694
14695
14696
14697
14698
14699
14700
14701
14702
14703
14704
14705
14706
14707
14708
14709
14710
14711
14712
14713
14714
14715
14716
14717
14718
14719
14720
14721
14722
14723
14724
14725
14726
14727
14728
14729
14730
14731
14732
14733
14734
14735
14736
14737
14738
14739
14740
14741
14742
14743
14744
14745
14746
14747
14748
14749
14750
14751
14752
14753
14754
14755
14756
14757
14758
14759
14760
14761
14762
14763
14764
14765
14766
14767
14768
14769
14770
14771
14772
14773
14774
14775
14776
14777
14778
14779
14780
14781
14782
14783
14784
14785
14786
14787
14788
14789
14790
14791
14792
14793
14794
14795
14796
14797
14798
14799
14800
14801
14802
14803
14804
14805
14806
14807
14808
14809
14810
14811
14812
14813
14814
14815
14816
14817
14818
14819
14820
14821
14822
14823
14824
14825
14826
14827
14828
14829
14830
14831
14832
14833
14834
14835
14836
14837
14838
14839
14840
14841
14842
14843
14844
14845
14846
14847
14848
14849
14850
14851
14852
14853
14854
14855
14856
14857
14858
14859
14860
14861
14862
14863
14864
14865
14866
14867
14868
14869
14870
14871
14872
14873
14874
14875
14876
14877
14878
14879
14880
14881
14882
14883
14884
14885
14886
14887
14888
14889
14890
14891
14892
14893
14894
14895
14896
14897
14898
14899
14900
14901
14902
14903
14904
14905
14906
14907
14908
14909
14910
14911
14912
14913
14914
14915
14916
14917
14918
14919
14920
14921
14922
14923
14924
14925
14926
14927
14928
14929
14930
14931
14932
14933
14934
14935
14936
14937
14938
14939
14940
14941
14942
14943
14944
14945
14946
14947
14948
14949
14950
14951
14952
14953
14954
14955
14956
14957
14958
14959
14960
14961
14962
14963
14964
14965
14966
14967
14968
14969
14970
14971
14972
14973
14974
14975
14976
14977
14978
14979
14980
14981
14982
14983
14984
14985
14986
14987
14988
14989
14990
14991
14992
14993
14994
14995
14996
14997
14998
14999
15000
15001
15002
15003
15004
15005
15006
15007
15008
15009
15010
15011
15012
15013
15014
15015
15016
15017
15018
15019
15020
15021
15022
15023
15024
15025
15026
15027
15028
15029
15030
15031
15032
15033
15034
15035
15036
15037
15038
15039
15040
15041
15042
15043
15044
15045
15046
15047
15048
15049
15050
15051
15052
15053
15054
15055
15056
15057
15058
15059
15060
15061
15062
15063
15064
15065
15066
15067
15068
15069
15070
15071
15072
15073
15074
15075
15076
15077
15078
15079
15080
15081
15082
15083
15084
15085
15086
15087
15088
15089
15090
15091
15092
15093
15094
15095
15096
15097
15098
15099
15100
15101
15102
15103
15104
15105
15106
15107
15108
15109
15110
15111
15112
15113
15114
15115
15116
15117
15118
15119
15120
15121
15122
15123
15124
15125
15126
15127
15128
15129
15130
15131
15132
15133
15134
15135
15136
15137
15138
15139
15140
15141
15142
15143
15144
15145
15146
15147
15148
15149
15150
15151
15152
15153
15154
15155
15156
15157
15158
15159
15160
15161
15162
15163
15164
15165
15166
15167
15168
15169
15170
15171
15172
15173
15174
15175
15176
15177
15178
15179
15180
15181
15182
15183
15184
15185
15186
15187
15188
15189
15190
15191
15192
15193
15194
15195
15196
15197
15198
15199
15200
15201
15202
15203
15204
15205
15206
15207
15208
15209
15210
15211
15212
15213
15214
15215
15216
15217
15218
15219
15220
15221
15222
15223
15224
15225
15226
15227
15228
15229
15230
15231
15232
15233
15234
15235
15236
15237
15238
15239
15240
15241
15242
15243
15244
15245
15246
15247
15248
15249
15250
15251
15252
15253
15254
15255
15256
15257
15258
15259
15260
15261
15262
15263
15264
15265
15266
15267
15268
15269
15270
15271
15272
15273
15274
15275
15276
15277
15278
15279
15280
15281
15282
15283
15284
15285
15286
15287
15288
15289
15290
15291
15292
15293
15294
15295
15296
15297
15298
15299
15300
15301
15302
15303
15304
15305
15306
15307
15308
15309
15310
15311
15312
15313
15314
15315
15316
15317
15318
15319
15320
15321
15322
15323
15324
15325
15326
15327
15328
15329
15330
15331
15332
15333
15334
15335
15336
15337
15338
15339
15340
15341
15342
15343
15344
15345
15346
15347
15348
15349
15350
15351
15352
15353
15354
15355
15356
15357
15358
15359
15360
15361
15362
15363
15364
15365
15366
15367
15368
15369
15370
15371
15372
15373
15374
15375
15376
15377
15378
15379
15380
15381
15382
15383
15384
15385
15386
15387
15388
15389
15390
15391
15392
15393
15394
15395
15396
15397
15398
15399
15400
15401
15402
15403
15404
15405
15406
15407
15408
15409
15410
15411
15412
15413
15414
15415
15416
15417
15418
15419
15420
15421
15422
15423
15424
15425
15426
15427
15428
15429
15430
15431
15432
15433
15434
15435
15436
15437
15438
15439
15440
15441
15442
15443
15444
15445
15446
15447
15448
15449
15450
15451
15452
15453
15454
15455
15456
15457
15458
15459
15460
15461
15462
15463
15464
15465
15466
15467
15468
15469
15470
15471
15472
15473
15474
15475
15476
15477
15478
15479
15480
15481
15482
15483
15484
15485
15486
15487
15488
15489
15490
15491
15492
15493
15494
15495
15496
15497
15498
15499
15500
15501
15502
15503
15504
15505
15506
15507
15508
15509
15510
15511
15512
15513
15514
15515
15516
15517
15518
15519
15520
15521
15522
15523
15524
15525
15526
15527
15528
15529
15530
15531
15532
15533
15534
15535
15536
15537
15538
15539
15540
15541
15542
15543
15544
15545
15546
15547
15548
15549
15550
15551
15552
15553
15554
15555
15556
15557
15558
15559
15560
15561
15562
15563
15564
15565
15566
15567
15568
15569
15570
15571
15572
15573
15574
15575
15576
15577
15578
15579
15580
15581
15582
15583
15584
15585
15586
15587
15588
15589
15590
15591
15592
15593
15594
15595
15596
15597
15598
15599
15600
15601
15602
15603
15604
15605
15606
15607
15608
15609
15610
15611
15612
15613
15614
15615
15616
15617
15618
15619
15620
15621
15622
15623
15624
15625
15626
15627
15628
15629
15630
15631
15632
15633
15634
15635
15636
15637
15638
15639
15640
15641
15642
15643
15644
15645
15646
15647
15648
15649
15650
15651
15652
15653
15654
15655
15656
15657
15658
15659
15660
15661
15662
15663
15664
15665
15666
15667
15668
15669
15670
15671
15672
15673
15674
15675
15676
15677
15678
15679
15680
15681
15682
15683
15684
15685
15686
15687
15688
15689
15690
15691
15692
15693
15694
15695
15696
15697
15698
15699
15700
15701
15702
15703
15704
15705
15706
15707
15708
15709
15710
15711
15712
15713
15714
15715
15716
15717
15718
15719
15720
15721
15722
15723
15724
15725
15726
15727
15728
15729
15730
15731
15732
15733
15734
15735
15736
15737
15738
15739
15740
15741
15742
15743
15744
15745
15746
15747
15748
15749
15750
15751
15752
15753
15754
15755
15756
15757
15758
15759
15760
15761
15762
15763
15764
15765
15766
15767
15768
15769
15770
15771
15772
15773
15774
15775
15776
15777
15778
15779
15780
15781
15782
15783
15784
15785
15786
15787
15788
15789
15790
15791
15792
15793
15794
15795
15796
15797
15798
15799
15800
15801
15802
15803
15804
15805
15806
15807
15808
15809
15810
15811
15812
15813
15814
15815
15816
15817
15818
15819
15820
15821
15822
15823
15824
15825
15826
15827
15828
15829
15830
15831
15832
15833
15834
15835
15836
15837
15838
15839
15840
15841
15842
15843
15844
15845
15846
15847
15848
15849
15850
15851
15852
15853
15854
15855
15856
15857
15858
15859
15860
15861
15862
15863
15864
15865
15866
15867
15868
15869
15870
15871
15872
15873
15874
15875
15876
15877
15878
15879
15880
15881
15882
15883
15884
15885
15886
15887
15888
15889
15890
15891
15892
15893
15894
15895
15896
15897
15898
15899
15900
15901
15902
15903
15904
15905
15906
15907
15908
15909
15910
15911
15912
15913
15914
15915
15916
15917
15918
15919
15920
15921
15922
15923
15924
15925
15926
15927
15928
15929
15930
15931
15932
15933
15934
15935
15936
15937
15938
15939
15940
15941
15942
15943
15944
15945
15946
15947
15948
15949
15950
15951
15952
15953
15954
15955
15956
15957
15958
15959
15960
15961
15962
15963
15964
15965
15966
15967
15968
15969
15970
15971
15972
15973
15974
15975
15976
15977
15978
15979
15980
15981
15982
15983
15984
15985
15986
15987
15988
15989
15990
15991
15992
15993
15994
15995
15996
15997
15998
15999
16000
16001
16002
16003
16004
16005
16006
16007
16008
16009
16010
16011
16012
16013
16014
16015
16016
16017
16018
16019
16020
16021
16022
16023
16024
16025
16026
16027
16028
16029
16030
16031
16032
16033
16034
16035
16036
16037
16038
16039
16040
16041
16042
16043
16044
16045
16046
16047
16048
16049
16050
16051
16052
16053
16054
16055
16056
16057
16058
16059
16060
16061
16062
16063
16064
16065
16066
16067
16068
16069
16070
16071
16072
16073
16074
16075
16076
16077
16078
16079
16080
16081
16082
16083
16084
16085
16086
16087
16088
16089
16090
16091
16092
16093
16094
16095
16096
16097
16098
16099
16100
16101
16102
16103
16104
16105
16106
16107
16108
16109
16110
16111
16112
16113
16114
16115
16116
16117
16118
16119
16120
16121
16122
16123
16124
16125
16126
16127
16128
16129
16130
16131
16132
16133
16134
16135
16136
16137
16138
16139
16140
16141
16142
16143
16144
16145
16146
16147
16148
16149
16150
16151
16152
16153
16154
16155
16156
16157
16158
16159
16160
16161
16162
16163
16164
16165
16166
16167
16168
16169
16170
16171
16172
16173
16174
16175
16176
16177
16178
16179
16180
16181
16182
16183
16184
16185
16186
16187
16188
16189
16190
16191
16192
16193
16194
16195
16196
16197
16198
16199
16200
16201
16202
16203
16204
16205
16206
16207
16208
16209
16210
16211
16212
16213
16214
16215
16216
16217
16218
16219
16220
16221
16222
16223
16224
16225
16226
16227
16228
16229
16230
16231
16232
16233
16234
16235
16236
16237
16238
16239
16240
16241
16242
16243
16244
16245
16246
16247
16248
16249
16250
16251
16252
16253
16254
16255
16256
16257
16258
16259
16260
16261
16262
16263
16264
16265
16266
16267
16268
16269
16270
16271
16272
16273
16274
16275
16276
16277
16278
16279
16280
16281
16282
16283
16284
16285
16286
16287
16288
16289
16290
16291
16292
16293
16294
16295
16296
16297
16298
16299
16300
16301
16302
16303
16304
16305
16306
16307
16308
16309
16310
16311
16312
16313
16314
16315
16316
16317
16318
16319
16320
16321
16322
16323
16324
16325
16326
16327
16328
16329
16330
16331
16332
16333
16334
16335
16336
16337
16338
16339
16340
16341
16342
16343
16344
16345
16346
16347
16348
16349
16350
16351
16352
16353
16354
16355
16356
16357
16358
16359
16360
16361
16362
16363
16364
16365
16366
16367
16368
16369
16370
16371
16372
16373
16374
16375
16376
16377
16378
16379
16380
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390
16391
16392
16393
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
16409
16410
16411
16412
16413
16414
16415
16416
16417
16418
16419
16420
16421
16422
16423
16424
16425
16426
16427
16428
16429
16430
16431
16432
16433
16434
16435
16436
16437
16438
16439
16440
16441
16442
16443
16444
16445
16446
16447
16448
16449
16450
16451
16452
16453
16454
16455
16456
16457
16458
16459
16460
16461
16462
16463
16464
16465
16466
16467
16468
16469
16470
16471
16472
16473
16474
16475
16476
16477
16478
16479
16480
16481
16482
16483
16484
16485
16486
16487
16488
16489
16490
16491
16492
16493
16494
16495
16496
16497
16498
16499
16500
16501
16502
16503
16504
16505
16506
16507
16508
16509
16510
16511
16512
16513
16514
16515
16516
16517
16518
16519
16520
16521
16522
16523
16524
16525
16526
16527
16528
16529
16530
16531
16532
16533
16534
16535
16536
16537
16538
16539
16540
16541
16542
16543
16544
16545
16546
16547
16548
16549
16550
16551
16552
16553
16554
16555
16556
16557
16558
16559
16560
16561
16562
16563
16564
16565
16566
16567
16568
16569
16570
16571
16572
16573
16574
16575
16576
16577
16578
16579
16580
16581
16582
16583
16584
16585
16586
16587
16588
16589
16590
16591
16592
16593
16594
16595
16596
16597
16598
16599
16600
16601
16602
16603
16604
16605
16606
16607
16608
16609
16610
16611
16612
16613
16614
16615
16616
16617
16618
16619
16620
16621
16622
16623
16624
16625
16626
16627
16628
16629
16630
16631
16632
16633
16634
16635
16636
16637
16638
16639
16640
16641
16642
16643
16644
16645
16646
16647
16648
16649
16650
16651
16652
16653
16654
16655
16656
16657
16658
16659
16660
16661
16662
16663
16664
16665
16666
16667
16668
16669
16670
16671
16672
16673
16674
16675
16676
16677
16678
16679
16680
16681
16682
16683
16684
16685
16686
16687
16688
16689
16690
16691
16692
16693
16694
16695
16696
16697
16698
16699
16700
16701
16702
16703
16704
16705
16706
16707
16708
16709
16710
16711
16712
16713
16714
16715
16716
16717
16718
16719
16720
16721
16722
16723
16724
16725
16726
16727
16728
16729
16730
16731
16732
16733
16734
16735
16736
16737
16738
16739
16740
16741
16742
16743
16744
16745
16746
16747
16748
16749
16750
16751
16752
16753
16754
16755
16756
16757
16758
16759
16760
16761
16762
16763
16764
16765
16766
16767
16768
16769
16770
16771
16772
16773
16774
16775
16776
16777
16778
16779
16780
16781
16782
16783
16784
16785
16786
16787
16788
16789
16790
16791
16792
16793
16794
16795
16796
16797
16798
16799
16800
16801
16802
16803
16804
16805
16806
16807
16808
16809
16810
16811
16812
16813
16814
16815
16816
16817
16818
16819
16820
16821
16822
16823
16824
16825
16826
16827
16828
16829
16830
16831
16832
16833
16834
16835
16836
16837
16838
16839
16840
16841
16842
16843
16844
16845
16846
16847
16848
16849
16850
16851
16852
16853
16854
16855
16856
16857
16858
16859
16860
16861
16862
16863
16864
16865
16866
16867
16868
16869
16870
16871
16872
16873
16874
16875
16876
16877
16878
16879
16880
16881
16882
16883
16884
16885
16886
16887
16888
16889
16890
16891
16892
16893
16894
16895
16896
16897
16898
16899
16900
16901
16902
16903
16904
16905
16906
16907
16908
16909
16910
16911
16912
16913
16914
16915
16916
16917
16918
16919
16920
16921
16922
16923
16924
16925
16926
16927
16928
16929
16930
16931
16932
16933
16934
16935
16936
16937
16938
16939
16940
16941
16942
16943
16944
16945
16946
16947
16948
16949
16950
16951
16952
16953
16954
16955
16956
16957
16958
16959
16960
16961
16962
16963
16964
16965
16966
16967
16968
16969
16970
16971
16972
16973
16974
16975
16976
16977
16978
16979
16980
16981
16982
16983
16984
16985
16986
16987
16988
16989
16990
16991
16992
16993
16994
16995
16996
16997
16998
16999
17000
17001
17002
17003
17004
17005
17006
17007
17008
17009
17010
17011
17012
17013
17014
17015
17016
17017
17018
17019
17020
17021
17022
17023
17024
17025
17026
17027
17028
17029
17030
17031
17032
17033
17034
17035
17036
17037
17038
17039
17040
17041
17042
17043
17044
17045
17046
17047
17048
17049
17050
17051
17052
17053
17054
17055
17056
17057
17058
17059
17060
17061
17062
17063
17064
17065
17066
17067
17068
17069
17070
17071
17072
17073
17074
17075
17076
17077
17078
17079
17080
17081
17082
17083
17084
17085
17086
17087
17088
17089
17090
17091
17092
17093
17094
17095
17096
17097
17098
17099
17100
17101
17102
17103
17104
17105
17106
17107
17108
17109
17110
17111
17112
17113
17114
17115
17116
17117
17118
17119
17120
17121
17122
17123
17124
17125
17126
17127
17128
17129
17130
17131
17132
17133
17134
17135
17136
17137
17138
17139
17140
17141
17142
17143
17144
17145
17146
17147
17148
17149
17150
17151
17152
17153
17154
17155
17156
17157
17158
17159
17160
17161
17162
17163
17164
17165
17166
17167
17168
17169
17170
17171
17172
17173
17174
17175
17176
17177
17178
17179
17180
17181
17182
17183
17184
17185
17186
17187
17188
17189
17190
17191
17192
17193
17194
17195
17196
17197
17198
17199
17200
17201
17202
17203
17204
17205
17206
17207
17208
17209
17210
17211
17212
17213
17214
17215
17216
17217
17218
17219
17220
17221
17222
17223
17224
17225
17226
17227
17228
17229
17230
17231
17232
17233
17234
17235
17236
17237
17238
17239
17240
17241
17242
17243
17244
17245
17246
17247
17248
17249
17250
17251
17252
17253
17254
17255
17256
17257
17258
17259
17260
17261
17262
17263
17264
17265
17266
17267
17268
17269
17270
17271
17272
17273
17274
17275
17276
17277
17278
17279
17280
17281
17282
17283
17284
17285
17286
17287
17288
17289
17290
17291
17292
17293
17294
17295
17296
17297
17298
17299
17300
17301
17302
17303
17304
17305
17306
17307
17308
17309
17310
17311
17312
17313
17314
17315
17316
17317
17318
17319
17320
17321
17322
17323
17324
17325
17326
17327
17328
17329
17330
17331
17332
17333
17334
17335
17336
17337
17338
17339
17340
17341
17342
17343
17344
17345
17346
17347
17348
17349
17350
17351
17352
17353
17354
17355
17356
17357
17358
17359
17360
17361
17362
17363
17364
17365
17366
17367
17368
17369
17370
17371
17372
17373
17374
17375
17376
17377
17378
17379
17380
17381
17382
17383
17384
17385
17386
17387
17388
17389
17390
17391
17392
17393
17394
17395
17396
17397
17398
17399
17400
17401
17402
17403
17404
17405
17406
17407
17408
17409
17410
17411
17412
17413
17414
17415
17416
17417
17418
17419
17420
17421
17422
17423
17424
17425
17426
17427
17428
17429
17430
17431
17432
17433
17434
17435
17436
17437
17438
17439
17440
17441
17442
17443
17444
17445
17446
17447
17448
17449
17450
17451
17452
17453
17454
17455
17456
17457
17458
17459
17460
17461
17462
17463
17464
17465
17466
17467
17468
17469
17470
17471
17472
17473
17474
17475
17476
17477
17478
17479
17480
17481
17482
17483
17484
17485
17486
17487
17488
17489
17490
17491
17492
17493
17494
17495
17496
17497
17498
17499
17500
17501
17502
17503
17504
17505
17506
17507
17508
17509
17510
17511
17512
17513
17514
17515
17516
17517
17518
17519
17520
17521
17522
17523
17524
17525
17526
17527
17528
17529
17530
17531
17532
17533
17534
17535
17536
17537
17538
17539
17540
17541
17542
17543
17544
17545
17546
17547
17548
17549
17550
17551
17552
17553
17554
17555
17556
17557
17558
17559
17560
17561
17562
17563
17564
17565
17566
17567
17568
17569
17570
17571
17572
17573
17574
17575
17576
17577
17578
17579
17580
17581
17582
17583
17584
17585
17586
17587
17588
17589
17590
17591
17592
17593
17594
17595
17596
17597
17598
17599
17600
17601
17602
17603
17604
17605
17606
17607
17608
17609
17610
17611
17612
17613
17614
17615
17616
17617
17618
17619
17620
17621
17622
17623
17624
17625
17626
17627
17628
17629
17630
17631
17632
17633
17634
17635
17636
17637
17638
17639
17640
17641
17642
17643
17644
17645
17646
17647
17648
17649
17650
17651
17652
17653
17654
17655
17656
17657
17658
17659
17660
17661
17662
17663
17664
17665
17666
17667
17668
17669
17670
17671
17672
17673
17674
17675
17676
17677
17678
17679
17680
17681
17682
17683
17684
17685
17686
17687
17688
17689
17690
17691
17692
17693
17694
17695
17696
17697
17698
17699
17700
17701
17702
17703
17704
17705
17706
17707
17708
17709
17710
17711
17712
17713
17714
17715
17716
17717
17718
17719
17720
17721
17722
17723
17724
17725
17726
17727
17728
17729
17730
17731
17732
17733
17734
17735
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754
17755
17756
17757
17758
17759
17760
17761
17762
17763
17764
17765
17766
17767
17768
17769
17770
17771
17772
17773
17774
17775
17776
17777
17778
17779
17780
17781
17782
17783
17784
17785
17786
17787
17788
17789
17790
17791
17792
17793
17794
17795
17796
17797
17798
17799
17800
17801
17802
17803
17804
17805
17806
17807
17808
17809
17810
17811
17812
17813
17814
17815
17816
17817
17818
17819
17820
17821
17822
17823
17824
17825
17826
17827
17828
17829
17830
17831
17832
17833
17834
17835
17836
17837
17838
17839
17840
17841
17842
17843
17844
17845
17846
17847
17848
17849
17850
17851
17852
17853
17854
17855
17856
17857
17858
17859
17860
17861
17862
17863
17864
17865
17866
17867
17868
17869
17870
17871
17872
17873
17874
17875
17876
17877
17878
17879
17880
17881
17882
17883
17884
17885
17886
17887
17888
17889
17890
17891
17892
17893
17894
17895
17896
17897
17898
17899
17900
17901
17902
17903
17904
17905
17906
17907
17908
17909
17910
17911
17912
17913
17914
17915
17916
17917
17918
17919
17920
17921
17922
17923
17924
17925
17926
17927
17928
17929
17930
17931
17932
17933
17934
17935
17936
17937
17938
17939
17940
17941
17942
17943
17944
17945
17946
17947
17948
17949
17950
17951
17952
17953
17954
17955
17956
17957
17958
17959
17960
17961
17962
17963
17964
17965
17966
17967
17968
17969
17970
17971
17972
17973
17974
17975
17976
17977
17978
17979
17980
17981
17982
17983
17984
17985
17986
17987
17988
17989
17990
17991
17992
17993
17994
17995
17996
17997
17998
17999
18000
18001
18002
18003
18004
18005
18006
18007
18008
18009
18010
18011
18012
18013
18014
18015
18016
18017
18018
18019
18020
18021
18022
18023
18024
18025
18026
18027
18028
18029
18030
18031
18032
18033
18034
18035
18036
18037
18038
18039
18040
18041
18042
18043
18044
18045
18046
18047
18048
18049
18050
18051
18052
18053
18054
18055
18056
18057
18058
18059
18060
18061
18062
18063
18064
18065
18066
18067
18068
18069
18070
18071
18072
18073
18074
18075
18076
18077
18078
18079
18080
18081
18082
18083
18084
18085
18086
18087
18088
18089
18090
18091
18092
18093
18094
18095
18096
18097
18098
18099
18100
18101
18102
18103
18104
18105
18106
18107
18108
18109
18110
18111
18112
18113
18114
18115
18116
18117
18118
18119
18120
18121
18122
18123
18124
18125
18126
18127
18128
18129
18130
18131
18132
18133
18134
18135
18136
18137
18138
18139
18140
18141
18142
18143
18144
18145
18146
18147
18148
18149
18150
18151
18152
18153
18154
18155
18156
18157
18158
18159
18160
18161
18162
18163
18164
18165
18166
18167
18168
18169
18170
18171
18172
18173
18174
18175
18176
18177
18178
18179
18180
18181
18182
18183
18184
18185
18186
18187
18188
18189
18190
18191
18192
18193
18194
18195
18196
18197
18198
18199
18200
18201
18202
18203
18204
18205
18206
18207
18208
18209
18210
18211
18212
18213
18214
18215
18216
18217
18218
18219
18220
18221
18222
18223
18224
18225
18226
18227
18228
18229
18230
18231
18232
18233
18234
18235
18236
18237
18238
18239
18240
18241
18242
18243
18244
18245
18246
18247
18248
18249
18250
18251
18252
18253
18254
18255
18256
18257
18258
18259
18260
18261
18262
18263
18264
18265
18266
18267
18268
18269
18270
18271
18272
18273
18274
18275
18276
18277
18278
18279
18280
18281
18282
18283
18284
18285
18286
18287
18288
18289
18290
18291
18292
18293
18294
18295
18296
18297
18298
18299
18300
18301
18302
18303
18304
18305
18306
18307
18308
18309
18310
18311
18312
18313
18314
18315
18316
18317
18318
18319
18320
18321
18322
18323
18324
18325
18326
18327
18328
18329
18330
18331
18332
18333
18334
18335
18336
18337
18338
18339
18340
18341
18342
18343
18344
18345
18346
18347
18348
18349
18350
18351
18352
18353
18354
18355
18356
18357
18358
18359
18360
18361
18362
18363
18364
18365
18366
18367
18368
18369
18370
18371
18372
18373
18374
18375
18376
18377
18378
18379
18380
18381
18382
18383
18384
18385
18386
18387
18388
18389
18390
18391
18392
18393
18394
18395
18396
18397
18398
18399
18400
18401
18402
18403
18404
18405
18406
18407
18408
18409
18410
18411
18412
18413
18414
18415
18416
18417
18418
18419
18420
18421
18422
18423
18424
18425
18426
18427
18428
18429
18430
18431
18432
18433
18434
18435
18436
18437
18438
18439
18440
18441
18442
18443
18444
18445
18446
18447
18448
18449
18450
18451
18452
18453
18454
18455
18456
18457
18458
18459
18460
18461
18462
18463
18464
18465
18466
18467
18468
18469
18470
18471
18472
18473
18474
18475
18476
18477
18478
18479
18480
18481
18482
18483
18484
18485
18486
18487
18488
18489
18490
18491
18492
18493
18494
18495
18496
18497
18498
18499
18500
18501
18502
18503
18504
18505
18506
18507
18508
18509
18510
18511
18512
18513
18514
18515
18516
18517
18518
18519
18520
18521
18522
18523
18524
18525
18526
18527
18528
18529
18530
18531
18532
18533
18534
18535
18536
18537
18538
18539
18540
18541
18542
18543
18544
18545
18546
18547
18548
18549
18550
18551
18552
18553
18554
18555
18556
18557
18558
18559
18560
18561
18562
18563
18564
18565
18566
18567
18568
18569
18570
18571
18572
18573
18574
18575
18576
18577
18578
18579
18580
18581
18582
18583
18584
18585
18586
18587
18588
18589
18590
18591
18592
18593
18594
18595
18596
18597
18598
18599
18600
18601
18602
18603
18604
18605
18606
18607
18608
18609
18610
18611
18612
18613
18614
18615
18616
18617
18618
18619
18620
18621
18622
18623
18624
18625
18626
18627
18628
18629
18630
18631
18632
18633
18634
18635
18636
18637
18638
18639
18640
18641
18642
18643
18644
18645
18646
18647
18648
18649
18650
18651
18652
18653
18654
18655
18656
18657
18658
18659
18660
18661
18662
18663
18664
18665
18666
18667
18668
18669
18670
18671
18672
18673
18674
18675
18676
18677
18678
18679
18680
18681
18682
18683
18684
18685
18686
18687
18688
18689
18690
18691
18692
18693
18694
18695
18696
18697
18698
18699
18700
18701
18702
18703
18704
18705
18706
18707
18708
18709
18710
18711
18712
18713
18714
18715
18716
18717
18718
18719
18720
18721
18722
18723
18724
18725
18726
18727
18728
18729
18730
18731
18732
18733
18734
18735
18736
18737
18738
18739
18740
18741
18742
18743
18744
18745
18746
18747
18748
18749
18750
18751
18752
18753
18754
18755
18756
18757
18758
18759
18760
18761
18762
18763
18764
18765
18766
18767
18768
18769
18770
18771
18772
18773
18774
18775
18776
18777
18778
18779
18780
18781
18782
18783
18784
18785
18786
18787
18788
18789
18790
18791
18792
18793
18794
18795
18796
18797
18798
18799
18800
18801
18802
18803
18804
18805
18806
18807
18808
18809
18810
18811
18812
18813
18814
18815
18816
18817
18818
18819
18820
18821
18822
18823
18824
18825
18826
18827
18828
18829
18830
18831
18832
18833
18834
18835
18836
18837
18838
18839
18840
18841
18842
18843
18844
18845
18846
18847
18848
18849
18850
18851
18852
18853
18854
18855
18856
18857
18858
18859
18860
18861
18862
18863
18864
18865
18866
18867
18868
18869
18870
18871
18872
18873
18874
18875
18876
18877
18878
18879
18880
18881
18882
18883
18884
18885
18886
18887
18888
18889
18890
18891
18892
18893
18894
18895
18896
18897
18898
18899
18900
18901
18902
18903
18904
18905
18906
18907
18908
18909
18910
18911
18912
18913
18914
18915
18916
18917
18918
18919
18920
18921
18922
18923
18924
18925
18926
18927
18928
18929
18930
18931
18932
18933
18934
18935
18936
18937
18938
18939
18940
18941
18942
18943
18944
18945
18946
18947
18948
18949
18950
18951
18952
18953
18954
18955
18956
18957
18958
18959
18960
18961
18962
18963
18964
18965
18966
18967
18968
18969
18970
18971
18972
18973
18974
18975
18976
18977
18978
18979
18980
18981
18982
18983
18984
18985
18986
18987
18988
18989
18990
18991
18992
18993
18994
18995
18996
18997
18998
18999
19000
19001
19002
19003
19004
19005
19006
19007
19008
19009
19010
19011
19012
19013
19014
19015
19016
19017
19018
19019
19020
19021
19022
19023
19024
19025
19026
19027
19028
19029
19030
19031
19032
19033
19034
19035
19036
19037
19038
19039
19040
19041
19042
19043
19044
19045
19046
19047
19048
19049
19050
19051
19052
19053
19054
19055
19056
19057
19058
19059
19060
19061
19062
19063
19064
19065
19066
19067
19068
19069
19070
19071
19072
19073
19074
19075
19076
19077
19078
19079
19080
19081
19082
19083
19084
19085
19086
19087
19088
19089
19090
19091
19092
19093
19094
19095
19096
19097
19098
19099
19100
19101
19102
19103
19104
19105
19106
19107
19108
19109
19110
19111
19112
19113
19114
19115
19116
19117
19118
19119
19120
19121
19122
19123
19124
19125
19126
19127
19128
19129
19130
19131
19132
19133
19134
19135
19136
19137
19138
19139
19140
19141
19142
19143
19144
19145
19146
19147
19148
19149
19150
19151
19152
19153
19154
19155
19156
19157
19158
19159
19160
19161
19162
19163
19164
19165
19166
19167
19168
19169
19170
19171
19172
19173
19174
19175
19176
19177
19178
19179
19180
19181
19182
19183
19184
19185
19186
19187
19188
19189
19190
19191
19192
19193
19194
19195
19196
19197
19198
19199
19200
19201
19202
19203
19204
19205
19206
19207
19208
19209
19210
19211
19212
19213
19214
19215
19216
19217
19218
19219
19220
19221
19222
19223
19224
19225
19226
19227
19228
19229
19230
19231
19232
19233
19234
19235
19236
19237
19238
19239
19240
19241
19242
19243
19244
19245
19246
19247
19248
19249
19250
19251
19252
19253
19254
19255
19256
19257
19258
19259
19260
19261
19262
19263
19264
19265
19266
19267
19268
19269
19270
19271
19272
19273
19274
19275
19276
19277
19278
19279
19280
19281
19282
19283
19284
19285
19286
19287
19288
19289
19290
19291
19292
19293
19294
19295
19296
19297
19298
19299
19300
19301
19302
19303
19304
19305
19306
19307
19308
19309
19310
19311
19312
19313
19314
19315
19316
19317
19318
19319
19320
19321
19322
19323
19324
19325
19326
19327
19328
19329
19330
19331
19332
19333
19334
19335
19336
19337
19338
19339
19340
19341
19342
19343
19344
19345
19346
19347
19348
19349
19350
19351
19352
19353
19354
19355
19356
19357
19358
19359
19360
19361
19362
19363
19364
19365
19366
19367
19368
19369
19370
19371
19372
19373
19374
19375
19376
19377
19378
19379
19380
19381
19382
19383
19384
19385
19386
19387
19388
19389
19390
19391
19392
19393
19394
19395
19396
19397
19398
19399
19400
19401
19402
19403
19404
19405
19406
19407
19408
19409
19410
19411
19412
19413
19414
19415
19416
19417
19418
19419
19420
19421
19422
19423
19424
19425
19426
19427
19428
19429
19430
19431
19432
19433
19434
19435
19436
19437
19438
19439
19440
19441
19442
19443
19444
19445
19446
19447
19448
19449
19450
19451
19452
19453
19454
19455
19456
19457
19458
19459
19460
19461
19462
19463
19464
19465
19466
19467
19468
19469
19470
19471
19472
19473
19474
19475
19476
19477
19478
19479
19480
19481
19482
19483
19484
19485
19486
19487
19488
19489
19490
19491
19492
19493
19494
19495
19496
19497
19498
19499
19500
19501
19502
19503
19504
19505
19506
19507
19508
19509
19510
19511
19512
19513
19514
19515
19516
19517
19518
19519
19520
19521
19522
19523
19524
19525
19526
19527
19528
19529
19530
19531
19532
19533
19534
19535
19536
19537
19538
19539
19540
19541
19542
19543
19544
19545
19546
19547
19548
19549
19550
19551
19552
19553
19554
19555
19556
19557
19558
19559
19560
19561
19562
19563
19564
19565
19566
19567
19568
19569
19570
19571
19572
19573
19574
19575
19576
19577
19578
19579
19580
19581
19582
19583
19584
19585
19586
19587
19588
19589
19590
19591
19592
19593
19594
19595
19596
19597
19598
19599
19600
19601
19602
19603
19604
19605
19606
19607
19608
19609
19610
19611
19612
19613
19614
19615
19616
19617
19618
19619
19620
19621
19622
19623
19624
19625
19626
19627
19628
19629
19630
19631
19632
19633
19634
19635
19636
19637
19638
19639
19640
19641
19642
19643
19644
19645
19646
19647
19648
19649
19650
19651
19652
19653
19654
19655
19656
19657
19658
19659
19660
19661
19662
19663
19664
19665
19666
19667
19668
19669
19670
19671
19672
19673
19674
19675
19676
19677
19678
19679
19680
19681
19682
19683
19684
19685
19686
19687
19688
19689
19690
19691
19692
19693
19694
19695
19696
19697
19698
19699
19700
19701
19702
19703
19704
19705
19706
19707
19708
19709
19710
19711
19712
19713
19714
19715
19716
19717
19718
19719
19720
19721
19722
19723
19724
19725
19726
19727
19728
19729
19730
19731
19732
19733
19734
19735
19736
19737
19738
19739
19740
19741
19742
19743
19744
19745
19746
19747
19748
19749
19750
19751
19752
19753
19754
19755
19756
19757
19758
19759
19760
19761
19762
19763
19764
19765
19766
19767
19768
19769
19770
19771
19772
19773
19774
19775
19776
19777
19778
19779
19780
19781
19782
19783
19784
19785
19786
19787
19788
19789
19790
19791
19792
19793
19794
19795
19796
19797
19798
19799
19800
19801
19802
19803
19804
19805
19806
19807
19808
19809
19810
19811
19812
19813
19814
19815
19816
19817
19818
19819
19820
19821
19822
19823
19824
19825
19826
19827
19828
19829
19830
19831
19832
19833
19834
19835
19836
19837
19838
19839
19840
19841
19842
19843
19844
19845
19846
19847
19848
19849
19850
19851
19852
19853
19854
19855
19856
19857
19858
19859
19860
19861
19862
19863
19864
19865
19866
19867
19868
19869
19870
19871
19872
19873
19874
19875
19876
19877
19878
19879
19880
19881
19882
19883
19884
19885
19886
19887
19888
19889
19890
19891
19892
19893
19894
19895
19896
19897
19898
19899
19900
19901
19902
19903
19904
19905
19906
19907
19908
19909
19910
19911
19912
19913
19914
19915
19916
19917
19918
19919
19920
19921
19922
19923
19924
19925
19926
19927
19928
19929
19930
19931
19932
19933
19934
19935
19936
19937
19938
19939
19940
19941
19942
19943
19944
19945
19946
19947
19948
19949
19950
19951
19952
19953
19954
19955
19956
19957
19958
19959
19960
19961
19962
19963
19964
19965
19966
19967
19968
19969
19970
19971
19972
19973
19974
19975
19976
19977
19978
19979
19980
19981
19982
19983
19984
19985
19986
19987
19988
19989
19990
19991
19992
19993
19994
19995
19996
19997
19998
19999
20000
20001
20002
20003
20004
20005
20006
20007
20008
20009
20010
20011
20012
20013
20014
20015
20016
20017
20018
20019
20020
20021
20022
20023
20024
20025
20026
20027
20028
20029
20030
20031
20032
20033
20034
20035
20036
20037
20038
20039
20040
20041
20042
20043
20044
20045
20046
20047
20048
20049
20050
20051
20052
20053
20054
20055
20056
20057
20058
20059
20060
20061
20062
20063
20064
20065
20066
20067
20068
20069
20070
20071
20072
20073
20074
20075
20076
20077
20078
20079
20080
20081
20082
20083
20084
20085
20086
20087
20088
20089
20090
20091
20092
20093
20094
20095
20096
20097
20098
20099
20100
20101
20102
20103
20104
20105
20106
20107
20108
20109
20110
20111
20112
20113
20114
20115
20116
20117
20118
20119
20120
20121
20122
20123
20124
20125
20126
20127
20128
20129
20130
20131
20132
20133
20134
20135
20136
20137
20138
20139
20140
20141
20142
20143
20144
20145
20146
20147
20148
20149
20150
20151
20152
20153
20154
20155
20156
20157
20158
20159
20160
20161
20162
20163
20164
20165
20166
20167
20168
20169
20170
20171
20172
20173
20174
20175
20176
20177
20178
20179
20180
20181
20182
20183
20184
20185
20186
20187
20188
20189
20190
20191
20192
20193
20194
20195
20196
20197
20198
20199
20200
20201
20202
20203
20204
20205
20206
20207
20208
20209
20210
20211
20212
20213
20214
20215
20216
20217
20218
20219
20220
20221
20222
20223
20224
20225
20226
20227
20228
20229
20230
20231
20232
20233
20234
20235
20236
20237
20238
20239
20240
20241
20242
20243
20244
20245
20246
20247
20248
20249
20250
20251
20252
20253
20254
20255
20256
20257
20258
20259
20260
20261
20262
20263
20264
20265
20266
20267
20268
20269
20270
20271
20272
20273
20274
20275
20276
20277
20278
20279
20280
20281
20282
20283
20284
20285
20286
20287
20288
20289
20290
20291
20292
20293
20294
20295
20296
20297
20298
20299
20300
20301
20302
20303
20304
20305
20306
20307
20308
20309
20310
20311
20312
20313
20314
20315
20316
20317
20318
20319
20320
20321
20322
20323
20324
20325
20326
20327
20328
20329
20330
20331
20332
20333
20334
20335
20336
20337
20338
20339
20340
20341
20342
20343
20344
20345
20346
20347
20348
20349
20350
20351
20352
20353
20354
20355
20356
20357
20358
20359
20360
20361
20362
20363
20364
20365
20366
20367
20368
20369
20370
20371
20372
20373
20374
20375
20376
20377
20378
20379
20380
20381
20382
20383
20384
20385
20386
20387
20388
20389
20390
20391
20392
20393
20394
20395
20396
20397
20398
20399
20400
20401
20402
20403
20404
20405
20406
20407
20408
20409
20410
20411
20412
20413
20414
20415
20416
20417
20418
20419
20420
20421
20422
20423
20424
20425
20426
20427
20428
20429
20430
20431
20432
20433
20434
20435
20436
20437
20438
20439
20440
20441
20442
20443
20444
20445
20446
20447
20448
20449
20450
20451
20452
20453
20454
20455
20456
20457
20458
20459
20460
20461
20462
20463
20464
20465
20466
20467
20468
20469
20470
20471
20472
20473
20474
20475
20476
20477
20478
20479
20480
20481
20482
20483
20484
20485
20486
20487
20488
20489
20490
20491
20492
20493
20494
20495
20496
20497
20498
20499
20500
20501
20502
20503
20504
20505
20506
20507
20508
20509
20510
20511
20512
20513
20514
20515
20516
20517
20518
20519
20520
20521
20522
20523
20524
20525
20526
20527
20528
20529
20530
20531
20532
20533
20534
20535
20536
20537
20538
20539
20540
20541
20542
20543
20544
20545
20546
20547
20548
20549
20550
20551
20552
20553
20554
20555
20556
20557
20558
20559
20560
20561
20562
20563
20564
20565
20566
20567
20568
20569
20570
20571
20572
20573
20574
20575
20576
20577
20578
20579
20580
20581
20582
20583
20584
20585
20586
20587
20588
20589
20590
20591
20592
20593
20594
20595
20596
20597
20598
20599
20600
20601
20602
20603
20604
20605
20606
20607
20608
20609
20610
20611
20612
20613
20614
20615
20616
20617
20618
20619
20620
20621
20622
20623
20624
20625
20626
20627
20628
20629
20630
20631
20632
20633
20634
20635
20636
20637
20638
20639
20640
20641
20642
20643
20644
20645
20646
20647
20648
20649
20650
20651
20652
20653
20654
20655
20656
20657
20658
20659
20660
20661
20662
20663
20664
20665
20666
20667
20668
20669
20670
20671
20672
20673
20674
20675
20676
20677
20678
20679
20680
20681
20682
20683
20684
20685
20686
20687
20688
20689
20690
20691
20692
20693
20694
20695
20696
20697
20698
20699
20700
20701
20702
20703
20704
20705
20706
20707
20708
20709
20710
20711
20712
20713
20714
20715
20716
20717
20718
20719
20720
20721
20722
20723
20724
20725
20726
20727
20728
20729
20730
20731
20732
20733
20734
20735
20736
20737
20738
20739
20740
20741
20742
20743
20744
20745
20746
20747
20748
20749
20750
20751
20752
20753
20754
20755
20756
20757
20758
20759
20760
20761
20762
20763
20764
20765
20766
20767
20768
20769
20770
20771
20772
20773
20774
20775
20776
20777
20778
20779
20780
20781
20782
20783
20784
20785
20786
20787
20788
20789
20790
20791
20792
20793
20794
20795
20796
20797
20798
20799
20800
20801
20802
20803
20804
20805
20806
20807
20808
20809
20810
20811
20812
20813
20814
20815
20816
20817
20818
20819
20820
20821
20822
20823
20824
20825
20826
20827
20828
20829
20830
20831
20832
20833
20834
20835
20836
20837
20838
20839
20840
20841
20842
20843
20844
20845
20846
20847
20848
20849
20850
20851
20852
20853
20854
20855
20856
20857
20858
20859
20860
20861
20862
20863
20864
20865
20866
20867
20868
20869
20870
20871
20872
20873
20874
20875
20876
20877
20878
20879
20880
20881
20882
20883
20884
20885
20886
20887
20888
20889
20890
20891
20892
20893
20894
20895
20896
20897
20898
20899
20900
20901
20902
20903
20904
20905
20906
20907
20908
20909
20910
20911
20912
20913
20914
20915
20916
20917
20918
20919
20920
20921
20922
20923
20924
20925
20926
20927
20928
20929
20930
20931
20932
20933
20934
20935
20936
20937
20938
20939
20940
20941
20942
20943
20944
20945
20946
20947
20948
20949
20950
20951
20952
20953
20954
20955
20956
20957
20958
20959
20960
20961
20962
20963
20964
20965
20966
20967
20968
20969
20970
20971
20972
20973
20974
20975
20976
20977
20978
20979
20980
20981
20982
20983
20984
20985
20986
20987
20988
20989
20990
20991
20992
20993
20994
20995
20996
20997
20998
20999
21000
21001
21002
21003
21004
21005
21006
21007
21008
21009
21010
21011
21012
21013
21014
21015
21016
21017
21018
21019
21020
21021
21022
21023
21024
21025
21026
21027
21028
21029
21030
21031
21032
21033
21034
21035
21036
21037
21038
21039
21040
21041
21042
21043
21044
21045
21046
21047
21048
21049
21050
21051
21052
21053
21054
21055
21056
21057
21058
21059
21060
21061
21062
21063
21064
21065
21066
21067
21068
21069
21070
21071
21072
21073
21074
21075
21076
21077
21078
21079
21080
21081
21082
21083
21084
21085
21086
21087
21088
21089
21090
21091
21092
21093
21094
21095
21096
21097
21098
21099
21100
21101
21102
21103
21104
21105
21106
21107
21108
21109
21110
21111
21112
21113
21114
21115
21116
21117
21118
21119
21120
21121
21122
21123
21124
21125
21126
21127
21128
21129
21130
21131
21132
21133
21134
21135
21136
21137
21138
21139
21140
21141
21142
21143
21144
21145
21146
21147
21148
21149
21150
21151
21152
21153
21154
21155
21156
21157
21158
21159
21160
21161
21162
21163
21164
21165
21166
21167
21168
21169
21170
21171
21172
21173
21174
21175
21176
21177
21178
21179
21180
21181
21182
21183
21184
21185
21186
21187
21188
21189
21190
21191
21192
21193
21194
21195
21196
21197
21198
21199
21200
21201
21202
21203
21204
21205
21206
21207
21208
21209
21210
21211
21212
21213
21214
21215
21216
21217
21218
21219
21220
21221
21222
21223
21224
21225
21226
21227
21228
21229
21230
21231
21232
21233
21234
21235
21236
21237
21238
21239
21240
21241
21242
21243
21244
21245
21246
21247
21248
21249
21250
21251
21252
21253
21254
21255
21256
21257
21258
21259
21260
21261
21262
21263
21264
21265
21266
21267
21268
21269
21270
21271
21272
21273
21274
21275
21276
21277
21278
21279
21280
21281
21282
21283
21284
21285
21286
21287
21288
21289
21290
21291
21292
21293
21294
21295
21296
21297
21298
21299
21300
21301
21302
21303
21304
21305
21306
21307
21308
21309
21310
21311
21312
21313
21314
21315
21316
21317
21318
21319
21320
21321
21322
21323
21324
21325
21326
21327
21328
21329
21330
21331
21332
21333
21334
21335
21336
21337
21338
21339
21340
21341
21342
21343
21344
21345
21346
21347
21348
21349
21350
21351
21352
21353
21354
21355
21356
21357
21358
21359
21360
21361
21362
21363
21364
21365
21366
21367
21368
21369
21370
21371
21372
21373
21374
21375
21376
21377
21378
21379
21380
21381
21382
21383
21384
21385
21386
21387
21388
21389
21390
21391
21392
21393
21394
21395
21396
21397
21398
21399
21400
21401
21402
21403
21404
21405
21406
21407
21408
21409
21410
21411
21412
21413
21414
21415
21416
21417
21418
21419
21420
21421
21422
21423
21424
21425
21426
21427
21428
21429
21430
21431
21432
21433
21434
21435
21436
21437
21438
21439
21440
21441
21442
21443
21444
21445
21446
21447
21448
21449
21450
21451
21452
21453
21454
21455
21456
21457
21458
21459
21460
21461
21462
21463
21464
21465
21466
21467
21468
21469
21470
21471
21472
21473
21474
21475
21476
21477
21478
21479
21480
21481
21482
21483
21484
21485
21486
21487
21488
21489
21490
21491
21492
21493
21494
21495
21496
21497
21498
21499
21500
21501
21502
21503
21504
21505
21506
21507
21508
21509
21510
21511
21512
21513
21514
21515
21516
21517
21518
21519
21520
21521
21522
21523
21524
21525
21526
21527
21528
21529
21530
21531
21532
21533
21534
21535
21536
21537
21538
21539
21540
21541
21542
21543
21544
21545
21546
21547
21548
21549
21550
21551
21552
21553
21554
21555
21556
21557
21558
21559
21560
21561
21562
21563
21564
21565
21566
21567
21568
21569
21570
21571
21572
21573
21574
21575
21576
21577
21578
21579
21580
21581
21582
21583
21584
21585
21586
21587
21588
21589
21590
21591
21592
21593
21594
21595
21596
21597
21598
21599
21600
21601
21602
21603
21604
21605
21606
21607
21608
21609
21610
21611
21612
21613
21614
21615
21616
21617
21618
21619
21620
21621
21622
21623
21624
21625
21626
21627
21628
21629
21630
21631
21632
21633
21634
21635
21636
21637
21638
21639
21640
21641
21642
21643
21644
21645
21646
21647
21648
21649
21650
21651
21652
21653
21654
21655
21656
21657
21658
21659
21660
21661
21662
21663
21664
21665
21666
21667
21668
21669
21670
21671
21672
21673
21674
21675
21676
21677
21678
21679
21680
21681
21682
21683
21684
21685
21686
21687
21688
21689
21690
21691
21692
21693
21694
21695
21696
21697
21698
21699
21700
21701
21702
21703
21704
21705
21706
21707
21708
21709
21710
21711
21712
21713
21714
21715
21716
21717
21718
21719
21720
21721
21722
21723
21724
21725
21726
21727
21728
21729
21730
21731
21732
21733
21734
21735
21736
21737
21738
21739
21740
21741
21742
21743
21744
21745
21746
21747
21748
21749
21750
21751
21752
21753
21754
21755
21756
21757
21758
21759
21760
21761
21762
21763
21764
21765
21766
21767
21768
21769
21770
21771
21772
21773
21774
21775
21776
21777
21778
21779
21780
21781
21782
21783
21784
21785
21786
21787
21788
21789
21790
21791
21792
21793
21794
21795
21796
21797
21798
21799
21800
21801
21802
21803
21804
21805
21806
21807
21808
21809
21810
21811
21812
21813
21814
21815
21816
21817
21818
21819
21820
21821
21822
21823
21824
21825
21826
21827
21828
21829
21830
21831
21832
21833
21834
21835
21836
21837
21838
21839
21840
21841
21842
21843
21844
21845
21846
21847
21848
21849
21850
21851
21852
21853
21854
21855
21856
21857
21858
21859
21860
21861
21862
21863
21864
21865
21866
21867
21868
21869
21870
21871
21872
21873
21874
21875
21876
21877
21878
21879
21880
21881
21882
21883
21884
21885
21886
21887
21888
21889
21890
21891
21892
21893
21894
21895
21896
21897
21898
21899
21900
21901
21902
21903
21904
21905
21906
21907
21908
21909
21910
21911
21912
21913
21914
21915
21916
21917
21918
21919
21920
21921
21922
21923
21924
21925
21926
21927
21928
21929
21930
21931
21932
21933
21934
21935
21936
21937
21938
21939
21940
21941
21942
21943
21944
21945
21946
21947
21948
21949
21950
21951
21952
21953
21954
21955
21956
21957
21958
21959
21960
21961
21962
21963
21964
21965
21966
21967
21968
21969
21970
21971
21972
21973
21974
21975
21976
21977
21978
21979
21980
21981
21982
21983
21984
21985
21986
21987
21988
21989
21990
21991
21992
21993
21994
21995
21996
21997
21998
21999
22000
22001
22002
22003
22004
22005
22006
22007
22008
22009
22010
22011
22012
22013
22014
22015
22016
22017
22018
22019
22020
22021
22022
22023
22024
22025
22026
22027
22028
22029
22030
22031
22032
22033
22034
22035
22036
22037
22038
22039
22040
22041
22042
22043
22044
22045
22046
22047
22048
22049
22050
22051
22052
22053
22054
22055
22056
22057
22058
22059
22060
22061
22062
22063
22064
22065
22066
22067
22068
22069
22070
22071
22072
22073
22074
22075
22076
22077
22078
22079
22080
22081
22082
22083
22084
22085
22086
22087
22088
22089
22090
22091
22092
22093
22094
22095
22096
22097
22098
22099
22100
22101
22102
22103
22104
22105
22106
22107
22108
22109
22110
22111
22112
22113
22114
22115
22116
22117
22118
22119
22120
22121
22122
22123
22124
22125
22126
22127
22128
22129
22130
22131
22132
22133
22134
22135
22136
22137
22138
22139
22140
22141
22142
22143
22144
22145
22146
22147
22148
22149
22150
22151
22152
22153
22154
22155
22156
22157
22158
22159
22160
22161
22162
22163
22164
22165
22166
22167
22168
22169
22170
22171
22172
22173
22174
22175
22176
22177
22178
22179
22180
22181
22182
22183
22184
22185
22186
22187
22188
22189
22190
22191
22192
22193
22194
22195
22196
22197
22198
22199
22200
22201
22202
22203
22204
22205
22206
22207
22208
22209
22210
22211
22212
22213
22214
22215
22216
22217
22218
22219
22220
22221
22222
22223
22224
22225
22226
22227
22228
22229
22230
22231
22232
22233
22234
22235
22236
22237
22238
22239
22240
22241
22242
22243
22244
22245
22246
22247
22248
22249
22250
22251
22252
22253
22254
22255
22256
22257
22258
22259
22260
22261
22262
22263
22264
22265
22266
22267
22268
22269
22270
22271
22272
22273
22274
22275
22276
22277
22278
22279
22280
22281
22282
22283
22284
22285
22286
22287
22288
22289
22290
22291
22292
22293
22294
22295
22296
22297
22298
22299
22300
22301
22302
22303
22304
22305
22306
22307
22308
22309
22310
22311
22312
22313
22314
22315
22316
22317
22318
22319
22320
22321
22322
22323
22324
22325
22326
22327
22328
22329
22330
22331
22332
22333
22334
22335
22336
22337
22338
22339
22340
22341
22342
22343
22344
22345
22346
22347
22348
22349
22350
22351
22352
22353
22354
22355
22356
22357
22358
22359
22360
22361
22362
22363
22364
22365
22366
22367
22368
22369
22370
22371
22372
22373
22374
22375
22376
22377
22378
22379
22380
22381
22382
22383
22384
22385
22386
22387
22388
22389
22390
22391
22392
22393
22394
22395
22396
22397
22398
22399
22400
22401
22402
22403
22404
22405
22406
22407
22408
22409
22410
22411
22412
22413
22414
22415
22416
22417
22418
22419
22420
22421
22422
22423
22424
22425
22426
22427
22428
22429
22430
22431
22432
22433
22434
22435
22436
22437
22438
22439
22440
22441
22442
22443
22444
22445
22446
22447
22448
22449
22450
22451
22452
22453
22454
22455
22456
22457
22458
22459
22460
22461
22462
22463
22464
22465
22466
22467
22468
22469
22470
22471
22472
22473
22474
22475
22476
22477
22478
22479
22480
22481
22482
22483
22484
22485
22486
22487
22488
22489
22490
22491
22492
22493
22494
22495
22496
22497
22498
22499
22500
22501
22502
22503
22504
22505
22506
22507
22508
22509
22510
22511
22512
22513
22514
22515
22516
22517
22518
22519
22520
22521
22522
22523
22524
22525
22526
22527
22528
22529
22530
22531
22532
22533
22534
22535
22536
22537
22538
22539
22540
22541
22542
22543
22544
22545
22546
22547
22548
22549
22550
22551
22552
22553
22554
22555
22556
22557
22558
22559
22560
22561
22562
22563
22564
22565
22566
22567
22568
22569
22570
22571
22572
22573
22574
22575
22576
22577
22578
22579
22580
22581
22582
22583
22584
22585
22586
22587
22588
22589
22590
22591
22592
22593
22594
22595
22596
22597
22598
22599
22600
22601
22602
22603
22604
22605
22606
22607
22608
22609
22610
22611
22612
22613
22614
22615
22616
22617
22618
22619
22620
22621
22622
22623
22624
22625
22626
22627
22628
22629
22630
22631
22632
22633
22634
22635
22636
22637
22638
22639
22640
22641
22642
22643
22644
22645
22646
22647
22648
22649
22650
22651
22652
22653
22654
22655
22656
22657
22658
22659
22660
22661
22662
22663
22664
22665
22666
22667
22668
22669
22670
22671
22672
22673
22674
22675
22676
22677
22678
22679
22680
22681
22682
22683
22684
22685
22686
22687
22688
22689
22690
22691
22692
22693
22694
22695
22696
22697
22698
22699
22700
22701
22702
22703
22704
22705
22706
22707
22708
22709
22710
22711
22712
22713
22714
22715
22716
22717
22718
22719
22720
22721
22722
22723
22724
22725
22726
22727
22728
22729
22730
22731
22732
22733
22734
22735
22736
22737
22738
22739
22740
22741
22742
22743
22744
22745
22746
22747
22748
22749
22750
22751
22752
22753
22754
22755
22756
22757
22758
22759
22760
22761
22762
22763
22764
22765
22766
22767
22768
22769
22770
22771
22772
22773
22774
22775
22776
22777
22778
22779
22780
22781
22782
22783
22784
22785
22786
22787
22788
22789
22790
22791
22792
22793
22794
22795
22796
22797
22798
22799
22800
22801
22802
22803
22804
22805
22806
22807
22808
22809
22810
22811
22812
22813
22814
22815
22816
22817
22818
22819
22820
22821
22822
22823
22824
22825
22826
22827
22828
22829
22830
22831
22832
22833
22834
22835
22836
22837
22838
22839
22840
22841
22842
22843
22844
22845
22846
22847
22848
22849
22850
22851
22852
22853
22854
22855
22856
22857
22858
22859
22860
22861
22862
22863
22864
22865
22866
22867
22868
22869
22870
22871
22872
22873
22874
22875
22876
22877
22878
22879
22880
22881
22882
22883
22884
22885
22886
22887
22888
22889
22890
22891
22892
22893
22894
22895
22896
22897
22898
22899
22900
22901
22902
22903
22904
22905
22906
22907
22908
22909
22910
22911
22912
22913
22914
22915
22916
22917
22918
22919
22920
22921
22922
22923
22924
22925
22926
22927
22928
22929
22930
22931
22932
22933
22934
22935
22936
22937
22938
22939
22940
22941
22942
22943
22944
22945
22946
22947
22948
22949
22950
22951
22952
22953
22954
22955
22956
22957
22958
22959
22960
22961
22962
22963
22964
22965
22966
22967
22968
22969
22970
22971
22972
22973
22974
22975
22976
22977
22978
22979
22980
22981
22982
22983
22984
22985
22986
22987
22988
22989
22990
22991
22992
22993
22994
22995
22996
22997
22998
22999
23000
23001
23002
23003
23004
23005
23006
23007
23008
23009
23010
23011
23012
23013
23014
23015
23016
23017
23018
23019
23020
23021
23022
23023
23024
23025
23026
23027
23028
23029
23030
23031
23032
23033
23034
23035
23036
23037
23038
23039
23040
23041
23042
23043
23044
23045
23046
23047
23048
23049
23050
23051
23052
23053
23054
23055
23056
23057
23058
23059
23060
23061
23062
23063
23064
23065
23066
23067
23068
23069
23070
23071
23072
23073
23074
23075
23076
23077
23078
23079
23080
23081
23082
23083
23084
23085
23086
23087
23088
23089
23090
23091
23092
23093
23094
23095
23096
23097
23098
23099
23100
23101
23102
23103
23104
23105
23106
23107
23108
23109
23110
23111
23112
23113
23114
23115
23116
23117
23118
23119
23120
23121
23122
23123
23124
23125
23126
23127
23128
23129
23130
23131
23132
23133
23134
23135
23136
23137
23138
23139
23140
23141
23142
23143
23144
23145
23146
23147
23148
23149
23150
23151
23152
23153
23154
23155
23156
23157
23158
23159
23160
23161
23162
23163
23164
23165
23166
23167
23168
23169
23170
23171
23172
23173
23174
23175
23176
23177
23178
23179
23180
23181
23182
23183
23184
23185
23186
23187
23188
23189
23190
23191
23192
23193
23194
23195
23196
23197
23198
23199
23200
23201
23202
23203
23204
23205
23206
23207
23208
23209
23210
23211
23212
23213
23214
23215
23216
23217
23218
23219
23220
23221
23222
23223
23224
23225
23226
23227
23228
23229
23230
23231
23232
23233
23234
23235
23236
23237
23238
23239
23240
23241
23242
23243
23244
23245
23246
23247
23248
23249
23250
23251
23252
23253
23254
23255
23256
23257
23258
23259
23260
23261
23262
23263
23264
23265
23266
23267
23268
23269
23270
23271
23272
23273
23274
23275
23276
23277
23278
23279
23280
23281
23282
23283
23284
23285
23286
23287
23288
23289
23290
23291
23292
23293
23294
23295
23296
23297
23298
23299
23300
23301
23302
23303
23304
23305
23306
23307
23308
23309
23310
23311
23312
23313
23314
23315
23316
23317
23318
23319
23320
23321
23322
23323
23324
23325
23326
23327
23328
23329
23330
23331
23332
23333
23334
23335
23336
23337
23338
23339
23340
23341
23342
23343
23344
23345
23346
23347
23348
23349
23350
23351
23352
23353
23354
23355
23356
23357
23358
23359
23360
23361
23362
23363
23364
23365
23366
23367
23368
23369
23370
23371
23372
23373
23374
23375
23376
23377
23378
23379
23380
23381
23382
23383
23384
23385
23386
23387
23388
23389
23390
23391
23392
23393
23394
23395
23396
23397
23398
23399
23400
23401
23402
23403
23404
23405
23406
23407
23408
23409
23410
23411
23412
23413
23414
23415
23416
23417
23418
23419
23420
23421
23422
23423
23424
23425
23426
23427
23428
23429
23430
23431
23432
23433
23434
23435
23436
23437
23438
23439
23440
23441
23442
23443
23444
23445
23446
23447
23448
23449
23450
23451
23452
23453
23454
23455
23456
23457
23458
23459
23460
23461
23462
23463
23464
23465
23466
23467
23468
23469
23470
23471
23472
23473
23474
23475
23476
23477
23478
23479
23480
23481
23482
23483
23484
23485
23486
23487
23488
23489
23490
23491
23492
23493
23494
23495
23496
23497
23498
23499
23500
23501
23502
23503
23504
23505
23506
23507
23508
23509
23510
23511
23512
23513
23514
23515
23516
23517
23518
23519
23520
23521
23522
23523
23524
23525
23526
23527
23528
23529
23530
23531
23532
23533
23534
23535
23536
23537
23538
23539
23540
23541
23542
23543
23544
23545
23546
23547
23548
23549
23550
23551
23552
23553
23554
23555
23556
23557
23558
23559
23560
23561
23562
23563
23564
23565
23566
23567
23568
23569
23570
23571
23572
23573
23574
23575
23576
23577
23578
23579
23580
23581
23582
23583
23584
23585
23586
23587
23588
23589
23590
23591
23592
23593
23594
23595
23596
23597
23598
23599
23600
23601
23602
23603
23604
23605
23606
23607
23608
23609
23610
23611
23612
23613
23614
23615
23616
23617
23618
23619
23620
23621
23622
23623
23624
23625
23626
23627
23628
23629
23630
23631
23632
23633
23634
23635
23636
23637
23638
23639
23640
23641
23642
23643
23644
23645
23646
23647
23648
23649
23650
23651
23652
23653
23654
23655
23656
23657
23658
23659
23660
23661
23662
23663
23664
23665
23666
23667
23668
23669
23670
23671
23672
23673
23674
23675
23676
23677
23678
23679
23680
23681
23682
23683
23684
23685
23686
23687
23688
23689
23690
23691
23692
23693
23694
23695
23696
23697
23698
23699
23700
23701
23702
23703
23704
23705
23706
23707
23708
23709
23710
23711
23712
23713
23714
23715
23716
23717
23718
23719
23720
23721
23722
23723
23724
23725
23726
23727
23728
23729
23730
23731
23732
23733
23734
23735
23736
23737
23738
23739
23740
23741
23742
23743
23744
23745
23746
23747
23748
23749
23750
23751
23752
23753
23754
23755
23756
23757
23758
23759
23760
23761
23762
23763
23764
23765
23766
23767
23768
23769
23770
23771
23772
23773
23774
23775
23776
23777
23778
23779
23780
23781
23782
23783
23784
23785
23786
23787
23788
23789
23790
23791
23792
23793
23794
23795
23796
23797
23798
23799
23800
23801
23802
23803
23804
23805
23806
23807
23808
23809
23810
23811
23812
23813
23814
23815
23816
23817
23818
23819
23820
23821
23822
23823
23824
23825
23826
23827
23828
23829
23830
23831
23832
23833
23834
23835
23836
23837
23838
23839
23840
23841
23842
23843
23844
23845
23846
23847
23848
23849
23850
23851
23852
23853
23854
23855
23856
23857
23858
23859
23860
23861
23862
23863
23864
23865
23866
23867
23868
23869
23870
23871
23872
23873
23874
23875
23876
23877
23878
23879
23880
23881
23882
23883
23884
23885
23886
23887
23888
23889
23890
23891
23892
23893
23894
23895
23896
23897
23898
23899
23900
23901
23902
23903
23904
23905
23906
23907
23908
23909
23910
23911
23912
23913
23914
23915
23916
23917
23918
23919
23920
23921
23922
23923
23924
23925
23926
23927
23928
23929
23930
23931
23932
23933
23934
23935
23936
23937
23938
23939
23940
23941
23942
23943
23944
23945
23946
23947
23948
23949
23950
23951
23952
23953
23954
23955
23956
23957
23958
23959
23960
23961
23962
23963
23964
23965
23966
23967
23968
23969
23970
23971
23972
23973
23974
23975
23976
23977
23978
23979
23980
23981
23982
23983
23984
23985
23986
23987
23988
23989
23990
23991
23992
23993
23994
23995
23996
23997
23998
23999
24000
24001
24002
24003
24004
24005
24006
24007
24008
24009
24010
24011
24012
24013
24014
24015
24016
24017
24018
24019
24020
24021
24022
24023
24024
24025
24026
24027
24028
24029
24030
24031
24032
24033
24034
24035
24036
24037
24038
24039
24040
24041
24042
24043
24044
24045
24046
24047
24048
24049
24050
24051
24052
24053
24054
24055
24056
24057
24058
24059
24060
24061
24062
24063
24064
24065
24066
24067
24068
24069
24070
24071
24072
24073
24074
24075
24076
24077
24078
24079
24080
24081
24082
24083
24084
24085
24086
24087
24088
24089
24090
24091
24092
24093
24094
24095
24096
24097
24098
24099
24100
24101
24102
24103
24104
24105
24106
24107
24108
24109
24110
24111
24112
24113
24114
24115
24116
24117
24118
24119
24120
24121
24122
24123
24124
24125
24126
24127
24128
24129
24130
24131
24132
24133
24134
24135
24136
24137
24138
24139
24140
24141
24142
24143
24144
24145
24146
24147
24148
24149
24150
24151
24152
24153
24154
24155
24156
24157
24158
24159
24160
24161
24162
24163
24164
24165
24166
24167
24168
24169
24170
24171
24172
24173
24174
24175
24176
24177
24178
24179
24180
24181
24182
24183
24184
24185
24186
24187
24188
24189
24190
24191
24192
24193
24194
24195
24196
24197
24198
24199
24200
24201
24202
24203
24204
24205
24206
24207
24208
24209
24210
24211
24212
24213
24214
24215
24216
24217
24218
24219
24220
24221
24222
24223
24224
24225
24226
24227
24228
24229
24230
24231
24232
24233
24234
24235
24236
24237
24238
24239
24240
24241
24242
24243
24244
24245
24246
24247
24248
24249
24250
24251
24252
24253
24254
24255
24256
24257
24258
24259
24260
24261
24262
24263
24264
24265
24266
24267
24268
24269
24270
24271
24272
24273
24274
24275
24276
24277
24278
24279
24280
24281
24282
24283
24284
24285
24286
24287
24288
24289
24290
24291
24292
24293
24294
24295
24296
24297
24298
24299
24300
24301
24302
24303
24304
24305
24306
24307
24308
24309
24310
24311
24312
24313
24314
24315
24316
24317
24318
24319
24320
24321
24322
24323
24324
24325
24326
24327
24328
24329
24330
24331
24332
24333
24334
24335
24336
24337
24338
24339
24340
24341
24342
24343
24344
24345
24346
24347
24348
24349
24350
24351
24352
24353
24354
24355
24356
24357
24358
24359
24360
24361
24362
24363
24364
24365
24366
24367
24368
24369
24370
24371
24372
24373
24374
24375
24376
24377
24378
24379
24380
24381
24382
24383
24384
24385
24386
24387
24388
24389
24390
24391
24392
24393
24394
24395
24396
24397
24398
24399
24400
24401
24402
24403
24404
24405
24406
24407
24408
24409
24410
24411
24412
24413
24414
24415
24416
24417
24418
24419
24420
24421
24422
24423
24424
24425
24426
24427
24428
24429
24430
24431
24432
24433
24434
24435
24436
24437
24438
24439
24440
24441
24442
24443
24444
24445
24446
24447
24448
24449
24450
24451
24452
24453
24454
24455
24456
24457
24458
24459
24460
24461
24462
24463
24464
24465
24466
24467
24468
24469
24470
24471
24472
24473
24474
24475
24476
24477
24478
24479
24480
24481
24482
24483
24484
24485
24486
24487
24488
24489
24490
24491
24492
24493
24494
24495
24496
24497
24498
24499
24500
24501
24502
24503
24504
24505
24506
24507
24508
24509
24510
24511
24512
24513
24514
24515
24516
24517
24518
24519
24520
24521
24522
24523
24524
24525
24526
24527
24528
24529
24530
24531
24532
24533
24534
24535
24536
24537
24538
24539
24540
24541
24542
24543
24544
24545
24546
24547
24548
24549
24550
24551
24552
24553
24554
24555
24556
24557
24558
24559
24560
24561
24562
24563
24564
24565
24566
24567
24568
24569
24570
24571
24572
24573
24574
24575
24576
24577
24578
24579
24580
24581
24582
24583
24584
24585
24586
24587
24588
24589
24590
24591
24592
24593
24594
24595
24596
24597
24598
24599
24600
24601
24602
24603
24604
24605
24606
24607
24608
24609
24610
24611
24612
24613
24614
24615
24616
24617
24618
24619
24620
24621
24622
24623
24624
24625
24626
24627
24628
24629
24630
24631
24632
24633
24634
24635
24636
24637
24638
24639
24640
24641
24642
24643
24644
24645
24646
24647
24648
24649
24650
24651
24652
24653
24654
24655
24656
24657
24658
24659
24660
24661
24662
24663
24664
24665
24666
24667
24668
24669
24670
24671
24672
24673
24674
24675
24676
24677
24678
24679
24680
24681
24682
24683
24684
24685
24686
24687
24688
24689
24690
24691
24692
24693
24694
24695
24696
24697
24698
24699
24700
24701
24702
24703
24704
24705
24706
24707
24708
24709
24710
24711
24712
24713
24714
24715
24716
24717
24718
24719
24720
24721
24722
24723
24724
24725
24726
24727
24728
24729
24730
24731
24732
24733
24734
24735
24736
24737
24738
24739
24740
24741
24742
24743
24744
24745
24746
24747
24748
24749
24750
24751
24752
24753
24754
24755
24756
24757
24758
24759
24760
24761
24762
24763
24764
24765
24766
24767
24768
24769
24770
24771
24772
24773
24774
24775
24776
24777
24778
24779
24780
24781
24782
24783
24784
24785
24786
24787
24788
24789
24790
24791
24792
24793
24794
24795
24796
24797
24798
24799
24800
24801
24802
24803
24804
24805
24806
24807
24808
24809
24810
24811
24812
24813
24814
24815
24816
24817
24818
24819
24820
24821
24822
24823
24824
24825
24826
24827
24828
24829
24830
24831
24832
24833
24834
24835
24836
24837
24838
24839
24840
24841
24842
24843
24844
24845
24846
24847
24848
24849
24850
24851
24852
24853
24854
24855
24856
24857
24858
24859
24860
24861
24862
24863
24864
24865
24866
24867
24868
24869
24870
24871
24872
24873
24874
24875
24876
24877
24878
24879
24880
24881
24882
24883
24884
24885
24886
24887
24888
24889
24890
24891
24892
24893
24894
24895
24896
24897
24898
24899
24900
24901
24902
24903
24904
24905
24906
24907
24908
24909
24910
24911
24912
24913
24914
24915
24916
24917
24918
24919
24920
24921
24922
24923
24924
24925
24926
24927
24928
24929
24930
24931
24932
24933
24934
24935
24936
24937
24938
24939
24940
24941
24942
24943
24944
24945
24946
24947
24948
24949
24950
24951
24952
24953
24954
24955
24956
24957
24958
24959
24960
24961
24962
24963
24964
24965
24966
24967
24968
24969
24970
24971
24972
24973
24974
24975
24976
24977
24978
24979
24980
24981
24982
24983
24984
24985
24986
24987
24988
24989
24990
24991
24992
24993
24994
24995
24996
24997
24998
24999
25000
25001
25002
25003
25004
25005
25006
25007
25008
25009
25010
25011
25012
25013
25014
25015
25016
25017
25018
25019
25020
25021
25022
25023
25024
25025
25026
25027
25028
25029
25030
25031
25032
25033
25034
25035
25036
25037
25038
25039
25040
25041
25042
25043
25044
25045
25046
25047
25048
25049
25050
25051
25052
25053
25054
25055
25056
25057
25058
25059
25060
25061
25062
25063
25064
25065
25066
25067
25068
25069
25070
25071
25072
25073
25074
25075
25076
25077
25078
25079
25080
25081
25082
25083
25084
25085
25086
25087
25088
25089
25090
25091
25092
25093
25094
25095
25096
25097
25098
25099
25100
25101
25102
25103
25104
25105
25106
25107
25108
25109
25110
25111
25112
25113
25114
25115
25116
25117
25118
25119
25120
25121
25122
25123
25124
25125
25126
25127
25128
25129
25130
25131
25132
25133
25134
25135
25136
25137
25138
25139
25140
25141
25142
25143
25144
25145
25146
25147
25148
25149
25150
25151
25152
25153
25154
25155
25156
25157
25158
25159
25160
25161
25162
25163
25164
25165
25166
25167
25168
25169
25170
25171
25172
25173
25174
25175
25176
25177
25178
25179
25180
25181
25182
25183
25184
25185
25186
25187
25188
25189
25190
25191
25192
25193
25194
25195
25196
25197
25198
25199
25200
25201
25202
25203
25204
25205
25206
25207
25208
25209
25210
25211
25212
25213
25214
25215
25216
25217
25218
25219
25220
25221
25222
25223
25224
25225
25226
25227
25228
25229
25230
25231
25232
25233
25234
25235
25236
25237
25238
25239
25240
25241
25242
25243
25244
25245
25246
25247
25248
25249
25250
25251
25252
25253
25254
25255
25256
25257
25258
25259
25260
25261
25262
25263
25264
25265
25266
25267
25268
25269
25270
25271
25272
25273
25274
25275
25276
25277
25278
25279
25280
25281
25282
25283
25284
25285
25286
25287
25288
25289
25290
25291
25292
25293
25294
25295
25296
25297
25298
25299
25300
25301
25302
25303
25304
25305
25306
25307
25308
25309
25310
25311
25312
25313
25314
25315
25316
25317
25318
25319
25320
25321
25322
25323
25324
25325
25326
25327
25328
25329
25330
25331
25332
25333
25334
25335
25336
25337
25338
25339
25340
25341
25342
25343
25344
25345
25346
25347
25348
25349
25350
25351
25352
25353
25354
25355
25356
25357
25358
25359
25360
25361
25362
25363
25364
25365
25366
25367
25368
25369
25370
25371
25372
25373
25374
25375
25376
25377
25378
25379
25380
25381
25382
25383
25384
25385
25386
25387
25388
25389
25390
25391
25392
25393
25394
25395
25396
25397
25398
25399
25400
25401
25402
25403
25404
25405
25406
25407
25408
25409
25410
25411
25412
25413
25414
25415
25416
25417
25418
25419
25420
25421
25422
25423
25424
25425
25426
25427
25428
25429
25430
25431
25432
25433
25434
25435
25436
25437
25438
25439
25440
25441
25442
25443
25444
25445
25446
25447
25448
25449
25450
25451
25452
25453
25454
25455
25456
25457
25458
25459
25460
25461
25462
25463
25464
25465
25466
25467
25468
25469
25470
25471
25472
25473
25474
25475
25476
25477
25478
25479
25480
25481
25482
25483
25484
25485
25486
25487
25488
25489
25490
25491
25492
25493
25494
25495
25496
25497
25498
25499
25500
25501
25502
25503
25504
25505
25506
25507
25508
25509
25510
25511
25512
25513
25514
25515
25516
25517
25518
25519
25520
25521
25522
25523
25524
25525
25526
25527
25528
25529
25530
25531
25532
25533
25534
25535
25536
25537
25538
25539
25540
25541
25542
25543
25544
25545
25546
25547
25548
25549
25550
25551
25552
25553
25554
25555
25556
25557
25558
25559
25560
25561
25562
25563
25564
25565
25566
25567
25568
25569
25570
25571
25572
25573
25574
25575
25576
25577
25578
25579
25580
25581
25582
25583
25584
25585
25586
25587
25588
25589
25590
25591
25592
25593
25594
25595
25596
25597
25598
25599
25600
25601
25602
25603
25604
25605
25606
25607
25608
25609
25610
25611
25612
25613
25614
25615
25616
25617
25618
25619
25620
25621
25622
25623
25624
25625
25626
25627
25628
25629
25630
25631
25632
25633
25634
25635
25636
25637
25638
25639
25640
25641
25642
25643
25644
25645
25646
25647
25648
25649
25650
25651
25652
25653
25654
25655
25656
25657
25658
25659
25660
25661
25662
25663
25664
25665
25666
25667
25668
25669
25670
25671
25672
25673
25674
25675
25676
25677
25678
25679
25680
25681
25682
25683
25684
25685
25686
25687
25688
25689
25690
25691
25692
25693
25694
25695
25696
25697
25698
25699
25700
25701
25702
25703
25704
25705
25706
25707
25708
25709
25710
25711
25712
25713
25714
25715
25716
25717
25718
25719
25720
25721
25722
25723
25724
25725
25726
25727
25728
25729
25730
25731
25732
25733
25734
25735
25736
25737
25738
25739
25740
25741
25742
25743
25744
25745
25746
25747
25748
25749
25750
25751
25752
25753
25754
25755
25756
25757
25758
25759
25760
25761
25762
25763
25764
25765
25766
25767
25768
25769
25770
25771
25772
25773
25774
25775
25776
25777
25778
25779
25780
25781
25782
25783
25784
25785
25786
25787
25788
25789
25790
25791
25792
25793
25794
25795
25796
25797
25798
25799
25800
25801
25802
25803
25804
25805
25806
25807
25808
25809
25810
25811
25812
25813
25814
25815
25816
25817
25818
25819
25820
25821
25822
25823
25824
25825
25826
25827
25828
25829
25830
25831
25832
25833
25834
25835
25836
25837
25838
25839
25840
25841
25842
25843
25844
25845
25846
25847
25848
25849
25850
25851
25852
25853
25854
25855
25856
25857
25858
25859
25860
25861
25862
25863
25864
25865
25866
25867
25868
25869
25870
25871
25872
25873
25874
25875
25876
25877
25878
25879
25880
25881
25882
25883
25884
25885
25886
25887
25888
25889
25890
25891
25892
25893
25894
25895
25896
25897
25898
25899
25900
25901
25902
25903
25904
25905
25906
25907
25908
25909
25910
25911
25912
25913
25914
25915
25916
25917
25918
25919
25920
25921
25922
25923
25924
25925
25926
25927
25928
25929
25930
25931
25932
25933
25934
25935
25936
25937
25938
25939
25940
25941
25942
25943
25944
25945
25946
25947
25948
25949
25950
25951
25952
25953
25954
25955
25956
25957
25958
25959
25960
25961
25962
25963
25964
25965
25966
25967
25968
25969
25970
25971
25972
25973
25974
25975
25976
25977
25978
25979
25980
25981
25982
25983
25984
25985
25986
25987
25988
25989
25990
25991
25992
25993
25994
25995
25996
25997
25998
25999
26000
26001
26002
26003
26004
26005
26006
26007
26008
26009
26010
26011
26012
26013
26014
26015
26016
26017
26018
26019
26020
26021
26022
26023
26024
26025
26026
26027
26028
26029
26030
26031
26032
26033
26034
26035
26036
26037
26038
26039
26040
26041
26042
26043
26044
26045
26046
26047
26048
26049
26050
26051
26052
26053
26054
26055
26056
26057
26058
26059
26060
26061
26062
26063
26064
26065
26066
26067
26068
26069
26070
26071
26072
26073
26074
26075
26076
26077
26078
26079
26080
26081
26082
26083
26084
26085
26086
26087
26088
26089
26090
26091
26092
26093
26094
26095
26096
26097
26098
26099
26100
26101
26102
26103
26104
26105
26106
26107
26108
26109
26110
26111
26112
26113
26114
26115
26116
26117
26118
26119
26120
26121
26122
26123
26124
26125
26126
26127
26128
26129
26130
26131
26132
26133
26134
26135
26136
26137
26138
26139
26140
26141
26142
26143
26144
26145
26146
26147
26148
26149
26150
26151
26152
26153
26154
26155
26156
26157
26158
26159
26160
26161
26162
26163
26164
26165
26166
26167
26168
26169
26170
26171
26172
26173
26174
26175
26176
26177
26178
26179
26180
26181
26182
26183
26184
26185
26186
26187
26188
26189
26190
26191
26192
26193
26194
26195
26196
26197
26198
26199
26200
26201
26202
26203
26204
26205
26206
26207
26208
26209
26210
26211
26212
26213
26214
26215
26216
26217
26218
26219
26220
26221
26222
26223
26224
26225
26226
26227
26228
26229
26230
26231
26232
26233
26234
26235
26236
26237
26238
26239
26240
26241
26242
26243
26244
26245
26246
26247
26248
26249
26250
26251
26252
26253
26254
26255
26256
26257
26258
26259
26260
26261
26262
26263
26264
26265
26266
26267
26268
26269
26270
26271
26272
26273
26274
26275
26276
26277
26278
26279
26280
26281
26282
26283
26284
26285
26286
26287
26288
26289
26290
26291
26292
26293
26294
26295
26296
26297
26298
26299
26300
26301
26302
26303
26304
26305
26306
26307
26308
26309
26310
26311
26312
26313
26314
26315
26316
26317
26318
26319
26320
26321
26322
26323
26324
26325
26326
26327
26328
26329
26330
26331
26332
26333
26334
26335
26336
26337
26338
26339
26340
26341
26342
26343
26344
26345
26346
26347
26348
26349
26350
26351
26352
26353
26354
26355
26356
26357
26358
26359
26360
26361
26362
26363
26364
26365
26366
26367
26368
26369
26370
26371
26372
26373
26374
26375
26376
26377
26378
26379
26380
26381
26382
26383
26384
26385
26386
26387
26388
26389
26390
26391
26392
26393
26394
26395
26396
26397
26398
26399
26400
26401
26402
26403
26404
26405
26406
26407
26408
26409
26410
26411
26412
26413
26414
26415
26416
26417
26418
26419
26420
26421
26422
26423
26424
26425
26426
26427
26428
26429
26430
26431
26432
26433
26434
26435
26436
26437
26438
26439
26440
26441
26442
26443
26444
26445
26446
26447
26448
26449
26450
26451
26452
26453
26454
26455
26456
26457
26458
26459
26460
26461
26462
26463
26464
26465
26466
26467
26468
26469
26470
26471
26472
26473
26474
26475
26476
26477
26478
26479
26480
26481
26482
26483
26484
26485
26486
26487
26488
26489
26490
26491
26492
26493
26494
26495
26496
26497
26498
26499
26500
26501
26502
26503
26504
26505
26506
26507
26508
26509
26510
26511
26512
26513
26514
26515
26516
26517
26518
26519
26520
26521
26522
26523
26524
26525
26526
26527
26528
26529
26530
26531
26532
26533
26534
26535
26536
26537
26538
26539
26540
26541
26542
26543
26544
26545
26546
26547
26548
26549
26550
26551
26552
26553
26554
26555
26556
26557
26558
26559
26560
26561
26562
26563
26564
26565
26566
26567
26568
26569
26570
26571
26572
26573
26574
26575
26576
26577
26578
26579
26580
26581
26582
26583
26584
26585
26586
26587
26588
26589
26590
26591
26592
26593
26594
26595
26596
26597
26598
26599
26600
26601
26602
26603
26604
26605
26606
26607
26608
26609
26610
26611
26612
26613
26614
26615
26616
26617
26618
26619
26620
26621
26622
26623
26624
26625
26626
26627
26628
26629
26630
26631
26632
26633
26634
26635
26636
26637
26638
26639
26640
26641
26642
26643
26644
26645
26646
26647
26648
26649
26650
26651
26652
26653
26654
26655
26656
26657
26658
26659
26660
26661
26662
26663
26664
26665
26666
26667
26668
26669
26670
26671
26672
26673
26674
26675
26676
26677
26678
26679
26680
26681
26682
26683
26684
26685
26686
26687
26688
26689
26690
26691
26692
26693
26694
26695
26696
26697
26698
26699
26700
26701
26702
26703
26704
26705
26706
26707
26708
26709
26710
26711
26712
26713
26714
26715
26716
26717
26718
26719
26720
26721
26722
26723
26724
26725
26726
26727
26728
26729
26730
26731
26732
26733
26734
26735
26736
26737
26738
26739
26740
26741
26742
26743
26744
26745
26746
26747
26748
26749
26750
26751
26752
26753
26754
26755
26756
26757
26758
26759
26760
26761
26762
26763
26764
26765
26766
26767
26768
26769
26770
26771
26772
26773
26774
26775
26776
26777
26778
26779
26780
26781
26782
26783
26784
26785
26786
26787
26788
26789
26790
26791
26792
26793
26794
26795
26796
26797
26798
26799
26800
26801
26802
26803
26804
26805
26806
26807
26808
26809
26810
26811
26812
26813
26814
26815
26816
26817
26818
26819
26820
26821
26822
26823
26824
26825
26826
26827
26828
26829
26830
26831
26832
26833
26834
26835
26836
26837
26838
26839
26840
26841
26842
26843
26844
26845
26846
26847
26848
26849
26850
26851
26852
26853
26854
26855
26856
26857
26858
26859
26860
26861
26862
26863
26864
26865
26866
26867
26868
26869
26870
26871
26872
26873
26874
26875
26876
26877
26878
26879
26880
26881
26882
26883
26884
26885
26886
26887
26888
26889
26890
26891
26892
26893
26894
26895
26896
26897
26898
26899
26900
26901
26902
26903
26904
26905
26906
26907
26908
26909
26910
26911
26912
26913
26914
26915
26916
26917
26918
26919
26920
26921
26922
26923
26924
26925
26926
26927
26928
26929
26930
26931
26932
26933
26934
26935
26936
26937
26938
26939
26940
26941
26942
26943
26944
26945
26946
26947
26948
26949
26950
26951
26952
26953
26954
26955
26956
26957
26958
26959
26960
26961
26962
26963
26964
26965
26966
26967
26968
26969
26970
26971
26972
26973
26974
26975
26976
26977
26978
26979
26980
26981
26982
26983
26984
26985
26986
26987
26988
26989
26990
26991
26992
26993
26994
26995
26996
26997
26998
26999
27000
27001
27002
27003
27004
27005
27006
27007
27008
27009
27010
27011
27012
27013
27014
27015
27016
27017
27018
27019
27020
27021
27022
27023
27024
27025
27026
27027
27028
27029
27030
27031
27032
27033
27034
27035
27036
27037
27038
27039
27040
27041
27042
27043
27044
27045
27046
27047
27048
27049
27050
27051
27052
27053
27054
27055
27056
27057
27058
27059
27060
27061
27062
27063
27064
27065
27066
27067
27068
27069
27070
27071
27072
27073
27074
27075
27076
27077
27078
27079
27080
27081
27082
27083
27084
27085
27086
27087
27088
27089
27090
27091
27092
27093
27094
27095
27096
27097
27098
27099
27100
27101
27102
27103
27104
27105
27106
27107
27108
27109
27110
27111
27112
27113
27114
27115
27116
27117
27118
27119
27120
27121
27122
27123
27124
27125
27126
27127
27128
27129
27130
27131
27132
27133
27134
27135
27136
27137
27138
27139
27140
27141
27142
27143
27144
27145
27146
27147
27148
27149
27150
27151
27152
27153
27154
27155
27156
27157
27158
27159
27160
27161
27162
27163
27164
27165
27166
27167
27168
27169
27170
27171
27172
27173
27174
27175
27176
27177
27178
27179
27180
27181
27182
27183
27184
27185
27186
27187
27188
27189
27190
27191
27192
27193
27194
27195
27196
27197
27198
27199
27200
27201
27202
27203
27204
27205
27206
27207
27208
27209
27210
27211
27212
27213
27214
27215
27216
27217
27218
27219
27220
27221
27222
27223
27224
27225
27226
27227
27228
27229
27230
27231
27232
27233
27234
27235
27236
27237
27238
27239
27240
27241
27242
27243
27244
27245
27246
27247
27248
27249
27250
27251
27252
27253
27254
27255
27256
27257
27258
27259
27260
27261
27262
27263
27264
27265
27266
27267
27268
27269
27270
27271
27272
27273
27274
27275
27276
27277
27278
27279
27280
27281
27282
27283
27284
27285
27286
27287
27288
27289
27290
27291
27292
27293
27294
27295
27296
27297
27298
27299
27300
27301
27302
27303
27304
27305
27306
27307
27308
27309
27310
27311
27312
27313
27314
27315
27316
27317
27318
27319
27320
27321
27322
27323
27324
27325
27326
27327
27328
27329
27330
27331
27332
27333
27334
27335
27336
27337
27338
27339
27340
27341
27342
27343
27344
27345
27346
27347
27348
27349
27350
27351
27352
27353
27354
27355
27356
27357
27358
27359
27360
27361
27362
27363
27364
27365
27366
27367
27368
27369
27370
27371
27372
27373
27374
27375
27376
27377
27378
27379
27380
27381
27382
27383
27384
27385
27386
27387
27388
27389
27390
27391
27392
27393
27394
27395
27396
27397
27398
27399
27400
27401
27402
27403
27404
27405
27406
27407
27408
27409
27410
27411
27412
27413
27414
27415
27416
27417
27418
27419
27420
27421
27422
27423
27424
27425
27426
27427
27428
27429
27430
27431
27432
27433
27434
27435
27436
27437
27438
27439
27440
27441
27442
27443
27444
27445
27446
27447
27448
27449
27450
27451
27452
27453
27454
27455
27456
27457
27458
27459
27460
27461
27462
27463
27464
27465
27466
27467
27468
27469
27470
27471
27472
27473
27474
27475
27476
27477
27478
27479
27480
27481
27482
27483
27484
27485
27486
27487
27488
27489
27490
27491
27492
27493
27494
27495
27496
27497
27498
27499
27500
27501
27502
27503
27504
27505
27506
27507
27508
27509
27510
27511
27512
27513
27514
27515
27516
27517
27518
27519
27520
27521
27522
27523
27524
27525
27526
27527
27528
27529
27530
27531
27532
27533
27534
27535
27536
27537
27538
27539
27540
27541
27542
27543
27544
27545
27546
27547
27548
27549
27550
27551
27552
27553
27554
27555
27556
27557
27558
27559
27560
27561
27562
27563
27564
27565
27566
27567
27568
27569
27570
27571
27572
27573
27574
27575
27576
27577
27578
27579
27580
27581
27582
27583
27584
27585
27586
27587
27588
27589
27590
27591
27592
27593
27594
27595
27596
27597
27598
27599
27600
27601
27602
27603
27604
27605
27606
27607
27608
27609
27610
27611
27612
27613
27614
27615
27616
27617
27618
27619
27620
27621
27622
27623
27624
27625
27626
27627
27628
27629
27630
27631
27632
27633
27634
27635
27636
27637
27638
27639
27640
27641
27642
27643
27644
27645
27646
27647
27648
27649
27650
27651
27652
27653
27654
27655
27656
27657
27658
27659
27660
27661
27662
27663
27664
27665
27666
27667
27668
27669
27670
27671
27672
27673
27674
27675
27676
27677
27678
27679
27680
27681
27682
27683
27684
27685
27686
27687
27688
27689
27690
27691
27692
27693
27694
27695
27696
27697
27698
27699
27700
27701
27702
27703
27704
27705
27706
27707
27708
27709
27710
27711
27712
27713
27714
27715
27716
27717
27718
27719
27720
27721
27722
27723
27724
27725
27726
27727
27728
27729
27730
27731
27732
27733
27734
27735
27736
27737
27738
27739
27740
27741
27742
27743
27744
27745
27746
27747
27748
27749
27750
27751
27752
27753
27754
27755
27756
27757
27758
27759
27760
27761
27762
27763
27764
27765
27766
27767
27768
27769
27770
27771
27772
27773
27774
27775
27776
27777
27778
27779
27780
27781
27782
27783
27784
27785
27786
27787
27788
27789
27790
27791
27792
27793
27794
27795
27796
27797
27798
27799
27800
27801
27802
27803
27804
27805
27806
27807
27808
27809
27810
27811
27812
27813
27814
27815
27816
27817
27818
27819
27820
27821
27822
27823
27824
27825
27826
27827
27828
27829
27830
27831
27832
27833
27834
27835
27836
27837
27838
27839
27840
27841
27842
27843
27844
27845
27846
27847
27848
27849
27850
27851
27852
27853
27854
27855
27856
27857
27858
27859
27860
27861
27862
27863
27864
27865
27866
27867
27868
27869
27870
27871
27872
27873
27874
27875
27876
27877
27878
27879
27880
27881
27882
27883
27884
27885
27886
27887
27888
27889
27890
27891
27892
27893
27894
27895
27896
27897
27898
27899
27900
27901
27902
27903
27904
27905
27906
27907
27908
27909
27910
27911
27912
27913
27914
27915
27916
27917
27918
27919
27920
27921
27922
27923
27924
27925
27926
27927
27928
27929
27930
27931
27932
27933
27934
27935
27936
27937
27938
27939
27940
27941
27942
27943
27944
27945
27946
27947
27948
27949
27950
27951
27952
27953
27954
27955
27956
27957
27958
27959
27960
27961
27962
27963
27964
27965
27966
27967
27968
27969
27970
27971
27972
27973
27974
27975
27976
27977
27978
27979
27980
27981
27982
27983
27984
27985
27986
27987
27988
27989
27990
27991
27992
27993
27994
27995
27996
27997
27998
27999
28000
28001
28002
28003
28004
28005
28006
28007
28008
28009
28010
28011
28012
28013
28014
28015
28016
28017
28018
28019
28020
28021
28022
28023
28024
28025
28026
28027
28028
28029
28030
28031
28032
28033
28034
28035
28036
28037
28038
28039
28040
28041
28042
28043
28044
28045
28046
28047
28048
28049
28050
28051
28052
28053
28054
28055
28056
28057
28058
28059
28060
28061
28062
28063
28064
28065
28066
28067
28068
28069
28070
28071
28072
28073
28074
28075
28076
28077
28078
28079
28080
28081
28082
28083
28084
28085
28086
28087
28088
28089
28090
28091
28092
28093
28094
28095
28096
28097
28098
28099
28100
28101
28102
28103
28104
28105
28106
28107
28108
28109
28110
28111
28112
28113
28114
28115
28116
28117
28118
28119
28120
28121
28122
28123
28124
28125
28126
28127
28128
28129
28130
28131
28132
28133
28134
28135
28136
28137
28138
28139
28140
28141
28142
28143
28144
28145
28146
28147
28148
28149
28150
28151
28152
28153
28154
28155
28156
28157
28158
28159
28160
28161
28162
28163
28164
28165
28166
28167
28168
28169
28170
28171
28172
28173
28174
28175
28176
28177
28178
28179
28180
28181
28182
28183
28184
28185
28186
28187
28188
28189
28190
28191
28192
28193
28194
28195
28196
28197
28198
28199
28200
28201
28202
28203
28204
28205
28206
28207
28208
28209
28210
28211
28212
28213
28214
28215
28216
28217
28218
28219
28220
28221
28222
28223
28224
28225
28226
28227
28228
28229
28230
28231
28232
28233
28234
28235
28236
28237
28238
28239
28240
28241
28242
28243
28244
28245
28246
28247
28248
28249
28250
28251
28252
28253
28254
28255
28256
28257
28258
28259
28260
28261
28262
28263
28264
28265
28266
28267
28268
28269
28270
28271
28272
28273
28274
28275
28276
28277
28278
28279
28280
28281
28282
28283
28284
28285
28286
28287
28288
28289
28290
28291
28292
28293
28294
28295
28296
28297
28298
28299
28300
28301
28302
28303
28304
28305
28306
28307
28308
28309
28310
28311
28312
28313
28314
28315
28316
28317
28318
28319
28320
28321
28322
28323
28324
28325
28326
28327
28328
28329
28330
28331
28332
28333
28334
28335
28336
28337
28338
28339
28340
28341
28342
28343
28344
28345
28346
28347
28348
28349
28350
28351
28352
28353
28354
28355
28356
28357
28358
28359
28360
28361
28362
28363
28364
28365
28366
28367
28368
28369
28370
28371
28372
28373
28374
28375
28376
28377
28378
28379
28380
28381
28382
28383
28384
28385
28386
28387
28388
28389
28390
28391
28392
28393
28394
28395
28396
28397
28398
28399
28400
28401
28402
28403
28404
28405
28406
28407
28408
28409
28410
28411
28412
28413
28414
28415
28416
28417
28418
28419
28420
28421
28422
28423
28424
28425
28426
28427
28428
28429
28430
28431
28432
28433
28434
28435
28436
28437
28438
28439
28440
28441
28442
28443
28444
28445
28446
28447
28448
28449
28450
28451
28452
28453
28454
28455
28456
28457
28458
28459
28460
28461
28462
28463
28464
28465
28466
28467
28468
28469
28470
28471
28472
28473
28474
28475
28476
28477
28478
28479
28480
28481
28482
28483
28484
28485
28486
28487
28488
28489
28490
28491
28492
28493
28494
28495
28496
28497
28498
28499
28500
28501
28502
28503
28504
28505
28506
28507
28508
28509
28510
28511
28512
28513
28514
28515
28516
28517
28518
28519
28520
28521
28522
28523
28524
28525
28526
28527
28528
28529
28530
28531
28532
28533
28534
28535
28536
28537
28538
28539
28540
28541
28542
28543
28544
28545
28546
28547
28548
28549
28550
28551
28552
28553
28554
28555
28556
28557
28558
28559
28560
28561
28562
28563
28564
28565
28566
28567
28568
28569
28570
28571
28572
28573
28574
28575
28576
28577
28578
28579
28580
28581
28582
28583
28584
28585
28586
28587
28588
28589
28590
28591
28592
28593
28594
28595
28596
28597
28598
28599
28600
28601
28602
28603
28604
28605
28606
28607
28608
28609
28610
28611
28612
28613
28614
28615
28616
28617
28618
28619
28620
28621
28622
28623
28624
28625
28626
28627
28628
28629
28630
28631
28632
28633
28634
28635
28636
28637
28638
28639
28640
28641
28642
28643
28644
28645
28646
28647
28648
28649
28650
28651
28652
28653
28654
28655
28656
28657
28658
28659
28660
28661
28662
28663
28664
28665
28666
28667
28668
28669
28670
28671
28672
28673
28674
28675
28676
28677
28678
28679
28680
28681
28682
28683
28684
28685
28686
28687
28688
28689
28690
28691
28692
28693
28694
28695
28696
28697
28698
28699
28700
28701
28702
28703
28704
28705
28706
28707
28708
28709
28710
28711
28712
28713
28714
28715
28716
28717
28718
28719
28720
28721
28722
28723
28724
28725
28726
28727
28728
28729
28730
28731
28732
28733
28734
28735
28736
28737
28738
28739
28740
28741
28742
28743
28744
28745
28746
28747
28748
28749
28750
28751
28752
28753
28754
28755
28756
28757
28758
28759
28760
28761
28762
28763
28764
28765
28766
28767
28768
28769
28770
28771
28772
28773
28774
28775
28776
28777
28778
28779
28780
28781
28782
28783
28784
28785
28786
28787
28788
28789
28790
28791
28792
28793
28794
28795
28796
28797
28798
28799
28800
28801
28802
28803
28804
28805
28806
28807
28808
28809
28810
28811
28812
28813
28814
28815
28816
28817
28818
28819
28820
28821
28822
28823
28824
28825
28826
28827
28828
28829
28830
28831
28832
28833
28834
28835
28836
28837
28838
28839
28840
28841
28842
28843
28844
28845
28846
28847
28848
28849
28850
28851
28852
28853
28854
28855
28856
28857
28858
28859
28860
28861
28862
28863
28864
28865
28866
28867
28868
28869
28870
28871
28872
28873
28874
28875
28876
28877
28878
28879
28880
28881
28882
28883
28884
28885
28886
28887
28888
28889
28890
28891
28892
28893
28894
28895
28896
28897
28898
28899
28900
28901
28902
28903
28904
28905
28906
28907
28908
28909
28910
28911
28912
28913
28914
28915
28916
28917
28918
28919
28920
28921
28922
28923
28924
28925
28926
28927
28928
28929
28930
28931
28932
28933
28934
28935
28936
28937
28938
28939
28940
28941
28942
28943
28944
28945
28946
28947
28948
28949
28950
28951
28952
28953
28954
28955
28956
28957
28958
28959
28960
28961
28962
28963
28964
28965
28966
28967
28968
28969
28970
28971
28972
28973
28974
28975
28976
28977
28978
28979
28980
28981
28982
28983
28984
28985
28986
28987
28988
28989
28990
28991
28992
28993
28994
28995
28996
28997
28998
28999
29000
29001
29002
29003
29004
29005
29006
29007
29008
29009
29010
29011
29012
29013
29014
29015
29016
29017
29018
29019
29020
29021
29022
29023
29024
29025
29026
29027
29028
29029
29030
29031
29032
29033
29034
29035
29036
29037
29038
29039
29040
29041
29042
29043
29044
29045
29046
29047
29048
29049
29050
29051
29052
29053
29054
29055
29056
29057
29058
29059
29060
29061
29062
29063
29064
29065
29066
29067
29068
29069
29070
29071
29072
29073
29074
29075
29076
29077
29078
29079
29080
29081
29082
29083
29084
29085
29086
29087
29088
29089
29090
29091
29092
29093
29094
29095
29096
29097
29098
29099
29100
29101
29102
29103
29104
29105
29106
29107
29108
29109
29110
29111
29112
29113
29114
29115
29116
29117
29118
29119
29120
29121
29122
29123
29124
29125
29126
29127
29128
29129
29130
29131
29132
29133
29134
29135
29136
29137
29138
29139
29140
29141
29142
29143
29144
29145
29146
29147
29148
29149
29150
29151
29152
29153
29154
29155
29156
29157
29158
29159
29160
29161
29162
29163
29164
29165
29166
29167
29168
29169
29170
29171
29172
29173
29174
29175
29176
29177
29178
29179
29180
29181
29182
29183
29184
29185
29186
29187
29188
29189
29190
29191
29192
29193
29194
29195
29196
29197
29198
29199
29200
29201
29202
29203
29204
29205
29206
29207
29208
29209
29210
29211
29212
29213
29214
29215
29216
29217
29218
29219
29220
29221
29222
29223
29224
29225
29226
29227
29228
29229
29230
29231
29232
29233
29234
29235
29236
29237
29238
29239
29240
29241
29242
29243
29244
29245
29246
29247
29248
29249
29250
29251
29252
29253
29254
29255
29256
29257
29258
29259
29260
29261
29262
29263
29264
29265
29266
29267
29268
29269
29270
29271
29272
29273
29274
29275
29276
29277
29278
29279
29280
29281
29282
29283
29284
29285
29286
29287
29288
29289
29290
29291
29292
29293
29294
29295
29296
29297
29298
29299
29300
29301
29302
29303
29304
29305
29306
29307
29308
29309
29310
29311
29312
29313
29314
29315
29316
29317
29318
29319
29320
29321
29322
29323
29324
29325
29326
29327
29328
29329
29330
29331
29332
29333
29334
29335
29336
29337
29338
29339
29340
29341
29342
29343
29344
29345
29346
29347
29348
29349
29350
29351
29352
29353
29354
29355
29356
29357
29358
29359
29360
29361
29362
29363
29364
29365
29366
29367
29368
29369
29370
29371
29372
29373
29374
29375
29376
29377
29378
29379
29380
29381
29382
29383
29384
29385
29386
29387
29388
29389
29390
29391
29392
29393
29394
29395
29396
29397
29398
29399
29400
29401
29402
29403
29404
29405
29406
29407
29408
29409
29410
29411
29412
29413
29414
29415
29416
29417
29418
29419
29420
29421
29422
29423
29424
29425
29426
29427
29428
29429
29430
29431
29432
29433
29434
29435
29436
29437
29438
29439
29440
29441
29442
29443
29444
29445
29446
29447
29448
29449
29450
29451
29452
29453
29454
29455
29456
29457
29458
29459
29460
29461
29462
29463
29464
29465
29466
29467
29468
29469
29470
29471
29472
29473
29474
29475
29476
29477
29478
29479
29480
29481
29482
29483
29484
29485
29486
29487
29488
29489
29490
29491
29492
29493
29494
29495
29496
29497
29498
29499
29500
29501
29502
29503
29504
29505
29506
29507
29508
29509
29510
29511
29512
29513
29514
29515
29516
29517
29518
29519
29520
29521
29522
29523
29524
29525
29526
29527
29528
29529
29530
29531
29532
29533
29534
29535
29536
29537
29538
29539
29540
29541
29542
29543
29544
29545
29546
29547
29548
29549
29550
29551
29552
29553
29554
29555
29556
29557
29558
29559
29560
29561
29562
29563
29564
29565
29566
29567
29568
29569
29570
29571
29572
29573
29574
29575
29576
29577
29578
29579
29580
29581
29582
29583
29584
29585
29586
29587
29588
29589
29590
29591
29592
29593
29594
29595
29596
29597
29598
29599
29600
29601
29602
29603
29604
29605
29606
29607
29608
29609
29610
29611
29612
29613
29614
29615
29616
29617
29618
29619
29620
29621
29622
29623
29624
29625
29626
29627
29628
29629
29630
29631
29632
29633
29634
29635
29636
29637
29638
29639
29640
29641
29642
29643
29644
29645
29646
29647
29648
29649
29650
29651
29652
29653
29654
29655
29656
29657
29658
29659
29660
29661
29662
29663
29664
29665
29666
29667
29668
29669
29670
29671
29672
29673
29674
29675
29676
29677
29678
29679
29680
29681
29682
29683
29684
29685
29686
29687
29688
29689
29690
29691
29692
29693
29694
29695
29696
29697
29698
29699
29700
29701
29702
29703
29704
29705
29706
29707
29708
29709
29710
29711
29712
29713
29714
29715
29716
29717
29718
29719
29720
29721
29722
29723
29724
29725
29726
29727
29728
29729
29730
29731
29732
29733
29734
29735
29736
29737
29738
29739
29740
29741
29742
29743
29744
29745
29746
29747
29748
29749
29750
29751
29752
29753
29754
29755
29756
29757
29758
29759
29760
29761
29762
29763
29764
29765
29766
29767
29768
29769
29770
29771
29772
29773
29774
29775
29776
29777
29778
29779
29780
29781
29782
29783
29784
29785
29786
29787
29788
29789
29790
29791
29792
29793
29794
29795
29796
29797
29798
29799
29800
29801
29802
29803
29804
29805
29806
29807
29808
29809
29810
29811
29812
29813
29814
29815
29816
29817
29818
29819
29820
29821
29822
29823
29824
29825
29826
29827
29828
29829
29830
29831
29832
29833
29834
29835
29836
29837
29838
29839
29840
29841
29842
29843
29844
29845
29846
29847
29848
29849
29850
29851
29852
29853
29854
29855
29856
29857
29858
29859
29860
29861
29862
29863
29864
29865
29866
29867
29868
29869
29870
29871
29872
29873
29874
29875
29876
29877
29878
29879
29880
29881
29882
29883
29884
29885
29886
29887
29888
29889
29890
29891
29892
29893
29894
29895
29896
29897
29898
29899
29900
29901
29902
29903
29904
29905
29906
29907
29908
29909
29910
29911
29912
29913
29914
29915
29916
29917
29918
29919
29920
29921
29922
29923
29924
29925
29926
29927
29928
29929
29930
29931
29932
29933
29934
29935
29936
29937
29938
29939
29940
29941
29942
29943
29944
29945
29946
29947
29948
29949
29950
29951
29952
29953
29954
29955
29956
29957
29958
29959
29960
29961
29962
29963
29964
29965
29966
29967
29968
29969
29970
29971
29972
29973
29974
29975
29976
29977
29978
29979
29980
29981
29982
29983
29984
29985
29986
29987
29988
29989
29990
29991
29992
29993
29994
29995
29996
29997
29998
29999
30000
30001
30002
30003
30004
30005
30006
30007
30008
30009
30010
30011
30012
30013
30014
30015
30016
30017
30018
30019
30020
30021
30022
30023
30024
30025
30026
30027
30028
30029
30030
30031
30032
30033
30034
30035
30036
30037
30038
30039
30040
30041
30042
30043
30044
30045
30046
30047
30048
30049
30050
30051
30052
30053
30054
30055
30056
30057
30058
30059
30060
30061
30062
30063
30064
30065
30066
30067
30068
30069
30070
30071
30072
30073
30074
30075
30076
30077
30078
30079
30080
30081
30082
30083
30084
30085
30086
30087
30088
30089
30090
30091
30092
30093
30094
30095
30096
30097
30098
30099
30100
30101
30102
30103
30104
30105
30106
30107
30108
30109
30110
30111
30112
30113
30114
30115
30116
30117
30118
30119
30120
30121
30122
30123
30124
30125
30126
30127
30128
30129
30130
30131
30132
30133
30134
30135
30136
30137
30138
30139
30140
30141
30142
30143
30144
30145
30146
30147
30148
30149
30150
30151
30152
30153
30154
30155
30156
30157
30158
30159
30160
30161
30162
30163
30164
30165
30166
30167
30168
30169
30170
30171
30172
30173
30174
30175
30176
30177
30178
30179
30180
30181
30182
30183
30184
30185
30186
30187
30188
30189
30190
30191
30192
30193
30194
30195
30196
30197
30198
30199
30200
30201
30202
30203
30204
30205
30206
30207
30208
30209
30210
30211
30212
30213
30214
30215
30216
30217
30218
30219
30220
30221
30222
30223
30224
30225
30226
30227
30228
30229
30230
30231
30232
30233
30234
30235
30236
30237
30238
30239
30240
30241
30242
30243
30244
30245
30246
30247
30248
30249
30250
30251
30252
30253
30254
30255
30256
30257
30258
30259
30260
30261
30262
30263
30264
30265
30266
30267
30268
30269
30270
30271
30272
30273
30274
30275
30276
30277
30278
30279
30280
30281
30282
30283
30284
30285
30286
30287
30288
30289
30290
30291
30292
30293
30294
30295
30296
30297
30298
30299
30300
30301
30302
30303
30304
30305
30306
30307
30308
30309
30310
30311
30312
30313
30314
30315
30316
30317
30318
30319
30320
30321
30322
30323
30324
30325
30326
30327
30328
30329
30330
30331
30332
30333
30334
30335
30336
30337
30338
30339
30340
30341
30342
30343
30344
30345
30346
30347
30348
30349
30350
30351
30352
30353
30354
30355
30356
30357
30358
30359
30360
30361
30362
30363
30364
30365
30366
30367
30368
30369
30370
30371
30372
30373
30374
30375
30376
30377
30378
30379
30380
30381
30382
30383
30384
30385
30386
30387
30388
30389
30390
30391
30392
30393
30394
30395
30396
30397
30398
30399
30400
30401
30402
30403
30404
30405
30406
30407
30408
30409
30410
30411
30412
30413
30414
30415
30416
30417
30418
30419
30420
30421
30422
30423
30424
30425
30426
30427
30428
30429
30430
30431
30432
30433
30434
30435
30436
30437
30438
30439
30440
30441
30442
30443
30444
30445
30446
30447
30448
30449
30450
30451
30452
30453
30454
30455
30456
30457
30458
30459
30460
30461
30462
30463
30464
30465
30466
30467
30468
30469
30470
30471
30472
30473
30474
30475
30476
30477
30478
30479
30480
30481
30482
30483
30484
30485
30486
30487
30488
30489
30490
30491
30492
30493
30494
30495
30496
30497
30498
30499
30500
30501
30502
30503
30504
30505
30506
30507
30508
30509
30510
30511
30512
30513
30514
30515
30516
30517
30518
30519
30520
30521
30522
30523
30524
30525
30526
30527
30528
30529
30530
30531
30532
30533
30534
30535
30536
30537
30538
30539
30540
30541
30542
30543
30544
30545
30546
30547
30548
30549
30550
30551
30552
30553
30554
30555
30556
30557
30558
30559
30560
30561
30562
30563
30564
30565
30566
30567
30568
30569
30570
30571
30572
30573
30574
30575
30576
30577
30578
30579
30580
30581
30582
30583
30584
30585
30586
30587
30588
30589
30590
30591
30592
30593
30594
30595
30596
30597
30598
30599
30600
30601
30602
30603
30604
30605
30606
30607
30608
30609
30610
30611
30612
30613
30614
30615
30616
30617
30618
30619
30620
30621
30622
30623
30624
30625
30626
30627
30628
30629
30630
30631
30632
30633
30634
30635
30636
30637
30638
30639
30640
30641
30642
30643
30644
30645
30646
30647
30648
30649
30650
30651
30652
30653
30654
30655
30656
30657
30658
30659
30660
30661
30662
30663
30664
30665
30666
30667
30668
30669
30670
30671
30672
30673
30674
30675
30676
30677
30678
30679
30680
30681
30682
30683
30684
30685
30686
30687
30688
30689
30690
30691
30692
30693
30694
30695
30696
30697
30698
30699
30700
30701
30702
30703
30704
30705
30706
30707
30708
30709
30710
30711
30712
30713
30714
30715
30716
30717
30718
30719
30720
30721
30722
30723
30724
30725
30726
30727
30728
30729
30730
30731
30732
30733
30734
30735
30736
30737
30738
30739
30740
30741
30742
30743
30744
30745
30746
30747
30748
30749
30750
30751
30752
30753
30754
30755
30756
30757
30758
30759
30760
30761
30762
30763
30764
30765
30766
30767
30768
30769
30770
30771
30772
30773
30774
30775
30776
30777
30778
30779
30780
30781
30782
30783
30784
30785
30786
30787
30788
30789
30790
30791
30792
30793
30794
30795
30796
30797
30798
30799
30800
30801
30802
30803
30804
30805
30806
30807
30808
30809
30810
30811
30812
30813
30814
30815
30816
30817
30818
30819
30820
30821
30822
30823
30824
30825
30826
30827
30828
30829
30830
30831
30832
30833
30834
30835
30836
30837
30838
30839
30840
30841
30842
30843
30844
30845
30846
30847
30848
30849
30850
30851
30852
30853
30854
30855
30856
30857
30858
30859
30860
30861
30862
30863
30864
30865
30866
30867
30868
30869
30870
30871
30872
30873
30874
30875
30876
30877
30878
30879
30880
30881
30882
30883
30884
30885
30886
30887
30888
30889
30890
30891
30892
30893
30894
30895
30896
30897
30898
30899
30900
30901
30902
30903
30904
30905
30906
30907
30908
30909
30910
30911
30912
30913
30914
30915
30916
30917
30918
30919
30920
30921
30922
30923
30924
30925
30926
30927
30928
30929
30930
30931
30932
30933
30934
30935
30936
30937
30938
30939
30940
30941
30942
30943
30944
30945
30946
30947
30948
30949
30950
30951
30952
30953
30954
30955
30956
30957
30958
30959
30960
30961
30962
30963
30964
30965
30966
30967
30968
30969
30970
30971
30972
30973
30974
30975
30976
30977
30978
30979
30980
30981
30982
30983
30984
30985
30986
30987
30988
30989
30990
30991
30992
30993
30994
30995
30996
30997
30998
30999
31000
31001
31002
31003
31004
31005
31006
31007
31008
31009
31010
31011
31012
31013
31014
31015
31016
31017
31018
31019
31020
31021
31022
31023
31024
31025
31026
31027
31028
31029
31030
31031
31032
31033
31034
31035
31036
31037
31038
31039
31040
31041
31042
31043
31044
31045
31046
31047
31048
31049
31050
31051
31052
31053
31054
31055
31056
31057
31058
31059
31060
31061
31062
31063
31064
31065
31066
31067
31068
31069
31070
31071
31072
31073
31074
31075
31076
31077
31078
31079
31080
31081
31082
31083
31084
31085
31086
31087
31088
31089
31090
31091
31092
31093
31094
31095
31096
31097
31098
31099
31100
31101
31102
31103
31104
31105
31106
31107
31108
31109
31110
31111
31112
31113
31114
31115
31116
31117
31118
31119
31120
31121
31122
31123
31124
31125
31126
31127
31128
31129
31130
31131
31132
31133
31134
31135
31136
31137
31138
31139
31140
31141
31142
31143
31144
31145
31146
31147
31148
31149
31150
31151
31152
31153
31154
31155
31156
31157
31158
31159
31160
31161
31162
31163
31164
31165
31166
31167
31168
31169
31170
31171
31172
31173
31174
31175
31176
31177
31178
31179
31180
31181
31182
31183
31184
31185
31186
31187
31188
31189
31190
31191
31192
31193
31194
31195
31196
31197
31198
31199
31200
31201
31202
31203
31204
31205
31206
31207
31208
31209
31210
31211
31212
31213
31214
31215
31216
31217
31218
31219
31220
31221
31222
31223
31224
31225
31226
31227
31228
31229
31230
31231
31232
31233
31234
31235
31236
31237
31238
31239
31240
31241
31242
31243
31244
31245
31246
31247
31248
31249
31250
31251
31252
31253
31254
31255
31256
31257
31258
31259
31260
31261
31262
31263
31264
31265
31266
31267
31268
31269
31270
31271
31272
31273
31274
31275
31276
31277
31278
31279
31280
31281
31282
31283
31284
31285
31286
31287
31288
31289
31290
31291
31292
31293
31294
31295
31296
31297
31298
31299
31300
31301
31302
31303
31304
31305
31306
31307
31308
31309
31310
31311
31312
31313
31314
31315
31316
31317
31318
31319
31320
31321
31322
31323
31324
31325
31326
31327
31328
31329
31330
31331
31332
31333
31334
31335
31336
31337
31338
31339
31340
31341
31342
31343
31344
31345
31346
31347
31348
31349
31350
31351
31352
31353
31354
31355
31356
31357
31358
31359
31360
31361
31362
31363
31364
31365
31366
31367
31368
31369
31370
31371
31372
31373
31374
31375
31376
31377
31378
31379
31380
31381
31382
31383
31384
31385
31386
31387
31388
31389
31390
31391
31392
31393
31394
31395
31396
31397
31398
31399
31400
31401
31402
31403
31404
31405
31406
31407
31408
31409
31410
31411
31412
31413
31414
31415
31416
31417
31418
31419
31420
31421
31422
31423
31424
31425
31426
31427
31428
31429
31430
31431
31432
31433
31434
31435
31436
31437
31438
31439
31440
31441
31442
31443
31444
31445
31446
31447
31448
31449
31450
31451
31452
31453
31454
31455
31456
31457
31458
31459
31460
31461
31462
31463
31464
31465
31466
31467
31468
31469
31470
31471
31472
31473
31474
31475
31476
31477
31478
31479
31480
31481
31482
31483
31484
31485
31486
31487
31488
31489
31490
31491
31492
31493
31494
31495
31496
31497
31498
31499
31500
31501
31502
31503
31504
31505
31506
31507
31508
31509
31510
31511
31512
31513
31514
31515
31516
31517
31518
31519
31520
31521
31522
31523
31524
31525
31526
31527
31528
31529
31530
31531
31532
31533
31534
31535
31536
31537
31538
31539
31540
31541
31542
31543
31544
31545
31546
31547
31548
31549
31550
31551
31552
31553
31554
31555
31556
31557
31558
31559
31560
31561
31562
31563
31564
31565
31566
31567
31568
31569
31570
31571
31572
31573
31574
31575
31576
31577
31578
31579
31580
31581
31582
31583
31584
31585
31586
31587
31588
31589
31590
31591
31592
31593
31594
31595
31596
31597
31598
31599
31600
31601
31602
31603
31604
31605
31606
31607
31608
31609
31610
31611
31612
31613
31614
31615
31616
31617
31618
31619
31620
31621
31622
31623
31624
31625
31626
31627
31628
31629
31630
31631
31632
31633
31634
31635
31636
31637
31638
31639
31640
31641
31642
31643
31644
31645
31646
31647
31648
31649
31650
31651
31652
31653
31654
31655
31656
31657
31658
31659
31660
31661
31662
31663
31664
31665
31666
31667
31668
31669
31670
31671
31672
31673
31674
31675
31676
31677
31678
31679
31680
31681
31682
31683
31684
31685
31686
31687
31688
31689
31690
31691
31692
31693
31694
31695
31696
31697
31698
31699
31700
31701
31702
31703
31704
31705
31706
31707
31708
31709
31710
31711
31712
31713
31714
31715
31716
31717
31718
31719
31720
31721
31722
31723
31724
31725
31726
31727
31728
31729
31730
31731
31732
31733
31734
31735
31736
31737
31738
31739
31740
31741
31742
31743
31744
31745
31746
31747
31748
31749
31750
31751
31752
31753
31754
31755
31756
31757
31758
31759
31760
31761
31762
31763
31764
31765
31766
31767
31768
31769
31770
31771
31772
31773
31774
31775
31776
31777
31778
31779
31780
31781
31782
31783
31784
31785
31786
31787
31788
31789
31790
31791
31792
31793
31794
31795
31796
31797
31798
31799
31800
31801
31802
31803
31804
31805
31806
31807
31808
31809
31810
31811
31812
31813
31814
31815
31816
31817
31818
31819
31820
31821
31822
31823
31824
31825
31826
31827
31828
31829
31830
31831
31832
31833
31834
31835
31836
31837
31838
31839
31840
31841
31842
31843
31844
31845
31846
31847
31848
31849
31850
31851
31852
31853
31854
31855
31856
31857
31858
31859
31860
31861
31862
31863
31864
31865
31866
31867
31868
31869
31870
31871
31872
31873
31874
31875
31876
31877
31878
31879
31880
31881
31882
31883
31884
31885
31886
31887
31888
31889
31890
31891
31892
31893
31894
31895
31896
31897
31898
31899
31900
31901
31902
31903
31904
31905
31906
31907
31908
31909
31910
31911
31912
31913
31914
31915
31916
31917
31918
31919
31920
31921
31922
31923
31924
31925
31926
31927
31928
31929
31930
31931
31932
31933
31934
31935
31936
31937
31938
31939
31940
31941
31942
31943
31944
31945
31946
31947
31948
31949
31950
31951
31952
31953
31954
31955
31956
31957
31958
31959
31960
31961
31962
31963
31964
31965
31966
31967
31968
31969
31970
31971
31972
31973
31974
31975
31976
31977
31978
31979
31980
31981
31982
31983
31984
31985
31986
31987
31988
31989
31990
31991
31992
31993
31994
31995
31996
31997
31998
31999
32000
32001
32002
32003
32004
32005
32006
32007
32008
32009
32010
32011
32012
32013
32014
32015
32016
32017
32018
32019
32020
32021
32022
32023
32024
32025
32026
32027
32028
32029
32030
32031
32032
32033
32034
32035
32036
32037
32038
32039
32040
32041
32042
32043
32044
32045
32046
32047
32048
32049
32050
32051
32052
32053
32054
32055
32056
32057
32058
32059
32060
32061
32062
32063
32064
32065
32066
32067
32068
32069
32070
32071
32072
32073
32074
32075
32076
32077
32078
32079
32080
32081
32082
32083
32084
32085
32086
32087
32088
32089
32090
32091
32092
32093
32094
32095
32096
32097
32098
32099
32100
32101
32102
32103
32104
32105
32106
32107
32108
32109
32110
32111
32112
32113
32114
32115
32116
32117
32118
32119
32120
32121
32122
32123
32124
32125
32126
32127
32128
32129
32130
32131
32132
32133
32134
32135
32136
32137
32138
32139
32140
32141
32142
32143
32144
32145
32146
32147
32148
32149
32150
32151
32152
32153
32154
32155
32156
32157
32158
32159
32160
32161
32162
32163
32164
32165
32166
32167
32168
32169
32170
32171
32172
32173
32174
32175
32176
32177
32178
32179
32180
32181
32182
32183
32184
32185
32186
32187
32188
32189
32190
32191
32192
32193
32194
32195
32196
32197
32198
32199
32200
32201
32202
32203
32204
32205
32206
32207
32208
32209
32210
32211
32212
32213
32214
32215
32216
32217
32218
32219
32220
32221
32222
32223
32224
32225
32226
32227
32228
32229
32230
32231
32232
32233
32234
32235
32236
32237
32238
32239
32240
32241
32242
32243
32244
32245
32246
32247
32248
32249
32250
32251
32252
32253
32254
32255
32256
32257
32258
32259
32260
32261
32262
32263
32264
32265
32266
32267
32268
32269
32270
32271
32272
32273
32274
32275
32276
32277
32278
32279
32280
32281
32282
32283
32284
32285
32286
32287
32288
32289
32290
32291
32292
32293
32294
32295
32296
32297
32298
32299
32300
32301
32302
32303
32304
32305
32306
32307
32308
32309
32310
32311
32312
32313
32314
32315
32316
32317
32318
32319
32320
32321
32322
32323
32324
32325
32326
32327
32328
32329
32330
32331
32332
32333
32334
32335
32336
32337
32338
32339
32340
32341
32342
32343
32344
32345
32346
32347
32348
32349
32350
32351
32352
32353
32354
32355
32356
32357
32358
32359
32360
32361
32362
32363
32364
32365
32366
32367
32368
32369
32370
32371
32372
32373
32374
32375
32376
32377
32378
32379
32380
32381
32382
32383
32384
32385
32386
32387
32388
32389
32390
32391
32392
32393
32394
32395
32396
32397
32398
32399
32400
32401
32402
32403
32404
32405
32406
32407
32408
32409
32410
32411
32412
32413
32414
32415
32416
32417
32418
32419
32420
32421
32422
32423
32424
32425
32426
32427
32428
32429
32430
32431
32432
32433
32434
32435
32436
32437
32438
32439
32440
32441
32442
32443
32444
32445
32446
32447
32448
32449
32450
32451
32452
32453
32454
32455
32456
32457
32458
32459
32460
32461
32462
32463
32464
32465
32466
32467
32468
32469
32470
32471
32472
32473
32474
32475
32476
32477
32478
32479
32480
32481
32482
32483
32484
32485
32486
32487
32488
32489
32490
32491
32492
32493
32494
32495
32496
32497
32498
32499
32500
32501
32502
32503
32504
32505
32506
32507
32508
32509
32510
32511
32512
32513
32514
32515
32516
32517
32518
32519
32520
32521
32522
32523
32524
32525
32526
32527
32528
32529
32530
32531
32532
32533
32534
32535
32536
32537
32538
32539
32540
32541
32542
32543
32544
32545
32546
32547
32548
32549
32550
32551
32552
32553
32554
32555
32556
32557
32558
32559
32560
32561
32562
32563
32564
32565
32566
32567
32568
32569
32570
32571
32572
32573
32574
32575
32576
32577
32578
32579
32580
32581
32582
32583
32584
32585
32586
32587
32588
32589
32590
32591
32592
32593
32594
32595
32596
32597
32598
32599
32600
32601
32602
32603
32604
32605
32606
32607
32608
32609
32610
32611
32612
32613
32614
32615
32616
32617
32618
32619
32620
32621
32622
32623
32624
32625
32626
32627
32628
32629
32630
32631
32632
32633
32634
32635
32636
32637
32638
32639
32640
32641
32642
32643
32644
32645
32646
32647
32648
32649
32650
32651
32652
32653
32654
32655
32656
32657
32658
32659
32660
32661
32662
32663
32664
32665
32666
32667
32668
32669
32670
32671
32672
32673
32674
32675
32676
32677
32678
32679
32680
32681
32682
32683
32684
32685
32686
32687
32688
32689
32690
32691
32692
32693
32694
32695
32696
32697
32698
32699
32700
32701
32702
32703
32704
32705
32706
32707
32708
32709
32710
32711
32712
32713
32714
32715
32716
32717
32718
32719
32720
32721
32722
32723
32724
32725
32726
32727
32728
32729
32730
32731
32732
32733
32734
32735
32736
32737
32738
32739
32740
32741
32742
32743
32744
32745
32746
32747
32748
32749
32750
32751
32752
32753
32754
32755
32756
32757
32758
32759
32760
32761
32762
32763
32764
32765
32766
32767
32768
32769
32770
32771
32772
32773
32774
32775
32776
32777
32778
32779
32780
32781
32782
32783
32784
32785
32786
32787
32788
32789
32790
32791
32792
32793
32794
32795
32796
32797
32798
32799
32800
32801
32802
32803
32804
32805
32806
32807
32808
32809
32810
32811
32812
32813
32814
32815
32816
32817
32818
32819
32820
32821
32822
32823
32824
32825
32826
32827
32828
32829
32830
32831
32832
32833
32834
32835
32836
32837
32838
32839
32840
32841
32842
32843
32844
32845
32846
32847
32848
32849
32850
32851
32852
32853
32854
32855
32856
32857
32858
32859
32860
32861
32862
32863
32864
32865
32866
32867
32868
32869
32870
32871
32872
32873
32874
32875
32876
32877
32878
32879
32880
32881
32882
32883
32884
32885
32886
32887
32888
32889
32890
32891
32892
32893
32894
32895
32896
32897
32898
32899
32900
32901
32902
32903
32904
32905
32906
32907
32908
32909
32910
32911
32912
32913
32914
32915
32916
32917
32918
32919
32920
32921
32922
32923
32924
32925
32926
32927
32928
32929
32930
32931
32932
32933
32934
32935
32936
32937
32938
32939
32940
32941
32942
32943
32944
32945
32946
32947
32948
32949
32950
32951
32952
32953
32954
32955
32956
32957
32958
32959
32960
32961
32962
32963
32964
32965
32966
32967
32968
32969
32970
32971
32972
32973
32974
32975
32976
32977
32978
32979
32980
32981
32982
32983
32984
32985
32986
32987
32988
32989
32990
32991
32992
32993
32994
32995
32996
32997
32998
32999
33000
33001
33002
33003
33004
33005
33006
33007
33008
33009
33010
33011
33012
33013
33014
33015
33016
33017
33018
33019
33020
33021
33022
33023
33024
33025
33026
33027
33028
33029
33030
33031
33032
33033
33034
33035
33036
33037
33038
33039
33040
33041
33042
33043
33044
33045
33046
33047
33048
33049
33050
33051
33052
33053
33054
33055
33056
33057
33058
33059
33060
33061
33062
33063
33064
33065
33066
33067
33068
33069
33070
33071
33072
33073
33074
33075
33076
33077
33078
33079
33080
33081
33082
33083
33084
33085
33086
33087
33088
33089
33090
33091
33092
33093
33094
33095
33096
33097
33098
33099
33100
33101
33102
33103
33104
33105
33106
33107
33108
33109
33110
33111
33112
33113
33114
33115
33116
33117
33118
33119
33120
33121
33122
33123
33124
33125
33126
33127
33128
33129
33130
33131
33132
33133
33134
33135
33136
33137
33138
33139
33140
33141
33142
33143
33144
33145
33146
33147
33148
33149
33150
33151
33152
33153
33154
33155
33156
33157
33158
33159
33160
33161
33162
33163
33164
33165
33166
33167
33168
33169
33170
33171
33172
33173
33174
33175
33176
33177
33178
33179
33180
33181
33182
33183
33184
33185
33186
33187
33188
33189
33190
33191
33192
33193
33194
33195
33196
33197
33198
33199
33200
33201
33202
33203
33204
33205
33206
33207
33208
33209
33210
33211
33212
33213
33214
33215
33216
33217
33218
33219
33220
33221
33222
33223
33224
33225
33226
33227
33228
33229
33230
33231
33232
33233
33234
33235
33236
33237
33238
33239
33240
33241
33242
33243
33244
33245
33246
33247
33248
33249
33250
33251
33252
33253
33254
33255
33256
33257
33258
33259
33260
33261
33262
33263
33264
33265
33266
33267
33268
33269
33270
33271
33272
33273
33274
33275
33276
33277
33278
33279
33280
33281
33282
33283
33284
33285
33286
33287
33288
33289
33290
33291
33292
33293
33294
33295
33296
33297
33298
33299
33300
33301
33302
33303
33304
33305
33306
33307
33308
33309
33310
33311
33312
33313
33314
33315
33316
33317
33318
33319
33320
33321
33322
33323
33324
33325
33326
33327
33328
33329
33330
33331
33332
33333
33334
33335
33336
33337
33338
33339
33340
33341
33342
33343
33344
33345
33346
33347
33348
33349
33350
33351
33352
33353
33354
33355
33356
33357
33358
33359
33360
33361
33362
33363
33364
33365
33366
33367
33368
33369
33370
33371
33372
33373
33374
33375
33376
33377
33378
33379
33380
33381
33382
33383
33384
33385
33386
33387
33388
33389
33390
33391
33392
33393
33394
33395
33396
33397
33398
33399
33400
33401
33402
33403
33404
33405
33406
33407
33408
33409
33410
33411
33412
33413
33414
33415
33416
33417
33418
33419
33420
33421
33422
33423
33424
33425
33426
33427
33428
33429
33430
33431
33432
33433
33434
33435
33436
33437
33438
33439
33440
33441
33442
33443
33444
33445
33446
33447
33448
33449
33450
33451
33452
33453
33454
33455
33456
33457
33458
33459
33460
33461
33462
33463
33464
33465
33466
33467
33468
33469
33470
33471
33472
33473
33474
33475
33476
33477
33478
33479
33480
33481
33482
33483
33484
33485
33486
33487
33488
33489
33490
33491
33492
33493
33494
33495
33496
33497
33498
33499
33500
33501
33502
33503
33504
33505
33506
33507
33508
33509
33510
33511
33512
33513
33514
33515
33516
33517
33518
33519
33520
33521
33522
33523
33524
33525
33526
33527
33528
33529
33530
33531
33532
33533
33534
33535
33536
33537
33538
33539
33540
33541
33542
33543
33544
33545
33546
33547
33548
33549
33550
33551
33552
33553
33554
33555
33556
33557
33558
33559
33560
33561
33562
33563
33564
33565
33566
33567
33568
33569
33570
33571
33572
33573
33574
33575
33576
33577
33578
33579
33580
33581
33582
33583
33584
33585
33586
33587
33588
33589
33590
33591
33592
33593
33594
33595
33596
33597
33598
33599
33600
33601
33602
33603
33604
33605
33606
33607
33608
33609
33610
33611
33612
33613
33614
33615
33616
33617
33618
33619
33620
33621
33622
33623
33624
33625
33626
33627
33628
33629
33630
33631
33632
33633
33634
33635
33636
33637
33638
33639
33640
33641
33642
33643
33644
33645
33646
33647
33648
33649
33650
33651
33652
33653
33654
33655
33656
33657
33658
33659
33660
33661
33662
33663
33664
33665
33666
33667
33668
33669
33670
33671
33672
33673
33674
33675
33676
33677
33678
33679
33680
33681
33682
33683
33684
33685
33686
33687
33688
33689
33690
33691
33692
33693
33694
33695
33696
33697
33698
33699
33700
33701
33702
33703
33704
33705
33706
33707
33708
33709
33710
33711
33712
33713
33714
33715
33716
33717
33718
33719
33720
33721
33722
33723
33724
33725
33726
33727
33728
33729
33730
33731
33732
33733
33734
33735
33736
33737
33738
33739
33740
33741
33742
33743
33744
33745
33746
33747
33748
33749
33750
33751
33752
33753
33754
33755
33756
33757
33758
33759
33760
33761
33762
33763
33764
33765
33766
33767
33768
33769
33770
33771
33772
33773
33774
33775
33776
33777
33778
33779
33780
33781
33782
33783
33784
33785
33786
33787
33788
33789
33790
33791
33792
33793
33794
33795
33796
33797
33798
33799
33800
33801
33802
33803
33804
33805
33806
33807
33808
33809
33810
33811
33812
33813
33814
33815
33816
33817
33818
33819
33820
33821
33822
33823
33824
33825
33826
33827
33828
33829
33830
33831
33832
33833
33834
33835
33836
33837
33838
33839
33840
33841
33842
33843
33844
33845
33846
33847
33848
33849
33850
33851
33852
33853
33854
33855
33856
33857
33858
33859
33860
33861
33862
33863
33864
33865
33866
33867
33868
33869
33870
33871
33872
33873
33874
33875
33876
33877
33878
33879
33880
33881
33882
33883
33884
33885
33886
33887
33888
33889
33890
33891
33892
33893
33894
33895
33896
33897
33898
33899
33900
33901
33902
33903
33904
33905
33906
33907
33908
33909
33910
33911
33912
33913
33914
33915
33916
33917
33918
33919
33920
33921
33922
33923
33924
33925
33926
33927
33928
33929
33930
33931
33932
33933
33934
33935
33936
33937
33938
33939
33940
33941
33942
33943
33944
33945
33946
33947
33948
33949
33950
33951
33952
33953
33954
33955
33956
33957
33958
33959
33960
33961
33962
33963
33964
33965
33966
33967
33968
33969
33970
33971
33972
33973
33974
33975
33976
33977
33978
33979
33980
33981
33982
33983
33984
33985
33986
33987
33988
33989
33990
33991
33992
33993
33994
33995
33996
33997
33998
33999
34000
34001
34002
34003
34004
34005
34006
34007
34008
34009
34010
34011
34012
34013
34014
34015
34016
34017
34018
34019
34020
34021
34022
34023
34024
34025
34026
34027
34028
34029
34030
34031
34032
34033
34034
34035
34036
34037
34038
34039
34040
34041
34042
34043
34044
34045
34046
34047
34048
34049
34050
34051
34052
34053
34054
34055
34056
34057
34058
34059
34060
34061
34062
34063
34064
34065
34066
34067
34068
34069
34070
34071
34072
34073
34074
34075
34076
34077
34078
34079
34080
34081
34082
34083
34084
34085
34086
34087
34088
34089
34090
34091
34092
34093
34094
34095
34096
34097
34098
34099
34100
34101
34102
34103
34104
34105
34106
34107
34108
34109
34110
34111
34112
34113
34114
34115
34116
34117
34118
34119
34120
34121
34122
34123
34124
34125
34126
34127
34128
34129
34130
34131
34132
34133
34134
34135
34136
34137
34138
34139
34140
34141
34142
34143
34144
34145
34146
34147
34148
34149
34150
34151
34152
34153
34154
34155
34156
34157
34158
34159
34160
34161
34162
34163
34164
34165
34166
34167
34168
34169
34170
34171
34172
34173
34174
34175
34176
34177
34178
34179
34180
34181
34182
34183
34184
34185
34186
34187
34188
34189
34190
34191
34192
34193
34194
34195
34196
34197
34198
34199
34200
34201
34202
34203
34204
34205
34206
34207
34208
34209
34210
34211
34212
34213
34214
34215
34216
34217
34218
34219
34220
34221
34222
34223
34224
34225
34226
34227
34228
34229
34230
34231
34232
34233
34234
34235
34236
34237
34238
34239
34240
34241
34242
34243
34244
34245
34246
34247
34248
34249
34250
34251
34252
34253
34254
34255
34256
34257
34258
34259
34260
34261
34262
34263
34264
34265
34266
34267
34268
34269
34270
34271
34272
34273
34274
34275
34276
34277
34278
34279
34280
34281
34282
34283
34284
34285
34286
34287
34288
34289
34290
34291
34292
34293
34294
34295
34296
34297
34298
34299
34300
34301
34302
34303
34304
34305
34306
34307
34308
34309
34310
34311
34312
34313
34314
34315
34316
34317
34318
34319
34320
34321
34322
34323
34324
34325
34326
34327
34328
34329
34330
34331
34332
34333
34334
34335
34336
34337
34338
34339
34340
34341
34342
34343
34344
34345
34346
34347
34348
34349
34350
34351
34352
34353
34354
34355
34356
34357
34358
34359
34360
34361
34362
34363
34364
34365
34366
34367
34368
34369
34370
34371
34372
34373
34374
34375
34376
34377
34378
34379
34380
34381
34382
34383
34384
34385
34386
34387
34388
34389
34390
34391
34392
34393
34394
34395
34396
34397
34398
34399
34400
34401
34402
34403
34404
34405
34406
34407
34408
34409
34410
34411
34412
34413
34414
34415
34416
34417
34418
34419
34420
34421
34422
34423
34424
34425
34426
34427
34428
34429
34430
34431
34432
34433
34434
34435
34436
34437
34438
34439
34440
34441
34442
34443
34444
34445
34446
34447
34448
34449
34450
34451
34452
34453
34454
34455
34456
34457
34458
34459
34460
34461
34462
34463
34464
34465
34466
34467
34468
34469
34470
34471
34472
34473
34474
34475
34476
34477
34478
34479
34480
34481
34482
34483
34484
34485
34486
34487
34488
34489
34490
34491
34492
34493
34494
34495
34496
34497
34498
34499
34500
34501
34502
34503
34504
34505
34506
34507
34508
34509
34510
34511
34512
34513
34514
34515
34516
34517
34518
34519
34520
34521
34522
34523
34524
34525
34526
34527
34528
34529
34530
34531
34532
34533
34534
34535
34536
34537
34538
34539
34540
34541
34542
34543
34544
34545
34546
34547
34548
34549
34550
34551
34552
34553
34554
34555
34556
34557
34558
34559
34560
34561
34562
34563
34564
34565
34566
34567
34568
34569
34570
34571
34572
34573
34574
34575
34576
34577
34578
34579
34580
34581
34582
34583
34584
34585
34586
34587
34588
34589
34590
34591
34592
34593
34594
34595
34596
34597
34598
34599
34600
34601
34602
34603
34604
34605
34606
34607
34608
34609
34610
34611
34612
34613
34614
34615
34616
34617
34618
34619
34620
34621
34622
34623
34624
34625
34626
34627
34628
34629
34630
34631
34632
34633
34634
34635
34636
34637
34638
34639
34640
34641
34642
34643
34644
34645
34646
34647
34648
34649
34650
34651
34652
34653
34654
34655
34656
34657
34658
34659
34660
34661
34662
34663
34664
34665
34666
34667
34668
34669
34670
34671
34672
34673
34674
34675
34676
34677
34678
34679
34680
34681
34682
34683
34684
34685
34686
34687
34688
34689
34690
34691
34692
34693
34694
34695
34696
34697
34698
34699
34700
34701
34702
34703
34704
34705
34706
34707
34708
34709
34710
34711
34712
34713
34714
34715
34716
34717
34718
34719
34720
34721
34722
34723
34724
34725
34726
34727
34728
34729
34730
34731
34732
34733
34734
34735
34736
34737
34738
34739
34740
34741
34742
34743
34744
34745
34746
34747
34748
34749
34750
34751
34752
34753
34754
34755
34756
34757
34758
34759
34760
34761
34762
34763
34764
34765
34766
34767
34768
34769
34770
34771
34772
34773
34774
34775
34776
34777
34778
34779
34780
34781
34782
34783
34784
34785
34786
34787
34788
34789
34790
34791
34792
34793
34794
34795
34796
34797
34798
34799
34800
34801
34802
34803
34804
34805
34806
34807
34808
34809
34810
34811
34812
34813
34814
34815
34816
34817
34818
34819
34820
34821
34822
34823
34824
34825
34826
34827
34828
34829
34830
34831
34832
34833
34834
34835
34836
34837
34838
34839
34840
34841
34842
34843
34844
34845
34846
34847
34848
34849
34850
34851
34852
34853
34854
34855
34856
34857
34858
34859
34860
34861
34862
34863
34864
34865
34866
34867
34868
34869
34870
34871
34872
34873
34874
34875
34876
34877
34878
34879
34880
34881
34882
34883
34884
34885
34886
34887
34888
34889
34890
34891
34892
34893
34894
34895
34896
34897
34898
34899
34900
34901
34902
34903
34904
34905
34906
34907
34908
34909
34910
34911
34912
34913
34914
34915
34916
34917
34918
34919
34920
34921
34922
34923
34924
34925
34926
34927
34928
34929
34930
34931
34932
34933
34934
34935
34936
34937
34938
34939
34940
34941
34942
34943
34944
34945
34946
34947
34948
34949
34950
34951
34952
34953
34954
34955
34956
34957
34958
34959
34960
34961
34962
34963
34964
34965
34966
34967
34968
34969
34970
34971
34972
34973
34974
34975
34976
34977
34978
34979
34980
34981
34982
34983
34984
34985
34986
34987
34988
34989
34990
34991
34992
34993
34994
34995
34996
34997
34998
34999
35000
35001
35002
35003
35004
35005
35006
35007
35008
35009
35010
35011
35012
35013
35014
35015
35016
35017
35018
35019
35020
35021
35022
35023
35024
35025
35026
35027
35028
35029
35030
35031
35032
35033
35034
35035
35036
35037
35038
35039
35040
35041
35042
35043
35044
35045
35046
35047
35048
35049
35050
35051
35052
35053
35054
35055
35056
35057
35058
35059
35060
35061
35062
35063
35064
35065
35066
35067
35068
35069
35070
35071
35072
35073
35074
35075
35076
35077
35078
35079
35080
35081
35082
35083
35084
35085
35086
35087
35088
35089
35090
35091
35092
35093
35094
35095
35096
35097
35098
35099
35100
35101
35102
35103
35104
35105
35106
35107
35108
35109
35110
35111
35112
35113
35114
35115
35116
35117
35118
35119
35120
35121
35122
35123
35124
35125
35126
35127
35128
35129
35130
35131
35132
35133
35134
35135
35136
35137
35138
35139
35140
35141
35142
35143
35144
35145
35146
35147
35148
35149
35150
35151
35152
35153
35154
35155
35156
35157
35158
35159
35160
35161
35162
35163
35164
35165
35166
35167
35168
35169
35170
35171
35172
35173
35174
35175
35176
35177
35178
35179
35180
35181
35182
35183
35184
35185
35186
35187
35188
35189
35190
35191
35192
35193
35194
35195
35196
35197
35198
35199
35200
35201
35202
35203
35204
35205
35206
35207
35208
35209
35210
35211
35212
35213
35214
35215
35216
35217
35218
35219
35220
35221
35222
35223
35224
35225
35226
35227
35228
35229
35230
35231
35232
35233
35234
35235
35236
35237
35238
35239
35240
35241
35242
35243
35244
35245
35246
35247
35248
35249
35250
35251
35252
35253
35254
35255
35256
35257
35258
35259
35260
35261
35262
35263
35264
35265
35266
35267
35268
35269
35270
35271
35272
35273
35274
35275
35276
35277
35278
35279
35280
35281
35282
35283
35284
35285
35286
35287
35288
35289
35290
35291
35292
35293
35294
35295
35296
35297
35298
35299
35300
35301
35302
35303
35304
35305
35306
35307
35308
35309
35310
35311
35312
35313
35314
35315
35316
35317
35318
35319
35320
35321
35322
35323
35324
35325
35326
35327
35328
35329
35330
35331
35332
35333
35334
35335
35336
35337
35338
35339
35340
35341
35342
35343
35344
35345
35346
35347
35348
35349
35350
35351
35352
35353
35354
35355
35356
35357
35358
35359
35360
35361
35362
35363
35364
35365
35366
35367
35368
35369
35370
35371
35372
35373
35374
35375
35376
35377
35378
35379
35380
35381
35382
35383
35384
35385
35386
35387
35388
35389
35390
35391
35392
35393
35394
35395
35396
35397
35398
35399
35400
35401
35402
35403
35404
35405
35406
35407
35408
35409
35410
35411
35412
35413
35414
35415
35416
35417
35418
35419
35420
35421
35422
35423
35424
35425
35426
35427
35428
35429
35430
35431
35432
35433
35434
35435
35436
35437
35438
35439
35440
35441
35442
35443
35444
35445
35446
35447
35448
35449
35450
35451
35452
35453
35454
35455
35456
35457
35458
35459
35460
35461
35462
35463
35464
35465
35466
35467
35468
35469
35470
35471
35472
35473
35474
35475
35476
35477
35478
35479
35480
35481
35482
35483
35484
35485
35486
35487
35488
35489
35490
35491
35492
35493
35494
35495
35496
35497
35498
35499
35500
35501
35502
35503
35504
35505
35506
35507
35508
35509
35510
35511
35512
35513
35514
35515
35516
35517
35518
35519
35520
35521
35522
35523
35524
35525
35526
35527
35528
35529
35530
35531
35532
35533
35534
35535
35536
35537
35538
35539
35540
35541
35542
35543
35544
35545
35546
35547
35548
35549
35550
35551
35552
35553
35554
35555
35556
35557
35558
35559
35560
35561
35562
35563
35564
35565
35566
35567
35568
35569
35570
35571
35572
35573
35574
35575
35576
35577
35578
35579
35580
35581
35582
35583
35584
35585
35586
35587
35588
35589
35590
35591
35592
35593
35594
35595
35596
35597
35598
35599
35600
35601
35602
35603
35604
35605
35606
35607
35608
35609
35610
35611
35612
35613
35614
35615
35616
35617
35618
35619
35620
35621
35622
35623
35624
35625
35626
35627
35628
35629
35630
35631
35632
35633
35634
35635
35636
35637
35638
35639
35640
35641
35642
35643
35644
35645
35646
35647
35648
35649
35650
35651
35652
35653
35654
35655
35656
35657
35658
35659
35660
35661
35662
35663
35664
35665
35666
35667
35668
35669
35670
35671
35672
35673
35674
35675
35676
35677
35678
35679
35680
35681
35682
35683
35684
35685
35686
35687
35688
35689
35690
35691
35692
35693
35694
35695
35696
35697
35698
35699
35700
35701
35702
35703
35704
35705
35706
35707
35708
35709
35710
35711
35712
35713
35714
35715
35716
35717
35718
35719
35720
35721
35722
35723
35724
35725
35726
35727
35728
35729
35730
35731
35732
35733
35734
35735
35736
35737
35738
35739
35740
35741
35742
35743
35744
35745
35746
35747
35748
35749
35750
35751
35752
35753
35754
35755
35756
35757
35758
35759
35760
35761
35762
35763
35764
35765
35766
35767
35768
35769
35770
35771
35772
35773
35774
35775
35776
35777
35778
35779
35780
35781
35782
35783
35784
35785
35786
35787
35788
35789
35790
35791
35792
35793
35794
35795
35796
35797
35798
35799
35800
35801
35802
35803
35804
35805
35806
35807
35808
35809
35810
35811
35812
35813
35814
35815
35816
35817
35818
35819
35820
35821
35822
35823
35824
35825
35826
35827
35828
35829
35830
35831
35832
35833
35834
35835
35836
35837
35838
35839
35840
35841
35842
35843
35844
35845
35846
35847
35848
35849
35850
35851
35852
35853
35854
35855
35856
35857
35858
35859
35860
35861
35862
35863
35864
35865
35866
35867
35868
35869
35870
35871
35872
35873
35874
35875
35876
35877
35878
35879
35880
35881
35882
35883
35884
35885
35886
35887
35888
35889
35890
35891
35892
35893
35894
35895
35896
35897
35898
35899
35900
35901
35902
35903
35904
35905
35906
35907
35908
35909
35910
35911
35912
35913
35914
35915
35916
35917
35918
35919
35920
35921
35922
35923
35924
35925
35926
35927
35928
35929
35930
35931
35932
35933
35934
35935
35936
35937
35938
35939
35940
35941
35942
35943
35944
35945
35946
35947
35948
35949
35950
35951
35952
35953
35954
35955
35956
35957
35958
35959
35960
35961
35962
35963
35964
35965
35966
35967
35968
35969
35970
35971
35972
35973
35974
35975
35976
35977
35978
35979
35980
35981
35982
35983
35984
35985
35986
35987
35988
35989
35990
35991
35992
35993
35994
35995
35996
35997
35998
35999
36000
36001
36002
36003
36004
36005
36006
36007
36008
36009
36010
36011
36012
36013
36014
36015
36016
36017
36018
36019
36020
36021
36022
36023
36024
36025
36026
36027
36028
36029
36030
36031
36032
36033
36034
36035
36036
36037
36038
36039
36040
36041
36042
36043
36044
36045
36046
36047
36048
36049
36050
36051
36052
36053
36054
36055
36056
36057
36058
36059
36060
36061
36062
36063
36064
36065
36066
36067
36068
36069
36070
36071
36072
36073
36074
36075
36076
36077
36078
36079
36080
36081
36082
36083
36084
36085
36086
36087
36088
36089
36090
36091
36092
36093
36094
36095
36096
36097
36098
36099
36100
36101
36102
36103
36104
36105
36106
36107
36108
36109
36110
36111
36112
36113
36114
36115
36116
36117
36118
36119
36120
36121
36122
36123
36124
36125
36126
36127
36128
36129
36130
36131
36132
36133
36134
36135
36136
36137
36138
36139
36140
36141
36142
36143
36144
36145
36146
36147
36148
36149
36150
36151
36152
36153
36154
36155
36156
36157
36158
36159
36160
36161
36162
36163
36164
36165
36166
36167
36168
36169
36170
36171
36172
36173
36174
36175
36176
36177
36178
36179
36180
36181
36182
36183
36184
36185
36186
36187
36188
36189
36190
36191
36192
36193
36194
36195
36196
36197
36198
36199
36200
36201
36202
36203
36204
36205
36206
36207
36208
36209
36210
36211
36212
36213
36214
36215
36216
36217
36218
36219
36220
36221
36222
36223
36224
36225
36226
36227
36228
36229
36230
36231
36232
36233
36234
36235
36236
36237
36238
36239
36240
36241
36242
36243
36244
36245
36246
36247
36248
36249
36250
36251
36252
36253
36254
36255
36256
36257
36258
36259
36260
36261
36262
36263
36264
36265
36266
36267
36268
36269
36270
36271
36272
36273
36274
36275
36276
36277
36278
36279
36280
36281
36282
36283
36284
36285
36286
36287
36288
36289
36290
36291
36292
36293
36294
36295
36296
36297
36298
36299
36300
36301
36302
36303
36304
36305
36306
36307
36308
36309
36310
36311
36312
36313
36314
36315
36316
36317
36318
36319
36320
36321
36322
36323
36324
36325
36326
36327
36328
36329
36330
36331
36332
36333
36334
36335
36336
36337
36338
36339
36340
36341
36342
36343
36344
36345
36346
36347
36348
36349
36350
36351
36352
36353
36354
36355
36356
36357
36358
36359
36360
36361
36362
36363
36364
36365
36366
36367
36368
36369
36370
36371
36372
36373
36374
36375
36376
36377
36378
36379
36380
36381
36382
36383
36384
36385
36386
36387
36388
36389
36390
36391
36392
36393
36394
36395
36396
36397
36398
36399
36400
36401
36402
36403
36404
36405
36406
36407
36408
36409
36410
36411
36412
36413
36414
36415
36416
36417
36418
36419
36420
36421
36422
36423
36424
36425
36426
36427
36428
36429
36430
36431
36432
36433
36434
36435
36436
36437
36438
36439
36440
36441
36442
36443
36444
36445
36446
36447
36448
36449
36450
36451
36452
36453
36454
36455
36456
36457
36458
36459
36460
36461
36462
36463
36464
36465
36466
36467
36468
36469
36470
36471
36472
36473
36474
36475
36476
36477
36478
36479
36480
36481
36482
36483
36484
36485
36486
36487
36488
36489
36490
36491
36492
36493
36494
36495
36496
36497
36498
36499
36500
36501
36502
36503
36504
36505
36506
36507
36508
36509
36510
36511
36512
36513
36514
36515
36516
36517
36518
36519
36520
36521
36522
36523
36524
36525
36526
36527
36528
36529
36530
36531
36532
36533
36534
36535
36536
36537
36538
36539
36540
36541
36542
36543
36544
36545
36546
36547
36548
36549
36550
36551
36552
36553
36554
36555
36556
36557
36558
36559
36560
36561
36562
36563
36564
36565
36566
36567
36568
36569
36570
36571
36572
36573
36574
36575
36576
36577
36578
36579
36580
36581
36582
36583
36584
36585
36586
36587
36588
36589
36590
36591
36592
36593
36594
36595
36596
36597
36598
36599
36600
36601
36602
36603
36604
36605
36606
36607
36608
36609
36610
36611
36612
36613
36614
36615
36616
36617
36618
36619
36620
36621
36622
36623
36624
36625
36626
36627
36628
36629
36630
36631
36632
36633
36634
36635
36636
36637
36638
36639
36640
36641
36642
36643
36644
36645
36646
36647
36648
36649
36650
36651
36652
36653
36654
36655
36656
36657
36658
36659
36660
36661
36662
36663
36664
36665
36666
36667
36668
36669
36670
36671
36672
36673
36674
36675
36676
36677
36678
36679
36680
36681
36682
36683
36684
36685
36686
36687
36688
36689
36690
36691
36692
36693
36694
36695
36696
36697
36698
36699
36700
36701
36702
36703
36704
36705
36706
36707
36708
36709
36710
36711
36712
36713
36714
36715
36716
36717
36718
36719
36720
36721
36722
36723
36724
36725
36726
36727
36728
36729
36730
36731
36732
36733
36734
36735
36736
36737
36738
36739
36740
36741
36742
36743
36744
36745
36746
36747
36748
36749
36750
36751
36752
36753
36754
36755
36756
36757
36758
36759
36760
36761
36762
36763
36764
36765
36766
36767
36768
36769
36770
36771
36772
36773
36774
36775
36776
36777
36778
36779
36780
36781
36782
36783
36784
36785
36786
36787
36788
36789
36790
36791
36792
36793
36794
36795
36796
36797
36798
36799
36800
36801
36802
36803
36804
36805
36806
36807
36808
36809
36810
36811
36812
36813
36814
36815
36816
36817
36818
36819
36820
36821
36822
36823
36824
36825
36826
36827
36828
36829
36830
36831
36832
36833
36834
36835
36836
36837
36838
36839
36840
36841
36842
36843
36844
36845
36846
36847
36848
36849
36850
36851
36852
36853
36854
36855
36856
36857
36858
36859
36860
36861
36862
36863
36864
36865
36866
36867
36868
36869
36870
36871
36872
36873
36874
36875
36876
36877
36878
36879
36880
36881
36882
36883
36884
36885
36886
36887
36888
36889
36890
36891
36892
36893
36894
36895
36896
36897
36898
36899
36900
36901
36902
36903
36904
36905
36906
36907
36908
36909
36910
36911
36912
36913
36914
36915
36916
36917
36918
36919
36920
36921
36922
36923
36924
36925
36926
36927
36928
36929
36930
36931
36932
36933
36934
36935
36936
36937
36938
36939
36940
36941
36942
36943
36944
36945
36946
36947
36948
36949
36950
36951
36952
36953
36954
36955
36956
36957
36958
36959
36960
36961
36962
36963
36964
36965
36966
36967
36968
36969
36970
36971
36972
36973
36974
36975
36976
36977
36978
36979
36980
36981
36982
36983
36984
36985
36986
36987
36988
36989
36990
36991
36992
36993
36994
36995
36996
36997
36998
36999
37000
37001
37002
37003
37004
37005
37006
37007
37008
37009
37010
37011
37012
37013
37014
37015
37016
37017
37018
37019
37020
37021
37022
37023
37024
37025
37026
37027
37028
37029
37030
37031
37032
37033
37034
37035
37036
37037
37038
37039
37040
37041
37042
37043
37044
37045
37046
37047
37048
37049
37050
37051
37052
37053
37054
37055
37056
37057
37058
37059
37060
37061
37062
37063
37064
37065
37066
37067
37068
37069
37070
37071
37072
37073
37074
37075
37076
37077
37078
37079
37080
37081
37082
37083
37084
37085
37086
37087
37088
37089
37090
37091
37092
37093
37094
37095
37096
37097
37098
37099
37100
37101
37102
37103
37104
37105
37106
37107
37108
37109
37110
37111
37112
37113
37114
37115
37116
37117
37118
37119
37120
37121
37122
37123
37124
37125
37126
37127
37128
37129
37130
37131
37132
37133
37134
37135
37136
37137
37138
37139
37140
37141
37142
37143
37144
37145
37146
37147
37148
37149
37150
37151
37152
37153
37154
37155
37156
37157
37158
37159
37160
37161
37162
37163
37164
37165
37166
37167
37168
37169
37170
37171
37172
37173
37174
37175
37176
37177
37178
37179
37180
37181
37182
37183
37184
37185
37186
37187
37188
37189
37190
37191
37192
37193
37194
37195
37196
37197
37198
37199
37200
37201
37202
37203
37204
37205
37206
37207
37208
37209
37210
37211
37212
37213
37214
37215
37216
37217
37218
37219
37220
37221
37222
37223
37224
37225
37226
37227
37228
37229
37230
37231
37232
37233
37234
37235
37236
37237
37238
37239
37240
37241
37242
37243
37244
37245
37246
37247
37248
37249
37250
37251
37252
37253
37254
37255
37256
37257
37258
37259
37260
37261
37262
37263
37264
37265
37266
37267
37268
37269
37270
37271
37272
37273
37274
37275
37276
37277
37278
37279
37280
37281
37282
37283
37284
37285
37286
37287
37288
37289
37290
37291
37292
37293
37294
37295
37296
37297
37298
37299
37300
37301
37302
37303
37304
37305
37306
37307
37308
37309
37310
37311
37312
37313
37314
37315
37316
37317
37318
37319
37320
37321
37322
37323
37324
37325
37326
37327
37328
37329
37330
37331
37332
37333
37334
37335
37336
37337
37338
37339
37340
37341
37342
37343
37344
37345
37346
37347
37348
37349
37350
37351
37352
37353
37354
37355
37356
37357
37358
37359
37360
37361
37362
37363
37364
37365
37366
37367
37368
37369
37370
37371
37372
37373
37374
37375
37376
37377
37378
37379
37380
37381
37382
37383
37384
37385
37386
37387
37388
37389
37390
37391
37392
37393
37394
37395
37396
37397
37398
37399
37400
37401
37402
37403
37404
37405
37406
37407
37408
37409
37410
37411
37412
37413
37414
37415
37416
37417
37418
37419
37420
37421
37422
37423
37424
37425
37426
37427
37428
37429
37430
37431
37432
37433
37434
37435
37436
37437
37438
37439
37440
37441
37442
37443
37444
37445
37446
37447
37448
37449
37450
37451
37452
37453
37454
37455
37456
37457
37458
37459
37460
37461
37462
37463
37464
37465
37466
37467
37468
37469
37470
37471
37472
37473
37474
37475
37476
37477
37478
37479
37480
37481
37482
37483
37484
37485
37486
37487
37488
37489
37490
37491
37492
37493
37494
37495
37496
37497
37498
37499
37500
37501
37502
37503
37504
37505
37506
37507
37508
37509
37510
37511
37512
37513
37514
37515
37516
37517
37518
37519
37520
37521
37522
37523
37524
37525
37526
37527
37528
37529
37530
37531
37532
37533
37534
37535
37536
37537
37538
37539
37540
37541
37542
37543
37544
37545
37546
37547
37548
37549
37550
37551
37552
37553
37554
37555
37556
37557
37558
37559
37560
37561
37562
37563
37564
37565
37566
37567
37568
37569
37570
37571
37572
37573
37574
37575
37576
37577
37578
37579
37580
37581
37582
37583
37584
37585
37586
37587
37588
37589
37590
37591
37592
37593
37594
37595
37596
37597
37598
37599
37600
37601
37602
37603
37604
37605
37606
37607
37608
37609
37610
37611
37612
37613
37614
37615
37616
37617
37618
37619
37620
37621
37622
37623
37624
37625
37626
37627
37628
37629
37630
37631
37632
37633
37634
37635
37636
37637
37638
37639
37640
37641
37642
37643
37644
37645
37646
37647
37648
37649
37650
37651
37652
37653
37654
37655
37656
37657
37658
37659
37660
37661
37662
37663
37664
37665
37666
37667
37668
37669
37670
37671
37672
37673
37674
37675
37676
37677
37678
37679
37680
37681
37682
37683
37684
37685
37686
37687
37688
37689
37690
37691
37692
37693
37694
37695
37696
37697
37698
37699
37700
37701
37702
37703
37704
37705
37706
37707
37708
37709
37710
37711
37712
37713
37714
37715
37716
37717
37718
37719
37720
37721
37722
37723
37724
37725
37726
37727
37728
37729
37730
37731
37732
37733
37734
37735
37736
37737
37738
37739
37740
37741
37742
37743
37744
37745
37746
37747
37748
37749
37750
37751
37752
37753
37754
37755
37756
37757
37758
37759
37760
37761
37762
37763
37764
37765
37766
37767
37768
37769
37770
37771
37772
37773
37774
37775
37776
37777
37778
37779
37780
37781
37782
37783
37784
37785
37786
37787
37788
37789
37790
37791
37792
37793
37794
37795
37796
37797
37798
37799
37800
37801
37802
37803
37804
37805
37806
37807
37808
37809
37810
37811
37812
37813
37814
37815
37816
37817
37818
37819
37820
37821
37822
37823
37824
37825
37826
37827
37828
37829
37830
37831
37832
37833
37834
37835
37836
37837
37838
37839
37840
37841
37842
37843
37844
37845
37846
37847
37848
37849
37850
37851
37852
37853
37854
37855
37856
37857
37858
37859
37860
37861
37862
37863
37864
37865
37866
37867
37868
37869
37870
37871
37872
37873
37874
37875
37876
37877
37878
37879
37880
37881
37882
37883
37884
37885
37886
37887
37888
37889
37890
37891
37892
37893
37894
37895
37896
37897
37898
37899
37900
37901
37902
37903
37904
37905
37906
37907
37908
37909
37910
37911
37912
37913
37914
37915
37916
37917
37918
37919
37920
37921
37922
37923
37924
37925
37926
37927
37928
37929
37930
37931
37932
37933
37934
37935
37936
37937
37938
37939
37940
37941
37942
37943
37944
37945
37946
37947
37948
37949
37950
37951
37952
37953
37954
37955
37956
37957
37958
37959
37960
37961
37962
37963
37964
37965
37966
37967
37968
37969
37970
37971
37972
37973
37974
37975
37976
37977
37978
37979
37980
37981
37982
37983
37984
37985
37986
37987
37988
37989
37990
37991
37992
37993
37994
37995
37996
37997
37998
37999
38000
38001
38002
38003
38004
38005
38006
38007
38008
38009
38010
38011
38012
38013
38014
38015
38016
38017
38018
38019
38020
38021
38022
38023
38024
38025
38026
38027
38028
38029
38030
38031
38032
38033
38034
38035
38036
38037
38038
38039
38040
38041
38042
38043
38044
38045
38046
38047
38048
38049
38050
38051
38052
38053
38054
38055
38056
38057
38058
38059
38060
38061
38062
38063
38064
38065
38066
38067
38068
38069
38070
38071
38072
38073
38074
38075
38076
38077
38078
38079
38080
38081
38082
38083
38084
38085
38086
38087
38088
38089
38090
38091
38092
38093
38094
38095
38096
38097
38098
38099
38100
38101
38102
38103
38104
38105
38106
38107
38108
38109
38110
38111
38112
38113
38114
38115
38116
38117
38118
38119
38120
38121
38122
38123
38124
38125
38126
38127
38128
38129
38130
38131
38132
38133
38134
38135
38136
38137
38138
38139
38140
38141
38142
38143
38144
38145
38146
38147
38148
38149
38150
38151
38152
38153
38154
38155
38156
38157
38158
38159
38160
38161
38162
38163
38164
38165
38166
38167
38168
38169
38170
38171
38172
38173
38174
38175
38176
38177
38178
38179
38180
38181
38182
38183
38184
38185
38186
38187
38188
38189
38190
38191
38192
38193
38194
38195
38196
38197
38198
38199
38200
38201
38202
38203
38204
38205
38206
38207
38208
38209
38210
38211
38212
38213
38214
38215
38216
38217
38218
38219
38220
38221
38222
38223
38224
38225
38226
38227
38228
38229
38230
38231
38232
38233
38234
38235
38236
38237
38238
38239
38240
38241
38242
38243
38244
38245
38246
38247
38248
38249
38250
38251
38252
38253
38254
38255
38256
38257
38258
38259
38260
38261
38262
38263
38264
38265
38266
38267
38268
38269
38270
38271
38272
38273
38274
38275
38276
38277
38278
38279
38280
38281
38282
38283
38284
38285
38286
38287
38288
38289
38290
38291
38292
38293
38294
38295
38296
38297
38298
38299
38300
38301
38302
38303
38304
38305
38306
38307
38308
38309
38310
38311
38312
38313
38314
38315
38316
38317
38318
38319
38320
38321
38322
38323
38324
38325
38326
38327
38328
38329
38330
38331
38332
38333
38334
38335
38336
38337
38338
38339
38340
38341
38342
38343
38344
38345
38346
38347
38348
38349
38350
38351
38352
38353
38354
38355
38356
38357
38358
38359
38360
38361
38362
38363
38364
38365
38366
38367
38368
38369
38370
38371
38372
38373
38374
38375
38376
38377
38378
38379
38380
38381
38382
38383
38384
38385
38386
38387
38388
38389
38390
38391
38392
38393
38394
38395
38396
38397
38398
38399
38400
38401
38402
38403
38404
38405
38406
38407
38408
38409
38410
38411
38412
38413
38414
38415
38416
38417
38418
38419
38420
38421
38422
38423
38424
38425
38426
38427
38428
38429
38430
38431
38432
38433
38434
38435
38436
38437
38438
38439
38440
38441
38442
38443
38444
38445
38446
38447
38448
38449
38450
38451
38452
38453
38454
38455
38456
38457
38458
38459
38460
38461
38462
38463
38464
38465
38466
38467
38468
38469
38470
38471
38472
38473
38474
38475
38476
38477
38478
38479
38480
38481
38482
38483
38484
38485
38486
38487
38488
38489
38490
38491
38492
38493
38494
38495
38496
38497
38498
38499
38500
38501
38502
38503
38504
38505
38506
38507
38508
38509
38510
38511
38512
38513
38514
38515
38516
38517
38518
38519
38520
38521
38522
38523
38524
38525
38526
38527
38528
38529
38530
38531
38532
38533
38534
38535
38536
38537
38538
38539
38540
38541
38542
38543
38544
38545
38546
38547
38548
38549
38550
38551
38552
38553
38554
38555
38556
38557
38558
38559
38560
38561
38562
38563
38564
38565
38566
38567
38568
38569
38570
38571
38572
38573
38574
38575
38576
38577
38578
38579
38580
38581
38582
38583
38584
38585
38586
38587
38588
38589
38590
38591
38592
38593
38594
38595
38596
38597
38598
38599
38600
38601
38602
38603
38604
38605
38606
38607
38608
38609
38610
38611
38612
38613
38614
38615
38616
38617
38618
38619
38620
38621
38622
38623
38624
38625
38626
38627
38628
38629
38630
38631
38632
38633
38634
38635
38636
38637
38638
38639
38640
38641
38642
38643
38644
38645
38646
38647
38648
38649
38650
38651
38652
38653
38654
38655
38656
38657
38658
38659
38660
38661
38662
38663
38664
38665
38666
38667
38668
38669
38670
38671
38672
38673
38674
38675
38676
38677
38678
38679
38680
38681
38682
38683
38684
38685
38686
38687
38688
38689
38690
38691
38692
38693
38694
38695
38696
38697
38698
38699
38700
38701
38702
38703
38704
38705
38706
38707
38708
38709
38710
38711
38712
38713
38714
38715
38716
38717
38718
38719
38720
38721
38722
38723
38724
38725
38726
38727
38728
38729
38730
38731
38732
38733
38734
38735
38736
38737
38738
38739
38740
38741
38742
38743
38744
38745
38746
38747
38748
38749
38750
38751
38752
38753
38754
38755
38756
38757
38758
38759
38760
38761
38762
38763
38764
38765
38766
38767
38768
38769
38770
38771
38772
38773
38774
38775
38776
38777
38778
38779
38780
38781
38782
38783
38784
38785
38786
38787
38788
38789
38790
38791
38792
38793
38794
38795
38796
38797
38798
38799
38800
38801
38802
38803
38804
38805
38806
38807
38808
38809
38810
38811
38812
38813
38814
38815
38816
38817
38818
38819
38820
38821
38822
38823
38824
38825
38826
38827
38828
38829
38830
38831
38832
38833
38834
38835
38836
38837
38838
38839
38840
38841
38842
38843
38844
38845
38846
38847
38848
38849
38850
38851
38852
38853
38854
38855
38856
38857
38858
38859
38860
38861
38862
38863
38864
38865
38866
38867
38868
38869
38870
38871
38872
38873
38874
38875
38876
38877
38878
38879
38880
38881
38882
38883
38884
38885
38886
38887
38888
38889
38890
38891
38892
38893
38894
38895
38896
38897
38898
38899
38900
38901
38902
38903
38904
38905
38906
38907
38908
38909
38910
38911
38912
38913
38914
38915
38916
38917
38918
38919
38920
38921
38922
38923
38924
38925
38926
38927
38928
38929
38930
38931
38932
38933
38934
38935
38936
38937
38938
38939
38940
38941
38942
38943
38944
38945
38946
38947
38948
38949
38950
38951
38952
38953
38954
38955
38956
38957
38958
38959
38960
38961
38962
38963
38964
38965
38966
38967
38968
38969
38970
38971
38972
38973
38974
38975
38976
38977
38978
38979
38980
38981
38982
38983
38984
38985
38986
38987
38988
38989
38990
38991
38992
38993
38994
38995
38996
38997
38998
38999
39000
39001
39002
39003
39004
39005
39006
39007
39008
39009
39010
39011
39012
39013
39014
39015
39016
39017
39018
39019
39020
39021
39022
39023
39024
39025
39026
39027
39028
39029
39030
39031
39032
39033
39034
39035
39036
39037
39038
39039
39040
39041
39042
39043
39044
39045
39046
39047
39048
39049
39050
39051
39052
39053
39054
39055
39056
39057
39058
39059
39060
39061
39062
39063
39064
39065
39066
39067
39068
39069
39070
39071
39072
39073
39074
39075
39076
39077
39078
39079
39080
39081
39082
39083
39084
39085
39086
39087
39088
39089
39090
39091
39092
39093
39094
39095
39096
39097
39098
39099
39100
39101
39102
39103
39104
39105
39106
39107
39108
39109
39110
39111
39112
39113
39114
39115
39116
39117
39118
39119
39120
39121
39122
39123
39124
39125
39126
39127
39128
39129
39130
39131
39132
39133
39134
39135
39136
39137
39138
39139
39140
39141
39142
39143
39144
39145
39146
39147
39148
39149
39150
39151
39152
39153
39154
39155
39156
39157
39158
39159
39160
39161
39162
39163
39164
39165
39166
39167
39168
39169
39170
39171
39172
39173
39174
39175
39176
39177
39178
39179
39180
39181
39182
39183
39184
39185
39186
39187
39188
39189
39190
39191
39192
39193
39194
39195
39196
39197
39198
39199
39200
39201
39202
39203
39204
39205
39206
39207
39208
39209
39210
39211
39212
39213
39214
39215
39216
39217
39218
39219
39220
39221
39222
39223
39224
39225
39226
39227
39228
39229
39230
39231
39232
39233
39234
39235
39236
39237
39238
39239
39240
39241
39242
39243
39244
39245
39246
39247
39248
39249
39250
39251
39252
39253
39254
39255
39256
39257
39258
39259
39260
39261
39262
39263
39264
39265
39266
39267
39268
39269
39270
39271
39272
39273
39274
39275
39276
39277
39278
39279
39280
39281
39282
39283
39284
39285
39286
39287
39288
39289
39290
39291
39292
39293
39294
39295
39296
39297
39298
39299
39300
39301
39302
39303
39304
39305
39306
39307
39308
39309
39310
39311
39312
39313
39314
39315
39316
39317
39318
39319
39320
39321
39322
39323
39324
39325
39326
39327
39328
39329
39330
39331
39332
39333
39334
39335
39336
39337
39338
39339
39340
39341
39342
39343
39344
39345
39346
39347
39348
39349
39350
39351
39352
39353
39354
39355
39356
39357
39358
39359
39360
39361
39362
39363
39364
39365
39366
39367
39368
39369
39370
39371
39372
39373
39374
39375
39376
39377
39378
39379
39380
39381
39382
39383
39384
39385
39386
39387
39388
39389
39390
39391
39392
39393
39394
39395
39396
39397
39398
39399
39400
39401
39402
39403
39404
39405
39406
39407
39408
39409
39410
39411
39412
39413
39414
39415
39416
39417
39418
39419
39420
39421
39422
39423
39424
39425
39426
39427
39428
39429
39430
39431
39432
39433
39434
39435
39436
39437
39438
39439
39440
39441
39442
39443
39444
39445
39446
39447
39448
39449
39450
39451
39452
39453
39454
39455
39456
39457
39458
39459
39460
39461
39462
39463
39464
39465
39466
39467
39468
39469
39470
39471
39472
39473
39474
39475
39476
39477
39478
39479
39480
39481
39482
39483
39484
39485
39486
39487
39488
39489
39490
39491
39492
39493
39494
39495
39496
39497
39498
39499
39500
39501
39502
39503
39504
39505
39506
39507
39508
39509
39510
39511
39512
39513
39514
39515
39516
39517
39518
39519
39520
39521
39522
39523
39524
39525
39526
39527
39528
39529
39530
39531
39532
39533
39534
39535
39536
39537
39538
39539
39540
39541
39542
39543
39544
39545
39546
39547
39548
39549
39550
39551
39552
39553
39554
39555
39556
39557
39558
39559
39560
39561
39562
39563
39564
39565
39566
39567
39568
39569
39570
39571
39572
39573
39574
39575
39576
39577
39578
39579
39580
39581
39582
39583
39584
39585
39586
39587
39588
39589
39590
39591
39592
39593
39594
39595
39596
39597
39598
39599
39600
39601
39602
39603
39604
39605
39606
39607
39608
39609
39610
39611
39612
39613
39614
39615
39616
39617
39618
39619
39620
39621
39622
39623
39624
39625
39626
39627
39628
39629
39630
39631
39632
39633
39634
39635
39636
39637
39638
39639
39640
39641
39642
39643
39644
39645
39646
39647
39648
39649
39650
39651
39652
39653
39654
39655
39656
39657
39658
39659
39660
39661
39662
39663
39664
39665
39666
39667
39668
39669
39670
39671
39672
39673
39674
39675
39676
39677
39678
39679
39680
39681
39682
39683
39684
39685
39686
39687
39688
39689
39690
39691
39692
39693
39694
39695
39696
39697
39698
39699
39700
39701
39702
39703
39704
39705
39706
39707
39708
39709
39710
39711
39712
39713
39714
39715
39716
39717
39718
39719
39720
39721
39722
39723
39724
39725
39726
39727
39728
39729
39730
39731
39732
39733
39734
39735
39736
39737
39738
39739
39740
39741
39742
39743
39744
39745
39746
39747
39748
39749
39750
39751
39752
39753
39754
39755
39756
39757
39758
39759
39760
39761
39762
39763
39764
39765
39766
39767
39768
39769
39770
39771
39772
39773
39774
39775
39776
39777
39778
39779
39780
39781
39782
39783
39784
39785
39786
39787
39788
39789
39790
39791
39792
39793
39794
39795
39796
39797
39798
39799
39800
39801
39802
39803
39804
39805
39806
39807
39808
39809
39810
39811
39812
39813
39814
39815
39816
39817
39818
39819
39820
39821
39822
39823
39824
39825
39826
39827
39828
39829
39830
39831
39832
39833
39834
39835
39836
39837
39838
39839
39840
39841
39842
39843
39844
39845
39846
39847
39848
39849
39850
39851
39852
39853
39854
39855
39856
39857
39858
39859
39860
39861
39862
39863
39864
39865
39866
39867
39868
39869
39870
39871
39872
39873
39874
39875
39876
39877
39878
39879
39880
39881
39882
39883
39884
39885
39886
39887
39888
39889
39890
39891
39892
39893
39894
39895
39896
39897
39898
39899
39900
39901
39902
39903
39904
39905
39906
39907
39908
39909
39910
39911
39912
39913
39914
39915
39916
39917
39918
39919
39920
39921
39922
39923
39924
39925
39926
39927
39928
39929
39930
39931
39932
39933
39934
39935
39936
39937
39938
39939
39940
39941
39942
39943
39944
39945
39946
39947
39948
39949
39950
39951
39952
39953
39954
39955
39956
39957
39958
39959
39960
39961
39962
39963
39964
39965
39966
39967
39968
39969
39970
39971
39972
39973
39974
39975
39976
39977
39978
39979
39980
39981
39982
39983
39984
39985
39986
39987
39988
39989
39990
39991
39992
39993
39994
39995
39996
39997
39998
39999
40000
40001
40002
40003
40004
40005
40006
40007
40008
40009
40010
40011
40012
40013
40014
40015
40016
40017
40018
40019
40020
40021
40022
40023
40024
40025
40026
40027
40028
40029
40030
40031
40032
40033
40034
40035
40036
40037
40038
40039
40040
40041
40042
40043
40044
40045
40046
40047
40048
40049
40050
40051
40052
40053
40054
40055
40056
40057
40058
40059
40060
40061
40062
40063
40064
40065
40066
40067
40068
40069
40070
40071
40072
40073
40074
40075
40076
40077
40078
40079
40080
40081
40082
40083
40084
40085
40086
40087
40088
40089
40090
40091
40092
40093
40094
40095
40096
40097
40098
40099
40100
40101
40102
40103
40104
40105
40106
40107
40108
40109
40110
40111
40112
40113
40114
40115
40116
40117
40118
40119
40120
40121
40122
40123
40124
40125
40126
40127
40128
40129
40130
40131
40132
40133
40134
40135
40136
40137
40138
40139
40140
40141
40142
40143
40144
40145
40146
40147
40148
40149
40150
40151
40152
40153
40154
40155
40156
40157
40158
40159
40160
40161
40162
40163
40164
40165
40166
40167
40168
40169
40170
40171
40172
40173
40174
40175
40176
40177
40178
40179
40180
40181
40182
40183
40184
40185
40186
40187
40188
40189
40190
40191
40192
40193
40194
40195
40196
40197
40198
40199
40200
40201
40202
40203
40204
40205
40206
40207
40208
40209
40210
40211
40212
40213
40214
40215
40216
40217
40218
40219
40220
40221
40222
40223
40224
40225
40226
40227
40228
40229
40230
40231
40232
40233
40234
40235
40236
40237
40238
40239
40240
40241
40242
40243
40244
40245
40246
40247
40248
40249
40250
40251
40252
40253
40254
40255
40256
40257
40258
40259
40260
40261
40262
40263
40264
40265
40266
40267
40268
40269
40270
40271
40272
40273
40274
40275
40276
40277
40278
40279
40280
40281
40282
40283
40284
40285
40286
40287
40288
40289
40290
40291
40292
40293
40294
40295
40296
40297
40298
40299
40300
40301
40302
40303
40304
40305
40306
40307
40308
40309
40310
40311
40312
40313
40314
40315
40316
40317
40318
40319
40320
40321
40322
40323
40324
40325
40326
40327
40328
40329
40330
40331
40332
40333
40334
40335
40336
40337
40338
40339
40340
40341
40342
40343
40344
40345
40346
40347
40348
40349
40350
40351
40352
40353
40354
40355
40356
40357
40358
40359
40360
40361
40362
40363
40364
40365
40366
40367
40368
40369
40370
40371
40372
40373
40374
40375
40376
40377
40378
40379
40380
40381
40382
40383
40384
40385
40386
40387
40388
40389
40390
40391
40392
40393
40394
40395
40396
40397
40398
40399
40400
40401
40402
40403
40404
40405
40406
40407
40408
40409
40410
40411
40412
40413
40414
40415
40416
40417
40418
40419
40420
40421
40422
40423
40424
40425
40426
40427
40428
40429
40430
40431
40432
40433
40434
40435
40436
40437
40438
40439
40440
40441
40442
40443
40444
40445
40446
40447
40448
40449
40450
40451
40452
40453
40454
40455
40456
40457
40458
40459
40460
40461
40462
40463
40464
40465
40466
40467
40468
40469
40470
40471
40472
40473
40474
40475
40476
40477
40478
40479
40480
40481
40482
40483
40484
40485
40486
40487
40488
40489
40490
40491
40492
40493
40494
40495
40496
40497
40498
40499
40500
40501
40502
40503
40504
40505
40506
40507
40508
40509
40510
40511
40512
40513
40514
40515
40516
40517
40518
40519
40520
40521
40522
40523
40524
40525
40526
40527
40528
40529
40530
40531
40532
40533
40534
40535
40536
40537
40538
40539
40540
40541
40542
40543
40544
40545
40546
40547
40548
40549
40550
40551
40552
40553
40554
40555
40556
40557
40558
40559
40560
40561
40562
40563
40564
40565
40566
40567
40568
40569
40570
40571
40572
40573
40574
40575
40576
40577
40578
40579
40580
40581
40582
40583
40584
40585
40586
40587
40588
40589
40590
40591
40592
40593
40594
40595
40596
40597
40598
40599
40600
40601
40602
40603
40604
40605
40606
40607
40608
40609
40610
40611
40612
40613
40614
40615
40616
40617
40618
40619
40620
40621
40622
40623
40624
40625
40626
40627
40628
40629
40630
40631
40632
40633
40634
40635
40636
40637
40638
40639
40640
40641
40642
40643
40644
40645
40646
40647
40648
40649
40650
40651
40652
40653
40654
40655
40656
40657
40658
40659
40660
40661
40662
40663
40664
40665
40666
40667
40668
40669
40670
40671
40672
40673
40674
40675
40676
40677
40678
40679
40680
40681
40682
40683
40684
40685
40686
40687
40688
40689
40690
40691
40692
40693
40694
40695
40696
40697
40698
40699
40700
40701
40702
40703
40704
40705
40706
40707
40708
40709
40710
40711
40712
40713
40714
40715
40716
40717
40718
40719
40720
40721
40722
40723
40724
40725
40726
40727
40728
40729
40730
40731
40732
40733
40734
40735
40736
40737
40738
40739
40740
40741
40742
40743
40744
40745
40746
40747
40748
40749
40750
40751
40752
40753
40754
40755
40756
40757
40758
40759
40760
40761
40762
40763
40764
40765
40766
40767
40768
40769
40770
40771
40772
40773
40774
40775
40776
40777
40778
40779
40780
40781
40782
40783
40784
40785
40786
40787
40788
40789
40790
40791
40792
40793
40794
40795
40796
40797
40798
40799
40800
40801
40802
40803
40804
40805
40806
40807
40808
40809
40810
40811
40812
40813
40814
40815
40816
40817
40818
40819
40820
40821
40822
40823
40824
40825
40826
40827
40828
40829
40830
40831
40832
40833
40834
40835
40836
40837
40838
40839
40840
40841
40842
40843
40844
40845
40846
40847
40848
40849
40850
40851
40852
40853
40854
40855
40856
40857
40858
40859
40860
40861
40862
40863
40864
40865
40866
40867
40868
40869
40870
40871
40872
40873
40874
40875
40876
40877
40878
40879
40880
40881
40882
40883
40884
40885
40886
40887
40888
40889
40890
40891
40892
40893
40894
40895
40896
40897
40898
40899
40900
40901
40902
40903
40904
40905
40906
40907
40908
40909
40910
40911
40912
40913
40914
40915
40916
40917
40918
40919
40920
40921
40922
40923
40924
40925
40926
40927
40928
40929
40930
40931
40932
40933
40934
40935
40936
40937
40938
40939
40940
40941
40942
40943
40944
40945
40946
40947
40948
40949
40950
40951
40952
40953
40954
40955
40956
40957
40958
40959
40960
40961
40962
40963
40964
40965
40966
40967
40968
40969
40970
40971
40972
40973
40974
40975
40976
40977
40978
40979
40980
40981
40982
40983
40984
40985
40986
40987
40988
40989
40990
40991
40992
40993
40994
40995
40996
40997
40998
40999
41000
41001
41002
41003
41004
41005
41006
41007
41008
41009
41010
41011
41012
41013
41014
41015
41016
41017
41018
41019
41020
41021
41022
41023
41024
41025
41026
41027
41028
41029
41030
41031
41032
41033
41034
41035
41036
41037
41038
41039
41040
41041
41042
41043
41044
41045
41046
41047
41048
41049
41050
41051
41052
41053
41054
41055
41056
41057
41058
41059
41060
41061
41062
41063
41064
41065
41066
41067
41068
41069
41070
41071
41072
41073
41074
41075
41076
41077
41078
41079
41080
41081
41082
41083
41084
41085
41086
41087
41088
41089
41090
41091
41092
41093
41094
41095
41096
41097
41098
41099
41100
41101
41102
41103
41104
41105
41106
41107
41108
41109
41110
41111
41112
41113
41114
41115
41116
41117
41118
41119
41120
41121
41122
41123
41124
41125
41126
41127
41128
41129
41130
41131
41132
41133
41134
41135
41136
41137
41138
41139
41140
41141
41142
41143
41144
41145
41146
41147
41148
41149
41150
41151
41152
41153
41154
41155
41156
41157
41158
41159
41160
41161
41162
41163
41164
41165
41166
41167
41168
41169
41170
41171
41172
41173
41174
41175
41176
41177
41178
41179
41180
41181
41182
41183
41184
41185
41186
41187
41188
41189
41190
41191
41192
41193
41194
41195
41196
41197
41198
41199
41200
41201
41202
41203
41204
41205
41206
41207
41208
41209
41210
41211
41212
41213
41214
41215
41216
41217
41218
41219
41220
41221
41222
41223
41224
41225
41226
41227
41228
41229
41230
41231
41232
41233
41234
41235
41236
41237
41238
41239
41240
41241
41242
41243
41244
41245
41246
41247
41248
41249
41250
41251
41252
41253
41254
41255
41256
41257
41258
41259
41260
41261
41262
41263
41264
41265
41266
41267
41268
41269
41270
41271
41272
41273
41274
41275
41276
41277
41278
41279
41280
41281
41282
41283
41284
41285
41286
41287
41288
41289
41290
41291
41292
41293
41294
41295
41296
41297
41298
41299
41300
41301
41302
41303
41304
41305
41306
41307
41308
41309
41310
41311
41312
41313
41314
41315
41316
41317
41318
41319
41320
41321
41322
41323
41324
41325
41326
41327
41328
41329
41330
41331
41332
41333
41334
41335
41336
41337
41338
41339
41340
41341
41342
41343
41344
41345
41346
41347
41348
41349
41350
41351
41352
41353
41354
41355
41356
41357
41358
41359
41360
41361
41362
41363
41364
41365
41366
41367
41368
41369
41370
41371
41372
41373
41374
41375
41376
41377
41378
41379
41380
41381
41382
41383
41384
41385
41386
41387
41388
41389
41390
41391
41392
41393
41394
41395
41396
41397
41398
41399
41400
41401
41402
41403
41404
41405
41406
41407
41408
41409
41410
41411
41412
41413
41414
41415
41416
41417
41418
41419
41420
41421
41422
41423
41424
41425
41426
41427
41428
41429
41430
41431
41432
41433
41434
41435
41436
41437
41438
41439
41440
41441
41442
41443
41444
41445
41446
41447
41448
41449
41450
41451
41452
41453
41454
41455
41456
41457
41458
41459
41460
41461
41462
41463
41464
41465
41466
41467
41468
41469
41470
41471
41472
41473
41474
41475
41476
41477
41478
41479
41480
41481
41482
41483
41484
41485
41486
41487
41488
41489
41490
41491
41492
41493
41494
41495
41496
41497
41498
41499
41500
41501
41502
41503
41504
41505
41506
41507
41508
41509
41510
41511
41512
41513
41514
41515
41516
41517
41518
41519
41520
41521
41522
41523
41524
41525
41526
41527
41528
41529
41530
41531
41532
41533
41534
41535
41536
41537
41538
41539
41540
41541
41542
41543
41544
41545
41546
41547
41548
41549
41550
41551
41552
41553
41554
41555
41556
41557
41558
41559
41560
41561
41562
41563
41564
41565
41566
41567
41568
41569
41570
41571
41572
41573
41574
41575
41576
41577
41578
41579
41580
41581
41582
41583
41584
41585
41586
41587
41588
41589
41590
41591
41592
41593
41594
41595
41596
41597
41598
41599
41600
41601
41602
41603
41604
41605
41606
41607
41608
41609
41610
41611
41612
41613
41614
41615
41616
41617
41618
41619
41620
41621
41622
41623
41624
41625
41626
41627
41628
41629
41630
41631
41632
41633
41634
41635
41636
41637
41638
41639
41640
41641
41642
41643
41644
41645
41646
41647
41648
41649
41650
41651
41652
41653
41654
41655
41656
41657
41658
41659
41660
41661
41662
41663
41664
41665
41666
41667
41668
41669
41670
41671
41672
41673
41674
41675
41676
41677
41678
41679
41680
41681
41682
41683
41684
41685
41686
41687
41688
41689
41690
41691
41692
41693
41694
41695
41696
41697
41698
41699
41700
41701
41702
41703
41704
41705
41706
41707
41708
41709
41710
41711
41712
41713
41714
41715
41716
41717
41718
41719
41720
41721
41722
41723
41724
41725
41726
41727
41728
41729
41730
41731
41732
41733
41734
41735
41736
41737
41738
41739
41740
41741
41742
41743
41744
41745
41746
41747
41748
41749
41750
41751
41752
41753
41754
41755
41756
41757
41758
41759
41760
41761
41762
41763
41764
41765
41766
41767
41768
41769
41770
41771
41772
41773
41774
41775
41776
41777
41778
41779
41780
41781
41782
41783
41784
41785
41786
41787
41788
41789
41790
41791
41792
41793
41794
41795
41796
41797
41798
41799
41800
41801
41802
41803
41804
41805
41806
41807
41808
41809
41810
41811
41812
41813
41814
41815
41816
41817
41818
41819
41820
41821
41822
41823
41824
41825
41826
41827
41828
41829
41830
41831
41832
41833
41834
41835
41836
41837
41838
41839
41840
41841
41842
41843
41844
41845
41846
41847
41848
41849
41850
41851
41852
41853
41854
41855
41856
41857
41858
41859
41860
41861
41862
41863
41864
41865
41866
41867
41868
41869
41870
41871
41872
41873
41874
41875
41876
41877
41878
41879
41880
41881
41882
41883
41884
41885
41886
41887
41888
41889
41890
41891
41892
41893
41894
41895
41896
41897
41898
41899
41900
41901
41902
41903
41904
41905
41906
41907
41908
41909
41910
41911
41912
41913
41914
41915
41916
41917
41918
41919
41920
41921
41922
41923
41924
41925
41926
41927
41928
41929
41930
41931
41932
41933
41934
41935
41936
41937
41938
41939
41940
41941
41942
41943
41944
41945
41946
41947
41948
41949
41950
41951
41952
41953
41954
41955
41956
41957
41958
41959
41960
41961
41962
41963
41964
41965
41966
41967
41968
41969
41970
41971
41972
41973
41974
41975
41976
41977
41978
41979
41980
41981
41982
41983
41984
41985
41986
41987
41988
41989
41990
41991
41992
41993
41994
41995
41996
41997
41998
41999
42000
42001
42002
42003
42004
42005
42006
42007
42008
42009
42010
42011
42012
42013
42014
42015
42016
42017
42018
42019
42020
42021
42022
42023
42024
42025
42026
42027
42028
42029
42030
42031
42032
42033
42034
42035
42036
42037
42038
42039
42040
42041
42042
42043
42044
42045
42046
42047
42048
42049
42050
42051
42052
42053
42054
42055
42056
42057
42058
42059
42060
42061
42062
42063
42064
42065
42066
42067
42068
42069
42070
42071
42072
42073
42074
42075
42076
42077
42078
42079
42080
42081
42082
42083
42084
42085
42086
42087
42088
42089
42090
42091
42092
42093
42094
42095
42096
42097
42098
42099
42100
42101
42102
42103
42104
42105
42106
42107
42108
42109
42110
42111
42112
42113
42114
42115
42116
42117
42118
42119
42120
42121
42122
42123
42124
42125
42126
42127
42128
42129
42130
42131
42132
42133
42134
42135
42136
42137
42138
42139
42140
42141
42142
42143
42144
42145
42146
42147
42148
42149
42150
42151
42152
42153
42154
42155
42156
42157
42158
42159
42160
42161
42162
42163
42164
42165
42166
42167
42168
42169
42170
42171
42172
42173
42174
42175
42176
42177
42178
42179
42180
42181
42182
42183
42184
42185
42186
42187
42188
42189
42190
42191
42192
42193
42194
42195
42196
42197
42198
42199
42200
42201
42202
42203
42204
42205
42206
42207
42208
42209
42210
42211
42212
42213
42214
42215
42216
42217
42218
42219
42220
42221
42222
42223
42224
42225
42226
42227
42228
42229
42230
42231
42232
42233
42234
42235
42236
42237
42238
42239
42240
42241
42242
42243
42244
42245
42246
42247
42248
42249
42250
42251
42252
42253
42254
42255
42256
42257
42258
42259
42260
42261
42262
42263
42264
42265
42266
42267
42268
42269
42270
42271
42272
42273
42274
42275
42276
42277
42278
42279
42280
42281
42282
42283
42284
42285
42286
42287
42288
42289
42290
42291
42292
42293
42294
42295
42296
42297
42298
42299
42300
42301
42302
42303
42304
42305
42306
42307
42308
42309
42310
42311
42312
42313
42314
42315
42316
42317
42318
42319
42320
42321
42322
42323
42324
42325
42326
42327
42328
42329
42330
42331
42332
42333
42334
42335
42336
42337
42338
42339
42340
42341
42342
42343
42344
42345
42346
42347
42348
42349
42350
42351
42352
42353
42354
42355
42356
42357
42358
42359
42360
42361
42362
42363
42364
42365
42366
42367
42368
42369
42370
42371
42372
42373
42374
42375
42376
42377
42378
42379
42380
42381
42382
42383
42384
42385
42386
42387
42388
42389
42390
42391
42392
42393
42394
42395
42396
42397
42398
42399
42400
42401
42402
42403
42404
42405
42406
42407
42408
42409
42410
42411
42412
42413
42414
42415
42416
42417
42418
42419
42420
42421
42422
42423
42424
42425
42426
42427
42428
42429
42430
42431
42432
42433
42434
42435
42436
42437
42438
42439
42440
42441
42442
42443
42444
42445
42446
42447
42448
42449
42450
42451
42452
42453
42454
42455
42456
42457
42458
42459
42460
42461
42462
42463
42464
42465
42466
42467
42468
42469
42470
42471
42472
42473
42474
42475
42476
42477
42478
42479
42480
42481
42482
42483
42484
42485
42486
42487
42488
42489
42490
42491
42492
42493
42494
42495
42496
42497
42498
42499
42500
42501
42502
42503
42504
42505
42506
42507
42508
42509
42510
42511
42512
42513
42514
42515
42516
42517
42518
42519
42520
42521
42522
42523
42524
42525
42526
42527
42528
42529
42530
42531
42532
42533
42534
42535
42536
42537
42538
42539
42540
42541
42542
42543
42544
42545
42546
42547
42548
42549
42550
42551
42552
42553
42554
42555
42556
42557
42558
42559
42560
42561
42562
42563
42564
42565
42566
42567
42568
42569
42570
42571
42572
42573
42574
42575
42576
42577
42578
42579
42580
42581
42582
42583
42584
42585
42586
42587
42588
42589
42590
42591
42592
42593
42594
42595
42596
42597
42598
42599
42600
42601
42602
42603
42604
42605
42606
42607
42608
42609
42610
42611
42612
42613
42614
42615
42616
42617
42618
42619
42620
42621
42622
42623
42624
42625
42626
42627
42628
42629
42630
42631
42632
42633
42634
42635
42636
42637
42638
42639
42640
42641
42642
42643
42644
42645
42646
42647
42648
42649
42650
42651
42652
42653
42654
42655
42656
42657
42658
42659
42660
42661
42662
42663
42664
42665
42666
42667
42668
42669
42670
42671
42672
42673
42674
42675
42676
42677
42678
42679
42680
42681
42682
42683
42684
42685
42686
42687
42688
42689
42690
42691
42692
42693
42694
42695
42696
42697
42698
42699
42700
42701
42702
42703
42704
42705
42706
42707
42708
42709
42710
42711
42712
42713
42714
42715
42716
42717
42718
42719
42720
42721
42722
42723
42724
42725
42726
42727
42728
42729
42730
42731
42732
42733
42734
42735
42736
42737
42738
42739
42740
42741
42742
42743
42744
42745
42746
42747
42748
42749
42750
42751
42752
42753
42754
42755
42756
42757
42758
42759
42760
42761
42762
42763
42764
42765
42766
42767
42768
42769
42770
42771
42772
42773
42774
42775
42776
42777
42778
42779
42780
42781
42782
42783
42784
42785
42786
42787
42788
42789
42790
42791
42792
42793
42794
42795
42796
42797
42798
42799
42800
42801
42802
42803
42804
42805
42806
42807
42808
42809
42810
42811
42812
42813
42814
42815
42816
42817
42818
42819
42820
42821
42822
42823
42824
42825
42826
42827
42828
42829
42830
42831
42832
42833
42834
42835
42836
42837
42838
42839
42840
42841
42842
42843
42844
42845
42846
42847
42848
42849
42850
42851
42852
42853
42854
42855
42856
42857
42858
42859
42860
42861
42862
42863
42864
42865
42866
42867
42868
42869
42870
42871
42872
42873
42874
42875
42876
42877
42878
42879
42880
42881
42882
42883
42884
42885
42886
42887
42888
42889
42890
42891
42892
42893
42894
42895
42896
42897
42898
42899
42900
42901
42902
42903
42904
42905
42906
42907
42908
42909
42910
42911
42912
42913
42914
42915
42916
42917
42918
42919
42920
42921
42922
42923
42924
42925
42926
42927
42928
42929
42930
42931
42932
42933
42934
42935
42936
42937
42938
42939
42940
42941
42942
42943
42944
42945
42946
42947
42948
42949
42950
42951
42952
42953
42954
42955
42956
42957
42958
42959
42960
42961
42962
42963
42964
42965
42966
42967
42968
42969
42970
42971
42972
42973
42974
42975
42976
42977
42978
42979
42980
42981
42982
42983
42984
42985
42986
42987
42988
42989
42990
42991
42992
42993
42994
42995
42996
42997
42998
42999
43000
43001
43002
43003
43004
43005
43006
43007
43008
43009
43010
43011
43012
43013
43014
43015
43016
43017
43018
43019
43020
43021
43022
43023
43024
43025
43026
43027
43028
43029
43030
43031
43032
43033
43034
43035
43036
43037
43038
43039
43040
43041
43042
43043
43044
43045
43046
43047
43048
43049
43050
43051
43052
43053
43054
43055
43056
43057
43058
43059
43060
43061
43062
43063
43064
43065
43066
43067
43068
43069
43070
43071
43072
43073
43074
43075
43076
43077
43078
43079
43080
43081
43082
43083
43084
43085
43086
43087
43088
43089
43090
43091
43092
43093
43094
43095
43096
43097
43098
43099
43100
43101
43102
43103
43104
43105
43106
43107
43108
43109
43110
43111
43112
43113
43114
43115
43116
43117
43118
43119
43120
43121
43122
43123
43124
43125
43126
43127
43128
43129
43130
43131
43132
43133
43134
43135
43136
43137
43138
43139
43140
43141
43142
43143
43144
43145
43146
43147
43148
43149
43150
43151
43152
43153
43154
43155
43156
43157
43158
43159
43160
43161
43162
43163
43164
43165
43166
43167
43168
43169
43170
43171
43172
43173
43174
43175
43176
43177
43178
43179
43180
43181
43182
43183
43184
43185
43186
43187
43188
43189
43190
43191
43192
43193
43194
43195
43196
43197
43198
43199
43200
43201
43202
43203
43204
43205
43206
43207
43208
43209
43210
43211
43212
43213
43214
43215
43216
43217
43218
43219
43220
43221
43222
43223
43224
43225
43226
43227
43228
43229
43230
43231
43232
43233
43234
43235
43236
43237
43238
43239
43240
43241
43242
43243
43244
43245
43246
43247
43248
43249
43250
43251
43252
43253
43254
43255
43256
43257
43258
43259
43260
43261
43262
43263
43264
43265
43266
43267
43268
43269
43270
43271
43272
43273
43274
43275
43276
43277
43278
43279
43280
43281
43282
43283
43284
43285
43286
43287
43288
43289
43290
43291
43292
43293
43294
43295
43296
43297
43298
43299
43300
43301
43302
43303
43304
43305
43306
43307
43308
43309
43310
43311
43312
43313
43314
43315
43316
43317
43318
43319
43320
43321
43322
43323
43324
43325
43326
43327
43328
43329
43330
43331
43332
43333
43334
43335
43336
43337
43338
43339
43340
43341
43342
43343
43344
43345
43346
43347
43348
43349
43350
43351
43352
43353
43354
43355
43356
43357
43358
43359
43360
43361
43362
43363
43364
43365
43366
43367
43368
43369
43370
43371
43372
43373
43374
43375
43376
43377
43378
43379
43380
43381
43382
43383
43384
43385
43386
43387
43388
43389
43390
43391
43392
43393
43394
43395
43396
43397
43398
43399
43400
43401
43402
43403
43404
43405
43406
43407
43408
43409
43410
43411
43412
43413
43414
43415
43416
43417
43418
43419
43420
43421
43422
43423
43424
43425
43426
43427
43428
43429
43430
43431
43432
43433
43434
43435
43436
43437
43438
43439
43440
43441
43442
43443
43444
43445
43446
43447
43448
43449
43450
43451
43452
43453
43454
43455
43456
43457
43458
43459
43460
43461
43462
43463
43464
43465
43466
43467
43468
43469
43470
43471
43472
43473
43474
43475
43476
43477
43478
43479
43480
43481
43482
43483
43484
43485
43486
43487
43488
43489
43490
43491
43492
43493
43494
43495
43496
43497
43498
43499
43500
43501
43502
43503
43504
43505
43506
43507
43508
43509
43510
43511
43512
43513
43514
43515
43516
43517
43518
43519
43520
43521
43522
43523
43524
43525
43526
43527
43528
43529
43530
43531
43532
43533
43534
43535
43536
43537
43538
43539
43540
43541
43542
43543
43544
43545
43546
43547
43548
43549
43550
43551
43552
43553
43554
43555
43556
43557
43558
43559
43560
43561
43562
43563
43564
43565
43566
43567
43568
43569
43570
43571
43572
43573
43574
43575
43576
43577
43578
43579
43580
43581
43582
43583
43584
43585
43586
43587
43588
43589
43590
43591
43592
43593
43594
43595
43596
43597
43598
43599
43600
43601
43602
43603
43604
43605
43606
43607
43608
43609
43610
43611
43612
43613
43614
43615
43616
43617
43618
43619
43620
43621
43622
43623
43624
43625
43626
43627
43628
43629
43630
43631
43632
43633
43634
43635
43636
43637
43638
43639
43640
43641
43642
43643
43644
43645
43646
43647
43648
43649
43650
43651
43652
43653
43654
43655
43656
43657
43658
43659
43660
43661
43662
43663
43664
43665
43666
43667
43668
43669
43670
43671
43672
43673
43674
43675
43676
43677
43678
43679
43680
43681
43682
43683
43684
43685
43686
43687
43688
43689
43690
43691
43692
43693
43694
43695
43696
43697
43698
43699
43700
43701
43702
43703
43704
43705
43706
43707
43708
43709
43710
43711
43712
43713
43714
43715
43716
43717
43718
43719
43720
43721
43722
43723
43724
43725
43726
43727
43728
43729
43730
43731
43732
43733
43734
43735
43736
43737
43738
43739
43740
43741
43742
43743
43744
43745
43746
43747
43748
43749
43750
43751
43752
43753
43754
43755
43756
43757
43758
43759
43760
43761
43762
43763
43764
43765
43766
43767
43768
43769
43770
43771
43772
43773
43774
43775
43776
43777
43778
43779
43780
43781
43782
43783
43784
43785
43786
43787
43788
43789
43790
43791
43792
43793
43794
43795
43796
43797
43798
43799
43800
43801
43802
43803
43804
43805
43806
43807
43808
43809
43810
43811
43812
43813
43814
43815
43816
43817
43818
43819
43820
43821
43822
43823
43824
43825
43826
43827
43828
43829
43830
43831
43832
43833
43834
43835
43836
43837
43838
43839
43840
43841
43842
43843
43844
43845
43846
43847
43848
43849
43850
43851
43852
43853
43854
43855
43856
43857
43858
43859
43860
43861
43862
43863
43864
43865
43866
43867
43868
43869
43870
43871
43872
43873
43874
43875
43876
43877
43878
43879
43880
43881
43882
43883
43884
43885
43886
43887
43888
43889
43890
43891
43892
43893
43894
43895
43896
43897
43898
43899
43900
43901
43902
43903
43904
43905
43906
43907
43908
43909
43910
43911
43912
43913
43914
43915
43916
43917
43918
43919
43920
43921
43922
43923
43924
43925
43926
43927
43928
43929
43930
43931
43932
43933
43934
43935
43936
43937
43938
43939
43940
43941
43942
43943
43944
43945
43946
43947
43948
43949
43950
43951
43952
43953
43954
43955
43956
43957
43958
43959
43960
43961
43962
43963
43964
43965
43966
43967
43968
43969
43970
43971
43972
43973
43974
43975
43976
43977
43978
43979
43980
43981
43982
43983
43984
43985
43986
43987
43988
43989
43990
43991
43992
43993
43994
43995
43996
43997
43998
43999
44000
44001
44002
44003
44004
44005
44006
44007
44008
44009
44010
44011
44012
44013
44014
44015
44016
44017
44018
44019
44020
44021
44022
44023
44024
44025
44026
44027
44028
44029
44030
44031
44032
44033
44034
44035
44036
44037
44038
44039
44040
44041
44042
44043
44044
44045
44046
44047
44048
44049
44050
44051
44052
44053
44054
44055
44056
44057
44058
44059
44060
44061
44062
44063
44064
44065
44066
44067
44068
44069
44070
44071
44072
44073
44074
44075
44076
44077
44078
44079
44080
44081
44082
44083
44084
44085
44086
44087
44088
44089
44090
44091
44092
44093
44094
44095
44096
44097
44098
44099
44100
44101
44102
44103
44104
44105
44106
44107
44108
44109
44110
44111
44112
44113
44114
44115
44116
44117
44118
44119
44120
44121
44122
44123
44124
44125
44126
44127
44128
44129
44130
44131
44132
44133
44134
44135
44136
44137
44138
44139
44140
44141
44142
44143
44144
44145
44146
44147
44148
44149
44150
44151
44152
44153
44154
44155
44156
44157
44158
44159
44160
44161
44162
44163
44164
44165
44166
44167
44168
44169
44170
44171
44172
44173
44174
44175
44176
44177
44178
44179
44180
44181
44182
44183
44184
44185
44186
44187
44188
44189
44190
44191
44192
44193
44194
44195
44196
44197
44198
44199
44200
44201
44202
44203
44204
44205
44206
44207
44208
44209
44210
44211
44212
44213
44214
44215
44216
44217
44218
44219
44220
44221
44222
44223
44224
44225
44226
44227
44228
44229
44230
44231
44232
44233
44234
44235
44236
44237
44238
44239
44240
44241
44242
44243
44244
44245
44246
44247
44248
44249
44250
44251
44252
44253
44254
44255
44256
44257
44258
44259
44260
44261
44262
44263
44264
44265
44266
44267
44268
44269
44270
44271
44272
44273
44274
44275
44276
44277
44278
44279
44280
44281
44282
44283
44284
44285
44286
44287
44288
44289
44290
44291
44292
44293
44294
44295
44296
44297
44298
44299
44300
44301
44302
44303
44304
44305
44306
44307
44308
44309
44310
44311
44312
44313
44314
44315
44316
44317
44318
44319
44320
44321
44322
44323
44324
44325
44326
44327
44328
44329
44330
44331
44332
44333
44334
44335
44336
44337
44338
44339
44340
44341
44342
44343
44344
44345
44346
44347
44348
44349
44350
44351
44352
44353
44354
44355
44356
44357
44358
44359
44360
44361
44362
44363
44364
44365
44366
44367
44368
44369
44370
44371
44372
44373
44374
44375
44376
44377
44378
44379
44380
44381
44382
44383
44384
44385
44386
44387
44388
44389
44390
44391
44392
44393
44394
44395
44396
44397
44398
44399
44400
44401
44402
44403
44404
44405
44406
44407
44408
44409
44410
44411
44412
44413
44414
44415
44416
44417
44418
44419
44420
44421
44422
44423
44424
44425
44426
44427
44428
44429
44430
44431
44432
44433
44434
44435
44436
44437
44438
44439
44440
44441
44442
44443
44444
44445
44446
44447
44448
44449
44450
44451
44452
44453
44454
44455
44456
44457
44458
44459
44460
44461
44462
44463
44464
44465
44466
44467
44468
44469
44470
44471
44472
44473
44474
44475
44476
44477
44478
44479
44480
44481
44482
44483
44484
44485
44486
44487
44488
44489
44490
44491
44492
44493
44494
44495
44496
44497
44498
44499
44500
44501
44502
44503
44504
44505
44506
44507
44508
44509
44510
44511
44512
44513
44514
44515
44516
44517
44518
44519
44520
44521
44522
44523
44524
44525
44526
44527
44528
44529
44530
44531
44532
44533
44534
44535
44536
44537
44538
44539
44540
44541
44542
44543
44544
44545
44546
44547
44548
44549
44550
44551
44552
44553
44554
44555
44556
44557
44558
44559
44560
44561
44562
44563
44564
44565
44566
44567
44568
44569
44570
44571
44572
44573
44574
44575
44576
44577
44578
44579
44580
44581
44582
44583
44584
44585
44586
44587
44588
44589
44590
44591
44592
44593
44594
44595
44596
44597
44598
44599
44600
44601
44602
44603
44604
44605
44606
44607
44608
44609
44610
44611
44612
44613
44614
44615
44616
44617
44618
44619
44620
44621
44622
44623
44624
44625
44626
44627
44628
44629
44630
44631
44632
44633
44634
44635
44636
44637
44638
44639
44640
44641
44642
44643
44644
44645
44646
44647
44648
44649
44650
44651
44652
44653
44654
44655
44656
44657
44658
44659
44660
44661
44662
44663
44664
44665
44666
44667
44668
44669
44670
44671
44672
44673
44674
44675
44676
44677
44678
44679
44680
44681
44682
44683
44684
44685
44686
44687
44688
44689
44690
44691
44692
44693
44694
44695
44696
44697
44698
44699
44700
44701
44702
44703
44704
44705
44706
44707
44708
44709
44710
44711
44712
44713
44714
44715
44716
44717
44718
44719
44720
44721
44722
44723
44724
44725
44726
44727
44728
44729
44730
44731
44732
44733
44734
44735
44736
44737
44738
44739
44740
44741
44742
44743
44744
44745
44746
44747
44748
44749
44750
44751
44752
44753
44754
44755
44756
44757
44758
44759
44760
44761
44762
44763
44764
44765
44766
44767
44768
44769
44770
44771
44772
44773
44774
44775
44776
44777
44778
44779
44780
44781
44782
44783
44784
44785
44786
44787
44788
44789
44790
44791
44792
44793
44794
44795
44796
44797
44798
44799
44800
44801
44802
44803
44804
44805
44806
44807
44808
44809
44810
44811
44812
44813
44814
44815
44816
44817
44818
44819
44820
44821
44822
44823
44824
44825
44826
44827
44828
44829
44830
44831
44832
44833
44834
44835
44836
44837
44838
44839
44840
44841
44842
44843
44844
44845
44846
44847
44848
44849
44850
44851
44852
44853
44854
44855
44856
44857
44858
44859
44860
44861
44862
44863
44864
44865
44866
44867
44868
44869
44870
44871
44872
44873
44874
44875
44876
44877
44878
44879
44880
44881
44882
44883
44884
44885
44886
44887
44888
44889
44890
44891
44892
44893
44894
44895
44896
44897
44898
44899
44900
44901
44902
44903
44904
44905
44906
44907
44908
44909
44910
44911
44912
44913
44914
44915
44916
44917
44918
44919
44920
44921
44922
44923
44924
44925
44926
44927
44928
44929
44930
44931
44932
44933
44934
44935
44936
44937
44938
44939
44940
44941
44942
44943
44944
44945
44946
44947
44948
44949
44950
44951
44952
44953
44954
44955
44956
44957
44958
44959
44960
44961
44962
44963
44964
44965
44966
44967
44968
44969
44970
44971
44972
44973
44974
44975
44976
44977
44978
44979
44980
44981
44982
44983
44984
44985
44986
44987
44988
44989
44990
44991
44992
44993
44994
44995
44996
44997
44998
44999
45000
45001
45002
45003
45004
45005
45006
45007
45008
45009
45010
45011
45012
45013
45014
45015
45016
45017
45018
45019
45020
45021
45022
45023
45024
45025
45026
45027
45028
45029
45030
45031
45032
45033
45034
45035
45036
45037
45038
45039
45040
45041
45042
45043
45044
45045
45046
45047
45048
45049
45050
45051
45052
45053
45054
45055
45056
45057
45058
45059
45060
45061
45062
45063
45064
45065
45066
45067
45068
45069
45070
45071
45072
45073
45074
45075
45076
45077
45078
45079
45080
45081
45082
45083
45084
45085
45086
45087
45088
45089
45090
45091
45092
45093
45094
45095
45096
45097
45098
45099
45100
45101
45102
45103
45104
45105
45106
45107
45108
45109
45110
45111
45112
45113
45114
45115
45116
45117
45118
45119
45120
45121
45122
45123
45124
45125
45126
45127
45128
45129
45130
45131
45132
45133
45134
45135
45136
45137
45138
45139
45140
45141
45142
45143
45144
45145
45146
45147
45148
45149
45150
45151
45152
45153
45154
45155
45156
45157
45158
45159
45160
45161
45162
45163
45164
45165
45166
45167
45168
45169
45170
45171
45172
45173
45174
45175
45176
45177
45178
45179
45180
45181
45182
45183
45184
45185
45186
45187
45188
45189
45190
45191
45192
45193
45194
45195
45196
45197
45198
45199
45200
45201
45202
45203
45204
45205
45206
45207
45208
45209
45210
45211
45212
45213
45214
45215
45216
45217
45218
45219
45220
45221
45222
45223
45224
45225
45226
45227
45228
45229
45230
45231
45232
45233
45234
45235
45236
45237
45238
45239
45240
45241
45242
45243
45244
45245
45246
45247
45248
45249
45250
45251
45252
45253
45254
45255
45256
45257
45258
45259
45260
45261
45262
45263
45264
45265
45266
45267
45268
45269
45270
45271
45272
45273
45274
45275
45276
45277
45278
45279
45280
45281
45282
45283
45284
45285
45286
45287
45288
45289
45290
45291
45292
45293
45294
45295
45296
45297
45298
45299
45300
45301
45302
45303
45304
45305
45306
45307
45308
45309
45310
45311
45312
45313
45314
45315
45316
45317
45318
45319
45320
45321
45322
45323
45324
45325
45326
45327
45328
45329
45330
45331
45332
45333
45334
45335
45336
45337
45338
45339
45340
45341
45342
45343
45344
45345
45346
45347
45348
45349
45350
45351
45352
45353
45354
45355
45356
45357
45358
45359
45360
45361
45362
45363
45364
45365
45366
45367
45368
45369
45370
45371
45372
45373
45374
45375
45376
45377
45378
45379
45380
45381
45382
45383
45384
45385
45386
45387
45388
45389
45390
45391
45392
45393
45394
45395
45396
45397
45398
45399
45400
45401
45402
45403
45404
45405
45406
45407
45408
45409
45410
45411
45412
45413
45414
45415
45416
45417
45418
45419
45420
45421
45422
45423
45424
45425
45426
45427
45428
45429
45430
45431
45432
45433
45434
45435
45436
45437
45438
45439
45440
45441
45442
45443
45444
45445
45446
45447
45448
45449
45450
45451
45452
45453
45454
45455
45456
45457
45458
45459
45460
45461
45462
45463
45464
45465
45466
45467
45468
45469
45470
45471
45472
45473
45474
45475
45476
45477
45478
45479
45480
45481
45482
45483
45484
45485
45486
45487
45488
45489
45490
45491
45492
45493
45494
45495
45496
45497
45498
45499
45500
45501
45502
45503
45504
45505
45506
45507
45508
45509
45510
45511
45512
45513
45514
45515
45516
45517
45518
45519
45520
45521
45522
45523
45524
45525
45526
45527
45528
45529
45530
45531
45532
45533
45534
45535
45536
45537
45538
45539
45540
45541
45542
45543
45544
45545
45546
45547
45548
45549
45550
45551
45552
45553
45554
45555
45556
45557
45558
45559
45560
45561
45562
45563
45564
45565
45566
45567
45568
45569
45570
45571
45572
45573
45574
45575
45576
45577
45578
45579
45580
45581
45582
45583
45584
45585
45586
45587
45588
45589
45590
45591
45592
45593
45594
45595
45596
45597
45598
45599
45600
45601
45602
45603
45604
45605
45606
45607
45608
45609
45610
45611
45612
45613
45614
45615
45616
45617
45618
45619
45620
45621
45622
45623
45624
45625
45626
45627
45628
45629
45630
45631
45632
45633
45634
45635
45636
45637
45638
45639
45640
45641
45642
45643
45644
45645
45646
45647
45648
45649
45650
45651
45652
45653
45654
45655
45656
45657
45658
45659
45660
45661
45662
45663
45664
45665
45666
45667
45668
45669
45670
45671
45672
45673
45674
45675
45676
45677
45678
45679
45680
45681
45682
45683
45684
45685
45686
45687
45688
45689
45690
45691
45692
45693
45694
45695
45696
45697
45698
45699
45700
45701
45702
45703
45704
45705
45706
45707
45708
45709
45710
45711
45712
45713
45714
45715
45716
45717
45718
45719
45720
45721
45722
45723
45724
45725
45726
45727
45728
45729
45730
45731
45732
45733
45734
45735
45736
45737
45738
45739
45740
45741
45742
45743
45744
45745
45746
45747
45748
45749
45750
45751
45752
45753
45754
45755
45756
45757
45758
45759
45760
45761
45762
45763
45764
45765
45766
45767
45768
45769
45770
45771
45772
45773
45774
45775
45776
45777
45778
45779
45780
45781
45782
45783
45784
45785
45786
45787
45788
45789
45790
45791
45792
45793
45794
45795
45796
45797
45798
45799
45800
45801
45802
45803
45804
45805
45806
45807
45808
45809
45810
45811
45812
45813
45814
45815
45816
45817
45818
45819
45820
45821
45822
45823
45824
45825
45826
45827
45828
45829
45830
45831
45832
45833
45834
45835
45836
45837
45838
45839
45840
45841
45842
45843
45844
45845
45846
45847
45848
45849
45850
45851
45852
45853
45854
45855
45856
45857
45858
45859
45860
45861
45862
45863
45864
45865
45866
45867
45868
45869
45870
45871
45872
45873
45874
45875
45876
45877
45878
45879
45880
45881
45882
45883
45884
45885
45886
45887
45888
45889
45890
45891
45892
45893
45894
45895
45896
45897
45898
45899
45900
45901
45902
45903
45904
45905
45906
45907
45908
45909
45910
45911
45912
45913
45914
45915
45916
45917
45918
45919
45920
45921
45922
45923
45924
45925
45926
45927
45928
45929
45930
45931
45932
45933
45934
45935
45936
45937
45938
45939
45940
45941
45942
45943
45944
45945
45946
45947
45948
45949
45950
45951
45952
45953
45954
45955
45956
45957
45958
45959
45960
45961
45962
45963
45964
45965
45966
45967
45968
45969
45970
45971
45972
45973
45974
45975
45976
45977
45978
45979
45980
45981
45982
45983
45984
45985
45986
45987
45988
45989
45990
45991
45992
45993
45994
45995
45996
45997
45998
45999
46000
46001
46002
46003
46004
46005
46006
46007
46008
46009
46010
46011
46012
46013
46014
46015
46016
46017
46018
46019
46020
46021
46022
46023
46024
46025
46026
46027
46028
46029
46030
46031
46032
46033
46034
46035
46036
46037
46038
46039
46040
46041
46042
46043
46044
46045
46046
46047
46048
46049
46050
46051
46052
46053
46054
46055
46056
46057
46058
46059
46060
46061
46062
46063
46064
46065
46066
46067
46068
46069
46070
46071
46072
46073
46074
46075
46076
46077
46078
46079
46080
46081
46082
46083
46084
46085
46086
46087
46088
46089
46090
46091
46092
46093
46094
46095
46096
46097
46098
46099
46100
46101
46102
46103
46104
46105
46106
46107
46108
46109
46110
46111
46112
46113
46114
46115
46116
46117
46118
46119
46120
46121
46122
46123
46124
46125
46126
46127
46128
46129
46130
46131
46132
46133
46134
46135
46136
46137
46138
46139
46140
46141
46142
46143
46144
46145
46146
46147
46148
46149
46150
46151
46152
46153
46154
46155
46156
46157
46158
46159
46160
46161
46162
46163
46164
46165
46166
46167
46168
46169
46170
46171
46172
46173
46174
46175
46176
46177
46178
46179
46180
46181
46182
46183
46184
46185
46186
46187
46188
46189
46190
46191
46192
46193
46194
46195
46196
46197
46198
46199
46200
46201
46202
46203
46204
46205
46206
46207
46208
46209
46210
46211
46212
46213
46214
46215
46216
46217
46218
46219
46220
46221
46222
46223
46224
46225
46226
46227
46228
46229
46230
46231
46232
46233
46234
46235
46236
46237
46238
46239
46240
46241
46242
46243
46244
46245
46246
46247
46248
46249
46250
46251
46252
46253
46254
46255
46256
46257
46258
46259
46260
46261
46262
46263
46264
46265
46266
46267
46268
46269
46270
46271
46272
46273
46274
46275
46276
46277
46278
46279
46280
46281
46282
46283
46284
46285
46286
46287
46288
46289
46290
46291
46292
46293
46294
46295
46296
46297
46298
46299
46300
46301
46302
46303
46304
46305
46306
46307
46308
46309
46310
46311
46312
46313
46314
46315
46316
46317
46318
46319
46320
46321
46322
46323
46324
46325
46326
46327
46328
46329
46330
46331
46332
46333
46334
46335
46336
46337
46338
46339
46340
46341
46342
46343
46344
46345
46346
46347
46348
46349
46350
46351
46352
46353
46354
46355
46356
46357
46358
46359
46360
46361
46362
46363
46364
46365
46366
46367
46368
46369
46370
46371
46372
46373
46374
46375
46376
46377
46378
46379
46380
46381
46382
46383
46384
46385
46386
46387
46388
46389
46390
46391
46392
46393
46394
46395
46396
46397
46398
46399
46400
46401
46402
46403
46404
46405
46406
46407
46408
46409
46410
46411
46412
46413
46414
46415
46416
46417
46418
46419
46420
46421
46422
46423
46424
46425
46426
46427
46428
46429
46430
46431
46432
46433
46434
46435
46436
46437
46438
46439
46440
46441
46442
46443
46444
46445
46446
46447
46448
46449
46450
46451
46452
46453
46454
46455
46456
46457
46458
46459
46460
46461
46462
46463
46464
46465
46466
46467
46468
46469
46470
46471
46472
46473
46474
46475
46476
46477
46478
46479
46480
46481
46482
46483
46484
46485
46486
46487
46488
46489
46490
46491
46492
46493
46494
46495
46496
46497
46498
46499
46500
46501
46502
46503
46504
46505
46506
46507
46508
46509
46510
46511
46512
46513
46514
46515
46516
46517
46518
46519
46520
46521
46522
46523
46524
46525
46526
46527
46528
46529
46530
46531
46532
46533
46534
46535
46536
46537
46538
46539
46540
46541
46542
46543
46544
46545
46546
46547
46548
46549
46550
46551
46552
46553
46554
46555
46556
46557
46558
46559
46560
46561
46562
46563
46564
46565
46566
46567
46568
46569
46570
46571
46572
46573
46574
46575
46576
46577
46578
46579
46580
46581
46582
46583
46584
46585
46586
46587
46588
46589
46590
46591
46592
46593
46594
46595
46596
46597
46598
46599
46600
46601
46602
46603
46604
46605
46606
46607
46608
46609
46610
46611
46612
46613
46614
46615
46616
46617
46618
46619
46620
46621
46622
46623
46624
46625
46626
46627
46628
46629
46630
46631
46632
46633
46634
46635
46636
46637
46638
46639
46640
46641
46642
46643
46644
46645
46646
46647
46648
46649
46650
46651
46652
46653
46654
46655
46656
46657
46658
46659
46660
46661
46662
46663
46664
46665
46666
46667
46668
46669
46670
46671
46672
46673
46674
46675
46676
46677
46678
46679
46680
46681
46682
46683
46684
46685
46686
46687
46688
46689
46690
46691
46692
46693
46694
46695
46696
46697
46698
46699
46700
46701
46702
46703
46704
46705
46706
46707
46708
46709
46710
46711
46712
46713
46714
46715
46716
46717
46718
46719
46720
46721
46722
46723
46724
46725
46726
46727
46728
46729
46730
46731
46732
46733
46734
46735
46736
46737
46738
46739
46740
46741
46742
46743
46744
46745
46746
46747
46748
46749
46750
46751
46752
46753
46754
46755
46756
46757
46758
46759
46760
46761
46762
46763
46764
46765
46766
46767
46768
46769
46770
46771
46772
46773
46774
46775
46776
46777
46778
46779
46780
46781
46782
46783
46784
46785
46786
46787
46788
46789
46790
46791
46792
46793
46794
46795
46796
46797
46798
46799
46800
46801
46802
46803
46804
46805
46806
46807
46808
46809
46810
46811
46812
46813
46814
46815
46816
46817
46818
46819
46820
46821
46822
46823
46824
46825
46826
46827
46828
46829
46830
46831
46832
46833
46834
46835
46836
46837
46838
46839
46840
46841
46842
46843
46844
46845
46846
46847
46848
46849
46850
46851
46852
46853
46854
46855
46856
46857
46858
46859
46860
46861
46862
46863
46864
46865
46866
46867
46868
46869
46870
46871
46872
46873
46874
46875
46876
46877
46878
46879
46880
46881
46882
46883
46884
46885
46886
46887
46888
46889
46890
46891
46892
46893
46894
46895
46896
46897
46898
46899
46900
46901
46902
46903
46904
46905
46906
46907
46908
46909
46910
46911
46912
46913
46914
46915
46916
46917
46918
46919
46920
46921
46922
46923
46924
46925
46926
46927
46928
46929
46930
46931
46932
46933
46934
46935
46936
46937
46938
46939
46940
46941
46942
46943
46944
46945
46946
46947
46948
46949
46950
46951
46952
46953
46954
46955
46956
46957
46958
46959
46960
46961
46962
46963
46964
46965
46966
46967
46968
46969
46970
46971
46972
46973
46974
46975
46976
46977
46978
46979
46980
46981
46982
46983
46984
46985
46986
46987
46988
46989
46990
46991
46992
46993
46994
46995
46996
46997
46998
46999
47000
47001
47002
47003
47004
47005
47006
47007
47008
47009
47010
47011
47012
47013
47014
47015
47016
47017
47018
47019
47020
47021
47022
47023
47024
47025
47026
47027
47028
47029
47030
47031
47032
47033
47034
47035
47036
47037
47038
47039
47040
47041
47042
47043
47044
47045
47046
47047
47048
47049
47050
47051
47052
47053
47054
47055
47056
47057
47058
47059
47060
47061
47062
47063
47064
47065
47066
47067
47068
47069
47070
47071
47072
47073
47074
47075
47076
47077
47078
47079
47080
47081
47082
47083
47084
47085
47086
47087
47088
47089
47090
47091
47092
47093
47094
47095
47096
47097
47098
47099
47100
47101
47102
47103
47104
47105
47106
47107
47108
47109
47110
47111
47112
47113
47114
47115
47116
47117
47118
47119
47120
47121
47122
47123
47124
47125
47126
47127
47128
47129
47130
47131
47132
47133
47134
47135
47136
47137
47138
47139
47140
47141
47142
47143
47144
47145
47146
47147
47148
47149
47150
47151
47152
47153
47154
47155
47156
47157
47158
47159
47160
47161
47162
47163
47164
47165
47166
47167
47168
47169
47170
47171
47172
47173
47174
47175
47176
47177
47178
47179
47180
47181
47182
47183
47184
47185
47186
47187
47188
47189
47190
47191
47192
47193
47194
47195
47196
47197
47198
47199
47200
47201
47202
47203
47204
47205
47206
47207
47208
47209
47210
47211
47212
47213
47214
47215
47216
47217
47218
47219
47220
47221
47222
47223
47224
47225
47226
47227
47228
47229
47230
47231
47232
47233
47234
47235
47236
47237
47238
47239
47240
47241
47242
47243
47244
47245
47246
47247
47248
47249
47250
47251
47252
47253
47254
47255
47256
47257
47258
47259
47260
47261
47262
47263
47264
47265
47266
47267
47268
47269
47270
47271
47272
47273
47274
47275
47276
47277
47278
47279
47280
47281
47282
47283
47284
47285
47286
47287
47288
47289
47290
47291
47292
47293
47294
47295
47296
47297
47298
47299
47300
47301
47302
47303
47304
47305
47306
47307
47308
47309
47310
47311
47312
47313
47314
47315
47316
47317
47318
47319
47320
47321
47322
47323
47324
47325
47326
47327
47328
47329
47330
47331
47332
47333
47334
47335
47336
47337
47338
47339
47340
47341
47342
47343
47344
47345
47346
47347
47348
47349
47350
47351
47352
47353
47354
47355
47356
47357
47358
47359
47360
47361
47362
47363
47364
47365
47366
47367
47368
47369
47370
47371
47372
47373
47374
47375
47376
47377
47378
47379
47380
47381
47382
47383
47384
47385
47386
47387
47388
47389
47390
47391
47392
47393
47394
47395
47396
47397
47398
47399
47400
47401
47402
47403
47404
47405
47406
47407
47408
47409
47410
47411
47412
47413
47414
47415
47416
47417
47418
47419
47420
47421
47422
47423
47424
47425
47426
47427
47428
47429
47430
47431
47432
47433
47434
47435
47436
47437
47438
47439
47440
47441
47442
47443
47444
47445
47446
47447
47448
47449
47450
47451
47452
47453
47454
47455
47456
47457
47458
47459
47460
47461
47462
47463
47464
47465
47466
47467
47468
47469
47470
47471
47472
47473
47474
47475
47476
47477
47478
47479
47480
47481
47482
47483
47484
47485
47486
47487
47488
47489
47490
47491
47492
47493
47494
47495
47496
47497
47498
47499
47500
47501
47502
47503
47504
47505
47506
47507
47508
47509
47510
47511
47512
47513
47514
47515
47516
47517
47518
47519
47520
47521
47522
47523
47524
47525
47526
47527
47528
47529
47530
47531
47532
47533
47534
47535
47536
47537
47538
47539
47540
47541
47542
47543
47544
47545
47546
47547
47548
47549
47550
47551
47552
47553
47554
47555
47556
47557
47558
47559
47560
47561
47562
47563
47564
47565
47566
47567
47568
47569
47570
47571
47572
47573
47574
47575
47576
47577
47578
47579
47580
47581
47582
47583
47584
47585
47586
47587
47588
47589
47590
47591
47592
47593
47594
47595
47596
47597
47598
47599
47600
47601
47602
47603
47604
47605
47606
47607
47608
47609
47610
47611
47612
47613
47614
47615
47616
47617
47618
47619
47620
47621
47622
47623
47624
47625
47626
47627
47628
47629
47630
47631
47632
47633
47634
47635
47636
47637
47638
47639
47640
47641
47642
47643
47644
47645
47646
47647
47648
47649
47650
47651
47652
47653
47654
47655
47656
47657
47658
47659
47660
47661
47662
47663
47664
47665
47666
47667
47668
47669
47670
47671
47672
47673
47674
47675
47676
47677
47678
47679
47680
47681
47682
47683
47684
47685
47686
47687
47688
47689
47690
47691
47692
47693
47694
47695
47696
47697
47698
47699
47700
47701
47702
47703
47704
47705
47706
47707
47708
47709
47710
47711
47712
47713
47714
47715
47716
47717
47718
47719
47720
47721
47722
47723
47724
47725
47726
47727
47728
47729
47730
47731
47732
47733
47734
47735
47736
47737
47738
47739
47740
47741
47742
47743
47744
47745
47746
47747
47748
47749
47750
47751
47752
47753
47754
47755
47756
47757
47758
47759
47760
47761
47762
47763
47764
47765
47766
47767
47768
47769
47770
47771
47772
47773
47774
47775
47776
47777
47778
47779
47780
47781
47782
47783
47784
47785
47786
47787
47788
47789
47790
47791
47792
47793
47794
47795
47796
47797
47798
47799
47800
47801
47802
47803
47804
47805
47806
47807
47808
47809
47810
47811
47812
47813
47814
47815
47816
47817
47818
47819
47820
47821
47822
47823
47824
47825
47826
47827
47828
47829
47830
47831
47832
47833
47834
47835
47836
47837
47838
47839
47840
47841
47842
47843
47844
47845
47846
47847
47848
47849
47850
47851
47852
47853
47854
47855
47856
47857
47858
47859
47860
47861
47862
47863
47864
47865
47866
47867
47868
47869
47870
47871
47872
47873
47874
47875
47876
47877
47878
47879
47880
47881
47882
47883
47884
47885
47886
47887
47888
47889
47890
47891
47892
47893
47894
47895
47896
47897
47898
47899
47900
47901
47902
47903
47904
47905
47906
47907
47908
47909
47910
47911
47912
47913
47914
47915
47916
47917
47918
47919
47920
47921
47922
47923
|
This is doc/gccint.info, produced by makeinfo version 4.13 from
/home/jakub/gcc-4.6.4/gcc-4.6.4/gcc/doc/gccint.texi.
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 Free
Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover Texts
being (a) (see below), and with the Back-Cover Texts being (b) (see
below). A copy of the license is included in the section entitled "GNU
Free Documentation License".
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development.
INFO-DIR-SECTION Software development
START-INFO-DIR-ENTRY
* gccint: (gccint). Internals of the GNU Compiler Collection.
END-INFO-DIR-ENTRY
This file documents the internals of the GNU compilers.
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 Free
Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover Texts
being (a) (see below), and with the Back-Cover Texts being (b) (see
below). A copy of the license is included in the section entitled "GNU
Free Documentation License".
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development.
File: gccint.info, Node: Top, Next: Contributing, Up: (DIR)
Introduction
************
This manual documents the internals of the GNU compilers, including how
to port them to new targets and some information about how to write
front ends for new languages. It corresponds to the compilers
(GCC) version 4.6.4. The use of the GNU compilers is documented in a
separate manual. *Note Introduction: (gcc)Top.
This manual is mainly a reference manual rather than a tutorial. It
discusses how to contribute to GCC (*note Contributing::), the
characteristics of the machines supported by GCC as hosts and targets
(*note Portability::), how GCC relates to the ABIs on such systems
(*note Interface::), and the characteristics of the languages for which
GCC front ends are written (*note Languages::). It then describes the
GCC source tree structure and build system, some of the interfaces to
GCC front ends, and how support for a target system is implemented in
GCC.
Additional tutorial information is linked to from
`http://gcc.gnu.org/readings.html'.
* Menu:
* Contributing:: How to contribute to testing and developing GCC.
* Portability:: Goals of GCC's portability features.
* Interface:: Function-call interface of GCC output.
* Libgcc:: Low-level runtime library used by GCC.
* Languages:: Languages for which GCC front ends are written.
* Source Tree:: GCC source tree structure and build system.
* Testsuites:: GCC testsuites.
* Options:: Option specification files.
* Passes:: Order of passes, what they do, and what each file is for.
* GENERIC:: Language-independent representation generated by Front Ends
* GIMPLE:: Tuple representation used by Tree SSA optimizers
* Tree SSA:: Analysis and optimization of GIMPLE
* RTL:: Machine-dependent low-level intermediate representation.
* Control Flow:: Maintaining and manipulating the control flow graph.
* Loop Analysis and Representation:: Analysis and representation of loops
* Machine Desc:: How to write machine description instruction patterns.
* Target Macros:: How to write the machine description C macros and functions.
* Host Config:: Writing the `xm-MACHINE.h' file.
* Fragments:: Writing the `t-TARGET' and `x-HOST' files.
* Collect2:: How `collect2' works; how it finds `ld'.
* Header Dirs:: Understanding the standard header file directories.
* Type Information:: GCC's memory management; generating type information.
* Plugins:: Extending the compiler with plugins.
* LTO:: Using Link-Time Optimization.
* Funding:: How to help assure funding for free software.
* GNU Project:: The GNU Project and GNU/Linux.
* Copying:: GNU General Public License says
how you can copy and share GCC.
* GNU Free Documentation License:: How you can copy and share this manual.
* Contributors:: People who have contributed to GCC.
* Option Index:: Index to command line options.
* Concept Index:: Index of concepts and symbol names.
File: gccint.info, Node: Contributing, Next: Portability, Prev: Top, Up: Top
1 Contributing to GCC Development
*********************************
If you would like to help pretest GCC releases to assure they work well,
current development sources are available by SVN (see
`http://gcc.gnu.org/svn.html'). Source and binary snapshots are also
available for FTP; see `http://gcc.gnu.org/snapshots.html'.
If you would like to work on improvements to GCC, please read the
advice at these URLs:
`http://gcc.gnu.org/contribute.html'
`http://gcc.gnu.org/contributewhy.html'
for information on how to make useful contributions and avoid
duplication of effort. Suggested projects are listed at
`http://gcc.gnu.org/projects/'.
File: gccint.info, Node: Portability, Next: Interface, Prev: Contributing, Up: Top
2 GCC and Portability
*********************
GCC itself aims to be portable to any machine where `int' is at least a
32-bit type. It aims to target machines with a flat (non-segmented)
byte addressed data address space (the code address space can be
separate). Target ABIs may have 8, 16, 32 or 64-bit `int' type. `char'
can be wider than 8 bits.
GCC gets most of the information about the target machine from a
machine description which gives an algebraic formula for each of the
machine's instructions. This is a very clean way to describe the
target. But when the compiler needs information that is difficult to
express in this fashion, ad-hoc parameters have been defined for
machine descriptions. The purpose of portability is to reduce the
total work needed on the compiler; it was not of interest for its own
sake.
GCC does not contain machine dependent code, but it does contain code
that depends on machine parameters such as endianness (whether the most
significant byte has the highest or lowest address of the bytes in a
word) and the availability of autoincrement addressing. In the
RTL-generation pass, it is often necessary to have multiple strategies
for generating code for a particular kind of syntax tree, strategies
that are usable for different combinations of parameters. Often, not
all possible cases have been addressed, but only the common ones or
only the ones that have been encountered. As a result, a new target
may require additional strategies. You will know if this happens
because the compiler will call `abort'. Fortunately, the new
strategies can be added in a machine-independent fashion, and will
affect only the target machines that need them.
File: gccint.info, Node: Interface, Next: Libgcc, Prev: Portability, Up: Top
3 Interfacing to GCC Output
***************************
GCC is normally configured to use the same function calling convention
normally in use on the target system. This is done with the
machine-description macros described (*note Target Macros::).
However, returning of structure and union values is done differently on
some target machines. As a result, functions compiled with PCC
returning such types cannot be called from code compiled with GCC, and
vice versa. This does not cause trouble often because few Unix library
routines return structures or unions.
GCC code returns structures and unions that are 1, 2, 4 or 8 bytes
long in the same registers used for `int' or `double' return values.
(GCC typically allocates variables of such types in registers also.)
Structures and unions of other sizes are returned by storing them into
an address passed by the caller (usually in a register). The target
hook `TARGET_STRUCT_VALUE_RTX' tells GCC where to pass this address.
By contrast, PCC on most target machines returns structures and unions
of any size by copying the data into an area of static storage, and then
returning the address of that storage as if it were a pointer value.
The caller must copy the data from that memory area to the place where
the value is wanted. This is slower than the method used by GCC, and
fails to be reentrant.
On some target machines, such as RISC machines and the 80386, the
standard system convention is to pass to the subroutine the address of
where to return the value. On these machines, GCC has been configured
to be compatible with the standard compiler, when this method is used.
It may not be compatible for structures of 1, 2, 4 or 8 bytes.
GCC uses the system's standard convention for passing arguments. On
some machines, the first few arguments are passed in registers; in
others, all are passed on the stack. It would be possible to use
registers for argument passing on any machine, and this would probably
result in a significant speedup. But the result would be complete
incompatibility with code that follows the standard convention. So this
change is practical only if you are switching to GCC as the sole C
compiler for the system. We may implement register argument passing on
certain machines once we have a complete GNU system so that we can
compile the libraries with GCC.
On some machines (particularly the SPARC), certain types of arguments
are passed "by invisible reference". This means that the value is
stored in memory, and the address of the memory location is passed to
the subroutine.
If you use `longjmp', beware of automatic variables. ISO C says that
automatic variables that are not declared `volatile' have undefined
values after a `longjmp'. And this is all GCC promises to do, because
it is very difficult to restore register variables correctly, and one
of GCC's features is that it can put variables in registers without
your asking it to.
File: gccint.info, Node: Libgcc, Next: Languages, Prev: Interface, Up: Top
4 The GCC low-level runtime library
***********************************
GCC provides a low-level runtime library, `libgcc.a' or `libgcc_s.so.1'
on some platforms. GCC generates calls to routines in this library
automatically, whenever it needs to perform some operation that is too
complicated to emit inline code for.
Most of the routines in `libgcc' handle arithmetic operations that the
target processor cannot perform directly. This includes integer
multiply and divide on some machines, and all floating-point and
fixed-point operations on other machines. `libgcc' also includes
routines for exception handling, and a handful of miscellaneous
operations.
Some of these routines can be defined in mostly machine-independent C.
Others must be hand-written in assembly language for each processor
that needs them.
GCC will also generate calls to C library routines, such as `memcpy'
and `memset', in some cases. The set of routines that GCC may possibly
use is documented in *note Other Builtins: (gcc)Other Builtins.
These routines take arguments and return values of a specific machine
mode, not a specific C type. *Note Machine Modes::, for an explanation
of this concept. For illustrative purposes, in this chapter the
floating point type `float' is assumed to correspond to `SFmode';
`double' to `DFmode'; and `long double' to both `TFmode' and `XFmode'.
Similarly, the integer types `int' and `unsigned int' correspond to
`SImode'; `long' and `unsigned long' to `DImode'; and `long long' and
`unsigned long long' to `TImode'.
* Menu:
* Integer library routines::
* Soft float library routines::
* Decimal float library routines::
* Fixed-point fractional library routines::
* Exception handling routines::
* Miscellaneous routines::
File: gccint.info, Node: Integer library routines, Next: Soft float library routines, Up: Libgcc
4.1 Routines for integer arithmetic
===================================
The integer arithmetic routines are used on platforms that don't provide
hardware support for arithmetic operations on some modes.
4.1.1 Arithmetic functions
--------------------------
-- Runtime Function: int __ashlsi3 (int A, int B)
-- Runtime Function: long __ashldi3 (long A, int B)
-- Runtime Function: long long __ashlti3 (long long A, int B)
These functions return the result of shifting A left by B bits.
-- Runtime Function: int __ashrsi3 (int A, int B)
-- Runtime Function: long __ashrdi3 (long A, int B)
-- Runtime Function: long long __ashrti3 (long long A, int B)
These functions return the result of arithmetically shifting A
right by B bits.
-- Runtime Function: int __divsi3 (int A, int B)
-- Runtime Function: long __divdi3 (long A, long B)
-- Runtime Function: long long __divti3 (long long A, long long B)
These functions return the quotient of the signed division of A and
B.
-- Runtime Function: int __lshrsi3 (int A, int B)
-- Runtime Function: long __lshrdi3 (long A, int B)
-- Runtime Function: long long __lshrti3 (long long A, int B)
These functions return the result of logically shifting A right by
B bits.
-- Runtime Function: int __modsi3 (int A, int B)
-- Runtime Function: long __moddi3 (long A, long B)
-- Runtime Function: long long __modti3 (long long A, long long B)
These functions return the remainder of the signed division of A
and B.
-- Runtime Function: int __mulsi3 (int A, int B)
-- Runtime Function: long __muldi3 (long A, long B)
-- Runtime Function: long long __multi3 (long long A, long long B)
These functions return the product of A and B.
-- Runtime Function: long __negdi2 (long A)
-- Runtime Function: long long __negti2 (long long A)
These functions return the negation of A.
-- Runtime Function: unsigned int __udivsi3 (unsigned int A, unsigned
int B)
-- Runtime Function: unsigned long __udivdi3 (unsigned long A,
unsigned long B)
-- Runtime Function: unsigned long long __udivti3 (unsigned long long
A, unsigned long long B)
These functions return the quotient of the unsigned division of A
and B.
-- Runtime Function: unsigned long __udivmoddi3 (unsigned long A,
unsigned long B, unsigned long *C)
-- Runtime Function: unsigned long long __udivti3 (unsigned long long
A, unsigned long long B, unsigned long long *C)
These functions calculate both the quotient and remainder of the
unsigned division of A and B. The return value is the quotient,
and the remainder is placed in variable pointed to by C.
-- Runtime Function: unsigned int __umodsi3 (unsigned int A, unsigned
int B)
-- Runtime Function: unsigned long __umoddi3 (unsigned long A,
unsigned long B)
-- Runtime Function: unsigned long long __umodti3 (unsigned long long
A, unsigned long long B)
These functions return the remainder of the unsigned division of A
and B.
4.1.2 Comparison functions
--------------------------
The following functions implement integral comparisons. These functions
implement a low-level compare, upon which the higher level comparison
operators (such as less than and greater than or equal to) can be
constructed. The returned values lie in the range zero to two, to allow
the high-level operators to be implemented by testing the returned
result using either signed or unsigned comparison.
-- Runtime Function: int __cmpdi2 (long A, long B)
-- Runtime Function: int __cmpti2 (long long A, long long B)
These functions perform a signed comparison of A and B. If A is
less than B, they return 0; if A is greater than B, they return 2;
and if A and B are equal they return 1.
-- Runtime Function: int __ucmpdi2 (unsigned long A, unsigned long B)
-- Runtime Function: int __ucmpti2 (unsigned long long A, unsigned
long long B)
These functions perform an unsigned comparison of A and B. If A
is less than B, they return 0; if A is greater than B, they return
2; and if A and B are equal they return 1.
4.1.3 Trapping arithmetic functions
-----------------------------------
The following functions implement trapping arithmetic. These functions
call the libc function `abort' upon signed arithmetic overflow.
-- Runtime Function: int __absvsi2 (int A)
-- Runtime Function: long __absvdi2 (long A)
These functions return the absolute value of A.
-- Runtime Function: int __addvsi3 (int A, int B)
-- Runtime Function: long __addvdi3 (long A, long B)
These functions return the sum of A and B; that is `A + B'.
-- Runtime Function: int __mulvsi3 (int A, int B)
-- Runtime Function: long __mulvdi3 (long A, long B)
The functions return the product of A and B; that is `A * B'.
-- Runtime Function: int __negvsi2 (int A)
-- Runtime Function: long __negvdi2 (long A)
These functions return the negation of A; that is `-A'.
-- Runtime Function: int __subvsi3 (int A, int B)
-- Runtime Function: long __subvdi3 (long A, long B)
These functions return the difference between B and A; that is `A
- B'.
4.1.4 Bit operations
--------------------
-- Runtime Function: int __clzsi2 (int A)
-- Runtime Function: int __clzdi2 (long A)
-- Runtime Function: int __clzti2 (long long A)
These functions return the number of leading 0-bits in A, starting
at the most significant bit position. If A is zero, the result is
undefined.
-- Runtime Function: int __ctzsi2 (int A)
-- Runtime Function: int __ctzdi2 (long A)
-- Runtime Function: int __ctzti2 (long long A)
These functions return the number of trailing 0-bits in A, starting
at the least significant bit position. If A is zero, the result is
undefined.
-- Runtime Function: int __ffsdi2 (long A)
-- Runtime Function: int __ffsti2 (long long A)
These functions return the index of the least significant 1-bit in
A, or the value zero if A is zero. The least significant bit is
index one.
-- Runtime Function: int __paritysi2 (int A)
-- Runtime Function: int __paritydi2 (long A)
-- Runtime Function: int __parityti2 (long long A)
These functions return the value zero if the number of bits set in
A is even, and the value one otherwise.
-- Runtime Function: int __popcountsi2 (int A)
-- Runtime Function: int __popcountdi2 (long A)
-- Runtime Function: int __popcountti2 (long long A)
These functions return the number of bits set in A.
-- Runtime Function: int32_t __bswapsi2 (int32_t A)
-- Runtime Function: int64_t __bswapdi2 (int64_t A)
These functions return the A byteswapped.
File: gccint.info, Node: Soft float library routines, Next: Decimal float library routines, Prev: Integer library routines, Up: Libgcc
4.2 Routines for floating point emulation
=========================================
The software floating point library is used on machines which do not
have hardware support for floating point. It is also used whenever
`-msoft-float' is used to disable generation of floating point
instructions. (Not all targets support this switch.)
For compatibility with other compilers, the floating point emulation
routines can be renamed with the `DECLARE_LIBRARY_RENAMES' macro (*note
Library Calls::). In this section, the default names are used.
Presently the library does not support `XFmode', which is used for
`long double' on some architectures.
4.2.1 Arithmetic functions
--------------------------
-- Runtime Function: float __addsf3 (float A, float B)
-- Runtime Function: double __adddf3 (double A, double B)
-- Runtime Function: long double __addtf3 (long double A, long double
B)
-- Runtime Function: long double __addxf3 (long double A, long double
B)
These functions return the sum of A and B.
-- Runtime Function: float __subsf3 (float A, float B)
-- Runtime Function: double __subdf3 (double A, double B)
-- Runtime Function: long double __subtf3 (long double A, long double
B)
-- Runtime Function: long double __subxf3 (long double A, long double
B)
These functions return the difference between B and A; that is,
A - B.
-- Runtime Function: float __mulsf3 (float A, float B)
-- Runtime Function: double __muldf3 (double A, double B)
-- Runtime Function: long double __multf3 (long double A, long double
B)
-- Runtime Function: long double __mulxf3 (long double A, long double
B)
These functions return the product of A and B.
-- Runtime Function: float __divsf3 (float A, float B)
-- Runtime Function: double __divdf3 (double A, double B)
-- Runtime Function: long double __divtf3 (long double A, long double
B)
-- Runtime Function: long double __divxf3 (long double A, long double
B)
These functions return the quotient of A and B; that is, A / B.
-- Runtime Function: float __negsf2 (float A)
-- Runtime Function: double __negdf2 (double A)
-- Runtime Function: long double __negtf2 (long double A)
-- Runtime Function: long double __negxf2 (long double A)
These functions return the negation of A. They simply flip the
sign bit, so they can produce negative zero and negative NaN.
4.2.2 Conversion functions
--------------------------
-- Runtime Function: double __extendsfdf2 (float A)
-- Runtime Function: long double __extendsftf2 (float A)
-- Runtime Function: long double __extendsfxf2 (float A)
-- Runtime Function: long double __extenddftf2 (double A)
-- Runtime Function: long double __extenddfxf2 (double A)
These functions extend A to the wider mode of their return type.
-- Runtime Function: double __truncxfdf2 (long double A)
-- Runtime Function: double __trunctfdf2 (long double A)
-- Runtime Function: float __truncxfsf2 (long double A)
-- Runtime Function: float __trunctfsf2 (long double A)
-- Runtime Function: float __truncdfsf2 (double A)
These functions truncate A to the narrower mode of their return
type, rounding toward zero.
-- Runtime Function: int __fixsfsi (float A)
-- Runtime Function: int __fixdfsi (double A)
-- Runtime Function: int __fixtfsi (long double A)
-- Runtime Function: int __fixxfsi (long double A)
These functions convert A to a signed integer, rounding toward
zero.
-- Runtime Function: long __fixsfdi (float A)
-- Runtime Function: long __fixdfdi (double A)
-- Runtime Function: long __fixtfdi (long double A)
-- Runtime Function: long __fixxfdi (long double A)
These functions convert A to a signed long, rounding toward zero.
-- Runtime Function: long long __fixsfti (float A)
-- Runtime Function: long long __fixdfti (double A)
-- Runtime Function: long long __fixtfti (long double A)
-- Runtime Function: long long __fixxfti (long double A)
These functions convert A to a signed long long, rounding toward
zero.
-- Runtime Function: unsigned int __fixunssfsi (float A)
-- Runtime Function: unsigned int __fixunsdfsi (double A)
-- Runtime Function: unsigned int __fixunstfsi (long double A)
-- Runtime Function: unsigned int __fixunsxfsi (long double A)
These functions convert A to an unsigned integer, rounding toward
zero. Negative values all become zero.
-- Runtime Function: unsigned long __fixunssfdi (float A)
-- Runtime Function: unsigned long __fixunsdfdi (double A)
-- Runtime Function: unsigned long __fixunstfdi (long double A)
-- Runtime Function: unsigned long __fixunsxfdi (long double A)
These functions convert A to an unsigned long, rounding toward
zero. Negative values all become zero.
-- Runtime Function: unsigned long long __fixunssfti (float A)
-- Runtime Function: unsigned long long __fixunsdfti (double A)
-- Runtime Function: unsigned long long __fixunstfti (long double A)
-- Runtime Function: unsigned long long __fixunsxfti (long double A)
These functions convert A to an unsigned long long, rounding
toward zero. Negative values all become zero.
-- Runtime Function: float __floatsisf (int I)
-- Runtime Function: double __floatsidf (int I)
-- Runtime Function: long double __floatsitf (int I)
-- Runtime Function: long double __floatsixf (int I)
These functions convert I, a signed integer, to floating point.
-- Runtime Function: float __floatdisf (long I)
-- Runtime Function: double __floatdidf (long I)
-- Runtime Function: long double __floatditf (long I)
-- Runtime Function: long double __floatdixf (long I)
These functions convert I, a signed long, to floating point.
-- Runtime Function: float __floattisf (long long I)
-- Runtime Function: double __floattidf (long long I)
-- Runtime Function: long double __floattitf (long long I)
-- Runtime Function: long double __floattixf (long long I)
These functions convert I, a signed long long, to floating point.
-- Runtime Function: float __floatunsisf (unsigned int I)
-- Runtime Function: double __floatunsidf (unsigned int I)
-- Runtime Function: long double __floatunsitf (unsigned int I)
-- Runtime Function: long double __floatunsixf (unsigned int I)
These functions convert I, an unsigned integer, to floating point.
-- Runtime Function: float __floatundisf (unsigned long I)
-- Runtime Function: double __floatundidf (unsigned long I)
-- Runtime Function: long double __floatunditf (unsigned long I)
-- Runtime Function: long double __floatundixf (unsigned long I)
These functions convert I, an unsigned long, to floating point.
-- Runtime Function: float __floatuntisf (unsigned long long I)
-- Runtime Function: double __floatuntidf (unsigned long long I)
-- Runtime Function: long double __floatuntitf (unsigned long long I)
-- Runtime Function: long double __floatuntixf (unsigned long long I)
These functions convert I, an unsigned long long, to floating
point.
4.2.3 Comparison functions
--------------------------
There are two sets of basic comparison functions.
-- Runtime Function: int __cmpsf2 (float A, float B)
-- Runtime Function: int __cmpdf2 (double A, double B)
-- Runtime Function: int __cmptf2 (long double A, long double B)
These functions calculate a <=> b. That is, if A is less than B,
they return -1; if A is greater than B, they return 1; and if A
and B are equal they return 0. If either argument is NaN they
return 1, but you should not rely on this; if NaN is a
possibility, use one of the higher-level comparison functions.
-- Runtime Function: int __unordsf2 (float A, float B)
-- Runtime Function: int __unorddf2 (double A, double B)
-- Runtime Function: int __unordtf2 (long double A, long double B)
These functions return a nonzero value if either argument is NaN,
otherwise 0.
There is also a complete group of higher level functions which
correspond directly to comparison operators. They implement the ISO C
semantics for floating-point comparisons, taking NaN into account. Pay
careful attention to the return values defined for each set. Under the
hood, all of these routines are implemented as
if (__unordXf2 (a, b))
return E;
return __cmpXf2 (a, b);
where E is a constant chosen to give the proper behavior for NaN.
Thus, the meaning of the return value is different for each set. Do
not rely on this implementation; only the semantics documented below
are guaranteed.
-- Runtime Function: int __eqsf2 (float A, float B)
-- Runtime Function: int __eqdf2 (double A, double B)
-- Runtime Function: int __eqtf2 (long double A, long double B)
These functions return zero if neither argument is NaN, and A and
B are equal.
-- Runtime Function: int __nesf2 (float A, float B)
-- Runtime Function: int __nedf2 (double A, double B)
-- Runtime Function: int __netf2 (long double A, long double B)
These functions return a nonzero value if either argument is NaN,
or if A and B are unequal.
-- Runtime Function: int __gesf2 (float A, float B)
-- Runtime Function: int __gedf2 (double A, double B)
-- Runtime Function: int __getf2 (long double A, long double B)
These functions return a value greater than or equal to zero if
neither argument is NaN, and A is greater than or equal to B.
-- Runtime Function: int __ltsf2 (float A, float B)
-- Runtime Function: int __ltdf2 (double A, double B)
-- Runtime Function: int __lttf2 (long double A, long double B)
These functions return a value less than zero if neither argument
is NaN, and A is strictly less than B.
-- Runtime Function: int __lesf2 (float A, float B)
-- Runtime Function: int __ledf2 (double A, double B)
-- Runtime Function: int __letf2 (long double A, long double B)
These functions return a value less than or equal to zero if
neither argument is NaN, and A is less than or equal to B.
-- Runtime Function: int __gtsf2 (float A, float B)
-- Runtime Function: int __gtdf2 (double A, double B)
-- Runtime Function: int __gttf2 (long double A, long double B)
These functions return a value greater than zero if neither
argument is NaN, and A is strictly greater than B.
4.2.4 Other floating-point functions
------------------------------------
-- Runtime Function: float __powisf2 (float A, int B)
-- Runtime Function: double __powidf2 (double A, int B)
-- Runtime Function: long double __powitf2 (long double A, int B)
-- Runtime Function: long double __powixf2 (long double A, int B)
These functions convert raise A to the power B.
-- Runtime Function: complex float __mulsc3 (float A, float B, float
C, float D)
-- Runtime Function: complex double __muldc3 (double A, double B,
double C, double D)
-- Runtime Function: complex long double __multc3 (long double A, long
double B, long double C, long double D)
-- Runtime Function: complex long double __mulxc3 (long double A, long
double B, long double C, long double D)
These functions return the product of A + iB and C + iD, following
the rules of C99 Annex G.
-- Runtime Function: complex float __divsc3 (float A, float B, float
C, float D)
-- Runtime Function: complex double __divdc3 (double A, double B,
double C, double D)
-- Runtime Function: complex long double __divtc3 (long double A, long
double B, long double C, long double D)
-- Runtime Function: complex long double __divxc3 (long double A, long
double B, long double C, long double D)
These functions return the quotient of A + iB and C + iD (i.e., (A
+ iB) / (C + iD)), following the rules of C99 Annex G.
File: gccint.info, Node: Decimal float library routines, Next: Fixed-point fractional library routines, Prev: Soft float library routines, Up: Libgcc
4.3 Routines for decimal floating point emulation
=================================================
The software decimal floating point library implements IEEE 754-2008
decimal floating point arithmetic and is only activated on selected
targets.
The software decimal floating point library supports either DPD
(Densely Packed Decimal) or BID (Binary Integer Decimal) encoding as
selected at configure time.
4.3.1 Arithmetic functions
--------------------------
-- Runtime Function: _Decimal32 __dpd_addsd3 (_Decimal32 A, _Decimal32
B)
-- Runtime Function: _Decimal32 __bid_addsd3 (_Decimal32 A, _Decimal32
B)
-- Runtime Function: _Decimal64 __dpd_adddd3 (_Decimal64 A, _Decimal64
B)
-- Runtime Function: _Decimal64 __bid_adddd3 (_Decimal64 A, _Decimal64
B)
-- Runtime Function: _Decimal128 __dpd_addtd3 (_Decimal128 A,
_Decimal128 B)
-- Runtime Function: _Decimal128 __bid_addtd3 (_Decimal128 A,
_Decimal128 B)
These functions return the sum of A and B.
-- Runtime Function: _Decimal32 __dpd_subsd3 (_Decimal32 A, _Decimal32
B)
-- Runtime Function: _Decimal32 __bid_subsd3 (_Decimal32 A, _Decimal32
B)
-- Runtime Function: _Decimal64 __dpd_subdd3 (_Decimal64 A, _Decimal64
B)
-- Runtime Function: _Decimal64 __bid_subdd3 (_Decimal64 A, _Decimal64
B)
-- Runtime Function: _Decimal128 __dpd_subtd3 (_Decimal128 A,
_Decimal128 B)
-- Runtime Function: _Decimal128 __bid_subtd3 (_Decimal128 A,
_Decimal128 B)
These functions return the difference between B and A; that is,
A - B.
-- Runtime Function: _Decimal32 __dpd_mulsd3 (_Decimal32 A, _Decimal32
B)
-- Runtime Function: _Decimal32 __bid_mulsd3 (_Decimal32 A, _Decimal32
B)
-- Runtime Function: _Decimal64 __dpd_muldd3 (_Decimal64 A, _Decimal64
B)
-- Runtime Function: _Decimal64 __bid_muldd3 (_Decimal64 A, _Decimal64
B)
-- Runtime Function: _Decimal128 __dpd_multd3 (_Decimal128 A,
_Decimal128 B)
-- Runtime Function: _Decimal128 __bid_multd3 (_Decimal128 A,
_Decimal128 B)
These functions return the product of A and B.
-- Runtime Function: _Decimal32 __dpd_divsd3 (_Decimal32 A, _Decimal32
B)
-- Runtime Function: _Decimal32 __bid_divsd3 (_Decimal32 A, _Decimal32
B)
-- Runtime Function: _Decimal64 __dpd_divdd3 (_Decimal64 A, _Decimal64
B)
-- Runtime Function: _Decimal64 __bid_divdd3 (_Decimal64 A, _Decimal64
B)
-- Runtime Function: _Decimal128 __dpd_divtd3 (_Decimal128 A,
_Decimal128 B)
-- Runtime Function: _Decimal128 __bid_divtd3 (_Decimal128 A,
_Decimal128 B)
These functions return the quotient of A and B; that is, A / B.
-- Runtime Function: _Decimal32 __dpd_negsd2 (_Decimal32 A)
-- Runtime Function: _Decimal32 __bid_negsd2 (_Decimal32 A)
-- Runtime Function: _Decimal64 __dpd_negdd2 (_Decimal64 A)
-- Runtime Function: _Decimal64 __bid_negdd2 (_Decimal64 A)
-- Runtime Function: _Decimal128 __dpd_negtd2 (_Decimal128 A)
-- Runtime Function: _Decimal128 __bid_negtd2 (_Decimal128 A)
These functions return the negation of A. They simply flip the
sign bit, so they can produce negative zero and negative NaN.
4.3.2 Conversion functions
--------------------------
-- Runtime Function: _Decimal64 __dpd_extendsddd2 (_Decimal32 A)
-- Runtime Function: _Decimal64 __bid_extendsddd2 (_Decimal32 A)
-- Runtime Function: _Decimal128 __dpd_extendsdtd2 (_Decimal32 A)
-- Runtime Function: _Decimal128 __bid_extendsdtd2 (_Decimal32 A)
-- Runtime Function: _Decimal128 __dpd_extendddtd2 (_Decimal64 A)
-- Runtime Function: _Decimal128 __bid_extendddtd2 (_Decimal64 A)
-- Runtime Function: _Decimal32 __dpd_truncddsd2 (_Decimal64 A)
-- Runtime Function: _Decimal32 __bid_truncddsd2 (_Decimal64 A)
-- Runtime Function: _Decimal32 __dpd_trunctdsd2 (_Decimal128 A)
-- Runtime Function: _Decimal32 __bid_trunctdsd2 (_Decimal128 A)
-- Runtime Function: _Decimal64 __dpd_trunctddd2 (_Decimal128 A)
-- Runtime Function: _Decimal64 __bid_trunctddd2 (_Decimal128 A)
These functions convert the value A from one decimal floating type
to another.
-- Runtime Function: _Decimal64 __dpd_extendsfdd (float A)
-- Runtime Function: _Decimal64 __bid_extendsfdd (float A)
-- Runtime Function: _Decimal128 __dpd_extendsftd (float A)
-- Runtime Function: _Decimal128 __bid_extendsftd (float A)
-- Runtime Function: _Decimal128 __dpd_extenddftd (double A)
-- Runtime Function: _Decimal128 __bid_extenddftd (double A)
-- Runtime Function: _Decimal128 __dpd_extendxftd (long double A)
-- Runtime Function: _Decimal128 __bid_extendxftd (long double A)
-- Runtime Function: _Decimal32 __dpd_truncdfsd (double A)
-- Runtime Function: _Decimal32 __bid_truncdfsd (double A)
-- Runtime Function: _Decimal32 __dpd_truncxfsd (long double A)
-- Runtime Function: _Decimal32 __bid_truncxfsd (long double A)
-- Runtime Function: _Decimal32 __dpd_trunctfsd (long double A)
-- Runtime Function: _Decimal32 __bid_trunctfsd (long double A)
-- Runtime Function: _Decimal64 __dpd_truncxfdd (long double A)
-- Runtime Function: _Decimal64 __bid_truncxfdd (long double A)
-- Runtime Function: _Decimal64 __dpd_trunctfdd (long double A)
-- Runtime Function: _Decimal64 __bid_trunctfdd (long double A)
These functions convert the value of A from a binary floating type
to a decimal floating type of a different size.
-- Runtime Function: float __dpd_truncddsf (_Decimal64 A)
-- Runtime Function: float __bid_truncddsf (_Decimal64 A)
-- Runtime Function: float __dpd_trunctdsf (_Decimal128 A)
-- Runtime Function: float __bid_trunctdsf (_Decimal128 A)
-- Runtime Function: double __dpd_extendsddf (_Decimal32 A)
-- Runtime Function: double __bid_extendsddf (_Decimal32 A)
-- Runtime Function: double __dpd_trunctddf (_Decimal128 A)
-- Runtime Function: double __bid_trunctddf (_Decimal128 A)
-- Runtime Function: long double __dpd_extendsdxf (_Decimal32 A)
-- Runtime Function: long double __bid_extendsdxf (_Decimal32 A)
-- Runtime Function: long double __dpd_extendddxf (_Decimal64 A)
-- Runtime Function: long double __bid_extendddxf (_Decimal64 A)
-- Runtime Function: long double __dpd_trunctdxf (_Decimal128 A)
-- Runtime Function: long double __bid_trunctdxf (_Decimal128 A)
-- Runtime Function: long double __dpd_extendsdtf (_Decimal32 A)
-- Runtime Function: long double __bid_extendsdtf (_Decimal32 A)
-- Runtime Function: long double __dpd_extendddtf (_Decimal64 A)
-- Runtime Function: long double __bid_extendddtf (_Decimal64 A)
These functions convert the value of A from a decimal floating type
to a binary floating type of a different size.
-- Runtime Function: _Decimal32 __dpd_extendsfsd (float A)
-- Runtime Function: _Decimal32 __bid_extendsfsd (float A)
-- Runtime Function: _Decimal64 __dpd_extenddfdd (double A)
-- Runtime Function: _Decimal64 __bid_extenddfdd (double A)
-- Runtime Function: _Decimal128 __dpd_extendtftd (long double A)
-- Runtime Function: _Decimal128 __bid_extendtftd (long double A)
-- Runtime Function: float __dpd_truncsdsf (_Decimal32 A)
-- Runtime Function: float __bid_truncsdsf (_Decimal32 A)
-- Runtime Function: double __dpd_truncdddf (_Decimal64 A)
-- Runtime Function: double __bid_truncdddf (_Decimal64 A)
-- Runtime Function: long double __dpd_trunctdtf (_Decimal128 A)
-- Runtime Function: long double __bid_trunctdtf (_Decimal128 A)
These functions convert the value of A between decimal and binary
floating types of the same size.
-- Runtime Function: int __dpd_fixsdsi (_Decimal32 A)
-- Runtime Function: int __bid_fixsdsi (_Decimal32 A)
-- Runtime Function: int __dpd_fixddsi (_Decimal64 A)
-- Runtime Function: int __bid_fixddsi (_Decimal64 A)
-- Runtime Function: int __dpd_fixtdsi (_Decimal128 A)
-- Runtime Function: int __bid_fixtdsi (_Decimal128 A)
These functions convert A to a signed integer.
-- Runtime Function: long __dpd_fixsddi (_Decimal32 A)
-- Runtime Function: long __bid_fixsddi (_Decimal32 A)
-- Runtime Function: long __dpd_fixdddi (_Decimal64 A)
-- Runtime Function: long __bid_fixdddi (_Decimal64 A)
-- Runtime Function: long __dpd_fixtddi (_Decimal128 A)
-- Runtime Function: long __bid_fixtddi (_Decimal128 A)
These functions convert A to a signed long.
-- Runtime Function: unsigned int __dpd_fixunssdsi (_Decimal32 A)
-- Runtime Function: unsigned int __bid_fixunssdsi (_Decimal32 A)
-- Runtime Function: unsigned int __dpd_fixunsddsi (_Decimal64 A)
-- Runtime Function: unsigned int __bid_fixunsddsi (_Decimal64 A)
-- Runtime Function: unsigned int __dpd_fixunstdsi (_Decimal128 A)
-- Runtime Function: unsigned int __bid_fixunstdsi (_Decimal128 A)
These functions convert A to an unsigned integer. Negative values
all become zero.
-- Runtime Function: unsigned long __dpd_fixunssddi (_Decimal32 A)
-- Runtime Function: unsigned long __bid_fixunssddi (_Decimal32 A)
-- Runtime Function: unsigned long __dpd_fixunsdddi (_Decimal64 A)
-- Runtime Function: unsigned long __bid_fixunsdddi (_Decimal64 A)
-- Runtime Function: unsigned long __dpd_fixunstddi (_Decimal128 A)
-- Runtime Function: unsigned long __bid_fixunstddi (_Decimal128 A)
These functions convert A to an unsigned long. Negative values
all become zero.
-- Runtime Function: _Decimal32 __dpd_floatsisd (int I)
-- Runtime Function: _Decimal32 __bid_floatsisd (int I)
-- Runtime Function: _Decimal64 __dpd_floatsidd (int I)
-- Runtime Function: _Decimal64 __bid_floatsidd (int I)
-- Runtime Function: _Decimal128 __dpd_floatsitd (int I)
-- Runtime Function: _Decimal128 __bid_floatsitd (int I)
These functions convert I, a signed integer, to decimal floating
point.
-- Runtime Function: _Decimal32 __dpd_floatdisd (long I)
-- Runtime Function: _Decimal32 __bid_floatdisd (long I)
-- Runtime Function: _Decimal64 __dpd_floatdidd (long I)
-- Runtime Function: _Decimal64 __bid_floatdidd (long I)
-- Runtime Function: _Decimal128 __dpd_floatditd (long I)
-- Runtime Function: _Decimal128 __bid_floatditd (long I)
These functions convert I, a signed long, to decimal floating
point.
-- Runtime Function: _Decimal32 __dpd_floatunssisd (unsigned int I)
-- Runtime Function: _Decimal32 __bid_floatunssisd (unsigned int I)
-- Runtime Function: _Decimal64 __dpd_floatunssidd (unsigned int I)
-- Runtime Function: _Decimal64 __bid_floatunssidd (unsigned int I)
-- Runtime Function: _Decimal128 __dpd_floatunssitd (unsigned int I)
-- Runtime Function: _Decimal128 __bid_floatunssitd (unsigned int I)
These functions convert I, an unsigned integer, to decimal
floating point.
-- Runtime Function: _Decimal32 __dpd_floatunsdisd (unsigned long I)
-- Runtime Function: _Decimal32 __bid_floatunsdisd (unsigned long I)
-- Runtime Function: _Decimal64 __dpd_floatunsdidd (unsigned long I)
-- Runtime Function: _Decimal64 __bid_floatunsdidd (unsigned long I)
-- Runtime Function: _Decimal128 __dpd_floatunsditd (unsigned long I)
-- Runtime Function: _Decimal128 __bid_floatunsditd (unsigned long I)
These functions convert I, an unsigned long, to decimal floating
point.
4.3.3 Comparison functions
--------------------------
-- Runtime Function: int __dpd_unordsd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __bid_unordsd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __dpd_unorddd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __bid_unorddd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __dpd_unordtd2 (_Decimal128 A, _Decimal128 B)
-- Runtime Function: int __bid_unordtd2 (_Decimal128 A, _Decimal128 B)
These functions return a nonzero value if either argument is NaN,
otherwise 0.
There is also a complete group of higher level functions which
correspond directly to comparison operators. They implement the ISO C
semantics for floating-point comparisons, taking NaN into account. Pay
careful attention to the return values defined for each set. Under the
hood, all of these routines are implemented as
if (__bid_unordXd2 (a, b))
return E;
return __bid_cmpXd2 (a, b);
where E is a constant chosen to give the proper behavior for NaN.
Thus, the meaning of the return value is different for each set. Do
not rely on this implementation; only the semantics documented below
are guaranteed.
-- Runtime Function: int __dpd_eqsd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __bid_eqsd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __dpd_eqdd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __bid_eqdd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __dpd_eqtd2 (_Decimal128 A, _Decimal128 B)
-- Runtime Function: int __bid_eqtd2 (_Decimal128 A, _Decimal128 B)
These functions return zero if neither argument is NaN, and A and
B are equal.
-- Runtime Function: int __dpd_nesd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __bid_nesd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __dpd_nedd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __bid_nedd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __dpd_netd2 (_Decimal128 A, _Decimal128 B)
-- Runtime Function: int __bid_netd2 (_Decimal128 A, _Decimal128 B)
These functions return a nonzero value if either argument is NaN,
or if A and B are unequal.
-- Runtime Function: int __dpd_gesd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __bid_gesd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __dpd_gedd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __bid_gedd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __dpd_getd2 (_Decimal128 A, _Decimal128 B)
-- Runtime Function: int __bid_getd2 (_Decimal128 A, _Decimal128 B)
These functions return a value greater than or equal to zero if
neither argument is NaN, and A is greater than or equal to B.
-- Runtime Function: int __dpd_ltsd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __bid_ltsd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __dpd_ltdd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __bid_ltdd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __dpd_lttd2 (_Decimal128 A, _Decimal128 B)
-- Runtime Function: int __bid_lttd2 (_Decimal128 A, _Decimal128 B)
These functions return a value less than zero if neither argument
is NaN, and A is strictly less than B.
-- Runtime Function: int __dpd_lesd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __bid_lesd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __dpd_ledd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __bid_ledd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __dpd_letd2 (_Decimal128 A, _Decimal128 B)
-- Runtime Function: int __bid_letd2 (_Decimal128 A, _Decimal128 B)
These functions return a value less than or equal to zero if
neither argument is NaN, and A is less than or equal to B.
-- Runtime Function: int __dpd_gtsd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __bid_gtsd2 (_Decimal32 A, _Decimal32 B)
-- Runtime Function: int __dpd_gtdd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __bid_gtdd2 (_Decimal64 A, _Decimal64 B)
-- Runtime Function: int __dpd_gttd2 (_Decimal128 A, _Decimal128 B)
-- Runtime Function: int __bid_gttd2 (_Decimal128 A, _Decimal128 B)
These functions return a value greater than zero if neither
argument is NaN, and A is strictly greater than B.
File: gccint.info, Node: Fixed-point fractional library routines, Next: Exception handling routines, Prev: Decimal float library routines, Up: Libgcc
4.4 Routines for fixed-point fractional emulation
=================================================
The software fixed-point library implements fixed-point fractional
arithmetic, and is only activated on selected targets.
For ease of comprehension `fract' is an alias for the `_Fract' type,
`accum' an alias for `_Accum', and `sat' an alias for `_Sat'.
For illustrative purposes, in this section the fixed-point fractional
type `short fract' is assumed to correspond to machine mode `QQmode';
`unsigned short fract' to `UQQmode'; `fract' to `HQmode';
`unsigned fract' to `UHQmode'; `long fract' to `SQmode';
`unsigned long fract' to `USQmode'; `long long fract' to `DQmode'; and
`unsigned long long fract' to `UDQmode'. Similarly the fixed-point
accumulator type `short accum' corresponds to `HAmode';
`unsigned short accum' to `UHAmode'; `accum' to `SAmode';
`unsigned accum' to `USAmode'; `long accum' to `DAmode';
`unsigned long accum' to `UDAmode'; `long long accum' to `TAmode'; and
`unsigned long long accum' to `UTAmode'.
4.4.1 Arithmetic functions
--------------------------
-- Runtime Function: short fract __addqq3 (short fract A, short fract
B)
-- Runtime Function: fract __addhq3 (fract A, fract B)
-- Runtime Function: long fract __addsq3 (long fract A, long fract B)
-- Runtime Function: long long fract __adddq3 (long long fract A, long
long fract B)
-- Runtime Function: unsigned short fract __adduqq3 (unsigned short
fract A, unsigned short fract B)
-- Runtime Function: unsigned fract __adduhq3 (unsigned fract A,
unsigned fract B)
-- Runtime Function: unsigned long fract __addusq3 (unsigned long
fract A, unsigned long fract B)
-- Runtime Function: unsigned long long fract __addudq3 (unsigned long
long fract A, unsigned long long fract B)
-- Runtime Function: short accum __addha3 (short accum A, short accum
B)
-- Runtime Function: accum __addsa3 (accum A, accum B)
-- Runtime Function: long accum __addda3 (long accum A, long accum B)
-- Runtime Function: long long accum __addta3 (long long accum A, long
long accum B)
-- Runtime Function: unsigned short accum __adduha3 (unsigned short
accum A, unsigned short accum B)
-- Runtime Function: unsigned accum __addusa3 (unsigned accum A,
unsigned accum B)
-- Runtime Function: unsigned long accum __adduda3 (unsigned long
accum A, unsigned long accum B)
-- Runtime Function: unsigned long long accum __adduta3 (unsigned long
long accum A, unsigned long long accum B)
These functions return the sum of A and B.
-- Runtime Function: short fract __ssaddqq3 (short fract A, short
fract B)
-- Runtime Function: fract __ssaddhq3 (fract A, fract B)
-- Runtime Function: long fract __ssaddsq3 (long fract A, long fract B)
-- Runtime Function: long long fract __ssadddq3 (long long fract A,
long long fract B)
-- Runtime Function: short accum __ssaddha3 (short accum A, short
accum B)
-- Runtime Function: accum __ssaddsa3 (accum A, accum B)
-- Runtime Function: long accum __ssaddda3 (long accum A, long accum B)
-- Runtime Function: long long accum __ssaddta3 (long long accum A,
long long accum B)
These functions return the sum of A and B with signed saturation.
-- Runtime Function: unsigned short fract __usadduqq3 (unsigned short
fract A, unsigned short fract B)
-- Runtime Function: unsigned fract __usadduhq3 (unsigned fract A,
unsigned fract B)
-- Runtime Function: unsigned long fract __usaddusq3 (unsigned long
fract A, unsigned long fract B)
-- Runtime Function: unsigned long long fract __usaddudq3 (unsigned
long long fract A, unsigned long long fract B)
-- Runtime Function: unsigned short accum __usadduha3 (unsigned short
accum A, unsigned short accum B)
-- Runtime Function: unsigned accum __usaddusa3 (unsigned accum A,
unsigned accum B)
-- Runtime Function: unsigned long accum __usadduda3 (unsigned long
accum A, unsigned long accum B)
-- Runtime Function: unsigned long long accum __usadduta3 (unsigned
long long accum A, unsigned long long accum B)
These functions return the sum of A and B with unsigned saturation.
-- Runtime Function: short fract __subqq3 (short fract A, short fract
B)
-- Runtime Function: fract __subhq3 (fract A, fract B)
-- Runtime Function: long fract __subsq3 (long fract A, long fract B)
-- Runtime Function: long long fract __subdq3 (long long fract A, long
long fract B)
-- Runtime Function: unsigned short fract __subuqq3 (unsigned short
fract A, unsigned short fract B)
-- Runtime Function: unsigned fract __subuhq3 (unsigned fract A,
unsigned fract B)
-- Runtime Function: unsigned long fract __subusq3 (unsigned long
fract A, unsigned long fract B)
-- Runtime Function: unsigned long long fract __subudq3 (unsigned long
long fract A, unsigned long long fract B)
-- Runtime Function: short accum __subha3 (short accum A, short accum
B)
-- Runtime Function: accum __subsa3 (accum A, accum B)
-- Runtime Function: long accum __subda3 (long accum A, long accum B)
-- Runtime Function: long long accum __subta3 (long long accum A, long
long accum B)
-- Runtime Function: unsigned short accum __subuha3 (unsigned short
accum A, unsigned short accum B)
-- Runtime Function: unsigned accum __subusa3 (unsigned accum A,
unsigned accum B)
-- Runtime Function: unsigned long accum __subuda3 (unsigned long
accum A, unsigned long accum B)
-- Runtime Function: unsigned long long accum __subuta3 (unsigned long
long accum A, unsigned long long accum B)
These functions return the difference of A and B; that is, `A - B'.
-- Runtime Function: short fract __sssubqq3 (short fract A, short
fract B)
-- Runtime Function: fract __sssubhq3 (fract A, fract B)
-- Runtime Function: long fract __sssubsq3 (long fract A, long fract B)
-- Runtime Function: long long fract __sssubdq3 (long long fract A,
long long fract B)
-- Runtime Function: short accum __sssubha3 (short accum A, short
accum B)
-- Runtime Function: accum __sssubsa3 (accum A, accum B)
-- Runtime Function: long accum __sssubda3 (long accum A, long accum B)
-- Runtime Function: long long accum __sssubta3 (long long accum A,
long long accum B)
These functions return the difference of A and B with signed
saturation; that is, `A - B'.
-- Runtime Function: unsigned short fract __ussubuqq3 (unsigned short
fract A, unsigned short fract B)
-- Runtime Function: unsigned fract __ussubuhq3 (unsigned fract A,
unsigned fract B)
-- Runtime Function: unsigned long fract __ussubusq3 (unsigned long
fract A, unsigned long fract B)
-- Runtime Function: unsigned long long fract __ussubudq3 (unsigned
long long fract A, unsigned long long fract B)
-- Runtime Function: unsigned short accum __ussubuha3 (unsigned short
accum A, unsigned short accum B)
-- Runtime Function: unsigned accum __ussubusa3 (unsigned accum A,
unsigned accum B)
-- Runtime Function: unsigned long accum __ussubuda3 (unsigned long
accum A, unsigned long accum B)
-- Runtime Function: unsigned long long accum __ussubuta3 (unsigned
long long accum A, unsigned long long accum B)
These functions return the difference of A and B with unsigned
saturation; that is, `A - B'.
-- Runtime Function: short fract __mulqq3 (short fract A, short fract
B)
-- Runtime Function: fract __mulhq3 (fract A, fract B)
-- Runtime Function: long fract __mulsq3 (long fract A, long fract B)
-- Runtime Function: long long fract __muldq3 (long long fract A, long
long fract B)
-- Runtime Function: unsigned short fract __muluqq3 (unsigned short
fract A, unsigned short fract B)
-- Runtime Function: unsigned fract __muluhq3 (unsigned fract A,
unsigned fract B)
-- Runtime Function: unsigned long fract __mulusq3 (unsigned long
fract A, unsigned long fract B)
-- Runtime Function: unsigned long long fract __muludq3 (unsigned long
long fract A, unsigned long long fract B)
-- Runtime Function: short accum __mulha3 (short accum A, short accum
B)
-- Runtime Function: accum __mulsa3 (accum A, accum B)
-- Runtime Function: long accum __mulda3 (long accum A, long accum B)
-- Runtime Function: long long accum __multa3 (long long accum A, long
long accum B)
-- Runtime Function: unsigned short accum __muluha3 (unsigned short
accum A, unsigned short accum B)
-- Runtime Function: unsigned accum __mulusa3 (unsigned accum A,
unsigned accum B)
-- Runtime Function: unsigned long accum __muluda3 (unsigned long
accum A, unsigned long accum B)
-- Runtime Function: unsigned long long accum __muluta3 (unsigned long
long accum A, unsigned long long accum B)
These functions return the product of A and B.
-- Runtime Function: short fract __ssmulqq3 (short fract A, short
fract B)
-- Runtime Function: fract __ssmulhq3 (fract A, fract B)
-- Runtime Function: long fract __ssmulsq3 (long fract A, long fract B)
-- Runtime Function: long long fract __ssmuldq3 (long long fract A,
long long fract B)
-- Runtime Function: short accum __ssmulha3 (short accum A, short
accum B)
-- Runtime Function: accum __ssmulsa3 (accum A, accum B)
-- Runtime Function: long accum __ssmulda3 (long accum A, long accum B)
-- Runtime Function: long long accum __ssmulta3 (long long accum A,
long long accum B)
These functions return the product of A and B with signed
saturation.
-- Runtime Function: unsigned short fract __usmuluqq3 (unsigned short
fract A, unsigned short fract B)
-- Runtime Function: unsigned fract __usmuluhq3 (unsigned fract A,
unsigned fract B)
-- Runtime Function: unsigned long fract __usmulusq3 (unsigned long
fract A, unsigned long fract B)
-- Runtime Function: unsigned long long fract __usmuludq3 (unsigned
long long fract A, unsigned long long fract B)
-- Runtime Function: unsigned short accum __usmuluha3 (unsigned short
accum A, unsigned short accum B)
-- Runtime Function: unsigned accum __usmulusa3 (unsigned accum A,
unsigned accum B)
-- Runtime Function: unsigned long accum __usmuluda3 (unsigned long
accum A, unsigned long accum B)
-- Runtime Function: unsigned long long accum __usmuluta3 (unsigned
long long accum A, unsigned long long accum B)
These functions return the product of A and B with unsigned
saturation.
-- Runtime Function: short fract __divqq3 (short fract A, short fract
B)
-- Runtime Function: fract __divhq3 (fract A, fract B)
-- Runtime Function: long fract __divsq3 (long fract A, long fract B)
-- Runtime Function: long long fract __divdq3 (long long fract A, long
long fract B)
-- Runtime Function: short accum __divha3 (short accum A, short accum
B)
-- Runtime Function: accum __divsa3 (accum A, accum B)
-- Runtime Function: long accum __divda3 (long accum A, long accum B)
-- Runtime Function: long long accum __divta3 (long long accum A, long
long accum B)
These functions return the quotient of the signed division of A
and B.
-- Runtime Function: unsigned short fract __udivuqq3 (unsigned short
fract A, unsigned short fract B)
-- Runtime Function: unsigned fract __udivuhq3 (unsigned fract A,
unsigned fract B)
-- Runtime Function: unsigned long fract __udivusq3 (unsigned long
fract A, unsigned long fract B)
-- Runtime Function: unsigned long long fract __udivudq3 (unsigned
long long fract A, unsigned long long fract B)
-- Runtime Function: unsigned short accum __udivuha3 (unsigned short
accum A, unsigned short accum B)
-- Runtime Function: unsigned accum __udivusa3 (unsigned accum A,
unsigned accum B)
-- Runtime Function: unsigned long accum __udivuda3 (unsigned long
accum A, unsigned long accum B)
-- Runtime Function: unsigned long long accum __udivuta3 (unsigned
long long accum A, unsigned long long accum B)
These functions return the quotient of the unsigned division of A
and B.
-- Runtime Function: short fract __ssdivqq3 (short fract A, short
fract B)
-- Runtime Function: fract __ssdivhq3 (fract A, fract B)
-- Runtime Function: long fract __ssdivsq3 (long fract A, long fract B)
-- Runtime Function: long long fract __ssdivdq3 (long long fract A,
long long fract B)
-- Runtime Function: short accum __ssdivha3 (short accum A, short
accum B)
-- Runtime Function: accum __ssdivsa3 (accum A, accum B)
-- Runtime Function: long accum __ssdivda3 (long accum A, long accum B)
-- Runtime Function: long long accum __ssdivta3 (long long accum A,
long long accum B)
These functions return the quotient of the signed division of A
and B with signed saturation.
-- Runtime Function: unsigned short fract __usdivuqq3 (unsigned short
fract A, unsigned short fract B)
-- Runtime Function: unsigned fract __usdivuhq3 (unsigned fract A,
unsigned fract B)
-- Runtime Function: unsigned long fract __usdivusq3 (unsigned long
fract A, unsigned long fract B)
-- Runtime Function: unsigned long long fract __usdivudq3 (unsigned
long long fract A, unsigned long long fract B)
-- Runtime Function: unsigned short accum __usdivuha3 (unsigned short
accum A, unsigned short accum B)
-- Runtime Function: unsigned accum __usdivusa3 (unsigned accum A,
unsigned accum B)
-- Runtime Function: unsigned long accum __usdivuda3 (unsigned long
accum A, unsigned long accum B)
-- Runtime Function: unsigned long long accum __usdivuta3 (unsigned
long long accum A, unsigned long long accum B)
These functions return the quotient of the unsigned division of A
and B with unsigned saturation.
-- Runtime Function: short fract __negqq2 (short fract A)
-- Runtime Function: fract __neghq2 (fract A)
-- Runtime Function: long fract __negsq2 (long fract A)
-- Runtime Function: long long fract __negdq2 (long long fract A)
-- Runtime Function: unsigned short fract __neguqq2 (unsigned short
fract A)
-- Runtime Function: unsigned fract __neguhq2 (unsigned fract A)
-- Runtime Function: unsigned long fract __negusq2 (unsigned long
fract A)
-- Runtime Function: unsigned long long fract __negudq2 (unsigned long
long fract A)
-- Runtime Function: short accum __negha2 (short accum A)
-- Runtime Function: accum __negsa2 (accum A)
-- Runtime Function: long accum __negda2 (long accum A)
-- Runtime Function: long long accum __negta2 (long long accum A)
-- Runtime Function: unsigned short accum __neguha2 (unsigned short
accum A)
-- Runtime Function: unsigned accum __negusa2 (unsigned accum A)
-- Runtime Function: unsigned long accum __neguda2 (unsigned long
accum A)
-- Runtime Function: unsigned long long accum __neguta2 (unsigned long
long accum A)
These functions return the negation of A.
-- Runtime Function: short fract __ssnegqq2 (short fract A)
-- Runtime Function: fract __ssneghq2 (fract A)
-- Runtime Function: long fract __ssnegsq2 (long fract A)
-- Runtime Function: long long fract __ssnegdq2 (long long fract A)
-- Runtime Function: short accum __ssnegha2 (short accum A)
-- Runtime Function: accum __ssnegsa2 (accum A)
-- Runtime Function: long accum __ssnegda2 (long accum A)
-- Runtime Function: long long accum __ssnegta2 (long long accum A)
These functions return the negation of A with signed saturation.
-- Runtime Function: unsigned short fract __usneguqq2 (unsigned short
fract A)
-- Runtime Function: unsigned fract __usneguhq2 (unsigned fract A)
-- Runtime Function: unsigned long fract __usnegusq2 (unsigned long
fract A)
-- Runtime Function: unsigned long long fract __usnegudq2 (unsigned
long long fract A)
-- Runtime Function: unsigned short accum __usneguha2 (unsigned short
accum A)
-- Runtime Function: unsigned accum __usnegusa2 (unsigned accum A)
-- Runtime Function: unsigned long accum __usneguda2 (unsigned long
accum A)
-- Runtime Function: unsigned long long accum __usneguta2 (unsigned
long long accum A)
These functions return the negation of A with unsigned saturation.
-- Runtime Function: short fract __ashlqq3 (short fract A, int B)
-- Runtime Function: fract __ashlhq3 (fract A, int B)
-- Runtime Function: long fract __ashlsq3 (long fract A, int B)
-- Runtime Function: long long fract __ashldq3 (long long fract A, int
B)
-- Runtime Function: unsigned short fract __ashluqq3 (unsigned short
fract A, int B)
-- Runtime Function: unsigned fract __ashluhq3 (unsigned fract A, int
B)
-- Runtime Function: unsigned long fract __ashlusq3 (unsigned long
fract A, int B)
-- Runtime Function: unsigned long long fract __ashludq3 (unsigned
long long fract A, int B)
-- Runtime Function: short accum __ashlha3 (short accum A, int B)
-- Runtime Function: accum __ashlsa3 (accum A, int B)
-- Runtime Function: long accum __ashlda3 (long accum A, int B)
-- Runtime Function: long long accum __ashlta3 (long long accum A, int
B)
-- Runtime Function: unsigned short accum __ashluha3 (unsigned short
accum A, int B)
-- Runtime Function: unsigned accum __ashlusa3 (unsigned accum A, int
B)
-- Runtime Function: unsigned long accum __ashluda3 (unsigned long
accum A, int B)
-- Runtime Function: unsigned long long accum __ashluta3 (unsigned
long long accum A, int B)
These functions return the result of shifting A left by B bits.
-- Runtime Function: short fract __ashrqq3 (short fract A, int B)
-- Runtime Function: fract __ashrhq3 (fract A, int B)
-- Runtime Function: long fract __ashrsq3 (long fract A, int B)
-- Runtime Function: long long fract __ashrdq3 (long long fract A, int
B)
-- Runtime Function: short accum __ashrha3 (short accum A, int B)
-- Runtime Function: accum __ashrsa3 (accum A, int B)
-- Runtime Function: long accum __ashrda3 (long accum A, int B)
-- Runtime Function: long long accum __ashrta3 (long long accum A, int
B)
These functions return the result of arithmetically shifting A
right by B bits.
-- Runtime Function: unsigned short fract __lshruqq3 (unsigned short
fract A, int B)
-- Runtime Function: unsigned fract __lshruhq3 (unsigned fract A, int
B)
-- Runtime Function: unsigned long fract __lshrusq3 (unsigned long
fract A, int B)
-- Runtime Function: unsigned long long fract __lshrudq3 (unsigned
long long fract A, int B)
-- Runtime Function: unsigned short accum __lshruha3 (unsigned short
accum A, int B)
-- Runtime Function: unsigned accum __lshrusa3 (unsigned accum A, int
B)
-- Runtime Function: unsigned long accum __lshruda3 (unsigned long
accum A, int B)
-- Runtime Function: unsigned long long accum __lshruta3 (unsigned
long long accum A, int B)
These functions return the result of logically shifting A right by
B bits.
-- Runtime Function: fract __ssashlhq3 (fract A, int B)
-- Runtime Function: long fract __ssashlsq3 (long fract A, int B)
-- Runtime Function: long long fract __ssashldq3 (long long fract A,
int B)
-- Runtime Function: short accum __ssashlha3 (short accum A, int B)
-- Runtime Function: accum __ssashlsa3 (accum A, int B)
-- Runtime Function: long accum __ssashlda3 (long accum A, int B)
-- Runtime Function: long long accum __ssashlta3 (long long accum A,
int B)
These functions return the result of shifting A left by B bits
with signed saturation.
-- Runtime Function: unsigned short fract __usashluqq3 (unsigned short
fract A, int B)
-- Runtime Function: unsigned fract __usashluhq3 (unsigned fract A,
int B)
-- Runtime Function: unsigned long fract __usashlusq3 (unsigned long
fract A, int B)
-- Runtime Function: unsigned long long fract __usashludq3 (unsigned
long long fract A, int B)
-- Runtime Function: unsigned short accum __usashluha3 (unsigned short
accum A, int B)
-- Runtime Function: unsigned accum __usashlusa3 (unsigned accum A,
int B)
-- Runtime Function: unsigned long accum __usashluda3 (unsigned long
accum A, int B)
-- Runtime Function: unsigned long long accum __usashluta3 (unsigned
long long accum A, int B)
These functions return the result of shifting A left by B bits
with unsigned saturation.
4.4.2 Comparison functions
--------------------------
The following functions implement fixed-point comparisons. These
functions implement a low-level compare, upon which the higher level
comparison operators (such as less than and greater than or equal to)
can be constructed. The returned values lie in the range zero to two,
to allow the high-level operators to be implemented by testing the
returned result using either signed or unsigned comparison.
-- Runtime Function: int __cmpqq2 (short fract A, short fract B)
-- Runtime Function: int __cmphq2 (fract A, fract B)
-- Runtime Function: int __cmpsq2 (long fract A, long fract B)
-- Runtime Function: int __cmpdq2 (long long fract A, long long fract
B)
-- Runtime Function: int __cmpuqq2 (unsigned short fract A, unsigned
short fract B)
-- Runtime Function: int __cmpuhq2 (unsigned fract A, unsigned fract B)
-- Runtime Function: int __cmpusq2 (unsigned long fract A, unsigned
long fract B)
-- Runtime Function: int __cmpudq2 (unsigned long long fract A,
unsigned long long fract B)
-- Runtime Function: int __cmpha2 (short accum A, short accum B)
-- Runtime Function: int __cmpsa2 (accum A, accum B)
-- Runtime Function: int __cmpda2 (long accum A, long accum B)
-- Runtime Function: int __cmpta2 (long long accum A, long long accum
B)
-- Runtime Function: int __cmpuha2 (unsigned short accum A, unsigned
short accum B)
-- Runtime Function: int __cmpusa2 (unsigned accum A, unsigned accum B)
-- Runtime Function: int __cmpuda2 (unsigned long accum A, unsigned
long accum B)
-- Runtime Function: int __cmputa2 (unsigned long long accum A,
unsigned long long accum B)
These functions perform a signed or unsigned comparison of A and B
(depending on the selected machine mode). If A is less than B,
they return 0; if A is greater than B, they return 2; and if A and
B are equal they return 1.
4.4.3 Conversion functions
--------------------------
-- Runtime Function: fract __fractqqhq2 (short fract A)
-- Runtime Function: long fract __fractqqsq2 (short fract A)
-- Runtime Function: long long fract __fractqqdq2 (short fract A)
-- Runtime Function: short accum __fractqqha (short fract A)
-- Runtime Function: accum __fractqqsa (short fract A)
-- Runtime Function: long accum __fractqqda (short fract A)
-- Runtime Function: long long accum __fractqqta (short fract A)
-- Runtime Function: unsigned short fract __fractqquqq (short fract A)
-- Runtime Function: unsigned fract __fractqquhq (short fract A)
-- Runtime Function: unsigned long fract __fractqqusq (short fract A)
-- Runtime Function: unsigned long long fract __fractqqudq (short
fract A)
-- Runtime Function: unsigned short accum __fractqquha (short fract A)
-- Runtime Function: unsigned accum __fractqqusa (short fract A)
-- Runtime Function: unsigned long accum __fractqquda (short fract A)
-- Runtime Function: unsigned long long accum __fractqquta (short
fract A)
-- Runtime Function: signed char __fractqqqi (short fract A)
-- Runtime Function: short __fractqqhi (short fract A)
-- Runtime Function: int __fractqqsi (short fract A)
-- Runtime Function: long __fractqqdi (short fract A)
-- Runtime Function: long long __fractqqti (short fract A)
-- Runtime Function: float __fractqqsf (short fract A)
-- Runtime Function: double __fractqqdf (short fract A)
-- Runtime Function: short fract __fracthqqq2 (fract A)
-- Runtime Function: long fract __fracthqsq2 (fract A)
-- Runtime Function: long long fract __fracthqdq2 (fract A)
-- Runtime Function: short accum __fracthqha (fract A)
-- Runtime Function: accum __fracthqsa (fract A)
-- Runtime Function: long accum __fracthqda (fract A)
-- Runtime Function: long long accum __fracthqta (fract A)
-- Runtime Function: unsigned short fract __fracthquqq (fract A)
-- Runtime Function: unsigned fract __fracthquhq (fract A)
-- Runtime Function: unsigned long fract __fracthqusq (fract A)
-- Runtime Function: unsigned long long fract __fracthqudq (fract A)
-- Runtime Function: unsigned short accum __fracthquha (fract A)
-- Runtime Function: unsigned accum __fracthqusa (fract A)
-- Runtime Function: unsigned long accum __fracthquda (fract A)
-- Runtime Function: unsigned long long accum __fracthquta (fract A)
-- Runtime Function: signed char __fracthqqi (fract A)
-- Runtime Function: short __fracthqhi (fract A)
-- Runtime Function: int __fracthqsi (fract A)
-- Runtime Function: long __fracthqdi (fract A)
-- Runtime Function: long long __fracthqti (fract A)
-- Runtime Function: float __fracthqsf (fract A)
-- Runtime Function: double __fracthqdf (fract A)
-- Runtime Function: short fract __fractsqqq2 (long fract A)
-- Runtime Function: fract __fractsqhq2 (long fract A)
-- Runtime Function: long long fract __fractsqdq2 (long fract A)
-- Runtime Function: short accum __fractsqha (long fract A)
-- Runtime Function: accum __fractsqsa (long fract A)
-- Runtime Function: long accum __fractsqda (long fract A)
-- Runtime Function: long long accum __fractsqta (long fract A)
-- Runtime Function: unsigned short fract __fractsquqq (long fract A)
-- Runtime Function: unsigned fract __fractsquhq (long fract A)
-- Runtime Function: unsigned long fract __fractsqusq (long fract A)
-- Runtime Function: unsigned long long fract __fractsqudq (long fract
A)
-- Runtime Function: unsigned short accum __fractsquha (long fract A)
-- Runtime Function: unsigned accum __fractsqusa (long fract A)
-- Runtime Function: unsigned long accum __fractsquda (long fract A)
-- Runtime Function: unsigned long long accum __fractsquta (long fract
A)
-- Runtime Function: signed char __fractsqqi (long fract A)
-- Runtime Function: short __fractsqhi (long fract A)
-- Runtime Function: int __fractsqsi (long fract A)
-- Runtime Function: long __fractsqdi (long fract A)
-- Runtime Function: long long __fractsqti (long fract A)
-- Runtime Function: float __fractsqsf (long fract A)
-- Runtime Function: double __fractsqdf (long fract A)
-- Runtime Function: short fract __fractdqqq2 (long long fract A)
-- Runtime Function: fract __fractdqhq2 (long long fract A)
-- Runtime Function: long fract __fractdqsq2 (long long fract A)
-- Runtime Function: short accum __fractdqha (long long fract A)
-- Runtime Function: accum __fractdqsa (long long fract A)
-- Runtime Function: long accum __fractdqda (long long fract A)
-- Runtime Function: long long accum __fractdqta (long long fract A)
-- Runtime Function: unsigned short fract __fractdquqq (long long
fract A)
-- Runtime Function: unsigned fract __fractdquhq (long long fract A)
-- Runtime Function: unsigned long fract __fractdqusq (long long fract
A)
-- Runtime Function: unsigned long long fract __fractdqudq (long long
fract A)
-- Runtime Function: unsigned short accum __fractdquha (long long
fract A)
-- Runtime Function: unsigned accum __fractdqusa (long long fract A)
-- Runtime Function: unsigned long accum __fractdquda (long long fract
A)
-- Runtime Function: unsigned long long accum __fractdquta (long long
fract A)
-- Runtime Function: signed char __fractdqqi (long long fract A)
-- Runtime Function: short __fractdqhi (long long fract A)
-- Runtime Function: int __fractdqsi (long long fract A)
-- Runtime Function: long __fractdqdi (long long fract A)
-- Runtime Function: long long __fractdqti (long long fract A)
-- Runtime Function: float __fractdqsf (long long fract A)
-- Runtime Function: double __fractdqdf (long long fract A)
-- Runtime Function: short fract __fracthaqq (short accum A)
-- Runtime Function: fract __fracthahq (short accum A)
-- Runtime Function: long fract __fracthasq (short accum A)
-- Runtime Function: long long fract __fracthadq (short accum A)
-- Runtime Function: accum __fracthasa2 (short accum A)
-- Runtime Function: long accum __fracthada2 (short accum A)
-- Runtime Function: long long accum __fracthata2 (short accum A)
-- Runtime Function: unsigned short fract __fracthauqq (short accum A)
-- Runtime Function: unsigned fract __fracthauhq (short accum A)
-- Runtime Function: unsigned long fract __fracthausq (short accum A)
-- Runtime Function: unsigned long long fract __fracthaudq (short
accum A)
-- Runtime Function: unsigned short accum __fracthauha (short accum A)
-- Runtime Function: unsigned accum __fracthausa (short accum A)
-- Runtime Function: unsigned long accum __fracthauda (short accum A)
-- Runtime Function: unsigned long long accum __fracthauta (short
accum A)
-- Runtime Function: signed char __fracthaqi (short accum A)
-- Runtime Function: short __fracthahi (short accum A)
-- Runtime Function: int __fracthasi (short accum A)
-- Runtime Function: long __fracthadi (short accum A)
-- Runtime Function: long long __fracthati (short accum A)
-- Runtime Function: float __fracthasf (short accum A)
-- Runtime Function: double __fracthadf (short accum A)
-- Runtime Function: short fract __fractsaqq (accum A)
-- Runtime Function: fract __fractsahq (accum A)
-- Runtime Function: long fract __fractsasq (accum A)
-- Runtime Function: long long fract __fractsadq (accum A)
-- Runtime Function: short accum __fractsaha2 (accum A)
-- Runtime Function: long accum __fractsada2 (accum A)
-- Runtime Function: long long accum __fractsata2 (accum A)
-- Runtime Function: unsigned short fract __fractsauqq (accum A)
-- Runtime Function: unsigned fract __fractsauhq (accum A)
-- Runtime Function: unsigned long fract __fractsausq (accum A)
-- Runtime Function: unsigned long long fract __fractsaudq (accum A)
-- Runtime Function: unsigned short accum __fractsauha (accum A)
-- Runtime Function: unsigned accum __fractsausa (accum A)
-- Runtime Function: unsigned long accum __fractsauda (accum A)
-- Runtime Function: unsigned long long accum __fractsauta (accum A)
-- Runtime Function: signed char __fractsaqi (accum A)
-- Runtime Function: short __fractsahi (accum A)
-- Runtime Function: int __fractsasi (accum A)
-- Runtime Function: long __fractsadi (accum A)
-- Runtime Function: long long __fractsati (accum A)
-- Runtime Function: float __fractsasf (accum A)
-- Runtime Function: double __fractsadf (accum A)
-- Runtime Function: short fract __fractdaqq (long accum A)
-- Runtime Function: fract __fractdahq (long accum A)
-- Runtime Function: long fract __fractdasq (long accum A)
-- Runtime Function: long long fract __fractdadq (long accum A)
-- Runtime Function: short accum __fractdaha2 (long accum A)
-- Runtime Function: accum __fractdasa2 (long accum A)
-- Runtime Function: long long accum __fractdata2 (long accum A)
-- Runtime Function: unsigned short fract __fractdauqq (long accum A)
-- Runtime Function: unsigned fract __fractdauhq (long accum A)
-- Runtime Function: unsigned long fract __fractdausq (long accum A)
-- Runtime Function: unsigned long long fract __fractdaudq (long accum
A)
-- Runtime Function: unsigned short accum __fractdauha (long accum A)
-- Runtime Function: unsigned accum __fractdausa (long accum A)
-- Runtime Function: unsigned long accum __fractdauda (long accum A)
-- Runtime Function: unsigned long long accum __fractdauta (long accum
A)
-- Runtime Function: signed char __fractdaqi (long accum A)
-- Runtime Function: short __fractdahi (long accum A)
-- Runtime Function: int __fractdasi (long accum A)
-- Runtime Function: long __fractdadi (long accum A)
-- Runtime Function: long long __fractdati (long accum A)
-- Runtime Function: float __fractdasf (long accum A)
-- Runtime Function: double __fractdadf (long accum A)
-- Runtime Function: short fract __fracttaqq (long long accum A)
-- Runtime Function: fract __fracttahq (long long accum A)
-- Runtime Function: long fract __fracttasq (long long accum A)
-- Runtime Function: long long fract __fracttadq (long long accum A)
-- Runtime Function: short accum __fracttaha2 (long long accum A)
-- Runtime Function: accum __fracttasa2 (long long accum A)
-- Runtime Function: long accum __fracttada2 (long long accum A)
-- Runtime Function: unsigned short fract __fracttauqq (long long
accum A)
-- Runtime Function: unsigned fract __fracttauhq (long long accum A)
-- Runtime Function: unsigned long fract __fracttausq (long long accum
A)
-- Runtime Function: unsigned long long fract __fracttaudq (long long
accum A)
-- Runtime Function: unsigned short accum __fracttauha (long long
accum A)
-- Runtime Function: unsigned accum __fracttausa (long long accum A)
-- Runtime Function: unsigned long accum __fracttauda (long long accum
A)
-- Runtime Function: unsigned long long accum __fracttauta (long long
accum A)
-- Runtime Function: signed char __fracttaqi (long long accum A)
-- Runtime Function: short __fracttahi (long long accum A)
-- Runtime Function: int __fracttasi (long long accum A)
-- Runtime Function: long __fracttadi (long long accum A)
-- Runtime Function: long long __fracttati (long long accum A)
-- Runtime Function: float __fracttasf (long long accum A)
-- Runtime Function: double __fracttadf (long long accum A)
-- Runtime Function: short fract __fractuqqqq (unsigned short fract A)
-- Runtime Function: fract __fractuqqhq (unsigned short fract A)
-- Runtime Function: long fract __fractuqqsq (unsigned short fract A)
-- Runtime Function: long long fract __fractuqqdq (unsigned short
fract A)
-- Runtime Function: short accum __fractuqqha (unsigned short fract A)
-- Runtime Function: accum __fractuqqsa (unsigned short fract A)
-- Runtime Function: long accum __fractuqqda (unsigned short fract A)
-- Runtime Function: long long accum __fractuqqta (unsigned short
fract A)
-- Runtime Function: unsigned fract __fractuqquhq2 (unsigned short
fract A)
-- Runtime Function: unsigned long fract __fractuqqusq2 (unsigned
short fract A)
-- Runtime Function: unsigned long long fract __fractuqqudq2 (unsigned
short fract A)
-- Runtime Function: unsigned short accum __fractuqquha (unsigned
short fract A)
-- Runtime Function: unsigned accum __fractuqqusa (unsigned short
fract A)
-- Runtime Function: unsigned long accum __fractuqquda (unsigned short
fract A)
-- Runtime Function: unsigned long long accum __fractuqquta (unsigned
short fract A)
-- Runtime Function: signed char __fractuqqqi (unsigned short fract A)
-- Runtime Function: short __fractuqqhi (unsigned short fract A)
-- Runtime Function: int __fractuqqsi (unsigned short fract A)
-- Runtime Function: long __fractuqqdi (unsigned short fract A)
-- Runtime Function: long long __fractuqqti (unsigned short fract A)
-- Runtime Function: float __fractuqqsf (unsigned short fract A)
-- Runtime Function: double __fractuqqdf (unsigned short fract A)
-- Runtime Function: short fract __fractuhqqq (unsigned fract A)
-- Runtime Function: fract __fractuhqhq (unsigned fract A)
-- Runtime Function: long fract __fractuhqsq (unsigned fract A)
-- Runtime Function: long long fract __fractuhqdq (unsigned fract A)
-- Runtime Function: short accum __fractuhqha (unsigned fract A)
-- Runtime Function: accum __fractuhqsa (unsigned fract A)
-- Runtime Function: long accum __fractuhqda (unsigned fract A)
-- Runtime Function: long long accum __fractuhqta (unsigned fract A)
-- Runtime Function: unsigned short fract __fractuhquqq2 (unsigned
fract A)
-- Runtime Function: unsigned long fract __fractuhqusq2 (unsigned
fract A)
-- Runtime Function: unsigned long long fract __fractuhqudq2 (unsigned
fract A)
-- Runtime Function: unsigned short accum __fractuhquha (unsigned
fract A)
-- Runtime Function: unsigned accum __fractuhqusa (unsigned fract A)
-- Runtime Function: unsigned long accum __fractuhquda (unsigned fract
A)
-- Runtime Function: unsigned long long accum __fractuhquta (unsigned
fract A)
-- Runtime Function: signed char __fractuhqqi (unsigned fract A)
-- Runtime Function: short __fractuhqhi (unsigned fract A)
-- Runtime Function: int __fractuhqsi (unsigned fract A)
-- Runtime Function: long __fractuhqdi (unsigned fract A)
-- Runtime Function: long long __fractuhqti (unsigned fract A)
-- Runtime Function: float __fractuhqsf (unsigned fract A)
-- Runtime Function: double __fractuhqdf (unsigned fract A)
-- Runtime Function: short fract __fractusqqq (unsigned long fract A)
-- Runtime Function: fract __fractusqhq (unsigned long fract A)
-- Runtime Function: long fract __fractusqsq (unsigned long fract A)
-- Runtime Function: long long fract __fractusqdq (unsigned long fract
A)
-- Runtime Function: short accum __fractusqha (unsigned long fract A)
-- Runtime Function: accum __fractusqsa (unsigned long fract A)
-- Runtime Function: long accum __fractusqda (unsigned long fract A)
-- Runtime Function: long long accum __fractusqta (unsigned long fract
A)
-- Runtime Function: unsigned short fract __fractusquqq2 (unsigned
long fract A)
-- Runtime Function: unsigned fract __fractusquhq2 (unsigned long
fract A)
-- Runtime Function: unsigned long long fract __fractusqudq2 (unsigned
long fract A)
-- Runtime Function: unsigned short accum __fractusquha (unsigned long
fract A)
-- Runtime Function: unsigned accum __fractusqusa (unsigned long fract
A)
-- Runtime Function: unsigned long accum __fractusquda (unsigned long
fract A)
-- Runtime Function: unsigned long long accum __fractusquta (unsigned
long fract A)
-- Runtime Function: signed char __fractusqqi (unsigned long fract A)
-- Runtime Function: short __fractusqhi (unsigned long fract A)
-- Runtime Function: int __fractusqsi (unsigned long fract A)
-- Runtime Function: long __fractusqdi (unsigned long fract A)
-- Runtime Function: long long __fractusqti (unsigned long fract A)
-- Runtime Function: float __fractusqsf (unsigned long fract A)
-- Runtime Function: double __fractusqdf (unsigned long fract A)
-- Runtime Function: short fract __fractudqqq (unsigned long long
fract A)
-- Runtime Function: fract __fractudqhq (unsigned long long fract A)
-- Runtime Function: long fract __fractudqsq (unsigned long long fract
A)
-- Runtime Function: long long fract __fractudqdq (unsigned long long
fract A)
-- Runtime Function: short accum __fractudqha (unsigned long long
fract A)
-- Runtime Function: accum __fractudqsa (unsigned long long fract A)
-- Runtime Function: long accum __fractudqda (unsigned long long fract
A)
-- Runtime Function: long long accum __fractudqta (unsigned long long
fract A)
-- Runtime Function: unsigned short fract __fractudquqq2 (unsigned
long long fract A)
-- Runtime Function: unsigned fract __fractudquhq2 (unsigned long long
fract A)
-- Runtime Function: unsigned long fract __fractudqusq2 (unsigned long
long fract A)
-- Runtime Function: unsigned short accum __fractudquha (unsigned long
long fract A)
-- Runtime Function: unsigned accum __fractudqusa (unsigned long long
fract A)
-- Runtime Function: unsigned long accum __fractudquda (unsigned long
long fract A)
-- Runtime Function: unsigned long long accum __fractudquta (unsigned
long long fract A)
-- Runtime Function: signed char __fractudqqi (unsigned long long
fract A)
-- Runtime Function: short __fractudqhi (unsigned long long fract A)
-- Runtime Function: int __fractudqsi (unsigned long long fract A)
-- Runtime Function: long __fractudqdi (unsigned long long fract A)
-- Runtime Function: long long __fractudqti (unsigned long long fract
A)
-- Runtime Function: float __fractudqsf (unsigned long long fract A)
-- Runtime Function: double __fractudqdf (unsigned long long fract A)
-- Runtime Function: short fract __fractuhaqq (unsigned short accum A)
-- Runtime Function: fract __fractuhahq (unsigned short accum A)
-- Runtime Function: long fract __fractuhasq (unsigned short accum A)
-- Runtime Function: long long fract __fractuhadq (unsigned short
accum A)
-- Runtime Function: short accum __fractuhaha (unsigned short accum A)
-- Runtime Function: accum __fractuhasa (unsigned short accum A)
-- Runtime Function: long accum __fractuhada (unsigned short accum A)
-- Runtime Function: long long accum __fractuhata (unsigned short
accum A)
-- Runtime Function: unsigned short fract __fractuhauqq (unsigned
short accum A)
-- Runtime Function: unsigned fract __fractuhauhq (unsigned short
accum A)
-- Runtime Function: unsigned long fract __fractuhausq (unsigned short
accum A)
-- Runtime Function: unsigned long long fract __fractuhaudq (unsigned
short accum A)
-- Runtime Function: unsigned accum __fractuhausa2 (unsigned short
accum A)
-- Runtime Function: unsigned long accum __fractuhauda2 (unsigned
short accum A)
-- Runtime Function: unsigned long long accum __fractuhauta2 (unsigned
short accum A)
-- Runtime Function: signed char __fractuhaqi (unsigned short accum A)
-- Runtime Function: short __fractuhahi (unsigned short accum A)
-- Runtime Function: int __fractuhasi (unsigned short accum A)
-- Runtime Function: long __fractuhadi (unsigned short accum A)
-- Runtime Function: long long __fractuhati (unsigned short accum A)
-- Runtime Function: float __fractuhasf (unsigned short accum A)
-- Runtime Function: double __fractuhadf (unsigned short accum A)
-- Runtime Function: short fract __fractusaqq (unsigned accum A)
-- Runtime Function: fract __fractusahq (unsigned accum A)
-- Runtime Function: long fract __fractusasq (unsigned accum A)
-- Runtime Function: long long fract __fractusadq (unsigned accum A)
-- Runtime Function: short accum __fractusaha (unsigned accum A)
-- Runtime Function: accum __fractusasa (unsigned accum A)
-- Runtime Function: long accum __fractusada (unsigned accum A)
-- Runtime Function: long long accum __fractusata (unsigned accum A)
-- Runtime Function: unsigned short fract __fractusauqq (unsigned
accum A)
-- Runtime Function: unsigned fract __fractusauhq (unsigned accum A)
-- Runtime Function: unsigned long fract __fractusausq (unsigned accum
A)
-- Runtime Function: unsigned long long fract __fractusaudq (unsigned
accum A)
-- Runtime Function: unsigned short accum __fractusauha2 (unsigned
accum A)
-- Runtime Function: unsigned long accum __fractusauda2 (unsigned
accum A)
-- Runtime Function: unsigned long long accum __fractusauta2 (unsigned
accum A)
-- Runtime Function: signed char __fractusaqi (unsigned accum A)
-- Runtime Function: short __fractusahi (unsigned accum A)
-- Runtime Function: int __fractusasi (unsigned accum A)
-- Runtime Function: long __fractusadi (unsigned accum A)
-- Runtime Function: long long __fractusati (unsigned accum A)
-- Runtime Function: float __fractusasf (unsigned accum A)
-- Runtime Function: double __fractusadf (unsigned accum A)
-- Runtime Function: short fract __fractudaqq (unsigned long accum A)
-- Runtime Function: fract __fractudahq (unsigned long accum A)
-- Runtime Function: long fract __fractudasq (unsigned long accum A)
-- Runtime Function: long long fract __fractudadq (unsigned long accum
A)
-- Runtime Function: short accum __fractudaha (unsigned long accum A)
-- Runtime Function: accum __fractudasa (unsigned long accum A)
-- Runtime Function: long accum __fractudada (unsigned long accum A)
-- Runtime Function: long long accum __fractudata (unsigned long accum
A)
-- Runtime Function: unsigned short fract __fractudauqq (unsigned long
accum A)
-- Runtime Function: unsigned fract __fractudauhq (unsigned long accum
A)
-- Runtime Function: unsigned long fract __fractudausq (unsigned long
accum A)
-- Runtime Function: unsigned long long fract __fractudaudq (unsigned
long accum A)
-- Runtime Function: unsigned short accum __fractudauha2 (unsigned
long accum A)
-- Runtime Function: unsigned accum __fractudausa2 (unsigned long
accum A)
-- Runtime Function: unsigned long long accum __fractudauta2 (unsigned
long accum A)
-- Runtime Function: signed char __fractudaqi (unsigned long accum A)
-- Runtime Function: short __fractudahi (unsigned long accum A)
-- Runtime Function: int __fractudasi (unsigned long accum A)
-- Runtime Function: long __fractudadi (unsigned long accum A)
-- Runtime Function: long long __fractudati (unsigned long accum A)
-- Runtime Function: float __fractudasf (unsigned long accum A)
-- Runtime Function: double __fractudadf (unsigned long accum A)
-- Runtime Function: short fract __fractutaqq (unsigned long long
accum A)
-- Runtime Function: fract __fractutahq (unsigned long long accum A)
-- Runtime Function: long fract __fractutasq (unsigned long long accum
A)
-- Runtime Function: long long fract __fractutadq (unsigned long long
accum A)
-- Runtime Function: short accum __fractutaha (unsigned long long
accum A)
-- Runtime Function: accum __fractutasa (unsigned long long accum A)
-- Runtime Function: long accum __fractutada (unsigned long long accum
A)
-- Runtime Function: long long accum __fractutata (unsigned long long
accum A)
-- Runtime Function: unsigned short fract __fractutauqq (unsigned long
long accum A)
-- Runtime Function: unsigned fract __fractutauhq (unsigned long long
accum A)
-- Runtime Function: unsigned long fract __fractutausq (unsigned long
long accum A)
-- Runtime Function: unsigned long long fract __fractutaudq (unsigned
long long accum A)
-- Runtime Function: unsigned short accum __fractutauha2 (unsigned
long long accum A)
-- Runtime Function: unsigned accum __fractutausa2 (unsigned long long
accum A)
-- Runtime Function: unsigned long accum __fractutauda2 (unsigned long
long accum A)
-- Runtime Function: signed char __fractutaqi (unsigned long long
accum A)
-- Runtime Function: short __fractutahi (unsigned long long accum A)
-- Runtime Function: int __fractutasi (unsigned long long accum A)
-- Runtime Function: long __fractutadi (unsigned long long accum A)
-- Runtime Function: long long __fractutati (unsigned long long accum
A)
-- Runtime Function: float __fractutasf (unsigned long long accum A)
-- Runtime Function: double __fractutadf (unsigned long long accum A)
-- Runtime Function: short fract __fractqiqq (signed char A)
-- Runtime Function: fract __fractqihq (signed char A)
-- Runtime Function: long fract __fractqisq (signed char A)
-- Runtime Function: long long fract __fractqidq (signed char A)
-- Runtime Function: short accum __fractqiha (signed char A)
-- Runtime Function: accum __fractqisa (signed char A)
-- Runtime Function: long accum __fractqida (signed char A)
-- Runtime Function: long long accum __fractqita (signed char A)
-- Runtime Function: unsigned short fract __fractqiuqq (signed char A)
-- Runtime Function: unsigned fract __fractqiuhq (signed char A)
-- Runtime Function: unsigned long fract __fractqiusq (signed char A)
-- Runtime Function: unsigned long long fract __fractqiudq (signed
char A)
-- Runtime Function: unsigned short accum __fractqiuha (signed char A)
-- Runtime Function: unsigned accum __fractqiusa (signed char A)
-- Runtime Function: unsigned long accum __fractqiuda (signed char A)
-- Runtime Function: unsigned long long accum __fractqiuta (signed
char A)
-- Runtime Function: short fract __fracthiqq (short A)
-- Runtime Function: fract __fracthihq (short A)
-- Runtime Function: long fract __fracthisq (short A)
-- Runtime Function: long long fract __fracthidq (short A)
-- Runtime Function: short accum __fracthiha (short A)
-- Runtime Function: accum __fracthisa (short A)
-- Runtime Function: long accum __fracthida (short A)
-- Runtime Function: long long accum __fracthita (short A)
-- Runtime Function: unsigned short fract __fracthiuqq (short A)
-- Runtime Function: unsigned fract __fracthiuhq (short A)
-- Runtime Function: unsigned long fract __fracthiusq (short A)
-- Runtime Function: unsigned long long fract __fracthiudq (short A)
-- Runtime Function: unsigned short accum __fracthiuha (short A)
-- Runtime Function: unsigned accum __fracthiusa (short A)
-- Runtime Function: unsigned long accum __fracthiuda (short A)
-- Runtime Function: unsigned long long accum __fracthiuta (short A)
-- Runtime Function: short fract __fractsiqq (int A)
-- Runtime Function: fract __fractsihq (int A)
-- Runtime Function: long fract __fractsisq (int A)
-- Runtime Function: long long fract __fractsidq (int A)
-- Runtime Function: short accum __fractsiha (int A)
-- Runtime Function: accum __fractsisa (int A)
-- Runtime Function: long accum __fractsida (int A)
-- Runtime Function: long long accum __fractsita (int A)
-- Runtime Function: unsigned short fract __fractsiuqq (int A)
-- Runtime Function: unsigned fract __fractsiuhq (int A)
-- Runtime Function: unsigned long fract __fractsiusq (int A)
-- Runtime Function: unsigned long long fract __fractsiudq (int A)
-- Runtime Function: unsigned short accum __fractsiuha (int A)
-- Runtime Function: unsigned accum __fractsiusa (int A)
-- Runtime Function: unsigned long accum __fractsiuda (int A)
-- Runtime Function: unsigned long long accum __fractsiuta (int A)
-- Runtime Function: short fract __fractdiqq (long A)
-- Runtime Function: fract __fractdihq (long A)
-- Runtime Function: long fract __fractdisq (long A)
-- Runtime Function: long long fract __fractdidq (long A)
-- Runtime Function: short accum __fractdiha (long A)
-- Runtime Function: accum __fractdisa (long A)
-- Runtime Function: long accum __fractdida (long A)
-- Runtime Function: long long accum __fractdita (long A)
-- Runtime Function: unsigned short fract __fractdiuqq (long A)
-- Runtime Function: unsigned fract __fractdiuhq (long A)
-- Runtime Function: unsigned long fract __fractdiusq (long A)
-- Runtime Function: unsigned long long fract __fractdiudq (long A)
-- Runtime Function: unsigned short accum __fractdiuha (long A)
-- Runtime Function: unsigned accum __fractdiusa (long A)
-- Runtime Function: unsigned long accum __fractdiuda (long A)
-- Runtime Function: unsigned long long accum __fractdiuta (long A)
-- Runtime Function: short fract __fracttiqq (long long A)
-- Runtime Function: fract __fracttihq (long long A)
-- Runtime Function: long fract __fracttisq (long long A)
-- Runtime Function: long long fract __fracttidq (long long A)
-- Runtime Function: short accum __fracttiha (long long A)
-- Runtime Function: accum __fracttisa (long long A)
-- Runtime Function: long accum __fracttida (long long A)
-- Runtime Function: long long accum __fracttita (long long A)
-- Runtime Function: unsigned short fract __fracttiuqq (long long A)
-- Runtime Function: unsigned fract __fracttiuhq (long long A)
-- Runtime Function: unsigned long fract __fracttiusq (long long A)
-- Runtime Function: unsigned long long fract __fracttiudq (long long
A)
-- Runtime Function: unsigned short accum __fracttiuha (long long A)
-- Runtime Function: unsigned accum __fracttiusa (long long A)
-- Runtime Function: unsigned long accum __fracttiuda (long long A)
-- Runtime Function: unsigned long long accum __fracttiuta (long long
A)
-- Runtime Function: short fract __fractsfqq (float A)
-- Runtime Function: fract __fractsfhq (float A)
-- Runtime Function: long fract __fractsfsq (float A)
-- Runtime Function: long long fract __fractsfdq (float A)
-- Runtime Function: short accum __fractsfha (float A)
-- Runtime Function: accum __fractsfsa (float A)
-- Runtime Function: long accum __fractsfda (float A)
-- Runtime Function: long long accum __fractsfta (float A)
-- Runtime Function: unsigned short fract __fractsfuqq (float A)
-- Runtime Function: unsigned fract __fractsfuhq (float A)
-- Runtime Function: unsigned long fract __fractsfusq (float A)
-- Runtime Function: unsigned long long fract __fractsfudq (float A)
-- Runtime Function: unsigned short accum __fractsfuha (float A)
-- Runtime Function: unsigned accum __fractsfusa (float A)
-- Runtime Function: unsigned long accum __fractsfuda (float A)
-- Runtime Function: unsigned long long accum __fractsfuta (float A)
-- Runtime Function: short fract __fractdfqq (double A)
-- Runtime Function: fract __fractdfhq (double A)
-- Runtime Function: long fract __fractdfsq (double A)
-- Runtime Function: long long fract __fractdfdq (double A)
-- Runtime Function: short accum __fractdfha (double A)
-- Runtime Function: accum __fractdfsa (double A)
-- Runtime Function: long accum __fractdfda (double A)
-- Runtime Function: long long accum __fractdfta (double A)
-- Runtime Function: unsigned short fract __fractdfuqq (double A)
-- Runtime Function: unsigned fract __fractdfuhq (double A)
-- Runtime Function: unsigned long fract __fractdfusq (double A)
-- Runtime Function: unsigned long long fract __fractdfudq (double A)
-- Runtime Function: unsigned short accum __fractdfuha (double A)
-- Runtime Function: unsigned accum __fractdfusa (double A)
-- Runtime Function: unsigned long accum __fractdfuda (double A)
-- Runtime Function: unsigned long long accum __fractdfuta (double A)
These functions convert from fractional and signed non-fractionals
to fractionals and signed non-fractionals, without saturation.
-- Runtime Function: fract __satfractqqhq2 (short fract A)
-- Runtime Function: long fract __satfractqqsq2 (short fract A)
-- Runtime Function: long long fract __satfractqqdq2 (short fract A)
-- Runtime Function: short accum __satfractqqha (short fract A)
-- Runtime Function: accum __satfractqqsa (short fract A)
-- Runtime Function: long accum __satfractqqda (short fract A)
-- Runtime Function: long long accum __satfractqqta (short fract A)
-- Runtime Function: unsigned short fract __satfractqquqq (short fract
A)
-- Runtime Function: unsigned fract __satfractqquhq (short fract A)
-- Runtime Function: unsigned long fract __satfractqqusq (short fract
A)
-- Runtime Function: unsigned long long fract __satfractqqudq (short
fract A)
-- Runtime Function: unsigned short accum __satfractqquha (short fract
A)
-- Runtime Function: unsigned accum __satfractqqusa (short fract A)
-- Runtime Function: unsigned long accum __satfractqquda (short fract
A)
-- Runtime Function: unsigned long long accum __satfractqquta (short
fract A)
-- Runtime Function: short fract __satfracthqqq2 (fract A)
-- Runtime Function: long fract __satfracthqsq2 (fract A)
-- Runtime Function: long long fract __satfracthqdq2 (fract A)
-- Runtime Function: short accum __satfracthqha (fract A)
-- Runtime Function: accum __satfracthqsa (fract A)
-- Runtime Function: long accum __satfracthqda (fract A)
-- Runtime Function: long long accum __satfracthqta (fract A)
-- Runtime Function: unsigned short fract __satfracthquqq (fract A)
-- Runtime Function: unsigned fract __satfracthquhq (fract A)
-- Runtime Function: unsigned long fract __satfracthqusq (fract A)
-- Runtime Function: unsigned long long fract __satfracthqudq (fract A)
-- Runtime Function: unsigned short accum __satfracthquha (fract A)
-- Runtime Function: unsigned accum __satfracthqusa (fract A)
-- Runtime Function: unsigned long accum __satfracthquda (fract A)
-- Runtime Function: unsigned long long accum __satfracthquta (fract A)
-- Runtime Function: short fract __satfractsqqq2 (long fract A)
-- Runtime Function: fract __satfractsqhq2 (long fract A)
-- Runtime Function: long long fract __satfractsqdq2 (long fract A)
-- Runtime Function: short accum __satfractsqha (long fract A)
-- Runtime Function: accum __satfractsqsa (long fract A)
-- Runtime Function: long accum __satfractsqda (long fract A)
-- Runtime Function: long long accum __satfractsqta (long fract A)
-- Runtime Function: unsigned short fract __satfractsquqq (long fract
A)
-- Runtime Function: unsigned fract __satfractsquhq (long fract A)
-- Runtime Function: unsigned long fract __satfractsqusq (long fract A)
-- Runtime Function: unsigned long long fract __satfractsqudq (long
fract A)
-- Runtime Function: unsigned short accum __satfractsquha (long fract
A)
-- Runtime Function: unsigned accum __satfractsqusa (long fract A)
-- Runtime Function: unsigned long accum __satfractsquda (long fract A)
-- Runtime Function: unsigned long long accum __satfractsquta (long
fract A)
-- Runtime Function: short fract __satfractdqqq2 (long long fract A)
-- Runtime Function: fract __satfractdqhq2 (long long fract A)
-- Runtime Function: long fract __satfractdqsq2 (long long fract A)
-- Runtime Function: short accum __satfractdqha (long long fract A)
-- Runtime Function: accum __satfractdqsa (long long fract A)
-- Runtime Function: long accum __satfractdqda (long long fract A)
-- Runtime Function: long long accum __satfractdqta (long long fract A)
-- Runtime Function: unsigned short fract __satfractdquqq (long long
fract A)
-- Runtime Function: unsigned fract __satfractdquhq (long long fract A)
-- Runtime Function: unsigned long fract __satfractdqusq (long long
fract A)
-- Runtime Function: unsigned long long fract __satfractdqudq (long
long fract A)
-- Runtime Function: unsigned short accum __satfractdquha (long long
fract A)
-- Runtime Function: unsigned accum __satfractdqusa (long long fract A)
-- Runtime Function: unsigned long accum __satfractdquda (long long
fract A)
-- Runtime Function: unsigned long long accum __satfractdquta (long
long fract A)
-- Runtime Function: short fract __satfracthaqq (short accum A)
-- Runtime Function: fract __satfracthahq (short accum A)
-- Runtime Function: long fract __satfracthasq (short accum A)
-- Runtime Function: long long fract __satfracthadq (short accum A)
-- Runtime Function: accum __satfracthasa2 (short accum A)
-- Runtime Function: long accum __satfracthada2 (short accum A)
-- Runtime Function: long long accum __satfracthata2 (short accum A)
-- Runtime Function: unsigned short fract __satfracthauqq (short accum
A)
-- Runtime Function: unsigned fract __satfracthauhq (short accum A)
-- Runtime Function: unsigned long fract __satfracthausq (short accum
A)
-- Runtime Function: unsigned long long fract __satfracthaudq (short
accum A)
-- Runtime Function: unsigned short accum __satfracthauha (short accum
A)
-- Runtime Function: unsigned accum __satfracthausa (short accum A)
-- Runtime Function: unsigned long accum __satfracthauda (short accum
A)
-- Runtime Function: unsigned long long accum __satfracthauta (short
accum A)
-- Runtime Function: short fract __satfractsaqq (accum A)
-- Runtime Function: fract __satfractsahq (accum A)
-- Runtime Function: long fract __satfractsasq (accum A)
-- Runtime Function: long long fract __satfractsadq (accum A)
-- Runtime Function: short accum __satfractsaha2 (accum A)
-- Runtime Function: long accum __satfractsada2 (accum A)
-- Runtime Function: long long accum __satfractsata2 (accum A)
-- Runtime Function: unsigned short fract __satfractsauqq (accum A)
-- Runtime Function: unsigned fract __satfractsauhq (accum A)
-- Runtime Function: unsigned long fract __satfractsausq (accum A)
-- Runtime Function: unsigned long long fract __satfractsaudq (accum A)
-- Runtime Function: unsigned short accum __satfractsauha (accum A)
-- Runtime Function: unsigned accum __satfractsausa (accum A)
-- Runtime Function: unsigned long accum __satfractsauda (accum A)
-- Runtime Function: unsigned long long accum __satfractsauta (accum A)
-- Runtime Function: short fract __satfractdaqq (long accum A)
-- Runtime Function: fract __satfractdahq (long accum A)
-- Runtime Function: long fract __satfractdasq (long accum A)
-- Runtime Function: long long fract __satfractdadq (long accum A)
-- Runtime Function: short accum __satfractdaha2 (long accum A)
-- Runtime Function: accum __satfractdasa2 (long accum A)
-- Runtime Function: long long accum __satfractdata2 (long accum A)
-- Runtime Function: unsigned short fract __satfractdauqq (long accum
A)
-- Runtime Function: unsigned fract __satfractdauhq (long accum A)
-- Runtime Function: unsigned long fract __satfractdausq (long accum A)
-- Runtime Function: unsigned long long fract __satfractdaudq (long
accum A)
-- Runtime Function: unsigned short accum __satfractdauha (long accum
A)
-- Runtime Function: unsigned accum __satfractdausa (long accum A)
-- Runtime Function: unsigned long accum __satfractdauda (long accum A)
-- Runtime Function: unsigned long long accum __satfractdauta (long
accum A)
-- Runtime Function: short fract __satfracttaqq (long long accum A)
-- Runtime Function: fract __satfracttahq (long long accum A)
-- Runtime Function: long fract __satfracttasq (long long accum A)
-- Runtime Function: long long fract __satfracttadq (long long accum A)
-- Runtime Function: short accum __satfracttaha2 (long long accum A)
-- Runtime Function: accum __satfracttasa2 (long long accum A)
-- Runtime Function: long accum __satfracttada2 (long long accum A)
-- Runtime Function: unsigned short fract __satfracttauqq (long long
accum A)
-- Runtime Function: unsigned fract __satfracttauhq (long long accum A)
-- Runtime Function: unsigned long fract __satfracttausq (long long
accum A)
-- Runtime Function: unsigned long long fract __satfracttaudq (long
long accum A)
-- Runtime Function: unsigned short accum __satfracttauha (long long
accum A)
-- Runtime Function: unsigned accum __satfracttausa (long long accum A)
-- Runtime Function: unsigned long accum __satfracttauda (long long
accum A)
-- Runtime Function: unsigned long long accum __satfracttauta (long
long accum A)
-- Runtime Function: short fract __satfractuqqqq (unsigned short fract
A)
-- Runtime Function: fract __satfractuqqhq (unsigned short fract A)
-- Runtime Function: long fract __satfractuqqsq (unsigned short fract
A)
-- Runtime Function: long long fract __satfractuqqdq (unsigned short
fract A)
-- Runtime Function: short accum __satfractuqqha (unsigned short fract
A)
-- Runtime Function: accum __satfractuqqsa (unsigned short fract A)
-- Runtime Function: long accum __satfractuqqda (unsigned short fract
A)
-- Runtime Function: long long accum __satfractuqqta (unsigned short
fract A)
-- Runtime Function: unsigned fract __satfractuqquhq2 (unsigned short
fract A)
-- Runtime Function: unsigned long fract __satfractuqqusq2 (unsigned
short fract A)
-- Runtime Function: unsigned long long fract __satfractuqqudq2
(unsigned short fract A)
-- Runtime Function: unsigned short accum __satfractuqquha (unsigned
short fract A)
-- Runtime Function: unsigned accum __satfractuqqusa (unsigned short
fract A)
-- Runtime Function: unsigned long accum __satfractuqquda (unsigned
short fract A)
-- Runtime Function: unsigned long long accum __satfractuqquta
(unsigned short fract A)
-- Runtime Function: short fract __satfractuhqqq (unsigned fract A)
-- Runtime Function: fract __satfractuhqhq (unsigned fract A)
-- Runtime Function: long fract __satfractuhqsq (unsigned fract A)
-- Runtime Function: long long fract __satfractuhqdq (unsigned fract A)
-- Runtime Function: short accum __satfractuhqha (unsigned fract A)
-- Runtime Function: accum __satfractuhqsa (unsigned fract A)
-- Runtime Function: long accum __satfractuhqda (unsigned fract A)
-- Runtime Function: long long accum __satfractuhqta (unsigned fract A)
-- Runtime Function: unsigned short fract __satfractuhquqq2 (unsigned
fract A)
-- Runtime Function: unsigned long fract __satfractuhqusq2 (unsigned
fract A)
-- Runtime Function: unsigned long long fract __satfractuhqudq2
(unsigned fract A)
-- Runtime Function: unsigned short accum __satfractuhquha (unsigned
fract A)
-- Runtime Function: unsigned accum __satfractuhqusa (unsigned fract A)
-- Runtime Function: unsigned long accum __satfractuhquda (unsigned
fract A)
-- Runtime Function: unsigned long long accum __satfractuhquta
(unsigned fract A)
-- Runtime Function: short fract __satfractusqqq (unsigned long fract
A)
-- Runtime Function: fract __satfractusqhq (unsigned long fract A)
-- Runtime Function: long fract __satfractusqsq (unsigned long fract A)
-- Runtime Function: long long fract __satfractusqdq (unsigned long
fract A)
-- Runtime Function: short accum __satfractusqha (unsigned long fract
A)
-- Runtime Function: accum __satfractusqsa (unsigned long fract A)
-- Runtime Function: long accum __satfractusqda (unsigned long fract A)
-- Runtime Function: long long accum __satfractusqta (unsigned long
fract A)
-- Runtime Function: unsigned short fract __satfractusquqq2 (unsigned
long fract A)
-- Runtime Function: unsigned fract __satfractusquhq2 (unsigned long
fract A)
-- Runtime Function: unsigned long long fract __satfractusqudq2
(unsigned long fract A)
-- Runtime Function: unsigned short accum __satfractusquha (unsigned
long fract A)
-- Runtime Function: unsigned accum __satfractusqusa (unsigned long
fract A)
-- Runtime Function: unsigned long accum __satfractusquda (unsigned
long fract A)
-- Runtime Function: unsigned long long accum __satfractusquta
(unsigned long fract A)
-- Runtime Function: short fract __satfractudqqq (unsigned long long
fract A)
-- Runtime Function: fract __satfractudqhq (unsigned long long fract A)
-- Runtime Function: long fract __satfractudqsq (unsigned long long
fract A)
-- Runtime Function: long long fract __satfractudqdq (unsigned long
long fract A)
-- Runtime Function: short accum __satfractudqha (unsigned long long
fract A)
-- Runtime Function: accum __satfractudqsa (unsigned long long fract A)
-- Runtime Function: long accum __satfractudqda (unsigned long long
fract A)
-- Runtime Function: long long accum __satfractudqta (unsigned long
long fract A)
-- Runtime Function: unsigned short fract __satfractudquqq2 (unsigned
long long fract A)
-- Runtime Function: unsigned fract __satfractudquhq2 (unsigned long
long fract A)
-- Runtime Function: unsigned long fract __satfractudqusq2 (unsigned
long long fract A)
-- Runtime Function: unsigned short accum __satfractudquha (unsigned
long long fract A)
-- Runtime Function: unsigned accum __satfractudqusa (unsigned long
long fract A)
-- Runtime Function: unsigned long accum __satfractudquda (unsigned
long long fract A)
-- Runtime Function: unsigned long long accum __satfractudquta
(unsigned long long fract A)
-- Runtime Function: short fract __satfractuhaqq (unsigned short accum
A)
-- Runtime Function: fract __satfractuhahq (unsigned short accum A)
-- Runtime Function: long fract __satfractuhasq (unsigned short accum
A)
-- Runtime Function: long long fract __satfractuhadq (unsigned short
accum A)
-- Runtime Function: short accum __satfractuhaha (unsigned short accum
A)
-- Runtime Function: accum __satfractuhasa (unsigned short accum A)
-- Runtime Function: long accum __satfractuhada (unsigned short accum
A)
-- Runtime Function: long long accum __satfractuhata (unsigned short
accum A)
-- Runtime Function: unsigned short fract __satfractuhauqq (unsigned
short accum A)
-- Runtime Function: unsigned fract __satfractuhauhq (unsigned short
accum A)
-- Runtime Function: unsigned long fract __satfractuhausq (unsigned
short accum A)
-- Runtime Function: unsigned long long fract __satfractuhaudq
(unsigned short accum A)
-- Runtime Function: unsigned accum __satfractuhausa2 (unsigned short
accum A)
-- Runtime Function: unsigned long accum __satfractuhauda2 (unsigned
short accum A)
-- Runtime Function: unsigned long long accum __satfractuhauta2
(unsigned short accum A)
-- Runtime Function: short fract __satfractusaqq (unsigned accum A)
-- Runtime Function: fract __satfractusahq (unsigned accum A)
-- Runtime Function: long fract __satfractusasq (unsigned accum A)
-- Runtime Function: long long fract __satfractusadq (unsigned accum A)
-- Runtime Function: short accum __satfractusaha (unsigned accum A)
-- Runtime Function: accum __satfractusasa (unsigned accum A)
-- Runtime Function: long accum __satfractusada (unsigned accum A)
-- Runtime Function: long long accum __satfractusata (unsigned accum A)
-- Runtime Function: unsigned short fract __satfractusauqq (unsigned
accum A)
-- Runtime Function: unsigned fract __satfractusauhq (unsigned accum A)
-- Runtime Function: unsigned long fract __satfractusausq (unsigned
accum A)
-- Runtime Function: unsigned long long fract __satfractusaudq
(unsigned accum A)
-- Runtime Function: unsigned short accum __satfractusauha2 (unsigned
accum A)
-- Runtime Function: unsigned long accum __satfractusauda2 (unsigned
accum A)
-- Runtime Function: unsigned long long accum __satfractusauta2
(unsigned accum A)
-- Runtime Function: short fract __satfractudaqq (unsigned long accum
A)
-- Runtime Function: fract __satfractudahq (unsigned long accum A)
-- Runtime Function: long fract __satfractudasq (unsigned long accum A)
-- Runtime Function: long long fract __satfractudadq (unsigned long
accum A)
-- Runtime Function: short accum __satfractudaha (unsigned long accum
A)
-- Runtime Function: accum __satfractudasa (unsigned long accum A)
-- Runtime Function: long accum __satfractudada (unsigned long accum A)
-- Runtime Function: long long accum __satfractudata (unsigned long
accum A)
-- Runtime Function: unsigned short fract __satfractudauqq (unsigned
long accum A)
-- Runtime Function: unsigned fract __satfractudauhq (unsigned long
accum A)
-- Runtime Function: unsigned long fract __satfractudausq (unsigned
long accum A)
-- Runtime Function: unsigned long long fract __satfractudaudq
(unsigned long accum A)
-- Runtime Function: unsigned short accum __satfractudauha2 (unsigned
long accum A)
-- Runtime Function: unsigned accum __satfractudausa2 (unsigned long
accum A)
-- Runtime Function: unsigned long long accum __satfractudauta2
(unsigned long accum A)
-- Runtime Function: short fract __satfractutaqq (unsigned long long
accum A)
-- Runtime Function: fract __satfractutahq (unsigned long long accum A)
-- Runtime Function: long fract __satfractutasq (unsigned long long
accum A)
-- Runtime Function: long long fract __satfractutadq (unsigned long
long accum A)
-- Runtime Function: short accum __satfractutaha (unsigned long long
accum A)
-- Runtime Function: accum __satfractutasa (unsigned long long accum A)
-- Runtime Function: long accum __satfractutada (unsigned long long
accum A)
-- Runtime Function: long long accum __satfractutata (unsigned long
long accum A)
-- Runtime Function: unsigned short fract __satfractutauqq (unsigned
long long accum A)
-- Runtime Function: unsigned fract __satfractutauhq (unsigned long
long accum A)
-- Runtime Function: unsigned long fract __satfractutausq (unsigned
long long accum A)
-- Runtime Function: unsigned long long fract __satfractutaudq
(unsigned long long accum A)
-- Runtime Function: unsigned short accum __satfractutauha2 (unsigned
long long accum A)
-- Runtime Function: unsigned accum __satfractutausa2 (unsigned long
long accum A)
-- Runtime Function: unsigned long accum __satfractutauda2 (unsigned
long long accum A)
-- Runtime Function: short fract __satfractqiqq (signed char A)
-- Runtime Function: fract __satfractqihq (signed char A)
-- Runtime Function: long fract __satfractqisq (signed char A)
-- Runtime Function: long long fract __satfractqidq (signed char A)
-- Runtime Function: short accum __satfractqiha (signed char A)
-- Runtime Function: accum __satfractqisa (signed char A)
-- Runtime Function: long accum __satfractqida (signed char A)
-- Runtime Function: long long accum __satfractqita (signed char A)
-- Runtime Function: unsigned short fract __satfractqiuqq (signed char
A)
-- Runtime Function: unsigned fract __satfractqiuhq (signed char A)
-- Runtime Function: unsigned long fract __satfractqiusq (signed char
A)
-- Runtime Function: unsigned long long fract __satfractqiudq (signed
char A)
-- Runtime Function: unsigned short accum __satfractqiuha (signed char
A)
-- Runtime Function: unsigned accum __satfractqiusa (signed char A)
-- Runtime Function: unsigned long accum __satfractqiuda (signed char
A)
-- Runtime Function: unsigned long long accum __satfractqiuta (signed
char A)
-- Runtime Function: short fract __satfracthiqq (short A)
-- Runtime Function: fract __satfracthihq (short A)
-- Runtime Function: long fract __satfracthisq (short A)
-- Runtime Function: long long fract __satfracthidq (short A)
-- Runtime Function: short accum __satfracthiha (short A)
-- Runtime Function: accum __satfracthisa (short A)
-- Runtime Function: long accum __satfracthida (short A)
-- Runtime Function: long long accum __satfracthita (short A)
-- Runtime Function: unsigned short fract __satfracthiuqq (short A)
-- Runtime Function: unsigned fract __satfracthiuhq (short A)
-- Runtime Function: unsigned long fract __satfracthiusq (short A)
-- Runtime Function: unsigned long long fract __satfracthiudq (short A)
-- Runtime Function: unsigned short accum __satfracthiuha (short A)
-- Runtime Function: unsigned accum __satfracthiusa (short A)
-- Runtime Function: unsigned long accum __satfracthiuda (short A)
-- Runtime Function: unsigned long long accum __satfracthiuta (short A)
-- Runtime Function: short fract __satfractsiqq (int A)
-- Runtime Function: fract __satfractsihq (int A)
-- Runtime Function: long fract __satfractsisq (int A)
-- Runtime Function: long long fract __satfractsidq (int A)
-- Runtime Function: short accum __satfractsiha (int A)
-- Runtime Function: accum __satfractsisa (int A)
-- Runtime Function: long accum __satfractsida (int A)
-- Runtime Function: long long accum __satfractsita (int A)
-- Runtime Function: unsigned short fract __satfractsiuqq (int A)
-- Runtime Function: unsigned fract __satfractsiuhq (int A)
-- Runtime Function: unsigned long fract __satfractsiusq (int A)
-- Runtime Function: unsigned long long fract __satfractsiudq (int A)
-- Runtime Function: unsigned short accum __satfractsiuha (int A)
-- Runtime Function: unsigned accum __satfractsiusa (int A)
-- Runtime Function: unsigned long accum __satfractsiuda (int A)
-- Runtime Function: unsigned long long accum __satfractsiuta (int A)
-- Runtime Function: short fract __satfractdiqq (long A)
-- Runtime Function: fract __satfractdihq (long A)
-- Runtime Function: long fract __satfractdisq (long A)
-- Runtime Function: long long fract __satfractdidq (long A)
-- Runtime Function: short accum __satfractdiha (long A)
-- Runtime Function: accum __satfractdisa (long A)
-- Runtime Function: long accum __satfractdida (long A)
-- Runtime Function: long long accum __satfractdita (long A)
-- Runtime Function: unsigned short fract __satfractdiuqq (long A)
-- Runtime Function: unsigned fract __satfractdiuhq (long A)
-- Runtime Function: unsigned long fract __satfractdiusq (long A)
-- Runtime Function: unsigned long long fract __satfractdiudq (long A)
-- Runtime Function: unsigned short accum __satfractdiuha (long A)
-- Runtime Function: unsigned accum __satfractdiusa (long A)
-- Runtime Function: unsigned long accum __satfractdiuda (long A)
-- Runtime Function: unsigned long long accum __satfractdiuta (long A)
-- Runtime Function: short fract __satfracttiqq (long long A)
-- Runtime Function: fract __satfracttihq (long long A)
-- Runtime Function: long fract __satfracttisq (long long A)
-- Runtime Function: long long fract __satfracttidq (long long A)
-- Runtime Function: short accum __satfracttiha (long long A)
-- Runtime Function: accum __satfracttisa (long long A)
-- Runtime Function: long accum __satfracttida (long long A)
-- Runtime Function: long long accum __satfracttita (long long A)
-- Runtime Function: unsigned short fract __satfracttiuqq (long long A)
-- Runtime Function: unsigned fract __satfracttiuhq (long long A)
-- Runtime Function: unsigned long fract __satfracttiusq (long long A)
-- Runtime Function: unsigned long long fract __satfracttiudq (long
long A)
-- Runtime Function: unsigned short accum __satfracttiuha (long long A)
-- Runtime Function: unsigned accum __satfracttiusa (long long A)
-- Runtime Function: unsigned long accum __satfracttiuda (long long A)
-- Runtime Function: unsigned long long accum __satfracttiuta (long
long A)
-- Runtime Function: short fract __satfractsfqq (float A)
-- Runtime Function: fract __satfractsfhq (float A)
-- Runtime Function: long fract __satfractsfsq (float A)
-- Runtime Function: long long fract __satfractsfdq (float A)
-- Runtime Function: short accum __satfractsfha (float A)
-- Runtime Function: accum __satfractsfsa (float A)
-- Runtime Function: long accum __satfractsfda (float A)
-- Runtime Function: long long accum __satfractsfta (float A)
-- Runtime Function: unsigned short fract __satfractsfuqq (float A)
-- Runtime Function: unsigned fract __satfractsfuhq (float A)
-- Runtime Function: unsigned long fract __satfractsfusq (float A)
-- Runtime Function: unsigned long long fract __satfractsfudq (float A)
-- Runtime Function: unsigned short accum __satfractsfuha (float A)
-- Runtime Function: unsigned accum __satfractsfusa (float A)
-- Runtime Function: unsigned long accum __satfractsfuda (float A)
-- Runtime Function: unsigned long long accum __satfractsfuta (float A)
-- Runtime Function: short fract __satfractdfqq (double A)
-- Runtime Function: fract __satfractdfhq (double A)
-- Runtime Function: long fract __satfractdfsq (double A)
-- Runtime Function: long long fract __satfractdfdq (double A)
-- Runtime Function: short accum __satfractdfha (double A)
-- Runtime Function: accum __satfractdfsa (double A)
-- Runtime Function: long accum __satfractdfda (double A)
-- Runtime Function: long long accum __satfractdfta (double A)
-- Runtime Function: unsigned short fract __satfractdfuqq (double A)
-- Runtime Function: unsigned fract __satfractdfuhq (double A)
-- Runtime Function: unsigned long fract __satfractdfusq (double A)
-- Runtime Function: unsigned long long fract __satfractdfudq (double
A)
-- Runtime Function: unsigned short accum __satfractdfuha (double A)
-- Runtime Function: unsigned accum __satfractdfusa (double A)
-- Runtime Function: unsigned long accum __satfractdfuda (double A)
-- Runtime Function: unsigned long long accum __satfractdfuta (double
A)
The functions convert from fractional and signed non-fractionals to
fractionals, with saturation.
-- Runtime Function: unsigned char __fractunsqqqi (short fract A)
-- Runtime Function: unsigned short __fractunsqqhi (short fract A)
-- Runtime Function: unsigned int __fractunsqqsi (short fract A)
-- Runtime Function: unsigned long __fractunsqqdi (short fract A)
-- Runtime Function: unsigned long long __fractunsqqti (short fract A)
-- Runtime Function: unsigned char __fractunshqqi (fract A)
-- Runtime Function: unsigned short __fractunshqhi (fract A)
-- Runtime Function: unsigned int __fractunshqsi (fract A)
-- Runtime Function: unsigned long __fractunshqdi (fract A)
-- Runtime Function: unsigned long long __fractunshqti (fract A)
-- Runtime Function: unsigned char __fractunssqqi (long fract A)
-- Runtime Function: unsigned short __fractunssqhi (long fract A)
-- Runtime Function: unsigned int __fractunssqsi (long fract A)
-- Runtime Function: unsigned long __fractunssqdi (long fract A)
-- Runtime Function: unsigned long long __fractunssqti (long fract A)
-- Runtime Function: unsigned char __fractunsdqqi (long long fract A)
-- Runtime Function: unsigned short __fractunsdqhi (long long fract A)
-- Runtime Function: unsigned int __fractunsdqsi (long long fract A)
-- Runtime Function: unsigned long __fractunsdqdi (long long fract A)
-- Runtime Function: unsigned long long __fractunsdqti (long long
fract A)
-- Runtime Function: unsigned char __fractunshaqi (short accum A)
-- Runtime Function: unsigned short __fractunshahi (short accum A)
-- Runtime Function: unsigned int __fractunshasi (short accum A)
-- Runtime Function: unsigned long __fractunshadi (short accum A)
-- Runtime Function: unsigned long long __fractunshati (short accum A)
-- Runtime Function: unsigned char __fractunssaqi (accum A)
-- Runtime Function: unsigned short __fractunssahi (accum A)
-- Runtime Function: unsigned int __fractunssasi (accum A)
-- Runtime Function: unsigned long __fractunssadi (accum A)
-- Runtime Function: unsigned long long __fractunssati (accum A)
-- Runtime Function: unsigned char __fractunsdaqi (long accum A)
-- Runtime Function: unsigned short __fractunsdahi (long accum A)
-- Runtime Function: unsigned int __fractunsdasi (long accum A)
-- Runtime Function: unsigned long __fractunsdadi (long accum A)
-- Runtime Function: unsigned long long __fractunsdati (long accum A)
-- Runtime Function: unsigned char __fractunstaqi (long long accum A)
-- Runtime Function: unsigned short __fractunstahi (long long accum A)
-- Runtime Function: unsigned int __fractunstasi (long long accum A)
-- Runtime Function: unsigned long __fractunstadi (long long accum A)
-- Runtime Function: unsigned long long __fractunstati (long long
accum A)
-- Runtime Function: unsigned char __fractunsuqqqi (unsigned short
fract A)
-- Runtime Function: unsigned short __fractunsuqqhi (unsigned short
fract A)
-- Runtime Function: unsigned int __fractunsuqqsi (unsigned short
fract A)
-- Runtime Function: unsigned long __fractunsuqqdi (unsigned short
fract A)
-- Runtime Function: unsigned long long __fractunsuqqti (unsigned
short fract A)
-- Runtime Function: unsigned char __fractunsuhqqi (unsigned fract A)
-- Runtime Function: unsigned short __fractunsuhqhi (unsigned fract A)
-- Runtime Function: unsigned int __fractunsuhqsi (unsigned fract A)
-- Runtime Function: unsigned long __fractunsuhqdi (unsigned fract A)
-- Runtime Function: unsigned long long __fractunsuhqti (unsigned
fract A)
-- Runtime Function: unsigned char __fractunsusqqi (unsigned long
fract A)
-- Runtime Function: unsigned short __fractunsusqhi (unsigned long
fract A)
-- Runtime Function: unsigned int __fractunsusqsi (unsigned long fract
A)
-- Runtime Function: unsigned long __fractunsusqdi (unsigned long
fract A)
-- Runtime Function: unsigned long long __fractunsusqti (unsigned long
fract A)
-- Runtime Function: unsigned char __fractunsudqqi (unsigned long long
fract A)
-- Runtime Function: unsigned short __fractunsudqhi (unsigned long
long fract A)
-- Runtime Function: unsigned int __fractunsudqsi (unsigned long long
fract A)
-- Runtime Function: unsigned long __fractunsudqdi (unsigned long long
fract A)
-- Runtime Function: unsigned long long __fractunsudqti (unsigned long
long fract A)
-- Runtime Function: unsigned char __fractunsuhaqi (unsigned short
accum A)
-- Runtime Function: unsigned short __fractunsuhahi (unsigned short
accum A)
-- Runtime Function: unsigned int __fractunsuhasi (unsigned short
accum A)
-- Runtime Function: unsigned long __fractunsuhadi (unsigned short
accum A)
-- Runtime Function: unsigned long long __fractunsuhati (unsigned
short accum A)
-- Runtime Function: unsigned char __fractunsusaqi (unsigned accum A)
-- Runtime Function: unsigned short __fractunsusahi (unsigned accum A)
-- Runtime Function: unsigned int __fractunsusasi (unsigned accum A)
-- Runtime Function: unsigned long __fractunsusadi (unsigned accum A)
-- Runtime Function: unsigned long long __fractunsusati (unsigned
accum A)
-- Runtime Function: unsigned char __fractunsudaqi (unsigned long
accum A)
-- Runtime Function: unsigned short __fractunsudahi (unsigned long
accum A)
-- Runtime Function: unsigned int __fractunsudasi (unsigned long accum
A)
-- Runtime Function: unsigned long __fractunsudadi (unsigned long
accum A)
-- Runtime Function: unsigned long long __fractunsudati (unsigned long
accum A)
-- Runtime Function: unsigned char __fractunsutaqi (unsigned long long
accum A)
-- Runtime Function: unsigned short __fractunsutahi (unsigned long
long accum A)
-- Runtime Function: unsigned int __fractunsutasi (unsigned long long
accum A)
-- Runtime Function: unsigned long __fractunsutadi (unsigned long long
accum A)
-- Runtime Function: unsigned long long __fractunsutati (unsigned long
long accum A)
-- Runtime Function: short fract __fractunsqiqq (unsigned char A)
-- Runtime Function: fract __fractunsqihq (unsigned char A)
-- Runtime Function: long fract __fractunsqisq (unsigned char A)
-- Runtime Function: long long fract __fractunsqidq (unsigned char A)
-- Runtime Function: short accum __fractunsqiha (unsigned char A)
-- Runtime Function: accum __fractunsqisa (unsigned char A)
-- Runtime Function: long accum __fractunsqida (unsigned char A)
-- Runtime Function: long long accum __fractunsqita (unsigned char A)
-- Runtime Function: unsigned short fract __fractunsqiuqq (unsigned
char A)
-- Runtime Function: unsigned fract __fractunsqiuhq (unsigned char A)
-- Runtime Function: unsigned long fract __fractunsqiusq (unsigned
char A)
-- Runtime Function: unsigned long long fract __fractunsqiudq
(unsigned char A)
-- Runtime Function: unsigned short accum __fractunsqiuha (unsigned
char A)
-- Runtime Function: unsigned accum __fractunsqiusa (unsigned char A)
-- Runtime Function: unsigned long accum __fractunsqiuda (unsigned
char A)
-- Runtime Function: unsigned long long accum __fractunsqiuta
(unsigned char A)
-- Runtime Function: short fract __fractunshiqq (unsigned short A)
-- Runtime Function: fract __fractunshihq (unsigned short A)
-- Runtime Function: long fract __fractunshisq (unsigned short A)
-- Runtime Function: long long fract __fractunshidq (unsigned short A)
-- Runtime Function: short accum __fractunshiha (unsigned short A)
-- Runtime Function: accum __fractunshisa (unsigned short A)
-- Runtime Function: long accum __fractunshida (unsigned short A)
-- Runtime Function: long long accum __fractunshita (unsigned short A)
-- Runtime Function: unsigned short fract __fractunshiuqq (unsigned
short A)
-- Runtime Function: unsigned fract __fractunshiuhq (unsigned short A)
-- Runtime Function: unsigned long fract __fractunshiusq (unsigned
short A)
-- Runtime Function: unsigned long long fract __fractunshiudq
(unsigned short A)
-- Runtime Function: unsigned short accum __fractunshiuha (unsigned
short A)
-- Runtime Function: unsigned accum __fractunshiusa (unsigned short A)
-- Runtime Function: unsigned long accum __fractunshiuda (unsigned
short A)
-- Runtime Function: unsigned long long accum __fractunshiuta
(unsigned short A)
-- Runtime Function: short fract __fractunssiqq (unsigned int A)
-- Runtime Function: fract __fractunssihq (unsigned int A)
-- Runtime Function: long fract __fractunssisq (unsigned int A)
-- Runtime Function: long long fract __fractunssidq (unsigned int A)
-- Runtime Function: short accum __fractunssiha (unsigned int A)
-- Runtime Function: accum __fractunssisa (unsigned int A)
-- Runtime Function: long accum __fractunssida (unsigned int A)
-- Runtime Function: long long accum __fractunssita (unsigned int A)
-- Runtime Function: unsigned short fract __fractunssiuqq (unsigned
int A)
-- Runtime Function: unsigned fract __fractunssiuhq (unsigned int A)
-- Runtime Function: unsigned long fract __fractunssiusq (unsigned int
A)
-- Runtime Function: unsigned long long fract __fractunssiudq
(unsigned int A)
-- Runtime Function: unsigned short accum __fractunssiuha (unsigned
int A)
-- Runtime Function: unsigned accum __fractunssiusa (unsigned int A)
-- Runtime Function: unsigned long accum __fractunssiuda (unsigned int
A)
-- Runtime Function: unsigned long long accum __fractunssiuta
(unsigned int A)
-- Runtime Function: short fract __fractunsdiqq (unsigned long A)
-- Runtime Function: fract __fractunsdihq (unsigned long A)
-- Runtime Function: long fract __fractunsdisq (unsigned long A)
-- Runtime Function: long long fract __fractunsdidq (unsigned long A)
-- Runtime Function: short accum __fractunsdiha (unsigned long A)
-- Runtime Function: accum __fractunsdisa (unsigned long A)
-- Runtime Function: long accum __fractunsdida (unsigned long A)
-- Runtime Function: long long accum __fractunsdita (unsigned long A)
-- Runtime Function: unsigned short fract __fractunsdiuqq (unsigned
long A)
-- Runtime Function: unsigned fract __fractunsdiuhq (unsigned long A)
-- Runtime Function: unsigned long fract __fractunsdiusq (unsigned
long A)
-- Runtime Function: unsigned long long fract __fractunsdiudq
(unsigned long A)
-- Runtime Function: unsigned short accum __fractunsdiuha (unsigned
long A)
-- Runtime Function: unsigned accum __fractunsdiusa (unsigned long A)
-- Runtime Function: unsigned long accum __fractunsdiuda (unsigned
long A)
-- Runtime Function: unsigned long long accum __fractunsdiuta
(unsigned long A)
-- Runtime Function: short fract __fractunstiqq (unsigned long long A)
-- Runtime Function: fract __fractunstihq (unsigned long long A)
-- Runtime Function: long fract __fractunstisq (unsigned long long A)
-- Runtime Function: long long fract __fractunstidq (unsigned long
long A)
-- Runtime Function: short accum __fractunstiha (unsigned long long A)
-- Runtime Function: accum __fractunstisa (unsigned long long A)
-- Runtime Function: long accum __fractunstida (unsigned long long A)
-- Runtime Function: long long accum __fractunstita (unsigned long
long A)
-- Runtime Function: unsigned short fract __fractunstiuqq (unsigned
long long A)
-- Runtime Function: unsigned fract __fractunstiuhq (unsigned long
long A)
-- Runtime Function: unsigned long fract __fractunstiusq (unsigned
long long A)
-- Runtime Function: unsigned long long fract __fractunstiudq
(unsigned long long A)
-- Runtime Function: unsigned short accum __fractunstiuha (unsigned
long long A)
-- Runtime Function: unsigned accum __fractunstiusa (unsigned long
long A)
-- Runtime Function: unsigned long accum __fractunstiuda (unsigned
long long A)
-- Runtime Function: unsigned long long accum __fractunstiuta
(unsigned long long A)
These functions convert from fractionals to unsigned
non-fractionals; and from unsigned non-fractionals to fractionals,
without saturation.
-- Runtime Function: short fract __satfractunsqiqq (unsigned char A)
-- Runtime Function: fract __satfractunsqihq (unsigned char A)
-- Runtime Function: long fract __satfractunsqisq (unsigned char A)
-- Runtime Function: long long fract __satfractunsqidq (unsigned char
A)
-- Runtime Function: short accum __satfractunsqiha (unsigned char A)
-- Runtime Function: accum __satfractunsqisa (unsigned char A)
-- Runtime Function: long accum __satfractunsqida (unsigned char A)
-- Runtime Function: long long accum __satfractunsqita (unsigned char
A)
-- Runtime Function: unsigned short fract __satfractunsqiuqq (unsigned
char A)
-- Runtime Function: unsigned fract __satfractunsqiuhq (unsigned char
A)
-- Runtime Function: unsigned long fract __satfractunsqiusq (unsigned
char A)
-- Runtime Function: unsigned long long fract __satfractunsqiudq
(unsigned char A)
-- Runtime Function: unsigned short accum __satfractunsqiuha (unsigned
char A)
-- Runtime Function: unsigned accum __satfractunsqiusa (unsigned char
A)
-- Runtime Function: unsigned long accum __satfractunsqiuda (unsigned
char A)
-- Runtime Function: unsigned long long accum __satfractunsqiuta
(unsigned char A)
-- Runtime Function: short fract __satfractunshiqq (unsigned short A)
-- Runtime Function: fract __satfractunshihq (unsigned short A)
-- Runtime Function: long fract __satfractunshisq (unsigned short A)
-- Runtime Function: long long fract __satfractunshidq (unsigned short
A)
-- Runtime Function: short accum __satfractunshiha (unsigned short A)
-- Runtime Function: accum __satfractunshisa (unsigned short A)
-- Runtime Function: long accum __satfractunshida (unsigned short A)
-- Runtime Function: long long accum __satfractunshita (unsigned short
A)
-- Runtime Function: unsigned short fract __satfractunshiuqq (unsigned
short A)
-- Runtime Function: unsigned fract __satfractunshiuhq (unsigned short
A)
-- Runtime Function: unsigned long fract __satfractunshiusq (unsigned
short A)
-- Runtime Function: unsigned long long fract __satfractunshiudq
(unsigned short A)
-- Runtime Function: unsigned short accum __satfractunshiuha (unsigned
short A)
-- Runtime Function: unsigned accum __satfractunshiusa (unsigned short
A)
-- Runtime Function: unsigned long accum __satfractunshiuda (unsigned
short A)
-- Runtime Function: unsigned long long accum __satfractunshiuta
(unsigned short A)
-- Runtime Function: short fract __satfractunssiqq (unsigned int A)
-- Runtime Function: fract __satfractunssihq (unsigned int A)
-- Runtime Function: long fract __satfractunssisq (unsigned int A)
-- Runtime Function: long long fract __satfractunssidq (unsigned int A)
-- Runtime Function: short accum __satfractunssiha (unsigned int A)
-- Runtime Function: accum __satfractunssisa (unsigned int A)
-- Runtime Function: long accum __satfractunssida (unsigned int A)
-- Runtime Function: long long accum __satfractunssita (unsigned int A)
-- Runtime Function: unsigned short fract __satfractunssiuqq (unsigned
int A)
-- Runtime Function: unsigned fract __satfractunssiuhq (unsigned int A)
-- Runtime Function: unsigned long fract __satfractunssiusq (unsigned
int A)
-- Runtime Function: unsigned long long fract __satfractunssiudq
(unsigned int A)
-- Runtime Function: unsigned short accum __satfractunssiuha (unsigned
int A)
-- Runtime Function: unsigned accum __satfractunssiusa (unsigned int A)
-- Runtime Function: unsigned long accum __satfractunssiuda (unsigned
int A)
-- Runtime Function: unsigned long long accum __satfractunssiuta
(unsigned int A)
-- Runtime Function: short fract __satfractunsdiqq (unsigned long A)
-- Runtime Function: fract __satfractunsdihq (unsigned long A)
-- Runtime Function: long fract __satfractunsdisq (unsigned long A)
-- Runtime Function: long long fract __satfractunsdidq (unsigned long
A)
-- Runtime Function: short accum __satfractunsdiha (unsigned long A)
-- Runtime Function: accum __satfractunsdisa (unsigned long A)
-- Runtime Function: long accum __satfractunsdida (unsigned long A)
-- Runtime Function: long long accum __satfractunsdita (unsigned long
A)
-- Runtime Function: unsigned short fract __satfractunsdiuqq (unsigned
long A)
-- Runtime Function: unsigned fract __satfractunsdiuhq (unsigned long
A)
-- Runtime Function: unsigned long fract __satfractunsdiusq (unsigned
long A)
-- Runtime Function: unsigned long long fract __satfractunsdiudq
(unsigned long A)
-- Runtime Function: unsigned short accum __satfractunsdiuha (unsigned
long A)
-- Runtime Function: unsigned accum __satfractunsdiusa (unsigned long
A)
-- Runtime Function: unsigned long accum __satfractunsdiuda (unsigned
long A)
-- Runtime Function: unsigned long long accum __satfractunsdiuta
(unsigned long A)
-- Runtime Function: short fract __satfractunstiqq (unsigned long long
A)
-- Runtime Function: fract __satfractunstihq (unsigned long long A)
-- Runtime Function: long fract __satfractunstisq (unsigned long long
A)
-- Runtime Function: long long fract __satfractunstidq (unsigned long
long A)
-- Runtime Function: short accum __satfractunstiha (unsigned long long
A)
-- Runtime Function: accum __satfractunstisa (unsigned long long A)
-- Runtime Function: long accum __satfractunstida (unsigned long long
A)
-- Runtime Function: long long accum __satfractunstita (unsigned long
long A)
-- Runtime Function: unsigned short fract __satfractunstiuqq (unsigned
long long A)
-- Runtime Function: unsigned fract __satfractunstiuhq (unsigned long
long A)
-- Runtime Function: unsigned long fract __satfractunstiusq (unsigned
long long A)
-- Runtime Function: unsigned long long fract __satfractunstiudq
(unsigned long long A)
-- Runtime Function: unsigned short accum __satfractunstiuha (unsigned
long long A)
-- Runtime Function: unsigned accum __satfractunstiusa (unsigned long
long A)
-- Runtime Function: unsigned long accum __satfractunstiuda (unsigned
long long A)
-- Runtime Function: unsigned long long accum __satfractunstiuta
(unsigned long long A)
These functions convert from unsigned non-fractionals to
fractionals, with saturation.
File: gccint.info, Node: Exception handling routines, Next: Miscellaneous routines, Prev: Fixed-point fractional library routines, Up: Libgcc
4.5 Language-independent routines for exception handling
========================================================
document me!
_Unwind_DeleteException
_Unwind_Find_FDE
_Unwind_ForcedUnwind
_Unwind_GetGR
_Unwind_GetIP
_Unwind_GetLanguageSpecificData
_Unwind_GetRegionStart
_Unwind_GetTextRelBase
_Unwind_GetDataRelBase
_Unwind_RaiseException
_Unwind_Resume
_Unwind_SetGR
_Unwind_SetIP
_Unwind_FindEnclosingFunction
_Unwind_SjLj_Register
_Unwind_SjLj_Unregister
_Unwind_SjLj_RaiseException
_Unwind_SjLj_ForcedUnwind
_Unwind_SjLj_Resume
__deregister_frame
__deregister_frame_info
__deregister_frame_info_bases
__register_frame
__register_frame_info
__register_frame_info_bases
__register_frame_info_table
__register_frame_info_table_bases
__register_frame_table
File: gccint.info, Node: Miscellaneous routines, Prev: Exception handling routines, Up: Libgcc
4.6 Miscellaneous runtime library routines
==========================================
4.6.1 Cache control functions
-----------------------------
-- Runtime Function: void __clear_cache (char *BEG, char *END)
This function clears the instruction cache between BEG and END.
4.6.2 Split stack functions and variables
-----------------------------------------
-- Runtime Function: void * __splitstack_find (void *SEGMENT_ARG, void
*SP, size_t LEN, void **NEXT_SEGMENT, void **NEXT_SP, void
**INITIAL_SP)
When using `-fsplit-stack', this call may be used to iterate over
the stack segments. It may be called like this:
void *next_segment = NULL;
void *next_sp = NULL;
void *initial_sp = NULL;
void *stack;
size_t stack_size;
while ((stack = __splitstack_find (next_segment, next_sp,
&stack_size, &next_segment,
&next_sp, &initial_sp))
!= NULL)
{
/* Stack segment starts at stack and is
stack_size bytes long. */
}
There is no way to iterate over the stack segments of a different
thread. However, what is permitted is for one thread to call this
with the SEGMENT_ARG and SP arguments NULL, to pass NEXT_SEGMENT,
NEXT_SP, and INITIAL_SP to a different thread, and then to suspend
one way or another. A different thread may run the subsequent
`__splitstack_find' iterations. Of course, this will only work if
the first thread is suspended while the second thread is calling
`__splitstack_find'. If not, the second thread could be looking
at the stack while it is changing, and anything could happen.
-- Variable: __morestack_segments
-- Variable: __morestack_current_segment
-- Variable: __morestack_initial_sp
Internal variables used by the `-fsplit-stack' implementation.
File: gccint.info, Node: Languages, Next: Source Tree, Prev: Libgcc, Up: Top
5 Language Front Ends in GCC
****************************
The interface to front ends for languages in GCC, and in particular the
`tree' structure (*note GENERIC::), was initially designed for C, and
many aspects of it are still somewhat biased towards C and C-like
languages. It is, however, reasonably well suited to other procedural
languages, and front ends for many such languages have been written for
GCC.
Writing a compiler as a front end for GCC, rather than compiling
directly to assembler or generating C code which is then compiled by
GCC, has several advantages:
* GCC front ends benefit from the support for many different target
machines already present in GCC.
* GCC front ends benefit from all the optimizations in GCC. Some of
these, such as alias analysis, may work better when GCC is
compiling directly from source code then when it is compiling from
generated C code.
* Better debugging information is generated when compiling directly
from source code than when going via intermediate generated C code.
Because of the advantages of writing a compiler as a GCC front end,
GCC front ends have also been created for languages very different from
those for which GCC was designed, such as the declarative
logic/functional language Mercury. For these reasons, it may also be
useful to implement compilers created for specialized purposes (for
example, as part of a research project) as GCC front ends.
File: gccint.info, Node: Source Tree, Next: Testsuites, Prev: Languages, Up: Top
6 Source Tree Structure and Build System
****************************************
This chapter describes the structure of the GCC source tree, and how
GCC is built. The user documentation for building and installing GCC
is in a separate manual (`http://gcc.gnu.org/install/'), with which it
is presumed that you are familiar.
* Menu:
* Configure Terms:: Configuration terminology and history.
* Top Level:: The top level source directory.
* gcc Directory:: The `gcc' subdirectory.
File: gccint.info, Node: Configure Terms, Next: Top Level, Up: Source Tree
6.1 Configure Terms and History
===============================
The configure and build process has a long and colorful history, and can
be confusing to anyone who doesn't know why things are the way they are.
While there are other documents which describe the configuration process
in detail, here are a few things that everyone working on GCC should
know.
There are three system names that the build knows about: the machine
you are building on ("build"), the machine that you are building for
("host"), and the machine that GCC will produce code for ("target").
When you configure GCC, you specify these with `--build=', `--host=',
and `--target='.
Specifying the host without specifying the build should be avoided, as
`configure' may (and once did) assume that the host you specify is also
the build, which may not be true.
If build, host, and target are all the same, this is called a
"native". If build and host are the same but target is different, this
is called a "cross". If build, host, and target are all different this
is called a "canadian" (for obscure reasons dealing with Canada's
political party and the background of the person working on the build
at that time). If host and target are the same, but build is
different, you are using a cross-compiler to build a native for a
different system. Some people call this a "host-x-host", "crossed
native", or "cross-built native". If build and target are the same,
but host is different, you are using a cross compiler to build a cross
compiler that produces code for the machine you're building on. This
is rare, so there is no common way of describing it. There is a
proposal to call this a "crossback".
If build and host are the same, the GCC you are building will also be
used to build the target libraries (like `libstdc++'). If build and
host are different, you must have already built and installed a cross
compiler that will be used to build the target libraries (if you
configured with `--target=foo-bar', this compiler will be called
`foo-bar-gcc').
In the case of target libraries, the machine you're building for is the
machine you specified with `--target'. So, build is the machine you're
building on (no change there), host is the machine you're building for
(the target libraries are built for the target, so host is the target
you specified), and target doesn't apply (because you're not building a
compiler, you're building libraries). The configure/make process will
adjust these variables as needed. It also sets `$with_cross_host' to
the original `--host' value in case you need it.
The `libiberty' support library is built up to three times: once for
the host, once for the target (even if they are the same), and once for
the build if build and host are different. This allows it to be used
by all programs which are generated in the course of the build process.
File: gccint.info, Node: Top Level, Next: gcc Directory, Prev: Configure Terms, Up: Source Tree
6.2 Top Level Source Directory
==============================
The top level source directory in a GCC distribution contains several
files and directories that are shared with other software distributions
such as that of GNU Binutils. It also contains several subdirectories
that contain parts of GCC and its runtime libraries:
`boehm-gc'
The Boehm conservative garbage collector, used as part of the Java
runtime library.
`config'
Autoconf macros and Makefile fragments used throughout the tree.
`contrib'
Contributed scripts that may be found useful in conjunction with
GCC. One of these, `contrib/texi2pod.pl', is used to generate man
pages from Texinfo manuals as part of the GCC build process.
`fixincludes'
The support for fixing system headers to work with GCC. See
`fixincludes/README' for more information. The headers fixed by
this mechanism are installed in `LIBSUBDIR/include-fixed'. Along
with those headers, `README-fixinc' is also installed, as
`LIBSUBDIR/include-fixed/README'.
`gcc'
The main sources of GCC itself (except for runtime libraries),
including optimizers, support for different target architectures,
language front ends, and testsuites. *Note The `gcc'
Subdirectory: gcc Directory, for details.
`gnattools'
Support tools for GNAT.
`include'
Headers for the `libiberty' library.
`intl'
GNU `libintl', from GNU `gettext', for systems which do not
include it in `libc'.
`libada'
The Ada runtime library.
`libcpp'
The C preprocessor library.
`libdecnumber'
The Decimal Float support library.
`libffi'
The `libffi' library, used as part of the Java runtime library.
`libgcc'
The GCC runtime library.
`libgfortran'
The Fortran runtime library.
`libgo'
The Go runtime library. The bulk of this library is mirrored from
the master Go repository (http://code.google.com/p/go/).
`libgomp'
The GNU OpenMP runtime library.
`libiberty'
The `libiberty' library, used for portability and for some
generally useful data structures and algorithms. *Note
Introduction: (libiberty)Top, for more information about this
library.
`libjava'
The Java runtime library.
`libmudflap'
The `libmudflap' library, used for instrumenting pointer and array
dereferencing operations.
`libobjc'
The Objective-C and Objective-C++ runtime library.
`libssp'
The Stack protector runtime library.
`libstdc++-v3'
The C++ runtime library.
`lto-plugin'
Plugin used by `gold' if link-time optimizations are enabled.
`maintainer-scripts'
Scripts used by the `gccadmin' account on `gcc.gnu.org'.
`zlib'
The `zlib' compression library, used by the Java front end, as
part of the Java runtime library, and for compressing and
uncompressing GCC's intermediate language in LTO object files.
The build system in the top level directory, including how recursion
into subdirectories works and how building runtime libraries for
multilibs is handled, is documented in a separate manual, included with
GNU Binutils. *Note GNU configure and build system: (configure)Top,
for details.
File: gccint.info, Node: gcc Directory, Prev: Top Level, Up: Source Tree
6.3 The `gcc' Subdirectory
==========================
The `gcc' directory contains many files that are part of the C sources
of GCC, other files used as part of the configuration and build
process, and subdirectories including documentation and a testsuite.
The files that are sources of GCC are documented in a separate chapter.
*Note Passes and Files of the Compiler: Passes.
* Menu:
* Subdirectories:: Subdirectories of `gcc'.
* Configuration:: The configuration process, and the files it uses.
* Build:: The build system in the `gcc' directory.
* Makefile:: Targets in `gcc/Makefile'.
* Library Files:: Library source files and headers under `gcc/'.
* Headers:: Headers installed by GCC.
* Documentation:: Building documentation in GCC.
* Front End:: Anatomy of a language front end.
* Back End:: Anatomy of a target back end.
File: gccint.info, Node: Subdirectories, Next: Configuration, Up: gcc Directory
6.3.1 Subdirectories of `gcc'
-----------------------------
The `gcc' directory contains the following subdirectories:
`LANGUAGE'
Subdirectories for various languages. Directories containing a
file `config-lang.in' are language subdirectories. The contents of
the subdirectories `cp' (for C++), `lto' (for LTO), `objc' (for
Objective-C) and `objcp' (for Objective-C++) are documented in
this manual (*note Passes and Files of the Compiler: Passes.);
those for other languages are not. *Note Anatomy of a Language
Front End: Front End, for details of the files in these
directories.
`config'
Configuration files for supported architectures and operating
systems. *Note Anatomy of a Target Back End: Back End, for
details of the files in this directory.
`doc'
Texinfo documentation for GCC, together with automatically
generated man pages and support for converting the installation
manual to HTML. *Note Documentation::.
`ginclude'
System headers installed by GCC, mainly those required by the C
standard of freestanding implementations. *Note Headers Installed
by GCC: Headers, for details of when these and other headers are
installed.
`po'
Message catalogs with translations of messages produced by GCC into
various languages, `LANGUAGE.po'. This directory also contains
`gcc.pot', the template for these message catalogues, `exgettext',
a wrapper around `gettext' to extract the messages from the GCC
sources and create `gcc.pot', which is run by `make gcc.pot', and
`EXCLUDES', a list of files from which messages should not be
extracted.
`testsuite'
The GCC testsuites (except for those for runtime libraries).
*Note Testsuites::.
File: gccint.info, Node: Configuration, Next: Build, Prev: Subdirectories, Up: gcc Directory
6.3.2 Configuration in the `gcc' Directory
------------------------------------------
The `gcc' directory is configured with an Autoconf-generated script
`configure'. The `configure' script is generated from `configure.ac'
and `aclocal.m4'. From the files `configure.ac' and `acconfig.h',
Autoheader generates the file `config.in'. The file `cstamp-h.in' is
used as a timestamp.
* Menu:
* Config Fragments:: Scripts used by `configure'.
* System Config:: The `config.build', `config.host', and
`config.gcc' files.
* Configuration Files:: Files created by running `configure'.
File: gccint.info, Node: Config Fragments, Next: System Config, Up: Configuration
6.3.2.1 Scripts Used by `configure'
...................................
`configure' uses some other scripts to help in its work:
* The standard GNU `config.sub' and `config.guess' files, kept in
the top level directory, are used.
* The file `config.gcc' is used to handle configuration specific to
the particular target machine. The file `config.build' is used to
handle configuration specific to the particular build machine.
The file `config.host' is used to handle configuration specific to
the particular host machine. (In general, these should only be
used for features that cannot reasonably be tested in Autoconf
feature tests.) *Note The `config.build'; `config.host'; and
`config.gcc' Files: System Config, for details of the contents of
these files.
* Each language subdirectory has a file `LANGUAGE/config-lang.in'
that is used for front-end-specific configuration. *Note The
Front End `config-lang.in' File: Front End Config, for details of
this file.
* A helper script `configure.frag' is used as part of creating the
output of `configure'.
File: gccint.info, Node: System Config, Next: Configuration Files, Prev: Config Fragments, Up: Configuration
6.3.2.2 The `config.build'; `config.host'; and `config.gcc' Files
.................................................................
The `config.build' file contains specific rules for particular systems
which GCC is built on. This should be used as rarely as possible, as
the behavior of the build system can always be detected by autoconf.
The `config.host' file contains specific rules for particular systems
which GCC will run on. This is rarely needed.
The `config.gcc' file contains specific rules for particular systems
which GCC will generate code for. This is usually needed.
Each file has a list of the shell variables it sets, with
descriptions, at the top of the file.
FIXME: document the contents of these files, and what variables should
be set to control build, host and target configuration.
File: gccint.info, Node: Configuration Files, Prev: System Config, Up: Configuration
6.3.2.3 Files Created by `configure'
....................................
Here we spell out what files will be set up by `configure' in the `gcc'
directory. Some other files are created as temporary files in the
configuration process, and are not used in the subsequent build; these
are not documented.
* `Makefile' is constructed from `Makefile.in', together with the
host and target fragments (*note Makefile Fragments: Fragments.)
`t-TARGET' and `x-HOST' from `config', if any, and language
Makefile fragments `LANGUAGE/Make-lang.in'.
* `auto-host.h' contains information about the host machine
determined by `configure'. If the host machine is different from
the build machine, then `auto-build.h' is also created, containing
such information about the build machine.
* `config.status' is a script that may be run to recreate the
current configuration.
* `configargs.h' is a header containing details of the arguments
passed to `configure' to configure GCC, and of the thread model
used.
* `cstamp-h' is used as a timestamp.
* If a language `config-lang.in' file (*note The Front End
`config-lang.in' File: Front End Config.) sets `outputs', then the
files listed in `outputs' there are also generated.
The following configuration headers are created from the Makefile,
using `mkconfig.sh', rather than directly by `configure'. `config.h',
`bconfig.h' and `tconfig.h' all contain the `xm-MACHINE.h' header, if
any, appropriate to the host, build and target machines respectively,
the configuration headers for the target, and some definitions; for the
host and build machines, these include the autoconfigured headers
generated by `configure'. The other configuration headers are
determined by `config.gcc'. They also contain the typedefs for `rtx',
`rtvec' and `tree'.
* `config.h', for use in programs that run on the host machine.
* `bconfig.h', for use in programs that run on the build machine.
* `tconfig.h', for use in programs and libraries for the target
machine.
* `tm_p.h', which includes the header `MACHINE-protos.h' that
contains prototypes for functions in the target `.c' file. FIXME:
why is such a separate header necessary?
File: gccint.info, Node: Build, Next: Makefile, Prev: Configuration, Up: gcc Directory
6.3.3 Build System in the `gcc' Directory
-----------------------------------------
FIXME: describe the build system, including what is built in what
stages. Also list the various source files that are used in the build
process but aren't source files of GCC itself and so aren't documented
below (*note Passes::).
File: gccint.info, Node: Makefile, Next: Library Files, Prev: Build, Up: gcc Directory
6.3.4 Makefile Targets
----------------------
These targets are available from the `gcc' directory:
`all'
This is the default target. Depending on what your
build/host/target configuration is, it coordinates all the things
that need to be built.
`doc'
Produce info-formatted documentation and man pages. Essentially it
calls `make man' and `make info'.
`dvi'
Produce DVI-formatted documentation.
`pdf'
Produce PDF-formatted documentation.
`html'
Produce HTML-formatted documentation.
`man'
Generate man pages.
`info'
Generate info-formatted pages.
`mostlyclean'
Delete the files made while building the compiler.
`clean'
That, and all the other files built by `make all'.
`distclean'
That, and all the files created by `configure'.
`maintainer-clean'
Distclean plus any file that can be generated from other files.
Note that additional tools may be required beyond what is normally
needed to build GCC.
`srcextra'
Generates files in the source directory that are not
version-controlled but should go into a release tarball.
`srcinfo'
`srcman'
Copies the info-formatted and manpage documentation into the source
directory usually for the purpose of generating a release tarball.
`install'
Installs GCC.
`uninstall'
Deletes installed files, though this is not supported.
`check'
Run the testsuite. This creates a `testsuite' subdirectory that
has various `.sum' and `.log' files containing the results of the
testing. You can run subsets with, for example, `make check-gcc'.
You can specify specific tests by setting `RUNTESTFLAGS' to be the
name of the `.exp' file, optionally followed by (for some tests)
an equals and a file wildcard, like:
make check-gcc RUNTESTFLAGS="execute.exp=19980413-*"
Note that running the testsuite may require additional tools be
installed, such as Tcl or DejaGnu.
The toplevel tree from which you start GCC compilation is not the GCC
directory, but rather a complex Makefile that coordinates the various
steps of the build, including bootstrapping the compiler and using the
new compiler to build target libraries.
When GCC is configured for a native configuration, the default action
for `make' is to do a full three-stage bootstrap. This means that GCC
is built three times--once with the native compiler, once with the
native-built compiler it just built, and once with the compiler it
built the second time. In theory, the last two should produce the same
results, which `make compare' can check. Each stage is configured
separately and compiled into a separate directory, to minimize problems
due to ABI incompatibilities between the native compiler and GCC.
If you do a change, rebuilding will also start from the first stage
and "bubble" up the change through the three stages. Each stage is
taken from its build directory (if it had been built previously),
rebuilt, and copied to its subdirectory. This will allow you to, for
example, continue a bootstrap after fixing a bug which causes the
stage2 build to crash. It does not provide as good coverage of the
compiler as bootstrapping from scratch, but it ensures that the new
code is syntactically correct (e.g., that you did not use GCC extensions
by mistake), and avoids spurious bootstrap comparison failures(1).
Other targets available from the top level include:
`bootstrap-lean'
Like `bootstrap', except that the various stages are removed once
they're no longer needed. This saves disk space.
`bootstrap2'
`bootstrap2-lean'
Performs only the first two stages of bootstrap. Unlike a
three-stage bootstrap, this does not perform a comparison to test
that the compiler is running properly. Note that the disk space
required by a "lean" bootstrap is approximately independent of the
number of stages.
`stageN-bubble (N = 1...4, profile, feedback)'
Rebuild all the stages up to N, with the appropriate flags,
"bubbling" the changes as described above.
`all-stageN (N = 1...4, profile, feedback)'
Assuming that stage N has already been built, rebuild it with the
appropriate flags. This is rarely needed.
`cleanstrap'
Remove everything (`make clean') and rebuilds (`make bootstrap').
`compare'
Compares the results of stages 2 and 3. This ensures that the
compiler is running properly, since it should produce the same
object files regardless of how it itself was compiled.
`profiledbootstrap'
Builds a compiler with profiling feedback information. In this
case, the second and third stages are named `profile' and
`feedback', respectively. For more information, see *note
Building with profile feedback: (gccinstall)Building.
`restrap'
Restart a bootstrap, so that everything that was not built with
the system compiler is rebuilt.
`stageN-start (N = 1...4, profile, feedback)'
For each package that is bootstrapped, rename directories so that,
for example, `gcc' points to the stageN GCC, compiled with the
stageN-1 GCC(2).
You will invoke this target if you need to test or debug the
stageN GCC. If you only need to execute GCC (but you need not run
`make' either to rebuild it or to run test suites), you should be
able to work directly in the `stageN-gcc' directory. This makes
it easier to debug multiple stages in parallel.
`stage'
For each package that is bootstrapped, relocate its build directory
to indicate its stage. For example, if the `gcc' directory points
to the stage2 GCC, after invoking this target it will be renamed
to `stage2-gcc'.
If you wish to use non-default GCC flags when compiling the stage2 and
stage3 compilers, set `BOOT_CFLAGS' on the command line when doing
`make'.
Usually, the first stage only builds the languages that the compiler
is written in: typically, C and maybe Ada. If you are debugging a
miscompilation of a different stage2 front-end (for example, of the
Fortran front-end), you may want to have front-ends for other languages
in the first stage as well. To do so, set `STAGE1_LANGUAGES' on the
command line when doing `make'.
For example, in the aforementioned scenario of debugging a Fortran
front-end miscompilation caused by the stage1 compiler, you may need a
command like
make stage2-bubble STAGE1_LANGUAGES=c,fortran
Alternatively, you can use per-language targets to build and test
languages that are not enabled by default in stage1. For example,
`make f951' will build a Fortran compiler even in the stage1 build
directory.
---------- Footnotes ----------
(1) Except if the compiler was buggy and miscompiled some of the files
that were not modified. In this case, it's best to use `make restrap'.
(2) Customarily, the system compiler is also termed the `stage0' GCC.
File: gccint.info, Node: Library Files, Next: Headers, Prev: Makefile, Up: gcc Directory
6.3.5 Library Source Files and Headers under the `gcc' Directory
----------------------------------------------------------------
FIXME: list here, with explanation, all the C source files and headers
under the `gcc' directory that aren't built into the GCC executable but
rather are part of runtime libraries and object files, such as
`crtstuff.c' and `unwind-dw2.c'. *Note Headers Installed by GCC:
Headers, for more information about the `ginclude' directory.
File: gccint.info, Node: Headers, Next: Documentation, Prev: Library Files, Up: gcc Directory
6.3.6 Headers Installed by GCC
------------------------------
In general, GCC expects the system C library to provide most of the
headers to be used with it. However, GCC will fix those headers if
necessary to make them work with GCC, and will install some headers
required of freestanding implementations. These headers are installed
in `LIBSUBDIR/include'. Headers for non-C runtime libraries are also
installed by GCC; these are not documented here. (FIXME: document them
somewhere.)
Several of the headers GCC installs are in the `ginclude' directory.
These headers, `iso646.h', `stdarg.h', `stdbool.h', and `stddef.h', are
installed in `LIBSUBDIR/include', unless the target Makefile fragment
(*note Target Fragment::) overrides this by setting `USER_H'.
In addition to these headers and those generated by fixing system
headers to work with GCC, some other headers may also be installed in
`LIBSUBDIR/include'. `config.gcc' may set `extra_headers'; this
specifies additional headers under `config' to be installed on some
systems.
GCC installs its own version of `<float.h>', from `ginclude/float.h'.
This is done to cope with command-line options that change the
representation of floating point numbers.
GCC also installs its own version of `<limits.h>'; this is generated
from `glimits.h', together with `limitx.h' and `limity.h' if the system
also has its own version of `<limits.h>'. (GCC provides its own header
because it is required of ISO C freestanding implementations, but needs
to include the system header from its own header as well because other
standards such as POSIX specify additional values to be defined in
`<limits.h>'.) The system's `<limits.h>' header is used via
`LIBSUBDIR/include/syslimits.h', which is copied from `gsyslimits.h' if
it does not need fixing to work with GCC; if it needs fixing,
`syslimits.h' is the fixed copy.
GCC can also install `<tgmath.h>'. It will do this when `config.gcc'
sets `use_gcc_tgmath' to `yes'.
File: gccint.info, Node: Documentation, Next: Front End, Prev: Headers, Up: gcc Directory
6.3.7 Building Documentation
----------------------------
The main GCC documentation is in the form of manuals in Texinfo format.
These are installed in Info format; DVI versions may be generated by
`make dvi', PDF versions by `make pdf', and HTML versions by `make
html'. In addition, some man pages are generated from the Texinfo
manuals, there are some other text files with miscellaneous
documentation, and runtime libraries have their own documentation
outside the `gcc' directory. FIXME: document the documentation for
runtime libraries somewhere.
* Menu:
* Texinfo Manuals:: GCC manuals in Texinfo format.
* Man Page Generation:: Generating man pages from Texinfo manuals.
* Miscellaneous Docs:: Miscellaneous text files with documentation.
File: gccint.info, Node: Texinfo Manuals, Next: Man Page Generation, Up: Documentation
6.3.7.1 Texinfo Manuals
.......................
The manuals for GCC as a whole, and the C and C++ front ends, are in
files `doc/*.texi'. Other front ends have their own manuals in files
`LANGUAGE/*.texi'. Common files `doc/include/*.texi' are provided
which may be included in multiple manuals; the following files are in
`doc/include':
`fdl.texi'
The GNU Free Documentation License.
`funding.texi'
The section "Funding Free Software".
`gcc-common.texi'
Common definitions for manuals.
`gpl.texi'
`gpl_v3.texi'
The GNU General Public License.
`texinfo.tex'
A copy of `texinfo.tex' known to work with the GCC manuals.
DVI-formatted manuals are generated by `make dvi', which uses
`texi2dvi' (via the Makefile macro `$(TEXI2DVI)'). PDF-formatted
manuals are generated by `make pdf', which uses `texi2pdf' (via the
Makefile macro `$(TEXI2PDF)'). HTML formatted manuals are generated by
`make html'. Info manuals are generated by `make info' (which is run
as part of a bootstrap); this generates the manuals in the source
directory, using `makeinfo' via the Makefile macro `$(MAKEINFO)', and
they are included in release distributions.
Manuals are also provided on the GCC web site, in both HTML and
PostScript forms. This is done via the script
`maintainer-scripts/update_web_docs_svn'. Each manual to be provided
online must be listed in the definition of `MANUALS' in that file; a
file `NAME.texi' must only appear once in the source tree, and the
output manual must have the same name as the source file. (However,
other Texinfo files, included in manuals but not themselves the root
files of manuals, may have names that appear more than once in the
source tree.) The manual file `NAME.texi' should only include other
files in its own directory or in `doc/include'. HTML manuals will be
generated by `makeinfo --html', PostScript manuals by `texi2dvi' and
`dvips', and PDF manuals by `texi2pdf'. All Texinfo files that are
parts of manuals must be version-controlled, even if they are generated
files, for the generation of online manuals to work.
The installation manual, `doc/install.texi', is also provided on the
GCC web site. The HTML version is generated by the script
`doc/install.texi2html'.
File: gccint.info, Node: Man Page Generation, Next: Miscellaneous Docs, Prev: Texinfo Manuals, Up: Documentation
6.3.7.2 Man Page Generation
...........................
Because of user demand, in addition to full Texinfo manuals, man pages
are provided which contain extracts from those manuals. These man
pages are generated from the Texinfo manuals using
`contrib/texi2pod.pl' and `pod2man'. (The man page for `g++',
`cp/g++.1', just contains a `.so' reference to `gcc.1', but all the
other man pages are generated from Texinfo manuals.)
Because many systems may not have the necessary tools installed to
generate the man pages, they are only generated if the `configure'
script detects that recent enough tools are installed, and the
Makefiles allow generating man pages to fail without aborting the
build. Man pages are also included in release distributions. They are
generated in the source directory.
Magic comments in Texinfo files starting `@c man' control what parts
of a Texinfo file go into a man page. Only a subset of Texinfo is
supported by `texi2pod.pl', and it may be necessary to add support for
more Texinfo features to this script when generating new man pages. To
improve the man page output, some special Texinfo macros are provided
in `doc/include/gcc-common.texi' which `texi2pod.pl' understands:
`@gcctabopt'
Use in the form `@table @gcctabopt' for tables of options, where
for printed output the effect of `@code' is better than that of
`@option' but for man page output a different effect is wanted.
`@gccoptlist'
Use for summary lists of options in manuals.
`@gol'
Use at the end of each line inside `@gccoptlist'. This is
necessary to avoid problems with differences in how the
`@gccoptlist' macro is handled by different Texinfo formatters.
FIXME: describe the `texi2pod.pl' input language and magic comments in
more detail.
File: gccint.info, Node: Miscellaneous Docs, Prev: Man Page Generation, Up: Documentation
6.3.7.3 Miscellaneous Documentation
...................................
In addition to the formal documentation that is installed by GCC, there
are several other text files in the `gcc' subdirectory with
miscellaneous documentation:
`ABOUT-GCC-NLS'
Notes on GCC's Native Language Support. FIXME: this should be
part of this manual rather than a separate file.
`ABOUT-NLS'
Notes on the Free Translation Project.
`COPYING'
`COPYING3'
The GNU General Public License, Versions 2 and 3.
`COPYING.LIB'
`COPYING3.LIB'
The GNU Lesser General Public License, Versions 2.1 and 3.
`*ChangeLog*'
`*/ChangeLog*'
Change log files for various parts of GCC.
`LANGUAGES'
Details of a few changes to the GCC front-end interface. FIXME:
the information in this file should be part of general
documentation of the front-end interface in this manual.
`ONEWS'
Information about new features in old versions of GCC. (For recent
versions, the information is on the GCC web site.)
`README.Portability'
Information about portability issues when writing code in GCC.
FIXME: why isn't this part of this manual or of the GCC Coding
Conventions?
FIXME: document such files in subdirectories, at least `config', `cp',
`objc', `testsuite'.
File: gccint.info, Node: Front End, Next: Back End, Prev: Documentation, Up: gcc Directory
6.3.8 Anatomy of a Language Front End
-------------------------------------
A front end for a language in GCC has the following parts:
* A directory `LANGUAGE' under `gcc' containing source files for
that front end. *Note The Front End `LANGUAGE' Directory: Front
End Directory, for details.
* A mention of the language in the list of supported languages in
`gcc/doc/install.texi'.
* A mention of the name under which the language's runtime library is
recognized by `--enable-shared=PACKAGE' in the documentation of
that option in `gcc/doc/install.texi'.
* A mention of any special prerequisites for building the front end
in the documentation of prerequisites in `gcc/doc/install.texi'.
* Details of contributors to that front end in
`gcc/doc/contrib.texi'. If the details are in that front end's
own manual then there should be a link to that manual's list in
`contrib.texi'.
* Information about support for that language in
`gcc/doc/frontends.texi'.
* Information about standards for that language, and the front end's
support for them, in `gcc/doc/standards.texi'. This may be a link
to such information in the front end's own manual.
* Details of source file suffixes for that language and `-x LANG'
options supported, in `gcc/doc/invoke.texi'.
* Entries in `default_compilers' in `gcc.c' for source file suffixes
for that language.
* Preferably testsuites, which may be under `gcc/testsuite' or
runtime library directories. FIXME: document somewhere how to
write testsuite harnesses.
* Probably a runtime library for the language, outside the `gcc'
directory. FIXME: document this further.
* Details of the directories of any runtime libraries in
`gcc/doc/sourcebuild.texi'.
* Check targets in `Makefile.def' for the top-level `Makefile' to
check just the compiler or the compiler and runtime library for the
language.
If the front end is added to the official GCC source repository, the
following are also necessary:
* At least one Bugzilla component for bugs in that front end and
runtime libraries. This category needs to be added to the
Bugzilla database.
* Normally, one or more maintainers of that front end listed in
`MAINTAINERS'.
* Mentions on the GCC web site in `index.html' and `frontends.html',
with any relevant links on `readings.html'. (Front ends that are
not an official part of GCC may also be listed on
`frontends.html', with relevant links.)
* A news item on `index.html', and possibly an announcement on the
<gcc-announce@gcc.gnu.org> mailing list.
* The front end's manuals should be mentioned in
`maintainer-scripts/update_web_docs_svn' (*note Texinfo Manuals::)
and the online manuals should be linked to from
`onlinedocs/index.html'.
* Any old releases or CVS repositories of the front end, before its
inclusion in GCC, should be made available on the GCC FTP site
`ftp://gcc.gnu.org/pub/gcc/old-releases/'.
* The release and snapshot script `maintainer-scripts/gcc_release'
should be updated to generate appropriate tarballs for this front
end.
* If this front end includes its own version files that include the
current date, `maintainer-scripts/update_version' should be
updated accordingly.
* Menu:
* Front End Directory:: The front end `LANGUAGE' directory.
* Front End Config:: The front end `config-lang.in' file.
* Front End Makefile:: The front end `Make-lang.in' file.
File: gccint.info, Node: Front End Directory, Next: Front End Config, Up: Front End
6.3.8.1 The Front End `LANGUAGE' Directory
..........................................
A front end `LANGUAGE' directory contains the source files of that
front end (but not of any runtime libraries, which should be outside
the `gcc' directory). This includes documentation, and possibly some
subsidiary programs built alongside the front end. Certain files are
special and other parts of the compiler depend on their names:
`config-lang.in'
This file is required in all language subdirectories. *Note The
Front End `config-lang.in' File: Front End Config, for details of
its contents
`Make-lang.in'
This file is required in all language subdirectories. *Note The
Front End `Make-lang.in' File: Front End Makefile, for details of
its contents.
`lang.opt'
This file registers the set of switches that the front end accepts
on the command line, and their `--help' text. *Note Options::.
`lang-specs.h'
This file provides entries for `default_compilers' in `gcc.c'
which override the default of giving an error that a compiler for
that language is not installed.
`LANGUAGE-tree.def'
This file, which need not exist, defines any language-specific tree
codes.
File: gccint.info, Node: Front End Config, Next: Front End Makefile, Prev: Front End Directory, Up: Front End
6.3.8.2 The Front End `config-lang.in' File
...........................................
Each language subdirectory contains a `config-lang.in' file. In
addition the main directory contains `c-config-lang.in', which contains
limited information for the C language. This file is a shell script
that may define some variables describing the language:
`language'
This definition must be present, and gives the name of the language
for some purposes such as arguments to `--enable-languages'.
`lang_requires'
If defined, this variable lists (space-separated) language front
ends other than C that this front end requires to be enabled (with
the names given being their `language' settings). For example, the
Java front end depends on the C++ front end, so sets
`lang_requires=c++'.
`subdir_requires'
If defined, this variable lists (space-separated) front end
directories other than C that this front end requires to be
present. For example, the Objective-C++ front end uses source
files from the C++ and Objective-C front ends, so sets
`subdir_requires="cp objc"'.
`target_libs'
If defined, this variable lists (space-separated) targets in the
top level `Makefile' to build the runtime libraries for this
language, such as `target-libobjc'.
`lang_dirs'
If defined, this variable lists (space-separated) top level
directories (parallel to `gcc'), apart from the runtime libraries,
that should not be configured if this front end is not built.
`build_by_default'
If defined to `no', this language front end is not built unless
enabled in a `--enable-languages' argument. Otherwise, front ends
are built by default, subject to any special logic in
`configure.ac' (as is present to disable the Ada front end if the
Ada compiler is not already installed).
`boot_language'
If defined to `yes', this front end is built in stage1 of the
bootstrap. This is only relevant to front ends written in their
own languages.
`compilers'
If defined, a space-separated list of compiler executables that
will be run by the driver. The names here will each end with
`\$(exeext)'.
`outputs'
If defined, a space-separated list of files that should be
generated by `configure' substituting values in them. This
mechanism can be used to create a file `LANGUAGE/Makefile' from
`LANGUAGE/Makefile.in', but this is deprecated, building
everything from the single `gcc/Makefile' is preferred.
`gtfiles'
If defined, a space-separated list of files that should be scanned
by `gengtype.c' to generate the garbage collection tables and
routines for this language. This excludes the files that are
common to all front ends. *Note Type Information::.
File: gccint.info, Node: Front End Makefile, Prev: Front End Config, Up: Front End
6.3.8.3 The Front End `Make-lang.in' File
.........................................
Each language subdirectory contains a `Make-lang.in' file. It contains
targets `LANG.HOOK' (where `LANG' is the setting of `language' in
`config-lang.in') for the following values of `HOOK', and any other
Makefile rules required to build those targets (which may if necessary
use other Makefiles specified in `outputs' in `config-lang.in',
although this is deprecated). It also adds any testsuite targets that
can use the standard rule in `gcc/Makefile.in' to the variable
`lang_checks'.
`all.cross'
`start.encap'
`rest.encap'
FIXME: exactly what goes in each of these targets?
`tags'
Build an `etags' `TAGS' file in the language subdirectory in the
source tree.
`info'
Build info documentation for the front end, in the build directory.
This target is only called by `make bootstrap' if a suitable
version of `makeinfo' is available, so does not need to check for
this, and should fail if an error occurs.
`dvi'
Build DVI documentation for the front end, in the build directory.
This should be done using `$(TEXI2DVI)', with appropriate `-I'
arguments pointing to directories of included files.
`pdf'
Build PDF documentation for the front end, in the build directory.
This should be done using `$(TEXI2PDF)', with appropriate `-I'
arguments pointing to directories of included files.
`html'
Build HTML documentation for the front end, in the build directory.
`man'
Build generated man pages for the front end from Texinfo manuals
(*note Man Page Generation::), in the build directory. This target
is only called if the necessary tools are available, but should
ignore errors so as not to stop the build if errors occur; man
pages are optional and the tools involved may be installed in a
broken way.
`install-common'
Install everything that is part of the front end, apart from the
compiler executables listed in `compilers' in `config-lang.in'.
`install-info'
Install info documentation for the front end, if it is present in
the source directory. This target should have dependencies on
info files that should be installed.
`install-man'
Install man pages for the front end. This target should ignore
errors.
`install-plugin'
Install headers needed for plugins.
`srcextra'
Copies its dependencies into the source directory. This generally
should be used for generated files such as Bison output files
which are not version-controlled, but should be included in any
release tarballs. This target will be executed during a bootstrap
if `--enable-generated-files-in-srcdir' was specified as a
`configure' option.
`srcinfo'
`srcman'
Copies its dependencies into the source directory. These targets
will be executed during a bootstrap if
`--enable-generated-files-in-srcdir' was specified as a
`configure' option.
`uninstall'
Uninstall files installed by installing the compiler. This is
currently documented not to be supported, so the hook need not do
anything.
`mostlyclean'
`clean'
`distclean'
`maintainer-clean'
The language parts of the standard GNU `*clean' targets. *Note
Standard Targets for Users: (standards)Standard Targets, for
details of the standard targets. For GCC, `maintainer-clean'
should delete all generated files in the source directory that are
not version-controlled, but should not delete anything that is.
`Make-lang.in' must also define a variable `LANG_OBJS' to a list of
host object files that are used by that language.
File: gccint.info, Node: Back End, Prev: Front End, Up: gcc Directory
6.3.9 Anatomy of a Target Back End
----------------------------------
A back end for a target architecture in GCC has the following parts:
* A directory `MACHINE' under `gcc/config', containing a machine
description `MACHINE.md' file (*note Machine Descriptions: Machine
Desc.), header files `MACHINE.h' and `MACHINE-protos.h' and a
source file `MACHINE.c' (*note Target Description Macros and
Functions: Target Macros.), possibly a target Makefile fragment
`t-MACHINE' (*note The Target Makefile Fragment: Target
Fragment.), and maybe some other files. The names of these files
may be changed from the defaults given by explicit specifications
in `config.gcc'.
* If necessary, a file `MACHINE-modes.def' in the `MACHINE'
directory, containing additional machine modes to represent
condition codes. *Note Condition Code::, for further details.
* An optional `MACHINE.opt' file in the `MACHINE' directory,
containing a list of target-specific options. You can also add
other option files using the `extra_options' variable in
`config.gcc'. *Note Options::.
* Entries in `config.gcc' (*note The `config.gcc' File: System
Config.) for the systems with this target architecture.
* Documentation in `gcc/doc/invoke.texi' for any command-line
options supported by this target (*note Run-time Target
Specification: Run-time Target.). This means both entries in the
summary table of options and details of the individual options.
* Documentation in `gcc/doc/extend.texi' for any target-specific
attributes supported (*note Defining target-specific uses of
`__attribute__': Target Attributes.), including where the same
attribute is already supported on some targets, which are
enumerated in the manual.
* Documentation in `gcc/doc/extend.texi' for any target-specific
pragmas supported.
* Documentation in `gcc/doc/extend.texi' of any target-specific
built-in functions supported.
* Documentation in `gcc/doc/extend.texi' of any target-specific
format checking styles supported.
* Documentation in `gcc/doc/md.texi' of any target-specific
constraint letters (*note Constraints for Particular Machines:
Machine Constraints.).
* A note in `gcc/doc/contrib.texi' under the person or people who
contributed the target support.
* Entries in `gcc/doc/install.texi' for all target triplets
supported with this target architecture, giving details of any
special notes about installation for this target, or saying that
there are no special notes if there are none.
* Possibly other support outside the `gcc' directory for runtime
libraries. FIXME: reference docs for this. The `libstdc++'
porting manual needs to be installed as info for this to work, or
to be a chapter of this manual.
If the back end is added to the official GCC source repository, the
following are also necessary:
* An entry for the target architecture in `readings.html' on the GCC
web site, with any relevant links.
* Details of the properties of the back end and target architecture
in `backends.html' on the GCC web site.
* A news item about the contribution of support for that target
architecture, in `index.html' on the GCC web site.
* Normally, one or more maintainers of that target listed in
`MAINTAINERS'. Some existing architectures may be unmaintained,
but it would be unusual to add support for a target that does not
have a maintainer when support is added.
File: gccint.info, Node: Testsuites, Next: Options, Prev: Source Tree, Up: Top
7 Testsuites
************
GCC contains several testsuites to help maintain compiler quality.
Most of the runtime libraries and language front ends in GCC have
testsuites. Currently only the C language testsuites are documented
here; FIXME: document the others.
* Menu:
* Test Idioms:: Idioms used in testsuite code.
* Test Directives:: Directives used within DejaGnu tests.
* Ada Tests:: The Ada language testsuites.
* C Tests:: The C language testsuites.
* libgcj Tests:: The Java library testsuites.
* LTO Testing:: Support for testing link-time optimizations.
* gcov Testing:: Support for testing gcov.
* profopt Testing:: Support for testing profile-directed optimizations.
* compat Testing:: Support for testing binary compatibility.
* Torture Tests:: Support for torture testing using multiple options.
File: gccint.info, Node: Test Idioms, Next: Test Directives, Up: Testsuites
7.1 Idioms Used in Testsuite Code
=================================
In general, C testcases have a trailing `-N.c', starting with `-1.c',
in case other testcases with similar names are added later. If the
test is a test of some well-defined feature, it should have a name
referring to that feature such as `FEATURE-1.c'. If it does not test a
well-defined feature but just happens to exercise a bug somewhere in
the compiler, and a bug report has been filed for this bug in the GCC
bug database, `prBUG-NUMBER-1.c' is the appropriate form of name.
Otherwise (for miscellaneous bugs not filed in the GCC bug database),
and previously more generally, test cases are named after the date on
which they were added. This allows people to tell at a glance whether
a test failure is because of a recently found bug that has not yet been
fixed, or whether it may be a regression, but does not give any other
information about the bug or where discussion of it may be found. Some
other language testsuites follow similar conventions.
In the `gcc.dg' testsuite, it is often necessary to test that an error
is indeed a hard error and not just a warning--for example, where it is
a constraint violation in the C standard, which must become an error
with `-pedantic-errors'. The following idiom, where the first line
shown is line LINE of the file and the line that generates the error,
is used for this:
/* { dg-bogus "warning" "warning in place of error" } */
/* { dg-error "REGEXP" "MESSAGE" { target *-*-* } LINE } */
It may be necessary to check that an expression is an integer constant
expression and has a certain value. To check that `E' has value `V',
an idiom similar to the following is used:
char x[((E) == (V) ? 1 : -1)];
In `gcc.dg' tests, `__typeof__' is sometimes used to make assertions
about the types of expressions. See, for example,
`gcc.dg/c99-condexpr-1.c'. The more subtle uses depend on the exact
rules for the types of conditional expressions in the C standard; see,
for example, `gcc.dg/c99-intconst-1.c'.
It is useful to be able to test that optimizations are being made
properly. This cannot be done in all cases, but it can be done where
the optimization will lead to code being optimized away (for example,
where flow analysis or alias analysis should show that certain code
cannot be called) or to functions not being called because they have
been expanded as built-in functions. Such tests go in
`gcc.c-torture/execute'. Where code should be optimized away, a call
to a nonexistent function such as `link_failure ()' may be inserted; a
definition
#ifndef __OPTIMIZE__
void
link_failure (void)
{
abort ();
}
#endif
will also be needed so that linking still succeeds when the test is run
without optimization. When all calls to a built-in function should
have been optimized and no calls to the non-built-in version of the
function should remain, that function may be defined as `static' to
call `abort ()' (although redeclaring a function as static may not work
on all targets).
All testcases must be portable. Target-specific testcases must have
appropriate code to avoid causing failures on unsupported systems;
unfortunately, the mechanisms for this differ by directory.
FIXME: discuss non-C testsuites here.
File: gccint.info, Node: Test Directives, Next: Ada Tests, Prev: Test Idioms, Up: Testsuites
7.2 Directives used within DejaGnu tests
========================================
* Menu:
* Directives:: Syntax and descriptions of test directives.
* Selectors:: Selecting targets to which a test applies.
* Effective-Target Keywords:: Keywords describing target attributes.
* Add Options:: Features for `dg-add-options'
* Require Support:: Variants of `dg-require-SUPPORT'
* Final Actions:: Commands for use in `dg-final'
File: gccint.info, Node: Directives, Next: Selectors, Up: Test Directives
7.2.1 Syntax and Descriptions of test directives
------------------------------------------------
Test directives appear within comments in a test source file and begin
with `dg-'. Some of these are defined within DejaGnu and others are
local to the GCC testsuite.
The order in which test directives appear in a test can be important:
directives local to GCC sometimes override information used by the
DejaGnu directives, which know nothing about the GCC directives, so the
DejaGnu directives must precede GCC directives.
Several test directives include selectors (*note Selectors::) which
are usually preceded by the keyword `target' or `xfail'.
7.2.1.1 Specify how to build the test
.....................................
`{ dg-do DO-WHAT-KEYWORD [{ target/xfail SELECTOR }] }'
DO-WHAT-KEYWORD specifies how the test is compiled and whether it
is executed. It is one of:
`preprocess'
Compile with `-E' to run only the preprocessor.
`compile'
Compile with `-S' to produce an assembly code file.
`assemble'
Compile with `-c' to produce a relocatable object file.
`link'
Compile, assemble, and link to produce an executable file.
`run'
Produce and run an executable file, which is expected to
return an exit code of 0.
The default is `compile'. That can be overridden for a set of
tests by redefining `dg-do-what-default' within the `.exp' file
for those tests.
If the directive includes the optional `{ target SELECTOR }' then
the test is skipped unless the target system matches the SELECTOR.
If DO-WHAT-KEYWORD is `run' and the directive includes the
optional `{ xfail SELECTOR }' and the selector is met then the
test is expected to fail. The `xfail' clause is ignored for other
values of DO-WHAT-KEYWORD; those tests can use directive
`dg-xfail-if'.
7.2.1.2 Specify additional compiler options
...........................................
`{ dg-options OPTIONS [{ target SELECTOR }] }'
This DejaGnu directive provides a list of compiler options, to be
used if the target system matches SELECTOR, that replace the
default options used for this set of tests.
`{ dg-add-options FEATURE ... }'
Add any compiler options that are needed to access certain
features. This directive does nothing on targets that enable the
features by default, or that don't provide them at all. It must
come after all `dg-options' directives. For supported values of
FEATURE see *note Add Options::.
7.2.1.3 Modify the test timeout value
.....................................
The normal timeout limit, in seconds, is found by searching the
following in order:
* the value defined by an earlier `dg-timeout' directive in the test
* variable TOOL_TIMEOUT defined by the set of tests
* GCC,TIMEOUT set in the target board
* 300
`{ dg-timeout N [{target SELECTOR }] }'
Set the time limit for the compilation and for the execution of
the test to the specified number of seconds.
`{ dg-timeout-factor X [{ target SELECTOR }] }'
Multiply the normal time limit for compilation and execution of
the test by the specified floating-point factor.
7.2.1.4 Skip a test for some targets
....................................
`{ dg-skip-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }'
Arguments INCLUDE-OPTS and EXCLUDE-OPTS are lists in which each
element is a string of zero or more GCC options. Skip the test if
all of the following conditions are met:
* the test system is included in SELECTOR
* for at least one of the option strings in INCLUDE-OPTS, every
option from that string is in the set of options with which
the test would be compiled; use `"*"' for an INCLUDE-OPTS list
that matches any options; that is the default if INCLUDE-OPTS
is not specified
* for each of the option strings in EXCLUDE-OPTS, at least one
option from that string is not in the set of options with
which the test would be compiled; use `""' for an empty
EXCLUDE-OPTS list; that is the default if EXCLUDE-OPTS is not
specified
For example, to skip a test if option `-Os' is present:
/* { dg-skip-if "" { *-*-* } { "-Os" } { "" } } */
To skip a test if both options `-O2' and `-g' are present:
/* { dg-skip-if "" { *-*-* } { "-O2 -g" } { "" } } */
To skip a test if either `-O2' or `-O3' is present:
/* { dg-skip-if "" { *-*-* } { "-O2" "-O3" } { "" } } */
To skip a test unless option `-Os' is present:
/* { dg-skip-if "" { *-*-* } { "*" } { "-Os" } } */
To skip a test if either `-O2' or `-O3' is used with `-g' but not
if `-fpic' is also present:
/* { dg-skip-if "" { *-*-* } { "-O2 -g" "-O3 -g" } { "-fpic" } } */
`{ dg-require-effective-target KEYWORD [{ SELECTOR }] }'
Skip the test if the test target, including current multilib flags,
is not covered by the effective-target keyword. If the directive
includes the optional `{ SELECTOR }' then the effective-target
test is only performed if the target system matches the SELECTOR.
This directive must appear after any `dg-do' directive in the test
and before any `dg-additional-sources' directive. *Note
Effective-Target Keywords::.
`{ dg-require-SUPPORT args }'
Skip the test if the target does not provide the required support.
These directives must appear after any `dg-do' directive in the
test and before any `dg-additional-sources' directive. They
require at least one argument, which can be an empty string if the
specific procedure does not examine the argument. *Note Require
Support::, for a complete list of these directives.
7.2.1.5 Expect a test to fail for some targets
..............................................
`{ dg-xfail-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }'
Expect the test to fail if the conditions (which are the same as
for `dg-skip-if') are met. This does not affect the execute step.
`{ dg-xfail-run-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }'
Expect the execute step of a test to fail if the conditions (which
are the same as for `dg-skip-if') are met.
7.2.1.6 Expect the test executable to fail
..........................................
`{ dg-shouldfail COMMENT [{ SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]]] }'
Expect the test executable to return a nonzero exit status if the
conditions (which are the same as for `dg-skip-if') are met.
7.2.1.7 Verify compiler messages
................................
`{ dg-error REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }'
This DejaGnu directive appears on a source line that is expected
to get an error message, or else specifies the source line
associated with the message. If there is no message for that line
or if the text of that message is not matched by REGEXP then the
check fails and COMMENT is included in the `FAIL' message. The
check does not look for the string `error' unless it is part of
REGEXP.
`{ dg-warning REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }'
This DejaGnu directive appears on a source line that is expected
to get a warning message, or else specifies the source line
associated with the message. If there is no message for that line
or if the text of that message is not matched by REGEXP then the
check fails and COMMENT is included in the `FAIL' message. The
check does not look for the string `warning' unless it is part of
REGEXP.
`{ dg-message REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }'
The line is expected to get a message other than an error or
warning. If there is no message for that line or if the text of
that message is not matched by REGEXP then the check fails and
COMMENT is included in the `FAIL' message.
`{ dg-bogus REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }'
This DejaGnu directive appears on a source line that should not
get a message matching REGEXP, or else specifies the source line
associated with the bogus message. It is usually used with `xfail'
to indicate that the message is a known problem for a particular
set of targets.
`{ dg-excess-errors COMMENT [{ target/xfail SELECTOR }] }'
This DejaGnu directive indicates that the test is expected to fail
due to compiler messages that are not handled by `dg-error',
`dg-warning' or `dg-bogus'. For this directive `xfail' has the
same effect as `target'.
`{ dg-prune-output REGEXP }'
Prune messages matching REGEXP from the test output.
7.2.1.8 Verify output of the test executable
............................................
`{ dg-output REGEXP [{ target/xfail SELECTOR }] }'
This DejaGnu directive compares REGEXP to the combined output that
the test executable writes to `stdout' and `stderr'.
7.2.1.9 Specify additional files for a test
...........................................
`{ dg-additional-files "FILELIST" }'
Specify additional files, other than source files, that must be
copied to the system where the compiler runs.
`{ dg-additional-sources "FILELIST" }'
Specify additional source files to appear in the compile line
following the main test file.
7.2.1.10 Add checks at the end of a test
........................................
`{ dg-final { LOCAL-DIRECTIVE } }'
This DejaGnu directive is placed within a comment anywhere in the
source file and is processed after the test has been compiled and
run. Multiple `dg-final' commands are processed in the order in
which they appear in the source file. *Note Final Actions::, for
a list of directives that can be used within `dg-final'.
File: gccint.info, Node: Selectors, Next: Effective-Target Keywords, Prev: Directives, Up: Test Directives
7.2.2 Selecting targets to which a test applies
-----------------------------------------------
Several test directives include SELECTORs to limit the targets for
which a test is run or to declare that a test is expected to fail on
particular targets.
A selector is:
* one or more target triplets, possibly including wildcard characters
* a single effective-target keyword (*note Effective-Target
Keywords::)
* a logical expression
Depending on the context, the selector specifies whether a test is
skipped and reported as unsupported or is expected to fail. Use
`*-*-*' to match any target.
A selector expression appears within curly braces and uses a single
logical operator: one of `!', `&&', or `||'. An operand is another
selector expression, an effective-target keyword, a single target
triplet, or a list of target triplets within quotes or curly braces.
For example:
{ target { ! "hppa*-*-* ia64*-*-*" } }
{ target { powerpc*-*-* && lp64 } }
{ xfail { lp64 || vect_no_align } }
File: gccint.info, Node: Effective-Target Keywords, Next: Add Options, Prev: Selectors, Up: Test Directives
7.2.3 Keywords describing target attributes
-------------------------------------------
Effective-target keywords identify sets of targets that support
particular functionality. They are used to limit tests to be run only
for particular targets, or to specify that particular sets of targets
are expected to fail some tests.
Effective-target keywords are defined in `lib/target-supports.exp' in
the GCC testsuite, with the exception of those that are documented as
being local to a particular test directory.
The `effective target' takes into account all of the compiler options
with which the test will be compiled, including the multilib options.
By convention, keywords ending in `_nocache' can also include options
specified for the particular test in an earlier `dg-options' or
`dg-add-options' directive.
7.2.3.1 Data type sizes
.......................
`ilp32'
Target has 32-bit `int', `long', and pointers.
`lp64'
Target has 32-bit `int', 64-bit `long' and pointers.
`llp64'
Target has 32-bit `int' and `long', 64-bit `long long' and
pointers.
`double64'
Target has 64-bit `double'.
`double64plus'
Target has `double' that is 64 bits or longer.
`int32plus'
Target has `int' that is at 32 bits or longer.
`int16'
Target has `int' that is 16 bits or shorter.
`large_double'
Target supports `double' that is longer than `float'.
`large_long_double'
Target supports `long double' that is longer than `double'.
`ptr32plus'
Target has pointers that are 32 bits or longer.
`size32plus'
Target supports array and structure sizes that are 32 bits or
longer.
`4byte_wchar_t'
Target has `wchar_t' that is at least 4 bytes.
7.2.3.2 Fortran-specific attributes
...................................
`fortran_integer_16'
Target supports Fortran `integer' that is 16 bytes or longer.
`fortran_large_int'
Target supports Fortran `integer' kinds larger than `integer(8)'.
`fortran_large_real'
Target supports Fortran `real' kinds larger than `real(8)'.
7.2.3.3 Vector-specific attributes
..................................
`vect_condition'
Target supports vector conditional operations.
`vect_double'
Target supports hardware vectors of `double'.
`vect_float'
Target supports hardware vectors of `float'.
`vect_int'
Target supports hardware vectors of `int'.
`vect_long'
Target supports hardware vectors of `long'.
`vect_long_long'
Target supports hardware vectors of `long long'.
`vect_aligned_arrays'
Target aligns arrays to vector alignment boundary.
`vect_hw_misalign'
Target supports a vector misalign access.
`vect_no_align'
Target does not support a vector alignment mechanism.
`vect_no_int_max'
Target does not support a vector max instruction on `int'.
`vect_no_int_add'
Target does not support a vector add instruction on `int'.
`vect_no_bitwise'
Target does not support vector bitwise instructions.
`vect_char_mult'
Target supports `vector char' multiplication.
`vect_short_mult'
Target supports `vector short' multiplication.
`vect_int_mult'
Target supports `vector int' multiplication.
`vect_extract_even_odd'
Target supports vector even/odd element extraction.
`vect_extract_even_odd_wide'
Target supports vector even/odd element extraction of vectors with
elements `SImode' or larger.
`vect_interleave'
Target supports vector interleaving.
`vect_strided'
Target supports vector interleaving and extract even/odd.
`vect_strided_wide'
Target supports vector interleaving and extract even/odd for wide
element types.
`vect_perm'
Target supports vector permutation.
`vect_shift'
Target supports a hardware vector shift operation.
`vect_widen_sum_hi_to_si'
Target supports a vector widening summation of `short' operands
into `int' results, or can promote (unpack) from `short' to `int'.
`vect_widen_sum_qi_to_hi'
Target supports a vector widening summation of `char' operands
into `short' results, or can promote (unpack) from `char' to
`short'.
`vect_widen_sum_qi_to_si'
Target supports a vector widening summation of `char' operands
into `int' results.
`vect_widen_mult_qi_to_hi'
Target supports a vector widening multiplication of `char' operands
into `short' results, or can promote (unpack) from `char' to
`short' and perform non-widening multiplication of `short'.
`vect_widen_mult_hi_to_si'
Target supports a vector widening multiplication of `short'
operands into `int' results, or can promote (unpack) from `short'
to `int' and perform non-widening multiplication of `int'.
`vect_sdot_qi'
Target supports a vector dot-product of `signed char'.
`vect_udot_qi'
Target supports a vector dot-product of `unsigned char'.
`vect_sdot_hi'
Target supports a vector dot-product of `signed short'.
`vect_udot_hi'
Target supports a vector dot-product of `unsigned short'.
`vect_pack_trunc'
Target supports a vector demotion (packing) of `short' to `char'
and from `int' to `short' using modulo arithmetic.
`vect_unpack'
Target supports a vector promotion (unpacking) of `char' to `short'
and from `char' to `int'.
`vect_intfloat_cvt'
Target supports conversion from `signed int' to `float'.
`vect_uintfloat_cvt'
Target supports conversion from `unsigned int' to `float'.
`vect_floatint_cvt'
Target supports conversion from `float' to `signed int'.
`vect_floatuint_cvt'
Target supports conversion from `float' to `unsigned int'.
7.2.3.4 Thread Local Storage attributes
.......................................
`tls'
Target supports thread-local storage.
`tls_native'
Target supports native (rather than emulated) thread-local storage.
`tls_runtime'
Test system supports executing TLS executables.
7.2.3.5 Decimal floating point attributes
.........................................
`dfp'
Targets supports compiling decimal floating point extension to C.
`dfp_nocache'
Including the options used to compile this particular test, the
target supports compiling decimal floating point extension to C.
`dfprt'
Test system can execute decimal floating point tests.
`dfprt_nocache'
Including the options used to compile this particular test, the
test system can execute decimal floating point tests.
`hard_dfp'
Target generates decimal floating point instructions with current
options.
7.2.3.6 ARM-specific attributes
...............................
`arm32'
ARM target generates 32-bit code.
`arm_eabi'
ARM target adheres to the ABI for the ARM Architecture.
`arm_hard_vfp_ok'
ARM target supports `-mfpu=vfp -mfloat-abi=hard'. Some multilibs
may be incompatible with these options.
`arm_iwmmxt_ok'
ARM target supports `-mcpu=iwmmxt'. Some multilibs may be
incompatible with this option.
`arm_neon'
ARM target supports generating NEON instructions.
`arm_neon_hw'
Test system supports executing NEON instructions.
`arm_neon_ok'
ARM Target supports `-mfpu=neon -mfloat-abi=softfp' or compatible
options. Some multilibs may be incompatible with these options.
`arm_neon_fp16_ok'
ARM Target supports `-mfpu=neon-fp16 -mfloat-abi=softfp' or
compatible options. Some multilibs may be incompatible with these
options.
`arm_thumb1_ok'
ARM target generates Thumb-1 code for `-mthumb'.
`arm_thumb2_ok'
ARM target generates Thumb-2 code for `-mthumb'.
`arm_vfp_ok'
ARM target supports `-mfpu=vfp -mfloat-abi=softfp'. Some
multilibs may be incompatible with these options.
7.2.3.7 MIPS-specific attributes
................................
`mips64'
MIPS target supports 64-bit instructions.
`nomips16'
MIPS target does not produce MIPS16 code.
`mips16_attribute'
MIPS target can generate MIPS16 code.
`mips_loongson'
MIPS target is a Loongson-2E or -2F target using an ABI that
supports the Loongson vector modes.
`mips_newabi_large_long_double'
MIPS target supports `long double' larger than `double' when using
the new ABI.
`mpaired_single'
MIPS target supports `-mpaired-single'.
7.2.3.8 PowerPC-specific attributes
...................................
`powerpc64'
Test system supports executing 64-bit instructions.
`powerpc_altivec'
PowerPC target supports AltiVec.
`powerpc_altivec_ok'
PowerPC target supports `-maltivec'.
`powerpc_fprs'
PowerPC target supports floating-point registers.
`powerpc_hard_double'
PowerPC target supports hardware double-precision floating-point.
`powerpc_ppu_ok'
PowerPC target supports `-mcpu=cell'.
`powerpc_spe'
PowerPC target supports PowerPC SPE.
`powerpc_spe_nocache'
Including the options used to compile this particular test, the
PowerPC target supports PowerPC SPE.
`powerpc_spu'
PowerPC target supports PowerPC SPU.
`spu_auto_overlay'
SPU target has toolchain that supports automatic overlay
generation.
`powerpc_vsx_ok'
PowerPC target supports `-mvsx'.
`powerpc_405_nocache'
Including the options used to compile this particular test, the
PowerPC target supports PowerPC 405.
`vmx_hw'
PowerPC target supports executing AltiVec instructions.
7.2.3.9 Other hardware attributes
.................................
`avx'
Target supports compiling `avx' instructions.
`avx_runtime'
Target supports the execution of `avx' instructions.
`cell_hw'
Test system can execute AltiVec and Cell PPU instructions.
`coldfire_fpu'
Target uses a ColdFire FPU.
`hard_float'
Target supports FPU instructions.
`sse'
Target supports compiling `sse' instructions.
`sse_runtime'
Target supports the execution of `sse' instructions.
`sse2'
Target supports compiling `sse2' instructions.
`sse2_runtime'
Target supports the execution of `sse2' instructions.
`sync_char_short'
Target supports atomic operations on `char' and `short'.
`sync_int_long'
Target supports atomic operations on `int' and `long'.
`ultrasparc_hw'
Test environment appears to run executables on a simulator that
accepts only `EM_SPARC' executables and chokes on `EM_SPARC32PLUS'
or `EM_SPARCV9' executables.
`vect_cmdline_needed'
Target requires a command line argument to enable a SIMD
instruction set.
7.2.3.10 Environment attributes
...............................
`c'
The language for the compiler under test is C.
`c++'
The language for the compiler under test is C++.
`c99_runtime'
Target provides a full C99 runtime.
`correct_iso_cpp_string_wchar_protos'
Target `string.h' and `wchar.h' headers provide C++ required
overloads for `strchr' etc. functions.
`dummy_wcsftime'
Target uses a dummy `wcsftime' function that always returns zero.
`fd_truncate'
Target can truncate a file from a file descriptor, as used by
`libgfortran/io/unix.c:fd_truncate'; i.e. `ftruncate' or `chsize'.
`freestanding'
Target is `freestanding' as defined in section 4 of the C99
standard. Effectively, it is a target which supports no extra
headers or libraries other than what is considered essential.
`init_priority'
Target supports constructors with initialization priority
arguments.
`inttypes_types'
Target has the basic signed and unsigned types in `inttypes.h'.
This is for tests that GCC's notions of these types agree with
those in the header, as some systems have only `inttypes.h'.
`lax_strtofp'
Target might have errors of a few ULP in string to floating-point
conversion functions and overflow is not always detected correctly
by those functions.
`newlib'
Target supports Newlib.
`pow10'
Target provides `pow10' function.
`pthread'
Target can compile using `pthread.h' with no errors or warnings.
`pthread_h'
Target has `pthread.h'.
`run_expensive_tests'
Expensive testcases (usually those that consume excessive amounts
of CPU time) should be run on this target. This can be enabled by
setting the `GCC_TEST_RUN_EXPENSIVE' environment variable to a
non-empty string.
`simulator'
Test system runs executables on a simulator (i.e. slowly) rather
than hardware (i.e. fast).
`stdint_types'
Target has the basic signed and unsigned C types in `stdint.h'.
This will be obsolete when GCC ensures a working `stdint.h' for
all targets.
`trampolines'
Target supports trampolines.
`uclibc'
Target supports uClibc.
`unwrapped'
Target does not use a status wrapper.
`vxworks_kernel'
Target is a VxWorks kernel.
`vxworks_rtp'
Target is a VxWorks RTP.
`wchar'
Target supports wide characters.
7.2.3.11 Other attributes
.........................
`automatic_stack_alignment'
Target supports automatic stack alignment.
`cxa_atexit'
Target uses `__cxa_atexit'.
`default_packed'
Target has packed layout of structure members by default.
`fgraphite'
Target supports Graphite optimizations.
`fixed_point'
Target supports fixed-point extension to C.
`fopenmp'
Target supports OpenMP via `-fopenmp'.
`fpic'
Target supports `-fpic' and `-fPIC'.
`freorder'
Target supports `-freorder-blocks-and-partition'.
`fstack_protector'
Target supports `-fstack-protector'.
`gas'
Target uses GNU `as'.
`gc_sections'
Target supports `--gc-sections'.
`keeps_null_pointer_checks'
Target keeps null pointer checks, either due to the use of
`-fno-delete-null-pointer-checks' or hardwired into the target.
`lto'
Compiler has been configured to support link-time optimization
(LTO).
`named_sections'
Target supports named sections.
`natural_alignment_32'
Target uses natural alignment (aligned to type size) for types of
32 bits or less.
`target_natural_alignment_64'
Target uses natural alignment (aligned to type size) for types of
64 bits or less.
`nonpic'
Target does not generate PIC by default.
`pcc_bitfield_type_matters'
Target defines `PCC_BITFIELD_TYPE_MATTERS'.
`pe_aligned_commons'
Target supports `-mpe-aligned-commons'.
`section_anchors'
Target supports section anchors.
`short_enums'
Target defaults to short enums.
`static'
Target supports `-static'.
`static_libgfortran'
Target supports statically linking `libgfortran'.
`string_merging'
Target supports merging string constants at link time.
`ucn'
Target supports compiling and assembling UCN.
`ucn_nocache'
Including the options used to compile this particular test, the
target supports compiling and assembling UCN.
`unaligned_stack'
Target does not guarantee that its `STACK_BOUNDARY' is greater than
or equal to the required vector alignment.
`vector_alignment_reachable'
Vector alignment is reachable for types of 32 bits or less.
`vector_alignment_reachable_for_64bit'
Vector alignment is reachable for types of 64 bits or less.
`wchar_t_char16_t_compatible'
Target supports `wchar_t' that is compatible with `char16_t'.
`wchar_t_char32_t_compatible'
Target supports `wchar_t' that is compatible with `char32_t'.
7.2.3.12 Local to tests in `gcc.target/i386'
............................................
`3dnow'
Target supports compiling `3dnow' instructions.
`aes'
Target supports compiling `aes' instructions.
`fma4'
Target supports compiling `fma4' instructions.
`ms_hook_prologue'
Target supports attribute `ms_hook_prologue'.
`pclmul'
Target supports compiling `pclmul' instructions.
`sse3'
Target supports compiling `sse3' instructions.
`sse4'
Target supports compiling `sse4' instructions.
`sse4a'
Target supports compiling `sse4a' instructions.
`ssse3'
Target supports compiling `ssse3' instructions.
`vaes'
Target supports compiling `vaes' instructions.
`vpclmul'
Target supports compiling `vpclmul' instructions.
`xop'
Target supports compiling `xop' instructions.
7.2.3.13 Local to tests in `gcc.target/spu/ea'
..............................................
`ealib'
Target `__ea' library functions are available.
7.2.3.14 Local to tests in `gcc.test-framework'
...............................................
`no'
Always returns 0.
`yes'
Always returns 1.
File: gccint.info, Node: Add Options, Next: Require Support, Prev: Effective-Target Keywords, Up: Test Directives
7.2.4 Features for `dg-add-options'
-----------------------------------
The supported values of FEATURE for directive `dg-add-options' are:
`arm_neon'
NEON support. Only ARM targets support this feature, and only then
in certain modes; see the *note arm_neon_ok effective target
keyword: arm_neon_ok.
`arm_neon_fp16'
NEON and half-precision floating point support. Only ARM targets
support this feature, and only then in certain modes; see the
*note arm_neon_fp16_ok effective target keyword: arm_neon_ok.
`bind_pic_locally'
Add the target-specific flags needed to enable functions to bind
locally when using pic/PIC passes in the testsuite.
`c99_runtime'
Add the target-specific flags needed to access the C99 runtime.
`ieee'
Add the target-specific flags needed to enable full IEEE
compliance mode.
`mips16_attribute'
`mips16' function attributes. Only MIPS targets support this
feature, and only then in certain modes.
`tls'
Add the target-specific flags needed to use thread-local storage.
File: gccint.info, Node: Require Support, Next: Final Actions, Prev: Add Options, Up: Test Directives
7.2.5 Variants of `dg-require-SUPPORT'
--------------------------------------
A few of the `dg-require' directives take arguments.
`dg-require-iconv CODESET'
Skip the test if the target does not support iconv. CODESET is
the codeset to convert to.
`dg-require-profiling PROFOPT'
Skip the test if the target does not support profiling with option
PROFOPT.
`dg-require-visibility VIS'
Skip the test if the target does not support the `visibility'
attribute. If VIS is `""', support for `visibility("hidden")' is
checked, for `visibility("VIS")' otherwise.
The original `dg-require' directives were defined before there was
support for effective-target keywords. The directives that do not take
arguments could be replaced with effective-target keywords.
`dg-require-alias ""'
Skip the test if the target does not support the `alias' attribute.
`dg-require-ascii-locale ""'
Skip the test if the host does not support an ASCII locale.
`dg-require-compat-dfp ""'
Skip this test unless both compilers in a `compat' testsuite
support decimal floating point.
`dg-require-cxa-atexit ""'
Skip the test if the target does not support `__cxa_atexit'. This
is equivalent to `dg-require-effective-target cxa_atexit'.
`dg-require-dll ""'
Skip the test if the target does not support DLL attributes.
`dg-require-fork ""'
Skip the test if the target does not support `fork'.
`dg-require-gc-sections ""'
Skip the test if the target's linker does not support the
`--gc-sections' flags. This is equivalent to
`dg-require-effective-target gc-sections'.
`dg-require-host-local ""'
Skip the test if the host is remote, rather than the same as the
build system. Some tests are incompatible with DejaGnu's handling
of remote hosts, which involves copying the source file to the
host and compiling it with a relative path and "`-o a.out'".
`dg-require-mkfifo ""'
Skip the test if the target does not support `mkfifo'.
`dg-require-named-sections ""'
Skip the test is the target does not support named sections. This
is equivalent to `dg-require-effective-target named_sections'.
`dg-require-weak ""'
Skip the test if the target does not support weak symbols.
`dg-require-weak-override ""'
Skip the test if the target does not support overriding weak
symbols.
File: gccint.info, Node: Final Actions, Prev: Require Support, Up: Test Directives
7.2.6 Commands for use in `dg-final'
------------------------------------
The GCC testsuite defines the following directives to be used within
`dg-final'.
7.2.6.1 Scan a particular file
..............................
`scan-file FILENAME REGEXP [{ target/xfail SELECTOR }]'
Passes if REGEXP matches text in FILENAME.
`scan-file-not FILENAME REGEXP [{ target/xfail SELECTOR }]'
Passes if REGEXP does not match text in FILENAME.
`scan-module MODULE REGEXP [{ target/xfail SELECTOR }]'
Passes if REGEXP matches in Fortran module MODULE.
7.2.6.2 Scan the assembly output
................................
`scan-assembler REGEX [{ target/xfail SELECTOR }]'
Passes if REGEX matches text in the test's assembler output.
`scan-assembler-not REGEX [{ target/xfail SELECTOR }]'
Passes if REGEX does not match text in the test's assembler output.
`scan-assembler-times REGEX NUM [{ target/xfail SELECTOR }]'
Passes if REGEX is matched exactly NUM times in the test's
assembler output.
`scan-assembler-dem REGEX [{ target/xfail SELECTOR }]'
Passes if REGEX matches text in the test's demangled assembler
output.
`scan-assembler-dem-not REGEX [{ target/xfail SELECTOR }]'
Passes if REGEX does not match text in the test's demangled
assembler output.
`scan-hidden SYMBOL [{ target/xfail SELECTOR }]'
Passes if SYMBOL is defined as a hidden symbol in the test's
assembly output.
`scan-not-hidden SYMBOL [{ target/xfail SELECTOR }]'
Passes if SYMBOL is not defined as a hidden symbol in the test's
assembly output.
7.2.6.3 Scan optimization dump files
....................................
These commands are available for KIND of `tree', `rtl', and `ipa'.
`scan-KIND-dump REGEX SUFFIX [{ target/xfail SELECTOR }]'
Passes if REGEX matches text in the dump file with suffix SUFFIX.
`scan-KIND-dump-not REGEX SUFFIX [{ target/xfail SELECTOR }]'
Passes if REGEX does not match text in the dump file with suffix
SUFFIX.
`scan-KIND-dump-times REGEX NUM SUFFIX [{ target/xfail SELECTOR }]'
Passes if REGEX is found exactly NUM times in the dump file with
suffix SUFFIX.
`scan-KIND-dump-dem REGEX SUFFIX [{ target/xfail SELECTOR }]'
Passes if REGEX matches demangled text in the dump file with
suffix SUFFIX.
`scan-KIND-dump-dem-not REGEX SUFFIX [{ target/xfail SELECTOR }]'
Passes if REGEX does not match demangled text in the dump file with
suffix SUFFIX.
7.2.6.4 Verify that an output files exists or not
.................................................
`output-exists [{ target/xfail SELECTOR }]'
Passes if compiler output file exists.
`output-exists-not [{ target/xfail SELECTOR }]'
Passes if compiler output file does not exist.
7.2.6.5 Check for LTO tests
...........................
`scan-symbol REGEXP [{ target/xfail SELECTOR }]'
Passes if the pattern is present in the final executable.
7.2.6.6 Checks for `gcov' tests
...............................
`run-gcov SOURCEFILE'
Check line counts in `gcov' tests.
`run-gcov [branches] [calls] { OPTS SOURCEFILE }'
Check branch and/or call counts, in addition to line counts, in
`gcov' tests.
7.2.6.7 Clean up generated test files
.....................................
`cleanup-coverage-files'
Removes coverage data files generated for this test.
`cleanup-ipa-dump SUFFIX'
Removes IPA dump files generated for this test.
`cleanup-modules'
Removes Fortran module files generated for this test.
`cleanup-profile-file'
Removes profiling files generated for this test.
`cleanup-repo-files'
Removes files generated for this test for `-frepo'.
`cleanup-rtl-dump SUFFIX'
Removes RTL dump files generated for this test.
`cleanup-saved-temps'
Removes files for the current test which were kept for
`-save-temps'.
`cleanup-tree-dump SUFFIX'
Removes tree dump files matching SUFFIX which were generated for
this test.
File: gccint.info, Node: Ada Tests, Next: C Tests, Prev: Test Directives, Up: Testsuites
7.3 Ada Language Testsuites
===========================
The Ada testsuite includes executable tests from the ACATS 2.5
testsuite, publicly available at
`http://www.adaic.org/compilers/acats/2.5'.
These tests are integrated in the GCC testsuite in the `ada/acats'
directory, and enabled automatically when running `make check', assuming
the Ada language has been enabled when configuring GCC.
You can also run the Ada testsuite independently, using `make
check-ada', or run a subset of the tests by specifying which chapter to
run, e.g.:
$ make check-ada CHAPTERS="c3 c9"
The tests are organized by directory, each directory corresponding to
a chapter of the Ada Reference Manual. So for example, `c9' corresponds
to chapter 9, which deals with tasking features of the language.
There is also an extra chapter called `gcc' containing a template for
creating new executable tests, although this is deprecated in favor of
the `gnat.dg' testsuite.
The tests are run using two `sh' scripts: `run_acats' and
`run_all.sh'. To run the tests using a simulator or a cross target,
see the small customization section at the top of `run_all.sh'.
These tests are run using the build tree: they can be run without doing
a `make install'.
File: gccint.info, Node: C Tests, Next: libgcj Tests, Prev: Ada Tests, Up: Testsuites
7.4 C Language Testsuites
=========================
GCC contains the following C language testsuites, in the
`gcc/testsuite' directory:
`gcc.dg'
This contains tests of particular features of the C compiler,
using the more modern `dg' harness. Correctness tests for various
compiler features should go here if possible.
Magic comments determine whether the file is preprocessed,
compiled, linked or run. In these tests, error and warning
message texts are compared against expected texts or regular
expressions given in comments. These tests are run with the
options `-ansi -pedantic' unless other options are given in the
test. Except as noted below they are not run with multiple
optimization options.
`gcc.dg/compat'
This subdirectory contains tests for binary compatibility using
`lib/compat.exp', which in turn uses the language-independent
support (*note Support for testing binary compatibility: compat
Testing.).
`gcc.dg/cpp'
This subdirectory contains tests of the preprocessor.
`gcc.dg/debug'
This subdirectory contains tests for debug formats. Tests in this
subdirectory are run for each debug format that the compiler
supports.
`gcc.dg/format'
This subdirectory contains tests of the `-Wformat' format
checking. Tests in this directory are run with and without
`-DWIDE'.
`gcc.dg/noncompile'
This subdirectory contains tests of code that should not compile
and does not need any special compilation options. They are run
with multiple optimization options, since sometimes invalid code
crashes the compiler with optimization.
`gcc.dg/special'
FIXME: describe this.
`gcc.c-torture'
This contains particular code fragments which have historically
broken easily. These tests are run with multiple optimization
options, so tests for features which only break at some
optimization levels belong here. This also contains tests to
check that certain optimizations occur. It might be worthwhile to
separate the correctness tests cleanly from the code quality
tests, but it hasn't been done yet.
`gcc.c-torture/compat'
FIXME: describe this.
This directory should probably not be used for new tests.
`gcc.c-torture/compile'
This testsuite contains test cases that should compile, but do not
need to link or run. These test cases are compiled with several
different combinations of optimization options. All warnings are
disabled for these test cases, so this directory is not suitable if
you wish to test for the presence or absence of compiler warnings.
While special options can be set, and tests disabled on specific
platforms, by the use of `.x' files, mostly these test cases
should not contain platform dependencies. FIXME: discuss how
defines such as `NO_LABEL_VALUES' and `STACK_SIZE' are used.
`gcc.c-torture/execute'
This testsuite contains test cases that should compile, link and
run; otherwise the same comments as for `gcc.c-torture/compile'
apply.
`gcc.c-torture/execute/ieee'
This contains tests which are specific to IEEE floating point.
`gcc.c-torture/unsorted'
FIXME: describe this.
This directory should probably not be used for new tests.
`gcc.misc-tests'
This directory contains C tests that require special handling.
Some of these tests have individual expect files, and others share
special-purpose expect files:
``bprob*.c''
Test `-fbranch-probabilities' using
`gcc.misc-tests/bprob.exp', which in turn uses the generic,
language-independent framework (*note Support for testing
profile-directed optimizations: profopt Testing.).
``gcov*.c''
Test `gcov' output using `gcov.exp', which in turn uses the
language-independent support (*note Support for testing gcov:
gcov Testing.).
``i386-pf-*.c''
Test i386-specific support for data prefetch using
`i386-prefetch.exp'.
`gcc.test-framework'
``dg-*.c''
Test the testsuite itself using
`gcc.test-framework/test-framework.exp'.
FIXME: merge in `testsuite/README.gcc' and discuss the format of test
cases and magic comments more.
File: gccint.info, Node: libgcj Tests, Next: LTO Testing, Prev: C Tests, Up: Testsuites
7.5 The Java library testsuites.
================================
Runtime tests are executed via `make check' in the
`TARGET/libjava/testsuite' directory in the build tree. Additional
runtime tests can be checked into this testsuite.
Regression testing of the core packages in libgcj is also covered by
the Mauve testsuite. The Mauve Project develops tests for the Java
Class Libraries. These tests are run as part of libgcj testing by
placing the Mauve tree within the libjava testsuite sources at
`libjava/testsuite/libjava.mauve/mauve', or by specifying the location
of that tree when invoking `make', as in `make MAUVEDIR=~/mauve check'.
To detect regressions, a mechanism in `mauve.exp' compares the
failures for a test run against the list of expected failures in
`libjava/testsuite/libjava.mauve/xfails' from the source hierarchy.
Update this file when adding new failing tests to Mauve, or when fixing
bugs in libgcj that had caused Mauve test failures.
We encourage developers to contribute test cases to Mauve.
File: gccint.info, Node: LTO Testing, Next: gcov Testing, Prev: libgcj Tests, Up: Testsuites
7.6 Support for testing link-time optimizations
===============================================
Tests for link-time optimizations usually require multiple source files
that are compiled separately, perhaps with different sets of options.
There are several special-purpose test directives used for these tests.
`{ dg-lto-do DO-WHAT-KEYWORD }'
DO-WHAT-KEYWORD specifies how the test is compiled and whether it
is executed. It is one of:
`assemble'
Compile with `-c' to produce a relocatable object file.
`link'
Compile, assemble, and link to produce an executable file.
`run'
Produce and run an executable file, which is expected to
return an exit code of 0.
The default is `assemble'. That can be overridden for a set of
tests by redefining `dg-do-what-default' within the `.exp' file
for those tests.
Unlike `dg-do', `dg-lto-do' does not support an optional `target'
or `xfail' list. Use `dg-skip-if', `dg-xfail-if', or
`dg-xfail-run-if'.
`{ dg-lto-options { { OPTIONS } [{ OPTIONS }] } [{ target SELECTOR }]}'
This directive provides a list of one or more sets of compiler
options to override LTO_OPTIONS. Each test will be compiled and
run with each of these sets of options.
`{ dg-extra-ld-options OPTIONS [{ target SELECTOR }]}'
This directive adds OPTIONS to the linker options used.
`{ dg-suppress-ld-options OPTIONS [{ target SELECTOR }]}'
This directive removes OPTIONS from the set of linker options used.
File: gccint.info, Node: gcov Testing, Next: profopt Testing, Prev: LTO Testing, Up: Testsuites
7.7 Support for testing `gcov'
==============================
Language-independent support for testing `gcov', and for checking that
branch profiling produces expected values, is provided by the expect
file `lib/gcov.exp'. `gcov' tests also rely on procedures in
`lib/gcc-dg.exp' to compile and run the test program. A typical `gcov'
test contains the following DejaGnu commands within comments:
{ dg-options "-fprofile-arcs -ftest-coverage" }
{ dg-do run { target native } }
{ dg-final { run-gcov sourcefile } }
Checks of `gcov' output can include line counts, branch percentages,
and call return percentages. All of these checks are requested via
commands that appear in comments in the test's source file. Commands
to check line counts are processed by default. Commands to check
branch percentages and call return percentages are processed if the
`run-gcov' command has arguments `branches' or `calls', respectively.
For example, the following specifies checking both, as well as passing
`-b' to `gcov':
{ dg-final { run-gcov branches calls { -b sourcefile } } }
A line count command appears within a comment on the source line that
is expected to get the specified count and has the form `count(CNT)'.
A test should only check line counts for lines that will get the same
count for any architecture.
Commands to check branch percentages (`branch') and call return
percentages (`returns') are very similar to each other. A beginning
command appears on or before the first of a range of lines that will
report the percentage, and the ending command follows that range of
lines. The beginning command can include a list of percentages, all of
which are expected to be found within the range. A range is terminated
by the next command of the same kind. A command `branch(end)' or
`returns(end)' marks the end of a range without starting a new one.
For example:
if (i > 10 && j > i && j < 20) /* branch(27 50 75) */
/* branch(end) */
foo (i, j);
For a call return percentage, the value specified is the percentage of
calls reported to return. For a branch percentage, the value is either
the expected percentage or 100 minus that value, since the direction of
a branch can differ depending on the target or the optimization level.
Not all branches and calls need to be checked. A test should not
check for branches that might be optimized away or replaced with
predicated instructions. Don't check for calls inserted by the
compiler or ones that might be inlined or optimized away.
A single test can check for combinations of line counts, branch
percentages, and call return percentages. The command to check a line
count must appear on the line that will report that count, but commands
to check branch percentages and call return percentages can bracket the
lines that report them.
File: gccint.info, Node: profopt Testing, Next: compat Testing, Prev: gcov Testing, Up: Testsuites
7.8 Support for testing profile-directed optimizations
======================================================
The file `profopt.exp' provides language-independent support for
checking correct execution of a test built with profile-directed
optimization. This testing requires that a test program be built and
executed twice. The first time it is compiled to generate profile
data, and the second time it is compiled to use the data that was
generated during the first execution. The second execution is to
verify that the test produces the expected results.
To check that the optimization actually generated better code, a test
can be built and run a third time with normal optimizations to verify
that the performance is better with the profile-directed optimizations.
`profopt.exp' has the beginnings of this kind of support.
`profopt.exp' provides generic support for profile-directed
optimizations. Each set of tests that uses it provides information
about a specific optimization:
`tool'
tool being tested, e.g., `gcc'
`profile_option'
options used to generate profile data
`feedback_option'
options used to optimize using that profile data
`prof_ext'
suffix of profile data files
`PROFOPT_OPTIONS'
list of options with which to run each test, similar to the lists
for torture tests
`{ dg-final-generate { LOCAL-DIRECTIVE } }'
This directive is similar to `dg-final', but the LOCAL-DIRECTIVE
is run after the generation of profile data.
`{ dg-final-use { LOCAL-DIRECTIVE } }'
The LOCAL-DIRECTIVE is run after the profile data have been used.
File: gccint.info, Node: compat Testing, Next: Torture Tests, Prev: profopt Testing, Up: Testsuites
7.9 Support for testing binary compatibility
============================================
The file `compat.exp' provides language-independent support for binary
compatibility testing. It supports testing interoperability of two
compilers that follow the same ABI, or of multiple sets of compiler
options that should not affect binary compatibility. It is intended to
be used for testsuites that complement ABI testsuites.
A test supported by this framework has three parts, each in a separate
source file: a main program and two pieces that interact with each
other to split up the functionality being tested.
`TESTNAME_main.SUFFIX'
Contains the main program, which calls a function in file
`TESTNAME_x.SUFFIX'.
`TESTNAME_x.SUFFIX'
Contains at least one call to a function in `TESTNAME_y.SUFFIX'.
`TESTNAME_y.SUFFIX'
Shares data with, or gets arguments from, `TESTNAME_x.SUFFIX'.
Within each test, the main program and one functional piece are
compiled by the GCC under test. The other piece can be compiled by an
alternate compiler. If no alternate compiler is specified, then all
three source files are all compiled by the GCC under test. You can
specify pairs of sets of compiler options. The first element of such a
pair specifies options used with the GCC under test, and the second
element of the pair specifies options used with the alternate compiler.
Each test is compiled with each pair of options.
`compat.exp' defines default pairs of compiler options. These can be
overridden by defining the environment variable `COMPAT_OPTIONS' as:
COMPAT_OPTIONS="[list [list {TST1} {ALT1}]
...[list {TSTN} {ALTN}]]"
where TSTI and ALTI are lists of options, with TSTI used by the
compiler under test and ALTI used by the alternate compiler. For
example, with `[list [list {-g -O0} {-O3}] [list {-fpic} {-fPIC -O2}]]',
the test is first built with `-g -O0' by the compiler under test and
with `-O3' by the alternate compiler. The test is built a second time
using `-fpic' by the compiler under test and `-fPIC -O2' by the
alternate compiler.
An alternate compiler is specified by defining an environment variable
to be the full pathname of an installed compiler; for C define
`ALT_CC_UNDER_TEST', and for C++ define `ALT_CXX_UNDER_TEST'. These
will be written to the `site.exp' file used by DejaGnu. The default is
to build each test with the compiler under test using the first of each
pair of compiler options from `COMPAT_OPTIONS'. When
`ALT_CC_UNDER_TEST' or `ALT_CXX_UNDER_TEST' is `same', each test is
built using the compiler under test but with combinations of the
options from `COMPAT_OPTIONS'.
To run only the C++ compatibility suite using the compiler under test
and another version of GCC using specific compiler options, do the
following from `OBJDIR/gcc':
rm site.exp
make -k \
ALT_CXX_UNDER_TEST=${alt_prefix}/bin/g++ \
COMPAT_OPTIONS="LISTS AS SHOWN ABOVE" \
check-c++ \
RUNTESTFLAGS="compat.exp"
A test that fails when the source files are compiled with different
compilers, but passes when the files are compiled with the same
compiler, demonstrates incompatibility of the generated code or runtime
support. A test that fails for the alternate compiler but passes for
the compiler under test probably tests for a bug that was fixed in the
compiler under test but is present in the alternate compiler.
The binary compatibility tests support a small number of test framework
commands that appear within comments in a test file.
`dg-require-*'
These commands can be used in `TESTNAME_main.SUFFIX' to skip the
test if specific support is not available on the target.
`dg-options'
The specified options are used for compiling this particular source
file, appended to the options from `COMPAT_OPTIONS'. When this
command appears in `TESTNAME_main.SUFFIX' the options are also
used to link the test program.
`dg-xfail-if'
This command can be used in a secondary source file to specify that
compilation is expected to fail for particular options on
particular targets.
File: gccint.info, Node: Torture Tests, Prev: compat Testing, Up: Testsuites
7.10 Support for torture testing using multiple options
=======================================================
Throughout the compiler testsuite there are several directories whose
tests are run multiple times, each with a different set of options.
These are known as torture tests. `lib/torture-options.exp' defines
procedures to set up these lists:
`torture-init'
Initialize use of torture lists.
`set-torture-options'
Set lists of torture options to use for tests with and without
loops. Optionally combine a set of torture options with a set of
other options, as is done with Objective-C runtime options.
`torture-finish'
Finalize use of torture lists.
The `.exp' file for a set of tests that use torture options must
include calls to these three procedures if:
* It calls `gcc-dg-runtest' and overrides DG_TORTURE_OPTIONS.
* It calls ${TOOL}`-torture' or ${TOOL}`-torture-execute', where
TOOL is `c', `fortran', or `objc'.
* It calls `dg-pch'.
It is not necessary for a `.exp' file that calls `gcc-dg-runtest' to
call the torture procedures if the tests should use the list in
DG_TORTURE_OPTIONS defined in `gcc-dg.exp'.
Most uses of torture options can override the default lists by defining
TORTURE_OPTIONS or add to the default list by defining
ADDITIONAL_TORTURE_OPTIONS. Define these in a `.dejagnurc' file or add
them to the `site.exp' file; for example
set ADDITIONAL_TORTURE_OPTIONS [list \
{ -O2 -ftree-loop-linear } \
{ -O2 -fpeel-loops } ]
File: gccint.info, Node: Options, Next: Passes, Prev: Testsuites, Up: Top
8 Option specification files
****************************
Most GCC command-line options are described by special option
definition files, the names of which conventionally end in `.opt'.
This chapter describes the format of these files.
* Menu:
* Option file format:: The general layout of the files
* Option properties:: Supported option properties
File: gccint.info, Node: Option file format, Next: Option properties, Up: Options
8.1 Option file format
======================
Option files are a simple list of records in which each field occupies
its own line and in which the records themselves are separated by blank
lines. Comments may appear on their own line anywhere within the file
and are preceded by semicolons. Whitespace is allowed before the
semicolon.
The files can contain the following types of record:
* A language definition record. These records have two fields: the
string `Language' and the name of the language. Once a language
has been declared in this way, it can be used as an option
property. *Note Option properties::.
* A target specific save record to save additional information. These
records have two fields: the string `TargetSave', and a
declaration type to go in the `cl_target_option' structure.
* A variable record to define a variable used to store option
information. These records have two fields: the string
`Variable', and a declaration of the type and name of the
variable, optionally with an initializer (but without any trailing
`;'). These records may be used for variables used for many
options where declaring the initializer in a single option
definition record, or duplicating it in many records, would be
inappropriate, or for variables set in option handlers rather than
referenced by `Var' properties.
* A variable record to define a variable used to store option
information. These records have two fields: the string
`TargetVariable', and a declaration of the type and name of the
variable, optionally with an initializer (but without any trailing
`;'). `TargetVariable' is a combination of `Variable' and
`TargetSave' records in that the variable is defined in the
`gcc_options' structure, but these variables are also stored in
the `cl_target_option' structure. The variables are saved in the
target save code and restored in the target restore code.
* A variable record to record any additional files that the
`options.h' file should include. This is useful to provide
enumeration or structure definitions needed for target variables.
These records have two fields: the string `HeaderInclude' and the
name of the include file.
* A variable record to record any additional files that the
`options.c' file should include. This is useful to provide inline
functions needed for target variables and/or `#ifdef' sequences to
properly set up the initialization. These records have two
fields: the string `SourceInclude' and the name of the include
file.
* An enumeration record to define a set of strings that may be used
as arguments to an option or options. These records have three
fields: the string `Enum', a space-separated list of properties
and help text used to describe the set of strings in `--help'
output. Properties use the same format as option properties; the
following are valid:
`Name(NAME)'
This property is required; NAME must be a name (suitable for
use in C identifiers) used to identify the set of strings in
`Enum' option properties.
`Type(TYPE)'
This property is required; TYPE is the C type for variables
set by options using this enumeration together with `Var'.
`UnknownError(MESSAGE)'
The message MESSAGE will be used as an error message if the
argument is invalid; for enumerations without `UnknownError',
a generic error message is used. MESSAGE should contain a
single `%qs' format, which will be used to format the invalid
argument.
* An enumeration value record to define one of the strings in a set
given in an `Enum' record. These records have two fields: the
string `EnumValue' and a space-separated list of properties.
Properties use the same format as option properties; the following
are valid:
`Enum(NAME)'
This property is required; NAME says which `Enum' record this
`EnumValue' record corresponds to.
`String(STRING)'
This property is required; STRING is the string option
argument being described by this record.
`Value(VALUE)'
This property is required; it says what value (representable
as `int') should be used for the given string.
`Canonical'
This property is optional. If present, it says the present
string is the canonical one among all those with the given
value. Other strings yielding that value will be mapped to
this one so specs do not need to handle them.
`DriverOnly'
This property is optional. If present, the present string
will only be accepted by the driver. This is used for cases
such as `-march=native' that are processed by the driver so
that `gcc -v' shows how the options chosen depended on the
system on which the compiler was run.
* An option definition record. These records have the following
fields:
1. the name of the option, with the leading "-" removed
2. a space-separated list of option properties (*note Option
properties::)
3. the help text to use for `--help' (omitted if the second field
contains the `Undocumented' property).
By default, all options beginning with "f", "W" or "m" are
implicitly assumed to take a "no-" form. This form should not be
listed separately. If an option beginning with one of these
letters does not have a "no-" form, you can use the
`RejectNegative' property to reject it.
The help text is automatically line-wrapped before being displayed.
Normally the name of the option is printed on the left-hand side of
the output and the help text is printed on the right. However, if
the help text contains a tab character, the text to the left of
the tab is used instead of the option's name and the text to the
right of the tab forms the help text. This allows you to
elaborate on what type of argument the option takes.
* A target mask record. These records have one field of the form
`Mask(X)'. The options-processing script will automatically
allocate a bit in `target_flags' (*note Run-time Target::) for
each mask name X and set the macro `MASK_X' to the appropriate
bitmask. It will also declare a `TARGET_X' macro that has the
value 1 when bit `MASK_X' is set and 0 otherwise.
They are primarily intended to declare target masks that are not
associated with user options, either because these masks represent
internal switches or because the options are not available on all
configurations and yet the masks always need to be defined.
File: gccint.info, Node: Option properties, Prev: Option file format, Up: Options
8.2 Option properties
=====================
The second field of an option record can specify any of the following
properties. When an option takes an argument, it is enclosed in
parentheses following the option property name. The parser that
handles option files is quite simplistic, and will be tricked by any
nested parentheses within the argument text itself; in this case, the
entire option argument can be wrapped in curly braces within the
parentheses to demarcate it, e.g.:
Condition({defined (USE_CYGWIN_LIBSTDCXX_WRAPPERS)})
`Common'
The option is available for all languages and targets.
`Target'
The option is available for all languages but is target-specific.
`Driver'
The option is handled by the compiler driver using code not shared
with the compilers proper (`cc1' etc.).
`LANGUAGE'
The option is available when compiling for the given language.
It is possible to specify several different languages for the same
option. Each LANGUAGE must have been declared by an earlier
`Language' record. *Note Option file format::.
`RejectDriver'
The option is only handled by the compilers proper (`cc1' etc.)
and should not be accepted by the driver.
`RejectNegative'
The option does not have a "no-" form. All options beginning with
"f", "W" or "m" are assumed to have a "no-" form unless this
property is used.
`Negative(OTHERNAME)'
The option will turn off another option OTHERNAME, which is the
option name with the leading "-" removed. This chain action will
propagate through the `Negative' property of the option to be
turned off.
`Joined'
`Separate'
The option takes a mandatory argument. `Joined' indicates that
the option and argument can be included in the same `argv' entry
(as with `-mflush-func=NAME', for example). `Separate' indicates
that the option and argument can be separate `argv' entries (as
with `-o'). An option is allowed to have both of these properties.
`JoinedOrMissing'
The option takes an optional argument. If the argument is given,
it will be part of the same `argv' entry as the option itself.
This property cannot be used alongside `Joined' or `Separate'.
`MissingArgError(MESSAGE)'
For an option marked `Joined' or `Separate', the message MESSAGE
will be used as an error message if the mandatory argument is
missing; for options without `MissingArgError', a generic error
message is used. MESSAGE should contain a single `%qs' format,
which will be used to format the name of the option passed.
`Args(N)'
For an option marked `Separate', indicate that it takes N
arguments. The default is 1.
`UInteger'
The option's argument is a non-negative integer. The option parser
will check and convert the argument before passing it to the
relevant option handler. `UInteger' should also be used on
options like `-falign-loops' where both `-falign-loops' and
`-falign-loops'=N are supported to make sure the saved options are
given a full integer.
`NoDriverArg'
For an option marked `Separate', the option only takes an argument
in the compiler proper, not in the driver. This is for
compatibility with existing options that are used both directly and
via `-Wp,'; new options should not have this property.
`Var(VAR)'
The state of this option should be stored in variable VAR
(actually a macro for `global_options.x_VAR'). The way that the
state is stored depends on the type of option:
* If the option uses the `Mask' or `InverseMask' properties,
VAR is the integer variable that contains the mask.
* If the option is a normal on/off switch, VAR is an integer
variable that is nonzero when the option is enabled. The
options parser will set the variable to 1 when the positive
form of the option is used and 0 when the "no-" form is used.
* If the option takes an argument and has the `UInteger'
property, VAR is an integer variable that stores the value of
the argument.
* If the option takes an argument and has the `Enum' property,
VAR is a variable (type given in the `Type' property of the
`Enum' record whose `Name' property has the same argument as
the `Enum' property of this option) that stores the value of
the argument.
* If the option has the `Defer' property, VAR is a pointer to a
`VEC(cl_deferred_option,heap)' that stores the option for
later processing. (VAR is declared with type `void *' and
needs to be cast to `VEC(cl_deferred_option,heap)' before
use.)
* Otherwise, if the option takes an argument, VAR is a pointer
to the argument string. The pointer will be null if the
argument is optional and wasn't given.
The option-processing script will usually zero-initialize VAR.
You can modify this behavior using `Init'.
`Var(VAR, SET)'
The option controls an integer variable VAR and is active when VAR
equals SET. The option parser will set VAR to SET when the
positive form of the option is used and `!SET' when the "no-" form
is used.
VAR is declared in the same way as for the single-argument form
described above.
`Init(VALUE)'
The variable specified by the `Var' property should be statically
initialized to VALUE. If more than one option using the same
variable specifies `Init', all must specify the same initializer.
`Mask(NAME)'
The option is associated with a bit in the `target_flags' variable
(*note Run-time Target::) and is active when that bit is set. You
may also specify `Var' to select a variable other than
`target_flags'.
The options-processing script will automatically allocate a unique
bit for the option. If the option is attached to `target_flags',
the script will set the macro `MASK_NAME' to the appropriate
bitmask. It will also declare a `TARGET_NAME' macro that has the
value 1 when the option is active and 0 otherwise. If you use
`Var' to attach the option to a different variable, the associated
macros are called `OPTION_MASK_NAME' and `OPTION_NAME'
respectively.
You can disable automatic bit allocation using `MaskExists'.
`InverseMask(OTHERNAME)'
`InverseMask(OTHERNAME, THISNAME)'
The option is the inverse of another option that has the
`Mask(OTHERNAME)' property. If THISNAME is given, the
options-processing script will declare a `TARGET_THISNAME' macro
that is 1 when the option is active and 0 otherwise.
`MaskExists'
The mask specified by the `Mask' property already exists. No
`MASK' or `TARGET' definitions should be added to `options.h' in
response to this option record.
The main purpose of this property is to support synonymous options.
The first option should use `Mask(NAME)' and the others should use
`Mask(NAME) MaskExists'.
`Enum(NAME)'
The option's argument is a string from the set of strings
associated with the corresponding `Enum' record. The string is
checked and converted to the integer specified in the corresponding
`EnumValue' record before being passed to option handlers.
`Defer'
The option should be stored in a vector, specified with `Var', for
later processing.
`Alias(OPT)'
`Alias(OPT, ARG)'
`Alias(OPT, POSARG, NEGARG)'
The option is an alias for `-OPT'. In the first form, any
argument passed to the alias is considered to be passed to `-OPT',
and `-OPT' is considered to be negated if the alias is used in
negated form. In the second form, the alias may not be negated or
have an argument, and POSARG is considered to be passed as an
argument to `-OPT'. In the third form, the alias may not have an
argument, if the alias is used in the positive form then POSARG is
considered to be passed to `-OPT', and if the alias is used in the
negative form then NEGARG is considered to be passed to `-OPT'.
Aliases should not specify `Var' or `Mask' or `UInteger'. Aliases
should normally specify the same languages as the target of the
alias; the flags on the target will be used to determine any
diagnostic for use of an option for the wrong language, while
those on the alias will be used to identify what command-line text
is the option and what text is any argument to that option.
When an `Alias' definition is used for an option, driver specs do
not need to handle it and no `OPT_' enumeration value is defined
for it; only the canonical form of the option will be seen in those
places.
`Ignore'
This option is ignored apart from printing any warning specified
using `Warn'. The option will not be seen by specs and no `OPT_'
enumeration value is defined for it.
`SeparateAlias'
For an option marked with `Joined', `Separate' and `Alias', the
option only acts as an alias when passed a separate argument; with
a joined argument it acts as a normal option, with an `OPT_'
enumeration value. This is for compatibility with the Java `-d'
option and should not be used for new options.
`Warn(MESSAGE)'
If this option is used, output the warning MESSAGE. MESSAGE is a
format string, either taking a single operand with a `%qs' format
which is the option name, or not taking any operands, which is
passed to the `warning' function. If an alias is marked `Warn',
the target of the alias must not also be marked `Warn'.
`Report'
The state of the option should be printed by `-fverbose-asm'.
`Warning'
This is a warning option and should be shown as such in `--help'
output. This flag does not currently affect anything other than
`--help'.
`Optimization'
This is an optimization option. It should be shown as such in
`--help' output, and any associated variable named using `Var'
should be saved and restored when the optimization level is
changed with `optimize' attributes.
`Undocumented'
The option is deliberately missing documentation and should not be
included in the `--help' output.
`Condition(COND)'
The option should only be accepted if preprocessor condition COND
is true. Note that any C declarations associated with the option
will be present even if COND is false; COND simply controls
whether the option is accepted and whether it is printed in the
`--help' output.
`Save'
Build the `cl_target_option' structure to hold a copy of the
option, add the functions `cl_target_option_save' and
`cl_target_option_restore' to save and restore the options.
`SetByCombined'
The option may also be set by a combined option such as
`-ffast-math'. This causes the `gcc_options' struct to have a
field `frontend_set_NAME', where `NAME' is the name of the field
holding the value of this option (without the leading `x_'). This
gives the front end a way to indicate that the value has been set
explicitly and should not be changed by the combined option. For
example, some front ends use this to prevent `-ffast-math' and
`-fno-fast-math' from changing the value of `-fmath-errno' for
languages that do not use `errno'.
File: gccint.info, Node: Passes, Next: GENERIC, Prev: Options, Up: Top
9 Passes and Files of the Compiler
**********************************
This chapter is dedicated to giving an overview of the optimization and
code generation passes of the compiler. In the process, it describes
some of the language front end interface, though this description is no
where near complete.
* Menu:
* Parsing pass:: The language front end turns text into bits.
* Gimplification pass:: The bits are turned into something we can optimize.
* Pass manager:: Sequencing the optimization passes.
* Tree SSA passes:: Optimizations on a high-level representation.
* RTL passes:: Optimizations on a low-level representation.
File: gccint.info, Node: Parsing pass, Next: Gimplification pass, Up: Passes
9.1 Parsing pass
================
The language front end is invoked only once, via
`lang_hooks.parse_file', to parse the entire input. The language front
end may use any intermediate language representation deemed
appropriate. The C front end uses GENERIC trees (*note GENERIC::), plus
a double handful of language specific tree codes defined in
`c-common.def'. The Fortran front end uses a completely different
private representation.
At some point the front end must translate the representation used in
the front end to a representation understood by the language-independent
portions of the compiler. Current practice takes one of two forms.
The C front end manually invokes the gimplifier (*note GIMPLE::) on
each function, and uses the gimplifier callbacks to convert the
language-specific tree nodes directly to GIMPLE before passing the
function off to be compiled. The Fortran front end converts from a
private representation to GENERIC, which is later lowered to GIMPLE
when the function is compiled. Which route to choose probably depends
on how well GENERIC (plus extensions) can be made to match up with the
source language and necessary parsing data structures.
BUG: Gimplification must occur before nested function lowering, and
nested function lowering must be done by the front end before passing
the data off to cgraph.
TODO: Cgraph should control nested function lowering. It would only
be invoked when it is certain that the outer-most function is used.
TODO: Cgraph needs a gimplify_function callback. It should be invoked
when (1) it is certain that the function is used, (2) warning flags
specified by the user require some amount of compilation in order to
honor, (3) the language indicates that semantic analysis is not
complete until gimplification occurs. Hum... this sounds overly
complicated. Perhaps we should just have the front end gimplify
always; in most cases it's only one function call.
The front end needs to pass all function definitions and top level
declarations off to the middle-end so that they can be compiled and
emitted to the object file. For a simple procedural language, it is
usually most convenient to do this as each top level declaration or
definition is seen. There is also a distinction to be made between
generating functional code and generating complete debug information.
The only thing that is absolutely required for functional code is that
function and data _definitions_ be passed to the middle-end. For
complete debug information, function, data and type declarations should
all be passed as well.
In any case, the front end needs each complete top-level function or
data declaration, and each data definition should be passed to
`rest_of_decl_compilation'. Each complete type definition should be
passed to `rest_of_type_compilation'. Each function definition should
be passed to `cgraph_finalize_function'.
TODO: I know rest_of_compilation currently has all sorts of RTL
generation semantics. I plan to move all code generation bits (both
Tree and RTL) to compile_function. Should we hide cgraph from the
front ends and move back to rest_of_compilation as the official
interface? Possibly we should rename all three interfaces such that
the names match in some meaningful way and that is more descriptive
than "rest_of".
The middle-end will, at its option, emit the function and data
definitions immediately or queue them for later processing.
File: gccint.info, Node: Gimplification pass, Next: Pass manager, Prev: Parsing pass, Up: Passes
9.2 Gimplification pass
=======================
"Gimplification" is a whimsical term for the process of converting the
intermediate representation of a function into the GIMPLE language
(*note GIMPLE::). The term stuck, and so words like "gimplification",
"gimplify", "gimplifier" and the like are sprinkled throughout this
section of code.
While a front end may certainly choose to generate GIMPLE directly if
it chooses, this can be a moderately complex process unless the
intermediate language used by the front end is already fairly simple.
Usually it is easier to generate GENERIC trees plus extensions and let
the language-independent gimplifier do most of the work.
The main entry point to this pass is `gimplify_function_tree' located
in `gimplify.c'. From here we process the entire function gimplifying
each statement in turn. The main workhorse for this pass is
`gimplify_expr'. Approximately everything passes through here at least
once, and it is from here that we invoke the `lang_hooks.gimplify_expr'
callback.
The callback should examine the expression in question and return
`GS_UNHANDLED' if the expression is not a language specific construct
that requires attention. Otherwise it should alter the expression in
some way to such that forward progress is made toward producing valid
GIMPLE. If the callback is certain that the transformation is complete
and the expression is valid GIMPLE, it should return `GS_ALL_DONE'.
Otherwise it should return `GS_OK', which will cause the expression to
be processed again. If the callback encounters an error during the
transformation (because the front end is relying on the gimplification
process to finish semantic checks), it should return `GS_ERROR'.
File: gccint.info, Node: Pass manager, Next: Tree SSA passes, Prev: Gimplification pass, Up: Passes
9.3 Pass manager
================
The pass manager is located in `passes.c', `tree-optimize.c' and
`tree-pass.h'. Its job is to run all of the individual passes in the
correct order, and take care of standard bookkeeping that applies to
every pass.
The theory of operation is that each pass defines a structure that
represents everything we need to know about that pass--when it should
be run, how it should be run, what intermediate language form or
on-the-side data structures it needs. We register the pass to be run
in some particular order, and the pass manager arranges for everything
to happen in the correct order.
The actuality doesn't completely live up to the theory at present.
Command-line switches and `timevar_id_t' enumerations must still be
defined elsewhere. The pass manager validates constraints but does not
attempt to (re-)generate data structures or lower intermediate language
form based on the requirements of the next pass. Nevertheless, what is
present is useful, and a far sight better than nothing at all.
Each pass should have a unique name. Each pass may have its own dump
file (for GCC debugging purposes). Passes with a name starting with a
star do not dump anything. Sometimes passes are supposed to share a
dump file / option name. To still give these unique names, you can use
a prefix that is delimited by a space from the part that is used for
the dump file / option name. E.g. When the pass name is "ud dce", the
name used for dump file/options is "dce".
TODO: describe the global variables set up by the pass manager, and a
brief description of how a new pass should use it. I need to look at
what info RTL passes use first...
File: gccint.info, Node: Tree SSA passes, Next: RTL passes, Prev: Pass manager, Up: Passes
9.4 Tree SSA passes
===================
The following briefly describes the Tree optimization passes that are
run after gimplification and what source files they are located in.
* Remove useless statements
This pass is an extremely simple sweep across the gimple code in
which we identify obviously dead code and remove it. Here we do
things like simplify `if' statements with constant conditions,
remove exception handling constructs surrounding code that
obviously cannot throw, remove lexical bindings that contain no
variables, and other assorted simplistic cleanups. The idea is to
get rid of the obvious stuff quickly rather than wait until later
when it's more work to get rid of it. This pass is located in
`tree-cfg.c' and described by `pass_remove_useless_stmts'.
* Mudflap declaration registration
If mudflap (*note -fmudflap -fmudflapth -fmudflapir: (gcc)Optimize
Options.) is enabled, we generate code to register some variable
declarations with the mudflap runtime. Specifically, the runtime
tracks the lifetimes of those variable declarations that have
their addresses taken, or whose bounds are unknown at compile time
(`extern'). This pass generates new exception handling constructs
(`try'/`finally'), and so must run before those are lowered. In
addition, the pass enqueues declarations of static variables whose
lifetimes extend to the entire program. The pass is located in
`tree-mudflap.c' and is described by `pass_mudflap_1'.
* OpenMP lowering
If OpenMP generation (`-fopenmp') is enabled, this pass lowers
OpenMP constructs into GIMPLE.
Lowering of OpenMP constructs involves creating replacement
expressions for local variables that have been mapped using data
sharing clauses, exposing the control flow of most synchronization
directives and adding region markers to facilitate the creation of
the control flow graph. The pass is located in `omp-low.c' and is
described by `pass_lower_omp'.
* OpenMP expansion
If OpenMP generation (`-fopenmp') is enabled, this pass expands
parallel regions into their own functions to be invoked by the
thread library. The pass is located in `omp-low.c' and is
described by `pass_expand_omp'.
* Lower control flow
This pass flattens `if' statements (`COND_EXPR') and moves lexical
bindings (`BIND_EXPR') out of line. After this pass, all `if'
statements will have exactly two `goto' statements in its `then'
and `else' arms. Lexical binding information for each statement
will be found in `TREE_BLOCK' rather than being inferred from its
position under a `BIND_EXPR'. This pass is found in
`gimple-low.c' and is described by `pass_lower_cf'.
* Lower exception handling control flow
This pass decomposes high-level exception handling constructs
(`TRY_FINALLY_EXPR' and `TRY_CATCH_EXPR') into a form that
explicitly represents the control flow involved. After this pass,
`lookup_stmt_eh_region' will return a non-negative number for any
statement that may have EH control flow semantics; examine
`tree_can_throw_internal' or `tree_can_throw_external' for exact
semantics. Exact control flow may be extracted from
`foreach_reachable_handler'. The EH region nesting tree is defined
in `except.h' and built in `except.c'. The lowering pass itself
is in `tree-eh.c' and is described by `pass_lower_eh'.
* Build the control flow graph
This pass decomposes a function into basic blocks and creates all
of the edges that connect them. It is located in `tree-cfg.c' and
is described by `pass_build_cfg'.
* Find all referenced variables
This pass walks the entire function and collects an array of all
variables referenced in the function, `referenced_vars'. The
index at which a variable is found in the array is used as a UID
for the variable within this function. This data is needed by the
SSA rewriting routines. The pass is located in `tree-dfa.c' and
is described by `pass_referenced_vars'.
* Enter static single assignment form
This pass rewrites the function such that it is in SSA form. After
this pass, all `is_gimple_reg' variables will be referenced by
`SSA_NAME', and all occurrences of other variables will be
annotated with `VDEFS' and `VUSES'; PHI nodes will have been
inserted as necessary for each basic block. This pass is located
in `tree-ssa.c' and is described by `pass_build_ssa'.
* Warn for uninitialized variables
This pass scans the function for uses of `SSA_NAME's that are fed
by default definition. For non-parameter variables, such uses are
uninitialized. The pass is run twice, before and after
optimization (if turned on). In the first pass we only warn for
uses that are positively uninitialized; in the second pass we warn
for uses that are possibly uninitialized. The pass is located in
`tree-ssa.c' and is defined by `pass_early_warn_uninitialized' and
`pass_late_warn_uninitialized'.
* Dead code elimination
This pass scans the function for statements without side effects
whose result is unused. It does not do memory life analysis, so
any value that is stored in memory is considered used. The pass
is run multiple times throughout the optimization process. It is
located in `tree-ssa-dce.c' and is described by `pass_dce'.
* Dominator optimizations
This pass performs trivial dominator-based copy and constant
propagation, expression simplification, and jump threading. It is
run multiple times throughout the optimization process. It is
located in `tree-ssa-dom.c' and is described by `pass_dominator'.
* Forward propagation of single-use variables
This pass attempts to remove redundant computation by substituting
variables that are used once into the expression that uses them and
seeing if the result can be simplified. It is located in
`tree-ssa-forwprop.c' and is described by `pass_forwprop'.
* Copy Renaming
This pass attempts to change the name of compiler temporaries
involved in copy operations such that SSA->normal can coalesce the
copy away. When compiler temporaries are copies of user
variables, it also renames the compiler temporary to the user
variable resulting in better use of user symbols. It is located
in `tree-ssa-copyrename.c' and is described by `pass_copyrename'.
* PHI node optimizations
This pass recognizes forms of PHI inputs that can be represented as
conditional expressions and rewrites them into straight line code.
It is located in `tree-ssa-phiopt.c' and is described by
`pass_phiopt'.
* May-alias optimization
This pass performs a flow sensitive SSA-based points-to analysis.
The resulting may-alias, must-alias, and escape analysis
information is used to promote variables from in-memory
addressable objects to non-aliased variables that can be renamed
into SSA form. We also update the `VDEF'/`VUSE' memory tags for
non-renameable aggregates so that we get fewer false kills. The
pass is located in `tree-ssa-alias.c' and is described by
`pass_may_alias'.
Interprocedural points-to information is located in
`tree-ssa-structalias.c' and described by `pass_ipa_pta'.
* Profiling
This pass rewrites the function in order to collect runtime block
and value profiling data. Such data may be fed back into the
compiler on a subsequent run so as to allow optimization based on
expected execution frequencies. The pass is located in
`predict.c' and is described by `pass_profile'.
* Lower complex arithmetic
This pass rewrites complex arithmetic operations into their
component scalar arithmetic operations. The pass is located in
`tree-complex.c' and is described by `pass_lower_complex'.
* Scalar replacement of aggregates
This pass rewrites suitable non-aliased local aggregate variables
into a set of scalar variables. The resulting scalar variables are
rewritten into SSA form, which allows subsequent optimization
passes to do a significantly better job with them. The pass is
located in `tree-sra.c' and is described by `pass_sra'.
* Dead store elimination
This pass eliminates stores to memory that are subsequently
overwritten by another store, without any intervening loads. The
pass is located in `tree-ssa-dse.c' and is described by `pass_dse'.
* Tail recursion elimination
This pass transforms tail recursion into a loop. It is located in
`tree-tailcall.c' and is described by `pass_tail_recursion'.
* Forward store motion
This pass sinks stores and assignments down the flowgraph closer
to their use point. The pass is located in `tree-ssa-sink.c' and
is described by `pass_sink_code'.
* Partial redundancy elimination
This pass eliminates partially redundant computations, as well as
performing load motion. The pass is located in `tree-ssa-pre.c'
and is described by `pass_pre'.
Just before partial redundancy elimination, if
`-funsafe-math-optimizations' is on, GCC tries to convert
divisions to multiplications by the reciprocal. The pass is
located in `tree-ssa-math-opts.c' and is described by
`pass_cse_reciprocal'.
* Full redundancy elimination
This is a simpler form of PRE that only eliminates redundancies
that occur an all paths. It is located in `tree-ssa-pre.c' and
described by `pass_fre'.
* Loop optimization
The main driver of the pass is placed in `tree-ssa-loop.c' and
described by `pass_loop'.
The optimizations performed by this pass are:
Loop invariant motion. This pass moves only invariants that would
be hard to handle on RTL level (function calls, operations that
expand to nontrivial sequences of insns). With `-funswitch-loops'
it also moves operands of conditions that are invariant out of the
loop, so that we can use just trivial invariantness analysis in
loop unswitching. The pass also includes store motion. The pass
is implemented in `tree-ssa-loop-im.c'.
Canonical induction variable creation. This pass creates a simple
counter for number of iterations of the loop and replaces the exit
condition of the loop using it, in case when a complicated
analysis is necessary to determine the number of iterations.
Later optimizations then may determine the number easily. The
pass is implemented in `tree-ssa-loop-ivcanon.c'.
Induction variable optimizations. This pass performs standard
induction variable optimizations, including strength reduction,
induction variable merging and induction variable elimination.
The pass is implemented in `tree-ssa-loop-ivopts.c'.
Loop unswitching. This pass moves the conditional jumps that are
invariant out of the loops. To achieve this, a duplicate of the
loop is created for each possible outcome of conditional jump(s).
The pass is implemented in `tree-ssa-loop-unswitch.c'. This pass
should eventually replace the RTL level loop unswitching in
`loop-unswitch.c', but currently the RTL level pass is not
completely redundant yet due to deficiencies in tree level alias
analysis.
The optimizations also use various utility functions contained in
`tree-ssa-loop-manip.c', `cfgloop.c', `cfgloopanal.c' and
`cfgloopmanip.c'.
Vectorization. This pass transforms loops to operate on vector
types instead of scalar types. Data parallelism across loop
iterations is exploited to group data elements from consecutive
iterations into a vector and operate on them in parallel.
Depending on available target support the loop is conceptually
unrolled by a factor `VF' (vectorization factor), which is the
number of elements operated upon in parallel in each iteration,
and the `VF' copies of each scalar operation are fused to form a
vector operation. Additional loop transformations such as peeling
and versioning may take place to align the number of iterations,
and to align the memory accesses in the loop. The pass is
implemented in `tree-vectorizer.c' (the main driver),
`tree-vect-loop.c' and `tree-vect-loop-manip.c' (loop specific
parts and general loop utilities), `tree-vect-slp' (loop-aware SLP
functionality), `tree-vect-stmts.c' and `tree-vect-data-refs.c'.
Analysis of data references is in `tree-data-ref.c'.
SLP Vectorization. This pass performs vectorization of
straight-line code. The pass is implemented in `tree-vectorizer.c'
(the main driver), `tree-vect-slp.c', `tree-vect-stmts.c' and
`tree-vect-data-refs.c'.
Autoparallelization. This pass splits the loop iteration space to
run into several threads. The pass is implemented in
`tree-parloops.c'.
Graphite is a loop transformation framework based on the polyhedral
model. Graphite stands for Gimple Represented as Polyhedra. The
internals of this infrastructure are documented in
`http://gcc.gnu.org/wiki/Graphite'. The passes working on this
representation are implemented in the various `graphite-*' files.
* Tree level if-conversion for vectorizer
This pass applies if-conversion to simple loops to help vectorizer.
We identify if convertible loops, if-convert statements and merge
basic blocks in one big block. The idea is to present loop in such
form so that vectorizer can have one to one mapping between
statements and available vector operations. This pass is located
in `tree-if-conv.c' and is described by `pass_if_conversion'.
* Conditional constant propagation
This pass relaxes a lattice of values in order to identify those
that must be constant even in the presence of conditional branches.
The pass is located in `tree-ssa-ccp.c' and is described by
`pass_ccp'.
A related pass that works on memory loads and stores, and not just
register values, is located in `tree-ssa-ccp.c' and described by
`pass_store_ccp'.
* Conditional copy propagation
This is similar to constant propagation but the lattice of values
is the "copy-of" relation. It eliminates redundant copies from the
code. The pass is located in `tree-ssa-copy.c' and described by
`pass_copy_prop'.
A related pass that works on memory copies, and not just register
copies, is located in `tree-ssa-copy.c' and described by
`pass_store_copy_prop'.
* Value range propagation
This transformation is similar to constant propagation but instead
of propagating single constant values, it propagates known value
ranges. The implementation is based on Patterson's range
propagation algorithm (Accurate Static Branch Prediction by Value
Range Propagation, J. R. C. Patterson, PLDI '95). In contrast to
Patterson's algorithm, this implementation does not propagate
branch probabilities nor it uses more than a single range per SSA
name. This means that the current implementation cannot be used
for branch prediction (though adapting it would not be difficult).
The pass is located in `tree-vrp.c' and is described by `pass_vrp'.
* Folding built-in functions
This pass simplifies built-in functions, as applicable, with
constant arguments or with inferable string lengths. It is
located in `tree-ssa-ccp.c' and is described by
`pass_fold_builtins'.
* Split critical edges
This pass identifies critical edges and inserts empty basic blocks
such that the edge is no longer critical. The pass is located in
`tree-cfg.c' and is described by `pass_split_crit_edges'.
* Control dependence dead code elimination
This pass is a stronger form of dead code elimination that can
eliminate unnecessary control flow statements. It is located in
`tree-ssa-dce.c' and is described by `pass_cd_dce'.
* Tail call elimination
This pass identifies function calls that may be rewritten into
jumps. No code transformation is actually applied here, but the
data and control flow problem is solved. The code transformation
requires target support, and so is delayed until RTL. In the
meantime `CALL_EXPR_TAILCALL' is set indicating the possibility.
The pass is located in `tree-tailcall.c' and is described by
`pass_tail_calls'. The RTL transformation is handled by
`fixup_tail_calls' in `calls.c'.
* Warn for function return without value
For non-void functions, this pass locates return statements that do
not specify a value and issues a warning. Such a statement may
have been injected by falling off the end of the function. This
pass is run last so that we have as much time as possible to prove
that the statement is not reachable. It is located in
`tree-cfg.c' and is described by `pass_warn_function_return'.
* Mudflap statement annotation
If mudflap is enabled, we rewrite some memory accesses with code to
validate that the memory access is correct. In particular,
expressions involving pointer dereferences (`INDIRECT_REF',
`ARRAY_REF', etc.) are replaced by code that checks the selected
address range against the mudflap runtime's database of valid
regions. This check includes an inline lookup into a
direct-mapped cache, based on shift/mask operations of the pointer
value, with a fallback function call into the runtime. The pass
is located in `tree-mudflap.c' and is described by
`pass_mudflap_2'.
* Leave static single assignment form
This pass rewrites the function such that it is in normal form. At
the same time, we eliminate as many single-use temporaries as
possible, so the intermediate language is no longer GIMPLE, but
GENERIC. The pass is located in `tree-outof-ssa.c' and is
described by `pass_del_ssa'.
* Merge PHI nodes that feed into one another
This is part of the CFG cleanup passes. It attempts to join PHI
nodes from a forwarder CFG block into another block with PHI
nodes. The pass is located in `tree-cfgcleanup.c' and is
described by `pass_merge_phi'.
* Return value optimization
If a function always returns the same local variable, and that
local variable is an aggregate type, then the variable is replaced
with the return value for the function (i.e., the function's
DECL_RESULT). This is equivalent to the C++ named return value
optimization applied to GIMPLE. The pass is located in
`tree-nrv.c' and is described by `pass_nrv'.
* Return slot optimization
If a function returns a memory object and is called as `var =
foo()', this pass tries to change the call so that the address of
`var' is sent to the caller to avoid an extra memory copy. This
pass is located in `tree-nrv.c' and is described by
`pass_return_slot'.
* Optimize calls to `__builtin_object_size'
This is a propagation pass similar to CCP that tries to remove
calls to `__builtin_object_size' when the size of the object can be
computed at compile-time. This pass is located in
`tree-object-size.c' and is described by `pass_object_sizes'.
* Loop invariant motion
This pass removes expensive loop-invariant computations out of
loops. The pass is located in `tree-ssa-loop.c' and described by
`pass_lim'.
* Loop nest optimizations
This is a family of loop transformations that works on loop nests.
It includes loop interchange, scaling, skewing and reversal and
they are all geared to the optimization of data locality in array
traversals and the removal of dependencies that hamper
optimizations such as loop parallelization and vectorization. The
pass is located in `tree-loop-linear.c' and described by
`pass_linear_transform'.
* Removal of empty loops
This pass removes loops with no code in them. The pass is located
in `tree-ssa-loop-ivcanon.c' and described by `pass_empty_loop'.
* Unrolling of small loops
This pass completely unrolls loops with few iterations. The pass
is located in `tree-ssa-loop-ivcanon.c' and described by
`pass_complete_unroll'.
* Predictive commoning
This pass makes the code reuse the computations from the previous
iterations of the loops, especially loads and stores to memory.
It does so by storing the values of these computations to a bank
of temporary variables that are rotated at the end of loop. To
avoid the need for this rotation, the loop is then unrolled and
the copies of the loop body are rewritten to use the appropriate
version of the temporary variable. This pass is located in
`tree-predcom.c' and described by `pass_predcom'.
* Array prefetching
This pass issues prefetch instructions for array references inside
loops. The pass is located in `tree-ssa-loop-prefetch.c' and
described by `pass_loop_prefetch'.
* Reassociation
This pass rewrites arithmetic expressions to enable optimizations
that operate on them, like redundancy elimination and
vectorization. The pass is located in `tree-ssa-reassoc.c' and
described by `pass_reassoc'.
* Optimization of `stdarg' functions
This pass tries to avoid the saving of register arguments into the
stack on entry to `stdarg' functions. If the function doesn't use
any `va_start' macros, no registers need to be saved. If
`va_start' macros are used, the `va_list' variables don't escape
the function, it is only necessary to save registers that will be
used in `va_arg' macros. For instance, if `va_arg' is only used
with integral types in the function, floating point registers
don't need to be saved. This pass is located in `tree-stdarg.c'
and described by `pass_stdarg'.
File: gccint.info, Node: RTL passes, Prev: Tree SSA passes, Up: Passes
9.5 RTL passes
==============
The following briefly describes the RTL generation and optimization
passes that are run after the Tree optimization passes.
* RTL generation
The source files for RTL generation include `stmt.c', `calls.c',
`expr.c', `explow.c', `expmed.c', `function.c', `optabs.c' and
`emit-rtl.c'. Also, the file `insn-emit.c', generated from the
machine description by the program `genemit', is used in this
pass. The header file `expr.h' is used for communication within
this pass.
The header files `insn-flags.h' and `insn-codes.h', generated from
the machine description by the programs `genflags' and `gencodes',
tell this pass which standard names are available for use and
which patterns correspond to them.
* Generation of exception landing pads
This pass generates the glue that handles communication between the
exception handling library routines and the exception handlers
within the function. Entry points in the function that are
invoked by the exception handling library are called "landing
pads". The code for this pass is located in `except.c'.
* Control flow graph cleanup
This pass removes unreachable code, simplifies jumps to next,
jumps to jump, jumps across jumps, etc. The pass is run multiple
times. For historical reasons, it is occasionally referred to as
the "jump optimization pass". The bulk of the code for this pass
is in `cfgcleanup.c', and there are support routines in `cfgrtl.c'
and `jump.c'.
* Forward propagation of single-def values
This pass attempts to remove redundant computation by substituting
variables that come from a single definition, and seeing if the
result can be simplified. It performs copy propagation and
addressing mode selection. The pass is run twice, with values
being propagated into loops only on the second run. The code is
located in `fwprop.c'.
* Common subexpression elimination
This pass removes redundant computation within basic blocks, and
optimizes addressing modes based on cost. The pass is run twice.
The code for this pass is located in `cse.c'.
* Global common subexpression elimination
This pass performs two different types of GCSE depending on
whether you are optimizing for size or not (LCM based GCSE tends
to increase code size for a gain in speed, while Morel-Renvoise
based GCSE does not). When optimizing for size, GCSE is done
using Morel-Renvoise Partial Redundancy Elimination, with the
exception that it does not try to move invariants out of
loops--that is left to the loop optimization pass. If MR PRE
GCSE is done, code hoisting (aka unification) is also done, as
well as load motion. If you are optimizing for speed, LCM (lazy
code motion) based GCSE is done. LCM is based on the work of
Knoop, Ruthing, and Steffen. LCM based GCSE also does loop
invariant code motion. We also perform load and store motion when
optimizing for speed. Regardless of which type of GCSE is used,
the GCSE pass also performs global constant and copy propagation.
The source file for this pass is `gcse.c', and the LCM routines
are in `lcm.c'.
* Loop optimization
This pass performs several loop related optimizations. The source
files `cfgloopanal.c' and `cfgloopmanip.c' contain generic loop
analysis and manipulation code. Initialization and finalization
of loop structures is handled by `loop-init.c'. A loop invariant
motion pass is implemented in `loop-invariant.c'. Basic block
level optimizations--unrolling, peeling and unswitching loops--
are implemented in `loop-unswitch.c' and `loop-unroll.c'.
Replacing of the exit condition of loops by special
machine-dependent instructions is handled by `loop-doloop.c'.
* Jump bypassing
This pass is an aggressive form of GCSE that transforms the control
flow graph of a function by propagating constants into conditional
branch instructions. The source file for this pass is `gcse.c'.
* If conversion
This pass attempts to replace conditional branches and surrounding
assignments with arithmetic, boolean value producing comparison
instructions, and conditional move instructions. In the very last
invocation after reload, it will generate predicated instructions
when supported by the target. The code is located in `ifcvt.c'.
* Web construction
This pass splits independent uses of each pseudo-register. This
can improve effect of the other transformation, such as CSE or
register allocation. The code for this pass is located in `web.c'.
* Instruction combination
This pass attempts to combine groups of two or three instructions
that are related by data flow into single instructions. It
combines the RTL expressions for the instructions by substitution,
simplifies the result using algebra, and then attempts to match
the result against the machine description. The code is located
in `combine.c'.
* Register movement
This pass looks for cases where matching constraints would force an
instruction to need a reload, and this reload would be a
register-to-register move. It then attempts to change the
registers used by the instruction to avoid the move instruction.
The code is located in `regmove.c'.
* Mode switching optimization
This pass looks for instructions that require the processor to be
in a specific "mode" and minimizes the number of mode changes
required to satisfy all users. What these modes are, and what
they apply to are completely target-specific. The code for this
pass is located in `mode-switching.c'.
* Modulo scheduling
This pass looks at innermost loops and reorders their instructions
by overlapping different iterations. Modulo scheduling is
performed immediately before instruction scheduling. The code for
this pass is located in `modulo-sched.c'.
* Instruction scheduling
This pass looks for instructions whose output will not be
available by the time that it is used in subsequent instructions.
Memory loads and floating point instructions often have this
behavior on RISC machines. It re-orders instructions within a
basic block to try to separate the definition and use of items
that otherwise would cause pipeline stalls. This pass is
performed twice, before and after register allocation. The code
for this pass is located in `haifa-sched.c', `sched-deps.c',
`sched-ebb.c', `sched-rgn.c' and `sched-vis.c'.
* Register allocation
These passes make sure that all occurrences of pseudo registers are
eliminated, either by allocating them to a hard register, replacing
them by an equivalent expression (e.g. a constant) or by placing
them on the stack. This is done in several subpasses:
* Register move optimizations. This pass makes some simple RTL
code transformations which improve the subsequent register
allocation. The source file is `regmove.c'.
* The integrated register allocator (IRA). It is called
integrated because coalescing, register live range splitting,
and hard register preferencing are done on-the-fly during
coloring. It also has better integration with the reload
pass. Pseudo-registers spilled by the allocator or the
reload have still a chance to get hard-registers if the
reload evicts some pseudo-registers from hard-registers. The
allocator helps to choose better pseudos for spilling based
on their live ranges and to coalesce stack slots allocated
for the spilled pseudo-registers. IRA is a regional register
allocator which is transformed into Chaitin-Briggs allocator
if there is one region. By default, IRA chooses regions using
register pressure but the user can force it to use one region
or regions corresponding to all loops.
Source files of the allocator are `ira.c', `ira-build.c',
`ira-costs.c', `ira-conflicts.c', `ira-color.c',
`ira-emit.c', `ira-lives', plus header files `ira.h' and
`ira-int.h' used for the communication between the allocator
and the rest of the compiler and between the IRA files.
* Reloading. This pass renumbers pseudo registers with the
hardware registers numbers they were allocated. Pseudo
registers that did not get hard registers are replaced with
stack slots. Then it finds instructions that are invalid
because a value has failed to end up in a register, or has
ended up in a register of the wrong kind. It fixes up these
instructions by reloading the problematical values
temporarily into registers. Additional instructions are
generated to do the copying.
The reload pass also optionally eliminates the frame pointer
and inserts instructions to save and restore call-clobbered
registers around calls.
Source files are `reload.c' and `reload1.c', plus the header
`reload.h' used for communication between them.
* Basic block reordering
This pass implements profile guided code positioning. If profile
information is not available, various types of static analysis are
performed to make the predictions normally coming from the profile
feedback (IE execution frequency, branch probability, etc). It is
implemented in the file `bb-reorder.c', and the various prediction
routines are in `predict.c'.
* Variable tracking
This pass computes where the variables are stored at each position
in code and generates notes describing the variable locations to
RTL code. The location lists are then generated according to these
notes to debug information if the debugging information format
supports location lists. The code is located in `var-tracking.c'.
* Delayed branch scheduling
This optional pass attempts to find instructions that can go into
the delay slots of other instructions, usually jumps and calls.
The code for this pass is located in `reorg.c'.
* Branch shortening
On many RISC machines, branch instructions have a limited range.
Thus, longer sequences of instructions must be used for long
branches. In this pass, the compiler figures out what how far
each instruction will be from each other instruction, and
therefore whether the usual instructions, or the longer sequences,
must be used for each branch. The code for this pass is located
in `final.c'.
* Register-to-stack conversion
Conversion from usage of some hard registers to usage of a register
stack may be done at this point. Currently, this is supported only
for the floating-point registers of the Intel 80387 coprocessor.
The code for this pass is located in `reg-stack.c'.
* Final
This pass outputs the assembler code for the function. The source
files are `final.c' plus `insn-output.c'; the latter is generated
automatically from the machine description by the tool `genoutput'.
The header file `conditions.h' is used for communication between
these files. If mudflap is enabled, the queue of deferred
declarations and any addressed constants (e.g., string literals)
is processed by `mudflap_finish_file' into a synthetic constructor
function containing calls into the mudflap runtime.
* Debugging information output
This is run after final because it must output the stack slot
offsets for pseudo registers that did not get hard registers.
Source files are `dbxout.c' for DBX symbol table format,
`sdbout.c' for SDB symbol table format, `dwarfout.c' for DWARF
symbol table format, files `dwarf2out.c' and `dwarf2asm.c' for
DWARF2 symbol table format, and `vmsdbgout.c' for VMS debug symbol
table format.
File: gccint.info, Node: RTL, Next: Control Flow, Prev: Tree SSA, Up: Top
10 RTL Representation
*********************
The last part of the compiler work is done on a low-level intermediate
representation called Register Transfer Language. In this language, the
instructions to be output are described, pretty much one by one, in an
algebraic form that describes what the instruction does.
RTL is inspired by Lisp lists. It has both an internal form, made up
of structures that point at other structures, and a textual form that
is used in the machine description and in printed debugging dumps. The
textual form uses nested parentheses to indicate the pointers in the
internal form.
* Menu:
* RTL Objects:: Expressions vs vectors vs strings vs integers.
* RTL Classes:: Categories of RTL expression objects, and their structure.
* Accessors:: Macros to access expression operands or vector elts.
* Special Accessors:: Macros to access specific annotations on RTL.
* Flags:: Other flags in an RTL expression.
* Machine Modes:: Describing the size and format of a datum.
* Constants:: Expressions with constant values.
* Regs and Memory:: Expressions representing register contents or memory.
* Arithmetic:: Expressions representing arithmetic on other expressions.
* Comparisons:: Expressions representing comparison of expressions.
* Bit-Fields:: Expressions representing bit-fields in memory or reg.
* Vector Operations:: Expressions involving vector datatypes.
* Conversions:: Extending, truncating, floating or fixing.
* RTL Declarations:: Declaring volatility, constancy, etc.
* Side Effects:: Expressions for storing in registers, etc.
* Incdec:: Embedded side-effects for autoincrement addressing.
* Assembler:: Representing `asm' with operands.
* Debug Information:: Expressions representing debugging information.
* Insns:: Expression types for entire insns.
* Calls:: RTL representation of function call insns.
* Sharing:: Some expressions are unique; others *must* be copied.
* Reading RTL:: Reading textual RTL from a file.
File: gccint.info, Node: RTL Objects, Next: RTL Classes, Up: RTL
10.1 RTL Object Types
=====================
RTL uses five kinds of objects: expressions, integers, wide integers,
strings and vectors. Expressions are the most important ones. An RTL
expression ("RTX", for short) is a C structure, but it is usually
referred to with a pointer; a type that is given the typedef name `rtx'.
An integer is simply an `int'; their written form uses decimal digits.
A wide integer is an integral object whose type is `HOST_WIDE_INT';
their written form uses decimal digits.
A string is a sequence of characters. In core it is represented as a
`char *' in usual C fashion, and it is written in C syntax as well.
However, strings in RTL may never be null. If you write an empty
string in a machine description, it is represented in core as a null
pointer rather than as a pointer to a null character. In certain
contexts, these null pointers instead of strings are valid. Within RTL
code, strings are most commonly found inside `symbol_ref' expressions,
but they appear in other contexts in the RTL expressions that make up
machine descriptions.
In a machine description, strings are normally written with double
quotes, as you would in C. However, strings in machine descriptions may
extend over many lines, which is invalid C, and adjacent string
constants are not concatenated as they are in C. Any string constant
may be surrounded with a single set of parentheses. Sometimes this
makes the machine description easier to read.
There is also a special syntax for strings, which can be useful when C
code is embedded in a machine description. Wherever a string can
appear, it is also valid to write a C-style brace block. The entire
brace block, including the outermost pair of braces, is considered to be
the string constant. Double quote characters inside the braces are not
special. Therefore, if you write string constants in the C code, you
need not escape each quote character with a backslash.
A vector contains an arbitrary number of pointers to expressions. The
number of elements in the vector is explicitly present in the vector.
The written form of a vector consists of square brackets (`[...]')
surrounding the elements, in sequence and with whitespace separating
them. Vectors of length zero are not created; null pointers are used
instead.
Expressions are classified by "expression codes" (also called RTX
codes). The expression code is a name defined in `rtl.def', which is
also (in uppercase) a C enumeration constant. The possible expression
codes and their meanings are machine-independent. The code of an RTX
can be extracted with the macro `GET_CODE (X)' and altered with
`PUT_CODE (X, NEWCODE)'.
The expression code determines how many operands the expression
contains, and what kinds of objects they are. In RTL, unlike Lisp, you
cannot tell by looking at an operand what kind of object it is.
Instead, you must know from its context--from the expression code of
the containing expression. For example, in an expression of code
`subreg', the first operand is to be regarded as an expression and the
second operand as an integer. In an expression of code `plus', there
are two operands, both of which are to be regarded as expressions. In
a `symbol_ref' expression, there is one operand, which is to be
regarded as a string.
Expressions are written as parentheses containing the name of the
expression type, its flags and machine mode if any, and then the
operands of the expression (separated by spaces).
Expression code names in the `md' file are written in lowercase, but
when they appear in C code they are written in uppercase. In this
manual, they are shown as follows: `const_int'.
In a few contexts a null pointer is valid where an expression is
normally wanted. The written form of this is `(nil)'.
File: gccint.info, Node: RTL Classes, Next: Accessors, Prev: RTL Objects, Up: RTL
10.2 RTL Classes and Formats
============================
The various expression codes are divided into several "classes", which
are represented by single characters. You can determine the class of
an RTX code with the macro `GET_RTX_CLASS (CODE)'. Currently,
`rtl.def' defines these classes:
`RTX_OBJ'
An RTX code that represents an actual object, such as a register
(`REG') or a memory location (`MEM', `SYMBOL_REF'). `LO_SUM') is
also included; instead, `SUBREG' and `STRICT_LOW_PART' are not in
this class, but in class `x'.
`RTX_CONST_OBJ'
An RTX code that represents a constant object. `HIGH' is also
included in this class.
`RTX_COMPARE'
An RTX code for a non-symmetric comparison, such as `GEU' or `LT'.
`RTX_COMM_COMPARE'
An RTX code for a symmetric (commutative) comparison, such as `EQ'
or `ORDERED'.
`RTX_UNARY'
An RTX code for a unary arithmetic operation, such as `NEG',
`NOT', or `ABS'. This category also includes value extension
(sign or zero) and conversions between integer and floating point.
`RTX_COMM_ARITH'
An RTX code for a commutative binary operation, such as `PLUS' or
`AND'. `NE' and `EQ' are comparisons, so they have class `<'.
`RTX_BIN_ARITH'
An RTX code for a non-commutative binary operation, such as
`MINUS', `DIV', or `ASHIFTRT'.
`RTX_BITFIELD_OPS'
An RTX code for a bit-field operation. Currently only
`ZERO_EXTRACT' and `SIGN_EXTRACT'. These have three inputs and
are lvalues (so they can be used for insertion as well). *Note
Bit-Fields::.
`RTX_TERNARY'
An RTX code for other three input operations. Currently only
`IF_THEN_ELSE', `VEC_MERGE', `SIGN_EXTRACT', `ZERO_EXTRACT', and
`FMA'.
`RTX_INSN'
An RTX code for an entire instruction: `INSN', `JUMP_INSN', and
`CALL_INSN'. *Note Insns::.
`RTX_MATCH'
An RTX code for something that matches in insns, such as
`MATCH_DUP'. These only occur in machine descriptions.
`RTX_AUTOINC'
An RTX code for an auto-increment addressing mode, such as
`POST_INC'.
`RTX_EXTRA'
All other RTX codes. This category includes the remaining codes
used only in machine descriptions (`DEFINE_*', etc.). It also
includes all the codes describing side effects (`SET', `USE',
`CLOBBER', etc.) and the non-insns that may appear on an insn
chain, such as `NOTE', `BARRIER', and `CODE_LABEL'. `SUBREG' is
also part of this class.
For each expression code, `rtl.def' specifies the number of contained
objects and their kinds using a sequence of characters called the
"format" of the expression code. For example, the format of `subreg'
is `ei'.
These are the most commonly used format characters:
`e'
An expression (actually a pointer to an expression).
`i'
An integer.
`w'
A wide integer.
`s'
A string.
`E'
A vector of expressions.
A few other format characters are used occasionally:
`u'
`u' is equivalent to `e' except that it is printed differently in
debugging dumps. It is used for pointers to insns.
`n'
`n' is equivalent to `i' except that it is printed differently in
debugging dumps. It is used for the line number or code number of
a `note' insn.
`S'
`S' indicates a string which is optional. In the RTL objects in
core, `S' is equivalent to `s', but when the object is read, from
an `md' file, the string value of this operand may be omitted. An
omitted string is taken to be the null string.
`V'
`V' indicates a vector which is optional. In the RTL objects in
core, `V' is equivalent to `E', but when the object is read from
an `md' file, the vector value of this operand may be omitted. An
omitted vector is effectively the same as a vector of no elements.
`B'
`B' indicates a pointer to basic block structure.
`0'
`0' means a slot whose contents do not fit any normal category.
`0' slots are not printed at all in dumps, and are often used in
special ways by small parts of the compiler.
There are macros to get the number of operands and the format of an
expression code:
`GET_RTX_LENGTH (CODE)'
Number of operands of an RTX of code CODE.
`GET_RTX_FORMAT (CODE)'
The format of an RTX of code CODE, as a C string.
Some classes of RTX codes always have the same format. For example, it
is safe to assume that all comparison operations have format `ee'.
`1'
All codes of this class have format `e'.
`<'
`c'
`2'
All codes of these classes have format `ee'.
`b'
`3'
All codes of these classes have format `eee'.
`i'
All codes of this class have formats that begin with `iuueiee'.
*Note Insns::. Note that not all RTL objects linked onto an insn
chain are of class `i'.
`o'
`m'
`x'
You can make no assumptions about the format of these codes.
File: gccint.info, Node: Accessors, Next: Special Accessors, Prev: RTL Classes, Up: RTL
10.3 Access to Operands
=======================
Operands of expressions are accessed using the macros `XEXP', `XINT',
`XWINT' and `XSTR'. Each of these macros takes two arguments: an
expression-pointer (RTX) and an operand number (counting from zero).
Thus,
XEXP (X, 2)
accesses operand 2 of expression X, as an expression.
XINT (X, 2)
accesses the same operand as an integer. `XSTR', used in the same
fashion, would access it as a string.
Any operand can be accessed as an integer, as an expression or as a
string. You must choose the correct method of access for the kind of
value actually stored in the operand. You would do this based on the
expression code of the containing expression. That is also how you
would know how many operands there are.
For example, if X is a `subreg' expression, you know that it has two
operands which can be correctly accessed as `XEXP (X, 0)' and `XINT (X,
1)'. If you did `XINT (X, 0)', you would get the address of the
expression operand but cast as an integer; that might occasionally be
useful, but it would be cleaner to write `(int) XEXP (X, 0)'. `XEXP
(X, 1)' would also compile without error, and would return the second,
integer operand cast as an expression pointer, which would probably
result in a crash when accessed. Nothing stops you from writing `XEXP
(X, 28)' either, but this will access memory past the end of the
expression with unpredictable results.
Access to operands which are vectors is more complicated. You can use
the macro `XVEC' to get the vector-pointer itself, or the macros
`XVECEXP' and `XVECLEN' to access the elements and length of a vector.
`XVEC (EXP, IDX)'
Access the vector-pointer which is operand number IDX in EXP.
`XVECLEN (EXP, IDX)'
Access the length (number of elements) in the vector which is in
operand number IDX in EXP. This value is an `int'.
`XVECEXP (EXP, IDX, ELTNUM)'
Access element number ELTNUM in the vector which is in operand
number IDX in EXP. This value is an RTX.
It is up to you to make sure that ELTNUM is not negative and is
less than `XVECLEN (EXP, IDX)'.
All the macros defined in this section expand into lvalues and
therefore can be used to assign the operands, lengths and vector
elements as well as to access them.
File: gccint.info, Node: Special Accessors, Next: Flags, Prev: Accessors, Up: RTL
10.4 Access to Special Operands
===============================
Some RTL nodes have special annotations associated with them.
`MEM'
`MEM_ALIAS_SET (X)'
If 0, X is not in any alias set, and may alias anything.
Otherwise, X can only alias `MEM's in a conflicting alias
set. This value is set in a language-dependent manner in the
front-end, and should not be altered in the back-end. In
some front-ends, these numbers may correspond in some way to
types, or other language-level entities, but they need not,
and the back-end makes no such assumptions. These set
numbers are tested with `alias_sets_conflict_p'.
`MEM_EXPR (X)'
If this register is known to hold the value of some user-level
declaration, this is that tree node. It may also be a
`COMPONENT_REF', in which case this is some field reference,
and `TREE_OPERAND (X, 0)' contains the declaration, or
another `COMPONENT_REF', or null if there is no compile-time
object associated with the reference.
`MEM_OFFSET (X)'
The offset from the start of `MEM_EXPR' as a `CONST_INT' rtx.
`MEM_SIZE (X)'
The size in bytes of the memory reference as a `CONST_INT'
rtx. This is mostly relevant for `BLKmode' references as
otherwise the size is implied by the mode.
`MEM_ALIGN (X)'
The known alignment in bits of the memory reference.
`MEM_ADDR_SPACE (X)'
The address space of the memory reference. This will
commonly be zero for the generic address space.
`REG'
`ORIGINAL_REGNO (X)'
This field holds the number the register "originally" had;
for a pseudo register turned into a hard reg this will hold
the old pseudo register number.
`REG_EXPR (X)'
If this register is known to hold the value of some user-level
declaration, this is that tree node.
`REG_OFFSET (X)'
If this register is known to hold the value of some user-level
declaration, this is the offset into that logical storage.
`SYMBOL_REF'
`SYMBOL_REF_DECL (X)'
If the `symbol_ref' X was created for a `VAR_DECL' or a
`FUNCTION_DECL', that tree is recorded here. If this value is
null, then X was created by back end code generation routines,
and there is no associated front end symbol table entry.
`SYMBOL_REF_DECL' may also point to a tree of class `'c'',
that is, some sort of constant. In this case, the
`symbol_ref' is an entry in the per-file constant pool;
again, there is no associated front end symbol table entry.
`SYMBOL_REF_CONSTANT (X)'
If `CONSTANT_POOL_ADDRESS_P (X)' is true, this is the constant
pool entry for X. It is null otherwise.
`SYMBOL_REF_DATA (X)'
A field of opaque type used to store `SYMBOL_REF_DECL' or
`SYMBOL_REF_CONSTANT'.
`SYMBOL_REF_FLAGS (X)'
In a `symbol_ref', this is used to communicate various
predicates about the symbol. Some of these are common enough
to be computed by common code, some are specific to the
target. The common bits are:
`SYMBOL_FLAG_FUNCTION'
Set if the symbol refers to a function.
`SYMBOL_FLAG_LOCAL'
Set if the symbol is local to this "module". See
`TARGET_BINDS_LOCAL_P'.
`SYMBOL_FLAG_EXTERNAL'
Set if this symbol is not defined in this translation
unit. Note that this is not the inverse of
`SYMBOL_FLAG_LOCAL'.
`SYMBOL_FLAG_SMALL'
Set if the symbol is located in the small data section.
See `TARGET_IN_SMALL_DATA_P'.
`SYMBOL_REF_TLS_MODEL (X)'
This is a multi-bit field accessor that returns the
`tls_model' to be used for a thread-local storage
symbol. It returns zero for non-thread-local symbols.
`SYMBOL_FLAG_HAS_BLOCK_INFO'
Set if the symbol has `SYMBOL_REF_BLOCK' and
`SYMBOL_REF_BLOCK_OFFSET' fields.
`SYMBOL_FLAG_ANCHOR'
Set if the symbol is used as a section anchor. "Section
anchors" are symbols that have a known position within
an `object_block' and that can be used to access nearby
members of that block. They are used to implement
`-fsection-anchors'.
If this flag is set, then `SYMBOL_FLAG_HAS_BLOCK_INFO'
will be too.
Bits beginning with `SYMBOL_FLAG_MACH_DEP' are available for
the target's use.
`SYMBOL_REF_BLOCK (X)'
If `SYMBOL_REF_HAS_BLOCK_INFO_P (X)', this is the `object_block'
structure to which the symbol belongs, or `NULL' if it has not
been assigned a block.
`SYMBOL_REF_BLOCK_OFFSET (X)'
If `SYMBOL_REF_HAS_BLOCK_INFO_P (X)', this is the offset of X from
the first object in `SYMBOL_REF_BLOCK (X)'. The value is negative
if X has not yet been assigned to a block, or it has not been
given an offset within that block.
File: gccint.info, Node: Flags, Next: Machine Modes, Prev: Special Accessors, Up: RTL
10.5 Flags in an RTL Expression
===============================
RTL expressions contain several flags (one-bit bit-fields) that are
used in certain types of expression. Most often they are accessed with
the following macros, which expand into lvalues.
`CONSTANT_POOL_ADDRESS_P (X)'
Nonzero in a `symbol_ref' if it refers to part of the current
function's constant pool. For most targets these addresses are in
a `.rodata' section entirely separate from the function, but for
some targets the addresses are close to the beginning of the
function. In either case GCC assumes these addresses can be
addressed directly, perhaps with the help of base registers.
Stored in the `unchanging' field and printed as `/u'.
`RTL_CONST_CALL_P (X)'
In a `call_insn' indicates that the insn represents a call to a
const function. Stored in the `unchanging' field and printed as
`/u'.
`RTL_PURE_CALL_P (X)'
In a `call_insn' indicates that the insn represents a call to a
pure function. Stored in the `return_val' field and printed as
`/i'.
`RTL_CONST_OR_PURE_CALL_P (X)'
In a `call_insn', true if `RTL_CONST_CALL_P' or `RTL_PURE_CALL_P'
is true.
`RTL_LOOPING_CONST_OR_PURE_CALL_P (X)'
In a `call_insn' indicates that the insn represents a possibly
infinite looping call to a const or pure function. Stored in the
`call' field and printed as `/c'. Only true if one of
`RTL_CONST_CALL_P' or `RTL_PURE_CALL_P' is true.
`INSN_ANNULLED_BRANCH_P (X)'
In a `jump_insn', `call_insn', or `insn' indicates that the branch
is an annulling one. See the discussion under `sequence' below.
Stored in the `unchanging' field and printed as `/u'.
`INSN_DELETED_P (X)'
In an `insn', `call_insn', `jump_insn', `code_label', `barrier',
or `note', nonzero if the insn has been deleted. Stored in the
`volatil' field and printed as `/v'.
`INSN_FROM_TARGET_P (X)'
In an `insn' or `jump_insn' or `call_insn' in a delay slot of a
branch, indicates that the insn is from the target of the branch.
If the branch insn has `INSN_ANNULLED_BRANCH_P' set, this insn
will only be executed if the branch is taken. For annulled
branches with `INSN_FROM_TARGET_P' clear, the insn will be
executed only if the branch is not taken. When
`INSN_ANNULLED_BRANCH_P' is not set, this insn will always be
executed. Stored in the `in_struct' field and printed as `/s'.
`LABEL_PRESERVE_P (X)'
In a `code_label' or `note', indicates that the label is
referenced by code or data not visible to the RTL of a given
function. Labels referenced by a non-local goto will have this
bit set. Stored in the `in_struct' field and printed as `/s'.
`LABEL_REF_NONLOCAL_P (X)'
In `label_ref' and `reg_label' expressions, nonzero if this is a
reference to a non-local label. Stored in the `volatil' field and
printed as `/v'.
`MEM_IN_STRUCT_P (X)'
In `mem' expressions, nonzero for reference to an entire structure,
union or array, or to a component of one. Zero for references to a
scalar variable or through a pointer to a scalar. If both this
flag and `MEM_SCALAR_P' are clear, then we don't know whether this
`mem' is in a structure or not. Both flags should never be
simultaneously set. Stored in the `in_struct' field and printed
as `/s'.
`MEM_KEEP_ALIAS_SET_P (X)'
In `mem' expressions, 1 if we should keep the alias set for this
mem unchanged when we access a component. Set to 1, for example,
when we are already in a non-addressable component of an aggregate.
Stored in the `jump' field and printed as `/j'.
`MEM_SCALAR_P (X)'
In `mem' expressions, nonzero for reference to a scalar known not
to be a member of a structure, union, or array. Zero for such
references and for indirections through pointers, even pointers
pointing to scalar types. If both this flag and `MEM_IN_STRUCT_P'
are clear, then we don't know whether this `mem' is in a structure
or not. Both flags should never be simultaneously set. Stored in
the `return_val' field and printed as `/i'.
`MEM_VOLATILE_P (X)'
In `mem', `asm_operands', and `asm_input' expressions, nonzero for
volatile memory references. Stored in the `volatil' field and
printed as `/v'.
`MEM_NOTRAP_P (X)'
In `mem', nonzero for memory references that will not trap.
Stored in the `call' field and printed as `/c'.
`MEM_POINTER (X)'
Nonzero in a `mem' if the memory reference holds a pointer.
Stored in the `frame_related' field and printed as `/f'.
`REG_FUNCTION_VALUE_P (X)'
Nonzero in a `reg' if it is the place in which this function's
value is going to be returned. (This happens only in a hard
register.) Stored in the `return_val' field and printed as `/i'.
`REG_POINTER (X)'
Nonzero in a `reg' if the register holds a pointer. Stored in the
`frame_related' field and printed as `/f'.
`REG_USERVAR_P (X)'
In a `reg', nonzero if it corresponds to a variable present in the
user's source code. Zero for temporaries generated internally by
the compiler. Stored in the `volatil' field and printed as `/v'.
The same hard register may be used also for collecting the values
of functions called by this one, but `REG_FUNCTION_VALUE_P' is zero
in this kind of use.
`RTX_FRAME_RELATED_P (X)'
Nonzero in an `insn', `call_insn', `jump_insn', `barrier', or
`set' which is part of a function prologue and sets the stack
pointer, sets the frame pointer, or saves a register. This flag
should also be set on an instruction that sets up a temporary
register to use in place of the frame pointer. Stored in the
`frame_related' field and printed as `/f'.
In particular, on RISC targets where there are limits on the sizes
of immediate constants, it is sometimes impossible to reach the
register save area directly from the stack pointer. In that case,
a temporary register is used that is near enough to the register
save area, and the Canonical Frame Address, i.e., DWARF2's logical
frame pointer, register must (temporarily) be changed to be this
temporary register. So, the instruction that sets this temporary
register must be marked as `RTX_FRAME_RELATED_P'.
If the marked instruction is overly complex (defined in terms of
what `dwarf2out_frame_debug_expr' can handle), you will also have
to create a `REG_FRAME_RELATED_EXPR' note and attach it to the
instruction. This note should contain a simple expression of the
computation performed by this instruction, i.e., one that
`dwarf2out_frame_debug_expr' can handle.
This flag is required for exception handling support on targets
with RTL prologues.
`MEM_READONLY_P (X)'
Nonzero in a `mem', if the memory is statically allocated and
read-only.
Read-only in this context means never modified during the lifetime
of the program, not necessarily in ROM or in write-disabled pages.
A common example of the later is a shared library's global offset
table. This table is initialized by the runtime loader, so the
memory is technically writable, but after control is transfered
from the runtime loader to the application, this memory will never
be subsequently modified.
Stored in the `unchanging' field and printed as `/u'.
`SCHED_GROUP_P (X)'
During instruction scheduling, in an `insn', `call_insn' or
`jump_insn', indicates that the previous insn must be scheduled
together with this insn. This is used to ensure that certain
groups of instructions will not be split up by the instruction
scheduling pass, for example, `use' insns before a `call_insn' may
not be separated from the `call_insn'. Stored in the `in_struct'
field and printed as `/s'.
`SET_IS_RETURN_P (X)'
For a `set', nonzero if it is for a return. Stored in the `jump'
field and printed as `/j'.
`SIBLING_CALL_P (X)'
For a `call_insn', nonzero if the insn is a sibling call. Stored
in the `jump' field and printed as `/j'.
`STRING_POOL_ADDRESS_P (X)'
For a `symbol_ref' expression, nonzero if it addresses this
function's string constant pool. Stored in the `frame_related'
field and printed as `/f'.
`SUBREG_PROMOTED_UNSIGNED_P (X)'
Returns a value greater then zero for a `subreg' that has
`SUBREG_PROMOTED_VAR_P' nonzero if the object being referenced is
kept zero-extended, zero if it is kept sign-extended, and less
then zero if it is extended some other way via the `ptr_extend'
instruction. Stored in the `unchanging' field and `volatil'
field, printed as `/u' and `/v'. This macro may only be used to
get the value it may not be used to change the value. Use
`SUBREG_PROMOTED_UNSIGNED_SET' to change the value.
`SUBREG_PROMOTED_UNSIGNED_SET (X)'
Set the `unchanging' and `volatil' fields in a `subreg' to reflect
zero, sign, or other extension. If `volatil' is zero, then
`unchanging' as nonzero means zero extension and as zero means
sign extension. If `volatil' is nonzero then some other type of
extension was done via the `ptr_extend' instruction.
`SUBREG_PROMOTED_VAR_P (X)'
Nonzero in a `subreg' if it was made when accessing an object that
was promoted to a wider mode in accord with the `PROMOTED_MODE'
machine description macro (*note Storage Layout::). In this case,
the mode of the `subreg' is the declared mode of the object and
the mode of `SUBREG_REG' is the mode of the register that holds
the object. Promoted variables are always either sign- or
zero-extended to the wider mode on every assignment. Stored in
the `in_struct' field and printed as `/s'.
`SYMBOL_REF_USED (X)'
In a `symbol_ref', indicates that X has been used. This is
normally only used to ensure that X is only declared external
once. Stored in the `used' field.
`SYMBOL_REF_WEAK (X)'
In a `symbol_ref', indicates that X has been declared weak.
Stored in the `return_val' field and printed as `/i'.
`SYMBOL_REF_FLAG (X)'
In a `symbol_ref', this is used as a flag for machine-specific
purposes. Stored in the `volatil' field and printed as `/v'.
Most uses of `SYMBOL_REF_FLAG' are historic and may be subsumed by
`SYMBOL_REF_FLAGS'. Certainly use of `SYMBOL_REF_FLAGS' is
mandatory if the target requires more than one bit of storage.
`PREFETCH_SCHEDULE_BARRIER_P (X)'
In a `prefetch', indicates that the prefetch is a scheduling
barrier. No other INSNs will be moved over it. Stored in the
`volatil' field and printed as `/v'.
These are the fields to which the above macros refer:
`call'
In a `mem', 1 means that the memory reference will not trap.
In a `call', 1 means that this pure or const call may possibly
infinite loop.
In an RTL dump, this flag is represented as `/c'.
`frame_related'
In an `insn' or `set' expression, 1 means that it is part of a
function prologue and sets the stack pointer, sets the frame
pointer, saves a register, or sets up a temporary register to use
in place of the frame pointer.
In `reg' expressions, 1 means that the register holds a pointer.
In `mem' expressions, 1 means that the memory reference holds a
pointer.
In `symbol_ref' expressions, 1 means that the reference addresses
this function's string constant pool.
In an RTL dump, this flag is represented as `/f'.
`in_struct'
In `mem' expressions, it is 1 if the memory datum referred to is
all or part of a structure or array; 0 if it is (or might be) a
scalar variable. A reference through a C pointer has 0 because
the pointer might point to a scalar variable. This information
allows the compiler to determine something about possible cases of
aliasing.
In `reg' expressions, it is 1 if the register has its entire life
contained within the test expression of some loop.
In `subreg' expressions, 1 means that the `subreg' is accessing an
object that has had its mode promoted from a wider mode.
In `label_ref' expressions, 1 means that the referenced label is
outside the innermost loop containing the insn in which the
`label_ref' was found.
In `code_label' expressions, it is 1 if the label may never be
deleted. This is used for labels which are the target of
non-local gotos. Such a label that would have been deleted is
replaced with a `note' of type `NOTE_INSN_DELETED_LABEL'.
In an `insn' during dead-code elimination, 1 means that the insn is
dead code.
In an `insn' or `jump_insn' during reorg for an insn in the delay
slot of a branch, 1 means that this insn is from the target of the
branch.
In an `insn' during instruction scheduling, 1 means that this insn
must be scheduled as part of a group together with the previous
insn.
In an RTL dump, this flag is represented as `/s'.
`return_val'
In `reg' expressions, 1 means the register contains the value to
be returned by the current function. On machines that pass
parameters in registers, the same register number may be used for
parameters as well, but this flag is not set on such uses.
In `mem' expressions, 1 means the memory reference is to a scalar
known not to be a member of a structure, union, or array.
In `symbol_ref' expressions, 1 means the referenced symbol is weak.
In `call' expressions, 1 means the call is pure.
In an RTL dump, this flag is represented as `/i'.
`jump'
In a `mem' expression, 1 means we should keep the alias set for
this mem unchanged when we access a component.
In a `set', 1 means it is for a return.
In a `call_insn', 1 means it is a sibling call.
In an RTL dump, this flag is represented as `/j'.
`unchanging'
In `reg' and `mem' expressions, 1 means that the value of the
expression never changes.
In `subreg' expressions, it is 1 if the `subreg' references an
unsigned object whose mode has been promoted to a wider mode.
In an `insn' or `jump_insn' in the delay slot of a branch
instruction, 1 means an annulling branch should be used.
In a `symbol_ref' expression, 1 means that this symbol addresses
something in the per-function constant pool.
In a `call_insn' 1 means that this instruction is a call to a const
function.
In an RTL dump, this flag is represented as `/u'.
`used'
This flag is used directly (without an access macro) at the end of
RTL generation for a function, to count the number of times an
expression appears in insns. Expressions that appear more than
once are copied, according to the rules for shared structure
(*note Sharing::).
For a `reg', it is used directly (without an access macro) by the
leaf register renumbering code to ensure that each register is only
renumbered once.
In a `symbol_ref', it indicates that an external declaration for
the symbol has already been written.
`volatil'
In a `mem', `asm_operands', or `asm_input' expression, it is 1 if
the memory reference is volatile. Volatile memory references may
not be deleted, reordered or combined.
In a `symbol_ref' expression, it is used for machine-specific
purposes.
In a `reg' expression, it is 1 if the value is a user-level
variable. 0 indicates an internal compiler temporary.
In an `insn', 1 means the insn has been deleted.
In `label_ref' and `reg_label' expressions, 1 means a reference to
a non-local label.
In `prefetch' expressions, 1 means that the containing insn is a
scheduling barrier.
In an RTL dump, this flag is represented as `/v'.
File: gccint.info, Node: Machine Modes, Next: Constants, Prev: Flags, Up: RTL
10.6 Machine Modes
==================
A machine mode describes a size of data object and the representation
used for it. In the C code, machine modes are represented by an
enumeration type, `enum machine_mode', defined in `machmode.def'. Each
RTL expression has room for a machine mode and so do certain kinds of
tree expressions (declarations and types, to be precise).
In debugging dumps and machine descriptions, the machine mode of an RTL
expression is written after the expression code with a colon to separate
them. The letters `mode' which appear at the end of each machine mode
name are omitted. For example, `(reg:SI 38)' is a `reg' expression
with machine mode `SImode'. If the mode is `VOIDmode', it is not
written at all.
Here is a table of machine modes. The term "byte" below refers to an
object of `BITS_PER_UNIT' bits (*note Storage Layout::).
`BImode'
"Bit" mode represents a single bit, for predicate registers.
`QImode'
"Quarter-Integer" mode represents a single byte treated as an
integer.
`HImode'
"Half-Integer" mode represents a two-byte integer.
`PSImode'
"Partial Single Integer" mode represents an integer which occupies
four bytes but which doesn't really use all four. On some
machines, this is the right mode to use for pointers.
`SImode'
"Single Integer" mode represents a four-byte integer.
`PDImode'
"Partial Double Integer" mode represents an integer which occupies
eight bytes but which doesn't really use all eight. On some
machines, this is the right mode to use for certain pointers.
`DImode'
"Double Integer" mode represents an eight-byte integer.
`TImode'
"Tetra Integer" (?) mode represents a sixteen-byte integer.
`OImode'
"Octa Integer" (?) mode represents a thirty-two-byte integer.
`QFmode'
"Quarter-Floating" mode represents a quarter-precision (single
byte) floating point number.
`HFmode'
"Half-Floating" mode represents a half-precision (two byte)
floating point number.
`TQFmode'
"Three-Quarter-Floating" (?) mode represents a
three-quarter-precision (three byte) floating point number.
`SFmode'
"Single Floating" mode represents a four byte floating point
number. In the common case, of a processor with IEEE arithmetic
and 8-bit bytes, this is a single-precision IEEE floating point
number; it can also be used for double-precision (on processors
with 16-bit bytes) and single-precision VAX and IBM types.
`DFmode'
"Double Floating" mode represents an eight byte floating point
number. In the common case, of a processor with IEEE arithmetic
and 8-bit bytes, this is a double-precision IEEE floating point
number.
`XFmode'
"Extended Floating" mode represents an IEEE extended floating point
number. This mode only has 80 meaningful bits (ten bytes). Some
processors require such numbers to be padded to twelve bytes,
others to sixteen; this mode is used for either.
`SDmode'
"Single Decimal Floating" mode represents a four byte decimal
floating point number (as distinct from conventional binary
floating point).
`DDmode'
"Double Decimal Floating" mode represents an eight byte decimal
floating point number.
`TDmode'
"Tetra Decimal Floating" mode represents a sixteen byte decimal
floating point number all 128 of whose bits are meaningful.
`TFmode'
"Tetra Floating" mode represents a sixteen byte floating point
number all 128 of whose bits are meaningful. One common use is the
IEEE quad-precision format.
`QQmode'
"Quarter-Fractional" mode represents a single byte treated as a
signed fractional number. The default format is "s.7".
`HQmode'
"Half-Fractional" mode represents a two-byte signed fractional
number. The default format is "s.15".
`SQmode'
"Single Fractional" mode represents a four-byte signed fractional
number. The default format is "s.31".
`DQmode'
"Double Fractional" mode represents an eight-byte signed
fractional number. The default format is "s.63".
`TQmode'
"Tetra Fractional" mode represents a sixteen-byte signed
fractional number. The default format is "s.127".
`UQQmode'
"Unsigned Quarter-Fractional" mode represents a single byte
treated as an unsigned fractional number. The default format is
".8".
`UHQmode'
"Unsigned Half-Fractional" mode represents a two-byte unsigned
fractional number. The default format is ".16".
`USQmode'
"Unsigned Single Fractional" mode represents a four-byte unsigned
fractional number. The default format is ".32".
`UDQmode'
"Unsigned Double Fractional" mode represents an eight-byte unsigned
fractional number. The default format is ".64".
`UTQmode'
"Unsigned Tetra Fractional" mode represents a sixteen-byte unsigned
fractional number. The default format is ".128".
`HAmode'
"Half-Accumulator" mode represents a two-byte signed accumulator.
The default format is "s8.7".
`SAmode'
"Single Accumulator" mode represents a four-byte signed
accumulator. The default format is "s16.15".
`DAmode'
"Double Accumulator" mode represents an eight-byte signed
accumulator. The default format is "s32.31".
`TAmode'
"Tetra Accumulator" mode represents a sixteen-byte signed
accumulator. The default format is "s64.63".
`UHAmode'
"Unsigned Half-Accumulator" mode represents a two-byte unsigned
accumulator. The default format is "8.8".
`USAmode'
"Unsigned Single Accumulator" mode represents a four-byte unsigned
accumulator. The default format is "16.16".
`UDAmode'
"Unsigned Double Accumulator" mode represents an eight-byte
unsigned accumulator. The default format is "32.32".
`UTAmode'
"Unsigned Tetra Accumulator" mode represents a sixteen-byte
unsigned accumulator. The default format is "64.64".
`CCmode'
"Condition Code" mode represents the value of a condition code,
which is a machine-specific set of bits used to represent the
result of a comparison operation. Other machine-specific modes
may also be used for the condition code. These modes are not used
on machines that use `cc0' (*note Condition Code::).
`BLKmode'
"Block" mode represents values that are aggregates to which none of
the other modes apply. In RTL, only memory references can have
this mode, and only if they appear in string-move or vector
instructions. On machines which have no such instructions,
`BLKmode' will not appear in RTL.
`VOIDmode'
Void mode means the absence of a mode or an unspecified mode. For
example, RTL expressions of code `const_int' have mode `VOIDmode'
because they can be taken to have whatever mode the context
requires. In debugging dumps of RTL, `VOIDmode' is expressed by
the absence of any mode.
`QCmode, HCmode, SCmode, DCmode, XCmode, TCmode'
These modes stand for a complex number represented as a pair of
floating point values. The floating point values are in `QFmode',
`HFmode', `SFmode', `DFmode', `XFmode', and `TFmode', respectively.
`CQImode, CHImode, CSImode, CDImode, CTImode, COImode'
These modes stand for a complex number represented as a pair of
integer values. The integer values are in `QImode', `HImode',
`SImode', `DImode', `TImode', and `OImode', respectively.
The machine description defines `Pmode' as a C macro which expands
into the machine mode used for addresses. Normally this is the mode
whose size is `BITS_PER_WORD', `SImode' on 32-bit machines.
The only modes which a machine description must support are `QImode',
and the modes corresponding to `BITS_PER_WORD', `FLOAT_TYPE_SIZE' and
`DOUBLE_TYPE_SIZE'. The compiler will attempt to use `DImode' for
8-byte structures and unions, but this can be prevented by overriding
the definition of `MAX_FIXED_MODE_SIZE'. Alternatively, you can have
the compiler use `TImode' for 16-byte structures and unions. Likewise,
you can arrange for the C type `short int' to avoid using `HImode'.
Very few explicit references to machine modes remain in the compiler
and these few references will soon be removed. Instead, the machine
modes are divided into mode classes. These are represented by the
enumeration type `enum mode_class' defined in `machmode.h'. The
possible mode classes are:
`MODE_INT'
Integer modes. By default these are `BImode', `QImode', `HImode',
`SImode', `DImode', `TImode', and `OImode'.
`MODE_PARTIAL_INT'
The "partial integer" modes, `PQImode', `PHImode', `PSImode' and
`PDImode'.
`MODE_FLOAT'
Floating point modes. By default these are `QFmode', `HFmode',
`TQFmode', `SFmode', `DFmode', `XFmode' and `TFmode'.
`MODE_DECIMAL_FLOAT'
Decimal floating point modes. By default these are `SDmode',
`DDmode' and `TDmode'.
`MODE_FRACT'
Signed fractional modes. By default these are `QQmode', `HQmode',
`SQmode', `DQmode' and `TQmode'.
`MODE_UFRACT'
Unsigned fractional modes. By default these are `UQQmode',
`UHQmode', `USQmode', `UDQmode' and `UTQmode'.
`MODE_ACCUM'
Signed accumulator modes. By default these are `HAmode',
`SAmode', `DAmode' and `TAmode'.
`MODE_UACCUM'
Unsigned accumulator modes. By default these are `UHAmode',
`USAmode', `UDAmode' and `UTAmode'.
`MODE_COMPLEX_INT'
Complex integer modes. (These are not currently implemented).
`MODE_COMPLEX_FLOAT'
Complex floating point modes. By default these are `QCmode',
`HCmode', `SCmode', `DCmode', `XCmode', and `TCmode'.
`MODE_FUNCTION'
Algol or Pascal function variables including a static chain.
(These are not currently implemented).
`MODE_CC'
Modes representing condition code values. These are `CCmode' plus
any `CC_MODE' modes listed in the `MACHINE-modes.def'. *Note Jump
Patterns::, also see *note Condition Code::.
`MODE_RANDOM'
This is a catchall mode class for modes which don't fit into the
above classes. Currently `VOIDmode' and `BLKmode' are in
`MODE_RANDOM'.
Here are some C macros that relate to machine modes:
`GET_MODE (X)'
Returns the machine mode of the RTX X.
`PUT_MODE (X, NEWMODE)'
Alters the machine mode of the RTX X to be NEWMODE.
`NUM_MACHINE_MODES'
Stands for the number of machine modes available on the target
machine. This is one greater than the largest numeric value of any
machine mode.
`GET_MODE_NAME (M)'
Returns the name of mode M as a string.
`GET_MODE_CLASS (M)'
Returns the mode class of mode M.
`GET_MODE_WIDER_MODE (M)'
Returns the next wider natural mode. For example, the expression
`GET_MODE_WIDER_MODE (QImode)' returns `HImode'.
`GET_MODE_SIZE (M)'
Returns the size in bytes of a datum of mode M.
`GET_MODE_BITSIZE (M)'
Returns the size in bits of a datum of mode M.
`GET_MODE_IBIT (M)'
Returns the number of integral bits of a datum of fixed-point mode
M.
`GET_MODE_FBIT (M)'
Returns the number of fractional bits of a datum of fixed-point
mode M.
`GET_MODE_MASK (M)'
Returns a bitmask containing 1 for all bits in a word that fit
within mode M. This macro can only be used for modes whose
bitsize is less than or equal to `HOST_BITS_PER_INT'.
`GET_MODE_ALIGNMENT (M)'
Return the required alignment, in bits, for an object of mode M.
`GET_MODE_UNIT_SIZE (M)'
Returns the size in bytes of the subunits of a datum of mode M.
This is the same as `GET_MODE_SIZE' except in the case of complex
modes. For them, the unit size is the size of the real or
imaginary part.
`GET_MODE_NUNITS (M)'
Returns the number of units contained in a mode, i.e.,
`GET_MODE_SIZE' divided by `GET_MODE_UNIT_SIZE'.
`GET_CLASS_NARROWEST_MODE (C)'
Returns the narrowest mode in mode class C.
The global variables `byte_mode' and `word_mode' contain modes whose
classes are `MODE_INT' and whose bitsizes are either `BITS_PER_UNIT' or
`BITS_PER_WORD', respectively. On 32-bit machines, these are `QImode'
and `SImode', respectively.
File: gccint.info, Node: Constants, Next: Regs and Memory, Prev: Machine Modes, Up: RTL
10.7 Constant Expression Types
==============================
The simplest RTL expressions are those that represent constant values.
`(const_int I)'
This type of expression represents the integer value I. I is
customarily accessed with the macro `INTVAL' as in `INTVAL (EXP)',
which is equivalent to `XWINT (EXP, 0)'.
Constants generated for modes with fewer bits than `HOST_WIDE_INT'
must be sign extended to full width (e.g., with `gen_int_mode').
There is only one expression object for the integer value zero; it
is the value of the variable `const0_rtx'. Likewise, the only
expression for integer value one is found in `const1_rtx', the only
expression for integer value two is found in `const2_rtx', and the
only expression for integer value negative one is found in
`constm1_rtx'. Any attempt to create an expression of code
`const_int' and value zero, one, two or negative one will return
`const0_rtx', `const1_rtx', `const2_rtx' or `constm1_rtx' as
appropriate.
Similarly, there is only one object for the integer whose value is
`STORE_FLAG_VALUE'. It is found in `const_true_rtx'. If
`STORE_FLAG_VALUE' is one, `const_true_rtx' and `const1_rtx' will
point to the same object. If `STORE_FLAG_VALUE' is -1,
`const_true_rtx' and `constm1_rtx' will point to the same object.
`(const_double:M I0 I1 ...)'
Represents either a floating-point constant of mode M or an
integer constant too large to fit into `HOST_BITS_PER_WIDE_INT'
bits but small enough to fit within twice that number of bits (GCC
does not provide a mechanism to represent even larger constants).
In the latter case, M will be `VOIDmode'.
If M is `VOIDmode', the bits of the value are stored in I0 and I1.
I0 is customarily accessed with the macro `CONST_DOUBLE_LOW' and
I1 with `CONST_DOUBLE_HIGH'.
If the constant is floating point (regardless of its precision),
then the number of integers used to store the value depends on the
size of `REAL_VALUE_TYPE' (*note Floating Point::). The integers
represent a floating point number, but not precisely in the target
machine's or host machine's floating point format. To convert
them to the precise bit pattern used by the target machine, use
the macro `REAL_VALUE_TO_TARGET_DOUBLE' and friends (*note Data
Output::).
`(const_fixed:M ...)'
Represents a fixed-point constant of mode M. The operand is a
data structure of type `struct fixed_value' and is accessed with
the macro `CONST_FIXED_VALUE'. The high part of data is accessed
with `CONST_FIXED_VALUE_HIGH'; the low part is accessed with
`CONST_FIXED_VALUE_LOW'.
`(const_vector:M [X0 X1 ...])'
Represents a vector constant. The square brackets stand for the
vector containing the constant elements. X0, X1 and so on are the
`const_int', `const_double' or `const_fixed' elements.
The number of units in a `const_vector' is obtained with the macro
`CONST_VECTOR_NUNITS' as in `CONST_VECTOR_NUNITS (V)'.
Individual elements in a vector constant are accessed with the
macro `CONST_VECTOR_ELT' as in `CONST_VECTOR_ELT (V, N)' where V
is the vector constant and N is the element desired.
`(const_string STR)'
Represents a constant string with value STR. Currently this is
used only for insn attributes (*note Insn Attributes::) since
constant strings in C are placed in memory.
`(symbol_ref:MODE SYMBOL)'
Represents the value of an assembler label for data. SYMBOL is a
string that describes the name of the assembler label. If it
starts with a `*', the label is the rest of SYMBOL not including
the `*'. Otherwise, the label is SYMBOL, usually prefixed with
`_'.
The `symbol_ref' contains a mode, which is usually `Pmode'.
Usually that is the only mode for which a symbol is directly valid.
`(label_ref:MODE LABEL)'
Represents the value of an assembler label for code. It contains
one operand, an expression, which must be a `code_label' or a
`note' of type `NOTE_INSN_DELETED_LABEL' that appears in the
instruction sequence to identify the place where the label should
go.
The reason for using a distinct expression type for code label
references is so that jump optimization can distinguish them.
The `label_ref' contains a mode, which is usually `Pmode'.
Usually that is the only mode for which a label is directly valid.
`(const:M EXP)'
Represents a constant that is the result of an assembly-time
arithmetic computation. The operand, EXP, is an expression that
contains only constants (`const_int', `symbol_ref' and `label_ref'
expressions) combined with `plus' and `minus'. However, not all
combinations are valid, since the assembler cannot do arbitrary
arithmetic on relocatable symbols.
M should be `Pmode'.
`(high:M EXP)'
Represents the high-order bits of EXP, usually a `symbol_ref'.
The number of bits is machine-dependent and is normally the number
of bits specified in an instruction that initializes the high
order bits of a register. It is used with `lo_sum' to represent
the typical two-instruction sequence used in RISC machines to
reference a global memory location.
M should be `Pmode'.
The macro `CONST0_RTX (MODE)' refers to an expression with value 0 in
mode MODE. If mode MODE is of mode class `MODE_INT', it returns
`const0_rtx'. If mode MODE is of mode class `MODE_FLOAT', it returns a
`CONST_DOUBLE' expression in mode MODE. Otherwise, it returns a
`CONST_VECTOR' expression in mode MODE. Similarly, the macro
`CONST1_RTX (MODE)' refers to an expression with value 1 in mode MODE
and similarly for `CONST2_RTX'. The `CONST1_RTX' and `CONST2_RTX'
macros are undefined for vector modes.
File: gccint.info, Node: Regs and Memory, Next: Arithmetic, Prev: Constants, Up: RTL
10.8 Registers and Memory
=========================
Here are the RTL expression types for describing access to machine
registers and to main memory.
`(reg:M N)'
For small values of the integer N (those that are less than
`FIRST_PSEUDO_REGISTER'), this stands for a reference to machine
register number N: a "hard register". For larger values of N, it
stands for a temporary value or "pseudo register". The compiler's
strategy is to generate code assuming an unlimited number of such
pseudo registers, and later convert them into hard registers or
into memory references.
M is the machine mode of the reference. It is necessary because
machines can generally refer to each register in more than one
mode. For example, a register may contain a full word but there
may be instructions to refer to it as a half word or as a single
byte, as well as instructions to refer to it as a floating point
number of various precisions.
Even for a register that the machine can access in only one mode,
the mode must always be specified.
The symbol `FIRST_PSEUDO_REGISTER' is defined by the machine
description, since the number of hard registers on the machine is
an invariant characteristic of the machine. Note, however, that
not all of the machine registers must be general registers. All
the machine registers that can be used for storage of data are
given hard register numbers, even those that can be used only in
certain instructions or can hold only certain types of data.
A hard register may be accessed in various modes throughout one
function, but each pseudo register is given a natural mode and is
accessed only in that mode. When it is necessary to describe an
access to a pseudo register using a nonnatural mode, a `subreg'
expression is used.
A `reg' expression with a machine mode that specifies more than
one word of data may actually stand for several consecutive
registers. If in addition the register number specifies a
hardware register, then it actually represents several consecutive
hardware registers starting with the specified one.
Each pseudo register number used in a function's RTL code is
represented by a unique `reg' expression.
Some pseudo register numbers, those within the range of
`FIRST_VIRTUAL_REGISTER' to `LAST_VIRTUAL_REGISTER' only appear
during the RTL generation phase and are eliminated before the
optimization phases. These represent locations in the stack frame
that cannot be determined until RTL generation for the function
has been completed. The following virtual register numbers are
defined:
`VIRTUAL_INCOMING_ARGS_REGNUM'
This points to the first word of the incoming arguments
passed on the stack. Normally these arguments are placed
there by the caller, but the callee may have pushed some
arguments that were previously passed in registers.
When RTL generation is complete, this virtual register is
replaced by the sum of the register given by
`ARG_POINTER_REGNUM' and the value of `FIRST_PARM_OFFSET'.
`VIRTUAL_STACK_VARS_REGNUM'
If `FRAME_GROWS_DOWNWARD' is defined to a nonzero value, this
points to immediately above the first variable on the stack.
Otherwise, it points to the first variable on the stack.
`VIRTUAL_STACK_VARS_REGNUM' is replaced with the sum of the
register given by `FRAME_POINTER_REGNUM' and the value
`STARTING_FRAME_OFFSET'.
`VIRTUAL_STACK_DYNAMIC_REGNUM'
This points to the location of dynamically allocated memory
on the stack immediately after the stack pointer has been
adjusted by the amount of memory desired.
This virtual register is replaced by the sum of the register
given by `STACK_POINTER_REGNUM' and the value
`STACK_DYNAMIC_OFFSET'.
`VIRTUAL_OUTGOING_ARGS_REGNUM'
This points to the location in the stack at which outgoing
arguments should be written when the stack is pre-pushed
(arguments pushed using push insns should always use
`STACK_POINTER_REGNUM').
This virtual register is replaced by the sum of the register
given by `STACK_POINTER_REGNUM' and the value
`STACK_POINTER_OFFSET'.
`(subreg:M1 REG:M2 BYTENUM)'
`subreg' expressions are used to refer to a register in a machine
mode other than its natural one, or to refer to one register of a
multi-part `reg' that actually refers to several registers.
Each pseudo register has a natural mode. If it is necessary to
operate on it in a different mode, the register must be enclosed
in a `subreg'.
There are currently three supported types for the first operand of
a `subreg':
* pseudo registers This is the most common case. Most
`subreg's have pseudo `reg's as their first operand.
* mem `subreg's of `mem' were common in earlier versions of GCC
and are still supported. During the reload pass these are
replaced by plain `mem's. On machines that do not do
instruction scheduling, use of `subreg's of `mem' are still
used, but this is no longer recommended. Such `subreg's are
considered to be `register_operand's rather than
`memory_operand's before and during reload. Because of this,
the scheduling passes cannot properly schedule instructions
with `subreg's of `mem', so for machines that do scheduling,
`subreg's of `mem' should never be used. To support this,
the combine and recog passes have explicit code to inhibit
the creation of `subreg's of `mem' when `INSN_SCHEDULING' is
defined.
The use of `subreg's of `mem' after the reload pass is an area
that is not well understood and should be avoided. There is
still some code in the compiler to support this, but this
code has possibly rotted. This use of `subreg's is
discouraged and will most likely not be supported in the
future.
* hard registers It is seldom necessary to wrap hard registers
in `subreg's; such registers would normally reduce to a
single `reg' rtx. This use of `subreg's is discouraged and
may not be supported in the future.
`subreg's of `subreg's are not supported. Using
`simplify_gen_subreg' is the recommended way to avoid this problem.
`subreg's come in two distinct flavors, each having its own usage
and rules:
Paradoxical subregs
When M1 is strictly wider than M2, the `subreg' expression is
called "paradoxical". The canonical test for this class of
`subreg' is:
GET_MODE_SIZE (M1) > GET_MODE_SIZE (M2)
Paradoxical `subreg's can be used as both lvalues and rvalues.
When used as an lvalue, the low-order bits of the source value
are stored in REG and the high-order bits are discarded.
When used as an rvalue, the low-order bits of the `subreg' are
taken from REG while the high-order bits may or may not be
defined.
The high-order bits of rvalues are in the following
circumstances:
* `subreg's of `mem' When M2 is smaller than a word, the
macro `LOAD_EXTEND_OP', can control how the high-order
bits are defined.
* `subreg' of `reg's The upper bits are defined when
`SUBREG_PROMOTED_VAR_P' is true.
`SUBREG_PROMOTED_UNSIGNED_P' describes what the upper
bits hold. Such subregs usually represent local
variables, register variables and parameter pseudo
variables that have been promoted to a wider mode.
BYTENUM is always zero for a paradoxical `subreg', even on
big-endian targets.
For example, the paradoxical `subreg':
(set (subreg:SI (reg:HI X) 0) Y)
stores the lower 2 bytes of Y in X and discards the upper 2
bytes. A subsequent:
(set Z (subreg:SI (reg:HI X) 0))
would set the lower two bytes of Z to Y and set the upper two
bytes to an unknown value assuming `SUBREG_PROMOTED_VAR_P' is
false.
Normal subregs
When M1 is at least as narrow as M2 the `subreg' expression
is called "normal".
Normal `subreg's restrict consideration to certain bits of
REG. There are two cases. If M1 is smaller than a word, the
`subreg' refers to the least-significant part (or "lowpart")
of one word of REG. If M1 is word-sized or greater, the
`subreg' refers to one or more complete words.
When used as an lvalue, `subreg' is a word-based accessor.
Storing to a `subreg' modifies all the words of REG that
overlap the `subreg', but it leaves the other words of REG
alone.
When storing to a normal `subreg' that is smaller than a word,
the other bits of the referenced word are usually left in an
undefined state. This laxity makes it easier to generate
efficient code for such instructions. To represent an
instruction that preserves all the bits outside of those in
the `subreg', use `strict_low_part' or `zero_extract' around
the `subreg'.
BYTENUM must identify the offset of the first byte of the
`subreg' from the start of REG, assuming that REG is laid out
in memory order. The memory order of bytes is defined by two
target macros, `WORDS_BIG_ENDIAN' and `BYTES_BIG_ENDIAN':
* `WORDS_BIG_ENDIAN', if set to 1, says that byte number
zero is part of the most significant word; otherwise, it
is part of the least significant word.
* `BYTES_BIG_ENDIAN', if set to 1, says that byte number
zero is the most significant byte within a word;
otherwise, it is the least significant byte within a
word.
On a few targets, `FLOAT_WORDS_BIG_ENDIAN' disagrees with
`WORDS_BIG_ENDIAN'. However, most parts of the compiler treat
floating point values as if they had the same endianness as
integer values. This works because they handle them solely
as a collection of integer values, with no particular
numerical value. Only real.c and the runtime libraries care
about `FLOAT_WORDS_BIG_ENDIAN'.
Thus,
(subreg:HI (reg:SI X) 2)
on a `BYTES_BIG_ENDIAN', `UNITS_PER_WORD == 4' target is the
same as
(subreg:HI (reg:SI X) 0)
on a little-endian, `UNITS_PER_WORD == 4' target. Both
`subreg's access the lower two bytes of register X.
A `MODE_PARTIAL_INT' mode behaves as if it were as wide as the
corresponding `MODE_INT' mode, except that it has an unknown
number of undefined bits. For example:
(subreg:PSI (reg:SI 0) 0)
accesses the whole of `(reg:SI 0)', but the exact relationship
between the `PSImode' value and the `SImode' value is not defined.
If we assume `UNITS_PER_WORD <= 4', then the following two
`subreg's:
(subreg:PSI (reg:DI 0) 0)
(subreg:PSI (reg:DI 0) 4)
represent independent 4-byte accesses to the two halves of
`(reg:DI 0)'. Both `subreg's have an unknown number of undefined
bits.
If `UNITS_PER_WORD <= 2' then these two `subreg's:
(subreg:HI (reg:PSI 0) 0)
(subreg:HI (reg:PSI 0) 2)
represent independent 2-byte accesses that together span the whole
of `(reg:PSI 0)'. Storing to the first `subreg' does not affect
the value of the second, and vice versa. `(reg:PSI 0)' has an
unknown number of undefined bits, so the assignment:
(set (subreg:HI (reg:PSI 0) 0) (reg:HI 4))
does not guarantee that `(subreg:HI (reg:PSI 0) 0)' has the value
`(reg:HI 4)'.
The rules above apply to both pseudo REGs and hard REGs. If the
semantics are not correct for particular combinations of M1, M2
and hard REG, the target-specific code must ensure that those
combinations are never used. For example:
CANNOT_CHANGE_MODE_CLASS (M2, M1, CLASS)
must be true for every class CLASS that includes REG.
The first operand of a `subreg' expression is customarily accessed
with the `SUBREG_REG' macro and the second operand is customarily
accessed with the `SUBREG_BYTE' macro.
It has been several years since a platform in which
`BYTES_BIG_ENDIAN' not equal to `WORDS_BIG_ENDIAN' has been
tested. Anyone wishing to support such a platform in the future
may be confronted with code rot.
`(scratch:M)'
This represents a scratch register that will be required for the
execution of a single instruction and not used subsequently. It is
converted into a `reg' by either the local register allocator or
the reload pass.
`scratch' is usually present inside a `clobber' operation (*note
Side Effects::).
`(cc0)'
This refers to the machine's condition code register. It has no
operands and may not have a machine mode. There are two ways to
use it:
* To stand for a complete set of condition code flags. This is
best on most machines, where each comparison sets the entire
series of flags.
With this technique, `(cc0)' may be validly used in only two
contexts: as the destination of an assignment (in test and
compare instructions) and in comparison operators comparing
against zero (`const_int' with value zero; that is to say,
`const0_rtx').
* To stand for a single flag that is the result of a single
condition. This is useful on machines that have only a
single flag bit, and in which comparison instructions must
specify the condition to test.
With this technique, `(cc0)' may be validly used in only two
contexts: as the destination of an assignment (in test and
compare instructions) where the source is a comparison
operator, and as the first operand of `if_then_else' (in a
conditional branch).
There is only one expression object of code `cc0'; it is the value
of the variable `cc0_rtx'. Any attempt to create an expression of
code `cc0' will return `cc0_rtx'.
Instructions can set the condition code implicitly. On many
machines, nearly all instructions set the condition code based on
the value that they compute or store. It is not necessary to
record these actions explicitly in the RTL because the machine
description includes a prescription for recognizing the
instructions that do so (by means of the macro
`NOTICE_UPDATE_CC'). *Note Condition Code::. Only instructions
whose sole purpose is to set the condition code, and instructions
that use the condition code, need mention `(cc0)'.
On some machines, the condition code register is given a register
number and a `reg' is used instead of `(cc0)'. This is usually the
preferable approach if only a small subset of instructions modify
the condition code. Other machines store condition codes in
general registers; in such cases a pseudo register should be used.
Some machines, such as the SPARC and RS/6000, have two sets of
arithmetic instructions, one that sets and one that does not set
the condition code. This is best handled by normally generating
the instruction that does not set the condition code, and making a
pattern that both performs the arithmetic and sets the condition
code register (which would not be `(cc0)' in this case). For
examples, search for `addcc' and `andcc' in `sparc.md'.
`(pc)'
This represents the machine's program counter. It has no operands
and may not have a machine mode. `(pc)' may be validly used only
in certain specific contexts in jump instructions.
There is only one expression object of code `pc'; it is the value
of the variable `pc_rtx'. Any attempt to create an expression of
code `pc' will return `pc_rtx'.
All instructions that do not jump alter the program counter
implicitly by incrementing it, but there is no need to mention
this in the RTL.
`(mem:M ADDR ALIAS)'
This RTX represents a reference to main memory at an address
represented by the expression ADDR. M specifies how large a unit
of memory is accessed. ALIAS specifies an alias set for the
reference. In general two items are in different alias sets if
they cannot reference the same memory address.
The construct `(mem:BLK (scratch))' is considered to alias all
other memories. Thus it may be used as a memory barrier in
epilogue stack deallocation patterns.
`(concatM RTX RTX)'
This RTX represents the concatenation of two other RTXs. This is
used for complex values. It should only appear in the RTL
attached to declarations and during RTL generation. It should not
appear in the ordinary insn chain.
`(concatnM [RTX ...])'
This RTX represents the concatenation of all the RTX to make a
single value. Like `concat', this should only appear in
declarations, and not in the insn chain.
File: gccint.info, Node: Arithmetic, Next: Comparisons, Prev: Regs and Memory, Up: RTL
10.9 RTL Expressions for Arithmetic
===================================
Unless otherwise specified, all the operands of arithmetic expressions
must be valid for mode M. An operand is valid for mode M if it has
mode M, or if it is a `const_int' or `const_double' and M is a mode of
class `MODE_INT'.
For commutative binary operations, constants should be placed in the
second operand.
`(plus:M X Y)'
`(ss_plus:M X Y)'
`(us_plus:M X Y)'
These three expressions all represent the sum of the values
represented by X and Y carried out in machine mode M. They differ
in their behavior on overflow of integer modes. `plus' wraps
round modulo the width of M; `ss_plus' saturates at the maximum
signed value representable in M; `us_plus' saturates at the
maximum unsigned value.
`(lo_sum:M X Y)'
This expression represents the sum of X and the low-order bits of
Y. It is used with `high' (*note Constants::) to represent the
typical two-instruction sequence used in RISC machines to
reference a global memory location.
The number of low order bits is machine-dependent but is normally
the number of bits in a `Pmode' item minus the number of bits set
by `high'.
M should be `Pmode'.
`(minus:M X Y)'
`(ss_minus:M X Y)'
`(us_minus:M X Y)'
These three expressions represent the result of subtracting Y from
X, carried out in mode M. Behavior on overflow is the same as for
the three variants of `plus' (see above).
`(compare:M X Y)'
Represents the result of subtracting Y from X for purposes of
comparison. The result is computed without overflow, as if with
infinite precision.
Of course, machines can't really subtract with infinite precision.
However, they can pretend to do so when only the sign of the
result will be used, which is the case when the result is stored
in the condition code. And that is the _only_ way this kind of
expression may validly be used: as a value to be stored in the
condition codes, either `(cc0)' or a register. *Note
Comparisons::.
The mode M is not related to the modes of X and Y, but instead is
the mode of the condition code value. If `(cc0)' is used, it is
`VOIDmode'. Otherwise it is some mode in class `MODE_CC', often
`CCmode'. *Note Condition Code::. If M is `VOIDmode' or
`CCmode', the operation returns sufficient information (in an
unspecified format) so that any comparison operator can be applied
to the result of the `COMPARE' operation. For other modes in
class `MODE_CC', the operation only returns a subset of this
information.
Normally, X and Y must have the same mode. Otherwise, `compare'
is valid only if the mode of X is in class `MODE_INT' and Y is a
`const_int' or `const_double' with mode `VOIDmode'. The mode of X
determines what mode the comparison is to be done in; thus it must
not be `VOIDmode'.
If one of the operands is a constant, it should be placed in the
second operand and the comparison code adjusted as appropriate.
A `compare' specifying two `VOIDmode' constants is not valid since
there is no way to know in what mode the comparison is to be
performed; the comparison must either be folded during the
compilation or the first operand must be loaded into a register
while its mode is still known.
`(neg:M X)'
`(ss_neg:M X)'
`(us_neg:M X)'
These two expressions represent the negation (subtraction from
zero) of the value represented by X, carried out in mode M. They
differ in the behavior on overflow of integer modes. In the case
of `neg', the negation of the operand may be a number not
representable in mode M, in which case it is truncated to M.
`ss_neg' and `us_neg' ensure that an out-of-bounds result
saturates to the maximum or minimum signed or unsigned value.
`(mult:M X Y)'
`(ss_mult:M X Y)'
`(us_mult:M X Y)'
Represents the signed product of the values represented by X and Y
carried out in machine mode M. `ss_mult' and `us_mult' ensure
that an out-of-bounds result saturates to the maximum or minimum
signed or unsigned value.
Some machines support a multiplication that generates a product
wider than the operands. Write the pattern for this as
(mult:M (sign_extend:M X) (sign_extend:M Y))
where M is wider than the modes of X and Y, which need not be the
same.
For unsigned widening multiplication, use the same idiom, but with
`zero_extend' instead of `sign_extend'.
`(fma:M X Y Z)'
Represents the `fma', `fmaf', and `fmal' builtin functions that do
a combined multiply of X and Y and then adding toZ without doing
an intermediate rounding step.
`(div:M X Y)'
`(ss_div:M X Y)'
Represents the quotient in signed division of X by Y, carried out
in machine mode M. If M is a floating point mode, it represents
the exact quotient; otherwise, the integerized quotient. `ss_div'
ensures that an out-of-bounds result saturates to the maximum or
minimum signed value.
Some machines have division instructions in which the operands and
quotient widths are not all the same; you should represent such
instructions using `truncate' and `sign_extend' as in,
(truncate:M1 (div:M2 X (sign_extend:M2 Y)))
`(udiv:M X Y)'
`(us_div:M X Y)'
Like `div' but represents unsigned division. `us_div' ensures
that an out-of-bounds result saturates to the maximum or minimum
unsigned value.
`(mod:M X Y)'
`(umod:M X Y)'
Like `div' and `udiv' but represent the remainder instead of the
quotient.
`(smin:M X Y)'
`(smax:M X Y)'
Represents the smaller (for `smin') or larger (for `smax') of X
and Y, interpreted as signed values in mode M. When used with
floating point, if both operands are zeros, or if either operand
is `NaN', then it is unspecified which of the two operands is
returned as the result.
`(umin:M X Y)'
`(umax:M X Y)'
Like `smin' and `smax', but the values are interpreted as unsigned
integers.
`(not:M X)'
Represents the bitwise complement of the value represented by X,
carried out in mode M, which must be a fixed-point machine mode.
`(and:M X Y)'
Represents the bitwise logical-and of the values represented by X
and Y, carried out in machine mode M, which must be a fixed-point
machine mode.
`(ior:M X Y)'
Represents the bitwise inclusive-or of the values represented by X
and Y, carried out in machine mode M, which must be a fixed-point
mode.
`(xor:M X Y)'
Represents the bitwise exclusive-or of the values represented by X
and Y, carried out in machine mode M, which must be a fixed-point
mode.
`(ashift:M X C)'
`(ss_ashift:M X C)'
`(us_ashift:M X C)'
These three expressions represent the result of arithmetically
shifting X left by C places. They differ in their behavior on
overflow of integer modes. An `ashift' operation is a plain shift
with no special behavior in case of a change in the sign bit;
`ss_ashift' and `us_ashift' saturates to the minimum or maximum
representable value if any of the bits shifted out differs from
the final sign bit.
X have mode M, a fixed-point machine mode. C be a fixed-point
mode or be a constant with mode `VOIDmode'; which mode is
determined by the mode called for in the machine description entry
for the left-shift instruction. For example, on the VAX, the mode
of C is `QImode' regardless of M.
`(lshiftrt:M X C)'
`(ashiftrt:M X C)'
Like `ashift' but for right shift. Unlike the case for left shift,
these two operations are distinct.
`(rotate:M X C)'
`(rotatert:M X C)'
Similar but represent left and right rotate. If C is a constant,
use `rotate'.
`(abs:M X)'
`(ss_abs:M X)'
Represents the absolute value of X, computed in mode M. `ss_abs'
ensures that an out-of-bounds result saturates to the maximum
signed value.
`(sqrt:M X)'
Represents the square root of X, computed in mode M. Most often M
will be a floating point mode.
`(ffs:M X)'
Represents one plus the index of the least significant 1-bit in X,
represented as an integer of mode M. (The value is zero if X is
zero.) The mode of X need not be M; depending on the target
machine, various mode combinations may be valid.
`(clz:M X)'
Represents the number of leading 0-bits in X, represented as an
integer of mode M, starting at the most significant bit position.
If X is zero, the value is determined by
`CLZ_DEFINED_VALUE_AT_ZERO' (*note Misc::). Note that this is one
of the few expressions that is not invariant under widening. The
mode of X will usually be an integer mode.
`(ctz:M X)'
Represents the number of trailing 0-bits in X, represented as an
integer of mode M, starting at the least significant bit position.
If X is zero, the value is determined by
`CTZ_DEFINED_VALUE_AT_ZERO' (*note Misc::). Except for this case,
`ctz(x)' is equivalent to `ffs(X) - 1'. The mode of X will
usually be an integer mode.
`(popcount:M X)'
Represents the number of 1-bits in X, represented as an integer of
mode M. The mode of X will usually be an integer mode.
`(parity:M X)'
Represents the number of 1-bits modulo 2 in X, represented as an
integer of mode M. The mode of X will usually be an integer mode.
`(bswap:M X)'
Represents the value X with the order of bytes reversed, carried
out in mode M, which must be a fixed-point machine mode.
File: gccint.info, Node: Comparisons, Next: Bit-Fields, Prev: Arithmetic, Up: RTL
10.10 Comparison Operations
===========================
Comparison operators test a relation on two operands and are considered
to represent a machine-dependent nonzero value described by, but not
necessarily equal to, `STORE_FLAG_VALUE' (*note Misc::) if the relation
holds, or zero if it does not, for comparison operators whose results
have a `MODE_INT' mode, `FLOAT_STORE_FLAG_VALUE' (*note Misc::) if the
relation holds, or zero if it does not, for comparison operators that
return floating-point values, and a vector of either
`VECTOR_STORE_FLAG_VALUE' (*note Misc::) if the relation holds, or of
zeros if it does not, for comparison operators that return vector
results. The mode of the comparison operation is independent of the
mode of the data being compared. If the comparison operation is being
tested (e.g., the first operand of an `if_then_else'), the mode must be
`VOIDmode'.
There are two ways that comparison operations may be used. The
comparison operators may be used to compare the condition codes `(cc0)'
against zero, as in `(eq (cc0) (const_int 0))'. Such a construct
actually refers to the result of the preceding instruction in which the
condition codes were set. The instruction setting the condition code
must be adjacent to the instruction using the condition code; only
`note' insns may separate them.
Alternatively, a comparison operation may directly compare two data
objects. The mode of the comparison is determined by the operands; they
must both be valid for a common machine mode. A comparison with both
operands constant would be invalid as the machine mode could not be
deduced from it, but such a comparison should never exist in RTL due to
constant folding.
In the example above, if `(cc0)' were last set to `(compare X Y)', the
comparison operation is identical to `(eq X Y)'. Usually only one style
of comparisons is supported on a particular machine, but the combine
pass will try to merge the operations to produce the `eq' shown in case
it exists in the context of the particular insn involved.
Inequality comparisons come in two flavors, signed and unsigned. Thus,
there are distinct expression codes `gt' and `gtu' for signed and
unsigned greater-than. These can produce different results for the same
pair of integer values: for example, 1 is signed greater-than -1 but not
unsigned greater-than, because -1 when regarded as unsigned is actually
`0xffffffff' which is greater than 1.
The signed comparisons are also used for floating point values.
Floating point comparisons are distinguished by the machine modes of
the operands.
`(eq:M X Y)'
`STORE_FLAG_VALUE' if the values represented by X and Y are equal,
otherwise 0.
`(ne:M X Y)'
`STORE_FLAG_VALUE' if the values represented by X and Y are not
equal, otherwise 0.
`(gt:M X Y)'
`STORE_FLAG_VALUE' if the X is greater than Y. If they are
fixed-point, the comparison is done in a signed sense.
`(gtu:M X Y)'
Like `gt' but does unsigned comparison, on fixed-point numbers
only.
`(lt:M X Y)'
`(ltu:M X Y)'
Like `gt' and `gtu' but test for "less than".
`(ge:M X Y)'
`(geu:M X Y)'
Like `gt' and `gtu' but test for "greater than or equal".
`(le:M X Y)'
`(leu:M X Y)'
Like `gt' and `gtu' but test for "less than or equal".
`(if_then_else COND THEN ELSE)'
This is not a comparison operation but is listed here because it is
always used in conjunction with a comparison operation. To be
precise, COND is a comparison expression. This expression
represents a choice, according to COND, between the value
represented by THEN and the one represented by ELSE.
On most machines, `if_then_else' expressions are valid only to
express conditional jumps.
`(cond [TEST1 VALUE1 TEST2 VALUE2 ...] DEFAULT)'
Similar to `if_then_else', but more general. Each of TEST1,
TEST2, ... is performed in turn. The result of this expression is
the VALUE corresponding to the first nonzero test, or DEFAULT if
none of the tests are nonzero expressions.
This is currently not valid for instruction patterns and is
supported only for insn attributes. *Note Insn Attributes::.
File: gccint.info, Node: Bit-Fields, Next: Vector Operations, Prev: Comparisons, Up: RTL
10.11 Bit-Fields
================
Special expression codes exist to represent bit-field instructions.
`(sign_extract:M LOC SIZE POS)'
This represents a reference to a sign-extended bit-field contained
or starting in LOC (a memory or register reference). The bit-field
is SIZE bits wide and starts at bit POS. The compilation option
`BITS_BIG_ENDIAN' says which end of the memory unit POS counts
from.
If LOC is in memory, its mode must be a single-byte integer mode.
If LOC is in a register, the mode to use is specified by the
operand of the `insv' or `extv' pattern (*note Standard Names::)
and is usually a full-word integer mode, which is the default if
none is specified.
The mode of POS is machine-specific and is also specified in the
`insv' or `extv' pattern.
The mode M is the same as the mode that would be used for LOC if
it were a register.
A `sign_extract' can not appear as an lvalue, or part thereof, in
RTL.
`(zero_extract:M LOC SIZE POS)'
Like `sign_extract' but refers to an unsigned or zero-extended
bit-field. The same sequence of bits are extracted, but they are
filled to an entire word with zeros instead of by sign-extension.
Unlike `sign_extract', this type of expressions can be lvalues in
RTL; they may appear on the left side of an assignment, indicating
insertion of a value into the specified bit-field.
File: gccint.info, Node: Vector Operations, Next: Conversions, Prev: Bit-Fields, Up: RTL
10.12 Vector Operations
=======================
All normal RTL expressions can be used with vector modes; they are
interpreted as operating on each part of the vector independently.
Additionally, there are a few new expressions to describe specific
vector operations.
`(vec_merge:M VEC1 VEC2 ITEMS)'
This describes a merge operation between two vectors. The result
is a vector of mode M; its elements are selected from either VEC1
or VEC2. Which elements are selected is described by ITEMS, which
is a bit mask represented by a `const_int'; a zero bit indicates
the corresponding element in the result vector is taken from VEC2
while a set bit indicates it is taken from VEC1.
`(vec_select:M VEC1 SELECTION)'
This describes an operation that selects parts of a vector. VEC1
is the source vector, and SELECTION is a `parallel' that contains a
`const_int' for each of the subparts of the result vector, giving
the number of the source subpart that should be stored into it.
The result mode M is either the submode for a single element of
VEC1 (if only one subpart is selected), or another vector mode
with that element submode (if multiple subparts are selected).
`(vec_concat:M VEC1 VEC2)'
Describes a vector concat operation. The result is a
concatenation of the vectors VEC1 and VEC2; its length is the sum
of the lengths of the two inputs.
`(vec_duplicate:M VEC)'
This operation converts a small vector into a larger one by
duplicating the input values. The output vector mode must have
the same submodes as the input vector mode, and the number of
output parts must be an integer multiple of the number of input
parts.
File: gccint.info, Node: Conversions, Next: RTL Declarations, Prev: Vector Operations, Up: RTL
10.13 Conversions
=================
All conversions between machine modes must be represented by explicit
conversion operations. For example, an expression which is the sum of
a byte and a full word cannot be written as `(plus:SI (reg:QI 34)
(reg:SI 80))' because the `plus' operation requires two operands of the
same machine mode. Therefore, the byte-sized operand is enclosed in a
conversion operation, as in
(plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80))
The conversion operation is not a mere placeholder, because there may
be more than one way of converting from a given starting mode to the
desired final mode. The conversion operation code says how to do it.
For all conversion operations, X must not be `VOIDmode' because the
mode in which to do the conversion would not be known. The conversion
must either be done at compile-time or X must be placed into a register.
`(sign_extend:M X)'
Represents the result of sign-extending the value X to machine
mode M. M must be a fixed-point mode and X a fixed-point value of
a mode narrower than M.
`(zero_extend:M X)'
Represents the result of zero-extending the value X to machine
mode M. M must be a fixed-point mode and X a fixed-point value of
a mode narrower than M.
`(float_extend:M X)'
Represents the result of extending the value X to machine mode M.
M must be a floating point mode and X a floating point value of a
mode narrower than M.
`(truncate:M X)'
Represents the result of truncating the value X to machine mode M.
M must be a fixed-point mode and X a fixed-point value of a mode
wider than M.
`(ss_truncate:M X)'
Represents the result of truncating the value X to machine mode M,
using signed saturation in the case of overflow. Both M and the
mode of X must be fixed-point modes.
`(us_truncate:M X)'
Represents the result of truncating the value X to machine mode M,
using unsigned saturation in the case of overflow. Both M and the
mode of X must be fixed-point modes.
`(float_truncate:M X)'
Represents the result of truncating the value X to machine mode M.
M must be a floating point mode and X a floating point value of a
mode wider than M.
`(float:M X)'
Represents the result of converting fixed point value X, regarded
as signed, to floating point mode M.
`(unsigned_float:M X)'
Represents the result of converting fixed point value X, regarded
as unsigned, to floating point mode M.
`(fix:M X)'
When M is a floating-point mode, represents the result of
converting floating point value X (valid for mode M) to an
integer, still represented in floating point mode M, by rounding
towards zero.
When M is a fixed-point mode, represents the result of converting
floating point value X to mode M, regarded as signed. How
rounding is done is not specified, so this operation may be used
validly in compiling C code only for integer-valued operands.
`(unsigned_fix:M X)'
Represents the result of converting floating point value X to
fixed point mode M, regarded as unsigned. How rounding is done is
not specified.
`(fract_convert:M X)'
Represents the result of converting fixed-point value X to
fixed-point mode M, signed integer value X to fixed-point mode M,
floating-point value X to fixed-point mode M, fixed-point value X
to integer mode M regarded as signed, or fixed-point value X to
floating-point mode M. When overflows or underflows happen, the
results are undefined.
`(sat_fract:M X)'
Represents the result of converting fixed-point value X to
fixed-point mode M, signed integer value X to fixed-point mode M,
or floating-point value X to fixed-point mode M. When overflows
or underflows happen, the results are saturated to the maximum or
the minimum.
`(unsigned_fract_convert:M X)'
Represents the result of converting fixed-point value X to integer
mode M regarded as unsigned, or unsigned integer value X to
fixed-point mode M. When overflows or underflows happen, the
results are undefined.
`(unsigned_sat_fract:M X)'
Represents the result of converting unsigned integer value X to
fixed-point mode M. When overflows or underflows happen, the
results are saturated to the maximum or the minimum.
File: gccint.info, Node: RTL Declarations, Next: Side Effects, Prev: Conversions, Up: RTL
10.14 Declarations
==================
Declaration expression codes do not represent arithmetic operations but
rather state assertions about their operands.
`(strict_low_part (subreg:M (reg:N R) 0))'
This expression code is used in only one context: as the
destination operand of a `set' expression. In addition, the
operand of this expression must be a non-paradoxical `subreg'
expression.
The presence of `strict_low_part' says that the part of the
register which is meaningful in mode N, but is not part of mode M,
is not to be altered. Normally, an assignment to such a subreg is
allowed to have undefined effects on the rest of the register when
M is less than a word.
File: gccint.info, Node: Side Effects, Next: Incdec, Prev: RTL Declarations, Up: RTL
10.15 Side Effect Expressions
=============================
The expression codes described so far represent values, not actions.
But machine instructions never produce values; they are meaningful only
for their side effects on the state of the machine. Special expression
codes are used to represent side effects.
The body of an instruction is always one of these side effect codes;
the codes described above, which represent values, appear only as the
operands of these.
`(set LVAL X)'
Represents the action of storing the value of X into the place
represented by LVAL. LVAL must be an expression representing a
place that can be stored in: `reg' (or `subreg', `strict_low_part'
or `zero_extract'), `mem', `pc', `parallel', or `cc0'.
If LVAL is a `reg', `subreg' or `mem', it has a machine mode; then
X must be valid for that mode.
If LVAL is a `reg' whose machine mode is less than the full width
of the register, then it means that the part of the register
specified by the machine mode is given the specified value and the
rest of the register receives an undefined value. Likewise, if
LVAL is a `subreg' whose machine mode is narrower than the mode of
the register, the rest of the register can be changed in an
undefined way.
If LVAL is a `strict_low_part' of a subreg, then the part of the
register specified by the machine mode of the `subreg' is given
the value X and the rest of the register is not changed.
If LVAL is a `zero_extract', then the referenced part of the
bit-field (a memory or register reference) specified by the
`zero_extract' is given the value X and the rest of the bit-field
is not changed. Note that `sign_extract' can not appear in LVAL.
If LVAL is `(cc0)', it has no machine mode, and X may be either a
`compare' expression or a value that may have any mode. The
latter case represents a "test" instruction. The expression `(set
(cc0) (reg:M N))' is equivalent to `(set (cc0) (compare (reg:M N)
(const_int 0)))'. Use the former expression to save space during
the compilation.
If LVAL is a `parallel', it is used to represent the case of a
function returning a structure in multiple registers. Each element
of the `parallel' is an `expr_list' whose first operand is a `reg'
and whose second operand is a `const_int' representing the offset
(in bytes) into the structure at which the data in that register
corresponds. The first element may be null to indicate that the
structure is also passed partly in memory.
If LVAL is `(pc)', we have a jump instruction, and the
possibilities for X are very limited. It may be a `label_ref'
expression (unconditional jump). It may be an `if_then_else'
(conditional jump), in which case either the second or the third
operand must be `(pc)' (for the case which does not jump) and the
other of the two must be a `label_ref' (for the case which does
jump). X may also be a `mem' or `(plus:SI (pc) Y)', where Y may
be a `reg' or a `mem'; these unusual patterns are used to
represent jumps through branch tables.
If LVAL is neither `(cc0)' nor `(pc)', the mode of LVAL must not
be `VOIDmode' and the mode of X must be valid for the mode of LVAL.
LVAL is customarily accessed with the `SET_DEST' macro and X with
the `SET_SRC' macro.
`(return)'
As the sole expression in a pattern, represents a return from the
current function, on machines where this can be done with one
instruction, such as VAXen. On machines where a multi-instruction
"epilogue" must be executed in order to return from the function,
returning is done by jumping to a label which precedes the
epilogue, and the `return' expression code is never used.
Inside an `if_then_else' expression, represents the value to be
placed in `pc' to return to the caller.
Note that an insn pattern of `(return)' is logically equivalent to
`(set (pc) (return))', but the latter form is never used.
`(call FUNCTION NARGS)'
Represents a function call. FUNCTION is a `mem' expression whose
address is the address of the function to be called. NARGS is an
expression which can be used for two purposes: on some machines it
represents the number of bytes of stack argument; on others, it
represents the number of argument registers.
Each machine has a standard machine mode which FUNCTION must have.
The machine description defines macro `FUNCTION_MODE' to expand
into the requisite mode name. The purpose of this mode is to
specify what kind of addressing is allowed, on machines where the
allowed kinds of addressing depend on the machine mode being
addressed.
`(clobber X)'
Represents the storing or possible storing of an unpredictable,
undescribed value into X, which must be a `reg', `scratch',
`parallel' or `mem' expression.
One place this is used is in string instructions that store
standard values into particular hard registers. It may not be
worth the trouble to describe the values that are stored, but it
is essential to inform the compiler that the registers will be
altered, lest it attempt to keep data in them across the string
instruction.
If X is `(mem:BLK (const_int 0))' or `(mem:BLK (scratch))', it
means that all memory locations must be presumed clobbered. If X
is a `parallel', it has the same meaning as a `parallel' in a
`set' expression.
Note that the machine description classifies certain hard
registers as "call-clobbered". All function call instructions are
assumed by default to clobber these registers, so there is no need
to use `clobber' expressions to indicate this fact. Also, each
function call is assumed to have the potential to alter any memory
location, unless the function is declared `const'.
If the last group of expressions in a `parallel' are each a
`clobber' expression whose arguments are `reg' or `match_scratch'
(*note RTL Template::) expressions, the combiner phase can add the
appropriate `clobber' expressions to an insn it has constructed
when doing so will cause a pattern to be matched.
This feature can be used, for example, on a machine that whose
multiply and add instructions don't use an MQ register but which
has an add-accumulate instruction that does clobber the MQ
register. Similarly, a combined instruction might require a
temporary register while the constituent instructions might not.
When a `clobber' expression for a register appears inside a
`parallel' with other side effects, the register allocator
guarantees that the register is unoccupied both before and after
that insn if it is a hard register clobber. For pseudo-register
clobber, the register allocator and the reload pass do not assign
the same hard register to the clobber and the input operands if
there is an insn alternative containing the `&' constraint (*note
Modifiers::) for the clobber and the hard register is in register
classes of the clobber in the alternative. You can clobber either
a specific hard register, a pseudo register, or a `scratch'
expression; in the latter two cases, GCC will allocate a hard
register that is available there for use as a temporary.
For instructions that require a temporary register, you should use
`scratch' instead of a pseudo-register because this will allow the
combiner phase to add the `clobber' when required. You do this by
coding (`clobber' (`match_scratch' ...)). If you do clobber a
pseudo register, use one which appears nowhere else--generate a
new one each time. Otherwise, you may confuse CSE.
There is one other known use for clobbering a pseudo register in a
`parallel': when one of the input operands of the insn is also
clobbered by the insn. In this case, using the same pseudo
register in the clobber and elsewhere in the insn produces the
expected results.
`(use X)'
Represents the use of the value of X. It indicates that the value
in X at this point in the program is needed, even though it may
not be apparent why this is so. Therefore, the compiler will not
attempt to delete previous instructions whose only effect is to
store a value in X. X must be a `reg' expression.
In some situations, it may be tempting to add a `use' of a
register in a `parallel' to describe a situation where the value
of a special register will modify the behavior of the instruction.
A hypothetical example might be a pattern for an addition that can
either wrap around or use saturating addition depending on the
value of a special control register:
(parallel [(set (reg:SI 2) (unspec:SI [(reg:SI 3)
(reg:SI 4)] 0))
(use (reg:SI 1))])
This will not work, several of the optimizers only look at
expressions locally; it is very likely that if you have multiple
insns with identical inputs to the `unspec', they will be
optimized away even if register 1 changes in between.
This means that `use' can _only_ be used to describe that the
register is live. You should think twice before adding `use'
statements, more often you will want to use `unspec' instead. The
`use' RTX is most commonly useful to describe that a fixed
register is implicitly used in an insn. It is also safe to use in
patterns where the compiler knows for other reasons that the result
of the whole pattern is variable, such as `movmemM' or `call'
patterns.
During the reload phase, an insn that has a `use' as pattern can
carry a reg_equal note. These `use' insns will be deleted before
the reload phase exits.
During the delayed branch scheduling phase, X may be an insn.
This indicates that X previously was located at this place in the
code and its data dependencies need to be taken into account.
These `use' insns will be deleted before the delayed branch
scheduling phase exits.
`(parallel [X0 X1 ...])'
Represents several side effects performed in parallel. The square
brackets stand for a vector; the operand of `parallel' is a vector
of expressions. X0, X1 and so on are individual side effect
expressions--expressions of code `set', `call', `return',
`clobber' or `use'.
"In parallel" means that first all the values used in the
individual side-effects are computed, and second all the actual
side-effects are performed. For example,
(parallel [(set (reg:SI 1) (mem:SI (reg:SI 1)))
(set (mem:SI (reg:SI 1)) (reg:SI 1))])
says unambiguously that the values of hard register 1 and the
memory location addressed by it are interchanged. In both places
where `(reg:SI 1)' appears as a memory address it refers to the
value in register 1 _before_ the execution of the insn.
It follows that it is _incorrect_ to use `parallel' and expect the
result of one `set' to be available for the next one. For
example, people sometimes attempt to represent a jump-if-zero
instruction this way:
(parallel [(set (cc0) (reg:SI 34))
(set (pc) (if_then_else
(eq (cc0) (const_int 0))
(label_ref ...)
(pc)))])
But this is incorrect, because it says that the jump condition
depends on the condition code value _before_ this instruction, not
on the new value that is set by this instruction.
Peephole optimization, which takes place together with final
assembly code output, can produce insns whose patterns consist of
a `parallel' whose elements are the operands needed to output the
resulting assembler code--often `reg', `mem' or constant
expressions. This would not be well-formed RTL at any other stage
in compilation, but it is ok then because no further optimization
remains to be done. However, the definition of the macro
`NOTICE_UPDATE_CC', if any, must deal with such insns if you
define any peephole optimizations.
`(cond_exec [COND EXPR])'
Represents a conditionally executed expression. The EXPR is
executed only if the COND is nonzero. The COND expression must
not have side-effects, but the EXPR may very well have
side-effects.
`(sequence [INSNS ...])'
Represents a sequence of insns. Each of the INSNS that appears in
the vector is suitable for appearing in the chain of insns, so it
must be an `insn', `jump_insn', `call_insn', `code_label',
`barrier' or `note'.
A `sequence' RTX is never placed in an actual insn during RTL
generation. It represents the sequence of insns that result from a
`define_expand' _before_ those insns are passed to `emit_insn' to
insert them in the chain of insns. When actually inserted, the
individual sub-insns are separated out and the `sequence' is
forgotten.
After delay-slot scheduling is completed, an insn and all the
insns that reside in its delay slots are grouped together into a
`sequence'. The insn requiring the delay slot is the first insn
in the vector; subsequent insns are to be placed in the delay slot.
`INSN_ANNULLED_BRANCH_P' is set on an insn in a delay slot to
indicate that a branch insn should be used that will conditionally
annul the effect of the insns in the delay slots. In such a case,
`INSN_FROM_TARGET_P' indicates that the insn is from the target of
the branch and should be executed only if the branch is taken;
otherwise the insn should be executed only if the branch is not
taken. *Note Delay Slots::.
These expression codes appear in place of a side effect, as the body of
an insn, though strictly speaking they do not always describe side
effects as such:
`(asm_input S)'
Represents literal assembler code as described by the string S.
`(unspec [OPERANDS ...] INDEX)'
`(unspec_volatile [OPERANDS ...] INDEX)'
Represents a machine-specific operation on OPERANDS. INDEX
selects between multiple machine-specific operations.
`unspec_volatile' is used for volatile operations and operations
that may trap; `unspec' is used for other operations.
These codes may appear inside a `pattern' of an insn, inside a
`parallel', or inside an expression.
`(addr_vec:M [LR0 LR1 ...])'
Represents a table of jump addresses. The vector elements LR0,
etc., are `label_ref' expressions. The mode M specifies how much
space is given to each address; normally M would be `Pmode'.
`(addr_diff_vec:M BASE [LR0 LR1 ...] MIN MAX FLAGS)'
Represents a table of jump addresses expressed as offsets from
BASE. The vector elements LR0, etc., are `label_ref' expressions
and so is BASE. The mode M specifies how much space is given to
each address-difference. MIN and MAX are set up by branch
shortening and hold a label with a minimum and a maximum address,
respectively. FLAGS indicates the relative position of BASE, MIN
and MAX to the containing insn and of MIN and MAX to BASE. See
rtl.def for details.
`(prefetch:M ADDR RW LOCALITY)'
Represents prefetch of memory at address ADDR. Operand RW is 1 if
the prefetch is for data to be written, 0 otherwise; targets that
do not support write prefetches should treat this as a normal
prefetch. Operand LOCALITY specifies the amount of temporal
locality; 0 if there is none or 1, 2, or 3 for increasing levels
of temporal locality; targets that do not support locality hints
should ignore this.
This insn is used to minimize cache-miss latency by moving data
into a cache before it is accessed. It should use only
non-faulting data prefetch instructions.
File: gccint.info, Node: Incdec, Next: Assembler, Prev: Side Effects, Up: RTL
10.16 Embedded Side-Effects on Addresses
========================================
Six special side-effect expression codes appear as memory addresses.
`(pre_dec:M X)'
Represents the side effect of decrementing X by a standard amount
and represents also the value that X has after being decremented.
X must be a `reg' or `mem', but most machines allow only a `reg'.
M must be the machine mode for pointers on the machine in use.
The amount X is decremented by is the length in bytes of the
machine mode of the containing memory reference of which this
expression serves as the address. Here is an example of its use:
(mem:DF (pre_dec:SI (reg:SI 39)))
This says to decrement pseudo register 39 by the length of a
`DFmode' value and use the result to address a `DFmode' value.
`(pre_inc:M X)'
Similar, but specifies incrementing X instead of decrementing it.
`(post_dec:M X)'
Represents the same side effect as `pre_dec' but a different
value. The value represented here is the value X has before being
decremented.
`(post_inc:M X)'
Similar, but specifies incrementing X instead of decrementing it.
`(post_modify:M X Y)'
Represents the side effect of setting X to Y and represents X
before X is modified. X must be a `reg' or `mem', but most
machines allow only a `reg'. M must be the machine mode for
pointers on the machine in use.
The expression Y must be one of three forms: `(plus:M X Z)',
`(minus:M X Z)', or `(plus:M X I)', where Z is an index register
and I is a constant.
Here is an example of its use:
(mem:SF (post_modify:SI (reg:SI 42) (plus (reg:SI 42)
(reg:SI 48))))
This says to modify pseudo register 42 by adding the contents of
pseudo register 48 to it, after the use of what ever 42 points to.
`(pre_modify:M X EXPR)'
Similar except side effects happen before the use.
These embedded side effect expressions must be used with care.
Instruction patterns may not use them. Until the `flow' pass of the
compiler, they may occur only to represent pushes onto the stack. The
`flow' pass finds cases where registers are incremented or decremented
in one instruction and used as an address shortly before or after;
these cases are then transformed to use pre- or post-increment or
-decrement.
If a register used as the operand of these expressions is used in
another address in an insn, the original value of the register is used.
Uses of the register outside of an address are not permitted within the
same insn as a use in an embedded side effect expression because such
insns behave differently on different machines and hence must be treated
as ambiguous and disallowed.
An instruction that can be represented with an embedded side effect
could also be represented using `parallel' containing an additional
`set' to describe how the address register is altered. This is not
done because machines that allow these operations at all typically
allow them wherever a memory address is called for. Describing them as
additional parallel stores would require doubling the number of entries
in the machine description.
File: gccint.info, Node: Assembler, Next: Debug Information, Prev: Incdec, Up: RTL
10.17 Assembler Instructions as Expressions
===========================================
The RTX code `asm_operands' represents a value produced by a
user-specified assembler instruction. It is used to represent an `asm'
statement with arguments. An `asm' statement with a single output
operand, like this:
asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z));
is represented using a single `asm_operands' RTX which represents the
value that is stored in `outputvar':
(set RTX-FOR-OUTPUTVAR
(asm_operands "foo %1,%2,%0" "a" 0
[RTX-FOR-ADDITION-RESULT RTX-FOR-*Z]
[(asm_input:M1 "g")
(asm_input:M2 "di")]))
Here the operands of the `asm_operands' RTX are the assembler template
string, the output-operand's constraint, the index-number of the output
operand among the output operands specified, a vector of input operand
RTX's, and a vector of input-operand modes and constraints. The mode
M1 is the mode of the sum `x+y'; M2 is that of `*z'.
When an `asm' statement has multiple output values, its insn has
several such `set' RTX's inside of a `parallel'. Each `set' contains
an `asm_operands'; all of these share the same assembler template and
vectors, but each contains the constraint for the respective output
operand. They are also distinguished by the output-operand index
number, which is 0, 1, ... for successive output operands.
File: gccint.info, Node: Debug Information, Next: Insns, Prev: Assembler, Up: RTL
10.18 Variable Location Debug Information in RTL
================================================
Variable tracking relies on `MEM_EXPR' and `REG_EXPR' annotations to
determine what user variables memory and register references refer to.
Variable tracking at assignments uses these notes only when they refer
to variables that live at fixed locations (e.g., addressable variables,
global non-automatic variables). For variables whose location may
vary, it relies on the following types of notes.
`(var_location:MODE VAR EXP STAT)'
Binds variable `var', a tree, to value EXP, an RTL expression. It
appears only in `NOTE_INSN_VAR_LOCATION' and `DEBUG_INSN's, with
slightly different meanings. MODE, if present, represents the
mode of EXP, which is useful if it is a modeless expression. STAT
is only meaningful in notes, indicating whether the variable is
known to be initialized or uninitialized.
`(debug_expr:MODE DECL)'
Stands for the value bound to the `DEBUG_EXPR_DECL' DECL, that
points back to it, within value expressions in `VAR_LOCATION'
nodes.
File: gccint.info, Node: Insns, Next: Calls, Prev: Debug Information, Up: RTL
10.19 Insns
===========
The RTL representation of the code for a function is a doubly-linked
chain of objects called "insns". Insns are expressions with special
codes that are used for no other purpose. Some insns are actual
instructions; others represent dispatch tables for `switch' statements;
others represent labels to jump to or various sorts of declarative
information.
In addition to its own specific data, each insn must have a unique
id-number that distinguishes it from all other insns in the current
function (after delayed branch scheduling, copies of an insn with the
same id-number may be present in multiple places in a function, but
these copies will always be identical and will only appear inside a
`sequence'), and chain pointers to the preceding and following insns.
These three fields occupy the same position in every insn, independent
of the expression code of the insn. They could be accessed with `XEXP'
and `XINT', but instead three special macros are always used:
`INSN_UID (I)'
Accesses the unique id of insn I.
`PREV_INSN (I)'
Accesses the chain pointer to the insn preceding I. If I is the
first insn, this is a null pointer.
`NEXT_INSN (I)'
Accesses the chain pointer to the insn following I. If I is the
last insn, this is a null pointer.
The first insn in the chain is obtained by calling `get_insns'; the
last insn is the result of calling `get_last_insn'. Within the chain
delimited by these insns, the `NEXT_INSN' and `PREV_INSN' pointers must
always correspond: if INSN is not the first insn,
NEXT_INSN (PREV_INSN (INSN)) == INSN
is always true and if INSN is not the last insn,
PREV_INSN (NEXT_INSN (INSN)) == INSN
is always true.
After delay slot scheduling, some of the insns in the chain might be
`sequence' expressions, which contain a vector of insns. The value of
`NEXT_INSN' in all but the last of these insns is the next insn in the
vector; the value of `NEXT_INSN' of the last insn in the vector is the
same as the value of `NEXT_INSN' for the `sequence' in which it is
contained. Similar rules apply for `PREV_INSN'.
This means that the above invariants are not necessarily true for insns
inside `sequence' expressions. Specifically, if INSN is the first insn
in a `sequence', `NEXT_INSN (PREV_INSN (INSN))' is the insn containing
the `sequence' expression, as is the value of `PREV_INSN (NEXT_INSN
(INSN))' if INSN is the last insn in the `sequence' expression. You
can use these expressions to find the containing `sequence' expression.
Every insn has one of the following expression codes:
`insn'
The expression code `insn' is used for instructions that do not
jump and do not do function calls. `sequence' expressions are
always contained in insns with code `insn' even if one of those
insns should jump or do function calls.
Insns with code `insn' have four additional fields beyond the three
mandatory ones listed above. These four are described in a table
below.
`jump_insn'
The expression code `jump_insn' is used for instructions that may
jump (or, more generally, may contain `label_ref' expressions to
which `pc' can be set in that instruction). If there is an
instruction to return from the current function, it is recorded as
a `jump_insn'.
`jump_insn' insns have the same extra fields as `insn' insns,
accessed in the same way and in addition contain a field
`JUMP_LABEL' which is defined once jump optimization has completed.
For simple conditional and unconditional jumps, this field contains
the `code_label' to which this insn will (possibly conditionally)
branch. In a more complex jump, `JUMP_LABEL' records one of the
labels that the insn refers to; other jump target labels are
recorded as `REG_LABEL_TARGET' notes. The exception is `addr_vec'
and `addr_diff_vec', where `JUMP_LABEL' is `NULL_RTX' and the only
way to find the labels is to scan the entire body of the insn.
Return insns count as jumps, but since they do not refer to any
labels, their `JUMP_LABEL' is `NULL_RTX'.
`call_insn'
The expression code `call_insn' is used for instructions that may
do function calls. It is important to distinguish these
instructions because they imply that certain registers and memory
locations may be altered unpredictably.
`call_insn' insns have the same extra fields as `insn' insns,
accessed in the same way and in addition contain a field
`CALL_INSN_FUNCTION_USAGE', which contains a list (chain of
`expr_list' expressions) containing `use' and `clobber'
expressions that denote hard registers and `MEM's used or
clobbered by the called function.
A `MEM' generally points to a stack slots in which arguments passed
to the libcall by reference (*note TARGET_PASS_BY_REFERENCE:
Register Arguments.) are stored. If the argument is caller-copied
(*note TARGET_CALLEE_COPIES: Register Arguments.), the stack slot
will be mentioned in `CLOBBER' and `USE' entries; if it's
callee-copied, only a `USE' will appear, and the `MEM' may point
to addresses that are not stack slots.
`CLOBBER'ed registers in this list augment registers specified in
`CALL_USED_REGISTERS' (*note Register Basics::).
`code_label'
A `code_label' insn represents a label that a jump insn can jump
to. It contains two special fields of data in addition to the
three standard ones. `CODE_LABEL_NUMBER' is used to hold the
"label number", a number that identifies this label uniquely among
all the labels in the compilation (not just in the current
function). Ultimately, the label is represented in the assembler
output as an assembler label, usually of the form `LN' where N is
the label number.
When a `code_label' appears in an RTL expression, it normally
appears within a `label_ref' which represents the address of the
label, as a number.
Besides as a `code_label', a label can also be represented as a
`note' of type `NOTE_INSN_DELETED_LABEL'.
The field `LABEL_NUSES' is only defined once the jump optimization
phase is completed. It contains the number of times this label is
referenced in the current function.
The field `LABEL_KIND' differentiates four different types of
labels: `LABEL_NORMAL', `LABEL_STATIC_ENTRY',
`LABEL_GLOBAL_ENTRY', and `LABEL_WEAK_ENTRY'. The only labels
that do not have type `LABEL_NORMAL' are "alternate entry points"
to the current function. These may be static (visible only in the
containing translation unit), global (exposed to all translation
units), or weak (global, but can be overridden by another symbol
with the same name).
Much of the compiler treats all four kinds of label identically.
Some of it needs to know whether or not a label is an alternate
entry point; for this purpose, the macro `LABEL_ALT_ENTRY_P' is
provided. It is equivalent to testing whether `LABEL_KIND (label)
== LABEL_NORMAL'. The only place that cares about the distinction
between static, global, and weak alternate entry points, besides
the front-end code that creates them, is the function
`output_alternate_entry_point', in `final.c'.
To set the kind of a label, use the `SET_LABEL_KIND' macro.
`barrier'
Barriers are placed in the instruction stream when control cannot
flow past them. They are placed after unconditional jump
instructions to indicate that the jumps are unconditional and
after calls to `volatile' functions, which do not return (e.g.,
`exit'). They contain no information beyond the three standard
fields.
`note'
`note' insns are used to represent additional debugging and
declarative information. They contain two nonstandard fields, an
integer which is accessed with the macro `NOTE_LINE_NUMBER' and a
string accessed with `NOTE_SOURCE_FILE'.
If `NOTE_LINE_NUMBER' is positive, the note represents the
position of a source line and `NOTE_SOURCE_FILE' is the source
file name that the line came from. These notes control generation
of line number data in the assembler output.
Otherwise, `NOTE_LINE_NUMBER' is not really a line number but a
code with one of the following values (and `NOTE_SOURCE_FILE' must
contain a null pointer):
`NOTE_INSN_DELETED'
Such a note is completely ignorable. Some passes of the
compiler delete insns by altering them into notes of this
kind.
`NOTE_INSN_DELETED_LABEL'
This marks what used to be a `code_label', but was not used
for other purposes than taking its address and was
transformed to mark that no code jumps to it.
`NOTE_INSN_BLOCK_BEG'
`NOTE_INSN_BLOCK_END'
These types of notes indicate the position of the beginning
and end of a level of scoping of variable names. They
control the output of debugging information.
`NOTE_INSN_EH_REGION_BEG'
`NOTE_INSN_EH_REGION_END'
These types of notes indicate the position of the beginning
and end of a level of scoping for exception handling.
`NOTE_BLOCK_NUMBER' identifies which `CODE_LABEL' or `note'
of type `NOTE_INSN_DELETED_LABEL' is associated with the
given region.
`NOTE_INSN_LOOP_BEG'
`NOTE_INSN_LOOP_END'
These types of notes indicate the position of the beginning
and end of a `while' or `for' loop. They enable the loop
optimizer to find loops quickly.
`NOTE_INSN_LOOP_CONT'
Appears at the place in a loop that `continue' statements
jump to.
`NOTE_INSN_LOOP_VTOP'
This note indicates the place in a loop where the exit test
begins for those loops in which the exit test has been
duplicated. This position becomes another virtual start of
the loop when considering loop invariants.
`NOTE_INSN_FUNCTION_BEG'
Appears at the start of the function body, after the function
prologue.
`NOTE_INSN_VAR_LOCATION'
This note is used to generate variable location debugging
information. It indicates that the user variable in its
`VAR_LOCATION' operand is at the location given in the RTL
expression, or holds a value that can be computed by
evaluating the RTL expression from that static point in the
program up to the next such note for the same user variable.
These codes are printed symbolically when they appear in debugging
dumps.
`debug_insn'
The expression code `debug_insn' is used for pseudo-instructions
that hold debugging information for variable tracking at
assignments (see `-fvar-tracking-assignments' option). They are
the RTL representation of `GIMPLE_DEBUG' statements (*note
`GIMPLE_DEBUG'::), with a `VAR_LOCATION' operand that binds a user
variable tree to an RTL representation of the `value' in the
corresponding statement. A `DEBUG_EXPR' in it stands for the
value bound to the corresponding `DEBUG_EXPR_DECL'.
Throughout optimization passes, binding information is kept in
pseudo-instruction form, so that, unlike notes, it gets the same
treatment and adjustments that regular instructions would. It is
the variable tracking pass that turns these pseudo-instructions
into var location notes, analyzing control flow, value
equivalences and changes to registers and memory referenced in
value expressions, propagating the values of debug temporaries and
determining expressions that can be used to compute the value of
each user variable at as many points (ranges, actually) in the
program as possible.
Unlike `NOTE_INSN_VAR_LOCATION', the value expression in an
`INSN_VAR_LOCATION' denotes a value at that specific point in the
program, rather than an expression that can be evaluated at any
later point before an overriding `VAR_LOCATION' is encountered.
E.g., if a user variable is bound to a `REG' and then a subsequent
insn modifies the `REG', the note location would keep mapping the
user variable to the register across the insn, whereas the insn
location would keep the variable bound to the value, so that the
variable tracking pass would emit another location note for the
variable at the point in which the register is modified.
The machine mode of an insn is normally `VOIDmode', but some phases
use the mode for various purposes.
The common subexpression elimination pass sets the mode of an insn to
`QImode' when it is the first insn in a block that has already been
processed.
The second Haifa scheduling pass, for targets that can multiple issue,
sets the mode of an insn to `TImode' when it is believed that the
instruction begins an issue group. That is, when the instruction
cannot issue simultaneously with the previous. This may be relied on
by later passes, in particular machine-dependent reorg.
Here is a table of the extra fields of `insn', `jump_insn' and
`call_insn' insns:
`PATTERN (I)'
An expression for the side effect performed by this insn. This
must be one of the following codes: `set', `call', `use',
`clobber', `return', `asm_input', `asm_output', `addr_vec',
`addr_diff_vec', `trap_if', `unspec', `unspec_volatile',
`parallel', `cond_exec', or `sequence'. If it is a `parallel',
each element of the `parallel' must be one these codes, except that
`parallel' expressions cannot be nested and `addr_vec' and
`addr_diff_vec' are not permitted inside a `parallel' expression.
`INSN_CODE (I)'
An integer that says which pattern in the machine description
matches this insn, or -1 if the matching has not yet been
attempted.
Such matching is never attempted and this field remains -1 on an
insn whose pattern consists of a single `use', `clobber',
`asm_input', `addr_vec' or `addr_diff_vec' expression.
Matching is also never attempted on insns that result from an `asm'
statement. These contain at least one `asm_operands' expression.
The function `asm_noperands' returns a non-negative value for such
insns.
In the debugging output, this field is printed as a number
followed by a symbolic representation that locates the pattern in
the `md' file as some small positive or negative offset from a
named pattern.
`LOG_LINKS (I)'
A list (chain of `insn_list' expressions) giving information about
dependencies between instructions within a basic block. Neither a
jump nor a label may come between the related insns. These are
only used by the schedulers and by combine. This is a deprecated
data structure. Def-use and use-def chains are now preferred.
`REG_NOTES (I)'
A list (chain of `expr_list' and `insn_list' expressions) giving
miscellaneous information about the insn. It is often information
pertaining to the registers used in this insn.
The `LOG_LINKS' field of an insn is a chain of `insn_list'
expressions. Each of these has two operands: the first is an insn, and
the second is another `insn_list' expression (the next one in the
chain). The last `insn_list' in the chain has a null pointer as second
operand. The significant thing about the chain is which insns appear
in it (as first operands of `insn_list' expressions). Their order is
not significant.
This list is originally set up by the flow analysis pass; it is a null
pointer until then. Flow only adds links for those data dependencies
which can be used for instruction combination. For each insn, the flow
analysis pass adds a link to insns which store into registers values
that are used for the first time in this insn.
The `REG_NOTES' field of an insn is a chain similar to the `LOG_LINKS'
field but it includes `expr_list' expressions in addition to
`insn_list' expressions. There are several kinds of register notes,
which are distinguished by the machine mode, which in a register note
is really understood as being an `enum reg_note'. The first operand OP
of the note is data whose meaning depends on the kind of note.
The macro `REG_NOTE_KIND (X)' returns the kind of register note. Its
counterpart, the macro `PUT_REG_NOTE_KIND (X, NEWKIND)' sets the
register note type of X to be NEWKIND.
Register notes are of three classes: They may say something about an
input to an insn, they may say something about an output of an insn, or
they may create a linkage between two insns. There are also a set of
values that are only used in `LOG_LINKS'.
These register notes annotate inputs to an insn:
`REG_DEAD'
The value in OP dies in this insn; that is to say, altering the
value immediately after this insn would not affect the future
behavior of the program.
It does not follow that the register OP has no useful value after
this insn since OP is not necessarily modified by this insn.
Rather, no subsequent instruction uses the contents of OP.
`REG_UNUSED'
The register OP being set by this insn will not be used in a
subsequent insn. This differs from a `REG_DEAD' note, which
indicates that the value in an input will not be used subsequently.
These two notes are independent; both may be present for the same
register.
`REG_INC'
The register OP is incremented (or decremented; at this level
there is no distinction) by an embedded side effect inside this
insn. This means it appears in a `post_inc', `pre_inc',
`post_dec' or `pre_dec' expression.
`REG_NONNEG'
The register OP is known to have a nonnegative value when this
insn is reached. This is used so that decrement and branch until
zero instructions, such as the m68k dbra, can be matched.
The `REG_NONNEG' note is added to insns only if the machine
description has a `decrement_and_branch_until_zero' pattern.
`REG_LABEL_OPERAND'
This insn uses OP, a `code_label' or a `note' of type
`NOTE_INSN_DELETED_LABEL', but is not a `jump_insn', or it is a
`jump_insn' that refers to the operand as an ordinary operand.
The label may still eventually be a jump target, but if so in an
indirect jump in a subsequent insn. The presence of this note
allows jump optimization to be aware that OP is, in fact, being
used, and flow optimization to build an accurate flow graph.
`REG_LABEL_TARGET'
This insn is a `jump_insn' but not an `addr_vec' or
`addr_diff_vec'. It uses OP, a `code_label' as a direct or
indirect jump target. Its purpose is similar to that of
`REG_LABEL_OPERAND'. This note is only present if the insn has
multiple targets; the last label in the insn (in the highest
numbered insn-field) goes into the `JUMP_LABEL' field and does not
have a `REG_LABEL_TARGET' note. *Note JUMP_LABEL: Insns.
`REG_CROSSING_JUMP'
This insn is a branching instruction (either an unconditional jump
or an indirect jump) which crosses between hot and cold sections,
which could potentially be very far apart in the executable. The
presence of this note indicates to other optimizations that this
branching instruction should not be "collapsed" into a simpler
branching construct. It is used when the optimization to
partition basic blocks into hot and cold sections is turned on.
`REG_SETJMP'
Appears attached to each `CALL_INSN' to `setjmp' or a related
function.
The following notes describe attributes of outputs of an insn:
`REG_EQUIV'
`REG_EQUAL'
This note is only valid on an insn that sets only one register and
indicates that that register will be equal to OP at run time; the
scope of this equivalence differs between the two types of notes.
The value which the insn explicitly copies into the register may
look different from OP, but they will be equal at run time. If the
output of the single `set' is a `strict_low_part' expression, the
note refers to the register that is contained in `SUBREG_REG' of
the `subreg' expression.
For `REG_EQUIV', the register is equivalent to OP throughout the
entire function, and could validly be replaced in all its
occurrences by OP. ("Validly" here refers to the data flow of the
program; simple replacement may make some insns invalid.) For
example, when a constant is loaded into a register that is never
assigned any other value, this kind of note is used.
When a parameter is copied into a pseudo-register at entry to a
function, a note of this kind records that the register is
equivalent to the stack slot where the parameter was passed.
Although in this case the register may be set by other insns, it
is still valid to replace the register by the stack slot
throughout the function.
A `REG_EQUIV' note is also used on an instruction which copies a
register parameter into a pseudo-register at entry to a function,
if there is a stack slot where that parameter could be stored.
Although other insns may set the pseudo-register, it is valid for
the compiler to replace the pseudo-register by stack slot
throughout the function, provided the compiler ensures that the
stack slot is properly initialized by making the replacement in
the initial copy instruction as well. This is used on machines
for which the calling convention allocates stack space for
register parameters. See `REG_PARM_STACK_SPACE' in *note Stack
Arguments::.
In the case of `REG_EQUAL', the register that is set by this insn
will be equal to OP at run time at the end of this insn but not
necessarily elsewhere in the function. In this case, OP is
typically an arithmetic expression. For example, when a sequence
of insns such as a library call is used to perform an arithmetic
operation, this kind of note is attached to the insn that produces
or copies the final value.
These two notes are used in different ways by the compiler passes.
`REG_EQUAL' is used by passes prior to register allocation (such as
common subexpression elimination and loop optimization) to tell
them how to think of that value. `REG_EQUIV' notes are used by
register allocation to indicate that there is an available
substitute expression (either a constant or a `mem' expression for
the location of a parameter on the stack) that may be used in
place of a register if insufficient registers are available.
Except for stack homes for parameters, which are indicated by a
`REG_EQUIV' note and are not useful to the early optimization
passes and pseudo registers that are equivalent to a memory
location throughout their entire life, which is not detected until
later in the compilation, all equivalences are initially indicated
by an attached `REG_EQUAL' note. In the early stages of register
allocation, a `REG_EQUAL' note is changed into a `REG_EQUIV' note
if OP is a constant and the insn represents the only set of its
destination register.
Thus, compiler passes prior to register allocation need only check
for `REG_EQUAL' notes and passes subsequent to register allocation
need only check for `REG_EQUIV' notes.
These notes describe linkages between insns. They occur in pairs: one
insn has one of a pair of notes that points to a second insn, which has
the inverse note pointing back to the first insn.
`REG_CC_SETTER'
`REG_CC_USER'
On machines that use `cc0', the insns which set and use `cc0' set
and use `cc0' are adjacent. However, when branch delay slot
filling is done, this may no longer be true. In this case a
`REG_CC_USER' note will be placed on the insn setting `cc0' to
point to the insn using `cc0' and a `REG_CC_SETTER' note will be
placed on the insn using `cc0' to point to the insn setting `cc0'.
These values are only used in the `LOG_LINKS' field, and indicate the
type of dependency that each link represents. Links which indicate a
data dependence (a read after write dependence) do not use any code,
they simply have mode `VOIDmode', and are printed without any
descriptive text.
`REG_DEP_TRUE'
This indicates a true dependence (a read after write dependence).
`REG_DEP_OUTPUT'
This indicates an output dependence (a write after write
dependence).
`REG_DEP_ANTI'
This indicates an anti dependence (a write after read dependence).
These notes describe information gathered from gcov profile data. They
are stored in the `REG_NOTES' field of an insn as an `expr_list'.
`REG_BR_PROB'
This is used to specify the ratio of branches to non-branches of a
branch insn according to the profile data. The value is stored as
a value between 0 and REG_BR_PROB_BASE; larger values indicate a
higher probability that the branch will be taken.
`REG_BR_PRED'
These notes are found in JUMP insns after delayed branch scheduling
has taken place. They indicate both the direction and the
likelihood of the JUMP. The format is a bitmask of ATTR_FLAG_*
values.
`REG_FRAME_RELATED_EXPR'
This is used on an RTX_FRAME_RELATED_P insn wherein the attached
expression is used in place of the actual insn pattern. This is
done in cases where the pattern is either complex or misleading.
For convenience, the machine mode in an `insn_list' or `expr_list' is
printed using these symbolic codes in debugging dumps.
The only difference between the expression codes `insn_list' and
`expr_list' is that the first operand of an `insn_list' is assumed to
be an insn and is printed in debugging dumps as the insn's unique id;
the first operand of an `expr_list' is printed in the ordinary way as
an expression.
File: gccint.info, Node: Calls, Next: Sharing, Prev: Insns, Up: RTL
10.20 RTL Representation of Function-Call Insns
===============================================
Insns that call subroutines have the RTL expression code `call_insn'.
These insns must satisfy special rules, and their bodies must use a
special RTL expression code, `call'.
A `call' expression has two operands, as follows:
(call (mem:FM ADDR) NBYTES)
Here NBYTES is an operand that represents the number of bytes of
argument data being passed to the subroutine, FM is a machine mode
(which must equal as the definition of the `FUNCTION_MODE' macro in the
machine description) and ADDR represents the address of the subroutine.
For a subroutine that returns no value, the `call' expression as shown
above is the entire body of the insn, except that the insn might also
contain `use' or `clobber' expressions.
For a subroutine that returns a value whose mode is not `BLKmode', the
value is returned in a hard register. If this register's number is R,
then the body of the call insn looks like this:
(set (reg:M R)
(call (mem:FM ADDR) NBYTES))
This RTL expression makes it clear (to the optimizer passes) that the
appropriate register receives a useful value in this insn.
When a subroutine returns a `BLKmode' value, it is handled by passing
to the subroutine the address of a place to store the value. So the
call insn itself does not "return" any value, and it has the same RTL
form as a call that returns nothing.
On some machines, the call instruction itself clobbers some register,
for example to contain the return address. `call_insn' insns on these
machines should have a body which is a `parallel' that contains both
the `call' expression and `clobber' expressions that indicate which
registers are destroyed. Similarly, if the call instruction requires
some register other than the stack pointer that is not explicitly
mentioned in its RTL, a `use' subexpression should mention that
register.
Functions that are called are assumed to modify all registers listed in
the configuration macro `CALL_USED_REGISTERS' (*note Register Basics::)
and, with the exception of `const' functions and library calls, to
modify all of memory.
Insns containing just `use' expressions directly precede the
`call_insn' insn to indicate which registers contain inputs to the
function. Similarly, if registers other than those in
`CALL_USED_REGISTERS' are clobbered by the called function, insns
containing a single `clobber' follow immediately after the call to
indicate which registers.
File: gccint.info, Node: Sharing, Next: Reading RTL, Prev: Calls, Up: RTL
10.21 Structure Sharing Assumptions
===================================
The compiler assumes that certain kinds of RTL expressions are unique;
there do not exist two distinct objects representing the same value.
In other cases, it makes an opposite assumption: that no RTL expression
object of a certain kind appears in more than one place in the
containing structure.
These assumptions refer to a single function; except for the RTL
objects that describe global variables and external functions, and a
few standard objects such as small integer constants, no RTL objects
are common to two functions.
* Each pseudo-register has only a single `reg' object to represent
it, and therefore only a single machine mode.
* For any symbolic label, there is only one `symbol_ref' object
referring to it.
* All `const_int' expressions with equal values are shared.
* There is only one `pc' expression.
* There is only one `cc0' expression.
* There is only one `const_double' expression with value 0 for each
floating point mode. Likewise for values 1 and 2.
* There is only one `const_vector' expression with value 0 for each
vector mode, be it an integer or a double constant vector.
* No `label_ref' or `scratch' appears in more than one place in the
RTL structure; in other words, it is safe to do a tree-walk of all
the insns in the function and assume that each time a `label_ref'
or `scratch' is seen it is distinct from all others that are seen.
* Only one `mem' object is normally created for each static variable
or stack slot, so these objects are frequently shared in all the
places they appear. However, separate but equal objects for these
variables are occasionally made.
* When a single `asm' statement has multiple output operands, a
distinct `asm_operands' expression is made for each output operand.
However, these all share the vector which contains the sequence of
input operands. This sharing is used later on to test whether two
`asm_operands' expressions come from the same statement, so all
optimizations must carefully preserve the sharing if they copy the
vector at all.
* No RTL object appears in more than one place in the RTL structure
except as described above. Many passes of the compiler rely on
this by assuming that they can modify RTL objects in place without
unwanted side-effects on other insns.
* During initial RTL generation, shared structure is freely
introduced. After all the RTL for a function has been generated,
all shared structure is copied by `unshare_all_rtl' in
`emit-rtl.c', after which the above rules are guaranteed to be
followed.
* During the combiner pass, shared structure within an insn can exist
temporarily. However, the shared structure is copied before the
combiner is finished with the insn. This is done by calling
`copy_rtx_if_shared', which is a subroutine of `unshare_all_rtl'.
File: gccint.info, Node: Reading RTL, Prev: Sharing, Up: RTL
10.22 Reading RTL
=================
To read an RTL object from a file, call `read_rtx'. It takes one
argument, a stdio stream, and returns a single RTL object. This routine
is defined in `read-rtl.c'. It is not available in the compiler
itself, only the various programs that generate the compiler back end
from the machine description.
People frequently have the idea of using RTL stored as text in a file
as an interface between a language front end and the bulk of GCC. This
idea is not feasible.
GCC was designed to use RTL internally only. Correct RTL for a given
program is very dependent on the particular target machine. And the RTL
does not contain all the information about the program.
The proper way to interface GCC to a new language front end is with
the "tree" data structure, described in the files `tree.h' and
`tree.def'. The documentation for this structure (*note GENERIC::) is
incomplete.
File: gccint.info, Node: GENERIC, Next: GIMPLE, Prev: Passes, Up: Top
11 GENERIC
**********
The purpose of GENERIC is simply to provide a language-independent way
of representing an entire function in trees. To this end, it was
necessary to add a few new tree codes to the back end, but most
everything was already there. If you can express it with the codes in
`gcc/tree.def', it's GENERIC.
Early on, there was a great deal of debate about how to think about
statements in a tree IL. In GENERIC, a statement is defined as any
expression whose value, if any, is ignored. A statement will always
have `TREE_SIDE_EFFECTS' set (or it will be discarded), but a
non-statement expression may also have side effects. A `CALL_EXPR',
for instance.
It would be possible for some local optimizations to work on the
GENERIC form of a function; indeed, the adapted tree inliner works fine
on GENERIC, but the current compiler performs inlining after lowering
to GIMPLE (a restricted form described in the next section). Indeed,
currently the frontends perform this lowering before handing off to
`tree_rest_of_compilation', but this seems inelegant.
* Menu:
* Deficiencies:: Topics net yet covered in this document.
* Tree overview:: All about `tree's.
* Types:: Fundamental and aggregate types.
* Declarations:: Type declarations and variables.
* Attributes:: Declaration and type attributes.
* Expressions: Expression trees. Operating on data.
* Statements:: Control flow and related trees.
* Functions:: Function bodies, linkage, and other aspects.
* Language-dependent trees:: Topics and trees specific to language front ends.
* C and C++ Trees:: Trees specific to C and C++.
* Java Trees:: Trees specific to Java.
File: gccint.info, Node: Deficiencies, Next: Tree overview, Up: GENERIC
11.1 Deficiencies
=================
There are many places in which this document is incomplet and incorrekt.
It is, as of yet, only _preliminary_ documentation.
File: gccint.info, Node: Tree overview, Next: Types, Prev: Deficiencies, Up: GENERIC
11.2 Overview
=============
The central data structure used by the internal representation is the
`tree'. These nodes, while all of the C type `tree', are of many
varieties. A `tree' is a pointer type, but the object to which it
points may be of a variety of types. From this point forward, we will
refer to trees in ordinary type, rather than in `this font', except
when talking about the actual C type `tree'.
You can tell what kind of node a particular tree is by using the
`TREE_CODE' macro. Many, many macros take trees as input and return
trees as output. However, most macros require a certain kind of tree
node as input. In other words, there is a type-system for trees, but
it is not reflected in the C type-system.
For safety, it is useful to configure GCC with `--enable-checking'.
Although this results in a significant performance penalty (since all
tree types are checked at run-time), and is therefore inappropriate in a
release version, it is extremely helpful during the development process.
Many macros behave as predicates. Many, although not all, of these
predicates end in `_P'. Do not rely on the result type of these macros
being of any particular type. You may, however, rely on the fact that
the type can be compared to `0', so that statements like
if (TEST_P (t) && !TEST_P (y))
x = 1;
and
int i = (TEST_P (t) != 0);
are legal. Macros that return `int' values now may be changed to
return `tree' values, or other pointers in the future. Even those that
continue to return `int' may return multiple nonzero codes where
previously they returned only zero and one. Therefore, you should not
write code like
if (TEST_P (t) == 1)
as this code is not guaranteed to work correctly in the future.
You should not take the address of values returned by the macros or
functions described here. In particular, no guarantee is given that the
values are lvalues.
In general, the names of macros are all in uppercase, while the names
of functions are entirely in lowercase. There are rare exceptions to
this rule. You should assume that any macro or function whose name is
made up entirely of uppercase letters may evaluate its arguments more
than once. You may assume that a macro or function whose name is made
up entirely of lowercase letters will evaluate its arguments only once.
The `error_mark_node' is a special tree. Its tree code is
`ERROR_MARK', but since there is only ever one node with that code, the
usual practice is to compare the tree against `error_mark_node'. (This
test is just a test for pointer equality.) If an error has occurred
during front-end processing the flag `errorcount' will be set. If the
front end has encountered code it cannot handle, it will issue a
message to the user and set `sorrycount'. When these flags are set,
any macro or function which normally returns a tree of a particular
kind may instead return the `error_mark_node'. Thus, if you intend to
do any processing of erroneous code, you must be prepared to deal with
the `error_mark_node'.
Occasionally, a particular tree slot (like an operand to an expression,
or a particular field in a declaration) will be referred to as
"reserved for the back end". These slots are used to store RTL when
the tree is converted to RTL for use by the GCC back end. However, if
that process is not taking place (e.g., if the front end is being hooked
up to an intelligent editor), then those slots may be used by the back
end presently in use.
If you encounter situations that do not match this documentation, such
as tree nodes of types not mentioned here, or macros documented to
return entities of a particular kind that instead return entities of
some different kind, you have found a bug, either in the front end or in
the documentation. Please report these bugs as you would any other bug.
* Menu:
* Macros and Functions::Macros and functions that can be used with all trees.
* Identifiers:: The names of things.
* Containers:: Lists and vectors.
File: gccint.info, Node: Macros and Functions, Next: Identifiers, Up: Tree overview
11.2.1 Trees
------------
All GENERIC trees have two fields in common. First, `TREE_CHAIN' is a
pointer that can be used as a singly-linked list to other trees. The
other is `TREE_TYPE'. Many trees store the type of an expression or
declaration in this field.
These are some other functions for handling trees:
`tree_size'
Return the number of bytes a tree takes.
`build0'
`build1'
`build2'
`build3'
`build4'
`build5'
`build6'
These functions build a tree and supply values to put in each
parameter. The basic signature is `code, type, [operands]'.
`code' is the `TREE_CODE', and `type' is a tree representing the
`TREE_TYPE'. These are followed by the operands, each of which is
also a tree.
File: gccint.info, Node: Identifiers, Next: Containers, Prev: Macros and Functions, Up: Tree overview
11.2.2 Identifiers
------------------
An `IDENTIFIER_NODE' represents a slightly more general concept that
the standard C or C++ concept of identifier. In particular, an
`IDENTIFIER_NODE' may contain a `$', or other extraordinary characters.
There are never two distinct `IDENTIFIER_NODE's representing the same
identifier. Therefore, you may use pointer equality to compare
`IDENTIFIER_NODE's, rather than using a routine like `strcmp'. Use
`get_identifier' to obtain the unique `IDENTIFIER_NODE' for a supplied
string.
You can use the following macros to access identifiers:
`IDENTIFIER_POINTER'
The string represented by the identifier, represented as a
`char*'. This string is always `NUL'-terminated, and contains no
embedded `NUL' characters.
`IDENTIFIER_LENGTH'
The length of the string returned by `IDENTIFIER_POINTER', not
including the trailing `NUL'. This value of `IDENTIFIER_LENGTH
(x)' is always the same as `strlen (IDENTIFIER_POINTER (x))'.
`IDENTIFIER_OPNAME_P'
This predicate holds if the identifier represents the name of an
overloaded operator. In this case, you should not depend on the
contents of either the `IDENTIFIER_POINTER' or the
`IDENTIFIER_LENGTH'.
`IDENTIFIER_TYPENAME_P'
This predicate holds if the identifier represents the name of a
user-defined conversion operator. In this case, the `TREE_TYPE' of
the `IDENTIFIER_NODE' holds the type to which the conversion
operator converts.
File: gccint.info, Node: Containers, Prev: Identifiers, Up: Tree overview
11.2.3 Containers
-----------------
Two common container data structures can be represented directly with
tree nodes. A `TREE_LIST' is a singly linked list containing two trees
per node. These are the `TREE_PURPOSE' and `TREE_VALUE' of each node.
(Often, the `TREE_PURPOSE' contains some kind of tag, or additional
information, while the `TREE_VALUE' contains the majority of the
payload. In other cases, the `TREE_PURPOSE' is simply `NULL_TREE',
while in still others both the `TREE_PURPOSE' and `TREE_VALUE' are of
equal stature.) Given one `TREE_LIST' node, the next node is found by
following the `TREE_CHAIN'. If the `TREE_CHAIN' is `NULL_TREE', then
you have reached the end of the list.
A `TREE_VEC' is a simple vector. The `TREE_VEC_LENGTH' is an integer
(not a tree) giving the number of nodes in the vector. The nodes
themselves are accessed using the `TREE_VEC_ELT' macro, which takes two
arguments. The first is the `TREE_VEC' in question; the second is an
integer indicating which element in the vector is desired. The
elements are indexed from zero.
File: gccint.info, Node: Types, Next: Declarations, Prev: Tree overview, Up: GENERIC
11.3 Types
==========
All types have corresponding tree nodes. However, you should not assume
that there is exactly one tree node corresponding to each type. There
are often multiple nodes corresponding to the same type.
For the most part, different kinds of types have different tree codes.
(For example, pointer types use a `POINTER_TYPE' code while arrays use
an `ARRAY_TYPE' code.) However, pointers to member functions use the
`RECORD_TYPE' code. Therefore, when writing a `switch' statement that
depends on the code associated with a particular type, you should take
care to handle pointers to member functions under the `RECORD_TYPE'
case label.
The following functions and macros deal with cv-qualification of types:
`TYPE_MAIN_VARIANT'
This macro returns the unqualified version of a type. It may be
applied to an unqualified type, but it is not always the identity
function in that case.
A few other macros and functions are usable with all types:
`TYPE_SIZE'
The number of bits required to represent the type, represented as
an `INTEGER_CST'. For an incomplete type, `TYPE_SIZE' will be
`NULL_TREE'.
`TYPE_ALIGN'
The alignment of the type, in bits, represented as an `int'.
`TYPE_NAME'
This macro returns a declaration (in the form of a `TYPE_DECL') for
the type. (Note this macro does _not_ return an
`IDENTIFIER_NODE', as you might expect, given its name!) You can
look at the `DECL_NAME' of the `TYPE_DECL' to obtain the actual
name of the type. The `TYPE_NAME' will be `NULL_TREE' for a type
that is not a built-in type, the result of a typedef, or a named
class type.
`TYPE_CANONICAL'
This macro returns the "canonical" type for the given type node.
Canonical types are used to improve performance in the C++ and
Objective-C++ front ends by allowing efficient comparison between
two type nodes in `same_type_p': if the `TYPE_CANONICAL' values of
the types are equal, the types are equivalent; otherwise, the types
are not equivalent. The notion of equivalence for canonical types
is the same as the notion of type equivalence in the language
itself. For instance,
When `TYPE_CANONICAL' is `NULL_TREE', there is no canonical type
for the given type node. In this case, comparison between this
type and any other type requires the compiler to perform a deep,
"structural" comparison to see if the two type nodes have the same
form and properties.
The canonical type for a node is always the most fundamental type
in the equivalence class of types. For instance, `int' is its own
canonical type. A typedef `I' of `int' will have `int' as its
canonical type. Similarly, `I*' and a typedef `IP' (defined to
`I*') will has `int*' as their canonical type. When building a new
type node, be sure to set `TYPE_CANONICAL' to the appropriate
canonical type. If the new type is a compound type (built from
other types), and any of those other types require structural
equality, use `SET_TYPE_STRUCTURAL_EQUALITY' to ensure that the
new type also requires structural equality. Finally, if for some
reason you cannot guarantee that `TYPE_CANONICAL' will point to
the canonical type, use `SET_TYPE_STRUCTURAL_EQUALITY' to make
sure that the new type-and any type constructed based on
it-requires structural equality. If you suspect that the canonical
type system is miscomparing types, pass `--param
verify-canonical-types=1' to the compiler or configure with
`--enable-checking' to force the compiler to verify its
canonical-type comparisons against the structural comparisons; the
compiler will then print any warnings if the canonical types
miscompare.
`TYPE_STRUCTURAL_EQUALITY_P'
This predicate holds when the node requires structural equality
checks, e.g., when `TYPE_CANONICAL' is `NULL_TREE'.
`SET_TYPE_STRUCTURAL_EQUALITY'
This macro states that the type node it is given requires
structural equality checks, e.g., it sets `TYPE_CANONICAL' to
`NULL_TREE'.
`same_type_p'
This predicate takes two types as input, and holds if they are the
same type. For example, if one type is a `typedef' for the other,
or both are `typedef's for the same type. This predicate also
holds if the two trees given as input are simply copies of one
another; i.e., there is no difference between them at the source
level, but, for whatever reason, a duplicate has been made in the
representation. You should never use `==' (pointer equality) to
compare types; always use `same_type_p' instead.
Detailed below are the various kinds of types, and the macros that can
be used to access them. Although other kinds of types are used
elsewhere in G++, the types described here are the only ones that you
will encounter while examining the intermediate representation.
`VOID_TYPE'
Used to represent the `void' type.
`INTEGER_TYPE'
Used to represent the various integral types, including `char',
`short', `int', `long', and `long long'. This code is not used
for enumeration types, nor for the `bool' type. The
`TYPE_PRECISION' is the number of bits used in the representation,
represented as an `unsigned int'. (Note that in the general case
this is not the same value as `TYPE_SIZE'; suppose that there were
a 24-bit integer type, but that alignment requirements for the ABI
required 32-bit alignment. Then, `TYPE_SIZE' would be an
`INTEGER_CST' for 32, while `TYPE_PRECISION' would be 24.) The
integer type is unsigned if `TYPE_UNSIGNED' holds; otherwise, it
is signed.
The `TYPE_MIN_VALUE' is an `INTEGER_CST' for the smallest integer
that may be represented by this type. Similarly, the
`TYPE_MAX_VALUE' is an `INTEGER_CST' for the largest integer that
may be represented by this type.
`REAL_TYPE'
Used to represent the `float', `double', and `long double' types.
The number of bits in the floating-point representation is given
by `TYPE_PRECISION', as in the `INTEGER_TYPE' case.
`FIXED_POINT_TYPE'
Used to represent the `short _Fract', `_Fract', `long _Fract',
`long long _Fract', `short _Accum', `_Accum', `long _Accum', and
`long long _Accum' types. The number of bits in the fixed-point
representation is given by `TYPE_PRECISION', as in the
`INTEGER_TYPE' case. There may be padding bits, fractional bits
and integral bits. The number of fractional bits is given by
`TYPE_FBIT', and the number of integral bits is given by
`TYPE_IBIT'. The fixed-point type is unsigned if `TYPE_UNSIGNED'
holds; otherwise, it is signed. The fixed-point type is
saturating if `TYPE_SATURATING' holds; otherwise, it is not
saturating.
`COMPLEX_TYPE'
Used to represent GCC built-in `__complex__' data types. The
`TREE_TYPE' is the type of the real and imaginary parts.
`ENUMERAL_TYPE'
Used to represent an enumeration type. The `TYPE_PRECISION' gives
(as an `int'), the number of bits used to represent the type. If
there are no negative enumeration constants, `TYPE_UNSIGNED' will
hold. The minimum and maximum enumeration constants may be
obtained with `TYPE_MIN_VALUE' and `TYPE_MAX_VALUE', respectively;
each of these macros returns an `INTEGER_CST'.
The actual enumeration constants themselves may be obtained by
looking at the `TYPE_VALUES'. This macro will return a
`TREE_LIST', containing the constants. The `TREE_PURPOSE' of each
node will be an `IDENTIFIER_NODE' giving the name of the constant;
the `TREE_VALUE' will be an `INTEGER_CST' giving the value
assigned to that constant. These constants will appear in the
order in which they were declared. The `TREE_TYPE' of each of
these constants will be the type of enumeration type itself.
`BOOLEAN_TYPE'
Used to represent the `bool' type.
`POINTER_TYPE'
Used to represent pointer types, and pointer to data member types.
The `TREE_TYPE' gives the type to which this type points.
`REFERENCE_TYPE'
Used to represent reference types. The `TREE_TYPE' gives the type
to which this type refers.
`FUNCTION_TYPE'
Used to represent the type of non-member functions and of static
member functions. The `TREE_TYPE' gives the return type of the
function. The `TYPE_ARG_TYPES' are a `TREE_LIST' of the argument
types. The `TREE_VALUE' of each node in this list is the type of
the corresponding argument; the `TREE_PURPOSE' is an expression
for the default argument value, if any. If the last node in the
list is `void_list_node' (a `TREE_LIST' node whose `TREE_VALUE' is
the `void_type_node'), then functions of this type do not take
variable arguments. Otherwise, they do take a variable number of
arguments.
Note that in C (but not in C++) a function declared like `void f()'
is an unprototyped function taking a variable number of arguments;
the `TYPE_ARG_TYPES' of such a function will be `NULL'.
`METHOD_TYPE'
Used to represent the type of a non-static member function. Like a
`FUNCTION_TYPE', the return type is given by the `TREE_TYPE'. The
type of `*this', i.e., the class of which functions of this type
are a member, is given by the `TYPE_METHOD_BASETYPE'. The
`TYPE_ARG_TYPES' is the parameter list, as for a `FUNCTION_TYPE',
and includes the `this' argument.
`ARRAY_TYPE'
Used to represent array types. The `TREE_TYPE' gives the type of
the elements in the array. If the array-bound is present in the
type, the `TYPE_DOMAIN' is an `INTEGER_TYPE' whose
`TYPE_MIN_VALUE' and `TYPE_MAX_VALUE' will be the lower and upper
bounds of the array, respectively. The `TYPE_MIN_VALUE' will
always be an `INTEGER_CST' for zero, while the `TYPE_MAX_VALUE'
will be one less than the number of elements in the array, i.e.,
the highest value which may be used to index an element in the
array.
`RECORD_TYPE'
Used to represent `struct' and `class' types, as well as pointers
to member functions and similar constructs in other languages.
`TYPE_FIELDS' contains the items contained in this type, each of
which can be a `FIELD_DECL', `VAR_DECL', `CONST_DECL', or
`TYPE_DECL'. You may not make any assumptions about the ordering
of the fields in the type or whether one or more of them overlap.
`UNION_TYPE'
Used to represent `union' types. Similar to `RECORD_TYPE' except
that all `FIELD_DECL' nodes in `TYPE_FIELD' start at bit position
zero.
`QUAL_UNION_TYPE'
Used to represent part of a variant record in Ada. Similar to
`UNION_TYPE' except that each `FIELD_DECL' has a `DECL_QUALIFIER'
field, which contains a boolean expression that indicates whether
the field is present in the object. The type will only have one
field, so each field's `DECL_QUALIFIER' is only evaluated if none
of the expressions in the previous fields in `TYPE_FIELDS' are
nonzero. Normally these expressions will reference a field in the
outer object using a `PLACEHOLDER_EXPR'.
`LANG_TYPE'
This node is used to represent a language-specific type. The front
end must handle it.
`OFFSET_TYPE'
This node is used to represent a pointer-to-data member. For a
data member `X::m' the `TYPE_OFFSET_BASETYPE' is `X' and the
`TREE_TYPE' is the type of `m'.
There are variables whose values represent some of the basic types.
These include:
`void_type_node'
A node for `void'.
`integer_type_node'
A node for `int'.
`unsigned_type_node.'
A node for `unsigned int'.
`char_type_node.'
A node for `char'.
It may sometimes be useful to compare one of these variables with a
type in hand, using `same_type_p'.
File: gccint.info, Node: Declarations, Next: Attributes, Prev: Types, Up: GENERIC
11.4 Declarations
=================
This section covers the various kinds of declarations that appear in the
internal representation, except for declarations of functions
(represented by `FUNCTION_DECL' nodes), which are described in *note
Functions::.
* Menu:
* Working with declarations:: Macros and functions that work on
declarations.
* Internal structure:: How declaration nodes are represented.
File: gccint.info, Node: Working with declarations, Next: Internal structure, Up: Declarations
11.4.1 Working with declarations
--------------------------------
Some macros can be used with any kind of declaration. These include:
`DECL_NAME'
This macro returns an `IDENTIFIER_NODE' giving the name of the
entity.
`TREE_TYPE'
This macro returns the type of the entity declared.
`EXPR_FILENAME'
This macro returns the name of the file in which the entity was
declared, as a `char*'. For an entity declared implicitly by the
compiler (like `__builtin_memcpy'), this will be the string
`"<internal>"'.
`EXPR_LINENO'
This macro returns the line number at which the entity was
declared, as an `int'.
`DECL_ARTIFICIAL'
This predicate holds if the declaration was implicitly generated
by the compiler. For example, this predicate will hold of an
implicitly declared member function, or of the `TYPE_DECL'
implicitly generated for a class type. Recall that in C++ code
like:
struct S {};
is roughly equivalent to C code like:
struct S {};
typedef struct S S;
The implicitly generated `typedef' declaration is represented by a
`TYPE_DECL' for which `DECL_ARTIFICIAL' holds.
The various kinds of declarations include:
`LABEL_DECL'
These nodes are used to represent labels in function bodies. For
more information, see *note Functions::. These nodes only appear
in block scopes.
`CONST_DECL'
These nodes are used to represent enumeration constants. The
value of the constant is given by `DECL_INITIAL' which will be an
`INTEGER_CST' with the same type as the `TREE_TYPE' of the
`CONST_DECL', i.e., an `ENUMERAL_TYPE'.
`RESULT_DECL'
These nodes represent the value returned by a function. When a
value is assigned to a `RESULT_DECL', that indicates that the
value should be returned, via bitwise copy, by the function. You
can use `DECL_SIZE' and `DECL_ALIGN' on a `RESULT_DECL', just as
with a `VAR_DECL'.
`TYPE_DECL'
These nodes represent `typedef' declarations. The `TREE_TYPE' is
the type declared to have the name given by `DECL_NAME'. In some
cases, there is no associated name.
`VAR_DECL'
These nodes represent variables with namespace or block scope, as
well as static data members. The `DECL_SIZE' and `DECL_ALIGN' are
analogous to `TYPE_SIZE' and `TYPE_ALIGN'. For a declaration, you
should always use the `DECL_SIZE' and `DECL_ALIGN' rather than the
`TYPE_SIZE' and `TYPE_ALIGN' given by the `TREE_TYPE', since
special attributes may have been applied to the variable to give
it a particular size and alignment. You may use the predicates
`DECL_THIS_STATIC' or `DECL_THIS_EXTERN' to test whether the
storage class specifiers `static' or `extern' were used to declare
a variable.
If this variable is initialized (but does not require a
constructor), the `DECL_INITIAL' will be an expression for the
initializer. The initializer should be evaluated, and a bitwise
copy into the variable performed. If the `DECL_INITIAL' is the
`error_mark_node', there is an initializer, but it is given by an
explicit statement later in the code; no bitwise copy is required.
GCC provides an extension that allows either automatic variables,
or global variables, to be placed in particular registers. This
extension is being used for a particular `VAR_DECL' if
`DECL_REGISTER' holds for the `VAR_DECL', and if
`DECL_ASSEMBLER_NAME' is not equal to `DECL_NAME'. In that case,
`DECL_ASSEMBLER_NAME' is the name of the register into which the
variable will be placed.
`PARM_DECL'
Used to represent a parameter to a function. Treat these nodes
similarly to `VAR_DECL' nodes. These nodes only appear in the
`DECL_ARGUMENTS' for a `FUNCTION_DECL'.
The `DECL_ARG_TYPE' for a `PARM_DECL' is the type that will
actually be used when a value is passed to this function. It may
be a wider type than the `TREE_TYPE' of the parameter; for
example, the ordinary type might be `short' while the
`DECL_ARG_TYPE' is `int'.
`DEBUG_EXPR_DECL'
Used to represent an anonymous debug-information temporary created
to hold an expression as it is optimized away, so that its value
can be referenced in debug bind statements.
`FIELD_DECL'
These nodes represent non-static data members. The `DECL_SIZE' and
`DECL_ALIGN' behave as for `VAR_DECL' nodes. The position of the
field within the parent record is specified by a combination of
three attributes. `DECL_FIELD_OFFSET' is the position, counting
in bytes, of the `DECL_OFFSET_ALIGN'-bit sized word containing the
bit of the field closest to the beginning of the structure.
`DECL_FIELD_BIT_OFFSET' is the bit offset of the first bit of the
field within this word; this may be nonzero even for fields that
are not bit-fields, since `DECL_OFFSET_ALIGN' may be greater than
the natural alignment of the field's type.
If `DECL_C_BIT_FIELD' holds, this field is a bit-field. In a
bit-field, `DECL_BIT_FIELD_TYPE' also contains the type that was
originally specified for it, while DECL_TYPE may be a modified
type with lesser precision, according to the size of the bit field.
`NAMESPACE_DECL'
Namespaces provide a name hierarchy for other declarations. They
appear in the `DECL_CONTEXT' of other `_DECL' nodes.
File: gccint.info, Node: Internal structure, Prev: Working with declarations, Up: Declarations
11.4.2 Internal structure
-------------------------
`DECL' nodes are represented internally as a hierarchy of structures.
* Menu:
* Current structure hierarchy:: The current DECL node structure
hierarchy.
* Adding new DECL node types:: How to add a new DECL node to a
frontend.
File: gccint.info, Node: Current structure hierarchy, Next: Adding new DECL node types, Up: Internal structure
11.4.2.1 Current structure hierarchy
....................................
`struct tree_decl_minimal'
This is the minimal structure to inherit from in order for common
`DECL' macros to work. The fields it contains are a unique ID,
source location, context, and name.
`struct tree_decl_common'
This structure inherits from `struct tree_decl_minimal'. It
contains fields that most `DECL' nodes need, such as a field to
store alignment, machine mode, size, and attributes.
`struct tree_field_decl'
This structure inherits from `struct tree_decl_common'. It is
used to represent `FIELD_DECL'.
`struct tree_label_decl'
This structure inherits from `struct tree_decl_common'. It is
used to represent `LABEL_DECL'.
`struct tree_translation_unit_decl'
This structure inherits from `struct tree_decl_common'. It is
used to represent `TRANSLATION_UNIT_DECL'.
`struct tree_decl_with_rtl'
This structure inherits from `struct tree_decl_common'. It
contains a field to store the low-level RTL associated with a
`DECL' node.
`struct tree_result_decl'
This structure inherits from `struct tree_decl_with_rtl'. It is
used to represent `RESULT_DECL'.
`struct tree_const_decl'
This structure inherits from `struct tree_decl_with_rtl'. It is
used to represent `CONST_DECL'.
`struct tree_parm_decl'
This structure inherits from `struct tree_decl_with_rtl'. It is
used to represent `PARM_DECL'.
`struct tree_decl_with_vis'
This structure inherits from `struct tree_decl_with_rtl'. It
contains fields necessary to store visibility information, as well
as a section name and assembler name.
`struct tree_var_decl'
This structure inherits from `struct tree_decl_with_vis'. It is
used to represent `VAR_DECL'.
`struct tree_function_decl'
This structure inherits from `struct tree_decl_with_vis'. It is
used to represent `FUNCTION_DECL'.
File: gccint.info, Node: Adding new DECL node types, Prev: Current structure hierarchy, Up: Internal structure
11.4.2.2 Adding new DECL node types
...................................
Adding a new `DECL' tree consists of the following steps
Add a new tree code for the `DECL' node
For language specific `DECL' nodes, there is a `.def' file in each
frontend directory where the tree code should be added. For
`DECL' nodes that are part of the middle-end, the code should be
added to `tree.def'.
Create a new structure type for the `DECL' node
These structures should inherit from one of the existing
structures in the language hierarchy by using that structure as
the first member.
struct tree_foo_decl
{
struct tree_decl_with_vis common;
}
Would create a structure name `tree_foo_decl' that inherits from
`struct tree_decl_with_vis'.
For language specific `DECL' nodes, this new structure type should
go in the appropriate `.h' file. For `DECL' nodes that are part
of the middle-end, the structure type should go in `tree.h'.
Add a member to the tree structure enumerator for the node
For garbage collection and dynamic checking purposes, each `DECL'
node structure type is required to have a unique enumerator value
specified with it. For language specific `DECL' nodes, this new
enumerator value should go in the appropriate `.def' file. For
`DECL' nodes that are part of the middle-end, the enumerator
values are specified in `treestruct.def'.
Update `union tree_node'
In order to make your new structure type usable, it must be added
to `union tree_node'. For language specific `DECL' nodes, a new
entry should be added to the appropriate `.h' file of the form
struct tree_foo_decl GTY ((tag ("TS_VAR_DECL"))) foo_decl;
For `DECL' nodes that are part of the middle-end, the additional
member goes directly into `union tree_node' in `tree.h'.
Update dynamic checking info
In order to be able to check whether accessing a named portion of
`union tree_node' is legal, and whether a certain `DECL' node
contains one of the enumerated `DECL' node structures in the
hierarchy, a simple lookup table is used. This lookup table needs
to be kept up to date with the tree structure hierarchy, or else
checking and containment macros will fail inappropriately.
For language specific `DECL' nodes, their is an `init_ts' function
in an appropriate `.c' file, which initializes the lookup table.
Code setting up the table for new `DECL' nodes should be added
there. For each `DECL' tree code and enumerator value
representing a member of the inheritance hierarchy, the table
should contain 1 if that tree code inherits (directly or
indirectly) from that member. Thus, a `FOO_DECL' node derived
from `struct decl_with_rtl', and enumerator value `TS_FOO_DECL',
would be set up as follows
tree_contains_struct[FOO_DECL][TS_FOO_DECL] = 1;
tree_contains_struct[FOO_DECL][TS_DECL_WRTL] = 1;
tree_contains_struct[FOO_DECL][TS_DECL_COMMON] = 1;
tree_contains_struct[FOO_DECL][TS_DECL_MINIMAL] = 1;
For `DECL' nodes that are part of the middle-end, the setup code
goes into `tree.c'.
Add macros to access any new fields and flags
Each added field or flag should have a macro that is used to access
it, that performs appropriate checking to ensure only the right
type of `DECL' nodes access the field.
These macros generally take the following form
#define FOO_DECL_FIELDNAME(NODE) FOO_DECL_CHECK(NODE)->foo_decl.fieldname
However, if the structure is simply a base class for further
structures, something like the following should be used
#define BASE_STRUCT_CHECK(T) CONTAINS_STRUCT_CHECK(T, TS_BASE_STRUCT)
#define BASE_STRUCT_FIELDNAME(NODE) \
(BASE_STRUCT_CHECK(NODE)->base_struct.fieldname
File: gccint.info, Node: Attributes, Next: Expression trees, Prev: Declarations, Up: GENERIC
11.5 Attributes in trees
========================
Attributes, as specified using the `__attribute__' keyword, are
represented internally as a `TREE_LIST'. The `TREE_PURPOSE' is the
name of the attribute, as an `IDENTIFIER_NODE'. The `TREE_VALUE' is a
`TREE_LIST' of the arguments of the attribute, if any, or `NULL_TREE'
if there are no arguments; the arguments are stored as the `TREE_VALUE'
of successive entries in the list, and may be identifiers or
expressions. The `TREE_CHAIN' of the attribute is the next attribute
in a list of attributes applying to the same declaration or type, or
`NULL_TREE' if there are no further attributes in the list.
Attributes may be attached to declarations and to types; these
attributes may be accessed with the following macros. All attributes
are stored in this way, and many also cause other changes to the
declaration or type or to other internal compiler data structures.
-- Tree Macro: tree DECL_ATTRIBUTES (tree DECL)
This macro returns the attributes on the declaration DECL.
-- Tree Macro: tree TYPE_ATTRIBUTES (tree TYPE)
This macro returns the attributes on the type TYPE.
File: gccint.info, Node: Expression trees, Next: Statements, Prev: Attributes, Up: GENERIC
11.6 Expressions
================
The internal representation for expressions is for the most part quite
straightforward. However, there are a few facts that one must bear in
mind. In particular, the expression "tree" is actually a directed
acyclic graph. (For example there may be many references to the integer
constant zero throughout the source program; many of these will be
represented by the same expression node.) You should not rely on
certain kinds of node being shared, nor should you rely on certain
kinds of nodes being unshared.
The following macros can be used with all expression nodes:
`TREE_TYPE'
Returns the type of the expression. This value may not be
precisely the same type that would be given the expression in the
original program.
In what follows, some nodes that one might expect to always have type
`bool' are documented to have either integral or boolean type. At some
point in the future, the C front end may also make use of this same
intermediate representation, and at this point these nodes will
certainly have integral type. The previous sentence is not meant to
imply that the C++ front end does not or will not give these nodes
integral type.
Below, we list the various kinds of expression nodes. Except where
noted otherwise, the operands to an expression are accessed using the
`TREE_OPERAND' macro. For example, to access the first operand to a
binary plus expression `expr', use:
TREE_OPERAND (expr, 0)
As this example indicates, the operands are zero-indexed.
* Menu:
* Constants: Constant expressions.
* Storage References::
* Unary and Binary Expressions::
* Vectors::
File: gccint.info, Node: Constant expressions, Next: Storage References, Up: Expression trees
11.6.1 Constant expressions
---------------------------
The table below begins with constants, moves on to unary expressions,
then proceeds to binary expressions, and concludes with various other
kinds of expressions:
`INTEGER_CST'
These nodes represent integer constants. Note that the type of
these constants is obtained with `TREE_TYPE'; they are not always
of type `int'. In particular, `char' constants are represented
with `INTEGER_CST' nodes. The value of the integer constant `e' is
given by
((TREE_INT_CST_HIGH (e) << HOST_BITS_PER_WIDE_INT)
+ TREE_INST_CST_LOW (e))
HOST_BITS_PER_WIDE_INT is at least thirty-two on all platforms.
Both `TREE_INT_CST_HIGH' and `TREE_INT_CST_LOW' return a
`HOST_WIDE_INT'. The value of an `INTEGER_CST' is interpreted as
a signed or unsigned quantity depending on the type of the
constant. In general, the expression given above will overflow,
so it should not be used to calculate the value of the constant.
The variable `integer_zero_node' is an integer constant with value
zero. Similarly, `integer_one_node' is an integer constant with
value one. The `size_zero_node' and `size_one_node' variables are
analogous, but have type `size_t' rather than `int'.
The function `tree_int_cst_lt' is a predicate which holds if its
first argument is less than its second. Both constants are
assumed to have the same signedness (i.e., either both should be
signed or both should be unsigned.) The full width of the
constant is used when doing the comparison; the usual rules about
promotions and conversions are ignored. Similarly,
`tree_int_cst_equal' holds if the two constants are equal. The
`tree_int_cst_sgn' function returns the sign of a constant. The
value is `1', `0', or `-1' according on whether the constant is
greater than, equal to, or less than zero. Again, the signedness
of the constant's type is taken into account; an unsigned constant
is never less than zero, no matter what its bit-pattern.
`REAL_CST'
FIXME: Talk about how to obtain representations of this constant,
do comparisons, and so forth.
`FIXED_CST'
These nodes represent fixed-point constants. The type of these
constants is obtained with `TREE_TYPE'. `TREE_FIXED_CST_PTR'
points to a `struct fixed_value'; `TREE_FIXED_CST' returns the
structure itself. `struct fixed_value' contains `data' with the
size of two `HOST_BITS_PER_WIDE_INT' and `mode' as the associated
fixed-point machine mode for `data'.
`COMPLEX_CST'
These nodes are used to represent complex number constants, that
is a `__complex__' whose parts are constant nodes. The
`TREE_REALPART' and `TREE_IMAGPART' return the real and the
imaginary parts respectively.
`VECTOR_CST'
These nodes are used to represent vector constants, whose parts are
constant nodes. Each individual constant node is either an
integer or a double constant node. The first operand is a
`TREE_LIST' of the constant nodes and is accessed through
`TREE_VECTOR_CST_ELTS'.
`STRING_CST'
These nodes represent string-constants. The `TREE_STRING_LENGTH'
returns the length of the string, as an `int'. The
`TREE_STRING_POINTER' is a `char*' containing the string itself.
The string may not be `NUL'-terminated, and it may contain
embedded `NUL' characters. Therefore, the `TREE_STRING_LENGTH'
includes the trailing `NUL' if it is present.
For wide string constants, the `TREE_STRING_LENGTH' is the number
of bytes in the string, and the `TREE_STRING_POINTER' points to an
array of the bytes of the string, as represented on the target
system (that is, as integers in the target endianness). Wide and
non-wide string constants are distinguished only by the `TREE_TYPE'
of the `STRING_CST'.
FIXME: The formats of string constants are not well-defined when
the target system bytes are not the same width as host system
bytes.
File: gccint.info, Node: Storage References, Next: Unary and Binary Expressions, Prev: Constant expressions, Up: Expression trees
11.6.2 References to storage
----------------------------
`ARRAY_REF'
These nodes represent array accesses. The first operand is the
array; the second is the index. To calculate the address of the
memory accessed, you must scale the index by the size of the type
of the array elements. The type of these expressions must be the
type of a component of the array. The third and fourth operands
are used after gimplification to represent the lower bound and
component size but should not be used directly; call
`array_ref_low_bound' and `array_ref_element_size' instead.
`ARRAY_RANGE_REF'
These nodes represent access to a range (or "slice") of an array.
The operands are the same as that for `ARRAY_REF' and have the same
meanings. The type of these expressions must be an array whose
component type is the same as that of the first operand. The
range of that array type determines the amount of data these
expressions access.
`TARGET_MEM_REF'
These nodes represent memory accesses whose address directly map to
an addressing mode of the target architecture. The first argument
is `TMR_SYMBOL' and must be a `VAR_DECL' of an object with a fixed
address. The second argument is `TMR_BASE' and the third one is
`TMR_INDEX'. The fourth argument is `TMR_STEP' and must be an
`INTEGER_CST'. The fifth argument is `TMR_OFFSET' and must be an
`INTEGER_CST'. Any of the arguments may be NULL if the
appropriate component does not appear in the address. Address of
the `TARGET_MEM_REF' is determined in the following way.
&TMR_SYMBOL + TMR_BASE + TMR_INDEX * TMR_STEP + TMR_OFFSET
The sixth argument is the reference to the original memory access,
which is preserved for the purposes of the RTL alias analysis.
The seventh argument is a tag representing the results of tree
level alias analysis.
`ADDR_EXPR'
These nodes are used to represent the address of an object. (These
expressions will always have pointer or reference type.) The
operand may be another expression, or it may be a declaration.
As an extension, GCC allows users to take the address of a label.
In this case, the operand of the `ADDR_EXPR' will be a
`LABEL_DECL'. The type of such an expression is `void*'.
If the object addressed is not an lvalue, a temporary is created,
and the address of the temporary is used.
`INDIRECT_REF'
These nodes are used to represent the object pointed to by a
pointer. The operand is the pointer being dereferenced; it will
always have pointer or reference type.
`MEM_REF'
These nodes are used to represent the object pointed to by a
pointer offset by a constant. The first operand is the pointer
being dereferenced; it will always have pointer or reference type.
The second operand is a pointer constant. Its type is specifying
the type to be used for type-based alias analysis.
`COMPONENT_REF'
These nodes represent non-static data member accesses. The first
operand is the object (rather than a pointer to it); the second
operand is the `FIELD_DECL' for the data member. The third
operand represents the byte offset of the field, but should not be
used directly; call `component_ref_field_offset' instead.
File: gccint.info, Node: Unary and Binary Expressions, Next: Vectors, Prev: Storage References, Up: Expression trees
11.6.3 Unary and Binary Expressions
-----------------------------------
`NEGATE_EXPR'
These nodes represent unary negation of the single operand, for
both integer and floating-point types. The type of negation can be
determined by looking at the type of the expression.
The behavior of this operation on signed arithmetic overflow is
controlled by the `flag_wrapv' and `flag_trapv' variables.
`ABS_EXPR'
These nodes represent the absolute value of the single operand, for
both integer and floating-point types. This is typically used to
implement the `abs', `labs' and `llabs' builtins for integer
types, and the `fabs', `fabsf' and `fabsl' builtins for floating
point types. The type of abs operation can be determined by
looking at the type of the expression.
This node is not used for complex types. To represent the modulus
or complex abs of a complex value, use the `BUILT_IN_CABS',
`BUILT_IN_CABSF' or `BUILT_IN_CABSL' builtins, as used to
implement the C99 `cabs', `cabsf' and `cabsl' built-in functions.
`BIT_NOT_EXPR'
These nodes represent bitwise complement, and will always have
integral type. The only operand is the value to be complemented.
`TRUTH_NOT_EXPR'
These nodes represent logical negation, and will always have
integral (or boolean) type. The operand is the value being
negated. The type of the operand and that of the result are
always of `BOOLEAN_TYPE' or `INTEGER_TYPE'.
`PREDECREMENT_EXPR'
`PREINCREMENT_EXPR'
`POSTDECREMENT_EXPR'
`POSTINCREMENT_EXPR'
These nodes represent increment and decrement expressions. The
value of the single operand is computed, and the operand
incremented or decremented. In the case of `PREDECREMENT_EXPR' and
`PREINCREMENT_EXPR', the value of the expression is the value
resulting after the increment or decrement; in the case of
`POSTDECREMENT_EXPR' and `POSTINCREMENT_EXPR' is the value before
the increment or decrement occurs. The type of the operand, like
that of the result, will be either integral, boolean, or
floating-point.
`FIX_TRUNC_EXPR'
These nodes represent conversion of a floating-point value to an
integer. The single operand will have a floating-point type, while
the complete expression will have an integral (or boolean) type.
The operand is rounded towards zero.
`FLOAT_EXPR'
These nodes represent conversion of an integral (or boolean) value
to a floating-point value. The single operand will have integral
type, while the complete expression will have a floating-point
type.
FIXME: How is the operand supposed to be rounded? Is this
dependent on `-mieee'?
`COMPLEX_EXPR'
These nodes are used to represent complex numbers constructed from
two expressions of the same (integer or real) type. The first
operand is the real part and the second operand is the imaginary
part.
`CONJ_EXPR'
These nodes represent the conjugate of their operand.
`REALPART_EXPR'
`IMAGPART_EXPR'
These nodes represent respectively the real and the imaginary parts
of complex numbers (their sole argument).
`NON_LVALUE_EXPR'
These nodes indicate that their one and only operand is not an
lvalue. A back end can treat these identically to the single
operand.
`NOP_EXPR'
These nodes are used to represent conversions that do not require
any code-generation. For example, conversion of a `char*' to an
`int*' does not require any code be generated; such a conversion is
represented by a `NOP_EXPR'. The single operand is the expression
to be converted. The conversion from a pointer to a reference is
also represented with a `NOP_EXPR'.
`CONVERT_EXPR'
These nodes are similar to `NOP_EXPR's, but are used in those
situations where code may need to be generated. For example, if an
`int*' is converted to an `int' code may need to be generated on
some platforms. These nodes are never used for C++-specific
conversions, like conversions between pointers to different
classes in an inheritance hierarchy. Any adjustments that need to
be made in such cases are always indicated explicitly. Similarly,
a user-defined conversion is never represented by a
`CONVERT_EXPR'; instead, the function calls are made explicit.
`FIXED_CONVERT_EXPR'
These nodes are used to represent conversions that involve
fixed-point values. For example, from a fixed-point value to
another fixed-point value, from an integer to a fixed-point value,
from a fixed-point value to an integer, from a floating-point
value to a fixed-point value, or from a fixed-point value to a
floating-point value.
`LSHIFT_EXPR'
`RSHIFT_EXPR'
These nodes represent left and right shifts, respectively. The
first operand is the value to shift; it will always be of integral
type. The second operand is an expression for the number of bits
by which to shift. Right shift should be treated as arithmetic,
i.e., the high-order bits should be zero-filled when the
expression has unsigned type and filled with the sign bit when the
expression has signed type. Note that the result is undefined if
the second operand is larger than or equal to the first operand's
type size.
`BIT_IOR_EXPR'
`BIT_XOR_EXPR'
`BIT_AND_EXPR'
These nodes represent bitwise inclusive or, bitwise exclusive or,
and bitwise and, respectively. Both operands will always have
integral type.
`TRUTH_ANDIF_EXPR'
`TRUTH_ORIF_EXPR'
These nodes represent logical "and" and logical "or", respectively.
These operators are not strict; i.e., the second operand is
evaluated only if the value of the expression is not determined by
evaluation of the first operand. The type of the operands and
that of the result are always of `BOOLEAN_TYPE' or `INTEGER_TYPE'.
`TRUTH_AND_EXPR'
`TRUTH_OR_EXPR'
`TRUTH_XOR_EXPR'
These nodes represent logical and, logical or, and logical
exclusive or. They are strict; both arguments are always
evaluated. There are no corresponding operators in C or C++, but
the front end will sometimes generate these expressions anyhow, if
it can tell that strictness does not matter. The type of the
operands and that of the result are always of `BOOLEAN_TYPE' or
`INTEGER_TYPE'.
`POINTER_PLUS_EXPR'
This node represents pointer arithmetic. The first operand is
always a pointer/reference type. The second operand is always an
unsigned integer type compatible with sizetype. This is the only
binary arithmetic operand that can operate on pointer types.
`PLUS_EXPR'
`MINUS_EXPR'
`MULT_EXPR'
These nodes represent various binary arithmetic operations.
Respectively, these operations are addition, subtraction (of the
second operand from the first) and multiplication. Their operands
may have either integral or floating type, but there will never be
case in which one operand is of floating type and the other is of
integral type.
The behavior of these operations on signed arithmetic overflow is
controlled by the `flag_wrapv' and `flag_trapv' variables.
`RDIV_EXPR'
This node represents a floating point division operation.
`TRUNC_DIV_EXPR'
`FLOOR_DIV_EXPR'
`CEIL_DIV_EXPR'
`ROUND_DIV_EXPR'
These nodes represent integer division operations that return an
integer result. `TRUNC_DIV_EXPR' rounds towards zero,
`FLOOR_DIV_EXPR' rounds towards negative infinity, `CEIL_DIV_EXPR'
rounds towards positive infinity and `ROUND_DIV_EXPR' rounds to
the closest integer. Integer division in C and C++ is truncating,
i.e. `TRUNC_DIV_EXPR'.
The behavior of these operations on signed arithmetic overflow,
when dividing the minimum signed integer by minus one, is
controlled by the `flag_wrapv' and `flag_trapv' variables.
`TRUNC_MOD_EXPR'
`FLOOR_MOD_EXPR'
`CEIL_MOD_EXPR'
`ROUND_MOD_EXPR'
These nodes represent the integer remainder or modulus operation.
The integer modulus of two operands `a' and `b' is defined as `a -
(a/b)*b' where the division calculated using the corresponding
division operator. Hence for `TRUNC_MOD_EXPR' this definition
assumes division using truncation towards zero, i.e.
`TRUNC_DIV_EXPR'. Integer remainder in C and C++ uses truncating
division, i.e. `TRUNC_MOD_EXPR'.
`EXACT_DIV_EXPR'
The `EXACT_DIV_EXPR' code is used to represent integer divisions
where the numerator is known to be an exact multiple of the
denominator. This allows the backend to choose between the faster
of `TRUNC_DIV_EXPR', `CEIL_DIV_EXPR' and `FLOOR_DIV_EXPR' for the
current target.
`LT_EXPR'
`LE_EXPR'
`GT_EXPR'
`GE_EXPR'
`EQ_EXPR'
`NE_EXPR'
These nodes represent the less than, less than or equal to, greater
than, greater than or equal to, equal, and not equal comparison
operators. The first and second operand with either be both of
integral type or both of floating type. The result type of these
expressions will always be of integral or boolean type. These
operations return the result type's zero value for false, and the
result type's one value for true.
For floating point comparisons, if we honor IEEE NaNs and either
operand is NaN, then `NE_EXPR' always returns true and the
remaining operators always return false. On some targets,
comparisons against an IEEE NaN, other than equality and
inequality, may generate a floating point exception.
`ORDERED_EXPR'
`UNORDERED_EXPR'
These nodes represent non-trapping ordered and unordered comparison
operators. These operations take two floating point operands and
determine whether they are ordered or unordered relative to each
other. If either operand is an IEEE NaN, their comparison is
defined to be unordered, otherwise the comparison is defined to be
ordered. The result type of these expressions will always be of
integral or boolean type. These operations return the result
type's zero value for false, and the result type's one value for
true.
`UNLT_EXPR'
`UNLE_EXPR'
`UNGT_EXPR'
`UNGE_EXPR'
`UNEQ_EXPR'
`LTGT_EXPR'
These nodes represent the unordered comparison operators. These
operations take two floating point operands and determine whether
the operands are unordered or are less than, less than or equal to,
greater than, greater than or equal to, or equal respectively. For
example, `UNLT_EXPR' returns true if either operand is an IEEE NaN
or the first operand is less than the second. With the possible
exception of `LTGT_EXPR', all of these operations are guaranteed
not to generate a floating point exception. The result type of
these expressions will always be of integral or boolean type.
These operations return the result type's zero value for false,
and the result type's one value for true.
`MODIFY_EXPR'
These nodes represent assignment. The left-hand side is the first
operand; the right-hand side is the second operand. The left-hand
side will be a `VAR_DECL', `INDIRECT_REF', `COMPONENT_REF', or
other lvalue.
These nodes are used to represent not only assignment with `=' but
also compound assignments (like `+='), by reduction to `='
assignment. In other words, the representation for `i += 3' looks
just like that for `i = i + 3'.
`INIT_EXPR'
These nodes are just like `MODIFY_EXPR', but are used only when a
variable is initialized, rather than assigned to subsequently.
This means that we can assume that the target of the
initialization is not used in computing its own value; any
reference to the lhs in computing the rhs is undefined.
`COMPOUND_EXPR'
These nodes represent comma-expressions. The first operand is an
expression whose value is computed and thrown away prior to the
evaluation of the second operand. The value of the entire
expression is the value of the second operand.
`COND_EXPR'
These nodes represent `?:' expressions. The first operand is of
boolean or integral type. If it evaluates to a nonzero value, the
second operand should be evaluated, and returned as the value of
the expression. Otherwise, the third operand is evaluated, and
returned as the value of the expression.
The second operand must have the same type as the entire
expression, unless it unconditionally throws an exception or calls
a noreturn function, in which case it should have void type. The
same constraints apply to the third operand. This allows array
bounds checks to be represented conveniently as `(i >= 0 && i <
10) ? i : abort()'.
As a GNU extension, the C language front-ends allow the second
operand of the `?:' operator may be omitted in the source. For
example, `x ? : 3' is equivalent to `x ? x : 3', assuming that `x'
is an expression without side-effects. In the tree
representation, however, the second operand is always present,
possibly protected by `SAVE_EXPR' if the first argument does cause
side-effects.
`CALL_EXPR'
These nodes are used to represent calls to functions, including
non-static member functions. `CALL_EXPR's are implemented as
expression nodes with a variable number of operands. Rather than
using `TREE_OPERAND' to extract them, it is preferable to use the
specialized accessor macros and functions that operate
specifically on `CALL_EXPR' nodes.
`CALL_EXPR_FN' returns a pointer to the function to call; it is
always an expression whose type is a `POINTER_TYPE'.
The number of arguments to the call is returned by
`call_expr_nargs', while the arguments themselves can be accessed
with the `CALL_EXPR_ARG' macro. The arguments are zero-indexed
and numbered left-to-right. You can iterate over the arguments
using `FOR_EACH_CALL_EXPR_ARG', as in:
tree call, arg;
call_expr_arg_iterator iter;
FOR_EACH_CALL_EXPR_ARG (arg, iter, call)
/* arg is bound to successive arguments of call. */
...;
For non-static member functions, there will be an operand
corresponding to the `this' pointer. There will always be
expressions corresponding to all of the arguments, even if the
function is declared with default arguments and some arguments are
not explicitly provided at the call sites.
`CALL_EXPR's also have a `CALL_EXPR_STATIC_CHAIN' operand that is
used to implement nested functions. This operand is otherwise
null.
`CLEANUP_POINT_EXPR'
These nodes represent full-expressions. The single operand is an
expression to evaluate. Any destructor calls engendered by the
creation of temporaries during the evaluation of that expression
should be performed immediately after the expression is evaluated.
`CONSTRUCTOR'
These nodes represent the brace-enclosed initializers for a
structure or array. The first operand is reserved for use by the
back end. The second operand is a `TREE_LIST'. If the
`TREE_TYPE' of the `CONSTRUCTOR' is a `RECORD_TYPE' or
`UNION_TYPE', then the `TREE_PURPOSE' of each node in the
`TREE_LIST' will be a `FIELD_DECL' and the `TREE_VALUE' of each
node will be the expression used to initialize that field.
If the `TREE_TYPE' of the `CONSTRUCTOR' is an `ARRAY_TYPE', then
the `TREE_PURPOSE' of each element in the `TREE_LIST' will be an
`INTEGER_CST' or a `RANGE_EXPR' of two `INTEGER_CST's. A single
`INTEGER_CST' indicates which element of the array (indexed from
zero) is being assigned to. A `RANGE_EXPR' indicates an inclusive
range of elements to initialize. In both cases the `TREE_VALUE'
is the corresponding initializer. It is re-evaluated for each
element of a `RANGE_EXPR'. If the `TREE_PURPOSE' is `NULL_TREE',
then the initializer is for the next available array element.
In the front end, you should not depend on the fields appearing in
any particular order. However, in the middle end, fields must
appear in declaration order. You should not assume that all
fields will be represented. Unrepresented fields will be set to
zero.
`COMPOUND_LITERAL_EXPR'
These nodes represent ISO C99 compound literals. The
`COMPOUND_LITERAL_EXPR_DECL_EXPR' is a `DECL_EXPR' containing an
anonymous `VAR_DECL' for the unnamed object represented by the
compound literal; the `DECL_INITIAL' of that `VAR_DECL' is a
`CONSTRUCTOR' representing the brace-enclosed list of initializers
in the compound literal. That anonymous `VAR_DECL' can also be
accessed directly by the `COMPOUND_LITERAL_EXPR_DECL' macro.
`SAVE_EXPR'
A `SAVE_EXPR' represents an expression (possibly involving
side-effects) that is used more than once. The side-effects should
occur only the first time the expression is evaluated. Subsequent
uses should just reuse the computed value. The first operand to
the `SAVE_EXPR' is the expression to evaluate. The side-effects
should be executed where the `SAVE_EXPR' is first encountered in a
depth-first preorder traversal of the expression tree.
`TARGET_EXPR'
A `TARGET_EXPR' represents a temporary object. The first operand
is a `VAR_DECL' for the temporary variable. The second operand is
the initializer for the temporary. The initializer is evaluated
and, if non-void, copied (bitwise) into the temporary. If the
initializer is void, that means that it will perform the
initialization itself.
Often, a `TARGET_EXPR' occurs on the right-hand side of an
assignment, or as the second operand to a comma-expression which is
itself the right-hand side of an assignment, etc. In this case,
we say that the `TARGET_EXPR' is "normal"; otherwise, we say it is
"orphaned". For a normal `TARGET_EXPR' the temporary variable
should be treated as an alias for the left-hand side of the
assignment, rather than as a new temporary variable.
The third operand to the `TARGET_EXPR', if present, is a
cleanup-expression (i.e., destructor call) for the temporary. If
this expression is orphaned, then this expression must be executed
when the statement containing this expression is complete. These
cleanups must always be executed in the order opposite to that in
which they were encountered. Note that if a temporary is created
on one branch of a conditional operator (i.e., in the second or
third operand to a `COND_EXPR'), the cleanup must be run only if
that branch is actually executed.
`VA_ARG_EXPR'
This node is used to implement support for the C/C++ variable
argument-list mechanism. It represents expressions like `va_arg
(ap, type)'. Its `TREE_TYPE' yields the tree representation for
`type' and its sole argument yields the representation for `ap'.
File: gccint.info, Node: Vectors, Prev: Unary and Binary Expressions, Up: Expression trees
11.6.4 Vectors
--------------
`VEC_LSHIFT_EXPR'
`VEC_RSHIFT_EXPR'
These nodes represent whole vector left and right shifts,
respectively. The first operand is the vector to shift; it will
always be of vector type. The second operand is an expression for
the number of bits by which to shift. Note that the result is
undefined if the second operand is larger than or equal to the
first operand's type size.
`VEC_WIDEN_MULT_HI_EXPR'
`VEC_WIDEN_MULT_LO_EXPR'
These nodes represent widening vector multiplication of the high
and low parts of the two input vectors, respectively. Their
operands are vectors that contain the same number of elements
(`N') of the same integral type. The result is a vector that
contains half as many elements, of an integral type whose size is
twice as wide. In the case of `VEC_WIDEN_MULT_HI_EXPR' the high
`N/2' elements of the two vector are multiplied to produce the
vector of `N/2' products. In the case of `VEC_WIDEN_MULT_LO_EXPR'
the low `N/2' elements of the two vector are multiplied to produce
the vector of `N/2' products.
`VEC_UNPACK_HI_EXPR'
`VEC_UNPACK_LO_EXPR'
These nodes represent unpacking of the high and low parts of the
input vector, respectively. The single operand is a vector that
contains `N' elements of the same integral or floating point type.
The result is a vector that contains half as many elements, of an
integral or floating point type whose size is twice as wide. In
the case of `VEC_UNPACK_HI_EXPR' the high `N/2' elements of the
vector are extracted and widened (promoted). In the case of
`VEC_UNPACK_LO_EXPR' the low `N/2' elements of the vector are
extracted and widened (promoted).
`VEC_UNPACK_FLOAT_HI_EXPR'
`VEC_UNPACK_FLOAT_LO_EXPR'
These nodes represent unpacking of the high and low parts of the
input vector, where the values are converted from fixed point to
floating point. The single operand is a vector that contains `N'
elements of the same integral type. The result is a vector that
contains half as many elements of a floating point type whose size
is twice as wide. In the case of `VEC_UNPACK_HI_EXPR' the high
`N/2' elements of the vector are extracted, converted and widened.
In the case of `VEC_UNPACK_LO_EXPR' the low `N/2' elements of the
vector are extracted, converted and widened.
`VEC_PACK_TRUNC_EXPR'
This node represents packing of truncated elements of the two
input vectors into the output vector. Input operands are vectors
that contain the same number of elements of the same integral or
floating point type. The result is a vector that contains twice
as many elements of an integral or floating point type whose size
is half as wide. The elements of the two vectors are demoted and
merged (concatenated) to form the output vector.
`VEC_PACK_SAT_EXPR'
This node represents packing of elements of the two input vectors
into the output vector using saturation. Input operands are
vectors that contain the same number of elements of the same
integral type. The result is a vector that contains twice as many
elements of an integral type whose size is half as wide. The
elements of the two vectors are demoted and merged (concatenated)
to form the output vector.
`VEC_PACK_FIX_TRUNC_EXPR'
This node represents packing of elements of the two input vectors
into the output vector, where the values are converted from
floating point to fixed point. Input operands are vectors that
contain the same number of elements of a floating point type. The
result is a vector that contains twice as many elements of an
integral type whose size is half as wide. The elements of the two
vectors are merged (concatenated) to form the output vector.
`VEC_EXTRACT_EVEN_EXPR'
`VEC_EXTRACT_ODD_EXPR'
These nodes represent extracting of the even/odd elements of the
two input vectors, respectively. Their operands and result are
vectors that contain the same number of elements of the same type.
`VEC_INTERLEAVE_HIGH_EXPR'
`VEC_INTERLEAVE_LOW_EXPR'
These nodes represent merging and interleaving of the high/low
elements of the two input vectors, respectively. The operands and
the result are vectors that contain the same number of elements
(`N') of the same type. In the case of
`VEC_INTERLEAVE_HIGH_EXPR', the high `N/2' elements of the first
input vector are interleaved with the high `N/2' elements of the
second input vector. In the case of `VEC_INTERLEAVE_LOW_EXPR', the
low `N/2' elements of the first input vector are interleaved with
the low `N/2' elements of the second input vector.
File: gccint.info, Node: Statements, Next: Functions, Prev: Expression trees, Up: GENERIC
11.7 Statements
===============
Most statements in GIMPLE are assignment statements, represented by
`GIMPLE_ASSIGN'. No other C expressions can appear at statement level;
a reference to a volatile object is converted into a `GIMPLE_ASSIGN'.
There are also several varieties of complex statements.
* Menu:
* Basic Statements::
* Blocks::
* Statement Sequences::
* Empty Statements::
* Jumps::
* Cleanups::
* OpenMP::
File: gccint.info, Node: Basic Statements, Next: Blocks, Up: Statements
11.7.1 Basic Statements
-----------------------
`ASM_EXPR'
Used to represent an inline assembly statement. For an inline
assembly statement like:
asm ("mov x, y");
The `ASM_STRING' macro will return a `STRING_CST' node for `"mov
x, y"'. If the original statement made use of the
extended-assembly syntax, then `ASM_OUTPUTS', `ASM_INPUTS', and
`ASM_CLOBBERS' will be the outputs, inputs, and clobbers for the
statement, represented as `STRING_CST' nodes. The
extended-assembly syntax looks like:
asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
The first string is the `ASM_STRING', containing the instruction
template. The next two strings are the output and inputs,
respectively; this statement has no clobbers. As this example
indicates, "plain" assembly statements are merely a special case
of extended assembly statements; they have no cv-qualifiers,
outputs, inputs, or clobbers. All of the strings will be
`NUL'-terminated, and will contain no embedded `NUL'-characters.
If the assembly statement is declared `volatile', or if the
statement was not an extended assembly statement, and is therefore
implicitly volatile, then the predicate `ASM_VOLATILE_P' will hold
of the `ASM_EXPR'.
`DECL_EXPR'
Used to represent a local declaration. The `DECL_EXPR_DECL' macro
can be used to obtain the entity declared. This declaration may
be a `LABEL_DECL', indicating that the label declared is a local
label. (As an extension, GCC allows the declaration of labels
with scope.) In C, this declaration may be a `FUNCTION_DECL',
indicating the use of the GCC nested function extension. For more
information, *note Functions::.
`LABEL_EXPR'
Used to represent a label. The `LABEL_DECL' declared by this
statement can be obtained with the `LABEL_EXPR_LABEL' macro. The
`IDENTIFIER_NODE' giving the name of the label can be obtained from
the `LABEL_DECL' with `DECL_NAME'.
`GOTO_EXPR'
Used to represent a `goto' statement. The `GOTO_DESTINATION' will
usually be a `LABEL_DECL'. However, if the "computed goto"
extension has been used, the `GOTO_DESTINATION' will be an
arbitrary expression indicating the destination. This expression
will always have pointer type.
`RETURN_EXPR'
Used to represent a `return' statement. Operand 0 represents the
value to return. It should either be the `RESULT_DECL' for the
containing function, or a `MODIFY_EXPR' or `INIT_EXPR' setting the
function's `RESULT_DECL'. It will be `NULL_TREE' if the statement
was just
return;
`LOOP_EXPR'
These nodes represent "infinite" loops. The `LOOP_EXPR_BODY'
represents the body of the loop. It should be executed forever,
unless an `EXIT_EXPR' is encountered.
`EXIT_EXPR'
These nodes represent conditional exits from the nearest enclosing
`LOOP_EXPR'. The single operand is the condition; if it is
nonzero, then the loop should be exited. An `EXIT_EXPR' will only
appear within a `LOOP_EXPR'.
`SWITCH_STMT'
Used to represent a `switch' statement. The `SWITCH_STMT_COND' is
the expression on which the switch is occurring. See the
documentation for an `IF_STMT' for more information on the
representation used for the condition. The `SWITCH_STMT_BODY' is
the body of the switch statement. The `SWITCH_STMT_TYPE' is the
original type of switch expression as given in the source, before
any compiler conversions.
`CASE_LABEL_EXPR'
Use to represent a `case' label, range of `case' labels, or a
`default' label. If `CASE_LOW' is `NULL_TREE', then this is a
`default' label. Otherwise, if `CASE_HIGH' is `NULL_TREE', then
this is an ordinary `case' label. In this case, `CASE_LOW' is an
expression giving the value of the label. Both `CASE_LOW' and
`CASE_HIGH' are `INTEGER_CST' nodes. These values will have the
same type as the condition expression in the switch statement.
Otherwise, if both `CASE_LOW' and `CASE_HIGH' are defined, the
statement is a range of case labels. Such statements originate
with the extension that allows users to write things of the form:
case 2 ... 5:
The first value will be `CASE_LOW', while the second will be
`CASE_HIGH'.
File: gccint.info, Node: Blocks, Next: Statement Sequences, Prev: Basic Statements, Up: Statements
11.7.2 Blocks
-------------
Block scopes and the variables they declare in GENERIC are expressed
using the `BIND_EXPR' code, which in previous versions of GCC was
primarily used for the C statement-expression extension.
Variables in a block are collected into `BIND_EXPR_VARS' in
declaration order through their `TREE_CHAIN' field. Any runtime
initialization is moved out of `DECL_INITIAL' and into a statement in
the controlled block. When gimplifying from C or C++, this
initialization replaces the `DECL_STMT'. These variables will never
require cleanups. The scope of these variables is just the body
Variable-length arrays (VLAs) complicate this process, as their size
often refers to variables initialized earlier in the block. To handle
this, we currently split the block at that point, and move the VLA into
a new, inner `BIND_EXPR'. This strategy may change in the future.
A C++ program will usually contain more `BIND_EXPR's than there are
syntactic blocks in the source code, since several C++ constructs have
implicit scopes associated with them. On the other hand, although the
C++ front end uses pseudo-scopes to handle cleanups for objects with
destructors, these don't translate into the GIMPLE form; multiple
declarations at the same level use the same `BIND_EXPR'.
File: gccint.info, Node: Statement Sequences, Next: Empty Statements, Prev: Blocks, Up: Statements
11.7.3 Statement Sequences
--------------------------
Multiple statements at the same nesting level are collected into a
`STATEMENT_LIST'. Statement lists are modified and traversed using the
interface in `tree-iterator.h'.
File: gccint.info, Node: Empty Statements, Next: Jumps, Prev: Statement Sequences, Up: Statements
11.7.4 Empty Statements
-----------------------
Whenever possible, statements with no effect are discarded. But if
they are nested within another construct which cannot be discarded for
some reason, they are instead replaced with an empty statement,
generated by `build_empty_stmt'. Initially, all empty statements were
shared, after the pattern of the Java front end, but this caused a lot
of trouble in practice.
An empty statement is represented as `(void)0'.
File: gccint.info, Node: Jumps, Next: Cleanups, Prev: Empty Statements, Up: Statements
11.7.5 Jumps
------------
Other jumps are expressed by either `GOTO_EXPR' or `RETURN_EXPR'.
The operand of a `GOTO_EXPR' must be either a label or a variable
containing the address to jump to.
The operand of a `RETURN_EXPR' is either `NULL_TREE', `RESULT_DECL',
or a `MODIFY_EXPR' which sets the return value. It would be nice to
move the `MODIFY_EXPR' into a separate statement, but the special
return semantics in `expand_return' make that difficult. It may still
happen in the future, perhaps by moving most of that logic into
`expand_assignment'.
File: gccint.info, Node: Cleanups, Next: OpenMP, Prev: Jumps, Up: Statements
11.7.6 Cleanups
---------------
Destructors for local C++ objects and similar dynamic cleanups are
represented in GIMPLE by a `TRY_FINALLY_EXPR'. `TRY_FINALLY_EXPR' has
two operands, both of which are a sequence of statements to execute.
The first sequence is executed. When it completes the second sequence
is executed.
The first sequence may complete in the following ways:
1. Execute the last statement in the sequence and fall off the end.
2. Execute a goto statement (`GOTO_EXPR') to an ordinary label
outside the sequence.
3. Execute a return statement (`RETURN_EXPR').
4. Throw an exception. This is currently not explicitly represented
in GIMPLE.
The second sequence is not executed if the first sequence completes by
calling `setjmp' or `exit' or any other function that does not return.
The second sequence is also not executed if the first sequence
completes via a non-local goto or a computed goto (in general the
compiler does not know whether such a goto statement exits the first
sequence or not, so we assume that it doesn't).
After the second sequence is executed, if it completes normally by
falling off the end, execution continues wherever the first sequence
would have continued, by falling off the end, or doing a goto, etc.
`TRY_FINALLY_EXPR' complicates the flow graph, since the cleanup needs
to appear on every edge out of the controlled block; this reduces the
freedom to move code across these edges. Therefore, the EH lowering
pass which runs before most of the optimization passes eliminates these
expressions by explicitly adding the cleanup to each edge. Rethrowing
the exception is represented using `RESX_EXPR'.
File: gccint.info, Node: OpenMP, Prev: Cleanups, Up: Statements
11.7.7 OpenMP
-------------
All the statements starting with `OMP_' represent directives and
clauses used by the OpenMP API `http://www.openmp.org/'.
`OMP_PARALLEL'
Represents `#pragma omp parallel [clause1 ... clauseN]'. It has
four operands:
Operand `OMP_PARALLEL_BODY' is valid while in GENERIC and High
GIMPLE forms. It contains the body of code to be executed by all
the threads. During GIMPLE lowering, this operand becomes `NULL'
and the body is emitted linearly after `OMP_PARALLEL'.
Operand `OMP_PARALLEL_CLAUSES' is the list of clauses associated
with the directive.
Operand `OMP_PARALLEL_FN' is created by `pass_lower_omp', it
contains the `FUNCTION_DECL' for the function that will contain
the body of the parallel region.
Operand `OMP_PARALLEL_DATA_ARG' is also created by
`pass_lower_omp'. If there are shared variables to be communicated
to the children threads, this operand will contain the `VAR_DECL'
that contains all the shared values and variables.
`OMP_FOR'
Represents `#pragma omp for [clause1 ... clauseN]'. It has 5
operands:
Operand `OMP_FOR_BODY' contains the loop body.
Operand `OMP_FOR_CLAUSES' is the list of clauses associated with
the directive.
Operand `OMP_FOR_INIT' is the loop initialization code of the form
`VAR = N1'.
Operand `OMP_FOR_COND' is the loop conditional expression of the
form `VAR {<,>,<=,>=} N2'.
Operand `OMP_FOR_INCR' is the loop index increment of the form
`VAR {+=,-=} INCR'.
Operand `OMP_FOR_PRE_BODY' contains side-effect code from operands
`OMP_FOR_INIT', `OMP_FOR_COND' and `OMP_FOR_INC'. These
side-effects are part of the `OMP_FOR' block but must be evaluated
before the start of loop body.
The loop index variable `VAR' must be a signed integer variable,
which is implicitly private to each thread. Bounds `N1' and `N2'
and the increment expression `INCR' are required to be loop
invariant integer expressions that are evaluated without any
synchronization. The evaluation order, frequency of evaluation and
side-effects are unspecified by the standard.
`OMP_SECTIONS'
Represents `#pragma omp sections [clause1 ... clauseN]'.
Operand `OMP_SECTIONS_BODY' contains the sections body, which in
turn contains a set of `OMP_SECTION' nodes for each of the
concurrent sections delimited by `#pragma omp section'.
Operand `OMP_SECTIONS_CLAUSES' is the list of clauses associated
with the directive.
`OMP_SECTION'
Section delimiter for `OMP_SECTIONS'.
`OMP_SINGLE'
Represents `#pragma omp single'.
Operand `OMP_SINGLE_BODY' contains the body of code to be executed
by a single thread.
Operand `OMP_SINGLE_CLAUSES' is the list of clauses associated
with the directive.
`OMP_MASTER'
Represents `#pragma omp master'.
Operand `OMP_MASTER_BODY' contains the body of code to be executed
by the master thread.
`OMP_ORDERED'
Represents `#pragma omp ordered'.
Operand `OMP_ORDERED_BODY' contains the body of code to be
executed in the sequential order dictated by the loop index
variable.
`OMP_CRITICAL'
Represents `#pragma omp critical [name]'.
Operand `OMP_CRITICAL_BODY' is the critical section.
Operand `OMP_CRITICAL_NAME' is an optional identifier to label the
critical section.
`OMP_RETURN'
This does not represent any OpenMP directive, it is an artificial
marker to indicate the end of the body of an OpenMP. It is used by
the flow graph (`tree-cfg.c') and OpenMP region building code
(`omp-low.c').
`OMP_CONTINUE'
Similarly, this instruction does not represent an OpenMP
directive, it is used by `OMP_FOR' and `OMP_SECTIONS' to mark the
place where the code needs to loop to the next iteration (in the
case of `OMP_FOR') or the next section (in the case of
`OMP_SECTIONS').
In some cases, `OMP_CONTINUE' is placed right before `OMP_RETURN'.
But if there are cleanups that need to occur right after the
looping body, it will be emitted between `OMP_CONTINUE' and
`OMP_RETURN'.
`OMP_ATOMIC'
Represents `#pragma omp atomic'.
Operand 0 is the address at which the atomic operation is to be
performed.
Operand 1 is the expression to evaluate. The gimplifier tries
three alternative code generation strategies. Whenever possible,
an atomic update built-in is used. If that fails, a
compare-and-swap loop is attempted. If that also fails, a regular
critical section around the expression is used.
`OMP_CLAUSE'
Represents clauses associated with one of the `OMP_' directives.
Clauses are represented by separate sub-codes defined in `tree.h'.
Clauses codes can be one of: `OMP_CLAUSE_PRIVATE',
`OMP_CLAUSE_SHARED', `OMP_CLAUSE_FIRSTPRIVATE',
`OMP_CLAUSE_LASTPRIVATE', `OMP_CLAUSE_COPYIN',
`OMP_CLAUSE_COPYPRIVATE', `OMP_CLAUSE_IF',
`OMP_CLAUSE_NUM_THREADS', `OMP_CLAUSE_SCHEDULE',
`OMP_CLAUSE_NOWAIT', `OMP_CLAUSE_ORDERED', `OMP_CLAUSE_DEFAULT',
and `OMP_CLAUSE_REDUCTION'. Each code represents the
corresponding OpenMP clause.
Clauses associated with the same directive are chained together
via `OMP_CLAUSE_CHAIN'. Those clauses that accept a list of
variables are restricted to exactly one, accessed with
`OMP_CLAUSE_VAR'. Therefore, multiple variables under the same
clause `C' need to be represented as multiple `C' clauses chained
together. This facilitates adding new clauses during compilation.
File: gccint.info, Node: Functions, Next: Language-dependent trees, Prev: Statements, Up: GENERIC
11.8 Functions
==============
A function is represented by a `FUNCTION_DECL' node. It stores the
basic pieces of the function such as body, parameters, and return type
as well as information on the surrounding context, visibility, and
linkage.
* Menu:
* Function Basics:: Function names, body, and parameters.
* Function Properties:: Context, linkage, etc.
File: gccint.info, Node: Function Basics, Next: Function Properties, Up: Functions
11.8.1 Function Basics
----------------------
A function has four core parts: the name, the parameters, the result,
and the body. The following macros and functions access these parts of
a `FUNCTION_DECL' as well as other basic features:
`DECL_NAME'
This macro returns the unqualified name of the function, as an
`IDENTIFIER_NODE'. For an instantiation of a function template,
the `DECL_NAME' is the unqualified name of the template, not
something like `f<int>'. The value of `DECL_NAME' is undefined
when used on a constructor, destructor, overloaded operator, or
type-conversion operator, or any function that is implicitly
generated by the compiler. See below for macros that can be used
to distinguish these cases.
`DECL_ASSEMBLER_NAME'
This macro returns the mangled name of the function, also an
`IDENTIFIER_NODE'. This name does not contain leading underscores
on systems that prefix all identifiers with underscores. The
mangled name is computed in the same way on all platforms; if
special processing is required to deal with the object file format
used on a particular platform, it is the responsibility of the
back end to perform those modifications. (Of course, the back end
should not modify `DECL_ASSEMBLER_NAME' itself.)
Using `DECL_ASSEMBLER_NAME' will cause additional memory to be
allocated (for the mangled name of the entity) so it should be used
only when emitting assembly code. It should not be used within the
optimizers to determine whether or not two declarations are the
same, even though some of the existing optimizers do use it in
that way. These uses will be removed over time.
`DECL_ARGUMENTS'
This macro returns the `PARM_DECL' for the first argument to the
function. Subsequent `PARM_DECL' nodes can be obtained by
following the `TREE_CHAIN' links.
`DECL_RESULT'
This macro returns the `RESULT_DECL' for the function.
`DECL_SAVED_TREE'
This macro returns the complete body of the function.
`TREE_TYPE'
This macro returns the `FUNCTION_TYPE' or `METHOD_TYPE' for the
function.
`DECL_INITIAL'
A function that has a definition in the current translation unit
will have a non-`NULL' `DECL_INITIAL'. However, back ends should
not make use of the particular value given by `DECL_INITIAL'.
It should contain a tree of `BLOCK' nodes that mirrors the scopes
that variables are bound in the function. Each block contains a
list of decls declared in a basic block, a pointer to a chain of
blocks at the next lower scope level, then a pointer to the next
block at the same level and a backpointer to the parent `BLOCK' or
`FUNCTION_DECL'. So given a function as follows:
void foo()
{
int a;
{
int b;
}
int c;
}
you would get the following:
tree foo = FUNCTION_DECL;
tree decl_a = VAR_DECL;
tree decl_b = VAR_DECL;
tree decl_c = VAR_DECL;
tree block_a = BLOCK;
tree block_b = BLOCK;
tree block_c = BLOCK;
BLOCK_VARS(block_a) = decl_a;
BLOCK_SUBBLOCKS(block_a) = block_b;
BLOCK_CHAIN(block_a) = block_c;
BLOCK_SUPERCONTEXT(block_a) = foo;
BLOCK_VARS(block_b) = decl_b;
BLOCK_SUPERCONTEXT(block_b) = block_a;
BLOCK_VARS(block_c) = decl_c;
BLOCK_SUPERCONTEXT(block_c) = foo;
DECL_INITIAL(foo) = block_a;
File: gccint.info, Node: Function Properties, Prev: Function Basics, Up: Functions
11.8.2 Function Properties
--------------------------
To determine the scope of a function, you can use the `DECL_CONTEXT'
macro. This macro will return the class (either a `RECORD_TYPE' or a
`UNION_TYPE') or namespace (a `NAMESPACE_DECL') of which the function
is a member. For a virtual function, this macro returns the class in
which the function was actually defined, not the base class in which
the virtual declaration occurred.
In C, the `DECL_CONTEXT' for a function maybe another function. This
representation indicates that the GNU nested function extension is in
use. For details on the semantics of nested functions, see the GCC
Manual. The nested function can refer to local variables in its
containing function. Such references are not explicitly marked in the
tree structure; back ends must look at the `DECL_CONTEXT' for the
referenced `VAR_DECL'. If the `DECL_CONTEXT' for the referenced
`VAR_DECL' is not the same as the function currently being processed,
and neither `DECL_EXTERNAL' nor `TREE_STATIC' hold, then the reference
is to a local variable in a containing function, and the back end must
take appropriate action.
`DECL_EXTERNAL'
This predicate holds if the function is undefined.
`TREE_PUBLIC'
This predicate holds if the function has external linkage.
`TREE_STATIC'
This predicate holds if the function has been defined.
`TREE_THIS_VOLATILE'
This predicate holds if the function does not return normally.
`TREE_READONLY'
This predicate holds if the function can only read its arguments.
`DECL_PURE_P'
This predicate holds if the function can only read its arguments,
but may also read global memory.
`DECL_VIRTUAL_P'
This predicate holds if the function is virtual.
`DECL_ARTIFICIAL'
This macro holds if the function was implicitly generated by the
compiler, rather than explicitly declared. In addition to
implicitly generated class member functions, this macro holds for
the special functions created to implement static initialization
and destruction, to compute run-time type information, and so
forth.
`DECL_FUNCTION_SPECIFIC_TARGET'
This macro returns a tree node that holds the target options that
are to be used to compile this particular function or `NULL_TREE'
if the function is to be compiled with the target options
specified on the command line.
`DECL_FUNCTION_SPECIFIC_OPTIMIZATION'
This macro returns a tree node that holds the optimization options
that are to be used to compile this particular function or
`NULL_TREE' if the function is to be compiled with the
optimization options specified on the command line.
File: gccint.info, Node: Language-dependent trees, Next: C and C++ Trees, Prev: Functions, Up: GENERIC
11.9 Language-dependent trees
=============================
Front ends may wish to keep some state associated with various GENERIC
trees while parsing. To support this, trees provide a set of flags
that may be used by the front end. They are accessed using
`TREE_LANG_FLAG_n' where `n' is currently 0 through 6.
If necessary, a front end can use some language-dependent tree codes
in its GENERIC representation, so long as it provides a hook for
converting them to GIMPLE and doesn't expect them to work with any
(hypothetical) optimizers that run before the conversion to GIMPLE. The
intermediate representation used while parsing C and C++ looks very
little like GENERIC, but the C and C++ gimplifier hooks are perfectly
happy to take it as input and spit out GIMPLE.
File: gccint.info, Node: C and C++ Trees, Next: Java Trees, Prev: Language-dependent trees, Up: GENERIC
11.10 C and C++ Trees
=====================
This section documents the internal representation used by GCC to
represent C and C++ source programs. When presented with a C or C++
source program, GCC parses the program, performs semantic analysis
(including the generation of error messages), and then produces the
internal representation described here. This representation contains a
complete representation for the entire translation unit provided as
input to the front end. This representation is then typically processed
by a code-generator in order to produce machine code, but could also be
used in the creation of source browsers, intelligent editors, automatic
documentation generators, interpreters, and any other programs needing
the ability to process C or C++ code.
This section explains the internal representation. In particular, it
documents the internal representation for C and C++ source constructs,
and the macros, functions, and variables that can be used to access
these constructs. The C++ representation is largely a superset of the
representation used in the C front end. There is only one construct
used in C that does not appear in the C++ front end and that is the GNU
"nested function" extension. Many of the macros documented here do not
apply in C because the corresponding language constructs do not appear
in C.
The C and C++ front ends generate a mix of GENERIC trees and ones
specific to C and C++. These language-specific trees are higher-level
constructs than the ones in GENERIC to make the parser's job easier.
This section describes those trees that aren't part of GENERIC as well
as aspects of GENERIC trees that are treated in a language-specific
manner.
If you are developing a "back end", be it is a code-generator or some
other tool, that uses this representation, you may occasionally find
that you need to ask questions not easily answered by the functions and
macros available here. If that situation occurs, it is quite likely
that GCC already supports the functionality you desire, but that the
interface is simply not documented here. In that case, you should ask
the GCC maintainers (via mail to <gcc@gcc.gnu.org>) about documenting
the functionality you require. Similarly, if you find yourself writing
functions that do not deal directly with your back end, but instead
might be useful to other people using the GCC front end, you should
submit your patches for inclusion in GCC.
* Menu:
* Types for C++:: Fundamental and aggregate types.
* Namespaces:: Namespaces.
* Classes:: Classes.
* Functions for C++:: Overloading and accessors for C++.
* Statements for C++:: Statements specific to C and C++.
* C++ Expressions:: From `typeid' to `throw'.
File: gccint.info, Node: Types for C++, Next: Namespaces, Up: C and C++ Trees
11.10.1 Types for C++
---------------------
In C++, an array type is not qualified; rather the type of the array
elements is qualified. This situation is reflected in the intermediate
representation. The macros described here will always examine the
qualification of the underlying element type when applied to an array
type. (If the element type is itself an array, then the recursion
continues until a non-array type is found, and the qualification of this
type is examined.) So, for example, `CP_TYPE_CONST_P' will hold of the
type `const int ()[7]', denoting an array of seven `int's.
The following functions and macros deal with cv-qualification of types:
`CP_TYPE_QUALS'
This macro returns the set of type qualifiers applied to this type.
This value is `TYPE_UNQUALIFIED' if no qualifiers have been
applied. The `TYPE_QUAL_CONST' bit is set if the type is
`const'-qualified. The `TYPE_QUAL_VOLATILE' bit is set if the
type is `volatile'-qualified. The `TYPE_QUAL_RESTRICT' bit is set
if the type is `restrict'-qualified.
`CP_TYPE_CONST_P'
This macro holds if the type is `const'-qualified.
`CP_TYPE_VOLATILE_P'
This macro holds if the type is `volatile'-qualified.
`CP_TYPE_RESTRICT_P'
This macro holds if the type is `restrict'-qualified.
`CP_TYPE_CONST_NON_VOLATILE_P'
This predicate holds for a type that is `const'-qualified, but
_not_ `volatile'-qualified; other cv-qualifiers are ignored as
well: only the `const'-ness is tested.
A few other macros and functions are usable with all types:
`TYPE_SIZE'
The number of bits required to represent the type, represented as
an `INTEGER_CST'. For an incomplete type, `TYPE_SIZE' will be
`NULL_TREE'.
`TYPE_ALIGN'
The alignment of the type, in bits, represented as an `int'.
`TYPE_NAME'
This macro returns a declaration (in the form of a `TYPE_DECL') for
the type. (Note this macro does _not_ return an
`IDENTIFIER_NODE', as you might expect, given its name!) You can
look at the `DECL_NAME' of the `TYPE_DECL' to obtain the actual
name of the type. The `TYPE_NAME' will be `NULL_TREE' for a type
that is not a built-in type, the result of a typedef, or a named
class type.
`CP_INTEGRAL_TYPE'
This predicate holds if the type is an integral type. Notice that
in C++, enumerations are _not_ integral types.
`ARITHMETIC_TYPE_P'
This predicate holds if the type is an integral type (in the C++
sense) or a floating point type.
`CLASS_TYPE_P'
This predicate holds for a class-type.
`TYPE_BUILT_IN'
This predicate holds for a built-in type.
`TYPE_PTRMEM_P'
This predicate holds if the type is a pointer to data member.
`TYPE_PTR_P'
This predicate holds if the type is a pointer type, and the
pointee is not a data member.
`TYPE_PTRFN_P'
This predicate holds for a pointer to function type.
`TYPE_PTROB_P'
This predicate holds for a pointer to object type. Note however
that it does not hold for the generic pointer to object type `void
*'. You may use `TYPE_PTROBV_P' to test for a pointer to object
type as well as `void *'.
The table below describes types specific to C and C++ as well as
language-dependent info about GENERIC types.
`POINTER_TYPE'
Used to represent pointer types, and pointer to data member types.
If `TREE_TYPE' is a pointer to data member type, then
`TYPE_PTRMEM_P' will hold. For a pointer to data member type of
the form `T X::*', `TYPE_PTRMEM_CLASS_TYPE' will be the type `X',
while `TYPE_PTRMEM_POINTED_TO_TYPE' will be the type `T'.
`RECORD_TYPE'
Used to represent `struct' and `class' types in C and C++. If
`TYPE_PTRMEMFUNC_P' holds, then this type is a pointer-to-member
type. In that case, the `TYPE_PTRMEMFUNC_FN_TYPE' is a
`POINTER_TYPE' pointing to a `METHOD_TYPE'. The `METHOD_TYPE' is
the type of a function pointed to by the pointer-to-member
function. If `TYPE_PTRMEMFUNC_P' does not hold, this type is a
class type. For more information, *note Classes::.
`UNKNOWN_TYPE'
This node is used to represent a type the knowledge of which is
insufficient for a sound processing.
`TYPENAME_TYPE'
Used to represent a construct of the form `typename T::A'. The
`TYPE_CONTEXT' is `T'; the `TYPE_NAME' is an `IDENTIFIER_NODE' for
`A'. If the type is specified via a template-id, then
`TYPENAME_TYPE_FULLNAME' yields a `TEMPLATE_ID_EXPR'. The
`TREE_TYPE' is non-`NULL' if the node is implicitly generated in
support for the implicit typename extension; in which case the
`TREE_TYPE' is a type node for the base-class.
`TYPEOF_TYPE'
Used to represent the `__typeof__' extension. The `TYPE_FIELDS'
is the expression the type of which is being represented.
File: gccint.info, Node: Namespaces, Next: Classes, Prev: Types for C++, Up: C and C++ Trees
11.10.2 Namespaces
------------------
The root of the entire intermediate representation is the variable
`global_namespace'. This is the namespace specified with `::' in C++
source code. All other namespaces, types, variables, functions, and so
forth can be found starting with this namespace.
However, except for the fact that it is distinguished as the root of
the representation, the global namespace is no different from any other
namespace. Thus, in what follows, we describe namespaces generally,
rather than the global namespace in particular.
A namespace is represented by a `NAMESPACE_DECL' node.
The following macros and functions can be used on a `NAMESPACE_DECL':
`DECL_NAME'
This macro is used to obtain the `IDENTIFIER_NODE' corresponding to
the unqualified name of the name of the namespace (*note
Identifiers::). The name of the global namespace is `::', even
though in C++ the global namespace is unnamed. However, you
should use comparison with `global_namespace', rather than
`DECL_NAME' to determine whether or not a namespace is the global
one. An unnamed namespace will have a `DECL_NAME' equal to
`anonymous_namespace_name'. Within a single translation unit, all
unnamed namespaces will have the same name.
`DECL_CONTEXT'
This macro returns the enclosing namespace. The `DECL_CONTEXT' for
the `global_namespace' is `NULL_TREE'.
`DECL_NAMESPACE_ALIAS'
If this declaration is for a namespace alias, then
`DECL_NAMESPACE_ALIAS' is the namespace for which this one is an
alias.
Do not attempt to use `cp_namespace_decls' for a namespace which is
an alias. Instead, follow `DECL_NAMESPACE_ALIAS' links until you
reach an ordinary, non-alias, namespace, and call
`cp_namespace_decls' there.
`DECL_NAMESPACE_STD_P'
This predicate holds if the namespace is the special `::std'
namespace.
`cp_namespace_decls'
This function will return the declarations contained in the
namespace, including types, overloaded functions, other
namespaces, and so forth. If there are no declarations, this
function will return `NULL_TREE'. The declarations are connected
through their `TREE_CHAIN' fields.
Although most entries on this list will be declarations,
`TREE_LIST' nodes may also appear. In this case, the `TREE_VALUE'
will be an `OVERLOAD'. The value of the `TREE_PURPOSE' is
unspecified; back ends should ignore this value. As with the
other kinds of declarations returned by `cp_namespace_decls', the
`TREE_CHAIN' will point to the next declaration in this list.
For more information on the kinds of declarations that can occur
on this list, *Note Declarations::. Some declarations will not
appear on this list. In particular, no `FIELD_DECL',
`LABEL_DECL', or `PARM_DECL' nodes will appear here.
This function cannot be used with namespaces that have
`DECL_NAMESPACE_ALIAS' set.
File: gccint.info, Node: Classes, Next: Functions for C++, Prev: Namespaces, Up: C and C++ Trees
11.10.3 Classes
---------------
Besides namespaces, the other high-level scoping construct in C++ is the
class. (Throughout this manual the term "class" is used to mean the
types referred to in the ANSI/ISO C++ Standard as classes; these include
types defined with the `class', `struct', and `union' keywords.)
A class type is represented by either a `RECORD_TYPE' or a
`UNION_TYPE'. A class declared with the `union' tag is represented by
a `UNION_TYPE', while classes declared with either the `struct' or the
`class' tag are represented by `RECORD_TYPE's. You can use the
`CLASSTYPE_DECLARED_CLASS' macro to discern whether or not a particular
type is a `class' as opposed to a `struct'. This macro will be true
only for classes declared with the `class' tag.
Almost all non-function members are available on the `TYPE_FIELDS'
list. Given one member, the next can be found by following the
`TREE_CHAIN'. You should not depend in any way on the order in which
fields appear on this list. All nodes on this list will be `DECL'
nodes. A `FIELD_DECL' is used to represent a non-static data member, a
`VAR_DECL' is used to represent a static data member, and a `TYPE_DECL'
is used to represent a type. Note that the `CONST_DECL' for an
enumeration constant will appear on this list, if the enumeration type
was declared in the class. (Of course, the `TYPE_DECL' for the
enumeration type will appear here as well.) There are no entries for
base classes on this list. In particular, there is no `FIELD_DECL' for
the "base-class portion" of an object.
The `TYPE_VFIELD' is a compiler-generated field used to point to
virtual function tables. It may or may not appear on the `TYPE_FIELDS'
list. However, back ends should handle the `TYPE_VFIELD' just like all
the entries on the `TYPE_FIELDS' list.
The function members are available on the `TYPE_METHODS' list. Again,
subsequent members are found by following the `TREE_CHAIN' field. If a
function is overloaded, each of the overloaded functions appears; no
`OVERLOAD' nodes appear on the `TYPE_METHODS' list. Implicitly
declared functions (including default constructors, copy constructors,
assignment operators, and destructors) will appear on this list as well.
Every class has an associated "binfo", which can be obtained with
`TYPE_BINFO'. Binfos are used to represent base-classes. The binfo
given by `TYPE_BINFO' is the degenerate case, whereby every class is
considered to be its own base-class. The base binfos for a particular
binfo are held in a vector, whose length is obtained with
`BINFO_N_BASE_BINFOS'. The base binfos themselves are obtained with
`BINFO_BASE_BINFO' and `BINFO_BASE_ITERATE'. To add a new binfo, use
`BINFO_BASE_APPEND'. The vector of base binfos can be obtained with
`BINFO_BASE_BINFOS', but normally you do not need to use that. The
class type associated with a binfo is given by `BINFO_TYPE'. It is not
always the case that `BINFO_TYPE (TYPE_BINFO (x))', because of typedefs
and qualified types. Neither is it the case that `TYPE_BINFO
(BINFO_TYPE (y))' is the same binfo as `y'. The reason is that if `y'
is a binfo representing a base-class `B' of a derived class `D', then
`BINFO_TYPE (y)' will be `B', and `TYPE_BINFO (BINFO_TYPE (y))' will be
`B' as its own base-class, rather than as a base-class of `D'.
The access to a base type can be found with `BINFO_BASE_ACCESS'. This
will produce `access_public_node', `access_private_node' or
`access_protected_node'. If bases are always public,
`BINFO_BASE_ACCESSES' may be `NULL'.
`BINFO_VIRTUAL_P' is used to specify whether the binfo is inherited
virtually or not. The other flags, `BINFO_MARKED_P' and `BINFO_FLAG_1'
to `BINFO_FLAG_6' can be used for language specific use.
The following macros can be used on a tree node representing a
class-type.
`LOCAL_CLASS_P'
This predicate holds if the class is local class _i.e._ declared
inside a function body.
`TYPE_POLYMORPHIC_P'
This predicate holds if the class has at least one virtual function
(declared or inherited).
`TYPE_HAS_DEFAULT_CONSTRUCTOR'
This predicate holds whenever its argument represents a class-type
with default constructor.
`CLASSTYPE_HAS_MUTABLE'
`TYPE_HAS_MUTABLE_P'
These predicates hold for a class-type having a mutable data
member.
`CLASSTYPE_NON_POD_P'
This predicate holds only for class-types that are not PODs.
`TYPE_HAS_NEW_OPERATOR'
This predicate holds for a class-type that defines `operator new'.
`TYPE_HAS_ARRAY_NEW_OPERATOR'
This predicate holds for a class-type for which `operator new[]'
is defined.
`TYPE_OVERLOADS_CALL_EXPR'
This predicate holds for class-type for which the function call
`operator()' is overloaded.
`TYPE_OVERLOADS_ARRAY_REF'
This predicate holds for a class-type that overloads `operator[]'
`TYPE_OVERLOADS_ARROW'
This predicate holds for a class-type for which `operator->' is
overloaded.
File: gccint.info, Node: Functions for C++, Next: Statements for C++, Prev: Classes, Up: C and C++ Trees
11.10.4 Functions for C++
-------------------------
A function is represented by a `FUNCTION_DECL' node. A set of
overloaded functions is sometimes represented by an `OVERLOAD' node.
An `OVERLOAD' node is not a declaration, so none of the `DECL_' macros
should be used on an `OVERLOAD'. An `OVERLOAD' node is similar to a
`TREE_LIST'. Use `OVL_CURRENT' to get the function associated with an
`OVERLOAD' node; use `OVL_NEXT' to get the next `OVERLOAD' node in the
list of overloaded functions. The macros `OVL_CURRENT' and `OVL_NEXT'
are actually polymorphic; you can use them to work with `FUNCTION_DECL'
nodes as well as with overloads. In the case of a `FUNCTION_DECL',
`OVL_CURRENT' will always return the function itself, and `OVL_NEXT'
will always be `NULL_TREE'.
To determine the scope of a function, you can use the `DECL_CONTEXT'
macro. This macro will return the class (either a `RECORD_TYPE' or a
`UNION_TYPE') or namespace (a `NAMESPACE_DECL') of which the function
is a member. For a virtual function, this macro returns the class in
which the function was actually defined, not the base class in which
the virtual declaration occurred.
If a friend function is defined in a class scope, the
`DECL_FRIEND_CONTEXT' macro can be used to determine the class in which
it was defined. For example, in
class C { friend void f() {} };
the `DECL_CONTEXT' for `f' will be the `global_namespace', but the
`DECL_FRIEND_CONTEXT' will be the `RECORD_TYPE' for `C'.
The following macros and functions can be used on a `FUNCTION_DECL':
`DECL_MAIN_P'
This predicate holds for a function that is the program entry point
`::code'.
`DECL_LOCAL_FUNCTION_P'
This predicate holds if the function was declared at block scope,
even though it has a global scope.
`DECL_ANTICIPATED'
This predicate holds if the function is a built-in function but its
prototype is not yet explicitly declared.
`DECL_EXTERN_C_FUNCTION_P'
This predicate holds if the function is declared as an ``extern
"C"'' function.
`DECL_LINKONCE_P'
This macro holds if multiple copies of this function may be
emitted in various translation units. It is the responsibility of
the linker to merge the various copies. Template instantiations
are the most common example of functions for which
`DECL_LINKONCE_P' holds; G++ instantiates needed templates in all
translation units which require them, and then relies on the
linker to remove duplicate instantiations.
FIXME: This macro is not yet implemented.
`DECL_FUNCTION_MEMBER_P'
This macro holds if the function is a member of a class, rather
than a member of a namespace.
`DECL_STATIC_FUNCTION_P'
This predicate holds if the function a static member function.
`DECL_NONSTATIC_MEMBER_FUNCTION_P'
This macro holds for a non-static member function.
`DECL_CONST_MEMFUNC_P'
This predicate holds for a `const'-member function.
`DECL_VOLATILE_MEMFUNC_P'
This predicate holds for a `volatile'-member function.
`DECL_CONSTRUCTOR_P'
This macro holds if the function is a constructor.
`DECL_NONCONVERTING_P'
This predicate holds if the constructor is a non-converting
constructor.
`DECL_COMPLETE_CONSTRUCTOR_P'
This predicate holds for a function which is a constructor for an
object of a complete type.
`DECL_BASE_CONSTRUCTOR_P'
This predicate holds for a function which is a constructor for a
base class sub-object.
`DECL_COPY_CONSTRUCTOR_P'
This predicate holds for a function which is a copy-constructor.
`DECL_DESTRUCTOR_P'
This macro holds if the function is a destructor.
`DECL_COMPLETE_DESTRUCTOR_P'
This predicate holds if the function is the destructor for an
object a complete type.
`DECL_OVERLOADED_OPERATOR_P'
This macro holds if the function is an overloaded operator.
`DECL_CONV_FN_P'
This macro holds if the function is a type-conversion operator.
`DECL_GLOBAL_CTOR_P'
This predicate holds if the function is a file-scope initialization
function.
`DECL_GLOBAL_DTOR_P'
This predicate holds if the function is a file-scope finalization
function.
`DECL_THUNK_P'
This predicate holds if the function is a thunk.
These functions represent stub code that adjusts the `this' pointer
and then jumps to another function. When the jumped-to function
returns, control is transferred directly to the caller, without
returning to the thunk. The first parameter to the thunk is
always the `this' pointer; the thunk should add `THUNK_DELTA' to
this value. (The `THUNK_DELTA' is an `int', not an `INTEGER_CST'.)
Then, if `THUNK_VCALL_OFFSET' (an `INTEGER_CST') is nonzero the
adjusted `this' pointer must be adjusted again. The complete
calculation is given by the following pseudo-code:
this += THUNK_DELTA
if (THUNK_VCALL_OFFSET)
this += (*((ptrdiff_t **) this))[THUNK_VCALL_OFFSET]
Finally, the thunk should jump to the location given by
`DECL_INITIAL'; this will always be an expression for the address
of a function.
`DECL_NON_THUNK_FUNCTION_P'
This predicate holds if the function is _not_ a thunk function.
`GLOBAL_INIT_PRIORITY'
If either `DECL_GLOBAL_CTOR_P' or `DECL_GLOBAL_DTOR_P' holds, then
this gives the initialization priority for the function. The
linker will arrange that all functions for which
`DECL_GLOBAL_CTOR_P' holds are run in increasing order of priority
before `main' is called. When the program exits, all functions for
which `DECL_GLOBAL_DTOR_P' holds are run in the reverse order.
`TYPE_RAISES_EXCEPTIONS'
This macro returns the list of exceptions that a (member-)function
can raise. The returned list, if non `NULL', is comprised of nodes
whose `TREE_VALUE' represents a type.
`TYPE_NOTHROW_P'
This predicate holds when the exception-specification of its
arguments is of the form ``()''.
`DECL_ARRAY_DELETE_OPERATOR_P'
This predicate holds if the function an overloaded `operator
delete[]'.
File: gccint.info, Node: Statements for C++, Next: C++ Expressions, Prev: Functions for C++, Up: C and C++ Trees
11.10.5 Statements for C++
--------------------------
A function that has a definition in the current translation unit will
have a non-`NULL' `DECL_INITIAL'. However, back ends should not make
use of the particular value given by `DECL_INITIAL'.
The `DECL_SAVED_TREE' macro will give the complete body of the
function.
11.10.5.1 Statements
....................
There are tree nodes corresponding to all of the source-level statement
constructs, used within the C and C++ frontends. These are enumerated
here, together with a list of the various macros that can be used to
obtain information about them. There are a few macros that can be used
with all statements:
`STMT_IS_FULL_EXPR_P'
In C++, statements normally constitute "full expressions";
temporaries created during a statement are destroyed when the
statement is complete. However, G++ sometimes represents
expressions by statements; these statements will not have
`STMT_IS_FULL_EXPR_P' set. Temporaries created during such
statements should be destroyed when the innermost enclosing
statement with `STMT_IS_FULL_EXPR_P' set is exited.
Here is the list of the various statement nodes, and the macros used to
access them. This documentation describes the use of these nodes in
non-template functions (including instantiations of template functions).
In template functions, the same nodes are used, but sometimes in
slightly different ways.
Many of the statements have substatements. For example, a `while'
loop will have a body, which is itself a statement. If the substatement
is `NULL_TREE', it is considered equivalent to a statement consisting
of a single `;', i.e., an expression statement in which the expression
has been omitted. A substatement may in fact be a list of statements,
connected via their `TREE_CHAIN's. So, you should always process the
statement tree by looping over substatements, like this:
void process_stmt (stmt)
tree stmt;
{
while (stmt)
{
switch (TREE_CODE (stmt))
{
case IF_STMT:
process_stmt (THEN_CLAUSE (stmt));
/* More processing here. */
break;
...
}
stmt = TREE_CHAIN (stmt);
}
}
In other words, while the `then' clause of an `if' statement in C++
can be only one statement (although that one statement may be a
compound statement), the intermediate representation will sometimes use
several statements chained together.
`BREAK_STMT'
Used to represent a `break' statement. There are no additional
fields.
`CLEANUP_STMT'
Used to represent an action that should take place upon exit from
the enclosing scope. Typically, these actions are calls to
destructors for local objects, but back ends cannot rely on this
fact. If these nodes are in fact representing such destructors,
`CLEANUP_DECL' will be the `VAR_DECL' destroyed. Otherwise,
`CLEANUP_DECL' will be `NULL_TREE'. In any case, the
`CLEANUP_EXPR' is the expression to execute. The cleanups
executed on exit from a scope should be run in the reverse order
of the order in which the associated `CLEANUP_STMT's were
encountered.
`CONTINUE_STMT'
Used to represent a `continue' statement. There are no additional
fields.
`CTOR_STMT'
Used to mark the beginning (if `CTOR_BEGIN_P' holds) or end (if
`CTOR_END_P' holds of the main body of a constructor. See also
`SUBOBJECT' for more information on how to use these nodes.
`DO_STMT'
Used to represent a `do' loop. The body of the loop is given by
`DO_BODY' while the termination condition for the loop is given by
`DO_COND'. The condition for a `do'-statement is always an
expression.
`EMPTY_CLASS_EXPR'
Used to represent a temporary object of a class with no data whose
address is never taken. (All such objects are interchangeable.)
The `TREE_TYPE' represents the type of the object.
`EXPR_STMT'
Used to represent an expression statement. Use `EXPR_STMT_EXPR' to
obtain the expression.
`FOR_STMT'
Used to represent a `for' statement. The `FOR_INIT_STMT' is the
initialization statement for the loop. The `FOR_COND' is the
termination condition. The `FOR_EXPR' is the expression executed
right before the `FOR_COND' on each loop iteration; often, this
expression increments a counter. The body of the loop is given by
`FOR_BODY'. Note that `FOR_INIT_STMT' and `FOR_BODY' return
statements, while `FOR_COND' and `FOR_EXPR' return expressions.
`HANDLER'
Used to represent a C++ `catch' block. The `HANDLER_TYPE' is the
type of exception that will be caught by this handler; it is equal
(by pointer equality) to `NULL' if this handler is for all types.
`HANDLER_PARMS' is the `DECL_STMT' for the catch parameter, and
`HANDLER_BODY' is the code for the block itself.
`IF_STMT'
Used to represent an `if' statement. The `IF_COND' is the
expression.
If the condition is a `TREE_LIST', then the `TREE_PURPOSE' is a
statement (usually a `DECL_STMT'). Each time the condition is
evaluated, the statement should be executed. Then, the
`TREE_VALUE' should be used as the conditional expression itself.
This representation is used to handle C++ code like this:
C++ distinguishes between this and `COND_EXPR' for handling
templates.
if (int i = 7) ...
where there is a new local variable (or variables) declared within
the condition.
The `THEN_CLAUSE' represents the statement given by the `then'
condition, while the `ELSE_CLAUSE' represents the statement given
by the `else' condition.
`SUBOBJECT'
In a constructor, these nodes are used to mark the point at which a
subobject of `this' is fully constructed. If, after this point, an
exception is thrown before a `CTOR_STMT' with `CTOR_END_P' set is
encountered, the `SUBOBJECT_CLEANUP' must be executed. The
cleanups must be executed in the reverse order in which they
appear.
`SWITCH_STMT'
Used to represent a `switch' statement. The `SWITCH_STMT_COND' is
the expression on which the switch is occurring. See the
documentation for an `IF_STMT' for more information on the
representation used for the condition. The `SWITCH_STMT_BODY' is
the body of the switch statement. The `SWITCH_STMT_TYPE' is the
original type of switch expression as given in the source, before
any compiler conversions.
`TRY_BLOCK'
Used to represent a `try' block. The body of the try block is
given by `TRY_STMTS'. Each of the catch blocks is a `HANDLER'
node. The first handler is given by `TRY_HANDLERS'. Subsequent
handlers are obtained by following the `TREE_CHAIN' link from one
handler to the next. The body of the handler is given by
`HANDLER_BODY'.
If `CLEANUP_P' holds of the `TRY_BLOCK', then the `TRY_HANDLERS'
will not be a `HANDLER' node. Instead, it will be an expression
that should be executed if an exception is thrown in the try
block. It must rethrow the exception after executing that code.
And, if an exception is thrown while the expression is executing,
`terminate' must be called.
`USING_STMT'
Used to represent a `using' directive. The namespace is given by
`USING_STMT_NAMESPACE', which will be a NAMESPACE_DECL. This node
is needed inside template functions, to implement using directives
during instantiation.
`WHILE_STMT'
Used to represent a `while' loop. The `WHILE_COND' is the
termination condition for the loop. See the documentation for an
`IF_STMT' for more information on the representation used for the
condition.
The `WHILE_BODY' is the body of the loop.
File: gccint.info, Node: C++ Expressions, Prev: Statements for C++, Up: C and C++ Trees
11.10.6 C++ Expressions
-----------------------
This section describes expressions specific to the C and C++ front ends.
`TYPEID_EXPR'
Used to represent a `typeid' expression.
`NEW_EXPR'
`VEC_NEW_EXPR'
Used to represent a call to `new' and `new[]' respectively.
`DELETE_EXPR'
`VEC_DELETE_EXPR'
Used to represent a call to `delete' and `delete[]' respectively.
`MEMBER_REF'
Represents a reference to a member of a class.
`THROW_EXPR'
Represents an instance of `throw' in the program. Operand 0,
which is the expression to throw, may be `NULL_TREE'.
`AGGR_INIT_EXPR'
An `AGGR_INIT_EXPR' represents the initialization as the return
value of a function call, or as the result of a constructor. An
`AGGR_INIT_EXPR' will only appear as a full-expression, or as the
second operand of a `TARGET_EXPR'. `AGGR_INIT_EXPR's have a
representation similar to that of `CALL_EXPR's. You can use the
`AGGR_INIT_EXPR_FN' and `AGGR_INIT_EXPR_ARG' macros to access the
function to call and the arguments to pass.
If `AGGR_INIT_VIA_CTOR_P' holds of the `AGGR_INIT_EXPR', then the
initialization is via a constructor call. The address of the
`AGGR_INIT_EXPR_SLOT' operand, which is always a `VAR_DECL', is
taken, and this value replaces the first argument in the argument
list.
In either case, the expression is void.
File: gccint.info, Node: Java Trees, Prev: C and C++ Trees, Up: GENERIC
11.11 Java Trees
================
File: gccint.info, Node: GIMPLE, Next: Tree SSA, Prev: GENERIC, Up: Top
12 GIMPLE
*********
GIMPLE is a three-address representation derived from GENERIC by
breaking down GENERIC expressions into tuples of no more than 3
operands (with some exceptions like function calls). GIMPLE was
heavily influenced by the SIMPLE IL used by the McCAT compiler project
at McGill University, though we have made some different choices. For
one thing, SIMPLE doesn't support `goto'.
Temporaries are introduced to hold intermediate values needed to
compute complex expressions. Additionally, all the control structures
used in GENERIC are lowered into conditional jumps, lexical scopes are
removed and exception regions are converted into an on the side
exception region tree.
The compiler pass which converts GENERIC into GIMPLE is referred to as
the `gimplifier'. The gimplifier works recursively, generating GIMPLE
tuples out of the original GENERIC expressions.
One of the early implementation strategies used for the GIMPLE
representation was to use the same internal data structures used by
front ends to represent parse trees. This simplified implementation
because we could leverage existing functionality and interfaces.
However, GIMPLE is a much more restrictive representation than abstract
syntax trees (AST), therefore it does not require the full structural
complexity provided by the main tree data structure.
The GENERIC representation of a function is stored in the
`DECL_SAVED_TREE' field of the associated `FUNCTION_DECL' tree node.
It is converted to GIMPLE by a call to `gimplify_function_tree'.
If a front end wants to include language-specific tree codes in the
tree representation which it provides to the back end, it must provide a
definition of `LANG_HOOKS_GIMPLIFY_EXPR' which knows how to convert the
front end trees to GIMPLE. Usually such a hook will involve much of
the same code for expanding front end trees to RTL. This function can
return fully lowered GIMPLE, or it can return GENERIC trees and let the
main gimplifier lower them the rest of the way; this is often simpler.
GIMPLE that is not fully lowered is known as "High GIMPLE" and consists
of the IL before the pass `pass_lower_cf'. High GIMPLE contains some
container statements like lexical scopes (represented by `GIMPLE_BIND')
and nested expressions (e.g., `GIMPLE_TRY'), while "Low GIMPLE" exposes
all of the implicit jumps for control and exception expressions
directly in the IL and EH region trees.
The C and C++ front ends currently convert directly from front end
trees to GIMPLE, and hand that off to the back end rather than first
converting to GENERIC. Their gimplifier hooks know about all the
`_STMT' nodes and how to convert them to GENERIC forms. There was some
work done on a genericization pass which would run first, but the
existence of `STMT_EXPR' meant that in order to convert all of the C
statements into GENERIC equivalents would involve walking the entire
tree anyway, so it was simpler to lower all the way. This might change
in the future if someone writes an optimization pass which would work
better with higher-level trees, but currently the optimizers all expect
GIMPLE.
You can request to dump a C-like representation of the GIMPLE form
with the flag `-fdump-tree-gimple'.
* Menu:
* Tuple representation::
* GIMPLE instruction set::
* GIMPLE Exception Handling::
* Temporaries::
* Operands::
* Manipulating GIMPLE statements::
* Tuple specific accessors::
* GIMPLE sequences::
* Sequence iterators::
* Adding a new GIMPLE statement code::
* Statement and operand traversals::
File: gccint.info, Node: Tuple representation, Next: GIMPLE instruction set, Up: GIMPLE
12.1 Tuple representation
=========================
GIMPLE instructions are tuples of variable size divided in two groups:
a header describing the instruction and its locations, and a variable
length body with all the operands. Tuples are organized into a
hierarchy with 3 main classes of tuples.
12.1.1 `gimple_statement_base' (gsbase)
---------------------------------------
This is the root of the hierarchy, it holds basic information needed by
most GIMPLE statements. There are some fields that may not be relevant
to every GIMPLE statement, but those were moved into the base structure
to take advantage of holes left by other fields (thus making the
structure more compact). The structure takes 4 words (32 bytes) on 64
bit hosts:
Field Size (bits)
`code' 8
`subcode' 16
`no_warning' 1
`visited' 1
`nontemporal_move' 1
`plf' 2
`modified' 1
`has_volatile_ops' 1
`references_memory_p' 1
`uid' 32
`location' 32
`num_ops' 32
`bb' 64
`block' 63
Total size 32 bytes
* `code' Main identifier for a GIMPLE instruction.
* `subcode' Used to distinguish different variants of the same basic
instruction or provide flags applicable to a given code. The
`subcode' flags field has different uses depending on the code of
the instruction, but mostly it distinguishes instructions of the
same family. The most prominent use of this field is in
assignments, where subcode indicates the operation done on the RHS
of the assignment. For example, a = b + c is encoded as
`GIMPLE_ASSIGN <PLUS_EXPR, a, b, c>'.
* `no_warning' Bitflag to indicate whether a warning has already
been issued on this statement.
* `visited' General purpose "visited" marker. Set and cleared by
each pass when needed.
* `nontemporal_move' Bitflag used in assignments that represent
non-temporal moves. Although this bitflag is only used in
assignments, it was moved into the base to take advantage of the
bit holes left by the previous fields.
* `plf' Pass Local Flags. This 2-bit mask can be used as general
purpose markers by any pass. Passes are responsible for clearing
and setting these two flags accordingly.
* `modified' Bitflag to indicate whether the statement has been
modified. Used mainly by the operand scanner to determine when to
re-scan a statement for operands.
* `has_volatile_ops' Bitflag to indicate whether this statement
contains operands that have been marked volatile.
* `references_memory_p' Bitflag to indicate whether this statement
contains memory references (i.e., its operands are either global
variables, or pointer dereferences or anything that must reside in
memory).
* `uid' This is an unsigned integer used by passes that want to
assign IDs to every statement. These IDs must be assigned and used
by each pass.
* `location' This is a `location_t' identifier to specify source code
location for this statement. It is inherited from the front end.
* `num_ops' Number of operands that this statement has. This
specifies the size of the operand vector embedded in the tuple.
Only used in some tuples, but it is declared in the base tuple to
take advantage of the 32-bit hole left by the previous fields.
* `bb' Basic block holding the instruction.
* `block' Lexical block holding this statement. Also used for debug
information generation.
12.1.2 `gimple_statement_with_ops'
----------------------------------
This tuple is actually split in two: `gimple_statement_with_ops_base'
and `gimple_statement_with_ops'. This is needed to accommodate the way
the operand vector is allocated. The operand vector is defined to be an
array of 1 element. So, to allocate a dynamic number of operands, the
memory allocator (`gimple_alloc') simply allocates enough memory to
hold the structure itself plus `N - 1' operands which run "off the end"
of the structure. For example, to allocate space for a tuple with 3
operands, `gimple_alloc' reserves `sizeof (struct
gimple_statement_with_ops) + 2 * sizeof (tree)' bytes.
On the other hand, several fields in this tuple need to be shared with
the `gimple_statement_with_memory_ops' tuple. So, these common fields
are placed in `gimple_statement_with_ops_base' which is then inherited
from the other two tuples.
`gsbase' 256
`def_ops' 64
`use_ops' 64
`op' `num_ops' * 64
Total size 48 + 8 * `num_ops' bytes
* `gsbase' Inherited from `struct gimple_statement_base'.
* `def_ops' Array of pointers into the operand array indicating all
the slots that contain a variable written-to by the statement.
This array is also used for immediate use chaining. Note that it
would be possible to not rely on this array, but the changes
required to implement this are pretty invasive.
* `use_ops' Similar to `def_ops' but for variables read by the
statement.
* `op' Array of trees with `num_ops' slots.
12.1.3 `gimple_statement_with_memory_ops'
-----------------------------------------
This tuple is essentially identical to `gimple_statement_with_ops',
except that it contains 4 additional fields to hold vectors related
memory stores and loads. Similar to the previous case, the structure
is split in two to accommodate for the operand vector
(`gimple_statement_with_memory_ops_base' and
`gimple_statement_with_memory_ops').
Field Size (bits)
`gsbase' 256
`def_ops' 64
`use_ops' 64
`vdef_ops' 64
`vuse_ops' 64
`stores' 64
`loads' 64
`op' `num_ops' * 64
Total size 80 + 8 * `num_ops' bytes
* `vdef_ops' Similar to `def_ops' but for `VDEF' operators. There is
one entry per memory symbol written by this statement. This is
used to maintain the memory SSA use-def and def-def chains.
* `vuse_ops' Similar to `use_ops' but for `VUSE' operators. There is
one entry per memory symbol loaded by this statement. This is used
to maintain the memory SSA use-def chains.
* `stores' Bitset with all the UIDs for the symbols written-to by the
statement. This is different than `vdef_ops' in that all the
affected symbols are mentioned in this set. If memory
partitioning is enabled, the `vdef_ops' vector will refer to memory
partitions. Furthermore, no SSA information is stored in this set.
* `loads' Similar to `stores', but for memory loads. (Note that there
is some amount of redundancy here, it should be possible to reduce
memory utilization further by removing these sets).
All the other tuples are defined in terms of these three basic ones.
Each tuple will add some fields. The main gimple type is defined to be
the union of all these structures (`GTY' markers elided for clarity):
union gimple_statement_d
{
struct gimple_statement_base gsbase;
struct gimple_statement_with_ops gsops;
struct gimple_statement_with_memory_ops gsmem;
struct gimple_statement_omp omp;
struct gimple_statement_bind gimple_bind;
struct gimple_statement_catch gimple_catch;
struct gimple_statement_eh_filter gimple_eh_filter;
struct gimple_statement_phi gimple_phi;
struct gimple_statement_resx gimple_resx;
struct gimple_statement_try gimple_try;
struct gimple_statement_wce gimple_wce;
struct gimple_statement_asm gimple_asm;
struct gimple_statement_omp_critical gimple_omp_critical;
struct gimple_statement_omp_for gimple_omp_for;
struct gimple_statement_omp_parallel gimple_omp_parallel;
struct gimple_statement_omp_task gimple_omp_task;
struct gimple_statement_omp_sections gimple_omp_sections;
struct gimple_statement_omp_single gimple_omp_single;
struct gimple_statement_omp_continue gimple_omp_continue;
struct gimple_statement_omp_atomic_load gimple_omp_atomic_load;
struct gimple_statement_omp_atomic_store gimple_omp_atomic_store;
};
File: gccint.info, Node: GIMPLE instruction set, Next: GIMPLE Exception Handling, Prev: Tuple representation, Up: GIMPLE
12.2 GIMPLE instruction set
===========================
The following table briefly describes the GIMPLE instruction set.
Instruction High GIMPLE Low GIMPLE
`GIMPLE_ASM' x x
`GIMPLE_ASSIGN' x x
`GIMPLE_BIND' x
`GIMPLE_CALL' x x
`GIMPLE_CATCH' x
`GIMPLE_COND' x x
`GIMPLE_DEBUG' x x
`GIMPLE_EH_FILTER' x
`GIMPLE_GOTO' x x
`GIMPLE_LABEL' x x
`GIMPLE_NOP' x x
`GIMPLE_OMP_ATOMIC_LOAD' x x
`GIMPLE_OMP_ATOMIC_STORE' x x
`GIMPLE_OMP_CONTINUE' x x
`GIMPLE_OMP_CRITICAL' x x
`GIMPLE_OMP_FOR' x x
`GIMPLE_OMP_MASTER' x x
`GIMPLE_OMP_ORDERED' x x
`GIMPLE_OMP_PARALLEL' x x
`GIMPLE_OMP_RETURN' x x
`GIMPLE_OMP_SECTION' x x
`GIMPLE_OMP_SECTIONS' x x
`GIMPLE_OMP_SECTIONS_SWITCH' x x
`GIMPLE_OMP_SINGLE' x x
`GIMPLE_PHI' x
`GIMPLE_RESX' x
`GIMPLE_RETURN' x x
`GIMPLE_SWITCH' x x
`GIMPLE_TRY' x
File: gccint.info, Node: GIMPLE Exception Handling, Next: Temporaries, Prev: GIMPLE instruction set, Up: GIMPLE
12.3 Exception Handling
=======================
Other exception handling constructs are represented using
`GIMPLE_TRY_CATCH'. `GIMPLE_TRY_CATCH' has two operands. The first
operand is a sequence of statements to execute. If executing these
statements does not throw an exception, then the second operand is
ignored. Otherwise, if an exception is thrown, then the second operand
of the `GIMPLE_TRY_CATCH' is checked. The second operand may have the
following forms:
1. A sequence of statements to execute. When an exception occurs,
these statements are executed, and then the exception is rethrown.
2. A sequence of `GIMPLE_CATCH' statements. Each `GIMPLE_CATCH' has
a list of applicable exception types and handler code. If the
thrown exception matches one of the caught types, the associated
handler code is executed. If the handler code falls off the
bottom, execution continues after the original `GIMPLE_TRY_CATCH'.
3. A `GIMPLE_EH_FILTER' statement. This has a list of permitted
exception types, and code to handle a match failure. If the
thrown exception does not match one of the allowed types, the
associated match failure code is executed. If the thrown exception
does match, it continues unwinding the stack looking for the next
handler.
Currently throwing an exception is not directly represented in GIMPLE,
since it is implemented by calling a function. At some point in the
future we will want to add some way to express that the call will throw
an exception of a known type.
Just before running the optimizers, the compiler lowers the high-level
EH constructs above into a set of `goto's, magic labels, and EH
regions. Continuing to unwind at the end of a cleanup is represented
with a `GIMPLE_RESX'.
File: gccint.info, Node: Temporaries, Next: Operands, Prev: GIMPLE Exception Handling, Up: GIMPLE
12.4 Temporaries
================
When gimplification encounters a subexpression that is too complex, it
creates a new temporary variable to hold the value of the
subexpression, and adds a new statement to initialize it before the
current statement. These special temporaries are known as `expression
temporaries', and are allocated using `get_formal_tmp_var'. The
compiler tries to always evaluate identical expressions into the same
temporary, to simplify elimination of redundant calculations.
We can only use expression temporaries when we know that it will not
be reevaluated before its value is used, and that it will not be
otherwise modified(1). Other temporaries can be allocated using
`get_initialized_tmp_var' or `create_tmp_var'.
Currently, an expression like `a = b + 5' is not reduced any further.
We tried converting it to something like
T1 = b + 5;
a = T1;
but this bloated the representation for minimal benefit. However, a
variable which must live in memory cannot appear in an expression; its
value is explicitly loaded into a temporary first. Similarly, storing
the value of an expression to a memory variable goes through a
temporary.
---------- Footnotes ----------
(1) These restrictions are derived from those in Morgan 4.8.
File: gccint.info, Node: Operands, Next: Manipulating GIMPLE statements, Prev: Temporaries, Up: GIMPLE
12.5 Operands
=============
In general, expressions in GIMPLE consist of an operation and the
appropriate number of simple operands; these operands must either be a
GIMPLE rvalue (`is_gimple_val'), i.e. a constant or a register
variable. More complex operands are factored out into temporaries, so
that
a = b + c + d
becomes
T1 = b + c;
a = T1 + d;
The same rule holds for arguments to a `GIMPLE_CALL'.
The target of an assignment is usually a variable, but can also be a
`MEM_REF' or a compound lvalue as described below.
* Menu:
* Compound Expressions::
* Compound Lvalues::
* Conditional Expressions::
* Logical Operators::
File: gccint.info, Node: Compound Expressions, Next: Compound Lvalues, Up: Operands
12.5.1 Compound Expressions
---------------------------
The left-hand side of a C comma expression is simply moved into a
separate statement.
File: gccint.info, Node: Compound Lvalues, Next: Conditional Expressions, Prev: Compound Expressions, Up: Operands
12.5.2 Compound Lvalues
-----------------------
Currently compound lvalues involving array and structure field
references are not broken down; an expression like `a.b[2] = 42' is not
reduced any further (though complex array subscripts are). This
restriction is a workaround for limitations in later optimizers; if we
were to convert this to
T1 = &a.b;
T1[2] = 42;
alias analysis would not remember that the reference to `T1[2]' came
by way of `a.b', so it would think that the assignment could alias
another member of `a'; this broke `struct-alias-1.c'. Future optimizer
improvements may make this limitation unnecessary.
File: gccint.info, Node: Conditional Expressions, Next: Logical Operators, Prev: Compound Lvalues, Up: Operands
12.5.3 Conditional Expressions
------------------------------
A C `?:' expression is converted into an `if' statement with each
branch assigning to the same temporary. So,
a = b ? c : d;
becomes
if (b == 1)
T1 = c;
else
T1 = d;
a = T1;
The GIMPLE level if-conversion pass re-introduces `?:' expression, if
appropriate. It is used to vectorize loops with conditions using vector
conditional operations.
Note that in GIMPLE, `if' statements are represented using
`GIMPLE_COND', as described below.
File: gccint.info, Node: Logical Operators, Prev: Conditional Expressions, Up: Operands
12.5.4 Logical Operators
------------------------
Except when they appear in the condition operand of a `GIMPLE_COND',
logical `and' and `or' operators are simplified as follows: `a = b &&
c' becomes
T1 = (bool)b;
if (T1 == true)
T1 = (bool)c;
a = T1;
Note that `T1' in this example cannot be an expression temporary,
because it has two different assignments.
12.5.5 Manipulating operands
----------------------------
All gimple operands are of type `tree'. But only certain types of
trees are allowed to be used as operand tuples. Basic validation is
controlled by the function `get_gimple_rhs_class', which given a tree
code, returns an `enum' with the following values of type `enum
gimple_rhs_class'
* `GIMPLE_INVALID_RHS' The tree cannot be used as a GIMPLE operand.
* `GIMPLE_TERNARY_RHS' The tree is a valid GIMPLE ternary operation.
* `GIMPLE_BINARY_RHS' The tree is a valid GIMPLE binary operation.
* `GIMPLE_UNARY_RHS' The tree is a valid GIMPLE unary operation.
* `GIMPLE_SINGLE_RHS' The tree is a single object, that cannot be
split into simpler operands (for instance, `SSA_NAME', `VAR_DECL',
`COMPONENT_REF', etc).
This operand class also acts as an escape hatch for tree nodes
that may be flattened out into the operand vector, but would need
more than two slots on the RHS. For instance, a `COND_EXPR'
expression of the form `(a op b) ? x : y' could be flattened out
on the operand vector using 4 slots, but it would also require
additional processing to distinguish `c = a op b' from `c = a op b
? x : y'. Something similar occurs with `ASSERT_EXPR'. In time,
these special case tree expressions should be flattened into the
operand vector.
For tree nodes in the categories `GIMPLE_TERNARY_RHS',
`GIMPLE_BINARY_RHS' and `GIMPLE_UNARY_RHS', they cannot be stored
inside tuples directly. They first need to be flattened and separated
into individual components. For instance, given the GENERIC expression
a = b + c
its tree representation is:
MODIFY_EXPR <VAR_DECL <a>, PLUS_EXPR <VAR_DECL <b>, VAR_DECL <c>>>
In this case, the GIMPLE form for this statement is logically
identical to its GENERIC form but in GIMPLE, the `PLUS_EXPR' on the RHS
of the assignment is not represented as a tree, instead the two
operands are taken out of the `PLUS_EXPR' sub-tree and flattened into
the GIMPLE tuple as follows:
GIMPLE_ASSIGN <PLUS_EXPR, VAR_DECL <a>, VAR_DECL <b>, VAR_DECL <c>>
12.5.6 Operand vector allocation
--------------------------------
The operand vector is stored at the bottom of the three tuple
structures that accept operands. This means, that depending on the code
of a given statement, its operand vector will be at different offsets
from the base of the structure. To access tuple operands use the
following accessors
-- GIMPLE function: unsigned gimple_num_ops (gimple g)
Returns the number of operands in statement G.
-- GIMPLE function: tree gimple_op (gimple g, unsigned i)
Returns operand `I' from statement `G'.
-- GIMPLE function: tree * gimple_ops (gimple g)
Returns a pointer into the operand vector for statement `G'. This
is computed using an internal table called `gimple_ops_offset_'[].
This table is indexed by the gimple code of `G'.
When the compiler is built, this table is filled-in using the
sizes of the structures used by each statement code defined in
gimple.def. Since the operand vector is at the bottom of the
structure, for a gimple code `C' the offset is computed as sizeof
(struct-of `C') - sizeof (tree).
This mechanism adds one memory indirection to every access when
using `gimple_op'(), if this becomes a bottleneck, a pass can
choose to memoize the result from `gimple_ops'() and use that to
access the operands.
12.5.7 Operand validation
-------------------------
When adding a new operand to a gimple statement, the operand will be
validated according to what each tuple accepts in its operand vector.
These predicates are called by the `gimple_NAME_set_...()'. Each tuple
will use one of the following predicates (Note, this list is not
exhaustive):
-- GIMPLE function: bool is_gimple_val (tree t)
Returns true if t is a "GIMPLE value", which are all the
non-addressable stack variables (variables for which
`is_gimple_reg' returns true) and constants (expressions for which
`is_gimple_min_invariant' returns true).
-- GIMPLE function: bool is_gimple_addressable (tree t)
Returns true if t is a symbol or memory reference whose address
can be taken.
-- GIMPLE function: bool is_gimple_asm_val (tree t)
Similar to `is_gimple_val' but it also accepts hard registers.
-- GIMPLE function: bool is_gimple_call_addr (tree t)
Return true if t is a valid expression to use as the function
called by a `GIMPLE_CALL'.
-- GIMPLE function: bool is_gimple_mem_ref_addr (tree t)
Return true if t is a valid expression to use as first operand of
a `MEM_REF' expression.
-- GIMPLE function: bool is_gimple_constant (tree t)
Return true if t is a valid gimple constant.
-- GIMPLE function: bool is_gimple_min_invariant (tree t)
Return true if t is a valid minimal invariant. This is different
from constants, in that the specific value of t may not be known
at compile time, but it is known that it doesn't change (e.g., the
address of a function local variable).
-- GIMPLE function: bool is_gimple_ip_invariant (tree t)
Return true if t is an interprocedural invariant. This means that
t is a valid invariant in all functions (e.g. it can be an address
of a global variable but not of a local one).
-- GIMPLE function: bool is_gimple_ip_invariant_address (tree t)
Return true if t is an `ADDR_EXPR' that does not change once the
program is running (and which is valid in all functions).
12.5.8 Statement validation
---------------------------
-- GIMPLE function: bool is_gimple_assign (gimple g)
Return true if the code of g is `GIMPLE_ASSIGN'.
-- GIMPLE function: bool is_gimple_call (gimple g)
Return true if the code of g is `GIMPLE_CALL'.
-- GIMPLE function: bool is_gimple_debug (gimple g)
Return true if the code of g is `GIMPLE_DEBUG'.
-- GIMPLE function: bool gimple_assign_cast_p (gimple g)
Return true if g is a `GIMPLE_ASSIGN' that performs a type cast
operation.
-- GIMPLE function: bool gimple_debug_bind_p (gimple g)
Return true if g is a `GIMPLE_DEBUG' that binds the value of an
expression to a variable.
File: gccint.info, Node: Manipulating GIMPLE statements, Next: Tuple specific accessors, Prev: Operands, Up: GIMPLE
12.6 Manipulating GIMPLE statements
===================================
This section documents all the functions available to handle each of
the GIMPLE instructions.
12.6.1 Common accessors
-----------------------
The following are common accessors for gimple statements.
-- GIMPLE function: enum gimple_code gimple_code (gimple g)
Return the code for statement `G'.
-- GIMPLE function: basic_block gimple_bb (gimple g)
Return the basic block to which statement `G' belongs to.
-- GIMPLE function: tree gimple_block (gimple g)
Return the lexical scope block holding statement `G'.
-- GIMPLE function: tree gimple_expr_type (gimple stmt)
Return the type of the main expression computed by `STMT'. Return
`void_type_node' if `STMT' computes nothing. This will only return
something meaningful for `GIMPLE_ASSIGN', `GIMPLE_COND' and
`GIMPLE_CALL'. For all other tuple codes, it will return
`void_type_node'.
-- GIMPLE function: enum tree_code gimple_expr_code (gimple stmt)
Return the tree code for the expression computed by `STMT'. This
is only meaningful for `GIMPLE_CALL', `GIMPLE_ASSIGN' and
`GIMPLE_COND'. If `STMT' is `GIMPLE_CALL', it will return
`CALL_EXPR'. For `GIMPLE_COND', it returns the code of the
comparison predicate. For `GIMPLE_ASSIGN' it returns the code of
the operation performed by the `RHS' of the assignment.
-- GIMPLE function: void gimple_set_block (gimple g, tree block)
Set the lexical scope block of `G' to `BLOCK'.
-- GIMPLE function: location_t gimple_locus (gimple g)
Return locus information for statement `G'.
-- GIMPLE function: void gimple_set_locus (gimple g, location_t locus)
Set locus information for statement `G'.
-- GIMPLE function: bool gimple_locus_empty_p (gimple g)
Return true if `G' does not have locus information.
-- GIMPLE function: bool gimple_no_warning_p (gimple stmt)
Return true if no warnings should be emitted for statement `STMT'.
-- GIMPLE function: void gimple_set_visited (gimple stmt, bool
visited_p)
Set the visited status on statement `STMT' to `VISITED_P'.
-- GIMPLE function: bool gimple_visited_p (gimple stmt)
Return the visited status on statement `STMT'.
-- GIMPLE function: void gimple_set_plf (gimple stmt, enum plf_mask
plf, bool val_p)
Set pass local flag `PLF' on statement `STMT' to `VAL_P'.
-- GIMPLE function: unsigned int gimple_plf (gimple stmt, enum
plf_mask plf)
Return the value of pass local flag `PLF' on statement `STMT'.
-- GIMPLE function: bool gimple_has_ops (gimple g)
Return true if statement `G' has register or memory operands.
-- GIMPLE function: bool gimple_has_mem_ops (gimple g)
Return true if statement `G' has memory operands.
-- GIMPLE function: unsigned gimple_num_ops (gimple g)
Return the number of operands for statement `G'.
-- GIMPLE function: tree * gimple_ops (gimple g)
Return the array of operands for statement `G'.
-- GIMPLE function: tree gimple_op (gimple g, unsigned i)
Return operand `I' for statement `G'.
-- GIMPLE function: tree * gimple_op_ptr (gimple g, unsigned i)
Return a pointer to operand `I' for statement `G'.
-- GIMPLE function: void gimple_set_op (gimple g, unsigned i, tree op)
Set operand `I' of statement `G' to `OP'.
-- GIMPLE function: bitmap gimple_addresses_taken (gimple stmt)
Return the set of symbols that have had their address taken by
`STMT'.
-- GIMPLE function: struct def_optype_d * gimple_def_ops (gimple g)
Return the set of `DEF' operands for statement `G'.
-- GIMPLE function: void gimple_set_def_ops (gimple g, struct
def_optype_d *def)
Set `DEF' to be the set of `DEF' operands for statement `G'.
-- GIMPLE function: struct use_optype_d * gimple_use_ops (gimple g)
Return the set of `USE' operands for statement `G'.
-- GIMPLE function: void gimple_set_use_ops (gimple g, struct
use_optype_d *use)
Set `USE' to be the set of `USE' operands for statement `G'.
-- GIMPLE function: struct voptype_d * gimple_vuse_ops (gimple g)
Return the set of `VUSE' operands for statement `G'.
-- GIMPLE function: void gimple_set_vuse_ops (gimple g, struct
voptype_d *ops)
Set `OPS' to be the set of `VUSE' operands for statement `G'.
-- GIMPLE function: struct voptype_d * gimple_vdef_ops (gimple g)
Return the set of `VDEF' operands for statement `G'.
-- GIMPLE function: void gimple_set_vdef_ops (gimple g, struct
voptype_d *ops)
Set `OPS' to be the set of `VDEF' operands for statement `G'.
-- GIMPLE function: bitmap gimple_loaded_syms (gimple g)
Return the set of symbols loaded by statement `G'. Each element of
the set is the `DECL_UID' of the corresponding symbol.
-- GIMPLE function: bitmap gimple_stored_syms (gimple g)
Return the set of symbols stored by statement `G'. Each element of
the set is the `DECL_UID' of the corresponding symbol.
-- GIMPLE function: bool gimple_modified_p (gimple g)
Return true if statement `G' has operands and the modified field
has been set.
-- GIMPLE function: bool gimple_has_volatile_ops (gimple stmt)
Return true if statement `STMT' contains volatile operands.
-- GIMPLE function: void gimple_set_has_volatile_ops (gimple stmt,
bool volatilep)
Return true if statement `STMT' contains volatile operands.
-- GIMPLE function: void update_stmt (gimple s)
Mark statement `S' as modified, and update it.
-- GIMPLE function: void update_stmt_if_modified (gimple s)
Update statement `S' if it has been marked modified.
-- GIMPLE function: gimple gimple_copy (gimple stmt)
Return a deep copy of statement `STMT'.
File: gccint.info, Node: Tuple specific accessors, Next: GIMPLE sequences, Prev: Manipulating GIMPLE statements, Up: GIMPLE
12.7 Tuple specific accessors
=============================
* Menu:
* `GIMPLE_ASM'::
* `GIMPLE_ASSIGN'::
* `GIMPLE_BIND'::
* `GIMPLE_CALL'::
* `GIMPLE_CATCH'::
* `GIMPLE_COND'::
* `GIMPLE_DEBUG'::
* `GIMPLE_EH_FILTER'::
* `GIMPLE_LABEL'::
* `GIMPLE_NOP'::
* `GIMPLE_OMP_ATOMIC_LOAD'::
* `GIMPLE_OMP_ATOMIC_STORE'::
* `GIMPLE_OMP_CONTINUE'::
* `GIMPLE_OMP_CRITICAL'::
* `GIMPLE_OMP_FOR'::
* `GIMPLE_OMP_MASTER'::
* `GIMPLE_OMP_ORDERED'::
* `GIMPLE_OMP_PARALLEL'::
* `GIMPLE_OMP_RETURN'::
* `GIMPLE_OMP_SECTION'::
* `GIMPLE_OMP_SECTIONS'::
* `GIMPLE_OMP_SINGLE'::
* `GIMPLE_PHI'::
* `GIMPLE_RESX'::
* `GIMPLE_RETURN'::
* `GIMPLE_SWITCH'::
* `GIMPLE_TRY'::
* `GIMPLE_WITH_CLEANUP_EXPR'::
File: gccint.info, Node: `GIMPLE_ASM', Next: `GIMPLE_ASSIGN', Up: Tuple specific accessors
12.7.1 `GIMPLE_ASM'
-------------------
-- GIMPLE function: gimple gimple_build_asm (const char *string,
ninputs, noutputs, nclobbers, ...)
Build a `GIMPLE_ASM' statement. This statement is used for
building in-line assembly constructs. `STRING' is the assembly
code. `NINPUT' is the number of register inputs. `NOUTPUT' is the
number of register outputs. `NCLOBBERS' is the number of clobbered
registers. The rest of the arguments trees for each input,
output, and clobbered registers.
-- GIMPLE function: gimple gimple_build_asm_vec (const char *,
VEC(tree,gc) *, VEC(tree,gc) *, VEC(tree,gc) *)
Identical to gimple_build_asm, but the arguments are passed in
VECs.
-- GIMPLE function: unsigned gimple_asm_ninputs (gimple g)
Return the number of input operands for `GIMPLE_ASM' `G'.
-- GIMPLE function: unsigned gimple_asm_noutputs (gimple g)
Return the number of output operands for `GIMPLE_ASM' `G'.
-- GIMPLE function: unsigned gimple_asm_nclobbers (gimple g)
Return the number of clobber operands for `GIMPLE_ASM' `G'.
-- GIMPLE function: tree gimple_asm_input_op (gimple g, unsigned index)
Return input operand `INDEX' of `GIMPLE_ASM' `G'.
-- GIMPLE function: void gimple_asm_set_input_op (gimple g, unsigned
index, tree in_op)
Set `IN_OP' to be input operand `INDEX' in `GIMPLE_ASM' `G'.
-- GIMPLE function: tree gimple_asm_output_op (gimple g, unsigned
index)
Return output operand `INDEX' of `GIMPLE_ASM' `G'.
-- GIMPLE function: void gimple_asm_set_output_op (gimple g, unsigned
index, tree out_op)
Set `OUT_OP' to be output operand `INDEX' in `GIMPLE_ASM' `G'.
-- GIMPLE function: tree gimple_asm_clobber_op (gimple g, unsigned
index)
Return clobber operand `INDEX' of `GIMPLE_ASM' `G'.
-- GIMPLE function: void gimple_asm_set_clobber_op (gimple g, unsigned
index, tree clobber_op)
Set `CLOBBER_OP' to be clobber operand `INDEX' in `GIMPLE_ASM' `G'.
-- GIMPLE function: const char * gimple_asm_string (gimple g)
Return the string representing the assembly instruction in
`GIMPLE_ASM' `G'.
-- GIMPLE function: bool gimple_asm_volatile_p (gimple g)
Return true if `G' is an asm statement marked volatile.
-- GIMPLE function: void gimple_asm_set_volatile (gimple g)
Mark asm statement `G' as volatile.
-- GIMPLE function: void gimple_asm_clear_volatile (gimple g)
Remove volatile marker from asm statement `G'.
File: gccint.info, Node: `GIMPLE_ASSIGN', Next: `GIMPLE_BIND', Prev: `GIMPLE_ASM', Up: Tuple specific accessors
12.7.2 `GIMPLE_ASSIGN'
----------------------
-- GIMPLE function: gimple gimple_build_assign (tree lhs, tree rhs)
Build a `GIMPLE_ASSIGN' statement. The left-hand side is an lvalue
passed in lhs. The right-hand side can be either a unary or
binary tree expression. The expression tree rhs will be flattened
and its operands assigned to the corresponding operand slots in
the new statement. This function is useful when you already have
a tree expression that you want to convert into a tuple. However,
try to avoid building expression trees for the sole purpose of
calling this function. If you already have the operands in
separate trees, it is better to use `gimple_build_assign_with_ops'.
-- GIMPLE function: gimple gimplify_assign (tree dst, tree src,
gimple_seq *seq_p)
Build a new `GIMPLE_ASSIGN' tuple and append it to the end of
`*SEQ_P'.
`DST'/`SRC' are the destination and source respectively. You can pass
ungimplified trees in `DST' or `SRC', in which case they will be
converted to a gimple operand if necessary.
This function returns the newly created `GIMPLE_ASSIGN' tuple.
-- GIMPLE function: gimple gimple_build_assign_with_ops (enum
tree_code subcode, tree lhs, tree op1, tree op2)
This function is similar to `gimple_build_assign', but is used to
build a `GIMPLE_ASSIGN' statement when the operands of the
right-hand side of the assignment are already split into different
operands.
The left-hand side is an lvalue passed in lhs. Subcode is the
`tree_code' for the right-hand side of the assignment. Op1 and op2
are the operands. If op2 is null, subcode must be a `tree_code'
for a unary expression.
-- GIMPLE function: enum tree_code gimple_assign_rhs_code (gimple g)
Return the code of the expression computed on the `RHS' of
assignment statement `G'.
-- GIMPLE function: enum gimple_rhs_class gimple_assign_rhs_class
(gimple g)
Return the gimple rhs class of the code for the expression
computed on the rhs of assignment statement `G'. This will never
return `GIMPLE_INVALID_RHS'.
-- GIMPLE function: tree gimple_assign_lhs (gimple g)
Return the `LHS' of assignment statement `G'.
-- GIMPLE function: tree * gimple_assign_lhs_ptr (gimple g)
Return a pointer to the `LHS' of assignment statement `G'.
-- GIMPLE function: tree gimple_assign_rhs1 (gimple g)
Return the first operand on the `RHS' of assignment statement `G'.
-- GIMPLE function: tree * gimple_assign_rhs1_ptr (gimple g)
Return the address of the first operand on the `RHS' of assignment
statement `G'.
-- GIMPLE function: tree gimple_assign_rhs2 (gimple g)
Return the second operand on the `RHS' of assignment statement `G'.
-- GIMPLE function: tree * gimple_assign_rhs2_ptr (gimple g)
Return the address of the second operand on the `RHS' of assignment
statement `G'.
-- GIMPLE function: tree gimple_assign_rhs3 (gimple g)
Return the third operand on the `RHS' of assignment statement `G'.
-- GIMPLE function: tree * gimple_assign_rhs3_ptr (gimple g)
Return the address of the third operand on the `RHS' of assignment
statement `G'.
-- GIMPLE function: void gimple_assign_set_lhs (gimple g, tree lhs)
Set `LHS' to be the `LHS' operand of assignment statement `G'.
-- GIMPLE function: void gimple_assign_set_rhs1 (gimple g, tree rhs)
Set `RHS' to be the first operand on the `RHS' of assignment
statement `G'.
-- GIMPLE function: void gimple_assign_set_rhs2 (gimple g, tree rhs)
Set `RHS' to be the second operand on the `RHS' of assignment
statement `G'.
-- GIMPLE function: void gimple_assign_set_rhs3 (gimple g, tree rhs)
Set `RHS' to be the third operand on the `RHS' of assignment
statement `G'.
-- GIMPLE function: bool gimple_assign_cast_p (gimple s)
Return true if `S' is a type-cast assignment.
File: gccint.info, Node: `GIMPLE_BIND', Next: `GIMPLE_CALL', Prev: `GIMPLE_ASSIGN', Up: Tuple specific accessors
12.7.3 `GIMPLE_BIND'
--------------------
-- GIMPLE function: gimple gimple_build_bind (tree vars, gimple_seq
body)
Build a `GIMPLE_BIND' statement with a list of variables in `VARS'
and a body of statements in sequence `BODY'.
-- GIMPLE function: tree gimple_bind_vars (gimple g)
Return the variables declared in the `GIMPLE_BIND' statement `G'.
-- GIMPLE function: void gimple_bind_set_vars (gimple g, tree vars)
Set `VARS' to be the set of variables declared in the `GIMPLE_BIND'
statement `G'.
-- GIMPLE function: void gimple_bind_append_vars (gimple g, tree vars)
Append `VARS' to the set of variables declared in the `GIMPLE_BIND'
statement `G'.
-- GIMPLE function: gimple_seq gimple_bind_body (gimple g)
Return the GIMPLE sequence contained in the `GIMPLE_BIND' statement
`G'.
-- GIMPLE function: void gimple_bind_set_body (gimple g, gimple_seq
seq)
Set `SEQ' to be sequence contained in the `GIMPLE_BIND' statement
`G'.
-- GIMPLE function: void gimple_bind_add_stmt (gimple gs, gimple stmt)
Append a statement to the end of a `GIMPLE_BIND''s body.
-- GIMPLE function: void gimple_bind_add_seq (gimple gs, gimple_seq
seq)
Append a sequence of statements to the end of a `GIMPLE_BIND''s
body.
-- GIMPLE function: tree gimple_bind_block (gimple g)
Return the `TREE_BLOCK' node associated with `GIMPLE_BIND'
statement `G'. This is analogous to the `BIND_EXPR_BLOCK' field in
trees.
-- GIMPLE function: void gimple_bind_set_block (gimple g, tree block)
Set `BLOCK' to be the `TREE_BLOCK' node associated with
`GIMPLE_BIND' statement `G'.
File: gccint.info, Node: `GIMPLE_CALL', Next: `GIMPLE_CATCH', Prev: `GIMPLE_BIND', Up: Tuple specific accessors
12.7.4 `GIMPLE_CALL'
--------------------
-- GIMPLE function: gimple gimple_build_call (tree fn, unsigned nargs,
...)
Build a `GIMPLE_CALL' statement to function `FN'. The argument
`FN' must be either a `FUNCTION_DECL' or a gimple call address as
determined by `is_gimple_call_addr'. `NARGS' are the number of
arguments. The rest of the arguments follow the argument `NARGS',
and must be trees that are valid as rvalues in gimple (i.e., each
operand is validated with `is_gimple_operand').
-- GIMPLE function: gimple gimple_build_call_from_tree (tree call_expr)
Build a `GIMPLE_CALL' from a `CALL_EXPR' node. The arguments and
the function are taken from the expression directly. This routine
assumes that `call_expr' is already in GIMPLE form. That is, its
operands are GIMPLE values and the function call needs no further
simplification. All the call flags in `call_expr' are copied over
to the new `GIMPLE_CALL'.
-- GIMPLE function: gimple gimple_build_call_vec (tree fn, `VEC'(tree,
heap) *args)
Identical to `gimple_build_call' but the arguments are stored in a
`VEC'().
-- GIMPLE function: tree gimple_call_lhs (gimple g)
Return the `LHS' of call statement `G'.
-- GIMPLE function: tree * gimple_call_lhs_ptr (gimple g)
Return a pointer to the `LHS' of call statement `G'.
-- GIMPLE function: void gimple_call_set_lhs (gimple g, tree lhs)
Set `LHS' to be the `LHS' operand of call statement `G'.
-- GIMPLE function: tree gimple_call_fn (gimple g)
Return the tree node representing the function called by call
statement `G'.
-- GIMPLE function: void gimple_call_set_fn (gimple g, tree fn)
Set `FN' to be the function called by call statement `G'. This has
to be a gimple value specifying the address of the called function.
-- GIMPLE function: tree gimple_call_fndecl (gimple g)
If a given `GIMPLE_CALL''s callee is a `FUNCTION_DECL', return it.
Otherwise return `NULL'. This function is analogous to
`get_callee_fndecl' in `GENERIC'.
-- GIMPLE function: tree gimple_call_set_fndecl (gimple g, tree fndecl)
Set the called function to `FNDECL'.
-- GIMPLE function: tree gimple_call_return_type (gimple g)
Return the type returned by call statement `G'.
-- GIMPLE function: tree gimple_call_chain (gimple g)
Return the static chain for call statement `G'.
-- GIMPLE function: void gimple_call_set_chain (gimple g, tree chain)
Set `CHAIN' to be the static chain for call statement `G'.
-- GIMPLE function: unsigned gimple_call_num_args (gimple g)
Return the number of arguments used by call statement `G'.
-- GIMPLE function: tree gimple_call_arg (gimple g, unsigned index)
Return the argument at position `INDEX' for call statement `G'.
The first argument is 0.
-- GIMPLE function: tree * gimple_call_arg_ptr (gimple g, unsigned
index)
Return a pointer to the argument at position `INDEX' for call
statement `G'.
-- GIMPLE function: void gimple_call_set_arg (gimple g, unsigned
index, tree arg)
Set `ARG' to be the argument at position `INDEX' for call statement
`G'.
-- GIMPLE function: void gimple_call_set_tail (gimple s)
Mark call statement `S' as being a tail call (i.e., a call just
before the exit of a function). These calls are candidate for tail
call optimization.
-- GIMPLE function: bool gimple_call_tail_p (gimple s)
Return true if `GIMPLE_CALL' `S' is marked as a tail call.
-- GIMPLE function: void gimple_call_mark_uninlinable (gimple s)
Mark `GIMPLE_CALL' `S' as being uninlinable.
-- GIMPLE function: bool gimple_call_cannot_inline_p (gimple s)
Return true if `GIMPLE_CALL' `S' cannot be inlined.
-- GIMPLE function: bool gimple_call_noreturn_p (gimple s)
Return true if `S' is a noreturn call.
-- GIMPLE function: gimple gimple_call_copy_skip_args (gimple stmt,
bitmap args_to_skip)
Build a `GIMPLE_CALL' identical to `STMT' but skipping the
arguments in the positions marked by the set `ARGS_TO_SKIP'.
File: gccint.info, Node: `GIMPLE_CATCH', Next: `GIMPLE_COND', Prev: `GIMPLE_CALL', Up: Tuple specific accessors
12.7.5 `GIMPLE_CATCH'
---------------------
-- GIMPLE function: gimple gimple_build_catch (tree types, gimple_seq
handler)
Build a `GIMPLE_CATCH' statement. `TYPES' are the tree types this
catch handles. `HANDLER' is a sequence of statements with the code
for the handler.
-- GIMPLE function: tree gimple_catch_types (gimple g)
Return the types handled by `GIMPLE_CATCH' statement `G'.
-- GIMPLE function: tree * gimple_catch_types_ptr (gimple g)
Return a pointer to the types handled by `GIMPLE_CATCH' statement
`G'.
-- GIMPLE function: gimple_seq gimple_catch_handler (gimple g)
Return the GIMPLE sequence representing the body of the handler of
`GIMPLE_CATCH' statement `G'.
-- GIMPLE function: void gimple_catch_set_types (gimple g, tree t)
Set `T' to be the set of types handled by `GIMPLE_CATCH' `G'.
-- GIMPLE function: void gimple_catch_set_handler (gimple g,
gimple_seq handler)
Set `HANDLER' to be the body of `GIMPLE_CATCH' `G'.
File: gccint.info, Node: `GIMPLE_COND', Next: `GIMPLE_DEBUG', Prev: `GIMPLE_CATCH', Up: Tuple specific accessors
12.7.6 `GIMPLE_COND'
--------------------
-- GIMPLE function: gimple gimple_build_cond (enum tree_code
pred_code, tree lhs, tree rhs, tree t_label, tree f_label)
Build a `GIMPLE_COND' statement. `A' `GIMPLE_COND' statement
compares `LHS' and `RHS' and if the condition in `PRED_CODE' is
true, jump to the label in `t_label', otherwise jump to the label
in `f_label'. `PRED_CODE' are relational operator tree codes like
`EQ_EXPR', `LT_EXPR', `LE_EXPR', `NE_EXPR', etc.
-- GIMPLE function: gimple gimple_build_cond_from_tree (tree cond,
tree t_label, tree f_label)
Build a `GIMPLE_COND' statement from the conditional expression
tree `COND'. `T_LABEL' and `F_LABEL' are as in
`gimple_build_cond'.
-- GIMPLE function: enum tree_code gimple_cond_code (gimple g)
Return the code of the predicate computed by conditional statement
`G'.
-- GIMPLE function: void gimple_cond_set_code (gimple g, enum
tree_code code)
Set `CODE' to be the predicate code for the conditional statement
`G'.
-- GIMPLE function: tree gimple_cond_lhs (gimple g)
Return the `LHS' of the predicate computed by conditional statement
`G'.
-- GIMPLE function: void gimple_cond_set_lhs (gimple g, tree lhs)
Set `LHS' to be the `LHS' operand of the predicate computed by
conditional statement `G'.
-- GIMPLE function: tree gimple_cond_rhs (gimple g)
Return the `RHS' operand of the predicate computed by conditional
`G'.
-- GIMPLE function: void gimple_cond_set_rhs (gimple g, tree rhs)
Set `RHS' to be the `RHS' operand of the predicate computed by
conditional statement `G'.
-- GIMPLE function: tree gimple_cond_true_label (gimple g)
Return the label used by conditional statement `G' when its
predicate evaluates to true.
-- GIMPLE function: void gimple_cond_set_true_label (gimple g, tree
label)
Set `LABEL' to be the label used by conditional statement `G' when
its predicate evaluates to true.
-- GIMPLE function: void gimple_cond_set_false_label (gimple g, tree
label)
Set `LABEL' to be the label used by conditional statement `G' when
its predicate evaluates to false.
-- GIMPLE function: tree gimple_cond_false_label (gimple g)
Return the label used by conditional statement `G' when its
predicate evaluates to false.
-- GIMPLE function: void gimple_cond_make_false (gimple g)
Set the conditional `COND_STMT' to be of the form 'if (1 == 0)'.
-- GIMPLE function: void gimple_cond_make_true (gimple g)
Set the conditional `COND_STMT' to be of the form 'if (1 == 1)'.
File: gccint.info, Node: `GIMPLE_DEBUG', Next: `GIMPLE_EH_FILTER', Prev: `GIMPLE_COND', Up: Tuple specific accessors
12.7.7 `GIMPLE_DEBUG'
---------------------
-- GIMPLE function: gimple gimple_build_debug_bind (tree var, tree
value, gimple stmt)
Build a `GIMPLE_DEBUG' statement with `GIMPLE_DEBUG_BIND' of
`subcode'. The effect of this statement is to tell debug
information generation machinery that the value of user variable
`var' is given by `value' at that point, and to remain with that
value until `var' runs out of scope, a dynamically-subsequent
debug bind statement overrides the binding, or conflicting values
reach a control flow merge point. Even if components of the
`value' expression change afterwards, the variable is supposed to
retain the same value, though not necessarily the same location.
It is expected that `var' be most often a tree for automatic user
variables (`VAR_DECL' or `PARM_DECL') that satisfy the
requirements for gimple registers, but it may also be a tree for a
scalarized component of a user variable (`ARRAY_REF',
`COMPONENT_REF'), or a debug temporary (`DEBUG_EXPR_DECL').
As for `value', it can be an arbitrary tree expression, but it is
recommended that it be in a suitable form for a gimple assignment
`RHS'. It is not expected that user variables that could appear
as `var' ever appear in `value', because in the latter we'd have
their `SSA_NAME's instead, but even if they were not in SSA form,
user variables appearing in `value' are to be regarded as part of
the executable code space, whereas those in `var' are to be
regarded as part of the source code space. There is no way to
refer to the value bound to a user variable within a `value'
expression.
If `value' is `GIMPLE_DEBUG_BIND_NOVALUE', debug information
generation machinery is informed that the variable `var' is
unbound, i.e., that its value is indeterminate, which sometimes
means it is really unavailable, and other times that the compiler
could not keep track of it.
Block and location information for the newly-created stmt are
taken from `stmt', if given.
-- GIMPLE function: tree gimple_debug_bind_get_var (gimple stmt)
Return the user variable VAR that is bound at `stmt'.
-- GIMPLE function: tree gimple_debug_bind_get_value (gimple stmt)
Return the value expression that is bound to a user variable at
`stmt'.
-- GIMPLE function: tree * gimple_debug_bind_get_value_ptr (gimple
stmt)
Return a pointer to the value expression that is bound to a user
variable at `stmt'.
-- GIMPLE function: void gimple_debug_bind_set_var (gimple stmt, tree
var)
Modify the user variable bound at `stmt' to VAR.
-- GIMPLE function: void gimple_debug_bind_set_value (gimple stmt,
tree var)
Modify the value bound to the user variable bound at `stmt' to
VALUE.
-- GIMPLE function: void gimple_debug_bind_reset_value (gimple stmt)
Modify the value bound to the user variable bound at `stmt' so
that the variable becomes unbound.
-- GIMPLE function: bool gimple_debug_bind_has_value_p (gimple stmt)
Return `TRUE' if `stmt' binds a user variable to a value, and
`FALSE' if it unbinds the variable.
File: gccint.info, Node: `GIMPLE_EH_FILTER', Next: `GIMPLE_LABEL', Prev: `GIMPLE_DEBUG', Up: Tuple specific accessors
12.7.8 `GIMPLE_EH_FILTER'
-------------------------
-- GIMPLE function: gimple gimple_build_eh_filter (tree types,
gimple_seq failure)
Build a `GIMPLE_EH_FILTER' statement. `TYPES' are the filter's
types. `FAILURE' is a sequence with the filter's failure action.
-- GIMPLE function: tree gimple_eh_filter_types (gimple g)
Return the types handled by `GIMPLE_EH_FILTER' statement `G'.
-- GIMPLE function: tree * gimple_eh_filter_types_ptr (gimple g)
Return a pointer to the types handled by `GIMPLE_EH_FILTER'
statement `G'.
-- GIMPLE function: gimple_seq gimple_eh_filter_failure (gimple g)
Return the sequence of statement to execute when `GIMPLE_EH_FILTER'
statement fails.
-- GIMPLE function: void gimple_eh_filter_set_types (gimple g, tree
types)
Set `TYPES' to be the set of types handled by `GIMPLE_EH_FILTER'
`G'.
-- GIMPLE function: void gimple_eh_filter_set_failure (gimple g,
gimple_seq failure)
Set `FAILURE' to be the sequence of statements to execute on
failure for `GIMPLE_EH_FILTER' `G'.
-- GIMPLE function: bool gimple_eh_filter_must_not_throw (gimple g)
Return the `EH_FILTER_MUST_NOT_THROW' flag.
-- GIMPLE function: void gimple_eh_filter_set_must_not_throw (gimple
g, bool mntp)
Set the `EH_FILTER_MUST_NOT_THROW' flag.
File: gccint.info, Node: `GIMPLE_LABEL', Next: `GIMPLE_NOP', Prev: `GIMPLE_EH_FILTER', Up: Tuple specific accessors
12.7.9 `GIMPLE_LABEL'
---------------------
-- GIMPLE function: gimple gimple_build_label (tree label)
Build a `GIMPLE_LABEL' statement with corresponding to the tree
label, `LABEL'.
-- GIMPLE function: tree gimple_label_label (gimple g)
Return the `LABEL_DECL' node used by `GIMPLE_LABEL' statement `G'.
-- GIMPLE function: void gimple_label_set_label (gimple g, tree label)
Set `LABEL' to be the `LABEL_DECL' node used by `GIMPLE_LABEL'
statement `G'.
-- GIMPLE function: gimple gimple_build_goto (tree dest)
Build a `GIMPLE_GOTO' statement to label `DEST'.
-- GIMPLE function: tree gimple_goto_dest (gimple g)
Return the destination of the unconditional jump `G'.
-- GIMPLE function: void gimple_goto_set_dest (gimple g, tree dest)
Set `DEST' to be the destination of the unconditional jump `G'.
File: gccint.info, Node: `GIMPLE_NOP', Next: `GIMPLE_OMP_ATOMIC_LOAD', Prev: `GIMPLE_LABEL', Up: Tuple specific accessors
12.7.10 `GIMPLE_NOP'
--------------------
-- GIMPLE function: gimple gimple_build_nop (void)
Build a `GIMPLE_NOP' statement.
-- GIMPLE function: bool gimple_nop_p (gimple g)
Returns `TRUE' if statement `G' is a `GIMPLE_NOP'.
File: gccint.info, Node: `GIMPLE_OMP_ATOMIC_LOAD', Next: `GIMPLE_OMP_ATOMIC_STORE', Prev: `GIMPLE_NOP', Up: Tuple specific accessors
12.7.11 `GIMPLE_OMP_ATOMIC_LOAD'
--------------------------------
-- GIMPLE function: gimple gimple_build_omp_atomic_load (tree lhs,
tree rhs)
Build a `GIMPLE_OMP_ATOMIC_LOAD' statement. `LHS' is the left-hand
side of the assignment. `RHS' is the right-hand side of the
assignment.
-- GIMPLE function: void gimple_omp_atomic_load_set_lhs (gimple g,
tree lhs)
Set the `LHS' of an atomic load.
-- GIMPLE function: tree gimple_omp_atomic_load_lhs (gimple g)
Get the `LHS' of an atomic load.
-- GIMPLE function: void gimple_omp_atomic_load_set_rhs (gimple g,
tree rhs)
Set the `RHS' of an atomic set.
-- GIMPLE function: tree gimple_omp_atomic_load_rhs (gimple g)
Get the `RHS' of an atomic set.
File: gccint.info, Node: `GIMPLE_OMP_ATOMIC_STORE', Next: `GIMPLE_OMP_CONTINUE', Prev: `GIMPLE_OMP_ATOMIC_LOAD', Up: Tuple specific accessors
12.7.12 `GIMPLE_OMP_ATOMIC_STORE'
---------------------------------
-- GIMPLE function: gimple gimple_build_omp_atomic_store (tree val)
Build a `GIMPLE_OMP_ATOMIC_STORE' statement. `VAL' is the value to
be stored.
-- GIMPLE function: void gimple_omp_atomic_store_set_val (gimple g,
tree val)
Set the value being stored in an atomic store.
-- GIMPLE function: tree gimple_omp_atomic_store_val (gimple g)
Return the value being stored in an atomic store.
File: gccint.info, Node: `GIMPLE_OMP_CONTINUE', Next: `GIMPLE_OMP_CRITICAL', Prev: `GIMPLE_OMP_ATOMIC_STORE', Up: Tuple specific accessors
12.7.13 `GIMPLE_OMP_CONTINUE'
-----------------------------
-- GIMPLE function: gimple gimple_build_omp_continue (tree
control_def, tree control_use)
Build a `GIMPLE_OMP_CONTINUE' statement. `CONTROL_DEF' is the
definition of the control variable. `CONTROL_USE' is the use of
the control variable.
-- GIMPLE function: tree gimple_omp_continue_control_def (gimple s)
Return the definition of the control variable on a
`GIMPLE_OMP_CONTINUE' in `S'.
-- GIMPLE function: tree gimple_omp_continue_control_def_ptr (gimple s)
Same as above, but return the pointer.
-- GIMPLE function: tree gimple_omp_continue_set_control_def (gimple s)
Set the control variable definition for a `GIMPLE_OMP_CONTINUE'
statement in `S'.
-- GIMPLE function: tree gimple_omp_continue_control_use (gimple s)
Return the use of the control variable on a `GIMPLE_OMP_CONTINUE'
in `S'.
-- GIMPLE function: tree gimple_omp_continue_control_use_ptr (gimple s)
Same as above, but return the pointer.
-- GIMPLE function: tree gimple_omp_continue_set_control_use (gimple s)
Set the control variable use for a `GIMPLE_OMP_CONTINUE' statement
in `S'.
File: gccint.info, Node: `GIMPLE_OMP_CRITICAL', Next: `GIMPLE_OMP_FOR', Prev: `GIMPLE_OMP_CONTINUE', Up: Tuple specific accessors
12.7.14 `GIMPLE_OMP_CRITICAL'
-----------------------------
-- GIMPLE function: gimple gimple_build_omp_critical (gimple_seq body,
tree name)
Build a `GIMPLE_OMP_CRITICAL' statement. `BODY' is the sequence of
statements for which only one thread can execute. `NAME' is an
optional identifier for this critical block.
-- GIMPLE function: tree gimple_omp_critical_name (gimple g)
Return the name associated with `OMP_CRITICAL' statement `G'.
-- GIMPLE function: tree * gimple_omp_critical_name_ptr (gimple g)
Return a pointer to the name associated with `OMP' critical
statement `G'.
-- GIMPLE function: void gimple_omp_critical_set_name (gimple g, tree
name)
Set `NAME' to be the name associated with `OMP' critical statement
`G'.
File: gccint.info, Node: `GIMPLE_OMP_FOR', Next: `GIMPLE_OMP_MASTER', Prev: `GIMPLE_OMP_CRITICAL', Up: Tuple specific accessors
12.7.15 `GIMPLE_OMP_FOR'
------------------------
-- GIMPLE function: gimple gimple_build_omp_for (gimple_seq body, tree
clauses, tree index, tree initial, tree final, tree incr,
gimple_seq pre_body, enum tree_code omp_for_cond)
Build a `GIMPLE_OMP_FOR' statement. `BODY' is sequence of
statements inside the for loop. `CLAUSES', are any of the `OMP'
loop construct's clauses: private, firstprivate, lastprivate,
reductions, ordered, schedule, and nowait. `PRE_BODY' is the
sequence of statements that are loop invariant. `INDEX' is the
index variable. `INITIAL' is the initial value of `INDEX'.
`FINAL' is final value of `INDEX'. OMP_FOR_COND is the predicate
used to compare `INDEX' and `FINAL'. `INCR' is the increment
expression.
-- GIMPLE function: tree gimple_omp_for_clauses (gimple g)
Return the clauses associated with `OMP_FOR' `G'.
-- GIMPLE function: tree * gimple_omp_for_clauses_ptr (gimple g)
Return a pointer to the `OMP_FOR' `G'.
-- GIMPLE function: void gimple_omp_for_set_clauses (gimple g, tree
clauses)
Set `CLAUSES' to be the list of clauses associated with `OMP_FOR'
`G'.
-- GIMPLE function: tree gimple_omp_for_index (gimple g)
Return the index variable for `OMP_FOR' `G'.
-- GIMPLE function: tree * gimple_omp_for_index_ptr (gimple g)
Return a pointer to the index variable for `OMP_FOR' `G'.
-- GIMPLE function: void gimple_omp_for_set_index (gimple g, tree
index)
Set `INDEX' to be the index variable for `OMP_FOR' `G'.
-- GIMPLE function: tree gimple_omp_for_initial (gimple g)
Return the initial value for `OMP_FOR' `G'.
-- GIMPLE function: tree * gimple_omp_for_initial_ptr (gimple g)
Return a pointer to the initial value for `OMP_FOR' `G'.
-- GIMPLE function: void gimple_omp_for_set_initial (gimple g, tree
initial)
Set `INITIAL' to be the initial value for `OMP_FOR' `G'.
-- GIMPLE function: tree gimple_omp_for_final (gimple g)
Return the final value for `OMP_FOR' `G'.
-- GIMPLE function: tree * gimple_omp_for_final_ptr (gimple g)
turn a pointer to the final value for `OMP_FOR' `G'.
-- GIMPLE function: void gimple_omp_for_set_final (gimple g, tree
final)
Set `FINAL' to be the final value for `OMP_FOR' `G'.
-- GIMPLE function: tree gimple_omp_for_incr (gimple g)
Return the increment value for `OMP_FOR' `G'.
-- GIMPLE function: tree * gimple_omp_for_incr_ptr (gimple g)
Return a pointer to the increment value for `OMP_FOR' `G'.
-- GIMPLE function: void gimple_omp_for_set_incr (gimple g, tree incr)
Set `INCR' to be the increment value for `OMP_FOR' `G'.
-- GIMPLE function: gimple_seq gimple_omp_for_pre_body (gimple g)
Return the sequence of statements to execute before the `OMP_FOR'
statement `G' starts.
-- GIMPLE function: void gimple_omp_for_set_pre_body (gimple g,
gimple_seq pre_body)
Set `PRE_BODY' to be the sequence of statements to execute before
the `OMP_FOR' statement `G' starts.
-- GIMPLE function: void gimple_omp_for_set_cond (gimple g, enum
tree_code cond)
Set `COND' to be the condition code for `OMP_FOR' `G'.
-- GIMPLE function: enum tree_code gimple_omp_for_cond (gimple g)
Return the condition code associated with `OMP_FOR' `G'.
File: gccint.info, Node: `GIMPLE_OMP_MASTER', Next: `GIMPLE_OMP_ORDERED', Prev: `GIMPLE_OMP_FOR', Up: Tuple specific accessors
12.7.16 `GIMPLE_OMP_MASTER'
---------------------------
-- GIMPLE function: gimple gimple_build_omp_master (gimple_seq body)
Build a `GIMPLE_OMP_MASTER' statement. `BODY' is the sequence of
statements to be executed by just the master.
File: gccint.info, Node: `GIMPLE_OMP_ORDERED', Next: `GIMPLE_OMP_PARALLEL', Prev: `GIMPLE_OMP_MASTER', Up: Tuple specific accessors
12.7.17 `GIMPLE_OMP_ORDERED'
----------------------------
-- GIMPLE function: gimple gimple_build_omp_ordered (gimple_seq body)
Build a `GIMPLE_OMP_ORDERED' statement.
`BODY' is the sequence of statements inside a loop that will executed
in sequence.
File: gccint.info, Node: `GIMPLE_OMP_PARALLEL', Next: `GIMPLE_OMP_RETURN', Prev: `GIMPLE_OMP_ORDERED', Up: Tuple specific accessors
12.7.18 `GIMPLE_OMP_PARALLEL'
-----------------------------
-- GIMPLE function: gimple gimple_build_omp_parallel (gimple_seq body,
tree clauses, tree child_fn, tree data_arg)
Build a `GIMPLE_OMP_PARALLEL' statement.
`BODY' is sequence of statements which are executed in parallel.
`CLAUSES', are the `OMP' parallel construct's clauses. `CHILD_FN' is
the function created for the parallel threads to execute. `DATA_ARG'
are the shared data argument(s).
-- GIMPLE function: bool gimple_omp_parallel_combined_p (gimple g)
Return true if `OMP' parallel statement `G' has the
`GF_OMP_PARALLEL_COMBINED' flag set.
-- GIMPLE function: void gimple_omp_parallel_set_combined_p (gimple g)
Set the `GF_OMP_PARALLEL_COMBINED' field in `OMP' parallel
statement `G'.
-- GIMPLE function: gimple_seq gimple_omp_body (gimple g)
Return the body for the `OMP' statement `G'.
-- GIMPLE function: void gimple_omp_set_body (gimple g, gimple_seq
body)
Set `BODY' to be the body for the `OMP' statement `G'.
-- GIMPLE function: tree gimple_omp_parallel_clauses (gimple g)
Return the clauses associated with `OMP_PARALLEL' `G'.
-- GIMPLE function: tree * gimple_omp_parallel_clauses_ptr (gimple g)
Return a pointer to the clauses associated with `OMP_PARALLEL' `G'.
-- GIMPLE function: void gimple_omp_parallel_set_clauses (gimple g,
tree clauses)
Set `CLAUSES' to be the list of clauses associated with
`OMP_PARALLEL' `G'.
-- GIMPLE function: tree gimple_omp_parallel_child_fn (gimple g)
Return the child function used to hold the body of `OMP_PARALLEL'
`G'.
-- GIMPLE function: tree * gimple_omp_parallel_child_fn_ptr (gimple g)
Return a pointer to the child function used to hold the body of
`OMP_PARALLEL' `G'.
-- GIMPLE function: void gimple_omp_parallel_set_child_fn (gimple g,
tree child_fn)
Set `CHILD_FN' to be the child function for `OMP_PARALLEL' `G'.
-- GIMPLE function: tree gimple_omp_parallel_data_arg (gimple g)
Return the artificial argument used to send variables and values
from the parent to the children threads in `OMP_PARALLEL' `G'.
-- GIMPLE function: tree * gimple_omp_parallel_data_arg_ptr (gimple g)
Return a pointer to the data argument for `OMP_PARALLEL' `G'.
-- GIMPLE function: void gimple_omp_parallel_set_data_arg (gimple g,
tree data_arg)
Set `DATA_ARG' to be the data argument for `OMP_PARALLEL' `G'.
-- GIMPLE function: bool is_gimple_omp (gimple stmt)
Returns true when the gimple statement `STMT' is any of the OpenMP
types.
File: gccint.info, Node: `GIMPLE_OMP_RETURN', Next: `GIMPLE_OMP_SECTION', Prev: `GIMPLE_OMP_PARALLEL', Up: Tuple specific accessors
12.7.19 `GIMPLE_OMP_RETURN'
---------------------------
-- GIMPLE function: gimple gimple_build_omp_return (bool wait_p)
Build a `GIMPLE_OMP_RETURN' statement. `WAIT_P' is true if this is
a non-waiting return.
-- GIMPLE function: void gimple_omp_return_set_nowait (gimple s)
Set the nowait flag on `GIMPLE_OMP_RETURN' statement `S'.
-- GIMPLE function: bool gimple_omp_return_nowait_p (gimple g)
Return true if `OMP' return statement `G' has the
`GF_OMP_RETURN_NOWAIT' flag set.
File: gccint.info, Node: `GIMPLE_OMP_SECTION', Next: `GIMPLE_OMP_SECTIONS', Prev: `GIMPLE_OMP_RETURN', Up: Tuple specific accessors
12.7.20 `GIMPLE_OMP_SECTION'
----------------------------
-- GIMPLE function: gimple gimple_build_omp_section (gimple_seq body)
Build a `GIMPLE_OMP_SECTION' statement for a sections statement.
`BODY' is the sequence of statements in the section.
-- GIMPLE function: bool gimple_omp_section_last_p (gimple g)
Return true if `OMP' section statement `G' has the
`GF_OMP_SECTION_LAST' flag set.
-- GIMPLE function: void gimple_omp_section_set_last (gimple g)
Set the `GF_OMP_SECTION_LAST' flag on `G'.
File: gccint.info, Node: `GIMPLE_OMP_SECTIONS', Next: `GIMPLE_OMP_SINGLE', Prev: `GIMPLE_OMP_SECTION', Up: Tuple specific accessors
12.7.21 `GIMPLE_OMP_SECTIONS'
-----------------------------
-- GIMPLE function: gimple gimple_build_omp_sections (gimple_seq body,
tree clauses)
Build a `GIMPLE_OMP_SECTIONS' statement. `BODY' is a sequence of
section statements. `CLAUSES' are any of the `OMP' sections
construct's clauses: private, firstprivate, lastprivate,
reduction, and nowait.
-- GIMPLE function: gimple gimple_build_omp_sections_switch (void)
Build a `GIMPLE_OMP_SECTIONS_SWITCH' statement.
-- GIMPLE function: tree gimple_omp_sections_control (gimple g)
Return the control variable associated with the
`GIMPLE_OMP_SECTIONS' in `G'.
-- GIMPLE function: tree * gimple_omp_sections_control_ptr (gimple g)
Return a pointer to the clauses associated with the
`GIMPLE_OMP_SECTIONS' in `G'.
-- GIMPLE function: void gimple_omp_sections_set_control (gimple g,
tree control)
Set `CONTROL' to be the set of clauses associated with the
`GIMPLE_OMP_SECTIONS' in `G'.
-- GIMPLE function: tree gimple_omp_sections_clauses (gimple g)
Return the clauses associated with `OMP_SECTIONS' `G'.
-- GIMPLE function: tree * gimple_omp_sections_clauses_ptr (gimple g)
Return a pointer to the clauses associated with `OMP_SECTIONS' `G'.
-- GIMPLE function: void gimple_omp_sections_set_clauses (gimple g,
tree clauses)
Set `CLAUSES' to be the set of clauses associated with
`OMP_SECTIONS' `G'.
File: gccint.info, Node: `GIMPLE_OMP_SINGLE', Next: `GIMPLE_PHI', Prev: `GIMPLE_OMP_SECTIONS', Up: Tuple specific accessors
12.7.22 `GIMPLE_OMP_SINGLE'
---------------------------
-- GIMPLE function: gimple gimple_build_omp_single (gimple_seq body,
tree clauses)
Build a `GIMPLE_OMP_SINGLE' statement. `BODY' is the sequence of
statements that will be executed once. `CLAUSES' are any of the
`OMP' single construct's clauses: private, firstprivate,
copyprivate, nowait.
-- GIMPLE function: tree gimple_omp_single_clauses (gimple g)
Return the clauses associated with `OMP_SINGLE' `G'.
-- GIMPLE function: tree * gimple_omp_single_clauses_ptr (gimple g)
Return a pointer to the clauses associated with `OMP_SINGLE' `G'.
-- GIMPLE function: void gimple_omp_single_set_clauses (gimple g, tree
clauses)
Set `CLAUSES' to be the clauses associated with `OMP_SINGLE' `G'.
File: gccint.info, Node: `GIMPLE_PHI', Next: `GIMPLE_RESX', Prev: `GIMPLE_OMP_SINGLE', Up: Tuple specific accessors
12.7.23 `GIMPLE_PHI'
--------------------
-- GIMPLE function: gimple make_phi_node (tree var, int len)
Build a `PHI' node with len argument slots for variable var.
-- GIMPLE function: unsigned gimple_phi_capacity (gimple g)
Return the maximum number of arguments supported by `GIMPLE_PHI'
`G'.
-- GIMPLE function: unsigned gimple_phi_num_args (gimple g)
Return the number of arguments in `GIMPLE_PHI' `G'. This must
always be exactly the number of incoming edges for the basic block
holding `G'.
-- GIMPLE function: tree gimple_phi_result (gimple g)
Return the `SSA' name created by `GIMPLE_PHI' `G'.
-- GIMPLE function: tree * gimple_phi_result_ptr (gimple g)
Return a pointer to the `SSA' name created by `GIMPLE_PHI' `G'.
-- GIMPLE function: void gimple_phi_set_result (gimple g, tree result)
Set `RESULT' to be the `SSA' name created by `GIMPLE_PHI' `G'.
-- GIMPLE function: struct phi_arg_d * gimple_phi_arg (gimple g, index)
Return the `PHI' argument corresponding to incoming edge `INDEX'
for `GIMPLE_PHI' `G'.
-- GIMPLE function: void gimple_phi_set_arg (gimple g, index, struct
phi_arg_d * phiarg)
Set `PHIARG' to be the argument corresponding to incoming edge
`INDEX' for `GIMPLE_PHI' `G'.
File: gccint.info, Node: `GIMPLE_RESX', Next: `GIMPLE_RETURN', Prev: `GIMPLE_PHI', Up: Tuple specific accessors
12.7.24 `GIMPLE_RESX'
---------------------
-- GIMPLE function: gimple gimple_build_resx (int region)
Build a `GIMPLE_RESX' statement which is a statement. This
statement is a placeholder for _Unwind_Resume before we know if a
function call or a branch is needed. `REGION' is the exception
region from which control is flowing.
-- GIMPLE function: int gimple_resx_region (gimple g)
Return the region number for `GIMPLE_RESX' `G'.
-- GIMPLE function: void gimple_resx_set_region (gimple g, int region)
Set `REGION' to be the region number for `GIMPLE_RESX' `G'.
File: gccint.info, Node: `GIMPLE_RETURN', Next: `GIMPLE_SWITCH', Prev: `GIMPLE_RESX', Up: Tuple specific accessors
12.7.25 `GIMPLE_RETURN'
-----------------------
-- GIMPLE function: gimple gimple_build_return (tree retval)
Build a `GIMPLE_RETURN' statement whose return value is retval.
-- GIMPLE function: tree gimple_return_retval (gimple g)
Return the return value for `GIMPLE_RETURN' `G'.
-- GIMPLE function: void gimple_return_set_retval (gimple g, tree
retval)
Set `RETVAL' to be the return value for `GIMPLE_RETURN' `G'.
File: gccint.info, Node: `GIMPLE_SWITCH', Next: `GIMPLE_TRY', Prev: `GIMPLE_RETURN', Up: Tuple specific accessors
12.7.26 `GIMPLE_SWITCH'
-----------------------
-- GIMPLE function: gimple gimple_build_switch (unsigned nlabels, tree
index, tree default_label, ...)
Build a `GIMPLE_SWITCH' statement. `NLABELS' are the number of
labels excluding the default label. The default label is passed
in `DEFAULT_LABEL'. The rest of the arguments are trees
representing the labels. Each label is a tree of code
`CASE_LABEL_EXPR'.
-- GIMPLE function: gimple gimple_build_switch_vec (tree index, tree
default_label, `VEC'(tree,heap) *args)
This function is an alternate way of building `GIMPLE_SWITCH'
statements. `INDEX' and `DEFAULT_LABEL' are as in
gimple_build_switch. `ARGS' is a vector of `CASE_LABEL_EXPR' trees
that contain the labels.
-- GIMPLE function: unsigned gimple_switch_num_labels (gimple g)
Return the number of labels associated with the switch statement
`G'.
-- GIMPLE function: void gimple_switch_set_num_labels (gimple g,
unsigned nlabels)
Set `NLABELS' to be the number of labels for the switch statement
`G'.
-- GIMPLE function: tree gimple_switch_index (gimple g)
Return the index variable used by the switch statement `G'.
-- GIMPLE function: void gimple_switch_set_index (gimple g, tree index)
Set `INDEX' to be the index variable for switch statement `G'.
-- GIMPLE function: tree gimple_switch_label (gimple g, unsigned index)
Return the label numbered `INDEX'. The default label is 0, followed
by any labels in a switch statement.
-- GIMPLE function: void gimple_switch_set_label (gimple g, unsigned
index, tree label)
Set the label number `INDEX' to `LABEL'. 0 is always the default
label.
-- GIMPLE function: tree gimple_switch_default_label (gimple g)
Return the default label for a switch statement.
-- GIMPLE function: void gimple_switch_set_default_label (gimple g,
tree label)
Set the default label for a switch statement.
File: gccint.info, Node: `GIMPLE_TRY', Next: `GIMPLE_WITH_CLEANUP_EXPR', Prev: `GIMPLE_SWITCH', Up: Tuple specific accessors
12.7.27 `GIMPLE_TRY'
--------------------
-- GIMPLE function: gimple gimple_build_try (gimple_seq eval,
gimple_seq cleanup, unsigned int kind)
Build a `GIMPLE_TRY' statement. `EVAL' is a sequence with the
expression to evaluate. `CLEANUP' is a sequence of statements to
run at clean-up time. `KIND' is the enumeration value
`GIMPLE_TRY_CATCH' if this statement denotes a try/catch construct
or `GIMPLE_TRY_FINALLY' if this statement denotes a try/finally
construct.
-- GIMPLE function: enum gimple_try_flags gimple_try_kind (gimple g)
Return the kind of try block represented by `GIMPLE_TRY' `G'. This
is either `GIMPLE_TRY_CATCH' or `GIMPLE_TRY_FINALLY'.
-- GIMPLE function: bool gimple_try_catch_is_cleanup (gimple g)
Return the `GIMPLE_TRY_CATCH_IS_CLEANUP' flag.
-- GIMPLE function: gimple_seq gimple_try_eval (gimple g)
Return the sequence of statements used as the body for `GIMPLE_TRY'
`G'.
-- GIMPLE function: gimple_seq gimple_try_cleanup (gimple g)
Return the sequence of statements used as the cleanup body for
`GIMPLE_TRY' `G'.
-- GIMPLE function: void gimple_try_set_catch_is_cleanup (gimple g,
bool catch_is_cleanup)
Set the `GIMPLE_TRY_CATCH_IS_CLEANUP' flag.
-- GIMPLE function: void gimple_try_set_eval (gimple g, gimple_seq
eval)
Set `EVAL' to be the sequence of statements to use as the body for
`GIMPLE_TRY' `G'.
-- GIMPLE function: void gimple_try_set_cleanup (gimple g, gimple_seq
cleanup)
Set `CLEANUP' to be the sequence of statements to use as the
cleanup body for `GIMPLE_TRY' `G'.
File: gccint.info, Node: `GIMPLE_WITH_CLEANUP_EXPR', Prev: `GIMPLE_TRY', Up: Tuple specific accessors
12.7.28 `GIMPLE_WITH_CLEANUP_EXPR'
----------------------------------
-- GIMPLE function: gimple gimple_build_wce (gimple_seq cleanup)
Build a `GIMPLE_WITH_CLEANUP_EXPR' statement. `CLEANUP' is the
clean-up expression.
-- GIMPLE function: gimple_seq gimple_wce_cleanup (gimple g)
Return the cleanup sequence for cleanup statement `G'.
-- GIMPLE function: void gimple_wce_set_cleanup (gimple g, gimple_seq
cleanup)
Set `CLEANUP' to be the cleanup sequence for `G'.
-- GIMPLE function: bool gimple_wce_cleanup_eh_only (gimple g)
Return the `CLEANUP_EH_ONLY' flag for a `WCE' tuple.
-- GIMPLE function: void gimple_wce_set_cleanup_eh_only (gimple g,
bool eh_only_p)
Set the `CLEANUP_EH_ONLY' flag for a `WCE' tuple.
File: gccint.info, Node: GIMPLE sequences, Next: Sequence iterators, Prev: Tuple specific accessors, Up: GIMPLE
12.8 GIMPLE sequences
=====================
GIMPLE sequences are the tuple equivalent of `STATEMENT_LIST''s used in
`GENERIC'. They are used to chain statements together, and when used
in conjunction with sequence iterators, provide a framework for
iterating through statements.
GIMPLE sequences are of type struct `gimple_sequence', but are more
commonly passed by reference to functions dealing with sequences. The
type for a sequence pointer is `gimple_seq' which is the same as struct
`gimple_sequence' *. When declaring a local sequence, you can define a
local variable of type struct `gimple_sequence'. When declaring a
sequence allocated on the garbage collected heap, use the function
`gimple_seq_alloc' documented below.
There are convenience functions for iterating through sequences in the
section entitled Sequence Iterators.
Below is a list of functions to manipulate and query sequences.
-- GIMPLE function: void gimple_seq_add_stmt (gimple_seq *seq, gimple
g)
Link a gimple statement to the end of the sequence *`SEQ' if `G' is
not `NULL'. If *`SEQ' is `NULL', allocate a sequence before
linking.
-- GIMPLE function: void gimple_seq_add_seq (gimple_seq *dest,
gimple_seq src)
Append sequence `SRC' to the end of sequence *`DEST' if `SRC' is
not `NULL'. If *`DEST' is `NULL', allocate a new sequence before
appending.
-- GIMPLE function: gimple_seq gimple_seq_deep_copy (gimple_seq src)
Perform a deep copy of sequence `SRC' and return the result.
-- GIMPLE function: gimple_seq gimple_seq_reverse (gimple_seq seq)
Reverse the order of the statements in the sequence `SEQ'. Return
`SEQ'.
-- GIMPLE function: gimple gimple_seq_first (gimple_seq s)
Return the first statement in sequence `S'.
-- GIMPLE function: gimple gimple_seq_last (gimple_seq s)
Return the last statement in sequence `S'.
-- GIMPLE function: void gimple_seq_set_last (gimple_seq s, gimple
last)
Set the last statement in sequence `S' to the statement in `LAST'.
-- GIMPLE function: void gimple_seq_set_first (gimple_seq s, gimple
first)
Set the first statement in sequence `S' to the statement in
`FIRST'.
-- GIMPLE function: void gimple_seq_init (gimple_seq s)
Initialize sequence `S' to an empty sequence.
-- GIMPLE function: gimple_seq gimple_seq_alloc (void)
Allocate a new sequence in the garbage collected store and return
it.
-- GIMPLE function: void gimple_seq_copy (gimple_seq dest, gimple_seq
src)
Copy the sequence `SRC' into the sequence `DEST'.
-- GIMPLE function: bool gimple_seq_empty_p (gimple_seq s)
Return true if the sequence `S' is empty.
-- GIMPLE function: gimple_seq bb_seq (basic_block bb)
Returns the sequence of statements in `BB'.
-- GIMPLE function: void set_bb_seq (basic_block bb, gimple_seq seq)
Sets the sequence of statements in `BB' to `SEQ'.
-- GIMPLE function: bool gimple_seq_singleton_p (gimple_seq seq)
Determine whether `SEQ' contains exactly one statement.
File: gccint.info, Node: Sequence iterators, Next: Adding a new GIMPLE statement code, Prev: GIMPLE sequences, Up: GIMPLE
12.9 Sequence iterators
=======================
Sequence iterators are convenience constructs for iterating through
statements in a sequence. Given a sequence `SEQ', here is a typical
use of gimple sequence iterators:
gimple_stmt_iterator gsi;
for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple g = gsi_stmt (gsi);
/* Do something with gimple statement `G'. */
}
Backward iterations are possible:
for (gsi = gsi_last (seq); !gsi_end_p (gsi); gsi_prev (&gsi))
Forward and backward iterations on basic blocks are possible with
`gsi_start_bb' and `gsi_last_bb'.
In the documentation below we sometimes refer to enum
`gsi_iterator_update'. The valid options for this enumeration are:
* `GSI_NEW_STMT' Only valid when a single statement is added. Move
the iterator to it.
* `GSI_SAME_STMT' Leave the iterator at the same statement.
* `GSI_CONTINUE_LINKING' Move iterator to whatever position is
suitable for linking other statements in the same direction.
Below is a list of the functions used to manipulate and use statement
iterators.
-- GIMPLE function: gimple_stmt_iterator gsi_start (gimple_seq seq)
Return a new iterator pointing to the sequence `SEQ''s first
statement. If `SEQ' is empty, the iterator's basic block is
`NULL'. Use `gsi_start_bb' instead when the iterator needs to
always have the correct basic block set.
-- GIMPLE function: gimple_stmt_iterator gsi_start_bb (basic_block bb)
Return a new iterator pointing to the first statement in basic
block `BB'.
-- GIMPLE function: gimple_stmt_iterator gsi_last (gimple_seq seq)
Return a new iterator initially pointing to the last statement of
sequence `SEQ'. If `SEQ' is empty, the iterator's basic block is
`NULL'. Use `gsi_last_bb' instead when the iterator needs to
always have the correct basic block set.
-- GIMPLE function: gimple_stmt_iterator gsi_last_bb (basic_block bb)
Return a new iterator pointing to the last statement in basic
block `BB'.
-- GIMPLE function: bool gsi_end_p (gimple_stmt_iterator i)
Return `TRUE' if at the end of `I'.
-- GIMPLE function: bool gsi_one_before_end_p (gimple_stmt_iterator i)
Return `TRUE' if we're one statement before the end of `I'.
-- GIMPLE function: void gsi_next (gimple_stmt_iterator *i)
Advance the iterator to the next gimple statement.
-- GIMPLE function: void gsi_prev (gimple_stmt_iterator *i)
Advance the iterator to the previous gimple statement.
-- GIMPLE function: gimple gsi_stmt (gimple_stmt_iterator i)
Return the current stmt.
-- GIMPLE function: gimple_stmt_iterator gsi_after_labels (basic_block
bb)
Return a block statement iterator that points to the first
non-label statement in block `BB'.
-- GIMPLE function: gimple * gsi_stmt_ptr (gimple_stmt_iterator *i)
Return a pointer to the current stmt.
-- GIMPLE function: basic_block gsi_bb (gimple_stmt_iterator i)
Return the basic block associated with this iterator.
-- GIMPLE function: gimple_seq gsi_seq (gimple_stmt_iterator i)
Return the sequence associated with this iterator.
-- GIMPLE function: void gsi_remove (gimple_stmt_iterator *i, bool
remove_eh_info)
Remove the current stmt from the sequence. The iterator is
updated to point to the next statement. When `REMOVE_EH_INFO' is
true we remove the statement pointed to by iterator `I' from the
`EH' tables. Otherwise we do not modify the `EH' tables.
Generally, `REMOVE_EH_INFO' should be true when the statement is
going to be removed from the `IL' and not reinserted elsewhere.
-- GIMPLE function: void gsi_link_seq_before (gimple_stmt_iterator *i,
gimple_seq seq, enum gsi_iterator_update mode)
Links the sequence of statements `SEQ' before the statement pointed
by iterator `I'. `MODE' indicates what to do with the iterator
after insertion (see `enum gsi_iterator_update' above).
-- GIMPLE function: void gsi_link_before (gimple_stmt_iterator *i,
gimple g, enum gsi_iterator_update mode)
Links statement `G' before the statement pointed-to by iterator
`I'. Updates iterator `I' according to `MODE'.
-- GIMPLE function: void gsi_link_seq_after (gimple_stmt_iterator *i,
gimple_seq seq, enum gsi_iterator_update mode)
Links sequence `SEQ' after the statement pointed-to by iterator
`I'. `MODE' is as in `gsi_insert_after'.
-- GIMPLE function: void gsi_link_after (gimple_stmt_iterator *i,
gimple g, enum gsi_iterator_update mode)
Links statement `G' after the statement pointed-to by iterator `I'.
`MODE' is as in `gsi_insert_after'.
-- GIMPLE function: gimple_seq gsi_split_seq_after
(gimple_stmt_iterator i)
Move all statements in the sequence after `I' to a new sequence.
Return this new sequence.
-- GIMPLE function: gimple_seq gsi_split_seq_before
(gimple_stmt_iterator *i)
Move all statements in the sequence before `I' to a new sequence.
Return this new sequence.
-- GIMPLE function: void gsi_replace (gimple_stmt_iterator *i, gimple
stmt, bool update_eh_info)
Replace the statement pointed-to by `I' to `STMT'. If
`UPDATE_EH_INFO' is true, the exception handling information of
the original statement is moved to the new statement.
-- GIMPLE function: void gsi_insert_before (gimple_stmt_iterator *i,
gimple stmt, enum gsi_iterator_update mode)
Insert statement `STMT' before the statement pointed-to by iterator
`I', update `STMT''s basic block and scan it for new operands.
`MODE' specifies how to update iterator `I' after insertion (see
enum `gsi_iterator_update').
-- GIMPLE function: void gsi_insert_seq_before (gimple_stmt_iterator
*i, gimple_seq seq, enum gsi_iterator_update mode)
Like `gsi_insert_before', but for all the statements in `SEQ'.
-- GIMPLE function: void gsi_insert_after (gimple_stmt_iterator *i,
gimple stmt, enum gsi_iterator_update mode)
Insert statement `STMT' after the statement pointed-to by iterator
`I', update `STMT''s basic block and scan it for new operands.
`MODE' specifies how to update iterator `I' after insertion (see
enum `gsi_iterator_update').
-- GIMPLE function: void gsi_insert_seq_after (gimple_stmt_iterator
*i, gimple_seq seq, enum gsi_iterator_update mode)
Like `gsi_insert_after', but for all the statements in `SEQ'.
-- GIMPLE function: gimple_stmt_iterator gsi_for_stmt (gimple stmt)
Finds iterator for `STMT'.
-- GIMPLE function: void gsi_move_after (gimple_stmt_iterator *from,
gimple_stmt_iterator *to)
Move the statement at `FROM' so it comes right after the statement
at `TO'.
-- GIMPLE function: void gsi_move_before (gimple_stmt_iterator *from,
gimple_stmt_iterator *to)
Move the statement at `FROM' so it comes right before the statement
at `TO'.
-- GIMPLE function: void gsi_move_to_bb_end (gimple_stmt_iterator
*from, basic_block bb)
Move the statement at `FROM' to the end of basic block `BB'.
-- GIMPLE function: void gsi_insert_on_edge (edge e, gimple stmt)
Add `STMT' to the pending list of edge `E'. No actual insertion is
made until a call to `gsi_commit_edge_inserts'() is made.
-- GIMPLE function: void gsi_insert_seq_on_edge (edge e, gimple_seq
seq)
Add the sequence of statements in `SEQ' to the pending list of edge
`E'. No actual insertion is made until a call to
`gsi_commit_edge_inserts'() is made.
-- GIMPLE function: basic_block gsi_insert_on_edge_immediate (edge e,
gimple stmt)
Similar to `gsi_insert_on_edge'+`gsi_commit_edge_inserts'. If a
new block has to be created, it is returned.
-- GIMPLE function: void gsi_commit_one_edge_insert (edge e,
basic_block *new_bb)
Commit insertions pending at edge `E'. If a new block is created,
set `NEW_BB' to this block, otherwise set it to `NULL'.
-- GIMPLE function: void gsi_commit_edge_inserts (void)
This routine will commit all pending edge insertions, creating any
new basic blocks which are necessary.
File: gccint.info, Node: Adding a new GIMPLE statement code, Next: Statement and operand traversals, Prev: Sequence iterators, Up: GIMPLE
12.10 Adding a new GIMPLE statement code
========================================
The first step in adding a new GIMPLE statement code, is modifying the
file `gimple.def', which contains all the GIMPLE codes. Then you must
add a corresponding structure, and an entry in `union
gimple_statement_d', both of which are located in `gimple.h'. This in
turn, will require you to add a corresponding `GTY' tag in
`gsstruct.def', and code to handle this tag in `gss_for_code' which is
located in `gimple.c'.
In order for the garbage collector to know the size of the structure
you created in `gimple.h', you need to add a case to handle your new
GIMPLE statement in `gimple_size' which is located in `gimple.c'.
You will probably want to create a function to build the new gimple
statement in `gimple.c'. The function should be called
`gimple_build_NEW-TUPLE-NAME', and should return the new tuple of type
gimple.
If your new statement requires accessors for any members or operands
it may have, put simple inline accessors in `gimple.h' and any
non-trivial accessors in `gimple.c' with a corresponding prototype in
`gimple.h'.
File: gccint.info, Node: Statement and operand traversals, Prev: Adding a new GIMPLE statement code, Up: GIMPLE
12.11 Statement and operand traversals
======================================
There are two functions available for walking statements and sequences:
`walk_gimple_stmt' and `walk_gimple_seq', accordingly, and a third
function for walking the operands in a statement: `walk_gimple_op'.
-- GIMPLE function: tree walk_gimple_stmt (gimple_stmt_iterator *gsi,
walk_stmt_fn callback_stmt, walk_tree_fn callback_op, struct
walk_stmt_info *wi)
This function is used to walk the current statement in `GSI',
optionally using traversal state stored in `WI'. If `WI' is
`NULL', no state is kept during the traversal.
The callback `CALLBACK_STMT' is called. If `CALLBACK_STMT' returns
true, it means that the callback function has handled all the
operands of the statement and it is not necessary to walk its
operands.
If `CALLBACK_STMT' is `NULL' or it returns false, `CALLBACK_OP' is
called on each operand of the statement via `walk_gimple_op'. If
`walk_gimple_op' returns non-`NULL' for any operand, the remaining
operands are not scanned.
The return value is that returned by the last call to
`walk_gimple_op', or `NULL_TREE' if no `CALLBACK_OP' is specified.
-- GIMPLE function: tree walk_gimple_op (gimple stmt, walk_tree_fn
callback_op, struct walk_stmt_info *wi)
Use this function to walk the operands of statement `STMT'. Every
operand is walked via `walk_tree' with optional state information
in `WI'.
`CALLBACK_OP' is called on each operand of `STMT' via `walk_tree'.
Additional parameters to `walk_tree' must be stored in `WI'. For
each operand `OP', `walk_tree' is called as:
walk_tree (&`OP', `CALLBACK_OP', `WI', `PSET')
If `CALLBACK_OP' returns non-`NULL' for an operand, the remaining
operands are not scanned. The return value is that returned by
the last call to `walk_tree', or `NULL_TREE' if no `CALLBACK_OP' is
specified.
-- GIMPLE function: tree walk_gimple_seq (gimple_seq seq, walk_stmt_fn
callback_stmt, walk_tree_fn callback_op, struct
walk_stmt_info *wi)
This function walks all the statements in the sequence `SEQ'
calling `walk_gimple_stmt' on each one. `WI' is as in
`walk_gimple_stmt'. If `walk_gimple_stmt' returns non-`NULL', the
walk is stopped and the value returned. Otherwise, all the
statements are walked and `NULL_TREE' returned.
File: gccint.info, Node: Tree SSA, Next: RTL, Prev: GIMPLE, Up: Top
13 Analysis and Optimization of GIMPLE tuples
*********************************************
GCC uses three main intermediate languages to represent the program
during compilation: GENERIC, GIMPLE and RTL. GENERIC is a
language-independent representation generated by each front end. It is
used to serve as an interface between the parser and optimizer.
GENERIC is a common representation that is able to represent programs
written in all the languages supported by GCC.
GIMPLE and RTL are used to optimize the program. GIMPLE is used for
target and language independent optimizations (e.g., inlining, constant
propagation, tail call elimination, redundancy elimination, etc). Much
like GENERIC, GIMPLE is a language independent, tree based
representation. However, it differs from GENERIC in that the GIMPLE
grammar is more restrictive: expressions contain no more than 3
operands (except function calls), it has no control flow structures and
expressions with side-effects are only allowed on the right hand side
of assignments. See the chapter describing GENERIC and GIMPLE for more
details.
This chapter describes the data structures and functions used in the
GIMPLE optimizers (also known as "tree optimizers" or "middle end").
In particular, it focuses on all the macros, data structures, functions
and programming constructs needed to implement optimization passes for
GIMPLE.
* Menu:
* Annotations:: Attributes for variables.
* SSA Operands:: SSA names referenced by GIMPLE statements.
* SSA:: Static Single Assignment representation.
* Alias analysis:: Representing aliased loads and stores.
* Memory model:: Memory model used by the middle-end.
File: gccint.info, Node: Annotations, Next: SSA Operands, Up: Tree SSA
13.1 Annotations
================
The optimizers need to associate attributes with variables during the
optimization process. For instance, we need to know whether a variable
has aliases. All these attributes are stored in data structures called
annotations which are then linked to the field `ann' in `struct
tree_common'.
Presently, we define annotations for variables (`var_ann_t').
Annotations are defined and documented in `tree-flow.h'.
File: gccint.info, Node: SSA Operands, Next: SSA, Prev: Annotations, Up: Tree SSA
13.2 SSA Operands
=================
Almost every GIMPLE statement will contain a reference to a variable or
memory location. Since statements come in different shapes and sizes,
their operands are going to be located at various spots inside the
statement's tree. To facilitate access to the statement's operands,
they are organized into lists associated inside each statement's
annotation. Each element in an operand list is a pointer to a
`VAR_DECL', `PARM_DECL' or `SSA_NAME' tree node. This provides a very
convenient way of examining and replacing operands.
Data flow analysis and optimization is done on all tree nodes
representing variables. Any node for which `SSA_VAR_P' returns nonzero
is considered when scanning statement operands. However, not all
`SSA_VAR_P' variables are processed in the same way. For the purposes
of optimization, we need to distinguish between references to local
scalar variables and references to globals, statics, structures,
arrays, aliased variables, etc. The reason is simple, the compiler can
gather complete data flow information for a local scalar. On the other
hand, a global variable may be modified by a function call, it may not
be possible to keep track of all the elements of an array or the fields
of a structure, etc.
The operand scanner gathers two kinds of operands: "real" and
"virtual". An operand for which `is_gimple_reg' returns true is
considered real, otherwise it is a virtual operand. We also
distinguish between uses and definitions. An operand is used if its
value is loaded by the statement (e.g., the operand at the RHS of an
assignment). If the statement assigns a new value to the operand, the
operand is considered a definition (e.g., the operand at the LHS of an
assignment).
Virtual and real operands also have very different data flow
properties. Real operands are unambiguous references to the full
object that they represent. For instance, given
{
int a, b;
a = b
}
Since `a' and `b' are non-aliased locals, the statement `a = b' will
have one real definition and one real use because variable `a' is
completely modified with the contents of variable `b'. Real definition
are also known as "killing definitions". Similarly, the use of `b'
reads all its bits.
In contrast, virtual operands are used with variables that can have a
partial or ambiguous reference. This includes structures, arrays,
globals, and aliased variables. In these cases, we have two types of
definitions. For globals, structures, and arrays, we can determine from
a statement whether a variable of these types has a killing definition.
If the variable does, then the statement is marked as having a "must
definition" of that variable. However, if a statement is only defining
a part of the variable (i.e. a field in a structure), or if we know
that a statement might define the variable but we cannot say for sure,
then we mark that statement as having a "may definition". For
instance, given
{
int a, b, *p;
if (...)
p = &a;
else
p = &b;
*p = 5;
return *p;
}
The assignment `*p = 5' may be a definition of `a' or `b'. If we
cannot determine statically where `p' is pointing to at the time of the
store operation, we create virtual definitions to mark that statement
as a potential definition site for `a' and `b'. Memory loads are
similarly marked with virtual use operands. Virtual operands are shown
in tree dumps right before the statement that contains them. To
request a tree dump with virtual operands, use the `-vops' option to
`-fdump-tree':
{
int a, b, *p;
if (...)
p = &a;
else
p = &b;
# a = VDEF <a>
# b = VDEF <b>
*p = 5;
# VUSE <a>
# VUSE <b>
return *p;
}
Notice that `VDEF' operands have two copies of the referenced
variable. This indicates that this is not a killing definition of that
variable. In this case we refer to it as a "may definition" or
"aliased store". The presence of the second copy of the variable in
the `VDEF' operand will become important when the function is converted
into SSA form. This will be used to link all the non-killing
definitions to prevent optimizations from making incorrect assumptions
about them.
Operands are updated as soon as the statement is finished via a call
to `update_stmt'. If statement elements are changed via `SET_USE' or
`SET_DEF', then no further action is required (i.e., those macros take
care of updating the statement). If changes are made by manipulating
the statement's tree directly, then a call must be made to
`update_stmt' when complete. Calling one of the `bsi_insert' routines
or `bsi_replace' performs an implicit call to `update_stmt'.
13.2.1 Operand Iterators And Access Routines
--------------------------------------------
Operands are collected by `tree-ssa-operands.c'. They are stored
inside each statement's annotation and can be accessed through either
the operand iterators or an access routine.
The following access routines are available for examining operands:
1. `SINGLE_SSA_{USE,DEF,TREE}_OPERAND': These accessors will return
NULL unless there is exactly one operand matching the specified
flags. If there is exactly one operand, the operand is returned
as either a `tree', `def_operand_p', or `use_operand_p'.
tree t = SINGLE_SSA_TREE_OPERAND (stmt, flags);
use_operand_p u = SINGLE_SSA_USE_OPERAND (stmt, SSA_ALL_VIRTUAL_USES);
def_operand_p d = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_ALL_DEFS);
2. `ZERO_SSA_OPERANDS': This macro returns true if there are no
operands matching the specified flags.
if (ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
return;
3. `NUM_SSA_OPERANDS': This macro Returns the number of operands
matching 'flags'. This actually executes a loop to perform the
count, so only use this if it is really needed.
int count = NUM_SSA_OPERANDS (stmt, flags)
If you wish to iterate over some or all operands, use the
`FOR_EACH_SSA_{USE,DEF,TREE}_OPERAND' iterator. For example, to print
all the operands for a statement:
void
print_ops (tree stmt)
{
ssa_op_iter;
tree var;
FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_ALL_OPERANDS)
print_generic_expr (stderr, var, TDF_SLIM);
}
How to choose the appropriate iterator:
1. Determine whether you are need to see the operand pointers, or
just the trees, and choose the appropriate macro:
Need Macro:
---- -------
use_operand_p FOR_EACH_SSA_USE_OPERAND
def_operand_p FOR_EACH_SSA_DEF_OPERAND
tree FOR_EACH_SSA_TREE_OPERAND
2. You need to declare a variable of the type you are interested in,
and an ssa_op_iter structure which serves as the loop controlling
variable.
3. Determine which operands you wish to use, and specify the flags of
those you are interested in. They are documented in
`tree-ssa-operands.h':
#define SSA_OP_USE 0x01 /* Real USE operands. */
#define SSA_OP_DEF 0x02 /* Real DEF operands. */
#define SSA_OP_VUSE 0x04 /* VUSE operands. */
#define SSA_OP_VMAYUSE 0x08 /* USE portion of VDEFS. */
#define SSA_OP_VDEF 0x10 /* DEF portion of VDEFS. */
/* These are commonly grouped operand flags. */
#define SSA_OP_VIRTUAL_USES (SSA_OP_VUSE | SSA_OP_VMAYUSE)
#define SSA_OP_VIRTUAL_DEFS (SSA_OP_VDEF)
#define SSA_OP_ALL_USES (SSA_OP_VIRTUAL_USES | SSA_OP_USE)
#define SSA_OP_ALL_DEFS (SSA_OP_VIRTUAL_DEFS | SSA_OP_DEF)
#define SSA_OP_ALL_OPERANDS (SSA_OP_ALL_USES | SSA_OP_ALL_DEFS)
So if you want to look at the use pointers for all the `USE' and
`VUSE' operands, you would do something like:
use_operand_p use_p;
ssa_op_iter iter;
FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, (SSA_OP_USE | SSA_OP_VUSE))
{
process_use_ptr (use_p);
}
The `TREE' macro is basically the same as the `USE' and `DEF' macros,
only with the use or def dereferenced via `USE_FROM_PTR (use_p)' and
`DEF_FROM_PTR (def_p)'. Since we aren't using operand pointers, use
and defs flags can be mixed.
tree var;
ssa_op_iter iter;
FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_VUSE)
{
print_generic_expr (stderr, var, TDF_SLIM);
}
`VDEF's are broken into two flags, one for the `DEF' portion
(`SSA_OP_VDEF') and one for the USE portion (`SSA_OP_VMAYUSE'). If all
you want to look at are the `VDEF's together, there is a fourth
iterator macro for this, which returns both a def_operand_p and a
use_operand_p for each `VDEF' in the statement. Note that you don't
need any flags for this one.
use_operand_p use_p;
def_operand_p def_p;
ssa_op_iter iter;
FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
{
my_code;
}
There are many examples in the code as well, as well as the
documentation in `tree-ssa-operands.h'.
There are also a couple of variants on the stmt iterators regarding PHI
nodes.
`FOR_EACH_PHI_ARG' Works exactly like `FOR_EACH_SSA_USE_OPERAND',
except it works over `PHI' arguments instead of statement operands.
/* Look at every virtual PHI use. */
FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_VIRTUAL_USES)
{
my_code;
}
/* Look at every real PHI use. */
FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_USES)
my_code;
/* Look at every PHI use. */
FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_ALL_USES)
my_code;
`FOR_EACH_PHI_OR_STMT_{USE,DEF}' works exactly like
`FOR_EACH_SSA_{USE,DEF}_OPERAND', except it will function on either a
statement or a `PHI' node. These should be used when it is appropriate
but they are not quite as efficient as the individual `FOR_EACH_PHI'
and `FOR_EACH_SSA' routines.
FOR_EACH_PHI_OR_STMT_USE (use_operand_p, stmt, iter, flags)
{
my_code;
}
FOR_EACH_PHI_OR_STMT_DEF (def_operand_p, phi, iter, flags)
{
my_code;
}
13.2.2 Immediate Uses
---------------------
Immediate use information is now always available. Using the immediate
use iterators, you may examine every use of any `SSA_NAME'. For
instance, to change each use of `ssa_var' to `ssa_var2' and call
fold_stmt on each stmt after that is done:
use_operand_p imm_use_p;
imm_use_iterator iterator;
tree ssa_var, stmt;
FOR_EACH_IMM_USE_STMT (stmt, iterator, ssa_var)
{
FOR_EACH_IMM_USE_ON_STMT (imm_use_p, iterator)
SET_USE (imm_use_p, ssa_var_2);
fold_stmt (stmt);
}
There are 2 iterators which can be used. `FOR_EACH_IMM_USE_FAST' is
used when the immediate uses are not changed, i.e., you are looking at
the uses, but not setting them.
If they do get changed, then care must be taken that things are not
changed under the iterators, so use the `FOR_EACH_IMM_USE_STMT' and
`FOR_EACH_IMM_USE_ON_STMT' iterators. They attempt to preserve the
sanity of the use list by moving all the uses for a statement into a
controlled position, and then iterating over those uses. Then the
optimization can manipulate the stmt when all the uses have been
processed. This is a little slower than the FAST version since it adds
a placeholder element and must sort through the list a bit for each
statement. This placeholder element must be also be removed if the
loop is terminated early. The macro `BREAK_FROM_IMM_USE_SAFE' is
provided to do this :
FOR_EACH_IMM_USE_STMT (stmt, iterator, ssa_var)
{
if (stmt == last_stmt)
BREAK_FROM_SAFE_IMM_USE (iter);
FOR_EACH_IMM_USE_ON_STMT (imm_use_p, iterator)
SET_USE (imm_use_p, ssa_var_2);
fold_stmt (stmt);
}
There are checks in `verify_ssa' which verify that the immediate use
list is up to date, as well as checking that an optimization didn't
break from the loop without using this macro. It is safe to simply
'break'; from a `FOR_EACH_IMM_USE_FAST' traverse.
Some useful functions and macros:
1. `has_zero_uses (ssa_var)' : Returns true if there are no uses of
`ssa_var'.
2. `has_single_use (ssa_var)' : Returns true if there is only a
single use of `ssa_var'.
3. `single_imm_use (ssa_var, use_operand_p *ptr, tree *stmt)' :
Returns true if there is only a single use of `ssa_var', and also
returns the use pointer and statement it occurs in, in the second
and third parameters.
4. `num_imm_uses (ssa_var)' : Returns the number of immediate uses of
`ssa_var'. It is better not to use this if possible since it simply
utilizes a loop to count the uses.
5. `PHI_ARG_INDEX_FROM_USE (use_p)' : Given a use within a `PHI'
node, return the index number for the use. An assert is triggered
if the use isn't located in a `PHI' node.
6. `USE_STMT (use_p)' : Return the statement a use occurs in.
Note that uses are not put into an immediate use list until their
statement is actually inserted into the instruction stream via a
`bsi_*' routine.
It is also still possible to utilize lazy updating of statements, but
this should be used only when absolutely required. Both alias analysis
and the dominator optimizations currently do this.
When lazy updating is being used, the immediate use information is out
of date and cannot be used reliably. Lazy updating is achieved by
simply marking statements modified via calls to `mark_stmt_modified'
instead of `update_stmt'. When lazy updating is no longer required,
all the modified statements must have `update_stmt' called in order to
bring them up to date. This must be done before the optimization is
finished, or `verify_ssa' will trigger an abort.
This is done with a simple loop over the instruction stream:
block_stmt_iterator bsi;
basic_block bb;
FOR_EACH_BB (bb)
{
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
update_stmt_if_modified (bsi_stmt (bsi));
}
File: gccint.info, Node: SSA, Next: Alias analysis, Prev: SSA Operands, Up: Tree SSA
13.3 Static Single Assignment
=============================
Most of the tree optimizers rely on the data flow information provided
by the Static Single Assignment (SSA) form. We implement the SSA form
as described in `R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and K.
Zadeck. Efficiently Computing Static Single Assignment Form and the
Control Dependence Graph. ACM Transactions on Programming Languages
and Systems, 13(4):451-490, October 1991'.
The SSA form is based on the premise that program variables are
assigned in exactly one location in the program. Multiple assignments
to the same variable create new versions of that variable. Naturally,
actual programs are seldom in SSA form initially because variables tend
to be assigned multiple times. The compiler modifies the program
representation so that every time a variable is assigned in the code, a
new version of the variable is created. Different versions of the same
variable are distinguished by subscripting the variable name with its
version number. Variables used in the right-hand side of expressions
are renamed so that their version number matches that of the most
recent assignment.
We represent variable versions using `SSA_NAME' nodes. The renaming
process in `tree-ssa.c' wraps every real and virtual operand with an
`SSA_NAME' node which contains the version number and the statement
that created the `SSA_NAME'. Only definitions and virtual definitions
may create new `SSA_NAME' nodes.
Sometimes, flow of control makes it impossible to determine the most
recent version of a variable. In these cases, the compiler inserts an
artificial definition for that variable called "PHI function" or "PHI
node". This new definition merges all the incoming versions of the
variable to create a new name for it. For instance,
if (...)
a_1 = 5;
else if (...)
a_2 = 2;
else
a_3 = 13;
# a_4 = PHI <a_1, a_2, a_3>
return a_4;
Since it is not possible to determine which of the three branches will
be taken at runtime, we don't know which of `a_1', `a_2' or `a_3' to
use at the return statement. So, the SSA renamer creates a new version
`a_4' which is assigned the result of "merging" `a_1', `a_2' and `a_3'.
Hence, PHI nodes mean "one of these operands. I don't know which".
The following macros can be used to examine PHI nodes
-- Macro: PHI_RESULT (PHI)
Returns the `SSA_NAME' created by PHI node PHI (i.e., PHI's LHS).
-- Macro: PHI_NUM_ARGS (PHI)
Returns the number of arguments in PHI. This number is exactly
the number of incoming edges to the basic block holding PHI.
-- Macro: PHI_ARG_ELT (PHI, I)
Returns a tuple representing the Ith argument of PHI. Each
element of this tuple contains an `SSA_NAME' VAR and the incoming
edge through which VAR flows.
-- Macro: PHI_ARG_EDGE (PHI, I)
Returns the incoming edge for the Ith argument of PHI.
-- Macro: PHI_ARG_DEF (PHI, I)
Returns the `SSA_NAME' for the Ith argument of PHI.
13.3.1 Preserving the SSA form
------------------------------
Some optimization passes make changes to the function that invalidate
the SSA property. This can happen when a pass has added new symbols or
changed the program so that variables that were previously aliased
aren't anymore. Whenever something like this happens, the affected
symbols must be renamed into SSA form again. Transformations that emit
new code or replicate existing statements will also need to update the
SSA form.
Since GCC implements two different SSA forms for register and virtual
variables, keeping the SSA form up to date depends on whether you are
updating register or virtual names. In both cases, the general idea
behind incremental SSA updates is similar: when new SSA names are
created, they typically are meant to replace other existing names in
the program.
For instance, given the following code:
1 L0:
2 x_1 = PHI (0, x_5)
3 if (x_1 < 10)
4 if (x_1 > 7)
5 y_2 = 0
6 else
7 y_3 = x_1 + x_7
8 endif
9 x_5 = x_1 + 1
10 goto L0;
11 endif
Suppose that we insert new names `x_10' and `x_11' (lines `4' and `8').
1 L0:
2 x_1 = PHI (0, x_5)
3 if (x_1 < 10)
4 x_10 = ...
5 if (x_1 > 7)
6 y_2 = 0
7 else
8 x_11 = ...
9 y_3 = x_1 + x_7
10 endif
11 x_5 = x_1 + 1
12 goto L0;
13 endif
We want to replace all the uses of `x_1' with the new definitions of
`x_10' and `x_11'. Note that the only uses that should be replaced are
those at lines `5', `9' and `11'. Also, the use of `x_7' at line `9'
should _not_ be replaced (this is why we cannot just mark symbol `x' for
renaming).
Additionally, we may need to insert a PHI node at line `11' because
that is a merge point for `x_10' and `x_11'. So the use of `x_1' at
line `11' will be replaced with the new PHI node. The insertion of PHI
nodes is optional. They are not strictly necessary to preserve the SSA
form, and depending on what the caller inserted, they may not even be
useful for the optimizers.
Updating the SSA form is a two step process. First, the pass has to
identify which names need to be updated and/or which symbols need to be
renamed into SSA form for the first time. When new names are
introduced to replace existing names in the program, the mapping
between the old and the new names are registered by calling
`register_new_name_mapping' (note that if your pass creates new code by
duplicating basic blocks, the call to `tree_duplicate_bb' will set up
the necessary mappings automatically). On the other hand, if your pass
exposes a new symbol that should be put in SSA form for the first time,
the new symbol should be registered with `mark_sym_for_renaming'.
After the replacement mappings have been registered and new symbols
marked for renaming, a call to `update_ssa' makes the registered
changes. This can be done with an explicit call or by creating `TODO'
flags in the `tree_opt_pass' structure for your pass. There are
several `TODO' flags that control the behavior of `update_ssa':
* `TODO_update_ssa'. Update the SSA form inserting PHI nodes for
newly exposed symbols and virtual names marked for updating. When
updating real names, only insert PHI nodes for a real name `O_j'
in blocks reached by all the new and old definitions for `O_j'.
If the iterated dominance frontier for `O_j' is not pruned, we may
end up inserting PHI nodes in blocks that have one or more edges
with no incoming definition for `O_j'. This would lead to
uninitialized warnings for `O_j''s symbol.
* `TODO_update_ssa_no_phi'. Update the SSA form without inserting
any new PHI nodes at all. This is used by passes that have either
inserted all the PHI nodes themselves or passes that need only to
patch use-def and def-def chains for virtuals (e.g., DCE).
* `TODO_update_ssa_full_phi'. Insert PHI nodes everywhere they are
needed. No pruning of the IDF is done. This is used by passes
that need the PHI nodes for `O_j' even if it means that some
arguments will come from the default definition of `O_j''s symbol
(e.g., `pass_linear_transform').
WARNING: If you need to use this flag, chances are that your pass
may be doing something wrong. Inserting PHI nodes for an old name
where not all edges carry a new replacement may lead to silent
codegen errors or spurious uninitialized warnings.
* `TODO_update_ssa_only_virtuals'. Passes that update the SSA form
on their own may want to delegate the updating of virtual names to
the generic updater. Since FUD chains are easier to maintain,
this simplifies the work they need to do. NOTE: If this flag is
used, any OLD->NEW mappings for real names are explicitly
destroyed and only the symbols marked for renaming are processed.
13.3.2 Preserving the virtual SSA form
--------------------------------------
The virtual SSA form is harder to preserve than the non-virtual SSA form
mainly because the set of virtual operands for a statement may change at
what some would consider unexpected times. In general, statement
modifications should be bracketed between calls to `push_stmt_changes'
and `pop_stmt_changes'. For example,
munge_stmt (tree stmt)
{
push_stmt_changes (&stmt);
... rewrite STMT ...
pop_stmt_changes (&stmt);
}
The call to `push_stmt_changes' saves the current state of the
statement operands and the call to `pop_stmt_changes' compares the
saved state with the current one and does the appropriate symbol
marking for the SSA renamer.
It is possible to modify several statements at a time, provided that
`push_stmt_changes' and `pop_stmt_changes' are called in LIFO order, as
when processing a stack of statements.
Additionally, if the pass discovers that it did not need to make
changes to the statement after calling `push_stmt_changes', it can
simply discard the topmost change buffer by calling
`discard_stmt_changes'. This will avoid the expensive operand re-scan
operation and the buffer comparison that determines if symbols need to
be marked for renaming.
13.3.3 Examining `SSA_NAME' nodes
---------------------------------
The following macros can be used to examine `SSA_NAME' nodes
-- Macro: SSA_NAME_DEF_STMT (VAR)
Returns the statement S that creates the `SSA_NAME' VAR. If S is
an empty statement (i.e., `IS_EMPTY_STMT (S)' returns `true'), it
means that the first reference to this variable is a USE or a VUSE.
-- Macro: SSA_NAME_VERSION (VAR)
Returns the version number of the `SSA_NAME' object VAR.
13.3.4 Walking use-def chains
-----------------------------
-- Tree SSA function: void walk_use_def_chains (VAR, FN, DATA)
Walks use-def chains starting at the `SSA_NAME' node VAR. Calls
function FN at each reaching definition found. Function FN takes
three arguments: VAR, its defining statement (DEF_STMT) and a
generic pointer to whatever state information that FN may want to
maintain (DATA). Function FN is able to stop the walk by
returning `true', otherwise in order to continue the walk, FN
should return `false'.
Note, that if DEF_STMT is a `PHI' node, the semantics are slightly
different. For each argument ARG of the PHI node, this function
will:
1. Walk the use-def chains for ARG.
2. Call `FN (ARG, PHI, DATA)'.
Note how the first argument to FN is no longer the original
variable VAR, but the PHI argument currently being examined. If
FN wants to get at VAR, it should call `PHI_RESULT' (PHI).
13.3.5 Walking the dominator tree
---------------------------------
-- Tree SSA function: void walk_dominator_tree (WALK_DATA, BB)
This function walks the dominator tree for the current CFG calling
a set of callback functions defined in STRUCT DOM_WALK_DATA in
`domwalk.h'. The call back functions you need to define give you
hooks to execute custom code at various points during traversal:
1. Once to initialize any local data needed while processing BB
and its children. This local data is pushed into an internal
stack which is automatically pushed and popped as the walker
traverses the dominator tree.
2. Once before traversing all the statements in the BB.
3. Once for every statement inside BB.
4. Once after traversing all the statements and before recursing
into BB's dominator children.
5. It then recurses into all the dominator children of BB.
6. After recursing into all the dominator children of BB it can,
optionally, traverse every statement in BB again (i.e.,
repeating steps 2 and 3).
7. Once after walking the statements in BB and BB's dominator
children. At this stage, the block local data stack is
popped.
File: gccint.info, Node: Alias analysis, Next: Memory model, Prev: SSA, Up: Tree SSA
13.4 Alias analysis
===================
Alias analysis in GIMPLE SSA form consists of two pieces. First the
virtual SSA web ties conflicting memory accesses and provides a SSA
use-def chain and SSA immediate-use chains for walking possibly
dependent memory accesses. Second an alias-oracle can be queried to
disambiguate explicit and implicit memory references.
1. Memory SSA form.
All statements that may use memory have exactly one accompanied
use of a virtual SSA name that represents the state of memory at
the given point in the IL.
All statements that may define memory have exactly one accompanied
definition of a virtual SSA name using the previous state of memory
and defining the new state of memory after the given point in the
IL.
int i;
int foo (void)
{
# .MEM_3 = VDEF <.MEM_2(D)>
i = 1;
# VUSE <.MEM_3>
return i;
}
The virtual SSA names in this case are `.MEM_2(D)' and `.MEM_3'.
The store to the global variable `i' defines `.MEM_3' invalidating
`.MEM_2(D)'. The load from `i' uses that new state `.MEM_3'.
The virtual SSA web serves as constraints to SSA optimizers
preventing illegitimate code-motion and optimization. It also
provides a way to walk related memory statements.
2. Points-to and escape analysis.
Points-to analysis builds a set of constraints from the GIMPLE SSA
IL representing all pointer operations and facts we do or do not
know about pointers. Solving this set of constraints yields a
conservatively correct solution for each pointer variable in the
program (though we are only interested in SSA name pointers) as to
what it may possibly point to.
This points-to solution for a given SSA name pointer is stored in
the `pt_solution' sub-structure of the `SSA_NAME_PTR_INFO' record.
The following accessor functions are available:
* `pt_solution_includes'
* `pt_solutions_intersect'
Points-to analysis also computes the solution for two special set
of pointers, `ESCAPED' and `CALLUSED'. Those represent all memory
that has escaped the scope of analysis or that is used by pure or
nested const calls.
3. Type-based alias analysis
Type-based alias analysis is frontend dependent though generic
support is provided by the middle-end in `alias.c'. TBAA code is
used by both tree optimizers and RTL optimizers.
Every language that wishes to perform language-specific alias
analysis should define a function that computes, given a `tree'
node, an alias set for the node. Nodes in different alias sets
are not allowed to alias. For an example, see the C front-end
function `c_get_alias_set'.
4. Tree alias-oracle
The tree alias-oracle provides means to disambiguate two memory
references and memory references against statements. The following
queries are available:
* `refs_may_alias_p'
* `ref_maybe_used_by_stmt_p'
* `stmt_may_clobber_ref_p'
In addition to those two kind of statement walkers are available
walking statements related to a reference ref.
`walk_non_aliased_vuses' walks over dominating memory defining
statements and calls back if the statement does not clobber ref
providing the non-aliased VUSE. The walk stops at the first
clobbering statement or if asked to. `walk_aliased_vdefs' walks
over dominating memory defining statements and calls back on each
statement clobbering ref providing its aliasing VDEF. The walk
stops if asked to.
File: gccint.info, Node: Memory model, Prev: Alias analysis, Up: Tree SSA
13.5 Memory model
=================
The memory model used by the middle-end models that of the C/C++
languages. The middle-end has the notion of an effective type of a
memory region which is used for type-based alias analysis.
The following is a refinement of ISO C99 6.5/6, clarifying the block
copy case to follow common sense and extending the concept of a dynamic
effective type to objects with a declared type as required for C++.
The effective type of an object for an access to its stored value is
the declared type of the object or the effective type determined by
a previous store to it. If a value is stored into an object through
an lvalue having a type that is not a character type, then the
type of the lvalue becomes the effective type of the object for that
access and for subsequent accesses that do not modify the stored value.
If a value is copied into an object using `memcpy' or `memmove',
or is copied as an array of character type, then the effective type
of the modified object for that access and for subsequent accesses that
do not modify the value is undetermined. For all other accesses to an
object, the effective type of the object is simply the type of the
lvalue used for the access.
File: gccint.info, Node: Loop Analysis and Representation, Next: Machine Desc, Prev: Control Flow, Up: Top
14 Analysis and Representation of Loops
***************************************
GCC provides extensive infrastructure for work with natural loops, i.e.,
strongly connected components of CFG with only one entry block. This
chapter describes representation of loops in GCC, both on GIMPLE and in
RTL, as well as the interfaces to loop-related analyses (induction
variable analysis and number of iterations analysis).
* Menu:
* Loop representation:: Representation and analysis of loops.
* Loop querying:: Getting information about loops.
* Loop manipulation:: Loop manipulation functions.
* LCSSA:: Loop-closed SSA form.
* Scalar evolutions:: Induction variables on GIMPLE.
* loop-iv:: Induction variables on RTL.
* Number of iterations:: Number of iterations analysis.
* Dependency analysis:: Data dependency analysis.
* Lambda:: Linear loop transformations framework.
* Omega:: A solver for linear programming problems.
File: gccint.info, Node: Loop representation, Next: Loop querying, Up: Loop Analysis and Representation
14.1 Loop representation
========================
This chapter describes the representation of loops in GCC, and functions
that can be used to build, modify and analyze this representation. Most
of the interfaces and data structures are declared in `cfgloop.h'. At
the moment, loop structures are analyzed and this information is
updated only by the optimization passes that deal with loops, but some
efforts are being made to make it available throughout most of the
optimization passes.
In general, a natural loop has one entry block (header) and possibly
several back edges (latches) leading to the header from the inside of
the loop. Loops with several latches may appear if several loops share
a single header, or if there is a branching in the middle of the loop.
The representation of loops in GCC however allows only loops with a
single latch. During loop analysis, headers of such loops are split and
forwarder blocks are created in order to disambiguate their structures.
Heuristic based on profile information and structure of the induction
variables in the loops is used to determine whether the latches
correspond to sub-loops or to control flow in a single loop. This means
that the analysis sometimes changes the CFG, and if you run it in the
middle of an optimization pass, you must be able to deal with the new
blocks. You may avoid CFG changes by passing
`LOOPS_MAY_HAVE_MULTIPLE_LATCHES' flag to the loop discovery, note
however that most other loop manipulation functions will not work
correctly for loops with multiple latch edges (the functions that only
query membership of blocks to loops and subloop relationships, or
enumerate and test loop exits, can be expected to work).
Body of the loop is the set of blocks that are dominated by its header,
and reachable from its latch against the direction of edges in CFG. The
loops are organized in a containment hierarchy (tree) such that all the
loops immediately contained inside loop L are the children of L in the
tree. This tree is represented by the `struct loops' structure. The
root of this tree is a fake loop that contains all blocks in the
function. Each of the loops is represented in a `struct loop'
structure. Each loop is assigned an index (`num' field of the `struct
loop' structure), and the pointer to the loop is stored in the
corresponding field of the `larray' vector in the loops structure. The
indices do not have to be continuous, there may be empty (`NULL')
entries in the `larray' created by deleting loops. Also, there is no
guarantee on the relative order of a loop and its subloops in the
numbering. The index of a loop never changes.
The entries of the `larray' field should not be accessed directly.
The function `get_loop' returns the loop description for a loop with
the given index. `number_of_loops' function returns number of loops in
the function. To traverse all loops, use `FOR_EACH_LOOP' macro. The
`flags' argument of the macro is used to determine the direction of
traversal and the set of loops visited. Each loop is guaranteed to be
visited exactly once, regardless of the changes to the loop tree, and
the loops may be removed during the traversal. The newly created loops
are never traversed, if they need to be visited, this must be done
separately after their creation. The `FOR_EACH_LOOP' macro allocates
temporary variables. If the `FOR_EACH_LOOP' loop were ended using
break or goto, they would not be released; `FOR_EACH_LOOP_BREAK' macro
must be used instead.
Each basic block contains the reference to the innermost loop it
belongs to (`loop_father'). For this reason, it is only possible to
have one `struct loops' structure initialized at the same time for each
CFG. The global variable `current_loops' contains the `struct loops'
structure. Many of the loop manipulation functions assume that
dominance information is up-to-date.
The loops are analyzed through `loop_optimizer_init' function. The
argument of this function is a set of flags represented in an integer
bitmask. These flags specify what other properties of the loop
structures should be calculated/enforced and preserved later:
* `LOOPS_MAY_HAVE_MULTIPLE_LATCHES': If this flag is set, no changes
to CFG will be performed in the loop analysis, in particular,
loops with multiple latch edges will not be disambiguated. If a
loop has multiple latches, its latch block is set to NULL. Most of
the loop manipulation functions will not work for loops in this
shape. No other flags that require CFG changes can be passed to
loop_optimizer_init.
* `LOOPS_HAVE_PREHEADERS': Forwarder blocks are created in such a
way that each loop has only one entry edge, and additionally, the
source block of this entry edge has only one successor. This
creates a natural place where the code can be moved out of the
loop, and ensures that the entry edge of the loop leads from its
immediate super-loop.
* `LOOPS_HAVE_SIMPLE_LATCHES': Forwarder blocks are created to force
the latch block of each loop to have only one successor. This
ensures that the latch of the loop does not belong to any of its
sub-loops, and makes manipulation with the loops significantly
easier. Most of the loop manipulation functions assume that the
loops are in this shape. Note that with this flag, the "normal"
loop without any control flow inside and with one exit consists of
two basic blocks.
* `LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS': Basic blocks and edges in
the strongly connected components that are not natural loops (have
more than one entry block) are marked with `BB_IRREDUCIBLE_LOOP'
and `EDGE_IRREDUCIBLE_LOOP' flags. The flag is not set for blocks
and edges that belong to natural loops that are in such an
irreducible region (but it is set for the entry and exit edges of
such a loop, if they lead to/from this region).
* `LOOPS_HAVE_RECORDED_EXITS': The lists of exits are recorded and
updated for each loop. This makes some functions (e.g.,
`get_loop_exit_edges') more efficient. Some functions (e.g.,
`single_exit') can be used only if the lists of exits are recorded.
These properties may also be computed/enforced later, using functions
`create_preheaders', `force_single_succ_latches',
`mark_irreducible_loops' and `record_loop_exits'.
The memory occupied by the loops structures should be freed with
`loop_optimizer_finalize' function.
The CFG manipulation functions in general do not update loop
structures. Specialized versions that additionally do so are provided
for the most common tasks. On GIMPLE, `cleanup_tree_cfg_loop' function
can be used to cleanup CFG while updating the loops structures if
`current_loops' is set.
File: gccint.info, Node: Loop querying, Next: Loop manipulation, Prev: Loop representation, Up: Loop Analysis and Representation
14.2 Loop querying
==================
The functions to query the information about loops are declared in
`cfgloop.h'. Some of the information can be taken directly from the
structures. `loop_father' field of each basic block contains the
innermost loop to that the block belongs. The most useful fields of
loop structure (that are kept up-to-date at all times) are:
* `header', `latch': Header and latch basic blocks of the loop.
* `num_nodes': Number of basic blocks in the loop (including the
basic blocks of the sub-loops).
* `depth': The depth of the loop in the loops tree, i.e., the number
of super-loops of the loop.
* `outer', `inner', `next': The super-loop, the first sub-loop, and
the sibling of the loop in the loops tree.
There are other fields in the loop structures, many of them used only
by some of the passes, or not updated during CFG changes; in general,
they should not be accessed directly.
The most important functions to query loop structures are:
* `flow_loops_dump': Dumps the information about loops to a file.
* `verify_loop_structure': Checks consistency of the loop structures.
* `loop_latch_edge': Returns the latch edge of a loop.
* `loop_preheader_edge': If loops have preheaders, returns the
preheader edge of a loop.
* `flow_loop_nested_p': Tests whether loop is a sub-loop of another
loop.
* `flow_bb_inside_loop_p': Tests whether a basic block belongs to a
loop (including its sub-loops).
* `find_common_loop': Finds the common super-loop of two loops.
* `superloop_at_depth': Returns the super-loop of a loop with the
given depth.
* `tree_num_loop_insns', `num_loop_insns': Estimates the number of
insns in the loop, on GIMPLE and on RTL.
* `loop_exit_edge_p': Tests whether edge is an exit from a loop.
* `mark_loop_exit_edges': Marks all exit edges of all loops with
`EDGE_LOOP_EXIT' flag.
* `get_loop_body', `get_loop_body_in_dom_order',
`get_loop_body_in_bfs_order': Enumerates the basic blocks in the
loop in depth-first search order in reversed CFG, ordered by
dominance relation, and breath-first search order, respectively.
* `single_exit': Returns the single exit edge of the loop, or `NULL'
if the loop has more than one exit. You can only use this
function if LOOPS_HAVE_MARKED_SINGLE_EXITS property is used.
* `get_loop_exit_edges': Enumerates the exit edges of a loop.
* `just_once_each_iteration_p': Returns true if the basic block is
executed exactly once during each iteration of a loop (that is, it
does not belong to a sub-loop, and it dominates the latch of the
loop).
File: gccint.info, Node: Loop manipulation, Next: LCSSA, Prev: Loop querying, Up: Loop Analysis and Representation
14.3 Loop manipulation
======================
The loops tree can be manipulated using the following functions:
* `flow_loop_tree_node_add': Adds a node to the tree.
* `flow_loop_tree_node_remove': Removes a node from the tree.
* `add_bb_to_loop': Adds a basic block to a loop.
* `remove_bb_from_loops': Removes a basic block from loops.
Most low-level CFG functions update loops automatically. The following
functions handle some more complicated cases of CFG manipulations:
* `remove_path': Removes an edge and all blocks it dominates.
* `split_loop_exit_edge': Splits exit edge of the loop, ensuring
that PHI node arguments remain in the loop (this ensures that
loop-closed SSA form is preserved). Only useful on GIMPLE.
Finally, there are some higher-level loop transformations implemented.
While some of them are written so that they should work on non-innermost
loops, they are mostly untested in that case, and at the moment, they
are only reliable for the innermost loops:
* `create_iv': Creates a new induction variable. Only works on
GIMPLE. `standard_iv_increment_position' can be used to find a
suitable place for the iv increment.
* `duplicate_loop_to_header_edge',
`tree_duplicate_loop_to_header_edge': These functions (on RTL and
on GIMPLE) duplicate the body of the loop prescribed number of
times on one of the edges entering loop header, thus performing
either loop unrolling or loop peeling. `can_duplicate_loop_p'
(`can_unroll_loop_p' on GIMPLE) must be true for the duplicated
loop.
* `loop_version', `tree_ssa_loop_version': These function create a
copy of a loop, and a branch before them that selects one of them
depending on the prescribed condition. This is useful for
optimizations that need to verify some assumptions in runtime (one
of the copies of the loop is usually left unchanged, while the
other one is transformed in some way).
* `tree_unroll_loop': Unrolls the loop, including peeling the extra
iterations to make the number of iterations divisible by unroll
factor, updating the exit condition, and removing the exits that
now cannot be taken. Works only on GIMPLE.
File: gccint.info, Node: LCSSA, Next: Scalar evolutions, Prev: Loop manipulation, Up: Loop Analysis and Representation
14.4 Loop-closed SSA form
=========================
Throughout the loop optimizations on tree level, one extra condition is
enforced on the SSA form: No SSA name is used outside of the loop in
that it is defined. The SSA form satisfying this condition is called
"loop-closed SSA form" - LCSSA. To enforce LCSSA, PHI nodes must be
created at the exits of the loops for the SSA names that are used
outside of them. Only the real operands (not virtual SSA names) are
held in LCSSA, in order to save memory.
There are various benefits of LCSSA:
* Many optimizations (value range analysis, final value replacement)
are interested in the values that are defined in the loop and used
outside of it, i.e., exactly those for that we create new PHI
nodes.
* In induction variable analysis, it is not necessary to specify the
loop in that the analysis should be performed - the scalar
evolution analysis always returns the results with respect to the
loop in that the SSA name is defined.
* It makes updating of SSA form during loop transformations simpler.
Without LCSSA, operations like loop unrolling may force creation
of PHI nodes arbitrarily far from the loop, while in LCSSA, the
SSA form can be updated locally. However, since we only keep real
operands in LCSSA, we cannot use this advantage (we could have
local updating of real operands, but it is not much more efficient
than to use generic SSA form updating for it as well; the amount
of changes to SSA is the same).
However, it also means LCSSA must be updated. This is usually
straightforward, unless you create a new value in loop and use it
outside, or unless you manipulate loop exit edges (functions are
provided to make these manipulations simple).
`rewrite_into_loop_closed_ssa' is used to rewrite SSA form to LCSSA,
and `verify_loop_closed_ssa' to check that the invariant of LCSSA is
preserved.
File: gccint.info, Node: Scalar evolutions, Next: loop-iv, Prev: LCSSA, Up: Loop Analysis and Representation
14.5 Scalar evolutions
======================
Scalar evolutions (SCEV) are used to represent results of induction
variable analysis on GIMPLE. They enable us to represent variables with
complicated behavior in a simple and consistent way (we only use it to
express values of polynomial induction variables, but it is possible to
extend it). The interfaces to SCEV analysis are declared in
`tree-scalar-evolution.h'. To use scalar evolutions analysis,
`scev_initialize' must be used. To stop using SCEV, `scev_finalize'
should be used. SCEV analysis caches results in order to save time and
memory. This cache however is made invalid by most of the loop
transformations, including removal of code. If such a transformation
is performed, `scev_reset' must be called to clean the caches.
Given an SSA name, its behavior in loops can be analyzed using the
`analyze_scalar_evolution' function. The returned SCEV however does
not have to be fully analyzed and it may contain references to other
SSA names defined in the loop. To resolve these (potentially
recursive) references, `instantiate_parameters' or `resolve_mixers'
functions must be used. `instantiate_parameters' is useful when you
use the results of SCEV only for some analysis, and when you work with
whole nest of loops at once. It will try replacing all SSA names by
their SCEV in all loops, including the super-loops of the current loop,
thus providing a complete information about the behavior of the
variable in the loop nest. `resolve_mixers' is useful if you work with
only one loop at a time, and if you possibly need to create code based
on the value of the induction variable. It will only resolve the SSA
names defined in the current loop, leaving the SSA names defined
outside unchanged, even if their evolution in the outer loops is known.
The SCEV is a normal tree expression, except for the fact that it may
contain several special tree nodes. One of them is `SCEV_NOT_KNOWN',
used for SSA names whose value cannot be expressed. The other one is
`POLYNOMIAL_CHREC'. Polynomial chrec has three arguments - base, step
and loop (both base and step may contain further polynomial chrecs).
Type of the expression and of base and step must be the same. A
variable has evolution `POLYNOMIAL_CHREC(base, step, loop)' if it is
(in the specified loop) equivalent to `x_1' in the following example
while (...)
{
x_1 = phi (base, x_2);
x_2 = x_1 + step;
}
Note that this includes the language restrictions on the operations.
For example, if we compile C code and `x' has signed type, then the
overflow in addition would cause undefined behavior, and we may assume
that this does not happen. Hence, the value with this SCEV cannot
overflow (which restricts the number of iterations of such a loop).
In many cases, one wants to restrict the attention just to affine
induction variables. In this case, the extra expressive power of SCEV
is not useful, and may complicate the optimizations. In this case,
`simple_iv' function may be used to analyze a value - the result is a
loop-invariant base and step.
File: gccint.info, Node: loop-iv, Next: Number of iterations, Prev: Scalar evolutions, Up: Loop Analysis and Representation
14.6 IV analysis on RTL
=======================
The induction variable on RTL is simple and only allows analysis of
affine induction variables, and only in one loop at once. The interface
is declared in `cfgloop.h'. Before analyzing induction variables in a
loop L, `iv_analysis_loop_init' function must be called on L. After
the analysis (possibly calling `iv_analysis_loop_init' for several
loops) is finished, `iv_analysis_done' should be called. The following
functions can be used to access the results of the analysis:
* `iv_analyze': Analyzes a single register used in the given insn.
If no use of the register in this insn is found, the following
insns are scanned, so that this function can be called on the insn
returned by get_condition.
* `iv_analyze_result': Analyzes result of the assignment in the
given insn.
* `iv_analyze_expr': Analyzes a more complicated expression. All
its operands are analyzed by `iv_analyze', and hence they must be
used in the specified insn or one of the following insns.
The description of the induction variable is provided in `struct
rtx_iv'. In order to handle subregs, the representation is a bit
complicated; if the value of the `extend' field is not `UNKNOWN', the
value of the induction variable in the i-th iteration is
delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)),
with the following exception: if `first_special' is true, then the
value in the first iteration (when `i' is zero) is `delta + mult *
base'. However, if `extend' is equal to `UNKNOWN', then
`first_special' must be false, `delta' 0, `mult' 1 and the value in the
i-th iteration is
subreg_{mode} (base + i * step)
The function `get_iv_value' can be used to perform these calculations.
File: gccint.info, Node: Number of iterations, Next: Dependency analysis, Prev: loop-iv, Up: Loop Analysis and Representation
14.7 Number of iterations analysis
==================================
Both on GIMPLE and on RTL, there are functions available to determine
the number of iterations of a loop, with a similar interface. The
number of iterations of a loop in GCC is defined as the number of
executions of the loop latch. In many cases, it is not possible to
determine the number of iterations unconditionally - the determined
number is correct only if some assumptions are satisfied. The analysis
tries to verify these conditions using the information contained in the
program; if it fails, the conditions are returned together with the
result. The following information and conditions are provided by the
analysis:
* `assumptions': If this condition is false, the rest of the
information is invalid.
* `noloop_assumptions' on RTL, `may_be_zero' on GIMPLE: If this
condition is true, the loop exits in the first iteration.
* `infinite': If this condition is true, the loop is infinite. This
condition is only available on RTL. On GIMPLE, conditions for
finiteness of the loop are included in `assumptions'.
* `niter_expr' on RTL, `niter' on GIMPLE: The expression that gives
number of iterations. The number of iterations is defined as the
number of executions of the loop latch.
Both on GIMPLE and on RTL, it necessary for the induction variable
analysis framework to be initialized (SCEV on GIMPLE, loop-iv on RTL).
On GIMPLE, the results are stored to `struct tree_niter_desc'
structure. Number of iterations before the loop is exited through a
given exit can be determined using `number_of_iterations_exit'
function. On RTL, the results are returned in `struct niter_desc'
structure. The corresponding function is named `check_simple_exit'.
There are also functions that pass through all the exits of a loop and
try to find one with easy to determine number of iterations -
`find_loop_niter' on GIMPLE and `find_simple_exit' on RTL. Finally,
there are functions that provide the same information, but additionally
cache it, so that repeated calls to number of iterations are not so
costly - `number_of_latch_executions' on GIMPLE and
`get_simple_loop_desc' on RTL.
Note that some of these functions may behave slightly differently than
others - some of them return only the expression for the number of
iterations, and fail if there are some assumptions. The function
`number_of_latch_executions' works only for single-exit loops. The
function `number_of_cond_exit_executions' can be used to determine
number of executions of the exit condition of a single-exit loop (i.e.,
the `number_of_latch_executions' increased by one).
File: gccint.info, Node: Dependency analysis, Next: Lambda, Prev: Number of iterations, Up: Loop Analysis and Representation
14.8 Data Dependency Analysis
=============================
The code for the data dependence analysis can be found in
`tree-data-ref.c' and its interface and data structures are described
in `tree-data-ref.h'. The function that computes the data dependences
for all the array and pointer references for a given loop is
`compute_data_dependences_for_loop'. This function is currently used
by the linear loop transform and the vectorization passes. Before
calling this function, one has to allocate two vectors: a first vector
will contain the set of data references that are contained in the
analyzed loop body, and the second vector will contain the dependence
relations between the data references. Thus if the vector of data
references is of size `n', the vector containing the dependence
relations will contain `n*n' elements. However if the analyzed loop
contains side effects, such as calls that potentially can interfere
with the data references in the current analyzed loop, the analysis
stops while scanning the loop body for data references, and inserts a
single `chrec_dont_know' in the dependence relation array.
The data references are discovered in a particular order during the
scanning of the loop body: the loop body is analyzed in execution order,
and the data references of each statement are pushed at the end of the
data reference array. Two data references syntactically occur in the
program in the same order as in the array of data references. This
syntactic order is important in some classical data dependence tests,
and mapping this order to the elements of this array avoids costly
queries to the loop body representation.
Three types of data references are currently handled: ARRAY_REF,
INDIRECT_REF and COMPONENT_REF. The data structure for the data
reference is `data_reference', where `data_reference_p' is a name of a
pointer to the data reference structure. The structure contains the
following elements:
* `base_object_info': Provides information about the base object of
the data reference and its access functions. These access functions
represent the evolution of the data reference in the loop relative
to its base, in keeping with the classical meaning of the data
reference access function for the support of arrays. For example,
for a reference `a.b[i][j]', the base object is `a.b' and the
access functions, one for each array subscript, are: `{i_init, +
i_step}_1, {j_init, +, j_step}_2'.
* `first_location_in_loop': Provides information about the first
location accessed by the data reference in the loop and about the
access function used to represent evolution relative to this
location. This data is used to support pointers, and is not used
for arrays (for which we have base objects). Pointer accesses are
represented as a one-dimensional access that starts from the first
location accessed in the loop. For example:
for1 i
for2 j
*((int *)p + i + j) = a[i][j];
The access function of the pointer access is `{0, + 4B}_for2'
relative to `p + i'. The access functions of the array are
`{i_init, + i_step}_for1' and `{j_init, +, j_step}_for2' relative
to `a'.
Usually, the object the pointer refers to is either unknown, or we
can't prove that the access is confined to the boundaries of a
certain object.
Two data references can be compared only if at least one of these
two representations has all its fields filled for both data
references.
The current strategy for data dependence tests is as follows: If
both `a' and `b' are represented as arrays, compare
`a.base_object' and `b.base_object'; if they are equal, apply
dependence tests (use access functions based on base_objects).
Else if both `a' and `b' are represented as pointers, compare
`a.first_location' and `b.first_location'; if they are equal,
apply dependence tests (use access functions based on first
location). However, if `a' and `b' are represented differently,
only try to prove that the bases are definitely different.
* Aliasing information.
* Alignment information.
The structure describing the relation between two data references is
`data_dependence_relation' and the shorter name for a pointer to such a
structure is `ddr_p'. This structure contains:
* a pointer to each data reference,
* a tree node `are_dependent' that is set to `chrec_known' if the
analysis has proved that there is no dependence between these two
data references, `chrec_dont_know' if the analysis was not able to
determine any useful result and potentially there could exist a
dependence between these data references, and `are_dependent' is
set to `NULL_TREE' if there exist a dependence relation between the
data references, and the description of this dependence relation is
given in the `subscripts', `dir_vects', and `dist_vects' arrays,
* a boolean that determines whether the dependence relation can be
represented by a classical distance vector,
* an array `subscripts' that contains a description of each
subscript of the data references. Given two array accesses a
subscript is the tuple composed of the access functions for a given
dimension. For example, given `A[f1][f2][f3]' and
`B[g1][g2][g3]', there are three subscripts: `(f1, g1), (f2, g2),
(f3, g3)'.
* two arrays `dir_vects' and `dist_vects' that contain classical
representations of the data dependences under the form of
direction and distance dependence vectors,
* an array of loops `loop_nest' that contains the loops to which the
distance and direction vectors refer to.
Several functions for pretty printing the information extracted by the
data dependence analysis are available: `dump_ddrs' prints with a
maximum verbosity the details of a data dependence relations array,
`dump_dist_dir_vectors' prints only the classical distance and
direction vectors for a data dependence relations array, and
`dump_data_references' prints the details of the data references
contained in a data reference array.
File: gccint.info, Node: Lambda, Next: Omega, Prev: Dependency analysis, Up: Loop Analysis and Representation
14.9 Linear loop transformations framework
==========================================
Lambda is a framework that allows transformations of loops using
non-singular matrix based transformations of the iteration space and
loop bounds. This allows compositions of skewing, scaling, interchange,
and reversal transformations. These transformations are often used to
improve cache behavior or remove inner loop dependencies to allow
parallelization and vectorization to take place.
To perform these transformations, Lambda requires that the loopnest be
converted into an internal form that can be matrix transformed easily.
To do this conversion, the function `gcc_loopnest_to_lambda_loopnest'
is provided. If the loop cannot be transformed using lambda, this
function will return NULL.
Once a `lambda_loopnest' is obtained from the conversion function, it
can be transformed by using `lambda_loopnest_transform', which takes a
transformation matrix to apply. Note that it is up to the caller to
verify that the transformation matrix is legal to apply to the loop
(dependence respecting, etc). Lambda simply applies whatever matrix it
is told to provide. It can be extended to make legal matrices out of
any non-singular matrix, but this is not currently implemented.
Legality of a matrix for a given loopnest can be verified using
`lambda_transform_legal_p'.
Given a transformed loopnest, conversion back into gcc IR is done by
`lambda_loopnest_to_gcc_loopnest'. This function will modify the loops
so that they match the transformed loopnest.
File: gccint.info, Node: Omega, Prev: Lambda, Up: Loop Analysis and Representation
14.10 Omega a solver for linear programming problems
====================================================
The data dependence analysis contains several solvers triggered
sequentially from the less complex ones to the more sophisticated. For
ensuring the consistency of the results of these solvers, a data
dependence check pass has been implemented based on two different
solvers. The second method that has been integrated to GCC is based on
the Omega dependence solver, written in the 1990's by William Pugh and
David Wonnacott. Data dependence tests can be formulated using a
subset of the Presburger arithmetics that can be translated to linear
constraint systems. These linear constraint systems can then be solved
using the Omega solver.
The Omega solver is using Fourier-Motzkin's algorithm for variable
elimination: a linear constraint system containing `n' variables is
reduced to a linear constraint system with `n-1' variables. The Omega
solver can also be used for solving other problems that can be
expressed under the form of a system of linear equalities and
inequalities. The Omega solver is known to have an exponential worst
case, also known under the name of "omega nightmare" in the literature,
but in practice, the omega test is known to be efficient for the common
data dependence tests.
The interface used by the Omega solver for describing the linear
programming problems is described in `omega.h', and the solver is
`omega_solve_problem'.
File: gccint.info, Node: Control Flow, Next: Loop Analysis and Representation, Prev: RTL, Up: Top
15 Control Flow Graph
*********************
A control flow graph (CFG) is a data structure built on top of the
intermediate code representation (the RTL or `tree' instruction stream)
abstracting the control flow behavior of a function that is being
compiled. The CFG is a directed graph where the vertices represent
basic blocks and edges represent possible transfer of control flow from
one basic block to another. The data structures used to represent the
control flow graph are defined in `basic-block.h'.
* Menu:
* Basic Blocks:: The definition and representation of basic blocks.
* Edges:: Types of edges and their representation.
* Profile information:: Representation of frequencies and probabilities.
* Maintaining the CFG:: Keeping the control flow graph and up to date.
* Liveness information:: Using and maintaining liveness information.
File: gccint.info, Node: Basic Blocks, Next: Edges, Up: Control Flow
15.1 Basic Blocks
=================
A basic block is a straight-line sequence of code with only one entry
point and only one exit. In GCC, basic blocks are represented using
the `basic_block' data type.
Two pointer members of the `basic_block' structure are the pointers
`next_bb' and `prev_bb'. These are used to keep doubly linked chain of
basic blocks in the same order as the underlying instruction stream.
The chain of basic blocks is updated transparently by the provided API
for manipulating the CFG. The macro `FOR_EACH_BB' can be used to visit
all the basic blocks in lexicographical order. Dominator traversals
are also possible using `walk_dominator_tree'. Given two basic blocks
A and B, block A dominates block B if A is _always_ executed before B.
The `BASIC_BLOCK' array contains all basic blocks in an unspecified
order. Each `basic_block' structure has a field that holds a unique
integer identifier `index' that is the index of the block in the
`BASIC_BLOCK' array. The total number of basic blocks in the function
is `n_basic_blocks'. Both the basic block indices and the total number
of basic blocks may vary during the compilation process, as passes
reorder, create, duplicate, and destroy basic blocks. The index for
any block should never be greater than `last_basic_block'.
Special basic blocks represent possible entry and exit points of a
function. These blocks are called `ENTRY_BLOCK_PTR' and
`EXIT_BLOCK_PTR'. These blocks do not contain any code, and are not
elements of the `BASIC_BLOCK' array. Therefore they have been assigned
unique, negative index numbers.
Each `basic_block' also contains pointers to the first instruction
(the "head") and the last instruction (the "tail") or "end" of the
instruction stream contained in a basic block. In fact, since the
`basic_block' data type is used to represent blocks in both major
intermediate representations of GCC (`tree' and RTL), there are
pointers to the head and end of a basic block for both representations.
For RTL, these pointers are `rtx head, end'. In the RTL function
representation, the head pointer always points either to a
`NOTE_INSN_BASIC_BLOCK' or to a `CODE_LABEL', if present. In the RTL
representation of a function, the instruction stream contains not only
the "real" instructions, but also "notes". Any function that moves or
duplicates the basic blocks needs to take care of updating of these
notes. Many of these notes expect that the instruction stream consists
of linear regions, making such updates difficult. The
`NOTE_INSN_BASIC_BLOCK' note is the only kind of note that may appear
in the instruction stream contained in a basic block. The instruction
stream of a basic block always follows a `NOTE_INSN_BASIC_BLOCK', but
zero or more `CODE_LABEL' nodes can precede the block note. A basic
block ends by control flow instruction or last instruction before
following `CODE_LABEL' or `NOTE_INSN_BASIC_BLOCK'. A `CODE_LABEL'
cannot appear in the instruction stream of a basic block.
In addition to notes, the jump table vectors are also represented as
"pseudo-instructions" inside the insn stream. These vectors never
appear in the basic block and should always be placed just after the
table jump instructions referencing them. After removing the
table-jump it is often difficult to eliminate the code computing the
address and referencing the vector, so cleaning up these vectors is
postponed until after liveness analysis. Thus the jump table vectors
may appear in the insn stream unreferenced and without any purpose.
Before any edge is made "fall-thru", the existence of such construct in
the way needs to be checked by calling `can_fallthru' function.
For the `tree' representation, the head and end of the basic block are
being pointed to by the `stmt_list' field, but this special `tree'
should never be referenced directly. Instead, at the tree level
abstract containers and iterators are used to access statements and
expressions in basic blocks. These iterators are called "block
statement iterators" (BSIs). Grep for `^bsi' in the various `tree-*'
files. The following snippet will pretty-print all the statements of
the program in the GIMPLE representation.
FOR_EACH_BB (bb)
{
block_stmt_iterator si;
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
{
tree stmt = bsi_stmt (si);
print_generic_stmt (stderr, stmt, 0);
}
}
File: gccint.info, Node: Edges, Next: Profile information, Prev: Basic Blocks, Up: Control Flow
15.2 Edges
==========
Edges represent possible control flow transfers from the end of some
basic block A to the head of another basic block B. We say that A is a
predecessor of B, and B is a successor of A. Edges are represented in
GCC with the `edge' data type. Each `edge' acts as a link between two
basic blocks: the `src' member of an edge points to the predecessor
basic block of the `dest' basic block. The members `preds' and `succs'
of the `basic_block' data type point to type-safe vectors of edges to
the predecessors and successors of the block.
When walking the edges in an edge vector, "edge iterators" should be
used. Edge iterators are constructed using the `edge_iterator' data
structure and several methods are available to operate on them:
`ei_start'
This function initializes an `edge_iterator' that points to the
first edge in a vector of edges.
`ei_last'
This function initializes an `edge_iterator' that points to the
last edge in a vector of edges.
`ei_end_p'
This predicate is `true' if an `edge_iterator' represents the last
edge in an edge vector.
`ei_one_before_end_p'
This predicate is `true' if an `edge_iterator' represents the
second last edge in an edge vector.
`ei_next'
This function takes a pointer to an `edge_iterator' and makes it
point to the next edge in the sequence.
`ei_prev'
This function takes a pointer to an `edge_iterator' and makes it
point to the previous edge in the sequence.
`ei_edge'
This function returns the `edge' currently pointed to by an
`edge_iterator'.
`ei_safe_safe'
This function returns the `edge' currently pointed to by an
`edge_iterator', but returns `NULL' if the iterator is pointing at
the end of the sequence. This function has been provided for
existing code makes the assumption that a `NULL' edge indicates
the end of the sequence.
The convenience macro `FOR_EACH_EDGE' can be used to visit all of the
edges in a sequence of predecessor or successor edges. It must not be
used when an element might be removed during the traversal, otherwise
elements will be missed. Here is an example of how to use the macro:
edge e;
edge_iterator ei;
FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->flags & EDGE_FALLTHRU)
break;
}
There are various reasons why control flow may transfer from one block
to another. One possibility is that some instruction, for example a
`CODE_LABEL', in a linearized instruction stream just always starts a
new basic block. In this case a "fall-thru" edge links the basic block
to the first following basic block. But there are several other
reasons why edges may be created. The `flags' field of the `edge' data
type is used to store information about the type of edge we are dealing
with. Each edge is of one of the following types:
_jump_
No type flags are set for edges corresponding to jump instructions.
These edges are used for unconditional or conditional jumps and in
RTL also for table jumps. They are the easiest to manipulate as
they may be freely redirected when the flow graph is not in SSA
form.
_fall-thru_
Fall-thru edges are present in case where the basic block may
continue execution to the following one without branching. These
edges have the `EDGE_FALLTHRU' flag set. Unlike other types of
edges, these edges must come into the basic block immediately
following in the instruction stream. The function
`force_nonfallthru' is available to insert an unconditional jump
in the case that redirection is needed. Note that this may
require creation of a new basic block.
_exception handling_
Exception handling edges represent possible control transfers from
a trapping instruction to an exception handler. The definition of
"trapping" varies. In C++, only function calls can throw, but for
Java, exceptions like division by zero or segmentation fault are
defined and thus each instruction possibly throwing this kind of
exception needs to be handled as control flow instruction.
Exception edges have the `EDGE_ABNORMAL' and `EDGE_EH' flags set.
When updating the instruction stream it is easy to change possibly
trapping instruction to non-trapping, by simply removing the
exception edge. The opposite conversion is difficult, but should
not happen anyway. The edges can be eliminated via
`purge_dead_edges' call.
In the RTL representation, the destination of an exception edge is
specified by `REG_EH_REGION' note attached to the insn. In case
of a trapping call the `EDGE_ABNORMAL_CALL' flag is set too. In
the `tree' representation, this extra flag is not set.
In the RTL representation, the predicate `may_trap_p' may be used
to check whether instruction still may trap or not. For the tree
representation, the `tree_could_trap_p' predicate is available,
but this predicate only checks for possible memory traps, as in
dereferencing an invalid pointer location.
_sibling calls_
Sibling calls or tail calls terminate the function in a
non-standard way and thus an edge to the exit must be present.
`EDGE_SIBCALL' and `EDGE_ABNORMAL' are set in such case. These
edges only exist in the RTL representation.
_computed jumps_
Computed jumps contain edges to all labels in the function
referenced from the code. All those edges have `EDGE_ABNORMAL'
flag set. The edges used to represent computed jumps often cause
compile time performance problems, since functions consisting of
many taken labels and many computed jumps may have _very_ dense
flow graphs, so these edges need to be handled with special care.
During the earlier stages of the compilation process, GCC tries to
avoid such dense flow graphs by factoring computed jumps. For
example, given the following series of jumps,
goto *x;
[ ... ]
goto *x;
[ ... ]
goto *x;
[ ... ]
factoring the computed jumps results in the following code sequence
which has a much simpler flow graph:
goto y;
[ ... ]
goto y;
[ ... ]
goto y;
[ ... ]
y:
goto *x;
However, the classic problem with this transformation is that it
has a runtime cost in there resulting code: An extra jump.
Therefore, the computed jumps are un-factored in the later passes
of the compiler. Be aware of that when you work on passes in that
area. There have been numerous examples already where the compile
time for code with unfactored computed jumps caused some serious
headaches.
_nonlocal goto handlers_
GCC allows nested functions to return into caller using a `goto'
to a label passed to as an argument to the callee. The labels
passed to nested functions contain special code to cleanup after
function call. Such sections of code are referred to as "nonlocal
goto receivers". If a function contains such nonlocal goto
receivers, an edge from the call to the label is created with the
`EDGE_ABNORMAL' and `EDGE_ABNORMAL_CALL' flags set.
_function entry points_
By definition, execution of function starts at basic block 0, so
there is always an edge from the `ENTRY_BLOCK_PTR' to basic block
0. There is no `tree' representation for alternate entry points at
this moment. In RTL, alternate entry points are specified by
`CODE_LABEL' with `LABEL_ALTERNATE_NAME' defined. This feature is
currently used for multiple entry point prologues and is limited
to post-reload passes only. This can be used by back-ends to emit
alternate prologues for functions called from different contexts.
In future full support for multiple entry functions defined by
Fortran 90 needs to be implemented.
_function exits_
In the pre-reload representation a function terminates after the
last instruction in the insn chain and no explicit return
instructions are used. This corresponds to the fall-thru edge
into exit block. After reload, optimal RTL epilogues are used
that use explicit (conditional) return instructions that are
represented by edges with no flags set.
File: gccint.info, Node: Profile information, Next: Maintaining the CFG, Prev: Edges, Up: Control Flow
15.3 Profile information
========================
In many cases a compiler must make a choice whether to trade speed in
one part of code for speed in another, or to trade code size for code
speed. In such cases it is useful to know information about how often
some given block will be executed. That is the purpose for maintaining
profile within the flow graph. GCC can handle profile information
obtained through "profile feedback", but it can also estimate branch
probabilities based on statics and heuristics.
The feedback based profile is produced by compiling the program with
instrumentation, executing it on a train run and reading the numbers of
executions of basic blocks and edges back to the compiler while
re-compiling the program to produce the final executable. This method
provides very accurate information about where a program spends most of
its time on the train run. Whether it matches the average run of
course depends on the choice of train data set, but several studies
have shown that the behavior of a program usually changes just
marginally over different data sets.
When profile feedback is not available, the compiler may be asked to
attempt to predict the behavior of each branch in the program using a
set of heuristics (see `predict.def' for details) and compute estimated
frequencies of each basic block by propagating the probabilities over
the graph.
Each `basic_block' contains two integer fields to represent profile
information: `frequency' and `count'. The `frequency' is an estimation
how often is basic block executed within a function. It is represented
as an integer scaled in the range from 0 to `BB_FREQ_BASE'. The most
frequently executed basic block in function is initially set to
`BB_FREQ_BASE' and the rest of frequencies are scaled accordingly.
During optimization, the frequency of the most frequent basic block can
both decrease (for instance by loop unrolling) or grow (for instance by
cross-jumping optimization), so scaling sometimes has to be performed
multiple times.
The `count' contains hard-counted numbers of execution measured during
training runs and is nonzero only when profile feedback is available.
This value is represented as the host's widest integer (typically a 64
bit integer) of the special type `gcov_type'.
Most optimization passes can use only the frequency information of a
basic block, but a few passes may want to know hard execution counts.
The frequencies should always match the counts after scaling, however
during updating of the profile information numerical error may
accumulate into quite large errors.
Each edge also contains a branch probability field: an integer in the
range from 0 to `REG_BR_PROB_BASE'. It represents probability of
passing control from the end of the `src' basic block to the `dest'
basic block, i.e. the probability that control will flow along this
edge. The `EDGE_FREQUENCY' macro is available to compute how
frequently a given edge is taken. There is a `count' field for each
edge as well, representing same information as for a basic block.
The basic block frequencies are not represented in the instruction
stream, but in the RTL representation the edge frequencies are
represented for conditional jumps (via the `REG_BR_PROB' macro) since
they are used when instructions are output to the assembly file and the
flow graph is no longer maintained.
The probability that control flow arrives via a given edge to its
destination basic block is called "reverse probability" and is not
directly represented, but it may be easily computed from frequencies of
basic blocks.
Updating profile information is a delicate task that can unfortunately
not be easily integrated with the CFG manipulation API. Many of the
functions and hooks to modify the CFG, such as
`redirect_edge_and_branch', do not have enough information to easily
update the profile, so updating it is in the majority of cases left up
to the caller. It is difficult to uncover bugs in the profile updating
code, because they manifest themselves only by producing worse code,
and checking profile consistency is not possible because of numeric
error accumulation. Hence special attention needs to be given to this
issue in each pass that modifies the CFG.
It is important to point out that `REG_BR_PROB_BASE' and
`BB_FREQ_BASE' are both set low enough to be possible to compute second
power of any frequency or probability in the flow graph, it is not
possible to even square the `count' field, as modern CPUs are fast
enough to execute $2^32$ operations quickly.
File: gccint.info, Node: Maintaining the CFG, Next: Liveness information, Prev: Profile information, Up: Control Flow
15.4 Maintaining the CFG
========================
An important task of each compiler pass is to keep both the control
flow graph and all profile information up-to-date. Reconstruction of
the control flow graph after each pass is not an option, since it may be
very expensive and lost profile information cannot be reconstructed at
all.
GCC has two major intermediate representations, and both use the
`basic_block' and `edge' data types to represent control flow. Both
representations share as much of the CFG maintenance code as possible.
For each representation, a set of "hooks" is defined so that each
representation can provide its own implementation of CFG manipulation
routines when necessary. These hooks are defined in `cfghooks.h'.
There are hooks for almost all common CFG manipulations, including
block splitting and merging, edge redirection and creating and deleting
basic blocks. These hooks should provide everything you need to
maintain and manipulate the CFG in both the RTL and `tree'
representation.
At the moment, the basic block boundaries are maintained transparently
when modifying instructions, so there rarely is a need to move them
manually (such as in case someone wants to output instruction outside
basic block explicitly). Often the CFG may be better viewed as
integral part of instruction chain, than structure built on the top of
it. However, in principle the control flow graph for the `tree'
representation is _not_ an integral part of the representation, in that
a function tree may be expanded without first building a flow graph
for the `tree' representation at all. This happens when compiling
without any `tree' optimization enabled. When the `tree' optimizations
are enabled and the instruction stream is rewritten in SSA form, the
CFG is very tightly coupled with the instruction stream. In
particular, statement insertion and removal has to be done with care.
In fact, the whole `tree' representation can not be easily used or
maintained without proper maintenance of the CFG simultaneously.
In the RTL representation, each instruction has a `BLOCK_FOR_INSN'
value that represents pointer to the basic block that contains the
instruction. In the `tree' representation, the function `bb_for_stmt'
returns a pointer to the basic block containing the queried statement.
When changes need to be applied to a function in its `tree'
representation, "block statement iterators" should be used. These
iterators provide an integrated abstraction of the flow graph and the
instruction stream. Block statement iterators are constructed using
the `block_stmt_iterator' data structure and several modifier are
available, including the following:
`bsi_start'
This function initializes a `block_stmt_iterator' that points to
the first non-empty statement in a basic block.
`bsi_last'
This function initializes a `block_stmt_iterator' that points to
the last statement in a basic block.
`bsi_end_p'
This predicate is `true' if a `block_stmt_iterator' represents the
end of a basic block.
`bsi_next'
This function takes a `block_stmt_iterator' and makes it point to
its successor.
`bsi_prev'
This function takes a `block_stmt_iterator' and makes it point to
its predecessor.
`bsi_insert_after'
This function inserts a statement after the `block_stmt_iterator'
passed in. The final parameter determines whether the statement
iterator is updated to point to the newly inserted statement, or
left pointing to the original statement.
`bsi_insert_before'
This function inserts a statement before the `block_stmt_iterator'
passed in. The final parameter determines whether the statement
iterator is updated to point to the newly inserted statement, or
left pointing to the original statement.
`bsi_remove'
This function removes the `block_stmt_iterator' passed in and
rechains the remaining statements in a basic block, if any.
In the RTL representation, the macros `BB_HEAD' and `BB_END' may be
used to get the head and end `rtx' of a basic block. No abstract
iterators are defined for traversing the insn chain, but you can just
use `NEXT_INSN' and `PREV_INSN' instead. *Note Insns::.
Usually a code manipulating pass simplifies the instruction stream and
the flow of control, possibly eliminating some edges. This may for
example happen when a conditional jump is replaced with an
unconditional jump, but also when simplifying possibly trapping
instruction to non-trapping while compiling Java. Updating of edges is
not transparent and each optimization pass is required to do so
manually. However only few cases occur in practice. The pass may call
`purge_dead_edges' on a given basic block to remove superfluous edges,
if any.
Another common scenario is redirection of branch instructions, but
this is best modeled as redirection of edges in the control flow graph
and thus use of `redirect_edge_and_branch' is preferred over more low
level functions, such as `redirect_jump' that operate on RTL chain
only. The CFG hooks defined in `cfghooks.h' should provide the
complete API required for manipulating and maintaining the CFG.
It is also possible that a pass has to insert control flow instruction
into the middle of a basic block, thus creating an entry point in the
middle of the basic block, which is impossible by definition: The block
must be split to make sure it only has one entry point, i.e. the head
of the basic block. The CFG hook `split_block' may be used when an
instruction in the middle of a basic block has to become the target of
a jump or branch instruction.
For a global optimizer, a common operation is to split edges in the
flow graph and insert instructions on them. In the RTL representation,
this can be easily done using the `insert_insn_on_edge' function that
emits an instruction "on the edge", caching it for a later
`commit_edge_insertions' call that will take care of moving the
inserted instructions off the edge into the instruction stream
contained in a basic block. This includes the creation of new basic
blocks where needed. In the `tree' representation, the equivalent
functions are `bsi_insert_on_edge' which inserts a block statement
iterator on an edge, and `bsi_commit_edge_inserts' which flushes the
instruction to actual instruction stream.
While debugging the optimization pass, a `verify_flow_info' function
may be useful to find bugs in the control flow graph updating code.
Note that at present, the representation of control flow in the `tree'
representation is discarded before expanding to RTL. Long term the CFG
should be maintained and "expanded" to the RTL representation along
with the function `tree' itself.
File: gccint.info, Node: Liveness information, Prev: Maintaining the CFG, Up: Control Flow
15.5 Liveness information
=========================
Liveness information is useful to determine whether some register is
"live" at given point of program, i.e. that it contains a value that
may be used at a later point in the program. This information is used,
for instance, during register allocation, as the pseudo registers only
need to be assigned to a unique hard register or to a stack slot if
they are live. The hard registers and stack slots may be freely reused
for other values when a register is dead.
Liveness information is available in the back end starting with
`pass_df_initialize' and ending with `pass_df_finish'. Three flavors
of live analysis are available: With `LR', it is possible to determine
at any point `P' in the function if the register may be used on some
path from `P' to the end of the function. With `UR', it is possible to
determine if there is a path from the beginning of the function to `P'
that defines the variable. `LIVE' is the intersection of the `LR' and
`UR' and a variable is live at `P' if there is both an assignment that
reaches it from the beginning of the function and a use that can be
reached on some path from `P' to the end of the function.
In general `LIVE' is the most useful of the three. The macros
`DF_[LR,UR,LIVE]_[IN,OUT]' can be used to access this information. The
macros take a basic block number and return a bitmap that is indexed by
the register number. This information is only guaranteed to be up to
date after calls are made to `df_analyze'. See the file `df-core.c'
for details on using the dataflow.
The liveness information is stored partly in the RTL instruction stream
and partly in the flow graph. Local information is stored in the
instruction stream: Each instruction may contain `REG_DEAD' notes
representing that the value of a given register is no longer needed, or
`REG_UNUSED' notes representing that the value computed by the
instruction is never used. The second is useful for instructions
computing multiple values at once.
File: gccint.info, Node: Machine Desc, Next: Target Macros, Prev: Loop Analysis and Representation, Up: Top
16 Machine Descriptions
***********************
A machine description has two parts: a file of instruction patterns
(`.md' file) and a C header file of macro definitions.
The `.md' file for a target machine contains a pattern for each
instruction that the target machine supports (or at least each
instruction that is worth telling the compiler about). It may also
contain comments. A semicolon causes the rest of the line to be a
comment, unless the semicolon is inside a quoted string.
See the next chapter for information on the C header file.
* Menu:
* Overview:: How the machine description is used.
* Patterns:: How to write instruction patterns.
* Example:: An explained example of a `define_insn' pattern.
* RTL Template:: The RTL template defines what insns match a pattern.
* Output Template:: The output template says how to make assembler code
from such an insn.
* Output Statement:: For more generality, write C code to output
the assembler code.
* Predicates:: Controlling what kinds of operands can be used
for an insn.
* Constraints:: Fine-tuning operand selection.
* Standard Names:: Names mark patterns to use for code generation.
* Pattern Ordering:: When the order of patterns makes a difference.
* Dependent Patterns:: Having one pattern may make you need another.
* Jump Patterns:: Special considerations for patterns for jump insns.
* Looping Patterns:: How to define patterns for special looping insns.
* Insn Canonicalizations::Canonicalization of Instructions
* Expander Definitions::Generating a sequence of several RTL insns
for a standard operation.
* Insn Splitting:: Splitting Instructions into Multiple Instructions.
* Including Patterns:: Including Patterns in Machine Descriptions.
* Peephole Definitions::Defining machine-specific peephole optimizations.
* Insn Attributes:: Specifying the value of attributes for generated insns.
* Conditional Execution::Generating `define_insn' patterns for
predication.
* Constant Definitions::Defining symbolic constants that can be used in the
md file.
* Iterators:: Using iterators to generate patterns from a template.
File: gccint.info, Node: Overview, Next: Patterns, Up: Machine Desc
16.1 Overview of How the Machine Description is Used
====================================================
There are three main conversions that happen in the compiler:
1. The front end reads the source code and builds a parse tree.
2. The parse tree is used to generate an RTL insn list based on named
instruction patterns.
3. The insn list is matched against the RTL templates to produce
assembler code.
For the generate pass, only the names of the insns matter, from either
a named `define_insn' or a `define_expand'. The compiler will choose
the pattern with the right name and apply the operands according to the
documentation later in this chapter, without regard for the RTL
template or operand constraints. Note that the names the compiler looks
for are hard-coded in the compiler--it will ignore unnamed patterns and
patterns with names it doesn't know about, but if you don't provide a
named pattern it needs, it will abort.
If a `define_insn' is used, the template given is inserted into the
insn list. If a `define_expand' is used, one of three things happens,
based on the condition logic. The condition logic may manually create
new insns for the insn list, say via `emit_insn()', and invoke `DONE'.
For certain named patterns, it may invoke `FAIL' to tell the compiler
to use an alternate way of performing that task. If it invokes neither
`DONE' nor `FAIL', the template given in the pattern is inserted, as if
the `define_expand' were a `define_insn'.
Once the insn list is generated, various optimization passes convert,
replace, and rearrange the insns in the insn list. This is where the
`define_split' and `define_peephole' patterns get used, for example.
Finally, the insn list's RTL is matched up with the RTL templates in
the `define_insn' patterns, and those patterns are used to emit the
final assembly code. For this purpose, each named `define_insn' acts
like it's unnamed, since the names are ignored.
File: gccint.info, Node: Patterns, Next: Example, Prev: Overview, Up: Machine Desc
16.2 Everything about Instruction Patterns
==========================================
Each instruction pattern contains an incomplete RTL expression, with
pieces to be filled in later, operand constraints that restrict how the
pieces can be filled in, and an output pattern or C code to generate
the assembler output, all wrapped up in a `define_insn' expression.
A `define_insn' is an RTL expression containing four or five operands:
1. An optional name. The presence of a name indicate that this
instruction pattern can perform a certain standard job for the
RTL-generation pass of the compiler. This pass knows certain
names and will use the instruction patterns with those names, if
the names are defined in the machine description.
The absence of a name is indicated by writing an empty string
where the name should go. Nameless instruction patterns are never
used for generating RTL code, but they may permit several simpler
insns to be combined later on.
Names that are not thus known and used in RTL-generation have no
effect; they are equivalent to no name at all.
For the purpose of debugging the compiler, you may also specify a
name beginning with the `*' character. Such a name is used only
for identifying the instruction in RTL dumps; it is entirely
equivalent to having a nameless pattern for all other purposes.
2. The "RTL template" (*note RTL Template::) is a vector of incomplete
RTL expressions which show what the instruction should look like.
It is incomplete because it may contain `match_operand',
`match_operator', and `match_dup' expressions that stand for
operands of the instruction.
If the vector has only one element, that element is the template
for the instruction pattern. If the vector has multiple elements,
then the instruction pattern is a `parallel' expression containing
the elements described.
3. A condition. This is a string which contains a C expression that
is the final test to decide whether an insn body matches this
pattern.
For a named pattern, the condition (if present) may not depend on
the data in the insn being matched, but only the
target-machine-type flags. The compiler needs to test these
conditions during initialization in order to learn exactly which
named instructions are available in a particular run.
For nameless patterns, the condition is applied only when matching
an individual insn, and only after the insn has matched the
pattern's recognition template. The insn's operands may be found
in the vector `operands'. For an insn where the condition has
once matched, it can't be used to control register allocation, for
example by excluding certain hard registers or hard register
combinations.
4. The "output template": a string that says how to output matching
insns as assembler code. `%' in this string specifies where to
substitute the value of an operand. *Note Output Template::.
When simple substitution isn't general enough, you can specify a
piece of C code to compute the output. *Note Output Statement::.
5. Optionally, a vector containing the values of attributes for insns
matching this pattern. *Note Insn Attributes::.
File: gccint.info, Node: Example, Next: RTL Template, Prev: Patterns, Up: Machine Desc
16.3 Example of `define_insn'
=============================
Here is an actual example of an instruction pattern, for the
68000/68020.
(define_insn "tstsi"
[(set (cc0)
(match_operand:SI 0 "general_operand" "rm"))]
""
"*
{
if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
return \"tstl %0\";
return \"cmpl #0,%0\";
}")
This can also be written using braced strings:
(define_insn "tstsi"
[(set (cc0)
(match_operand:SI 0 "general_operand" "rm"))]
""
{
if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
return "tstl %0";
return "cmpl #0,%0";
})
This is an instruction that sets the condition codes based on the
value of a general operand. It has no condition, so any insn whose RTL
description has the form shown may be handled according to this
pattern. The name `tstsi' means "test a `SImode' value" and tells the
RTL generation pass that, when it is necessary to test such a value, an
insn to do so can be constructed using this pattern.
The output control string is a piece of C code which chooses which
output template to return based on the kind of operand and the specific
type of CPU for which code is being generated.
`"rm"' is an operand constraint. Its meaning is explained below.
File: gccint.info, Node: RTL Template, Next: Output Template, Prev: Example, Up: Machine Desc
16.4 RTL Template
=================
The RTL template is used to define which insns match the particular
pattern and how to find their operands. For named patterns, the RTL
template also says how to construct an insn from specified operands.
Construction involves substituting specified operands into a copy of
the template. Matching involves determining the values that serve as
the operands in the insn being matched. Both of these activities are
controlled by special expression types that direct matching and
substitution of the operands.
`(match_operand:M N PREDICATE CONSTRAINT)'
This expression is a placeholder for operand number N of the insn.
When constructing an insn, operand number N will be substituted at
this point. When matching an insn, whatever appears at this
position in the insn will be taken as operand number N; but it
must satisfy PREDICATE or this instruction pattern will not match
at all.
Operand numbers must be chosen consecutively counting from zero in
each instruction pattern. There may be only one `match_operand'
expression in the pattern for each operand number. Usually
operands are numbered in the order of appearance in `match_operand'
expressions. In the case of a `define_expand', any operand numbers
used only in `match_dup' expressions have higher values than all
other operand numbers.
PREDICATE is a string that is the name of a function that accepts
two arguments, an expression and a machine mode. *Note
Predicates::. During matching, the function will be called with
the putative operand as the expression and M as the mode argument
(if M is not specified, `VOIDmode' will be used, which normally
causes PREDICATE to accept any mode). If it returns zero, this
instruction pattern fails to match. PREDICATE may be an empty
string; then it means no test is to be done on the operand, so
anything which occurs in this position is valid.
Most of the time, PREDICATE will reject modes other than M--but
not always. For example, the predicate `address_operand' uses M
as the mode of memory ref that the address should be valid for.
Many predicates accept `const_int' nodes even though their mode is
`VOIDmode'.
CONSTRAINT controls reloading and the choice of the best register
class to use for a value, as explained later (*note Constraints::).
If the constraint would be an empty string, it can be omitted.
People are often unclear on the difference between the constraint
and the predicate. The predicate helps decide whether a given
insn matches the pattern. The constraint plays no role in this
decision; instead, it controls various decisions in the case of an
insn which does match.
`(match_scratch:M N CONSTRAINT)'
This expression is also a placeholder for operand number N and
indicates that operand must be a `scratch' or `reg' expression.
When matching patterns, this is equivalent to
(match_operand:M N "scratch_operand" PRED)
but, when generating RTL, it produces a (`scratch':M) expression.
If the last few expressions in a `parallel' are `clobber'
expressions whose operands are either a hard register or
`match_scratch', the combiner can add or delete them when
necessary. *Note Side Effects::.
`(match_dup N)'
This expression is also a placeholder for operand number N. It is
used when the operand needs to appear more than once in the insn.
In construction, `match_dup' acts just like `match_operand': the
operand is substituted into the insn being constructed. But in
matching, `match_dup' behaves differently. It assumes that operand
number N has already been determined by a `match_operand'
appearing earlier in the recognition template, and it matches only
an identical-looking expression.
Note that `match_dup' should not be used to tell the compiler that
a particular register is being used for two operands (example:
`add' that adds one register to another; the second register is
both an input operand and the output operand). Use a matching
constraint (*note Simple Constraints::) for those. `match_dup' is
for the cases where one operand is used in two places in the
template, such as an instruction that computes both a quotient and
a remainder, where the opcode takes two input operands but the RTL
template has to refer to each of those twice; once for the
quotient pattern and once for the remainder pattern.
`(match_operator:M N PREDICATE [OPERANDS...])'
This pattern is a kind of placeholder for a variable RTL expression
code.
When constructing an insn, it stands for an RTL expression whose
expression code is taken from that of operand N, and whose
operands are constructed from the patterns OPERANDS.
When matching an expression, it matches an expression if the
function PREDICATE returns nonzero on that expression _and_ the
patterns OPERANDS match the operands of the expression.
Suppose that the function `commutative_operator' is defined as
follows, to match any expression whose operator is one of the
commutative arithmetic operators of RTL and whose mode is MODE:
int
commutative_integer_operator (x, mode)
rtx x;
enum machine_mode mode;
{
enum rtx_code code = GET_CODE (x);
if (GET_MODE (x) != mode)
return 0;
return (GET_RTX_CLASS (code) == RTX_COMM_ARITH
|| code == EQ || code == NE);
}
Then the following pattern will match any RTL expression consisting
of a commutative operator applied to two general operands:
(match_operator:SI 3 "commutative_operator"
[(match_operand:SI 1 "general_operand" "g")
(match_operand:SI 2 "general_operand" "g")])
Here the vector `[OPERANDS...]' contains two patterns because the
expressions to be matched all contain two operands.
When this pattern does match, the two operands of the commutative
operator are recorded as operands 1 and 2 of the insn. (This is
done by the two instances of `match_operand'.) Operand 3 of the
insn will be the entire commutative expression: use `GET_CODE
(operands[3])' to see which commutative operator was used.
The machine mode M of `match_operator' works like that of
`match_operand': it is passed as the second argument to the
predicate function, and that function is solely responsible for
deciding whether the expression to be matched "has" that mode.
When constructing an insn, argument 3 of the gen-function will
specify the operation (i.e. the expression code) for the
expression to be made. It should be an RTL expression, whose
expression code is copied into a new expression whose operands are
arguments 1 and 2 of the gen-function. The subexpressions of
argument 3 are not used; only its expression code matters.
When `match_operator' is used in a pattern for matching an insn,
it usually best if the operand number of the `match_operator' is
higher than that of the actual operands of the insn. This improves
register allocation because the register allocator often looks at
operands 1 and 2 of insns to see if it can do register tying.
There is no way to specify constraints in `match_operator'. The
operand of the insn which corresponds to the `match_operator'
never has any constraints because it is never reloaded as a whole.
However, if parts of its OPERANDS are matched by `match_operand'
patterns, those parts may have constraints of their own.
`(match_op_dup:M N[OPERANDS...])'
Like `match_dup', except that it applies to operators instead of
operands. When constructing an insn, operand number N will be
substituted at this point. But in matching, `match_op_dup' behaves
differently. It assumes that operand number N has already been
determined by a `match_operator' appearing earlier in the
recognition template, and it matches only an identical-looking
expression.
`(match_parallel N PREDICATE [SUBPAT...])'
This pattern is a placeholder for an insn that consists of a
`parallel' expression with a variable number of elements. This
expression should only appear at the top level of an insn pattern.
When constructing an insn, operand number N will be substituted at
this point. When matching an insn, it matches if the body of the
insn is a `parallel' expression with at least as many elements as
the vector of SUBPAT expressions in the `match_parallel', if each
SUBPAT matches the corresponding element of the `parallel', _and_
the function PREDICATE returns nonzero on the `parallel' that is
the body of the insn. It is the responsibility of the predicate
to validate elements of the `parallel' beyond those listed in the
`match_parallel'.
A typical use of `match_parallel' is to match load and store
multiple expressions, which can contain a variable number of
elements in a `parallel'. For example,
(define_insn ""
[(match_parallel 0 "load_multiple_operation"
[(set (match_operand:SI 1 "gpc_reg_operand" "=r")
(match_operand:SI 2 "memory_operand" "m"))
(use (reg:SI 179))
(clobber (reg:SI 179))])]
""
"loadm 0,0,%1,%2")
This example comes from `a29k.md'. The function
`load_multiple_operation' is defined in `a29k.c' and checks that
subsequent elements in the `parallel' are the same as the `set' in
the pattern, except that they are referencing subsequent registers
and memory locations.
An insn that matches this pattern might look like:
(parallel
[(set (reg:SI 20) (mem:SI (reg:SI 100)))
(use (reg:SI 179))
(clobber (reg:SI 179))
(set (reg:SI 21)
(mem:SI (plus:SI (reg:SI 100)
(const_int 4))))
(set (reg:SI 22)
(mem:SI (plus:SI (reg:SI 100)
(const_int 8))))])
`(match_par_dup N [SUBPAT...])'
Like `match_op_dup', but for `match_parallel' instead of
`match_operator'.
File: gccint.info, Node: Output Template, Next: Output Statement, Prev: RTL Template, Up: Machine Desc
16.5 Output Templates and Operand Substitution
==============================================
The "output template" is a string which specifies how to output the
assembler code for an instruction pattern. Most of the template is a
fixed string which is output literally. The character `%' is used to
specify where to substitute an operand; it can also be used to identify
places where different variants of the assembler require different
syntax.
In the simplest case, a `%' followed by a digit N says to output
operand N at that point in the string.
`%' followed by a letter and a digit says to output an operand in an
alternate fashion. Four letters have standard, built-in meanings
described below. The machine description macro `PRINT_OPERAND' can
define additional letters with nonstandard meanings.
`%cDIGIT' can be used to substitute an operand that is a constant
value without the syntax that normally indicates an immediate operand.
`%nDIGIT' is like `%cDIGIT' except that the value of the constant is
negated before printing.
`%aDIGIT' can be used to substitute an operand as if it were a memory
reference, with the actual operand treated as the address. This may be
useful when outputting a "load address" instruction, because often the
assembler syntax for such an instruction requires you to write the
operand as if it were a memory reference.
`%lDIGIT' is used to substitute a `label_ref' into a jump instruction.
`%=' outputs a number which is unique to each instruction in the
entire compilation. This is useful for making local labels to be
referred to more than once in a single template that generates multiple
assembler instructions.
`%' followed by a punctuation character specifies a substitution that
does not use an operand. Only one case is standard: `%%' outputs a `%'
into the assembler code. Other nonstandard cases can be defined in the
`PRINT_OPERAND' macro. You must also define which punctuation
characters are valid with the `PRINT_OPERAND_PUNCT_VALID_P' macro.
The template may generate multiple assembler instructions. Write the
text for the instructions, with `\;' between them.
When the RTL contains two operands which are required by constraint to
match each other, the output template must refer only to the
lower-numbered operand. Matching operands are not always identical,
and the rest of the compiler arranges to put the proper RTL expression
for printing into the lower-numbered operand.
One use of nonstandard letters or punctuation following `%' is to
distinguish between different assembler languages for the same machine;
for example, Motorola syntax versus MIT syntax for the 68000. Motorola
syntax requires periods in most opcode names, while MIT syntax does
not. For example, the opcode `movel' in MIT syntax is `move.l' in
Motorola syntax. The same file of patterns is used for both kinds of
output syntax, but the character sequence `%.' is used in each place
where Motorola syntax wants a period. The `PRINT_OPERAND' macro for
Motorola syntax defines the sequence to output a period; the macro for
MIT syntax defines it to do nothing.
As a special case, a template consisting of the single character `#'
instructs the compiler to first split the insn, and then output the
resulting instructions separately. This helps eliminate redundancy in
the output templates. If you have a `define_insn' that needs to emit
multiple assembler instructions, and there is a matching `define_split'
already defined, then you can simply use `#' as the output template
instead of writing an output template that emits the multiple assembler
instructions.
If the macro `ASSEMBLER_DIALECT' is defined, you can use construct of
the form `{option0|option1|option2}' in the templates. These describe
multiple variants of assembler language syntax. *Note Instruction
Output::.
File: gccint.info, Node: Output Statement, Next: Predicates, Prev: Output Template, Up: Machine Desc
16.6 C Statements for Assembler Output
======================================
Often a single fixed template string cannot produce correct and
efficient assembler code for all the cases that are recognized by a
single instruction pattern. For example, the opcodes may depend on the
kinds of operands; or some unfortunate combinations of operands may
require extra machine instructions.
If the output control string starts with a `@', then it is actually a
series of templates, each on a separate line. (Blank lines and leading
spaces and tabs are ignored.) The templates correspond to the
pattern's constraint alternatives (*note Multi-Alternative::). For
example, if a target machine has a two-address add instruction `addr'
to add into a register and another `addm' to add a register to memory,
you might write this pattern:
(define_insn "addsi3"
[(set (match_operand:SI 0 "general_operand" "=r,m")
(plus:SI (match_operand:SI 1 "general_operand" "0,0")
(match_operand:SI 2 "general_operand" "g,r")))]
""
"@
addr %2,%0
addm %2,%0")
If the output control string starts with a `*', then it is not an
output template but rather a piece of C program that should compute a
template. It should execute a `return' statement to return the
template-string you want. Most such templates use C string literals,
which require doublequote characters to delimit them. To include these
doublequote characters in the string, prefix each one with `\'.
If the output control string is written as a brace block instead of a
double-quoted string, it is automatically assumed to be C code. In that
case, it is not necessary to put in a leading asterisk, or to escape the
doublequotes surrounding C string literals.
The operands may be found in the array `operands', whose C data type
is `rtx []'.
It is very common to select different ways of generating assembler code
based on whether an immediate operand is within a certain range. Be
careful when doing this, because the result of `INTVAL' is an integer
on the host machine. If the host machine has more bits in an `int'
than the target machine has in the mode in which the constant will be
used, then some of the bits you get from `INTVAL' will be superfluous.
For proper results, you must carefully disregard the values of those
bits.
It is possible to output an assembler instruction and then go on to
output or compute more of them, using the subroutine `output_asm_insn'.
This receives two arguments: a template-string and a vector of
operands. The vector may be `operands', or it may be another array of
`rtx' that you declare locally and initialize yourself.
When an insn pattern has multiple alternatives in its constraints,
often the appearance of the assembler code is determined mostly by
which alternative was matched. When this is so, the C code can test
the variable `which_alternative', which is the ordinal number of the
alternative that was actually satisfied (0 for the first, 1 for the
second alternative, etc.).
For example, suppose there are two opcodes for storing zero, `clrreg'
for registers and `clrmem' for memory locations. Here is how a pattern
could use `which_alternative' to choose between them:
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=r,m")
(const_int 0))]
""
{
return (which_alternative == 0
? "clrreg %0" : "clrmem %0");
})
The example above, where the assembler code to generate was _solely_
determined by the alternative, could also have been specified as
follows, having the output control string start with a `@':
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=r,m")
(const_int 0))]
""
"@
clrreg %0
clrmem %0")
File: gccint.info, Node: Predicates, Next: Constraints, Prev: Output Statement, Up: Machine Desc
16.7 Predicates
===============
A predicate determines whether a `match_operand' or `match_operator'
expression matches, and therefore whether the surrounding instruction
pattern will be used for that combination of operands. GCC has a
number of machine-independent predicates, and you can define
machine-specific predicates as needed. By convention, predicates used
with `match_operand' have names that end in `_operand', and those used
with `match_operator' have names that end in `_operator'.
All predicates are Boolean functions (in the mathematical sense) of
two arguments: the RTL expression that is being considered at that
position in the instruction pattern, and the machine mode that the
`match_operand' or `match_operator' specifies. In this section, the
first argument is called OP and the second argument MODE. Predicates
can be called from C as ordinary two-argument functions; this can be
useful in output templates or other machine-specific code.
Operand predicates can allow operands that are not actually acceptable
to the hardware, as long as the constraints give reload the ability to
fix them up (*note Constraints::). However, GCC will usually generate
better code if the predicates specify the requirements of the machine
instructions as closely as possible. Reload cannot fix up operands
that must be constants ("immediate operands"); you must use a predicate
that allows only constants, or else enforce the requirement in the
extra condition.
Most predicates handle their MODE argument in a uniform manner. If
MODE is `VOIDmode' (unspecified), then OP can have any mode. If MODE
is anything else, then OP must have the same mode, unless OP is a
`CONST_INT' or integer `CONST_DOUBLE'. These RTL expressions always
have `VOIDmode', so it would be counterproductive to check that their
mode matches. Instead, predicates that accept `CONST_INT' and/or
integer `CONST_DOUBLE' check that the value stored in the constant will
fit in the requested mode.
Predicates with this behavior are called "normal". `genrecog' can
optimize the instruction recognizer based on knowledge of how normal
predicates treat modes. It can also diagnose certain kinds of common
errors in the use of normal predicates; for instance, it is almost
always an error to use a normal predicate without specifying a mode.
Predicates that do something different with their MODE argument are
called "special". The generic predicates `address_operand' and
`pmode_register_operand' are special predicates. `genrecog' does not
do any optimizations or diagnosis when special predicates are used.
* Menu:
* Machine-Independent Predicates:: Predicates available to all back ends.
* Defining Predicates:: How to write machine-specific predicate
functions.
File: gccint.info, Node: Machine-Independent Predicates, Next: Defining Predicates, Up: Predicates
16.7.1 Machine-Independent Predicates
-------------------------------------
These are the generic predicates available to all back ends. They are
defined in `recog.c'. The first category of predicates allow only
constant, or "immediate", operands.
-- Function: immediate_operand
This predicate allows any sort of constant that fits in MODE. It
is an appropriate choice for instructions that take operands that
must be constant.
-- Function: const_int_operand
This predicate allows any `CONST_INT' expression that fits in
MODE. It is an appropriate choice for an immediate operand that
does not allow a symbol or label.
-- Function: const_double_operand
This predicate accepts any `CONST_DOUBLE' expression that has
exactly MODE. If MODE is `VOIDmode', it will also accept
`CONST_INT'. It is intended for immediate floating point
constants.
The second category of predicates allow only some kind of machine
register.
-- Function: register_operand
This predicate allows any `REG' or `SUBREG' expression that is
valid for MODE. It is often suitable for arithmetic instruction
operands on a RISC machine.
-- Function: pmode_register_operand
This is a slight variant on `register_operand' which works around
a limitation in the machine-description reader.
(match_operand N "pmode_register_operand" CONSTRAINT)
means exactly what
(match_operand:P N "register_operand" CONSTRAINT)
would mean, if the machine-description reader accepted `:P' mode
suffixes. Unfortunately, it cannot, because `Pmode' is an alias
for some other mode, and might vary with machine-specific options.
*Note Misc::.
-- Function: scratch_operand
This predicate allows hard registers and `SCRATCH' expressions,
but not pseudo-registers. It is used internally by
`match_scratch'; it should not be used directly.
The third category of predicates allow only some kind of memory
reference.
-- Function: memory_operand
This predicate allows any valid reference to a quantity of mode
MODE in memory, as determined by the weak form of
`GO_IF_LEGITIMATE_ADDRESS' (*note Addressing Modes::).
-- Function: address_operand
This predicate is a little unusual; it allows any operand that is a
valid expression for the _address_ of a quantity of mode MODE,
again determined by the weak form of `GO_IF_LEGITIMATE_ADDRESS'.
To first order, if `(mem:MODE (EXP))' is acceptable to
`memory_operand', then EXP is acceptable to `address_operand'.
Note that EXP does not necessarily have the mode MODE.
-- Function: indirect_operand
This is a stricter form of `memory_operand' which allows only
memory references with a `general_operand' as the address
expression. New uses of this predicate are discouraged, because
`general_operand' is very permissive, so it's hard to tell what an
`indirect_operand' does or does not allow. If a target has
different requirements for memory operands for different
instructions, it is better to define target-specific predicates
which enforce the hardware's requirements explicitly.
-- Function: push_operand
This predicate allows a memory reference suitable for pushing a
value onto the stack. This will be a `MEM' which refers to
`stack_pointer_rtx', with a side-effect in its address expression
(*note Incdec::); which one is determined by the `STACK_PUSH_CODE'
macro (*note Frame Layout::).
-- Function: pop_operand
This predicate allows a memory reference suitable for popping a
value off the stack. Again, this will be a `MEM' referring to
`stack_pointer_rtx', with a side-effect in its address expression.
However, this time `STACK_POP_CODE' is expected.
The fourth category of predicates allow some combination of the above
operands.
-- Function: nonmemory_operand
This predicate allows any immediate or register operand valid for
MODE.
-- Function: nonimmediate_operand
This predicate allows any register or memory operand valid for
MODE.
-- Function: general_operand
This predicate allows any immediate, register, or memory operand
valid for MODE.
Finally, there are two generic operator predicates.
-- Function: comparison_operator
This predicate matches any expression which performs an arithmetic
comparison in MODE; that is, `COMPARISON_P' is true for the
expression code.
-- Function: ordered_comparison_operator
This predicate matches any expression which performs an arithmetic
comparison in MODE and whose expression code is valid for integer
modes; that is, the expression code will be one of `eq', `ne',
`lt', `ltu', `le', `leu', `gt', `gtu', `ge', `geu'.
File: gccint.info, Node: Defining Predicates, Prev: Machine-Independent Predicates, Up: Predicates
16.7.2 Defining Machine-Specific Predicates
-------------------------------------------
Many machines have requirements for their operands that cannot be
expressed precisely using the generic predicates. You can define
additional predicates using `define_predicate' and
`define_special_predicate' expressions. These expressions have three
operands:
* The name of the predicate, as it will be referred to in
`match_operand' or `match_operator' expressions.
* An RTL expression which evaluates to true if the predicate allows
the operand OP, false if it does not. This expression can only use
the following RTL codes:
`MATCH_OPERAND'
When written inside a predicate expression, a `MATCH_OPERAND'
expression evaluates to true if the predicate it names would
allow OP. The operand number and constraint are ignored.
Due to limitations in `genrecog', you can only refer to
generic predicates and predicates that have already been
defined.
`MATCH_CODE'
This expression evaluates to true if OP or a specified
subexpression of OP has one of a given list of RTX codes.
The first operand of this expression is a string constant
containing a comma-separated list of RTX code names (in lower
case). These are the codes for which the `MATCH_CODE' will
be true.
The second operand is a string constant which indicates what
subexpression of OP to examine. If it is absent or the empty
string, OP itself is examined. Otherwise, the string constant
must be a sequence of digits and/or lowercase letters. Each
character indicates a subexpression to extract from the
current expression; for the first character this is OP, for
the second and subsequent characters it is the result of the
previous character. A digit N extracts `XEXP (E, N)'; a
letter L extracts `XVECEXP (E, 0, N)' where N is the
alphabetic ordinal of L (0 for `a', 1 for 'b', and so on).
The `MATCH_CODE' then examines the RTX code of the
subexpression extracted by the complete string. It is not
possible to extract components of an `rtvec' that is not at
position 0 within its RTX object.
`MATCH_TEST'
This expression has one operand, a string constant containing
a C expression. The predicate's arguments, OP and MODE, are
available with those names in the C expression. The
`MATCH_TEST' evaluates to true if the C expression evaluates
to a nonzero value. `MATCH_TEST' expressions must not have
side effects.
`AND'
`IOR'
`NOT'
`IF_THEN_ELSE'
The basic `MATCH_' expressions can be combined using these
logical operators, which have the semantics of the C operators
`&&', `||', `!', and `? :' respectively. As in Common Lisp,
you may give an `AND' or `IOR' expression an arbitrary number
of arguments; this has exactly the same effect as writing a
chain of two-argument `AND' or `IOR' expressions.
* An optional block of C code, which should execute `return true' if
the predicate is found to match and `return false' if it does not.
It must not have any side effects. The predicate arguments, OP
and MODE, are available with those names.
If a code block is present in a predicate definition, then the RTL
expression must evaluate to true _and_ the code block must execute
`return true' for the predicate to allow the operand. The RTL
expression is evaluated first; do not re-check anything in the
code block that was checked in the RTL expression.
The program `genrecog' scans `define_predicate' and
`define_special_predicate' expressions to determine which RTX codes are
possibly allowed. You should always make this explicit in the RTL
predicate expression, using `MATCH_OPERAND' and `MATCH_CODE'.
Here is an example of a simple predicate definition, from the IA64
machine description:
;; True if OP is a `SYMBOL_REF' which refers to the sdata section.
(define_predicate "small_addr_symbolic_operand"
(and (match_code "symbol_ref")
(match_test "SYMBOL_REF_SMALL_ADDR_P (op)")))
And here is another, showing the use of the C block.
;; True if OP is a register operand that is (or could be) a GR reg.
(define_predicate "gr_register_operand"
(match_operand 0 "register_operand")
{
unsigned int regno;
if (GET_CODE (op) == SUBREG)
op = SUBREG_REG (op);
regno = REGNO (op);
return (regno >= FIRST_PSEUDO_REGISTER || GENERAL_REGNO_P (regno));
})
Predicates written with `define_predicate' automatically include a
test that MODE is `VOIDmode', or OP has the same mode as MODE, or OP is
a `CONST_INT' or `CONST_DOUBLE'. They do _not_ check specifically for
integer `CONST_DOUBLE', nor do they test that the value of either kind
of constant fits in the requested mode. This is because
target-specific predicates that take constants usually have to do more
stringent value checks anyway. If you need the exact same treatment of
`CONST_INT' or `CONST_DOUBLE' that the generic predicates provide, use
a `MATCH_OPERAND' subexpression to call `const_int_operand',
`const_double_operand', or `immediate_operand'.
Predicates written with `define_special_predicate' do not get any
automatic mode checks, and are treated as having special mode handling
by `genrecog'.
The program `genpreds' is responsible for generating code to test
predicates. It also writes a header file containing function
declarations for all machine-specific predicates. It is not necessary
to declare these predicates in `CPU-protos.h'.
File: gccint.info, Node: Constraints, Next: Standard Names, Prev: Predicates, Up: Machine Desc
16.8 Operand Constraints
========================
Each `match_operand' in an instruction pattern can specify constraints
for the operands allowed. The constraints allow you to fine-tune
matching within the set of operands allowed by the predicate.
Constraints can say whether an operand may be in a register, and which
kinds of register; whether the operand can be a memory reference, and
which kinds of address; whether the operand may be an immediate
constant, and which possible values it may have. Constraints can also
require two operands to match. Side-effects aren't allowed in operands
of inline `asm', unless `<' or `>' constraints are used, because there
is no guarantee that the side-effects will happen exactly once in an
instruction that can update the addressing register.
* Menu:
* Simple Constraints:: Basic use of constraints.
* Multi-Alternative:: When an insn has two alternative constraint-patterns.
* Class Preferences:: Constraints guide which hard register to put things in.
* Modifiers:: More precise control over effects of constraints.
* Disable Insn Alternatives:: Disable insn alternatives using the `enabled' attribute.
* Machine Constraints:: Existing constraints for some particular machines.
* Define Constraints:: How to define machine-specific constraints.
* C Constraint Interface:: How to test constraints from C code.
File: gccint.info, Node: Simple Constraints, Next: Multi-Alternative, Up: Constraints
16.8.1 Simple Constraints
-------------------------
The simplest kind of constraint is a string full of letters, each of
which describes one kind of operand that is permitted. Here are the
letters that are allowed:
whitespace
Whitespace characters are ignored and can be inserted at any
position except the first. This enables each alternative for
different operands to be visually aligned in the machine
description even if they have different number of constraints and
modifiers.
`m'
A memory operand is allowed, with any kind of address that the
machine supports in general. Note that the letter used for the
general memory constraint can be re-defined by a back end using
the `TARGET_MEM_CONSTRAINT' macro.
`o'
A memory operand is allowed, but only if the address is
"offsettable". This means that adding a small integer (actually,
the width in bytes of the operand, as determined by its machine
mode) may be added to the address and the result is also a valid
memory address.
For example, an address which is constant is offsettable; so is an
address that is the sum of a register and a constant (as long as a
slightly larger constant is also within the range of
address-offsets supported by the machine); but an autoincrement or
autodecrement address is not offsettable. More complicated
indirect/indexed addresses may or may not be offsettable depending
on the other addressing modes that the machine supports.
Note that in an output operand which can be matched by another
operand, the constraint letter `o' is valid only when accompanied
by both `<' (if the target machine has predecrement addressing)
and `>' (if the target machine has preincrement addressing).
`V'
A memory operand that is not offsettable. In other words,
anything that would fit the `m' constraint but not the `o'
constraint.
`<'
A memory operand with autodecrement addressing (either
predecrement or postdecrement) is allowed. In inline `asm' this
constraint is only allowed if the operand is used exactly once in
an instruction that can handle the side-effects. Not using an
operand with `<' in constraint string in the inline `asm' pattern
at all or using it in multiple instructions isn't valid, because
the side-effects wouldn't be performed or would be performed more
than once. Furthermore, on some targets the operand with `<' in
constraint string must be accompanied by special instruction
suffixes like `%U0' instruction suffix on PowerPC or `%P0' on
IA-64.
`>'
A memory operand with autoincrement addressing (either
preincrement or postincrement) is allowed. In inline `asm' the
same restrictions as for `<' apply.
`r'
A register operand is allowed provided that it is in a general
register.
`i'
An immediate integer operand (one with constant value) is allowed.
This includes symbolic constants whose values will be known only at
assembly time or later.
`n'
An immediate integer operand with a known numeric value is allowed.
Many systems cannot support assembly-time constants for operands
less than a word wide. Constraints for these operands should use
`n' rather than `i'.
`I', `J', `K', ... `P'
Other letters in the range `I' through `P' may be defined in a
machine-dependent fashion to permit immediate integer operands with
explicit integer values in specified ranges. For example, on the
68000, `I' is defined to stand for the range of values 1 to 8.
This is the range permitted as a shift count in the shift
instructions.
`E'
An immediate floating operand (expression code `const_double') is
allowed, but only if the target floating point format is the same
as that of the host machine (on which the compiler is running).
`F'
An immediate floating operand (expression code `const_double' or
`const_vector') is allowed.
`G', `H'
`G' and `H' may be defined in a machine-dependent fashion to
permit immediate floating operands in particular ranges of values.
`s'
An immediate integer operand whose value is not an explicit
integer is allowed.
This might appear strange; if an insn allows a constant operand
with a value not known at compile time, it certainly must allow
any known value. So why use `s' instead of `i'? Sometimes it
allows better code to be generated.
For example, on the 68000 in a fullword instruction it is possible
to use an immediate operand; but if the immediate value is between
-128 and 127, better code results from loading the value into a
register and using the register. This is because the load into
the register can be done with a `moveq' instruction. We arrange
for this to happen by defining the letter `K' to mean "any integer
outside the range -128 to 127", and then specifying `Ks' in the
operand constraints.
`g'
Any register, memory or immediate integer operand is allowed,
except for registers that are not general registers.
`X'
Any operand whatsoever is allowed, even if it does not satisfy
`general_operand'. This is normally used in the constraint of a
`match_scratch' when certain alternatives will not actually
require a scratch register.
`0', `1', `2', ... `9'
An operand that matches the specified operand number is allowed.
If a digit is used together with letters within the same
alternative, the digit should come last.
This number is allowed to be more than a single digit. If multiple
digits are encountered consecutively, they are interpreted as a
single decimal integer. There is scant chance for ambiguity,
since to-date it has never been desirable that `10' be interpreted
as matching either operand 1 _or_ operand 0. Should this be
desired, one can use multiple alternatives instead.
This is called a "matching constraint" and what it really means is
that the assembler has only a single operand that fills two roles
considered separate in the RTL insn. For example, an add insn has
two input operands and one output operand in the RTL, but on most
CISC machines an add instruction really has only two operands, one
of them an input-output operand:
addl #35,r12
Matching constraints are used in these circumstances. More
precisely, the two operands that match must include one input-only
operand and one output-only operand. Moreover, the digit must be a
smaller number than the number of the operand that uses it in the
constraint.
For operands to match in a particular case usually means that they
are identical-looking RTL expressions. But in a few special cases
specific kinds of dissimilarity are allowed. For example, `*x' as
an input operand will match `*x++' as an output operand. For
proper results in such cases, the output template should always
use the output-operand's number when printing the operand.
`p'
An operand that is a valid memory address is allowed. This is for
"load address" and "push address" instructions.
`p' in the constraint must be accompanied by `address_operand' as
the predicate in the `match_operand'. This predicate interprets
the mode specified in the `match_operand' as the mode of the memory
reference for which the address would be valid.
OTHER-LETTERS
Other letters can be defined in machine-dependent fashion to stand
for particular classes of registers or other arbitrary operand
types. `d', `a' and `f' are defined on the 68000/68020 to stand
for data, address and floating point registers.
In order to have valid assembler code, each operand must satisfy its
constraint. But a failure to do so does not prevent the pattern from
applying to an insn. Instead, it directs the compiler to modify the
code so that the constraint will be satisfied. Usually this is done by
copying an operand into a register.
Contrast, therefore, the two instruction patterns that follow:
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=r")
(plus:SI (match_dup 0)
(match_operand:SI 1 "general_operand" "r")))]
""
"...")
which has two operands, one of which must appear in two places, and
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=r")
(plus:SI (match_operand:SI 1 "general_operand" "0")
(match_operand:SI 2 "general_operand" "r")))]
""
"...")
which has three operands, two of which are required by a constraint to
be identical. If we are considering an insn of the form
(insn N PREV NEXT
(set (reg:SI 3)
(plus:SI (reg:SI 6) (reg:SI 109)))
...)
the first pattern would not apply at all, because this insn does not
contain two identical subexpressions in the right place. The pattern
would say, "That does not look like an add instruction; try other
patterns". The second pattern would say, "Yes, that's an add
instruction, but there is something wrong with it". It would direct
the reload pass of the compiler to generate additional insns to make
the constraint true. The results might look like this:
(insn N2 PREV N
(set (reg:SI 3) (reg:SI 6))
...)
(insn N N2 NEXT
(set (reg:SI 3)
(plus:SI (reg:SI 3) (reg:SI 109)))
...)
It is up to you to make sure that each operand, in each pattern, has
constraints that can handle any RTL expression that could be present for
that operand. (When multiple alternatives are in use, each pattern
must, for each possible combination of operand expressions, have at
least one alternative which can handle that combination of operands.)
The constraints don't need to _allow_ any possible operand--when this is
the case, they do not constrain--but they must at least point the way to
reloading any possible operand so that it will fit.
* If the constraint accepts whatever operands the predicate permits,
there is no problem: reloading is never necessary for this operand.
For example, an operand whose constraints permit everything except
registers is safe provided its predicate rejects registers.
An operand whose predicate accepts only constant values is safe
provided its constraints include the letter `i'. If any possible
constant value is accepted, then nothing less than `i' will do; if
the predicate is more selective, then the constraints may also be
more selective.
* Any operand expression can be reloaded by copying it into a
register. So if an operand's constraints allow some kind of
register, it is certain to be safe. It need not permit all
classes of registers; the compiler knows how to copy a register
into another register of the proper class in order to make an
instruction valid.
* A nonoffsettable memory reference can be reloaded by copying the
address into a register. So if the constraint uses the letter
`o', all memory references are taken care of.
* A constant operand can be reloaded by allocating space in memory to
hold it as preinitialized data. Then the memory reference can be
used in place of the constant. So if the constraint uses the
letters `o' or `m', constant operands are not a problem.
* If the constraint permits a constant and a pseudo register used in
an insn was not allocated to a hard register and is equivalent to
a constant, the register will be replaced with the constant. If
the predicate does not permit a constant and the insn is
re-recognized for some reason, the compiler will crash. Thus the
predicate must always recognize any objects allowed by the
constraint.
If the operand's predicate can recognize registers, but the constraint
does not permit them, it can make the compiler crash. When this
operand happens to be a register, the reload pass will be stymied,
because it does not know how to copy a register temporarily into memory.
If the predicate accepts a unary operator, the constraint applies to
the operand. For example, the MIPS processor at ISA level 3 supports an
instruction which adds two registers in `SImode' to produce a `DImode'
result, but only if the registers are correctly sign extended. This
predicate for the input operands accepts a `sign_extend' of an `SImode'
register. Write the constraint to indicate the type of register that
is required for the operand of the `sign_extend'.
File: gccint.info, Node: Multi-Alternative, Next: Class Preferences, Prev: Simple Constraints, Up: Constraints
16.8.2 Multiple Alternative Constraints
---------------------------------------
Sometimes a single instruction has multiple alternative sets of possible
operands. For example, on the 68000, a logical-or instruction can
combine register or an immediate value into memory, or it can combine
any kind of operand into a register; but it cannot combine one memory
location into another.
These constraints are represented as multiple alternatives. An
alternative can be described by a series of letters for each operand.
The overall constraint for an operand is made from the letters for this
operand from the first alternative, a comma, the letters for this
operand from the second alternative, a comma, and so on until the last
alternative. Here is how it is done for fullword logical-or on the
68000:
(define_insn "iorsi3"
[(set (match_operand:SI 0 "general_operand" "=m,d")
(ior:SI (match_operand:SI 1 "general_operand" "%0,0")
(match_operand:SI 2 "general_operand" "dKs,dmKs")))]
...)
The first alternative has `m' (memory) for operand 0, `0' for operand
1 (meaning it must match operand 0), and `dKs' for operand 2. The
second alternative has `d' (data register) for operand 0, `0' for
operand 1, and `dmKs' for operand 2. The `=' and `%' in the
constraints apply to all the alternatives; their meaning is explained
in the next section (*note Class Preferences::).
If all the operands fit any one alternative, the instruction is valid.
Otherwise, for each alternative, the compiler counts how many
instructions must be added to copy the operands so that that
alternative applies. The alternative requiring the least copying is
chosen. If two alternatives need the same amount of copying, the one
that comes first is chosen. These choices can be altered with the `?'
and `!' characters:
`?'
Disparage slightly the alternative that the `?' appears in, as a
choice when no alternative applies exactly. The compiler regards
this alternative as one unit more costly for each `?' that appears
in it.
`!'
Disparage severely the alternative that the `!' appears in. This
alternative can still be used if it fits without reloading, but if
reloading is needed, some other alternative will be used.
When an insn pattern has multiple alternatives in its constraints,
often the appearance of the assembler code is determined mostly by which
alternative was matched. When this is so, the C code for writing the
assembler code can use the variable `which_alternative', which is the
ordinal number of the alternative that was actually satisfied (0 for
the first, 1 for the second alternative, etc.). *Note Output
Statement::.
File: gccint.info, Node: Class Preferences, Next: Modifiers, Prev: Multi-Alternative, Up: Constraints
16.8.3 Register Class Preferences
---------------------------------
The operand constraints have another function: they enable the compiler
to decide which kind of hardware register a pseudo register is best
allocated to. The compiler examines the constraints that apply to the
insns that use the pseudo register, looking for the machine-dependent
letters such as `d' and `a' that specify classes of registers. The
pseudo register is put in whichever class gets the most "votes". The
constraint letters `g' and `r' also vote: they vote in favor of a
general register. The machine description says which registers are
considered general.
Of course, on some machines all registers are equivalent, and no
register classes are defined. Then none of this complexity is relevant.
File: gccint.info, Node: Modifiers, Next: Disable Insn Alternatives, Prev: Class Preferences, Up: Constraints
16.8.4 Constraint Modifier Characters
-------------------------------------
Here are constraint modifier characters.
`='
Means that this operand is write-only for this instruction: the
previous value is discarded and replaced by output data.
`+'
Means that this operand is both read and written by the
instruction.
When the compiler fixes up the operands to satisfy the constraints,
it needs to know which operands are inputs to the instruction and
which are outputs from it. `=' identifies an output; `+'
identifies an operand that is both input and output; all other
operands are assumed to be input only.
If you specify `=' or `+' in a constraint, you put it in the first
character of the constraint string.
`&'
Means (in a particular alternative) that this operand is an
"earlyclobber" operand, which is modified before the instruction is
finished using the input operands. Therefore, this operand may
not lie in a register that is used as an input operand or as part
of any memory address.
`&' applies only to the alternative in which it is written. In
constraints with multiple alternatives, sometimes one alternative
requires `&' while others do not. See, for example, the `movdf'
insn of the 68000.
An input operand can be tied to an earlyclobber operand if its only
use as an input occurs before the early result is written. Adding
alternatives of this form often allows GCC to produce better code
when only some of the inputs can be affected by the earlyclobber.
See, for example, the `mulsi3' insn of the ARM.
`&' does not obviate the need to write `='.
`%'
Declares the instruction to be commutative for this operand and the
following operand. This means that the compiler may interchange
the two operands if that is the cheapest way to make all operands
fit the constraints. This is often used in patterns for addition
instructions that really have only two operands: the result must
go in one of the arguments. Here for example, is how the 68000
halfword-add instruction is defined:
(define_insn "addhi3"
[(set (match_operand:HI 0 "general_operand" "=m,r")
(plus:HI (match_operand:HI 1 "general_operand" "%0,0")
(match_operand:HI 2 "general_operand" "di,g")))]
...)
GCC can only handle one commutative pair in an asm; if you use
more, the compiler may fail. Note that you need not use the
modifier if the two alternatives are strictly identical; this
would only waste time in the reload pass. The modifier is not
operational after register allocation, so the result of
`define_peephole2' and `define_split's performed after reload
cannot rely on `%' to make the intended insn match.
`#'
Says that all following characters, up to the next comma, are to be
ignored as a constraint. They are significant only for choosing
register preferences.
`*'
Says that the following character should be ignored when choosing
register preferences. `*' has no effect on the meaning of the
constraint as a constraint, and no effect on reloading.
Here is an example: the 68000 has an instruction to sign-extend a
halfword in a data register, and can also sign-extend a value by
copying it into an address register. While either kind of
register is acceptable, the constraints on an address-register
destination are less strict, so it is best if register allocation
makes an address register its goal. Therefore, `*' is used so
that the `d' constraint letter (for data register) is ignored when
computing register preferences.
(define_insn "extendhisi2"
[(set (match_operand:SI 0 "general_operand" "=*d,a")
(sign_extend:SI
(match_operand:HI 1 "general_operand" "0,g")))]
...)
File: gccint.info, Node: Machine Constraints, Next: Define Constraints, Prev: Disable Insn Alternatives, Up: Constraints
16.8.5 Constraints for Particular Machines
------------------------------------------
Whenever possible, you should use the general-purpose constraint letters
in `asm' arguments, since they will convey meaning more readily to
people reading your code. Failing that, use the constraint letters
that usually have very similar meanings across architectures. The most
commonly used constraints are `m' and `r' (for memory and
general-purpose registers respectively; *note Simple Constraints::), and
`I', usually the letter indicating the most common immediate-constant
format.
Each architecture defines additional constraints. These constraints
are used by the compiler itself for instruction generation, as well as
for `asm' statements; therefore, some of the constraints are not
particularly useful for `asm'. Here is a summary of some of the
machine-dependent constraints available on some particular machines; it
includes both constraints that are useful for `asm' and constraints
that aren't. The compiler source file mentioned in the table heading
for each architecture is the definitive reference for the meanings of
that architecture's constraints.
_ARM family--`config/arm/arm.h'_
`f'
Floating-point register
`w'
VFP floating-point register
`F'
One of the floating-point constants 0.0, 0.5, 1.0, 2.0, 3.0,
4.0, 5.0 or 10.0
`G'
Floating-point constant that would satisfy the constraint `F'
if it were negated
`I'
Integer that is valid as an immediate operand in a data
processing instruction. That is, an integer in the range 0
to 255 rotated by a multiple of 2
`J'
Integer in the range -4095 to 4095
`K'
Integer that satisfies constraint `I' when inverted (ones
complement)
`L'
Integer that satisfies constraint `I' when negated (twos
complement)
`M'
Integer in the range 0 to 32
`Q'
A memory reference where the exact address is in a single
register (``m'' is preferable for `asm' statements)
`R'
An item in the constant pool
`S'
A symbol in the text segment of the current file
`Uv'
A memory reference suitable for VFP load/store insns
(reg+constant offset)
`Uy'
A memory reference suitable for iWMMXt load/store
instructions.
`Uq'
A memory reference suitable for the ARMv4 ldrsb instruction.
_AVR family--`config/avr/constraints.md'_
`l'
Registers from r0 to r15
`a'
Registers from r16 to r23
`d'
Registers from r16 to r31
`w'
Registers from r24 to r31. These registers can be used in
`adiw' command
`e'
Pointer register (r26-r31)
`b'
Base pointer register (r28-r31)
`q'
Stack pointer register (SPH:SPL)
`t'
Temporary register r0
`x'
Register pair X (r27:r26)
`y'
Register pair Y (r29:r28)
`z'
Register pair Z (r31:r30)
`I'
Constant greater than -1, less than 64
`J'
Constant greater than -64, less than 1
`K'
Constant integer 2
`L'
Constant integer 0
`M'
Constant that fits in 8 bits
`N'
Constant integer -1
`O'
Constant integer 8, 16, or 24
`P'
Constant integer 1
`G'
A floating point constant 0.0
`R'
Integer constant in the range -6 ... 5.
`Q'
A memory address based on Y or Z pointer with displacement.
_CRX Architecture--`config/crx/crx.h'_
`b'
Registers from r0 to r14 (registers without stack pointer)
`l'
Register r16 (64-bit accumulator lo register)
`h'
Register r17 (64-bit accumulator hi register)
`k'
Register pair r16-r17. (64-bit accumulator lo-hi pair)
`I'
Constant that fits in 3 bits
`J'
Constant that fits in 4 bits
`K'
Constant that fits in 5 bits
`L'
Constant that is one of -1, 4, -4, 7, 8, 12, 16, 20, 32, 48
`G'
Floating point constant that is legal for store immediate
_Hewlett-Packard PA-RISC--`config/pa/pa.h'_
`a'
General register 1
`f'
Floating point register
`q'
Shift amount register
`x'
Floating point register (deprecated)
`y'
Upper floating point register (32-bit), floating point
register (64-bit)
`Z'
Any register
`I'
Signed 11-bit integer constant
`J'
Signed 14-bit integer constant
`K'
Integer constant that can be deposited with a `zdepi'
instruction
`L'
Signed 5-bit integer constant
`M'
Integer constant 0
`N'
Integer constant that can be loaded with a `ldil' instruction
`O'
Integer constant whose value plus one is a power of 2
`P'
Integer constant that can be used for `and' operations in
`depi' and `extru' instructions
`S'
Integer constant 31
`U'
Integer constant 63
`G'
Floating-point constant 0.0
`A'
A `lo_sum' data-linkage-table memory operand
`Q'
A memory operand that can be used as the destination operand
of an integer store instruction
`R'
A scaled or unscaled indexed memory operand
`T'
A memory operand for floating-point loads and stores
`W'
A register indirect memory operand
_picoChip family--`picochip.h'_
`k'
Stack register.
`f'
Pointer register. A register which can be used to access
memory without supplying an offset. Any other register can
be used to access memory, but will need a constant offset.
In the case of the offset being zero, it is more efficient to
use a pointer register, since this reduces code size.
`t'
A twin register. A register which may be paired with an
adjacent register to create a 32-bit register.
`a'
Any absolute memory address (e.g., symbolic constant, symbolic
constant + offset).
`I'
4-bit signed integer.
`J'
4-bit unsigned integer.
`K'
8-bit signed integer.
`M'
Any constant whose absolute value is no greater than 4-bits.
`N'
10-bit signed integer
`O'
16-bit signed integer.
_PowerPC and IBM RS6000--`config/rs6000/rs6000.h'_
`b'
Address base register
`d'
Floating point register (containing 64-bit value)
`f'
Floating point register (containing 32-bit value)
`v'
Altivec vector register
`wd'
VSX vector register to hold vector double data
`wf'
VSX vector register to hold vector float data
`ws'
VSX vector register to hold scalar float data
`wa'
Any VSX register
`h'
`MQ', `CTR', or `LINK' register
`q'
`MQ' register
`c'
`CTR' register
`l'
`LINK' register
`x'
`CR' register (condition register) number 0
`y'
`CR' register (condition register)
`z'
`XER[CA]' carry bit (part of the XER register)
`I'
Signed 16-bit constant
`J'
Unsigned 16-bit constant shifted left 16 bits (use `L'
instead for `SImode' constants)
`K'
Unsigned 16-bit constant
`L'
Signed 16-bit constant shifted left 16 bits
`M'
Constant larger than 31
`N'
Exact power of 2
`O'
Zero
`P'
Constant whose negation is a signed 16-bit constant
`G'
Floating point constant that can be loaded into a register
with one instruction per word
`H'
Integer/Floating point constant that can be loaded into a
register using three instructions
`m'
Memory operand. Normally, `m' does not allow addresses that
update the base register. If `<' or `>' constraint is also
used, they are allowed and therefore on PowerPC targets in
that case it is only safe to use `m<>' in an `asm' statement
if that `asm' statement accesses the operand exactly once.
The `asm' statement must also use `%U<OPNO>' as a placeholder
for the "update" flag in the corresponding load or store
instruction. For example:
asm ("st%U0 %1,%0" : "=m<>" (mem) : "r" (val));
is correct but:
asm ("st %1,%0" : "=m<>" (mem) : "r" (val));
is not.
`es'
A "stable" memory operand; that is, one which does not
include any automodification of the base register. This used
to be useful when `m' allowed automodification of the base
register, but as those are now only allowed when `<' or `>'
is used, `es' is basically the same as `m' without `<' and
`>'.
`Q'
Memory operand that is an offset from a register (it is
usually better to use `m' or `es' in `asm' statements)
`Z'
Memory operand that is an indexed or indirect from a register
(it is usually better to use `m' or `es' in `asm' statements)
`R'
AIX TOC entry
`a'
Address operand that is an indexed or indirect from a
register (`p' is preferable for `asm' statements)
`S'
Constant suitable as a 64-bit mask operand
`T'
Constant suitable as a 32-bit mask operand
`U'
System V Release 4 small data area reference
`t'
AND masks that can be performed by two rldic{l, r}
instructions
`W'
Vector constant that does not require memory
`j'
Vector constant that is all zeros.
_Intel 386--`config/i386/constraints.md'_
`R'
Legacy register--the eight integer registers available on all
i386 processors (`a', `b', `c', `d', `si', `di', `bp', `sp').
`q'
Any register accessible as `Rl'. In 32-bit mode, `a', `b',
`c', and `d'; in 64-bit mode, any integer register.
`Q'
Any register accessible as `Rh': `a', `b', `c', and `d'.
`l'
Any register that can be used as the index in a base+index
memory access: that is, any general register except the stack
pointer.
`a'
The `a' register.
`b'
The `b' register.
`c'
The `c' register.
`d'
The `d' register.
`S'
The `si' register.
`D'
The `di' register.
`A'
The `a' and `d' registers. This class is used for
instructions that return double word results in the `ax:dx'
register pair. Single word values will be allocated either
in `ax' or `dx'. For example on i386 the following
implements `rdtsc':
unsigned long long rdtsc (void)
{
unsigned long long tick;
__asm__ __volatile__("rdtsc":"=A"(tick));
return tick;
}
This is not correct on x86_64 as it would allocate tick in
either `ax' or `dx'. You have to use the following variant
instead:
unsigned long long rdtsc (void)
{
unsigned int tickl, tickh;
__asm__ __volatile__("rdtsc":"=a"(tickl),"=d"(tickh));
return ((unsigned long long)tickh << 32)|tickl;
}
`f'
Any 80387 floating-point (stack) register.
`t'
Top of 80387 floating-point stack (`%st(0)').
`u'
Second from top of 80387 floating-point stack (`%st(1)').
`y'
Any MMX register.
`x'
Any SSE register.
`Yz'
First SSE register (`%xmm0').
`Y2'
Any SSE register, when SSE2 is enabled.
`Yi'
Any SSE register, when SSE2 and inter-unit moves are enabled.
`Ym'
Any MMX register, when inter-unit moves are enabled.
`I'
Integer constant in the range 0 ... 31, for 32-bit shifts.
`J'
Integer constant in the range 0 ... 63, for 64-bit shifts.
`K'
Signed 8-bit integer constant.
`L'
`0xFF' or `0xFFFF', for andsi as a zero-extending move.
`M'
0, 1, 2, or 3 (shifts for the `lea' instruction).
`N'
Unsigned 8-bit integer constant (for `in' and `out'
instructions).
`O'
Integer constant in the range 0 ... 127, for 128-bit shifts.
`G'
Standard 80387 floating point constant.
`C'
Standard SSE floating point constant.
`e'
32-bit signed integer constant, or a symbolic reference known
to fit that range (for immediate operands in sign-extending
x86-64 instructions).
`Z'
32-bit unsigned integer constant, or a symbolic reference
known to fit that range (for immediate operands in
zero-extending x86-64 instructions).
_Intel IA-64--`config/ia64/ia64.h'_
`a'
General register `r0' to `r3' for `addl' instruction
`b'
Branch register
`c'
Predicate register (`c' as in "conditional")
`d'
Application register residing in M-unit
`e'
Application register residing in I-unit
`f'
Floating-point register
`m'
Memory operand. If used together with `<' or `>', the
operand can have postincrement and postdecrement which
require printing with `%Pn' on IA-64.
`G'
Floating-point constant 0.0 or 1.0
`I'
14-bit signed integer constant
`J'
22-bit signed integer constant
`K'
8-bit signed integer constant for logical instructions
`L'
8-bit adjusted signed integer constant for compare pseudo-ops
`M'
6-bit unsigned integer constant for shift counts
`N'
9-bit signed integer constant for load and store
postincrements
`O'
The constant zero
`P'
0 or -1 for `dep' instruction
`Q'
Non-volatile memory for floating-point loads and stores
`R'
Integer constant in the range 1 to 4 for `shladd' instruction
`S'
Memory operand except postincrement and postdecrement. This
is now roughly the same as `m' when not used together with `<'
or `>'.
_FRV--`config/frv/frv.h'_
`a'
Register in the class `ACC_REGS' (`acc0' to `acc7').
`b'
Register in the class `EVEN_ACC_REGS' (`acc0' to `acc7').
`c'
Register in the class `CC_REGS' (`fcc0' to `fcc3' and `icc0'
to `icc3').
`d'
Register in the class `GPR_REGS' (`gr0' to `gr63').
`e'
Register in the class `EVEN_REGS' (`gr0' to `gr63'). Odd
registers are excluded not in the class but through the use
of a machine mode larger than 4 bytes.
`f'
Register in the class `FPR_REGS' (`fr0' to `fr63').
`h'
Register in the class `FEVEN_REGS' (`fr0' to `fr63'). Odd
registers are excluded not in the class but through the use
of a machine mode larger than 4 bytes.
`l'
Register in the class `LR_REG' (the `lr' register).
`q'
Register in the class `QUAD_REGS' (`gr2' to `gr63').
Register numbers not divisible by 4 are excluded not in the
class but through the use of a machine mode larger than 8
bytes.
`t'
Register in the class `ICC_REGS' (`icc0' to `icc3').
`u'
Register in the class `FCC_REGS' (`fcc0' to `fcc3').
`v'
Register in the class `ICR_REGS' (`cc4' to `cc7').
`w'
Register in the class `FCR_REGS' (`cc0' to `cc3').
`x'
Register in the class `QUAD_FPR_REGS' (`fr0' to `fr63').
Register numbers not divisible by 4 are excluded not in the
class but through the use of a machine mode larger than 8
bytes.
`z'
Register in the class `SPR_REGS' (`lcr' and `lr').
`A'
Register in the class `QUAD_ACC_REGS' (`acc0' to `acc7').
`B'
Register in the class `ACCG_REGS' (`accg0' to `accg7').
`C'
Register in the class `CR_REGS' (`cc0' to `cc7').
`G'
Floating point constant zero
`I'
6-bit signed integer constant
`J'
10-bit signed integer constant
`L'
16-bit signed integer constant
`M'
16-bit unsigned integer constant
`N'
12-bit signed integer constant that is negative--i.e. in the
range of -2048 to -1
`O'
Constant zero
`P'
12-bit signed integer constant that is greater than
zero--i.e. in the range of 1 to 2047.
_Blackfin family--`config/bfin/constraints.md'_
`a'
P register
`d'
D register
`z'
A call clobbered P register.
`qN'
A single register. If N is in the range 0 to 7, the
corresponding D register. If it is `A', then the register P0.
`D'
Even-numbered D register
`W'
Odd-numbered D register
`e'
Accumulator register.
`A'
Even-numbered accumulator register.
`B'
Odd-numbered accumulator register.
`b'
I register
`v'
B register
`f'
M register
`c'
Registers used for circular buffering, i.e. I, B, or L
registers.
`C'
The CC register.
`t'
LT0 or LT1.
`k'
LC0 or LC1.
`u'
LB0 or LB1.
`x'
Any D, P, B, M, I or L register.
`y'
Additional registers typically used only in prologues and
epilogues: RETS, RETN, RETI, RETX, RETE, ASTAT, SEQSTAT and
USP.
`w'
Any register except accumulators or CC.
`Ksh'
Signed 16 bit integer (in the range -32768 to 32767)
`Kuh'
Unsigned 16 bit integer (in the range 0 to 65535)
`Ks7'
Signed 7 bit integer (in the range -64 to 63)
`Ku7'
Unsigned 7 bit integer (in the range 0 to 127)
`Ku5'
Unsigned 5 bit integer (in the range 0 to 31)
`Ks4'
Signed 4 bit integer (in the range -8 to 7)
`Ks3'
Signed 3 bit integer (in the range -3 to 4)
`Ku3'
Unsigned 3 bit integer (in the range 0 to 7)
`PN'
Constant N, where N is a single-digit constant in the range 0
to 4.
`PA'
An integer equal to one of the MACFLAG_XXX constants that is
suitable for use with either accumulator.
`PB'
An integer equal to one of the MACFLAG_XXX constants that is
suitable for use only with accumulator A1.
`M1'
Constant 255.
`M2'
Constant 65535.
`J'
An integer constant with exactly a single bit set.
`L'
An integer constant with all bits set except exactly one.
`H'
`Q'
Any SYMBOL_REF.
_M32C--`config/m32c/m32c.c'_
`Rsp'
`Rfb'
`Rsb'
`$sp', `$fb', `$sb'.
`Rcr'
Any control register, when they're 16 bits wide (nothing if
control registers are 24 bits wide)
`Rcl'
Any control register, when they're 24 bits wide.
`R0w'
`R1w'
`R2w'
`R3w'
$r0, $r1, $r2, $r3.
`R02'
$r0 or $r2, or $r2r0 for 32 bit values.
`R13'
$r1 or $r3, or $r3r1 for 32 bit values.
`Rdi'
A register that can hold a 64 bit value.
`Rhl'
$r0 or $r1 (registers with addressable high/low bytes)
`R23'
$r2 or $r3
`Raa'
Address registers
`Raw'
Address registers when they're 16 bits wide.
`Ral'
Address registers when they're 24 bits wide.
`Rqi'
Registers that can hold QI values.
`Rad'
Registers that can be used with displacements ($a0, $a1, $sb).
`Rsi'
Registers that can hold 32 bit values.
`Rhi'
Registers that can hold 16 bit values.
`Rhc'
Registers chat can hold 16 bit values, including all control
registers.
`Rra'
$r0 through R1, plus $a0 and $a1.
`Rfl'
The flags register.
`Rmm'
The memory-based pseudo-registers $mem0 through $mem15.
`Rpi'
Registers that can hold pointers (16 bit registers for r8c,
m16c; 24 bit registers for m32cm, m32c).
`Rpa'
Matches multiple registers in a PARALLEL to form a larger
register. Used to match function return values.
`Is3'
-8 ... 7
`IS1'
-128 ... 127
`IS2'
-32768 ... 32767
`IU2'
0 ... 65535
`In4'
-8 ... -1 or 1 ... 8
`In5'
-16 ... -1 or 1 ... 16
`In6'
-32 ... -1 or 1 ... 32
`IM2'
-65536 ... -1
`Ilb'
An 8 bit value with exactly one bit set.
`Ilw'
A 16 bit value with exactly one bit set.
`Sd'
The common src/dest memory addressing modes.
`Sa'
Memory addressed using $a0 or $a1.
`Si'
Memory addressed with immediate addresses.
`Ss'
Memory addressed using the stack pointer ($sp).
`Sf'
Memory addressed using the frame base register ($fb).
`Ss'
Memory addressed using the small base register ($sb).
`S1'
$r1h
_MeP--`config/mep/constraints.md'_
`a'
The $sp register.
`b'
The $tp register.
`c'
Any control register.
`d'
Either the $hi or the $lo register.
`em'
Coprocessor registers that can be directly loaded ($c0-$c15).
`ex'
Coprocessor registers that can be moved to each other.
`er'
Coprocessor registers that can be moved to core registers.
`h'
The $hi register.
`j'
The $rpc register.
`l'
The $lo register.
`t'
Registers which can be used in $tp-relative addressing.
`v'
The $gp register.
`x'
The coprocessor registers.
`y'
The coprocessor control registers.
`z'
The $0 register.
`A'
User-defined register set A.
`B'
User-defined register set B.
`C'
User-defined register set C.
`D'
User-defined register set D.
`I'
Offsets for $gp-rel addressing.
`J'
Constants that can be used directly with boolean insns.
`K'
Constants that can be moved directly to registers.
`L'
Small constants that can be added to registers.
`M'
Long shift counts.
`N'
Small constants that can be compared to registers.
`O'
Constants that can be loaded into the top half of registers.
`S'
Signed 8-bit immediates.
`T'
Symbols encoded for $tp-rel or $gp-rel addressing.
`U'
Non-constant addresses for loading/saving coprocessor
registers.
`W'
The top half of a symbol's value.
`Y'
A register indirect address without offset.
`Z'
Symbolic references to the control bus.
_MicroBlaze--`config/microblaze/constraints.md'_
`d'
A general register (`r0' to `r31').
`z'
A status register (`rmsr', `$fcc1' to `$fcc7').
_MIPS--`config/mips/constraints.md'_
`d'
An address register. This is equivalent to `r' unless
generating MIPS16 code.
`f'
A floating-point register (if available).
`h'
Formerly the `hi' register. This constraint is no longer
supported.
`l'
The `lo' register. Use this register to store values that are
no bigger than a word.
`x'
The concatenated `hi' and `lo' registers. Use this register
to store doubleword values.
`c'
A register suitable for use in an indirect jump. This will
always be `$25' for `-mabicalls'.
`v'
Register `$3'. Do not use this constraint in new code; it is
retained only for compatibility with glibc.
`y'
Equivalent to `r'; retained for backwards compatibility.
`z'
A floating-point condition code register.
`I'
A signed 16-bit constant (for arithmetic instructions).
`J'
Integer zero.
`K'
An unsigned 16-bit constant (for logic instructions).
`L'
A signed 32-bit constant in which the lower 16 bits are zero.
Such constants can be loaded using `lui'.
`M'
A constant that cannot be loaded using `lui', `addiu' or
`ori'.
`N'
A constant in the range -65535 to -1 (inclusive).
`O'
A signed 15-bit constant.
`P'
A constant in the range 1 to 65535 (inclusive).
`G'
Floating-point zero.
`R'
An address that can be used in a non-macro load or store.
_Motorola 680x0--`config/m68k/constraints.md'_
`a'
Address register
`d'
Data register
`f'
68881 floating-point register, if available
`I'
Integer in the range 1 to 8
`J'
16-bit signed number
`K'
Signed number whose magnitude is greater than 0x80
`L'
Integer in the range -8 to -1
`M'
Signed number whose magnitude is greater than 0x100
`N'
Range 24 to 31, rotatert:SI 8 to 1 expressed as rotate
`O'
16 (for rotate using swap)
`P'
Range 8 to 15, rotatert:HI 8 to 1 expressed as rotate
`R'
Numbers that mov3q can handle
`G'
Floating point constant that is not a 68881 constant
`S'
Operands that satisfy 'm' when -mpcrel is in effect
`T'
Operands that satisfy 's' when -mpcrel is not in effect
`Q'
Address register indirect addressing mode
`U'
Register offset addressing
`W'
const_call_operand
`Cs'
symbol_ref or const
`Ci'
const_int
`C0'
const_int 0
`Cj'
Range of signed numbers that don't fit in 16 bits
`Cmvq'
Integers valid for mvq
`Capsw'
Integers valid for a moveq followed by a swap
`Cmvz'
Integers valid for mvz
`Cmvs'
Integers valid for mvs
`Ap'
push_operand
`Ac'
Non-register operands allowed in clr
_Motorola 68HC11 & 68HC12 families--`config/m68hc11/m68hc11.h'_
`a'
Register `a'
`b'
Register `b'
`d'
Register `d'
`q'
An 8-bit register
`t'
Temporary soft register _.tmp
`u'
A soft register _.d1 to _.d31
`w'
Stack pointer register
`x'
Register `x'
`y'
Register `y'
`z'
Pseudo register `z' (replaced by `x' or `y' at the end)
`A'
An address register: x, y or z
`B'
An address register: x or y
`D'
Register pair (x:d) to form a 32-bit value
`L'
Constants in the range -65536 to 65535
`M'
Constants whose 16-bit low part is zero
`N'
Constant integer 1 or -1
`O'
Constant integer 16
`P'
Constants in the range -8 to 2
_Moxie--`config/moxie/constraints.md'_
`A'
An absolute address
`B'
An offset address
`W'
A register indirect memory operand
`I'
A constant in the range of 0 to 255.
`N'
A constant in the range of 0 to -255.
_PDP-11--`config/pdp11/constraints.md'_
`a'
Floating point registers AC0 through AC3. These can be
loaded from/to memory with a single instruction.
`d'
Odd numbered general registers (R1, R3, R5). These are used
for 16-bit multiply operations.
`f'
Any of the floating point registers (AC0 through AC5).
`G'
Floating point constant 0.
`I'
An integer constant that fits in 16 bits.
`J'
An integer constant whose low order 16 bits are zero.
`K'
An integer constant that does not meet the constraints for
codes `I' or `J'.
`L'
The integer constant 1.
`M'
The integer constant -1.
`N'
The integer constant 0.
`O'
Integer constants -4 through -1 and 1 through 4; shifts by
these amounts are handled as multiple single-bit shifts
rather than a single variable-length shift.
`Q'
A memory reference which requires an additional word (address
or offset) after the opcode.
`R'
A memory reference that is encoded within the opcode.
_RX--`config/rx/constraints.md'_
`Q'
An address which does not involve register indirect
addressing or pre/post increment/decrement addressing.
`Symbol'
A symbol reference.
`Int08'
A constant in the range -256 to 255, inclusive.
`Sint08'
A constant in the range -128 to 127, inclusive.
`Sint16'
A constant in the range -32768 to 32767, inclusive.
`Sint24'
A constant in the range -8388608 to 8388607, inclusive.
`Uint04'
A constant in the range 0 to 15, inclusive.
_SPARC--`config/sparc/sparc.h'_
`f'
Floating-point register on the SPARC-V8 architecture and
lower floating-point register on the SPARC-V9 architecture.
`e'
Floating-point register. It is equivalent to `f' on the
SPARC-V8 architecture and contains both lower and upper
floating-point registers on the SPARC-V9 architecture.
`c'
Floating-point condition code register.
`d'
Lower floating-point register. It is only valid on the
SPARC-V9 architecture when the Visual Instruction Set is
available.
`b'
Floating-point register. It is only valid on the SPARC-V9
architecture when the Visual Instruction Set is available.
`h'
64-bit global or out register for the SPARC-V8+ architecture.
`D'
A vector constant
`I'
Signed 13-bit constant
`J'
Zero
`K'
32-bit constant with the low 12 bits clear (a constant that
can be loaded with the `sethi' instruction)
`L'
A constant in the range supported by `movcc' instructions
`M'
A constant in the range supported by `movrcc' instructions
`N'
Same as `K', except that it verifies that bits that are not
in the lower 32-bit range are all zero. Must be used instead
of `K' for modes wider than `SImode'
`O'
The constant 4096
`G'
Floating-point zero
`H'
Signed 13-bit constant, sign-extended to 32 or 64 bits
`Q'
Floating-point constant whose integral representation can be
moved into an integer register using a single sethi
instruction
`R'
Floating-point constant whose integral representation can be
moved into an integer register using a single mov instruction
`S'
Floating-point constant whose integral representation can be
moved into an integer register using a high/lo_sum
instruction sequence
`T'
Memory address aligned to an 8-byte boundary
`U'
Even register
`W'
Memory address for `e' constraint registers
`Y'
Vector zero
_SPU--`config/spu/spu.h'_
`a'
An immediate which can be loaded with the il/ila/ilh/ilhu
instructions. const_int is treated as a 64 bit value.
`c'
An immediate for and/xor/or instructions. const_int is
treated as a 64 bit value.
`d'
An immediate for the `iohl' instruction. const_int is
treated as a 64 bit value.
`f'
An immediate which can be loaded with `fsmbi'.
`A'
An immediate which can be loaded with the il/ila/ilh/ilhu
instructions. const_int is treated as a 32 bit value.
`B'
An immediate for most arithmetic instructions. const_int is
treated as a 32 bit value.
`C'
An immediate for and/xor/or instructions. const_int is
treated as a 32 bit value.
`D'
An immediate for the `iohl' instruction. const_int is
treated as a 32 bit value.
`I'
A constant in the range [-64, 63] for shift/rotate
instructions.
`J'
An unsigned 7-bit constant for conversion/nop/channel
instructions.
`K'
A signed 10-bit constant for most arithmetic instructions.
`M'
A signed 16 bit immediate for `stop'.
`N'
An unsigned 16-bit constant for `iohl' and `fsmbi'.
`O'
An unsigned 7-bit constant whose 3 least significant bits are
0.
`P'
An unsigned 3-bit constant for 16-byte rotates and shifts
`R'
Call operand, reg, for indirect calls
`S'
Call operand, symbol, for relative calls.
`T'
Call operand, const_int, for absolute calls.
`U'
An immediate which can be loaded with the il/ila/ilh/ilhu
instructions. const_int is sign extended to 128 bit.
`W'
An immediate for shift and rotate instructions. const_int is
treated as a 32 bit value.
`Y'
An immediate for and/xor/or instructions. const_int is sign
extended as a 128 bit.
`Z'
An immediate for the `iohl' instruction. const_int is sign
extended to 128 bit.
_S/390 and zSeries--`config/s390/s390.h'_
`a'
Address register (general purpose register except r0)
`c'
Condition code register
`d'
Data register (arbitrary general purpose register)
`f'
Floating-point register
`I'
Unsigned 8-bit constant (0-255)
`J'
Unsigned 12-bit constant (0-4095)
`K'
Signed 16-bit constant (-32768-32767)
`L'
Value appropriate as displacement.
`(0..4095)'
for short displacement
`(-524288..524287)'
for long displacement
`M'
Constant integer with a value of 0x7fffffff.
`N'
Multiple letter constraint followed by 4 parameter letters.
`0..9:'
number of the part counting from most to least
significant
`H,Q:'
mode of the part
`D,S,H:'
mode of the containing operand
`0,F:'
value of the other parts (F--all bits set)
The constraint matches if the specified part of a constant
has a value different from its other parts.
`Q'
Memory reference without index register and with short
displacement.
`R'
Memory reference with index register and short displacement.
`S'
Memory reference without index register but with long
displacement.
`T'
Memory reference with index register and long displacement.
`U'
Pointer with short displacement.
`W'
Pointer with long displacement.
`Y'
Shift count operand.
_Score family--`config/score/score.h'_
`d'
Registers from r0 to r32.
`e'
Registers from r0 to r16.
`t'
r8--r11 or r22--r27 registers.
`h'
hi register.
`l'
lo register.
`x'
hi + lo register.
`q'
cnt register.
`y'
lcb register.
`z'
scb register.
`a'
cnt + lcb + scb register.
`c'
cr0--cr15 register.
`b'
cp1 registers.
`f'
cp2 registers.
`i'
cp3 registers.
`j'
cp1 + cp2 + cp3 registers.
`I'
High 16-bit constant (32-bit constant with 16 LSBs zero).
`J'
Unsigned 5 bit integer (in the range 0 to 31).
`K'
Unsigned 16 bit integer (in the range 0 to 65535).
`L'
Signed 16 bit integer (in the range -32768 to 32767).
`M'
Unsigned 14 bit integer (in the range 0 to 16383).
`N'
Signed 14 bit integer (in the range -8192 to 8191).
`Z'
Any SYMBOL_REF.
_Xstormy16--`config/stormy16/stormy16.h'_
`a'
Register r0.
`b'
Register r1.
`c'
Register r2.
`d'
Register r8.
`e'
Registers r0 through r7.
`t'
Registers r0 and r1.
`y'
The carry register.
`z'
Registers r8 and r9.
`I'
A constant between 0 and 3 inclusive.
`J'
A constant that has exactly one bit set.
`K'
A constant that has exactly one bit clear.
`L'
A constant between 0 and 255 inclusive.
`M'
A constant between -255 and 0 inclusive.
`N'
A constant between -3 and 0 inclusive.
`O'
A constant between 1 and 4 inclusive.
`P'
A constant between -4 and -1 inclusive.
`Q'
A memory reference that is a stack push.
`R'
A memory reference that is a stack pop.
`S'
A memory reference that refers to a constant address of known
value.
`T'
The register indicated by Rx (not implemented yet).
`U'
A constant that is not between 2 and 15 inclusive.
`Z'
The constant 0.
_Xtensa--`config/xtensa/constraints.md'_
`a'
General-purpose 32-bit register
`b'
One-bit boolean register
`A'
MAC16 40-bit accumulator register
`I'
Signed 12-bit integer constant, for use in MOVI instructions
`J'
Signed 8-bit integer constant, for use in ADDI instructions
`K'
Integer constant valid for BccI instructions
`L'
Unsigned constant valid for BccUI instructions
File: gccint.info, Node: Disable Insn Alternatives, Next: Machine Constraints, Prev: Modifiers, Up: Constraints
16.8.6 Disable insn alternatives using the `enabled' attribute
--------------------------------------------------------------
The `enabled' insn attribute may be used to disable certain insn
alternatives for machine-specific reasons. This is useful when adding
new instructions to an existing pattern which are only available for
certain cpu architecture levels as specified with the `-march=' option.
If an insn alternative is disabled, then it will never be used. The
compiler treats the constraints for the disabled alternative as
unsatisfiable.
In order to make use of the `enabled' attribute a back end has to add
in the machine description files:
1. A definition of the `enabled' insn attribute. The attribute is
defined as usual using the `define_attr' command. This definition
should be based on other insn attributes and/or target flags. The
`enabled' attribute is a numeric attribute and should evaluate to
`(const_int 1)' for an enabled alternative and to `(const_int 0)'
otherwise.
2. A definition of another insn attribute used to describe for what
reason an insn alternative might be available or not. E.g.
`cpu_facility' as in the example below.
3. An assignment for the second attribute to each insn definition
combining instructions which are not all available under the same
circumstances. (Note: It obviously only makes sense for
definitions with more than one alternative. Otherwise the insn
pattern should be disabled or enabled using the insn condition.)
E.g. the following two patterns could easily be merged using the
`enabled' attribute:
(define_insn "*movdi_old"
[(set (match_operand:DI 0 "register_operand" "=d")
(match_operand:DI 1 "register_operand" " d"))]
"!TARGET_NEW"
"lgr %0,%1")
(define_insn "*movdi_new"
[(set (match_operand:DI 0 "register_operand" "=d,f,d")
(match_operand:DI 1 "register_operand" " d,d,f"))]
"TARGET_NEW"
"@
lgr %0,%1
ldgr %0,%1
lgdr %0,%1")
to:
(define_insn "*movdi_combined"
[(set (match_operand:DI 0 "register_operand" "=d,f,d")
(match_operand:DI 1 "register_operand" " d,d,f"))]
""
"@
lgr %0,%1
ldgr %0,%1
lgdr %0,%1"
[(set_attr "cpu_facility" "*,new,new")])
with the `enabled' attribute defined like this:
(define_attr "cpu_facility" "standard,new" (const_string "standard"))
(define_attr "enabled" ""
(cond [(eq_attr "cpu_facility" "standard") (const_int 1)
(and (eq_attr "cpu_facility" "new")
(ne (symbol_ref "TARGET_NEW") (const_int 0)))
(const_int 1)]
(const_int 0)))
File: gccint.info, Node: Define Constraints, Next: C Constraint Interface, Prev: Machine Constraints, Up: Constraints
16.8.7 Defining Machine-Specific Constraints
--------------------------------------------
Machine-specific constraints fall into two categories: register and
non-register constraints. Within the latter category, constraints
which allow subsets of all possible memory or address operands should
be specially marked, to give `reload' more information.
Machine-specific constraints can be given names of arbitrary length,
but they must be entirely composed of letters, digits, underscores
(`_'), and angle brackets (`< >'). Like C identifiers, they must begin
with a letter or underscore.
In order to avoid ambiguity in operand constraint strings, no
constraint can have a name that begins with any other constraint's
name. For example, if `x' is defined as a constraint name, `xy' may
not be, and vice versa. As a consequence of this rule, no constraint
may begin with one of the generic constraint letters: `E F V X g i m n
o p r s'.
Register constraints correspond directly to register classes. *Note
Register Classes::. There is thus not much flexibility in their
definitions.
-- MD Expression: define_register_constraint name regclass docstring
All three arguments are string constants. NAME is the name of the
constraint, as it will appear in `match_operand' expressions. If
NAME is a multi-letter constraint its length shall be the same for
all constraints starting with the same letter. REGCLASS can be
either the name of the corresponding register class (*note
Register Classes::), or a C expression which evaluates to the
appropriate register class. If it is an expression, it must have
no side effects, and it cannot look at the operand. The usual use
of expressions is to map some register constraints to `NO_REGS'
when the register class is not available on a given
subarchitecture.
DOCSTRING is a sentence documenting the meaning of the constraint.
Docstrings are explained further below.
Non-register constraints are more like predicates: the constraint
definition gives a Boolean expression which indicates whether the
constraint matches.
-- MD Expression: define_constraint name docstring exp
The NAME and DOCSTRING arguments are the same as for
`define_register_constraint', but note that the docstring comes
immediately after the name for these expressions. EXP is an RTL
expression, obeying the same rules as the RTL expressions in
predicate definitions. *Note Defining Predicates::, for details.
If it evaluates true, the constraint matches; if it evaluates
false, it doesn't. Constraint expressions should indicate which
RTL codes they might match, just like predicate expressions.
`match_test' C expressions have access to the following variables:
OP
The RTL object defining the operand.
MODE
The machine mode of OP.
IVAL
`INTVAL (OP)', if OP is a `const_int'.
HVAL
`CONST_DOUBLE_HIGH (OP)', if OP is an integer `const_double'.
LVAL
`CONST_DOUBLE_LOW (OP)', if OP is an integer `const_double'.
RVAL
`CONST_DOUBLE_REAL_VALUE (OP)', if OP is a floating-point
`const_double'.
The *VAL variables should only be used once another piece of the
expression has verified that OP is the appropriate kind of RTL
object.
Most non-register constraints should be defined with
`define_constraint'. The remaining two definition expressions are only
appropriate for constraints that should be handled specially by
`reload' if they fail to match.
-- MD Expression: define_memory_constraint name docstring exp
Use this expression for constraints that match a subset of all
memory operands: that is, `reload' can make them match by
converting the operand to the form `(mem (reg X))', where X is a
base register (from the register class specified by
`BASE_REG_CLASS', *note Register Classes::).
For example, on the S/390, some instructions do not accept
arbitrary memory references, but only those that do not make use
of an index register. The constraint letter `Q' is defined to
represent a memory address of this type. If `Q' is defined with
`define_memory_constraint', a `Q' constraint can handle any memory
operand, because `reload' knows it can simply copy the memory
address into a base register if required. This is analogous to
the way an `o' constraint can handle any memory operand.
The syntax and semantics are otherwise identical to
`define_constraint'.
-- MD Expression: define_address_constraint name docstring exp
Use this expression for constraints that match a subset of all
address operands: that is, `reload' can make the constraint match
by converting the operand to the form `(reg X)', again with X a
base register.
Constraints defined with `define_address_constraint' can only be
used with the `address_operand' predicate, or machine-specific
predicates that work the same way. They are treated analogously to
the generic `p' constraint.
The syntax and semantics are otherwise identical to
`define_constraint'.
For historical reasons, names beginning with the letters `G H' are
reserved for constraints that match only `const_double's, and names
beginning with the letters `I J K L M N O P' are reserved for
constraints that match only `const_int's. This may change in the
future. For the time being, constraints with these names must be
written in a stylized form, so that `genpreds' can tell you did it
correctly:
(define_constraint "[GHIJKLMNOP]..."
"DOC..."
(and (match_code "const_int") ; `const_double' for G/H
CONDITION...)) ; usually a `match_test'
It is fine to use names beginning with other letters for constraints
that match `const_double's or `const_int's.
Each docstring in a constraint definition should be one or more
complete sentences, marked up in Texinfo format. _They are currently
unused._ In the future they will be copied into the GCC manual, in
*note Machine Constraints::, replacing the hand-maintained tables
currently found in that section. Also, in the future the compiler may
use this to give more helpful diagnostics when poor choice of `asm'
constraints causes a reload failure.
If you put the pseudo-Texinfo directive `@internal' at the beginning
of a docstring, then (in the future) it will appear only in the
internals manual's version of the machine-specific constraint tables.
Use this for constraints that should not appear in `asm' statements.
File: gccint.info, Node: C Constraint Interface, Prev: Define Constraints, Up: Constraints
16.8.8 Testing constraints from C
---------------------------------
It is occasionally useful to test a constraint from C code rather than
implicitly via the constraint string in a `match_operand'. The
generated file `tm_p.h' declares a few interfaces for working with
machine-specific constraints. None of these interfaces work with the
generic constraints described in *note Simple Constraints::. This may
change in the future.
*Warning:* `tm_p.h' may declare other functions that operate on
constraints, besides the ones documented here. Do not use those
functions from machine-dependent code. They exist to implement the old
constraint interface that machine-independent components of the
compiler still expect. They will change or disappear in the future.
Some valid constraint names are not valid C identifiers, so there is a
mangling scheme for referring to them from C. Constraint names that do
not contain angle brackets or underscores are left unchanged.
Underscores are doubled, each `<' is replaced with `_l', and each `>'
with `_g'. Here are some examples:
*Original* *Mangled*
`x' `x'
`P42x' `P42x'
`P4_x' `P4__x'
`P4>x' `P4_gx'
`P4>>' `P4_g_g'
`P4_g>' `P4__g_g'
Throughout this section, the variable C is either a constraint in the
abstract sense, or a constant from `enum constraint_num'; the variable
M is a mangled constraint name (usually as part of a larger identifier).
-- Enum: constraint_num
For each machine-specific constraint, there is a corresponding
enumeration constant: `CONSTRAINT_' plus the mangled name of the
constraint. Functions that take an `enum constraint_num' as an
argument expect one of these constants.
Machine-independent constraints do not have associated constants.
This may change in the future.
-- Function: inline bool satisfies_constraint_M (rtx EXP)
For each machine-specific, non-register constraint M, there is one
of these functions; it returns `true' if EXP satisfies the
constraint. These functions are only visible if `rtl.h' was
included before `tm_p.h'.
-- Function: bool constraint_satisfied_p (rtx EXP, enum constraint_num
C)
Like the `satisfies_constraint_M' functions, but the constraint to
test is given as an argument, C. If C specifies a register
constraint, this function will always return `false'.
-- Function: enum reg_class regclass_for_constraint (enum
constraint_num C)
Returns the register class associated with C. If C is not a
register constraint, or those registers are not available for the
currently selected subtarget, returns `NO_REGS'.
Here is an example use of `satisfies_constraint_M'. In peephole
optimizations (*note Peephole Definitions::), operand constraint
strings are ignored, so if there are relevant constraints, they must be
tested in the C condition. In the example, the optimization is applied
if operand 2 does _not_ satisfy the `K' constraint. (This is a
simplified version of a peephole definition from the i386 machine
description.)
(define_peephole2
[(match_scratch:SI 3 "r")
(set (match_operand:SI 0 "register_operand" "")
(mult:SI (match_operand:SI 1 "memory_operand" "")
(match_operand:SI 2 "immediate_operand" "")))]
"!satisfies_constraint_K (operands[2])"
[(set (match_dup 3) (match_dup 1))
(set (match_dup 0) (mult:SI (match_dup 3) (match_dup 2)))]
"")
File: gccint.info, Node: Standard Names, Next: Pattern Ordering, Prev: Constraints, Up: Machine Desc
16.9 Standard Pattern Names For Generation
==========================================
Here is a table of the instruction names that are meaningful in the RTL
generation pass of the compiler. Giving one of these names to an
instruction pattern tells the RTL generation pass that it can use the
pattern to accomplish a certain task.
`movM'
Here M stands for a two-letter machine mode name, in lowercase.
This instruction pattern moves data with that machine mode from
operand 1 to operand 0. For example, `movsi' moves full-word data.
If operand 0 is a `subreg' with mode M of a register whose own
mode is wider than M, the effect of this instruction is to store
the specified value in the part of the register that corresponds
to mode M. Bits outside of M, but which are within the same
target word as the `subreg' are undefined. Bits which are outside
the target word are left unchanged.
This class of patterns is special in several ways. First of all,
each of these names up to and including full word size _must_ be
defined, because there is no other way to copy a datum from one
place to another. If there are patterns accepting operands in
larger modes, `movM' must be defined for integer modes of those
sizes.
Second, these patterns are not used solely in the RTL generation
pass. Even the reload pass can generate move insns to copy values
from stack slots into temporary registers. When it does so, one
of the operands is a hard register and the other is an operand
that can need to be reloaded into a register.
Therefore, when given such a pair of operands, the pattern must
generate RTL which needs no reloading and needs no temporary
registers--no registers other than the operands. For example, if
you support the pattern with a `define_expand', then in such a
case the `define_expand' mustn't call `force_reg' or any other such
function which might generate new pseudo registers.
This requirement exists even for subword modes on a RISC machine
where fetching those modes from memory normally requires several
insns and some temporary registers.
During reload a memory reference with an invalid address may be
passed as an operand. Such an address will be replaced with a
valid address later in the reload pass. In this case, nothing may
be done with the address except to use it as it stands. If it is
copied, it will not be replaced with a valid address. No attempt
should be made to make such an address into a valid address and no
routine (such as `change_address') that will do so may be called.
Note that `general_operand' will fail when applied to such an
address.
The global variable `reload_in_progress' (which must be explicitly
declared if required) can be used to determine whether such special
handling is required.
The variety of operands that have reloads depends on the rest of
the machine description, but typically on a RISC machine these can
only be pseudo registers that did not get hard registers, while on
other machines explicit memory references will get optional
reloads.
If a scratch register is required to move an object to or from
memory, it can be allocated using `gen_reg_rtx' prior to life
analysis.
If there are cases which need scratch registers during or after
reload, you must provide an appropriate secondary_reload target
hook.
The macro `can_create_pseudo_p' can be used to determine if it is
unsafe to create new pseudo registers. If this variable is
nonzero, then it is unsafe to call `gen_reg_rtx' to allocate a new
pseudo.
The constraints on a `movM' must permit moving any hard register
to any other hard register provided that `HARD_REGNO_MODE_OK'
permits mode M in both registers and `TARGET_REGISTER_MOVE_COST'
applied to their classes returns a value of 2.
It is obligatory to support floating point `movM' instructions
into and out of any registers that can hold fixed point values,
because unions and structures (which have modes `SImode' or
`DImode') can be in those registers and they may have floating
point members.
There may also be a need to support fixed point `movM'
instructions in and out of floating point registers.
Unfortunately, I have forgotten why this was so, and I don't know
whether it is still true. If `HARD_REGNO_MODE_OK' rejects fixed
point values in floating point registers, then the constraints of
the fixed point `movM' instructions must be designed to avoid ever
trying to reload into a floating point register.
`reload_inM'
`reload_outM'
These named patterns have been obsoleted by the target hook
`secondary_reload'.
Like `movM', but used when a scratch register is required to move
between operand 0 and operand 1. Operand 2 describes the scratch
register. See the discussion of the `SECONDARY_RELOAD_CLASS'
macro in *note Register Classes::.
There are special restrictions on the form of the `match_operand's
used in these patterns. First, only the predicate for the reload
operand is examined, i.e., `reload_in' examines operand 1, but not
the predicates for operand 0 or 2. Second, there may be only one
alternative in the constraints. Third, only a single register
class letter may be used for the constraint; subsequent constraint
letters are ignored. As a special exception, an empty constraint
string matches the `ALL_REGS' register class. This may relieve
ports of the burden of defining an `ALL_REGS' constraint letter
just for these patterns.
`movstrictM'
Like `movM' except that if operand 0 is a `subreg' with mode M of
a register whose natural mode is wider, the `movstrictM'
instruction is guaranteed not to alter any of the register except
the part which belongs to mode M.
`movmisalignM'
This variant of a move pattern is designed to load or store a value
from a memory address that is not naturally aligned for its mode.
For a store, the memory will be in operand 0; for a load, the
memory will be in operand 1. The other operand is guaranteed not
to be a memory, so that it's easy to tell whether this is a load
or store.
This pattern is used by the autovectorizer, and when expanding a
`MISALIGNED_INDIRECT_REF' expression.
`load_multiple'
Load several consecutive memory locations into consecutive
registers. Operand 0 is the first of the consecutive registers,
operand 1 is the first memory location, and operand 2 is a
constant: the number of consecutive registers.
Define this only if the target machine really has such an
instruction; do not define this if the most efficient way of
loading consecutive registers from memory is to do them one at a
time.
On some machines, there are restrictions as to which consecutive
registers can be stored into memory, such as particular starting or
ending register numbers or only a range of valid counts. For those
machines, use a `define_expand' (*note Expander Definitions::) and
make the pattern fail if the restrictions are not met.
Write the generated insn as a `parallel' with elements being a
`set' of one register from the appropriate memory location (you may
also need `use' or `clobber' elements). Use a `match_parallel'
(*note RTL Template::) to recognize the insn. See `rs6000.md' for
examples of the use of this insn pattern.
`store_multiple'
Similar to `load_multiple', but store several consecutive registers
into consecutive memory locations. Operand 0 is the first of the
consecutive memory locations, operand 1 is the first register, and
operand 2 is a constant: the number of consecutive registers.
`vec_setM'
Set given field in the vector value. Operand 0 is the vector to
modify, operand 1 is new value of field and operand 2 specify the
field index.
`vec_extractM'
Extract given field from the vector value. Operand 1 is the
vector, operand 2 specify field index and operand 0 place to store
value into.
`vec_extract_evenM'
Extract even elements from the input vectors (operand 1 and
operand 2). The even elements of operand 2 are concatenated to
the even elements of operand 1 in their original order. The result
is stored in operand 0. The output and input vectors should have
the same modes.
`vec_extract_oddM'
Extract odd elements from the input vectors (operand 1 and operand
2). The odd elements of operand 2 are concatenated to the odd
elements of operand 1 in their original order. The result is
stored in operand 0. The output and input vectors should have the
same modes.
`vec_interleave_highM'
Merge high elements of the two input vectors into the output
vector. The output and input vectors should have the same modes
(`N' elements). The high `N/2' elements of the first input vector
are interleaved with the high `N/2' elements of the second input
vector.
`vec_interleave_lowM'
Merge low elements of the two input vectors into the output
vector. The output and input vectors should have the same modes
(`N' elements). The low `N/2' elements of the first input vector
are interleaved with the low `N/2' elements of the second input
vector.
`vec_initM'
Initialize the vector to given values. Operand 0 is the vector to
initialize and operand 1 is parallel containing values for
individual fields.
`pushM1'
Output a push instruction. Operand 0 is value to push. Used only
when `PUSH_ROUNDING' is defined. For historical reason, this
pattern may be missing and in such case an `mov' expander is used
instead, with a `MEM' expression forming the push operation. The
`mov' expander method is deprecated.
`addM3'
Add operand 2 and operand 1, storing the result in operand 0. All
operands must have mode M. This can be used even on two-address
machines, by means of constraints requiring operands 1 and 0 to be
the same location.
`ssaddM3', `usaddM3'
`subM3', `sssubM3', `ussubM3'
`mulM3', `ssmulM3', `usmulM3'
`divM3', `ssdivM3'
`udivM3', `usdivM3'
`modM3', `umodM3'
`uminM3', `umaxM3'
`andM3', `iorM3', `xorM3'
Similar, for other arithmetic operations.
`fmaM4'
Multiply operand 2 and operand 1, then add operand 3, storing the
result in operand 0. All operands must have mode M. This pattern
is used to implement the `fma', `fmaf', and `fmal' builtin
functions from the ISO C99 standard. The `fma' operation may
produce different results than doing the multiply followed by the
add if the machine does not perform a rounding step between the
operations.
`fmsM4'
Like `fmaM4', except operand 3 subtracted from the product instead
of added to the product. This is represented in the rtl as
(fma:M OP1 OP2 (neg:M OP3))
`fnmaM4'
Like `fmaM4' except that the intermediate product is negated
before being added to operand 3. This is represented in the rtl as
(fma:M (neg:M OP1) OP2 OP3)
`fnmsM4'
Like `fmsM4' except that the intermediate product is negated
before subtracting operand 3. This is represented in the rtl as
(fma:M (neg:M OP1) OP2 (neg:M OP3))
`sminM3', `smaxM3'
Signed minimum and maximum operations. When used with floating
point, if both operands are zeros, or if either operand is `NaN',
then it is unspecified which of the two operands is returned as
the result.
`reduc_smin_M', `reduc_smax_M'
Find the signed minimum/maximum of the elements of a vector. The
vector is operand 1, and the scalar result is stored in the least
significant bits of operand 0 (also a vector). The output and
input vector should have the same modes.
`reduc_umin_M', `reduc_umax_M'
Find the unsigned minimum/maximum of the elements of a vector. The
vector is operand 1, and the scalar result is stored in the least
significant bits of operand 0 (also a vector). The output and
input vector should have the same modes.
`reduc_splus_M'
Compute the sum of the signed elements of a vector. The vector is
operand 1, and the scalar result is stored in the least
significant bits of operand 0 (also a vector). The output and
input vector should have the same modes.
`reduc_uplus_M'
Compute the sum of the unsigned elements of a vector. The vector
is operand 1, and the scalar result is stored in the least
significant bits of operand 0 (also a vector). The output and
input vector should have the same modes.
`sdot_prodM'
`udot_prodM'
Compute the sum of the products of two signed/unsigned elements.
Operand 1 and operand 2 are of the same mode. Their product, which
is of a wider mode, is computed and added to operand 3. Operand 3
is of a mode equal or wider than the mode of the product. The
result is placed in operand 0, which is of the same mode as
operand 3.
`ssum_widenM3'
`usum_widenM3'
Operands 0 and 2 are of the same mode, which is wider than the
mode of operand 1. Add operand 1 to operand 2 and place the
widened result in operand 0. (This is used express accumulation of
elements into an accumulator of a wider mode.)
`vec_shl_M', `vec_shr_M'
Whole vector left/right shift in bits. Operand 1 is a vector to
be shifted. Operand 2 is an integer shift amount in bits.
Operand 0 is where the resulting shifted vector is stored. The
output and input vectors should have the same modes.
`vec_pack_trunc_M'
Narrow (demote) and merge the elements of two vectors. Operands 1
and 2 are vectors of the same mode having N integral or floating
point elements of size S. Operand 0 is the resulting vector in
which 2*N elements of size N/2 are concatenated after narrowing
them down using truncation.
`vec_pack_ssat_M', `vec_pack_usat_M'
Narrow (demote) and merge the elements of two vectors. Operands 1
and 2 are vectors of the same mode having N integral elements of
size S. Operand 0 is the resulting vector in which the elements
of the two input vectors are concatenated after narrowing them
down using signed/unsigned saturating arithmetic.
`vec_pack_sfix_trunc_M', `vec_pack_ufix_trunc_M'
Narrow, convert to signed/unsigned integral type and merge the
elements of two vectors. Operands 1 and 2 are vectors of the same
mode having N floating point elements of size S. Operand 0 is the
resulting vector in which 2*N elements of size N/2 are
concatenated.
`vec_unpacks_hi_M', `vec_unpacks_lo_M'
Extract and widen (promote) the high/low part of a vector of signed
integral or floating point elements. The input vector (operand 1)
has N elements of size S. Widen (promote) the high/low elements
of the vector using signed or floating point extension and place
the resulting N/2 values of size 2*S in the output vector (operand
0).
`vec_unpacku_hi_M', `vec_unpacku_lo_M'
Extract and widen (promote) the high/low part of a vector of
unsigned integral elements. The input vector (operand 1) has N
elements of size S. Widen (promote) the high/low elements of the
vector using zero extension and place the resulting N/2 values of
size 2*S in the output vector (operand 0).
`vec_unpacks_float_hi_M', `vec_unpacks_float_lo_M'
`vec_unpacku_float_hi_M', `vec_unpacku_float_lo_M'
Extract, convert to floating point type and widen the high/low
part of a vector of signed/unsigned integral elements. The input
vector (operand 1) has N elements of size S. Convert the high/low
elements of the vector using floating point conversion and place
the resulting N/2 values of size 2*S in the output vector (operand
0).
`vec_widen_umult_hi_M', `vec_widen_umult_lo_M'
`vec_widen_smult_hi_M', `vec_widen_smult_lo_M'
Signed/Unsigned widening multiplication. The two inputs (operands
1 and 2) are vectors with N signed/unsigned elements of size S.
Multiply the high/low elements of the two vectors, and put the N/2
products of size 2*S in the output vector (operand 0).
`mulhisi3'
Multiply operands 1 and 2, which have mode `HImode', and store a
`SImode' product in operand 0.
`mulqihi3', `mulsidi3'
Similar widening-multiplication instructions of other widths.
`umulqihi3', `umulhisi3', `umulsidi3'
Similar widening-multiplication instructions that do unsigned
multiplication.
`usmulqihi3', `usmulhisi3', `usmulsidi3'
Similar widening-multiplication instructions that interpret the
first operand as unsigned and the second operand as signed, then
do a signed multiplication.
`smulM3_highpart'
Perform a signed multiplication of operands 1 and 2, which have
mode M, and store the most significant half of the product in
operand 0. The least significant half of the product is discarded.
`umulM3_highpart'
Similar, but the multiplication is unsigned.
`maddMN4'
Multiply operands 1 and 2, sign-extend them to mode N, add operand
3, and store the result in operand 0. Operands 1 and 2 have mode
M and operands 0 and 3 have mode N. Both modes must be integer or
fixed-point modes and N must be twice the size of M.
In other words, `maddMN4' is like `mulMN3' except that it also
adds operand 3.
These instructions are not allowed to `FAIL'.
`umaddMN4'
Like `maddMN4', but zero-extend the multiplication operands
instead of sign-extending them.
`ssmaddMN4'
Like `maddMN4', but all involved operations must be
signed-saturating.
`usmaddMN4'
Like `umaddMN4', but all involved operations must be
unsigned-saturating.
`msubMN4'
Multiply operands 1 and 2, sign-extend them to mode N, subtract the
result from operand 3, and store the result in operand 0.
Operands 1 and 2 have mode M and operands 0 and 3 have mode N.
Both modes must be integer or fixed-point modes and N must be twice
the size of M.
In other words, `msubMN4' is like `mulMN3' except that it also
subtracts the result from operand 3.
These instructions are not allowed to `FAIL'.
`umsubMN4'
Like `msubMN4', but zero-extend the multiplication operands
instead of sign-extending them.
`ssmsubMN4'
Like `msubMN4', but all involved operations must be
signed-saturating.
`usmsubMN4'
Like `umsubMN4', but all involved operations must be
unsigned-saturating.
`divmodM4'
Signed division that produces both a quotient and a remainder.
Operand 1 is divided by operand 2 to produce a quotient stored in
operand 0 and a remainder stored in operand 3.
For machines with an instruction that produces both a quotient and
a remainder, provide a pattern for `divmodM4' but do not provide
patterns for `divM3' and `modM3'. This allows optimization in the
relatively common case when both the quotient and remainder are
computed.
If an instruction that just produces a quotient or just a remainder
exists and is more efficient than the instruction that produces
both, write the output routine of `divmodM4' to call
`find_reg_note' and look for a `REG_UNUSED' note on the quotient
or remainder and generate the appropriate instruction.
`udivmodM4'
Similar, but does unsigned division.
`ashlM3', `ssashlM3', `usashlM3'
Arithmetic-shift operand 1 left by a number of bits specified by
operand 2, and store the result in operand 0. Here M is the mode
of operand 0 and operand 1; operand 2's mode is specified by the
instruction pattern, and the compiler will convert the operand to
that mode before generating the instruction. The meaning of
out-of-range shift counts can optionally be specified by
`TARGET_SHIFT_TRUNCATION_MASK'. *Note
TARGET_SHIFT_TRUNCATION_MASK::. Operand 2 is always a scalar type.
`ashrM3', `lshrM3', `rotlM3', `rotrM3'
Other shift and rotate instructions, analogous to the `ashlM3'
instructions. Operand 2 is always a scalar type.
`vashlM3', `vashrM3', `vlshrM3', `vrotlM3', `vrotrM3'
Vector shift and rotate instructions that take vectors as operand 2
instead of a scalar type.
`negM2', `ssnegM2', `usnegM2'
Negate operand 1 and store the result in operand 0.
`absM2'
Store the absolute value of operand 1 into operand 0.
`sqrtM2'
Store the square root of operand 1 into operand 0.
The `sqrt' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `sqrtf' built-in
function uses the mode which corresponds to the C data type
`float'.
`fmodM3'
Store the remainder of dividing operand 1 by operand 2 into
operand 0, rounded towards zero to an integer.
The `fmod' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `fmodf' built-in
function uses the mode which corresponds to the C data type
`float'.
`remainderM3'
Store the remainder of dividing operand 1 by operand 2 into
operand 0, rounded to the nearest integer.
The `remainder' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `remainderf'
built-in function uses the mode which corresponds to the C data
type `float'.
`cosM2'
Store the cosine of operand 1 into operand 0.
The `cos' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `cosf' built-in
function uses the mode which corresponds to the C data type
`float'.
`sinM2'
Store the sine of operand 1 into operand 0.
The `sin' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `sinf' built-in
function uses the mode which corresponds to the C data type
`float'.
`expM2'
Store the exponential of operand 1 into operand 0.
The `exp' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `expf' built-in
function uses the mode which corresponds to the C data type
`float'.
`logM2'
Store the natural logarithm of operand 1 into operand 0.
The `log' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `logf' built-in
function uses the mode which corresponds to the C data type
`float'.
`powM3'
Store the value of operand 1 raised to the exponent operand 2 into
operand 0.
The `pow' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `powf' built-in
function uses the mode which corresponds to the C data type
`float'.
`atan2M3'
Store the arc tangent (inverse tangent) of operand 1 divided by
operand 2 into operand 0, using the signs of both arguments to
determine the quadrant of the result.
The `atan2' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `atan2f' built-in
function uses the mode which corresponds to the C data type
`float'.
`floorM2'
Store the largest integral value not greater than argument.
The `floor' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `floorf' built-in
function uses the mode which corresponds to the C data type
`float'.
`btruncM2'
Store the argument rounded to integer towards zero.
The `trunc' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `truncf' built-in
function uses the mode which corresponds to the C data type
`float'.
`roundM2'
Store the argument rounded to integer away from zero.
The `round' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `roundf' built-in
function uses the mode which corresponds to the C data type
`float'.
`ceilM2'
Store the argument rounded to integer away from zero.
The `ceil' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `ceilf' built-in
function uses the mode which corresponds to the C data type
`float'.
`nearbyintM2'
Store the argument rounded according to the default rounding mode
The `nearbyint' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `nearbyintf'
built-in function uses the mode which corresponds to the C data
type `float'.
`rintM2'
Store the argument rounded according to the default rounding mode
and raise the inexact exception when the result differs in value
from the argument
The `rint' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `rintf' built-in
function uses the mode which corresponds to the C data type
`float'.
`lrintMN2'
Convert operand 1 (valid for floating point mode M) to fixed point
mode N as a signed number according to the current rounding mode
and store in operand 0 (which has mode N).
`lroundMN2'
Convert operand 1 (valid for floating point mode M) to fixed point
mode N as a signed number rounding to nearest and away from zero
and store in operand 0 (which has mode N).
`lfloorMN2'
Convert operand 1 (valid for floating point mode M) to fixed point
mode N as a signed number rounding down and store in operand 0
(which has mode N).
`lceilMN2'
Convert operand 1 (valid for floating point mode M) to fixed point
mode N as a signed number rounding up and store in operand 0
(which has mode N).
`copysignM3'
Store a value with the magnitude of operand 1 and the sign of
operand 2 into operand 0.
The `copysign' built-in function of C always uses the mode which
corresponds to the C data type `double' and the `copysignf'
built-in function uses the mode which corresponds to the C data
type `float'.
`ffsM2'
Store into operand 0 one plus the index of the least significant
1-bit of operand 1. If operand 1 is zero, store zero. M is the
mode of operand 0; operand 1's mode is specified by the instruction
pattern, and the compiler will convert the operand to that mode
before generating the instruction.
The `ffs' built-in function of C always uses the mode which
corresponds to the C data type `int'.
`clzM2'
Store into operand 0 the number of leading 0-bits in X, starting
at the most significant bit position. If X is 0, the
`CLZ_DEFINED_VALUE_AT_ZERO' (*note Misc::) macro defines if the
result is undefined or has a useful value. M is the mode of
operand 0; operand 1's mode is specified by the instruction
pattern, and the compiler will convert the operand to that mode
before generating the instruction.
`ctzM2'
Store into operand 0 the number of trailing 0-bits in X, starting
at the least significant bit position. If X is 0, the
`CTZ_DEFINED_VALUE_AT_ZERO' (*note Misc::) macro defines if the
result is undefined or has a useful value. M is the mode of
operand 0; operand 1's mode is specified by the instruction
pattern, and the compiler will convert the operand to that mode
before generating the instruction.
`popcountM2'
Store into operand 0 the number of 1-bits in X. M is the mode of
operand 0; operand 1's mode is specified by the instruction
pattern, and the compiler will convert the operand to that mode
before generating the instruction.
`parityM2'
Store into operand 0 the parity of X, i.e. the number of 1-bits in
X modulo 2. M is the mode of operand 0; operand 1's mode is
specified by the instruction pattern, and the compiler will convert
the operand to that mode before generating the instruction.
`one_cmplM2'
Store the bitwise-complement of operand 1 into operand 0.
`movmemM'
Block move instruction. The destination and source blocks of
memory are the first two operands, and both are `mem:BLK's with an
address in mode `Pmode'.
The number of bytes to move is the third operand, in mode M.
Usually, you specify `word_mode' for M. However, if you can
generate better code knowing the range of valid lengths is smaller
than those representable in a full word, you should provide a
pattern with a mode corresponding to the range of values you can
handle efficiently (e.g., `QImode' for values in the range 0-127;
note we avoid numbers that appear negative) and also a pattern
with `word_mode'.
The fourth operand is the known shared alignment of the source and
destination, in the form of a `const_int' rtx. Thus, if the
compiler knows that both source and destination are word-aligned,
it may provide the value 4 for this operand.
Optional operands 5 and 6 specify expected alignment and size of
block respectively. The expected alignment differs from alignment
in operand 4 in a way that the blocks are not required to be
aligned according to it in all cases. This expected alignment is
also in bytes, just like operand 4. Expected size, when unknown,
is set to `(const_int -1)'.
Descriptions of multiple `movmemM' patterns can only be beneficial
if the patterns for smaller modes have fewer restrictions on their
first, second and fourth operands. Note that the mode M in
`movmemM' does not impose any restriction on the mode of
individually moved data units in the block.
These patterns need not give special consideration to the
possibility that the source and destination strings might overlap.
`movstr'
String copy instruction, with `stpcpy' semantics. Operand 0 is an
output operand in mode `Pmode'. The addresses of the destination
and source strings are operands 1 and 2, and both are `mem:BLK's
with addresses in mode `Pmode'. The execution of the expansion of
this pattern should store in operand 0 the address in which the
`NUL' terminator was stored in the destination string.
`setmemM'
Block set instruction. The destination string is the first
operand, given as a `mem:BLK' whose address is in mode `Pmode'.
The number of bytes to set is the second operand, in mode M. The
value to initialize the memory with is the third operand. Targets
that only support the clearing of memory should reject any value
that is not the constant 0. See `movmemM' for a discussion of the
choice of mode.
The fourth operand is the known alignment of the destination, in
the form of a `const_int' rtx. Thus, if the compiler knows that
the destination is word-aligned, it may provide the value 4 for
this operand.
Optional operands 5 and 6 specify expected alignment and size of
block respectively. The expected alignment differs from alignment
in operand 4 in a way that the blocks are not required to be
aligned according to it in all cases. This expected alignment is
also in bytes, just like operand 4. Expected size, when unknown,
is set to `(const_int -1)'.
The use for multiple `setmemM' is as for `movmemM'.
`cmpstrnM'
String compare instruction, with five operands. Operand 0 is the
output; it has mode M. The remaining four operands are like the
operands of `movmemM'. The two memory blocks specified are
compared byte by byte in lexicographic order starting at the
beginning of each string. The instruction is not allowed to
prefetch more than one byte at a time since either string may end
in the first byte and reading past that may access an invalid page
or segment and cause a fault. The comparison terminates early if
the fetched bytes are different or if they are equal to zero. The
effect of the instruction is to store a value in operand 0 whose
sign indicates the result of the comparison.
`cmpstrM'
String compare instruction, without known maximum length. Operand
0 is the output; it has mode M. The second and third operand are
the blocks of memory to be compared; both are `mem:BLK' with an
address in mode `Pmode'.
The fourth operand is the known shared alignment of the source and
destination, in the form of a `const_int' rtx. Thus, if the
compiler knows that both source and destination are word-aligned,
it may provide the value 4 for this operand.
The two memory blocks specified are compared byte by byte in
lexicographic order starting at the beginning of each string. The
instruction is not allowed to prefetch more than one byte at a
time since either string may end in the first byte and reading
past that may access an invalid page or segment and cause a fault.
The comparison will terminate when the fetched bytes are different
or if they are equal to zero. The effect of the instruction is to
store a value in operand 0 whose sign indicates the result of the
comparison.
`cmpmemM'
Block compare instruction, with five operands like the operands of
`cmpstrM'. The two memory blocks specified are compared byte by
byte in lexicographic order starting at the beginning of each
block. Unlike `cmpstrM' the instruction can prefetch any bytes in
the two memory blocks. Also unlike `cmpstrM' the comparison will
not stop if both bytes are zero. The effect of the instruction is
to store a value in operand 0 whose sign indicates the result of
the comparison.
`strlenM'
Compute the length of a string, with three operands. Operand 0 is
the result (of mode M), operand 1 is a `mem' referring to the
first character of the string, operand 2 is the character to
search for (normally zero), and operand 3 is a constant describing
the known alignment of the beginning of the string.
`floatMN2'
Convert signed integer operand 1 (valid for fixed point mode M) to
floating point mode N and store in operand 0 (which has mode N).
`floatunsMN2'
Convert unsigned integer operand 1 (valid for fixed point mode M)
to floating point mode N and store in operand 0 (which has mode N).
`fixMN2'
Convert operand 1 (valid for floating point mode M) to fixed point
mode N as a signed number and store in operand 0 (which has mode
N). This instruction's result is defined only when the value of
operand 1 is an integer.
If the machine description defines this pattern, it also needs to
define the `ftrunc' pattern.
`fixunsMN2'
Convert operand 1 (valid for floating point mode M) to fixed point
mode N as an unsigned number and store in operand 0 (which has
mode N). This instruction's result is defined only when the value
of operand 1 is an integer.
`ftruncM2'
Convert operand 1 (valid for floating point mode M) to an integer
value, still represented in floating point mode M, and store it in
operand 0 (valid for floating point mode M).
`fix_truncMN2'
Like `fixMN2' but works for any floating point value of mode M by
converting the value to an integer.
`fixuns_truncMN2'
Like `fixunsMN2' but works for any floating point value of mode M
by converting the value to an integer.
`truncMN2'
Truncate operand 1 (valid for mode M) to mode N and store in
operand 0 (which has mode N). Both modes must be fixed point or
both floating point.
`extendMN2'
Sign-extend operand 1 (valid for mode M) to mode N and store in
operand 0 (which has mode N). Both modes must be fixed point or
both floating point.
`zero_extendMN2'
Zero-extend operand 1 (valid for mode M) to mode N and store in
operand 0 (which has mode N). Both modes must be fixed point.
`fractMN2'
Convert operand 1 of mode M to mode N and store in operand 0
(which has mode N). Mode M and mode N could be fixed-point to
fixed-point, signed integer to fixed-point, fixed-point to signed
integer, floating-point to fixed-point, or fixed-point to
floating-point. When overflows or underflows happen, the results
are undefined.
`satfractMN2'
Convert operand 1 of mode M to mode N and store in operand 0
(which has mode N). Mode M and mode N could be fixed-point to
fixed-point, signed integer to fixed-point, or floating-point to
fixed-point. When overflows or underflows happen, the instruction
saturates the results to the maximum or the minimum.
`fractunsMN2'
Convert operand 1 of mode M to mode N and store in operand 0
(which has mode N). Mode M and mode N could be unsigned integer
to fixed-point, or fixed-point to unsigned integer. When
overflows or underflows happen, the results are undefined.
`satfractunsMN2'
Convert unsigned integer operand 1 of mode M to fixed-point mode N
and store in operand 0 (which has mode N). When overflows or
underflows happen, the instruction saturates the results to the
maximum or the minimum.
`extv'
Extract a bit-field from operand 1 (a register or memory operand),
where operand 2 specifies the width in bits and operand 3 the
starting bit, and store it in operand 0. Operand 0 must have mode
`word_mode'. Operand 1 may have mode `byte_mode' or `word_mode';
often `word_mode' is allowed only for registers. Operands 2 and 3
must be valid for `word_mode'.
The RTL generation pass generates this instruction only with
constants for operands 2 and 3 and the constant is never zero for
operand 2.
The bit-field value is sign-extended to a full word integer before
it is stored in operand 0.
`extzv'
Like `extv' except that the bit-field value is zero-extended.
`insv'
Store operand 3 (which must be valid for `word_mode') into a
bit-field in operand 0, where operand 1 specifies the width in
bits and operand 2 the starting bit. Operand 0 may have mode
`byte_mode' or `word_mode'; often `word_mode' is allowed only for
registers. Operands 1 and 2 must be valid for `word_mode'.
The RTL generation pass generates this instruction only with
constants for operands 1 and 2 and the constant is never zero for
operand 1.
`movMODEcc'
Conditionally move operand 2 or operand 3 into operand 0 according
to the comparison in operand 1. If the comparison is true,
operand 2 is moved into operand 0, otherwise operand 3 is moved.
The mode of the operands being compared need not be the same as
the operands being moved. Some machines, sparc64 for example,
have instructions that conditionally move an integer value based
on the floating point condition codes and vice versa.
If the machine does not have conditional move instructions, do not
define these patterns.
`addMODEcc'
Similar to `movMODEcc' but for conditional addition. Conditionally
move operand 2 or (operands 2 + operand 3) into operand 0
according to the comparison in operand 1. If the comparison is
true, operand 2 is moved into operand 0, otherwise (operand 2 +
operand 3) is moved.
`cstoreMODE4'
Store zero or nonzero in operand 0 according to whether a
comparison is true. Operand 1 is a comparison operator. Operand
2 and operand 3 are the first and second operand of the
comparison, respectively. You specify the mode that operand 0
must have when you write the `match_operand' expression. The
compiler automatically sees which mode you have used and supplies
an operand of that mode.
The value stored for a true condition must have 1 as its low bit,
or else must be negative. Otherwise the instruction is not
suitable and you should omit it from the machine description. You
describe to the compiler exactly which value is stored by defining
the macro `STORE_FLAG_VALUE' (*note Misc::). If a description
cannot be found that can be used for all the possible comparison
operators, you should pick one and use a `define_expand' to map
all results onto the one you chose.
These operations may `FAIL', but should do so only in relatively
uncommon cases; if they would `FAIL' for common cases involving
integer comparisons, it is best to restrict the predicates to not
allow these operands. Likewise if a given comparison operator will
always fail, independent of the operands (for floating-point
modes, the `ordered_comparison_operator' predicate is often useful
in this case).
If this pattern is omitted, the compiler will generate a
conditional branch--for example, it may copy a constant one to the
target and branching around an assignment of zero to the
target--or a libcall. If the predicate for operand 1 only rejects
some operators, it will also try reordering the operands and/or
inverting the result value (e.g. by an exclusive OR). These
possibilities could be cheaper or equivalent to the instructions
used for the `cstoreMODE4' pattern followed by those required to
convert a positive result from `STORE_FLAG_VALUE' to 1; in this
case, you can and should make operand 1's predicate reject some
operators in the `cstoreMODE4' pattern, or remove the pattern
altogether from the machine description.
`cbranchMODE4'
Conditional branch instruction combined with a compare instruction.
Operand 0 is a comparison operator. Operand 1 and operand 2 are
the first and second operands of the comparison, respectively.
Operand 3 is a `label_ref' that refers to the label to jump to.
`jump'
A jump inside a function; an unconditional branch. Operand 0 is
the `label_ref' of the label to jump to. This pattern name is
mandatory on all machines.
`call'
Subroutine call instruction returning no value. Operand 0 is the
function to call; operand 1 is the number of bytes of arguments
pushed as a `const_int'; operand 2 is the number of registers used
as operands.
On most machines, operand 2 is not actually stored into the RTL
pattern. It is supplied for the sake of some RISC machines which
need to put this information into the assembler code; they can put
it in the RTL instead of operand 1.
Operand 0 should be a `mem' RTX whose address is the address of the
function. Note, however, that this address can be a `symbol_ref'
expression even if it would not be a legitimate memory address on
the target machine. If it is also not a valid argument for a call
instruction, the pattern for this operation should be a
`define_expand' (*note Expander Definitions::) that places the
address into a register and uses that register in the call
instruction.
`call_value'
Subroutine call instruction returning a value. Operand 0 is the
hard register in which the value is returned. There are three more
operands, the same as the three operands of the `call' instruction
(but with numbers increased by one).
Subroutines that return `BLKmode' objects use the `call' insn.
`call_pop', `call_value_pop'
Similar to `call' and `call_value', except used if defined and if
`RETURN_POPS_ARGS' is nonzero. They should emit a `parallel' that
contains both the function call and a `set' to indicate the
adjustment made to the frame pointer.
For machines where `RETURN_POPS_ARGS' can be nonzero, the use of
these patterns increases the number of functions for which the
frame pointer can be eliminated, if desired.
`untyped_call'
Subroutine call instruction returning a value of any type.
Operand 0 is the function to call; operand 1 is a memory location
where the result of calling the function is to be stored; operand
2 is a `parallel' expression where each element is a `set'
expression that indicates the saving of a function return value
into the result block.
This instruction pattern should be defined to support
`__builtin_apply' on machines where special instructions are needed
to call a subroutine with arbitrary arguments or to save the value
returned. This instruction pattern is required on machines that
have multiple registers that can hold a return value (i.e.
`FUNCTION_VALUE_REGNO_P' is true for more than one register).
`return'
Subroutine return instruction. This instruction pattern name
should be defined only if a single instruction can do all the work
of returning from a function.
Like the `movM' patterns, this pattern is also used after the RTL
generation phase. In this case it is to support machines where
multiple instructions are usually needed to return from a
function, but some class of functions only requires one
instruction to implement a return. Normally, the applicable
functions are those which do not need to save any registers or
allocate stack space.
For such machines, the condition specified in this pattern should
only be true when `reload_completed' is nonzero and the function's
epilogue would only be a single instruction. For machines with
register windows, the routine `leaf_function_p' may be used to
determine if a register window push is required.
Machines that have conditional return instructions should define
patterns such as
(define_insn ""
[(set (pc)
(if_then_else (match_operator
0 "comparison_operator"
[(cc0) (const_int 0)])
(return)
(pc)))]
"CONDITION"
"...")
where CONDITION would normally be the same condition specified on
the named `return' pattern.
`untyped_return'
Untyped subroutine return instruction. This instruction pattern
should be defined to support `__builtin_return' on machines where
special instructions are needed to return a value of any type.
Operand 0 is a memory location where the result of calling a
function with `__builtin_apply' is stored; operand 1 is a
`parallel' expression where each element is a `set' expression
that indicates the restoring of a function return value from the
result block.
`nop'
No-op instruction. This instruction pattern name should always be
defined to output a no-op in assembler code. `(const_int 0)' will
do as an RTL pattern.
`indirect_jump'
An instruction to jump to an address which is operand zero. This
pattern name is mandatory on all machines.
`casesi'
Instruction to jump through a dispatch table, including bounds
checking. This instruction takes five operands:
1. The index to dispatch on, which has mode `SImode'.
2. The lower bound for indices in the table, an integer constant.
3. The total range of indices in the table--the largest index
minus the smallest one (both inclusive).
4. A label that precedes the table itself.
5. A label to jump to if the index has a value outside the
bounds.
The table is an `addr_vec' or `addr_diff_vec' inside of a
`jump_insn'. The number of elements in the table is one plus the
difference between the upper bound and the lower bound.
`tablejump'
Instruction to jump to a variable address. This is a low-level
capability which can be used to implement a dispatch table when
there is no `casesi' pattern.
This pattern requires two operands: the address or offset, and a
label which should immediately precede the jump table. If the
macro `CASE_VECTOR_PC_RELATIVE' evaluates to a nonzero value then
the first operand is an offset which counts from the address of
the table; otherwise, it is an absolute address to jump to. In
either case, the first operand has mode `Pmode'.
The `tablejump' insn is always the last insn before the jump table
it uses. Its assembler code normally has no need to use the
second operand, but you should incorporate it in the RTL pattern so
that the jump optimizer will not delete the table as unreachable
code.
`decrement_and_branch_until_zero'
Conditional branch instruction that decrements a register and
jumps if the register is nonzero. Operand 0 is the register to
decrement and test; operand 1 is the label to jump to if the
register is nonzero. *Note Looping Patterns::.
This optional instruction pattern is only used by the combiner,
typically for loops reversed by the loop optimizer when strength
reduction is enabled.
`doloop_end'
Conditional branch instruction that decrements a register and
jumps if the register is nonzero. This instruction takes five
operands: Operand 0 is the register to decrement and test; operand
1 is the number of loop iterations as a `const_int' or
`const0_rtx' if this cannot be determined until run-time; operand
2 is the actual or estimated maximum number of iterations as a
`const_int'; operand 3 is the number of enclosed loops as a
`const_int' (an innermost loop has a value of 1); operand 4 is the
label to jump to if the register is nonzero. *Note Looping
Patterns::.
This optional instruction pattern should be defined for machines
with low-overhead looping instructions as the loop optimizer will
try to modify suitable loops to utilize it. If nested
low-overhead looping is not supported, use a `define_expand'
(*note Expander Definitions::) and make the pattern fail if
operand 3 is not `const1_rtx'. Similarly, if the actual or
estimated maximum number of iterations is too large for this
instruction, make it fail.
`doloop_begin'
Companion instruction to `doloop_end' required for machines that
need to perform some initialization, such as loading special
registers used by a low-overhead looping instruction. If
initialization insns do not always need to be emitted, use a
`define_expand' (*note Expander Definitions::) and make it fail.
`canonicalize_funcptr_for_compare'
Canonicalize the function pointer in operand 1 and store the result
into operand 0.
Operand 0 is always a `reg' and has mode `Pmode'; operand 1 may be
a `reg', `mem', `symbol_ref', `const_int', etc and also has mode
`Pmode'.
Canonicalization of a function pointer usually involves computing
the address of the function which would be called if the function
pointer were used in an indirect call.
Only define this pattern if function pointers on the target machine
can have different values but still call the same function when
used in an indirect call.
`save_stack_block'
`save_stack_function'
`save_stack_nonlocal'
`restore_stack_block'
`restore_stack_function'
`restore_stack_nonlocal'
Most machines save and restore the stack pointer by copying it to
or from an object of mode `Pmode'. Do not define these patterns on
such machines.
Some machines require special handling for stack pointer saves and
restores. On those machines, define the patterns corresponding to
the non-standard cases by using a `define_expand' (*note Expander
Definitions::) that produces the required insns. The three types
of saves and restores are:
1. `save_stack_block' saves the stack pointer at the start of a
block that allocates a variable-sized object, and
`restore_stack_block' restores the stack pointer when the
block is exited.
2. `save_stack_function' and `restore_stack_function' do a
similar job for the outermost block of a function and are
used when the function allocates variable-sized objects or
calls `alloca'. Only the epilogue uses the restored stack
pointer, allowing a simpler save or restore sequence on some
machines.
3. `save_stack_nonlocal' is used in functions that contain labels
branched to by nested functions. It saves the stack pointer
in such a way that the inner function can use
`restore_stack_nonlocal' to restore the stack pointer. The
compiler generates code to restore the frame and argument
pointer registers, but some machines require saving and
restoring additional data such as register window information
or stack backchains. Place insns in these patterns to save
and restore any such required data.
When saving the stack pointer, operand 0 is the save area and
operand 1 is the stack pointer. The mode used to allocate the
save area defaults to `Pmode' but you can override that choice by
defining the `STACK_SAVEAREA_MODE' macro (*note Storage Layout::).
You must specify an integral mode, or `VOIDmode' if no save area
is needed for a particular type of save (either because no save is
needed or because a machine-specific save area can be used).
Operand 0 is the stack pointer and operand 1 is the save area for
restore operations. If `save_stack_block' is defined, operand 0
must not be `VOIDmode' since these saves can be arbitrarily nested.
A save area is a `mem' that is at a constant offset from
`virtual_stack_vars_rtx' when the stack pointer is saved for use by
nonlocal gotos and a `reg' in the other two cases.
`allocate_stack'
Subtract (or add if `STACK_GROWS_DOWNWARD' is undefined) operand 1
from the stack pointer to create space for dynamically allocated
data.
Store the resultant pointer to this space into operand 0. If you
are allocating space from the main stack, do this by emitting a
move insn to copy `virtual_stack_dynamic_rtx' to operand 0. If
you are allocating the space elsewhere, generate code to copy the
location of the space to operand 0. In the latter case, you must
ensure this space gets freed when the corresponding space on the
main stack is free.
Do not define this pattern if all that must be done is the
subtraction. Some machines require other operations such as stack
probes or maintaining the back chain. Define this pattern to emit
those operations in addition to updating the stack pointer.
`check_stack'
If stack checking (*note Stack Checking::) cannot be done on your
system by probing the stack, define this pattern to perform the
needed check and signal an error if the stack has overflowed. The
single operand is the address in the stack farthest from the
current stack pointer that you need to validate. Normally, on
platforms where this pattern is needed, you would obtain the stack
limit from a global or thread-specific variable or register.
`probe_stack'
If stack checking (*note Stack Checking::) can be done on your
system by probing the stack but doing it with a "store zero"
instruction is not valid or optimal, define this pattern to do the
probing differently and signal an error if the stack has
overflowed. The single operand is the memory reference in the
stack that needs to be probed.
`nonlocal_goto'
Emit code to generate a non-local goto, e.g., a jump from one
function to a label in an outer function. This pattern has four
arguments, each representing a value to be used in the jump. The
first argument is to be loaded into the frame pointer, the second
is the address to branch to (code to dispatch to the actual label),
the third is the address of a location where the stack is saved,
and the last is the address of the label, to be placed in the
location for the incoming static chain.
On most machines you need not define this pattern, since GCC will
already generate the correct code, which is to load the frame
pointer and static chain, restore the stack (using the
`restore_stack_nonlocal' pattern, if defined), and jump indirectly
to the dispatcher. You need only define this pattern if this code
will not work on your machine.
`nonlocal_goto_receiver'
This pattern, if defined, contains code needed at the target of a
nonlocal goto after the code already generated by GCC. You will
not normally need to define this pattern. A typical reason why
you might need this pattern is if some value, such as a pointer to
a global table, must be restored when the frame pointer is
restored. Note that a nonlocal goto only occurs within a
unit-of-translation, so a global table pointer that is shared by
all functions of a given module need not be restored. There are
no arguments.
`exception_receiver'
This pattern, if defined, contains code needed at the site of an
exception handler that isn't needed at the site of a nonlocal
goto. You will not normally need to define this pattern. A
typical reason why you might need this pattern is if some value,
such as a pointer to a global table, must be restored after
control flow is branched to the handler of an exception. There
are no arguments.
`builtin_setjmp_setup'
This pattern, if defined, contains additional code needed to
initialize the `jmp_buf'. You will not normally need to define
this pattern. A typical reason why you might need this pattern is
if some value, such as a pointer to a global table, must be
restored. Though it is preferred that the pointer value be
recalculated if possible (given the address of a label for
instance). The single argument is a pointer to the `jmp_buf'.
Note that the buffer is five words long and that the first three
are normally used by the generic mechanism.
`builtin_setjmp_receiver'
This pattern, if defined, contains code needed at the site of a
built-in setjmp that isn't needed at the site of a nonlocal goto.
You will not normally need to define this pattern. A typical
reason why you might need this pattern is if some value, such as a
pointer to a global table, must be restored. It takes one
argument, which is the label to which builtin_longjmp transfered
control; this pattern may be emitted at a small offset from that
label.
`builtin_longjmp'
This pattern, if defined, performs the entire action of the
longjmp. You will not normally need to define this pattern unless
you also define `builtin_setjmp_setup'. The single argument is a
pointer to the `jmp_buf'.
`eh_return'
This pattern, if defined, affects the way `__builtin_eh_return',
and thence the call frame exception handling library routines, are
built. It is intended to handle non-trivial actions needed along
the abnormal return path.
The address of the exception handler to which the function should
return is passed as operand to this pattern. It will normally
need to copied by the pattern to some special register or memory
location. If the pattern needs to determine the location of the
target call frame in order to do so, it may use
`EH_RETURN_STACKADJ_RTX', if defined; it will have already been
assigned.
If this pattern is not defined, the default action will be to
simply copy the return address to `EH_RETURN_HANDLER_RTX'. Either
that macro or this pattern needs to be defined if call frame
exception handling is to be used.
`prologue'
This pattern, if defined, emits RTL for entry to a function. The
function entry is responsible for setting up the stack frame,
initializing the frame pointer register, saving callee saved
registers, etc.
Using a prologue pattern is generally preferred over defining
`TARGET_ASM_FUNCTION_PROLOGUE' to emit assembly code for the
prologue.
The `prologue' pattern is particularly useful for targets which
perform instruction scheduling.
`epilogue'
This pattern emits RTL for exit from a function. The function
exit is responsible for deallocating the stack frame, restoring
callee saved registers and emitting the return instruction.
Using an epilogue pattern is generally preferred over defining
`TARGET_ASM_FUNCTION_EPILOGUE' to emit assembly code for the
epilogue.
The `epilogue' pattern is particularly useful for targets which
perform instruction scheduling or which have delay slots for their
return instruction.
`sibcall_epilogue'
This pattern, if defined, emits RTL for exit from a function
without the final branch back to the calling function. This
pattern will be emitted before any sibling call (aka tail call)
sites.
The `sibcall_epilogue' pattern must not clobber any arguments used
for parameter passing or any stack slots for arguments passed to
the current function.
`trap'
This pattern, if defined, signals an error, typically by causing
some kind of signal to be raised. Among other places, it is used
by the Java front end to signal `invalid array index' exceptions.
`ctrapMM4'
Conditional trap instruction. Operand 0 is a piece of RTL which
performs a comparison, and operands 1 and 2 are the arms of the
comparison. Operand 3 is the trap code, an integer.
A typical `ctrap' pattern looks like
(define_insn "ctrapsi4"
[(trap_if (match_operator 0 "trap_operator"
[(match_operand 1 "register_operand")
(match_operand 2 "immediate_operand")])
(match_operand 3 "const_int_operand" "i"))]
""
"...")
`prefetch'
This pattern, if defined, emits code for a non-faulting data
prefetch instruction. Operand 0 is the address of the memory to
prefetch. Operand 1 is a constant 1 if the prefetch is preparing
for a write to the memory address, or a constant 0 otherwise.
Operand 2 is the expected degree of temporal locality of the data
and is a value between 0 and 3, inclusive; 0 means that the data
has no temporal locality, so it need not be left in the cache
after the access; 3 means that the data has a high degree of
temporal locality and should be left in all levels of cache
possible; 1 and 2 mean, respectively, a low or moderate degree of
temporal locality.
Targets that do not support write prefetches or locality hints can
ignore the values of operands 1 and 2.
`blockage'
This pattern defines a pseudo insn that prevents the instruction
scheduler from moving instructions across the boundary defined by
the blockage insn. Normally an UNSPEC_VOLATILE pattern.
`memory_barrier'
If the target memory model is not fully synchronous, then this
pattern should be defined to an instruction that orders both loads
and stores before the instruction with respect to loads and stores
after the instruction. This pattern has no operands.
`sync_compare_and_swapMODE'
This pattern, if defined, emits code for an atomic compare-and-swap
operation. Operand 1 is the memory on which the atomic operation
is performed. Operand 2 is the "old" value to be compared against
the current contents of the memory location. Operand 3 is the
"new" value to store in the memory if the compare succeeds.
Operand 0 is the result of the operation; it should contain the
contents of the memory before the operation. If the compare
succeeds, this should obviously be a copy of operand 2.
This pattern must show that both operand 0 and operand 1 are
modified.
This pattern must issue any memory barrier instructions such that
all memory operations before the atomic operation occur before the
atomic operation and all memory operations after the atomic
operation occur after the atomic operation.
For targets where the success or failure of the compare-and-swap
operation is available via the status flags, it is possible to
avoid a separate compare operation and issue the subsequent branch
or store-flag operation immediately after the compare-and-swap.
To this end, GCC will look for a `MODE_CC' set in the output of
`sync_compare_and_swapMODE'; if the machine description includes
such a set, the target should also define special `cbranchcc4'
and/or `cstorecc4' instructions. GCC will then be able to take
the destination of the `MODE_CC' set and pass it to the
`cbranchcc4' or `cstorecc4' pattern as the first operand of the
comparison (the second will be `(const_int 0)').
`sync_addMODE', `sync_subMODE'
`sync_iorMODE', `sync_andMODE'
`sync_xorMODE', `sync_nandMODE'
These patterns emit code for an atomic operation on memory.
Operand 0 is the memory on which the atomic operation is performed.
Operand 1 is the second operand to the binary operator.
This pattern must issue any memory barrier instructions such that
all memory operations before the atomic operation occur before the
atomic operation and all memory operations after the atomic
operation occur after the atomic operation.
If these patterns are not defined, the operation will be
constructed from a compare-and-swap operation, if defined.
`sync_old_addMODE', `sync_old_subMODE'
`sync_old_iorMODE', `sync_old_andMODE'
`sync_old_xorMODE', `sync_old_nandMODE'
These patterns are emit code for an atomic operation on memory,
and return the value that the memory contained before the
operation. Operand 0 is the result value, operand 1 is the memory
on which the atomic operation is performed, and operand 2 is the
second operand to the binary operator.
This pattern must issue any memory barrier instructions such that
all memory operations before the atomic operation occur before the
atomic operation and all memory operations after the atomic
operation occur after the atomic operation.
If these patterns are not defined, the operation will be
constructed from a compare-and-swap operation, if defined.
`sync_new_addMODE', `sync_new_subMODE'
`sync_new_iorMODE', `sync_new_andMODE'
`sync_new_xorMODE', `sync_new_nandMODE'
These patterns are like their `sync_old_OP' counterparts, except
that they return the value that exists in the memory location
after the operation, rather than before the operation.
`sync_lock_test_and_setMODE'
This pattern takes two forms, based on the capabilities of the
target. In either case, operand 0 is the result of the operand,
operand 1 is the memory on which the atomic operation is
performed, and operand 2 is the value to set in the lock.
In the ideal case, this operation is an atomic exchange operation,
in which the previous value in memory operand is copied into the
result operand, and the value operand is stored in the memory
operand.
For less capable targets, any value operand that is not the
constant 1 should be rejected with `FAIL'. In this case the
target may use an atomic test-and-set bit operation. The result
operand should contain 1 if the bit was previously set and 0 if
the bit was previously clear. The true contents of the memory
operand are implementation defined.
This pattern must issue any memory barrier instructions such that
the pattern as a whole acts as an acquire barrier, that is all
memory operations after the pattern do not occur until the lock is
acquired.
If this pattern is not defined, the operation will be constructed
from a compare-and-swap operation, if defined.
`sync_lock_releaseMODE'
This pattern, if defined, releases a lock set by
`sync_lock_test_and_setMODE'. Operand 0 is the memory that
contains the lock; operand 1 is the value to store in the lock.
If the target doesn't implement full semantics for
`sync_lock_test_and_setMODE', any value operand which is not the
constant 0 should be rejected with `FAIL', and the true contents
of the memory operand are implementation defined.
This pattern must issue any memory barrier instructions such that
the pattern as a whole acts as a release barrier, that is the lock
is released only after all previous memory operations have
completed.
If this pattern is not defined, then a `memory_barrier' pattern
will be emitted, followed by a store of the value to the memory
operand.
`stack_protect_set'
This pattern, if defined, moves a `ptr_mode' value from the memory
in operand 1 to the memory in operand 0 without leaving the value
in a register afterward. This is to avoid leaking the value some
place that an attacker might use to rewrite the stack guard slot
after having clobbered it.
If this pattern is not defined, then a plain move pattern is
generated.
`stack_protect_test'
This pattern, if defined, compares a `ptr_mode' value from the
memory in operand 1 with the memory in operand 0 without leaving
the value in a register afterward and branches to operand 2 if the
values weren't equal.
If this pattern is not defined, then a plain compare pattern and
conditional branch pattern is used.
`clear_cache'
This pattern, if defined, flushes the instruction cache for a
region of memory. The region is bounded to by the Pmode pointers
in operand 0 inclusive and operand 1 exclusive.
If this pattern is not defined, a call to the library function
`__clear_cache' is used.
File: gccint.info, Node: Pattern Ordering, Next: Dependent Patterns, Prev: Standard Names, Up: Machine Desc
16.10 When the Order of Patterns Matters
========================================
Sometimes an insn can match more than one instruction pattern. Then the
pattern that appears first in the machine description is the one used.
Therefore, more specific patterns (patterns that will match fewer
things) and faster instructions (those that will produce better code
when they do match) should usually go first in the description.
In some cases the effect of ordering the patterns can be used to hide
a pattern when it is not valid. For example, the 68000 has an
instruction for converting a fullword to floating point and another for
converting a byte to floating point. An instruction converting an
integer to floating point could match either one. We put the pattern
to convert the fullword first to make sure that one will be used rather
than the other. (Otherwise a large integer might be generated as a
single-byte immediate quantity, which would not work.) Instead of
using this pattern ordering it would be possible to make the pattern
for convert-a-byte smart enough to deal properly with any constant
value.
File: gccint.info, Node: Dependent Patterns, Next: Jump Patterns, Prev: Pattern Ordering, Up: Machine Desc
16.11 Interdependence of Patterns
=================================
In some cases machines support instructions identical except for the
machine mode of one or more operands. For example, there may be
"sign-extend halfword" and "sign-extend byte" instructions whose
patterns are
(set (match_operand:SI 0 ...)
(extend:SI (match_operand:HI 1 ...)))
(set (match_operand:SI 0 ...)
(extend:SI (match_operand:QI 1 ...)))
Constant integers do not specify a machine mode, so an instruction to
extend a constant value could match either pattern. The pattern it
actually will match is the one that appears first in the file. For
correct results, this must be the one for the widest possible mode
(`HImode', here). If the pattern matches the `QImode' instruction, the
results will be incorrect if the constant value does not actually fit
that mode.
Such instructions to extend constants are rarely generated because
they are optimized away, but they do occasionally happen in nonoptimized
compilations.
If a constraint in a pattern allows a constant, the reload pass may
replace a register with a constant permitted by the constraint in some
cases. Similarly for memory references. Because of this substitution,
you should not provide separate patterns for increment and decrement
instructions. Instead, they should be generated from the same pattern
that supports register-register add insns by examining the operands and
generating the appropriate machine instruction.
File: gccint.info, Node: Jump Patterns, Next: Looping Patterns, Prev: Dependent Patterns, Up: Machine Desc
16.12 Defining Jump Instruction Patterns
========================================
GCC does not assume anything about how the machine realizes jumps. The
machine description should define a single pattern, usually a
`define_expand', which expands to all the required insns.
Usually, this would be a comparison insn to set the condition code and
a separate branch insn testing the condition code and branching or not
according to its value. For many machines, however, separating
compares and branches is limiting, which is why the more flexible
approach with one `define_expand' is used in GCC. The machine
description becomes clearer for architectures that have
compare-and-branch instructions but no condition code. It also works
better when different sets of comparison operators are supported by
different kinds of conditional branches (e.g. integer vs.
floating-point), or by conditional branches with respect to conditional
stores.
Two separate insns are always used if the machine description
represents a condition code register using the legacy RTL expression
`(cc0)', and on most machines that use a separate condition code
register (*note Condition Code::). For machines that use `(cc0)', in
fact, the set and use of the condition code must be separate and
adjacent(1), thus allowing flags in `cc_status' to be used (*note
Condition Code::) and so that the comparison and branch insns could be
located from each other by using the functions `prev_cc0_setter' and
`next_cc0_user'.
Even in this case having a single entry point for conditional branches
is advantageous, because it handles equally well the case where a single
comparison instruction records the results of both signed and unsigned
comparison of the given operands (with the branch insns coming in
distinct signed and unsigned flavors) as in the x86 or SPARC, and the
case where there are distinct signed and unsigned compare instructions
and only one set of conditional branch instructions as in the PowerPC.
---------- Footnotes ----------
(1) `note' insns can separate them, though.
File: gccint.info, Node: Looping Patterns, Next: Insn Canonicalizations, Prev: Jump Patterns, Up: Machine Desc
16.13 Defining Looping Instruction Patterns
===========================================
Some machines have special jump instructions that can be utilized to
make loops more efficient. A common example is the 68000 `dbra'
instruction which performs a decrement of a register and a branch if the
result was greater than zero. Other machines, in particular digital
signal processors (DSPs), have special block repeat instructions to
provide low-overhead loop support. For example, the TI TMS320C3x/C4x
DSPs have a block repeat instruction that loads special registers to
mark the top and end of a loop and to count the number of loop
iterations. This avoids the need for fetching and executing a
`dbra'-like instruction and avoids pipeline stalls associated with the
jump.
GCC has three special named patterns to support low overhead looping.
They are `decrement_and_branch_until_zero', `doloop_begin', and
`doloop_end'. The first pattern, `decrement_and_branch_until_zero', is
not emitted during RTL generation but may be emitted during the
instruction combination phase. This requires the assistance of the
loop optimizer, using information collected during strength reduction,
to reverse a loop to count down to zero. Some targets also require the
loop optimizer to add a `REG_NONNEG' note to indicate that the
iteration count is always positive. This is needed if the target
performs a signed loop termination test. For example, the 68000 uses a
pattern similar to the following for its `dbra' instruction:
(define_insn "decrement_and_branch_until_zero"
[(set (pc)
(if_then_else
(ge (plus:SI (match_operand:SI 0 "general_operand" "+d*am")
(const_int -1))
(const_int 0))
(label_ref (match_operand 1 "" ""))
(pc)))
(set (match_dup 0)
(plus:SI (match_dup 0)
(const_int -1)))]
"find_reg_note (insn, REG_NONNEG, 0)"
"...")
Note that since the insn is both a jump insn and has an output, it must
deal with its own reloads, hence the `m' constraints. Also note that
since this insn is generated by the instruction combination phase
combining two sequential insns together into an implicit parallel insn,
the iteration counter needs to be biased by the same amount as the
decrement operation, in this case -1. Note that the following similar
pattern will not be matched by the combiner.
(define_insn "decrement_and_branch_until_zero"
[(set (pc)
(if_then_else
(ge (match_operand:SI 0 "general_operand" "+d*am")
(const_int 1))
(label_ref (match_operand 1 "" ""))
(pc)))
(set (match_dup 0)
(plus:SI (match_dup 0)
(const_int -1)))]
"find_reg_note (insn, REG_NONNEG, 0)"
"...")
The other two special looping patterns, `doloop_begin' and
`doloop_end', are emitted by the loop optimizer for certain
well-behaved loops with a finite number of loop iterations using
information collected during strength reduction.
The `doloop_end' pattern describes the actual looping instruction (or
the implicit looping operation) and the `doloop_begin' pattern is an
optional companion pattern that can be used for initialization needed
for some low-overhead looping instructions.
Note that some machines require the actual looping instruction to be
emitted at the top of the loop (e.g., the TMS320C3x/C4x DSPs). Emitting
the true RTL for a looping instruction at the top of the loop can cause
problems with flow analysis. So instead, a dummy `doloop' insn is
emitted at the end of the loop. The machine dependent reorg pass checks
for the presence of this `doloop' insn and then searches back to the
top of the loop, where it inserts the true looping insn (provided there
are no instructions in the loop which would cause problems). Any
additional labels can be emitted at this point. In addition, if the
desired special iteration counter register was not allocated, this
machine dependent reorg pass could emit a traditional compare and jump
instruction pair.
The essential difference between the `decrement_and_branch_until_zero'
and the `doloop_end' patterns is that the loop optimizer allocates an
additional pseudo register for the latter as an iteration counter.
This pseudo register cannot be used within the loop (i.e., general
induction variables cannot be derived from it), however, in many cases
the loop induction variable may become redundant and removed by the
flow pass.
File: gccint.info, Node: Insn Canonicalizations, Next: Expander Definitions, Prev: Looping Patterns, Up: Machine Desc
16.14 Canonicalization of Instructions
======================================
There are often cases where multiple RTL expressions could represent an
operation performed by a single machine instruction. This situation is
most commonly encountered with logical, branch, and multiply-accumulate
instructions. In such cases, the compiler attempts to convert these
multiple RTL expressions into a single canonical form to reduce the
number of insn patterns required.
In addition to algebraic simplifications, following canonicalizations
are performed:
* For commutative and comparison operators, a constant is always
made the second operand. If a machine only supports a constant as
the second operand, only patterns that match a constant in the
second operand need be supplied.
* For associative operators, a sequence of operators will always
chain to the left; for instance, only the left operand of an
integer `plus' can itself be a `plus'. `and', `ior', `xor',
`plus', `mult', `smin', `smax', `umin', and `umax' are associative
when applied to integers, and sometimes to floating-point.
* For these operators, if only one operand is a `neg', `not',
`mult', `plus', or `minus' expression, it will be the first
operand.
* In combinations of `neg', `mult', `plus', and `minus', the `neg'
operations (if any) will be moved inside the operations as far as
possible. For instance, `(neg (mult A B))' is canonicalized as
`(mult (neg A) B)', but `(plus (mult (neg B) C) A)' is
canonicalized as `(minus A (mult B C))'.
* For the `compare' operator, a constant is always the second operand
if the first argument is a condition code register or `(cc0)'.
* An operand of `neg', `not', `mult', `plus', or `minus' is made the
first operand under the same conditions as above.
* `(ltu (plus A B) B)' is converted to `(ltu (plus A B) A)'.
Likewise with `geu' instead of `ltu'.
* `(minus X (const_int N))' is converted to `(plus X (const_int
-N))'.
* Within address computations (i.e., inside `mem'), a left shift is
converted into the appropriate multiplication by a power of two.
* De Morgan's Law is used to move bitwise negation inside a bitwise
logical-and or logical-or operation. If this results in only one
operand being a `not' expression, it will be the first one.
A machine that has an instruction that performs a bitwise
logical-and of one operand with the bitwise negation of the other
should specify the pattern for that instruction as
(define_insn ""
[(set (match_operand:M 0 ...)
(and:M (not:M (match_operand:M 1 ...))
(match_operand:M 2 ...)))]
"..."
"...")
Similarly, a pattern for a "NAND" instruction should be written
(define_insn ""
[(set (match_operand:M 0 ...)
(ior:M (not:M (match_operand:M 1 ...))
(not:M (match_operand:M 2 ...))))]
"..."
"...")
In both cases, it is not necessary to include patterns for the many
logically equivalent RTL expressions.
* The only possible RTL expressions involving both bitwise
exclusive-or and bitwise negation are `(xor:M X Y)' and `(not:M
(xor:M X Y))'.
* The sum of three items, one of which is a constant, will only
appear in the form
(plus:M (plus:M X Y) CONSTANT)
* Equality comparisons of a group of bits (usually a single bit)
with zero will be written using `zero_extract' rather than the
equivalent `and' or `sign_extract' operations.
Further canonicalization rules are defined in the function
`commutative_operand_precedence' in `gcc/rtlanal.c'.
File: gccint.info, Node: Expander Definitions, Next: Insn Splitting, Prev: Insn Canonicalizations, Up: Machine Desc
16.15 Defining RTL Sequences for Code Generation
================================================
On some target machines, some standard pattern names for RTL generation
cannot be handled with single insn, but a sequence of RTL insns can
represent them. For these target machines, you can write a
`define_expand' to specify how to generate the sequence of RTL.
A `define_expand' is an RTL expression that looks almost like a
`define_insn'; but, unlike the latter, a `define_expand' is used only
for RTL generation and it can produce more than one RTL insn.
A `define_expand' RTX has four operands:
* The name. Each `define_expand' must have a name, since the only
use for it is to refer to it by name.
* The RTL template. This is a vector of RTL expressions representing
a sequence of separate instructions. Unlike `define_insn', there
is no implicit surrounding `PARALLEL'.
* The condition, a string containing a C expression. This
expression is used to express how the availability of this pattern
depends on subclasses of target machine, selected by command-line
options when GCC is run. This is just like the condition of a
`define_insn' that has a standard name. Therefore, the condition
(if present) may not depend on the data in the insn being matched,
but only the target-machine-type flags. The compiler needs to
test these conditions during initialization in order to learn
exactly which named instructions are available in a particular run.
* The preparation statements, a string containing zero or more C
statements which are to be executed before RTL code is generated
from the RTL template.
Usually these statements prepare temporary registers for use as
internal operands in the RTL template, but they can also generate
RTL insns directly by calling routines such as `emit_insn', etc.
Any such insns precede the ones that come from the RTL template.
Every RTL insn emitted by a `define_expand' must match some
`define_insn' in the machine description. Otherwise, the compiler will
crash when trying to generate code for the insn or trying to optimize
it.
The RTL template, in addition to controlling generation of RTL insns,
also describes the operands that need to be specified when this pattern
is used. In particular, it gives a predicate for each operand.
A true operand, which needs to be specified in order to generate RTL
from the pattern, should be described with a `match_operand' in its
first occurrence in the RTL template. This enters information on the
operand's predicate into the tables that record such things. GCC uses
the information to preload the operand into a register if that is
required for valid RTL code. If the operand is referred to more than
once, subsequent references should use `match_dup'.
The RTL template may also refer to internal "operands" which are
temporary registers or labels used only within the sequence made by the
`define_expand'. Internal operands are substituted into the RTL
template with `match_dup', never with `match_operand'. The values of
the internal operands are not passed in as arguments by the compiler
when it requests use of this pattern. Instead, they are computed
within the pattern, in the preparation statements. These statements
compute the values and store them into the appropriate elements of
`operands' so that `match_dup' can find them.
There are two special macros defined for use in the preparation
statements: `DONE' and `FAIL'. Use them with a following semicolon, as
a statement.
`DONE'
Use the `DONE' macro to end RTL generation for the pattern. The
only RTL insns resulting from the pattern on this occasion will be
those already emitted by explicit calls to `emit_insn' within the
preparation statements; the RTL template will not be generated.
`FAIL'
Make the pattern fail on this occasion. When a pattern fails, it
means that the pattern was not truly available. The calling
routines in the compiler will try other strategies for code
generation using other patterns.
Failure is currently supported only for binary (addition,
multiplication, shifting, etc.) and bit-field (`extv', `extzv',
and `insv') operations.
If the preparation falls through (invokes neither `DONE' nor `FAIL'),
then the `define_expand' acts like a `define_insn' in that the RTL
template is used to generate the insn.
The RTL template is not used for matching, only for generating the
initial insn list. If the preparation statement always invokes `DONE'
or `FAIL', the RTL template may be reduced to a simple list of
operands, such as this example:
(define_expand "addsi3"
[(match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "register_operand" "")]
""
"
{
handle_add (operands[0], operands[1], operands[2]);
DONE;
}")
Here is an example, the definition of left-shift for the SPUR chip:
(define_expand "ashlsi3"
[(set (match_operand:SI 0 "register_operand" "")
(ashift:SI
(match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "nonmemory_operand" "")))]
""
"
{
if (GET_CODE (operands[2]) != CONST_INT
|| (unsigned) INTVAL (operands[2]) > 3)
FAIL;
}")
This example uses `define_expand' so that it can generate an RTL insn
for shifting when the shift-count is in the supported range of 0 to 3
but fail in other cases where machine insns aren't available. When it
fails, the compiler tries another strategy using different patterns
(such as, a library call).
If the compiler were able to handle nontrivial condition-strings in
patterns with names, then it would be possible to use a `define_insn'
in that case. Here is another case (zero-extension on the 68000) which
makes more use of the power of `define_expand':
(define_expand "zero_extendhisi2"
[(set (match_operand:SI 0 "general_operand" "")
(const_int 0))
(set (strict_low_part
(subreg:HI
(match_dup 0)
0))
(match_operand:HI 1 "general_operand" ""))]
""
"operands[1] = make_safe_from (operands[1], operands[0]);")
Here two RTL insns are generated, one to clear the entire output operand
and the other to copy the input operand into its low half. This
sequence is incorrect if the input operand refers to [the old value of]
the output operand, so the preparation statement makes sure this isn't
so. The function `make_safe_from' copies the `operands[1]' into a
temporary register if it refers to `operands[0]'. It does this by
emitting another RTL insn.
Finally, a third example shows the use of an internal operand.
Zero-extension on the SPUR chip is done by `and'-ing the result against
a halfword mask. But this mask cannot be represented by a `const_int'
because the constant value is too large to be legitimate on this
machine. So it must be copied into a register with `force_reg' and
then the register used in the `and'.
(define_expand "zero_extendhisi2"
[(set (match_operand:SI 0 "register_operand" "")
(and:SI (subreg:SI
(match_operand:HI 1 "register_operand" "")
0)
(match_dup 2)))]
""
"operands[2]
= force_reg (SImode, GEN_INT (65535)); ")
_Note:_ If the `define_expand' is used to serve a standard binary or
unary arithmetic operation or a bit-field operation, then the last insn
it generates must not be a `code_label', `barrier' or `note'. It must
be an `insn', `jump_insn' or `call_insn'. If you don't need a real insn
at the end, emit an insn to copy the result of the operation into
itself. Such an insn will generate no code, but it can avoid problems
in the compiler.
File: gccint.info, Node: Insn Splitting, Next: Including Patterns, Prev: Expander Definitions, Up: Machine Desc
16.16 Defining How to Split Instructions
========================================
There are two cases where you should specify how to split a pattern
into multiple insns. On machines that have instructions requiring
delay slots (*note Delay Slots::) or that have instructions whose
output is not available for multiple cycles (*note Processor pipeline
description::), the compiler phases that optimize these cases need to
be able to move insns into one-instruction delay slots. However, some
insns may generate more than one machine instruction. These insns
cannot be placed into a delay slot.
Often you can rewrite the single insn as a list of individual insns,
each corresponding to one machine instruction. The disadvantage of
doing so is that it will cause the compilation to be slower and require
more space. If the resulting insns are too complex, it may also
suppress some optimizations. The compiler splits the insn if there is a
reason to believe that it might improve instruction or delay slot
scheduling.
The insn combiner phase also splits putative insns. If three insns are
merged into one insn with a complex expression that cannot be matched by
some `define_insn' pattern, the combiner phase attempts to split the
complex pattern into two insns that are recognized. Usually it can
break the complex pattern into two patterns by splitting out some
subexpression. However, in some other cases, such as performing an
addition of a large constant in two insns on a RISC machine, the way to
split the addition into two insns is machine-dependent.
The `define_split' definition tells the compiler how to split a
complex insn into several simpler insns. It looks like this:
(define_split
[INSN-PATTERN]
"CONDITION"
[NEW-INSN-PATTERN-1
NEW-INSN-PATTERN-2
...]
"PREPARATION-STATEMENTS")
INSN-PATTERN is a pattern that needs to be split and CONDITION is the
final condition to be tested, as in a `define_insn'. When an insn
matching INSN-PATTERN and satisfying CONDITION is found, it is replaced
in the insn list with the insns given by NEW-INSN-PATTERN-1,
NEW-INSN-PATTERN-2, etc.
The PREPARATION-STATEMENTS are similar to those statements that are
specified for `define_expand' (*note Expander Definitions::) and are
executed before the new RTL is generated to prepare for the generated
code or emit some insns whose pattern is not fixed. Unlike those in
`define_expand', however, these statements must not generate any new
pseudo-registers. Once reload has completed, they also must not
allocate any space in the stack frame.
Patterns are matched against INSN-PATTERN in two different
circumstances. If an insn needs to be split for delay slot scheduling
or insn scheduling, the insn is already known to be valid, which means
that it must have been matched by some `define_insn' and, if
`reload_completed' is nonzero, is known to satisfy the constraints of
that `define_insn'. In that case, the new insn patterns must also be
insns that are matched by some `define_insn' and, if `reload_completed'
is nonzero, must also satisfy the constraints of those definitions.
As an example of this usage of `define_split', consider the following
example from `a29k.md', which splits a `sign_extend' from `HImode' to
`SImode' into a pair of shift insns:
(define_split
[(set (match_operand:SI 0 "gen_reg_operand" "")
(sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))]
""
[(set (match_dup 0)
(ashift:SI (match_dup 1)
(const_int 16)))
(set (match_dup 0)
(ashiftrt:SI (match_dup 0)
(const_int 16)))]
"
{ operands[1] = gen_lowpart (SImode, operands[1]); }")
When the combiner phase tries to split an insn pattern, it is always
the case that the pattern is _not_ matched by any `define_insn'. The
combiner pass first tries to split a single `set' expression and then
the same `set' expression inside a `parallel', but followed by a
`clobber' of a pseudo-reg to use as a scratch register. In these
cases, the combiner expects exactly two new insn patterns to be
generated. It will verify that these patterns match some `define_insn'
definitions, so you need not do this test in the `define_split' (of
course, there is no point in writing a `define_split' that will never
produce insns that match).
Here is an example of this use of `define_split', taken from
`rs6000.md':
(define_split
[(set (match_operand:SI 0 "gen_reg_operand" "")
(plus:SI (match_operand:SI 1 "gen_reg_operand" "")
(match_operand:SI 2 "non_add_cint_operand" "")))]
""
[(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
(set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
"
{
int low = INTVAL (operands[2]) & 0xffff;
int high = (unsigned) INTVAL (operands[2]) >> 16;
if (low & 0x8000)
high++, low |= 0xffff0000;
operands[3] = GEN_INT (high << 16);
operands[4] = GEN_INT (low);
}")
Here the predicate `non_add_cint_operand' matches any `const_int' that
is _not_ a valid operand of a single add insn. The add with the
smaller displacement is written so that it can be substituted into the
address of a subsequent operation.
An example that uses a scratch register, from the same file, generates
an equality comparison of a register and a large constant:
(define_split
[(set (match_operand:CC 0 "cc_reg_operand" "")
(compare:CC (match_operand:SI 1 "gen_reg_operand" "")
(match_operand:SI 2 "non_short_cint_operand" "")))
(clobber (match_operand:SI 3 "gen_reg_operand" ""))]
"find_single_use (operands[0], insn, 0)
&& (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ
|| GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)"
[(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4)))
(set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))]
"
{
/* Get the constant we are comparing against, C, and see what it
looks like sign-extended to 16 bits. Then see what constant
could be XOR'ed with C to get the sign-extended value. */
int c = INTVAL (operands[2]);
int sextc = (c << 16) >> 16;
int xorv = c ^ sextc;
operands[4] = GEN_INT (xorv);
operands[5] = GEN_INT (sextc);
}")
To avoid confusion, don't write a single `define_split' that accepts
some insns that match some `define_insn' as well as some insns that
don't. Instead, write two separate `define_split' definitions, one for
the insns that are valid and one for the insns that are not valid.
The splitter is allowed to split jump instructions into sequence of
jumps or create new jumps in while splitting non-jump instructions. As
the central flowgraph and branch prediction information needs to be
updated, several restriction apply.
Splitting of jump instruction into sequence that over by another jump
instruction is always valid, as compiler expect identical behavior of
new jump. When new sequence contains multiple jump instructions or new
labels, more assistance is needed. Splitter is required to create only
unconditional jumps, or simple conditional jump instructions.
Additionally it must attach a `REG_BR_PROB' note to each conditional
jump. A global variable `split_branch_probability' holds the
probability of the original branch in case it was a simple conditional
jump, -1 otherwise. To simplify recomputing of edge frequencies, the
new sequence is required to have only forward jumps to the newly
created labels.
For the common case where the pattern of a define_split exactly
matches the pattern of a define_insn, use `define_insn_and_split'. It
looks like this:
(define_insn_and_split
[INSN-PATTERN]
"CONDITION"
"OUTPUT-TEMPLATE"
"SPLIT-CONDITION"
[NEW-INSN-PATTERN-1
NEW-INSN-PATTERN-2
...]
"PREPARATION-STATEMENTS"
[INSN-ATTRIBUTES])
INSN-PATTERN, CONDITION, OUTPUT-TEMPLATE, and INSN-ATTRIBUTES are used
as in `define_insn'. The NEW-INSN-PATTERN vector and the
PREPARATION-STATEMENTS are used as in a `define_split'. The
SPLIT-CONDITION is also used as in `define_split', with the additional
behavior that if the condition starts with `&&', the condition used for
the split will be the constructed as a logical "and" of the split
condition with the insn condition. For example, from i386.md:
(define_insn_and_split "zero_extendhisi2_and"
[(set (match_operand:SI 0 "register_operand" "=r")
(zero_extend:SI (match_operand:HI 1 "register_operand" "0")))
(clobber (reg:CC 17))]
"TARGET_ZERO_EXTEND_WITH_AND && !optimize_size"
"#"
"&& reload_completed"
[(parallel [(set (match_dup 0)
(and:SI (match_dup 0) (const_int 65535)))
(clobber (reg:CC 17))])]
""
[(set_attr "type" "alu1")])
In this case, the actual split condition will be
`TARGET_ZERO_EXTEND_WITH_AND && !optimize_size && reload_completed'.
The `define_insn_and_split' construction provides exactly the same
functionality as two separate `define_insn' and `define_split'
patterns. It exists for compactness, and as a maintenance tool to
prevent having to ensure the two patterns' templates match.
File: gccint.info, Node: Including Patterns, Next: Peephole Definitions, Prev: Insn Splitting, Up: Machine Desc
16.17 Including Patterns in Machine Descriptions.
=================================================
The `include' pattern tells the compiler tools where to look for
patterns that are in files other than in the file `.md'. This is used
only at build time and there is no preprocessing allowed.
It looks like:
(include
PATHNAME)
For example:
(include "filestuff")
Where PATHNAME is a string that specifies the location of the file,
specifies the include file to be in `gcc/config/target/filestuff'. The
directory `gcc/config/target' is regarded as the default directory.
Machine descriptions may be split up into smaller more manageable
subsections and placed into subdirectories.
By specifying:
(include "BOGUS/filestuff")
the include file is specified to be in
`gcc/config/TARGET/BOGUS/filestuff'.
Specifying an absolute path for the include file such as;
(include "/u2/BOGUS/filestuff")
is permitted but is not encouraged.
16.17.1 RTL Generation Tool Options for Directory Search
--------------------------------------------------------
The `-IDIR' option specifies directories to search for machine
descriptions. For example:
genrecog -I/p1/abc/proc1 -I/p2/abcd/pro2 target.md
Add the directory DIR to the head of the list of directories to be
searched for header files. This can be used to override a system
machine definition file, substituting your own version, since these
directories are searched before the default machine description file
directories. If you use more than one `-I' option, the directories are
scanned in left-to-right order; the standard default directory come
after.
File: gccint.info, Node: Peephole Definitions, Next: Insn Attributes, Prev: Including Patterns, Up: Machine Desc
16.18 Machine-Specific Peephole Optimizers
==========================================
In addition to instruction patterns the `md' file may contain
definitions of machine-specific peephole optimizations.
The combiner does not notice certain peephole optimizations when the
data flow in the program does not suggest that it should try them. For
example, sometimes two consecutive insns related in purpose can be
combined even though the second one does not appear to use a register
computed in the first one. A machine-specific peephole optimizer can
detect such opportunities.
There are two forms of peephole definitions that may be used. The
original `define_peephole' is run at assembly output time to match
insns and substitute assembly text. Use of `define_peephole' is
deprecated.
A newer `define_peephole2' matches insns and substitutes new insns.
The `peephole2' pass is run after register allocation but before
scheduling, which may result in much better code for targets that do
scheduling.
* Menu:
* define_peephole:: RTL to Text Peephole Optimizers
* define_peephole2:: RTL to RTL Peephole Optimizers
File: gccint.info, Node: define_peephole, Next: define_peephole2, Up: Peephole Definitions
16.18.1 RTL to Text Peephole Optimizers
---------------------------------------
A definition looks like this:
(define_peephole
[INSN-PATTERN-1
INSN-PATTERN-2
...]
"CONDITION"
"TEMPLATE"
"OPTIONAL-INSN-ATTRIBUTES")
The last string operand may be omitted if you are not using any
machine-specific information in this machine description. If present,
it must obey the same rules as in a `define_insn'.
In this skeleton, INSN-PATTERN-1 and so on are patterns to match
consecutive insns. The optimization applies to a sequence of insns when
INSN-PATTERN-1 matches the first one, INSN-PATTERN-2 matches the next,
and so on.
Each of the insns matched by a peephole must also match a
`define_insn'. Peepholes are checked only at the last stage just
before code generation, and only optionally. Therefore, any insn which
would match a peephole but no `define_insn' will cause a crash in code
generation in an unoptimized compilation, or at various optimization
stages.
The operands of the insns are matched with `match_operands',
`match_operator', and `match_dup', as usual. What is not usual is that
the operand numbers apply to all the insn patterns in the definition.
So, you can check for identical operands in two insns by using
`match_operand' in one insn and `match_dup' in the other.
The operand constraints used in `match_operand' patterns do not have
any direct effect on the applicability of the peephole, but they will
be validated afterward, so make sure your constraints are general enough
to apply whenever the peephole matches. If the peephole matches but
the constraints are not satisfied, the compiler will crash.
It is safe to omit constraints in all the operands of the peephole; or
you can write constraints which serve as a double-check on the criteria
previously tested.
Once a sequence of insns matches the patterns, the CONDITION is
checked. This is a C expression which makes the final decision whether
to perform the optimization (we do so if the expression is nonzero). If
CONDITION is omitted (in other words, the string is empty) then the
optimization is applied to every sequence of insns that matches the
patterns.
The defined peephole optimizations are applied after register
allocation is complete. Therefore, the peephole definition can check
which operands have ended up in which kinds of registers, just by
looking at the operands.
The way to refer to the operands in CONDITION is to write
`operands[I]' for operand number I (as matched by `(match_operand I
...)'). Use the variable `insn' to refer to the last of the insns
being matched; use `prev_active_insn' to find the preceding insns.
When optimizing computations with intermediate results, you can use
CONDITION to match only when the intermediate results are not used
elsewhere. Use the C expression `dead_or_set_p (INSN, OP)', where INSN
is the insn in which you expect the value to be used for the last time
(from the value of `insn', together with use of `prev_nonnote_insn'),
and OP is the intermediate value (from `operands[I]').
Applying the optimization means replacing the sequence of insns with
one new insn. The TEMPLATE controls ultimate output of assembler code
for this combined insn. It works exactly like the template of a
`define_insn'. Operand numbers in this template are the same ones used
in matching the original sequence of insns.
The result of a defined peephole optimizer does not need to match any
of the insn patterns in the machine description; it does not even have
an opportunity to match them. The peephole optimizer definition itself
serves as the insn pattern to control how the insn is output.
Defined peephole optimizers are run as assembler code is being output,
so the insns they produce are never combined or rearranged in any way.
Here is an example, taken from the 68000 machine description:
(define_peephole
[(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
(set (match_operand:DF 0 "register_operand" "=f")
(match_operand:DF 1 "register_operand" "ad"))]
"FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
{
rtx xoperands[2];
xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
#ifdef MOTOROLA
output_asm_insn ("move.l %1,(sp)", xoperands);
output_asm_insn ("move.l %1,-(sp)", operands);
return "fmove.d (sp)+,%0";
#else
output_asm_insn ("movel %1,sp@", xoperands);
output_asm_insn ("movel %1,sp@-", operands);
return "fmoved sp@+,%0";
#endif
})
The effect of this optimization is to change
jbsr _foobar
addql #4,sp
movel d1,sp@-
movel d0,sp@-
fmoved sp@+,fp0
into
jbsr _foobar
movel d1,sp@
movel d0,sp@-
fmoved sp@+,fp0
INSN-PATTERN-1 and so on look _almost_ like the second operand of
`define_insn'. There is one important difference: the second operand
of `define_insn' consists of one or more RTX's enclosed in square
brackets. Usually, there is only one: then the same action can be
written as an element of a `define_peephole'. But when there are
multiple actions in a `define_insn', they are implicitly enclosed in a
`parallel'. Then you must explicitly write the `parallel', and the
square brackets within it, in the `define_peephole'. Thus, if an insn
pattern looks like this,
(define_insn "divmodsi4"
[(set (match_operand:SI 0 "general_operand" "=d")
(div:SI (match_operand:SI 1 "general_operand" "0")
(match_operand:SI 2 "general_operand" "dmsK")))
(set (match_operand:SI 3 "general_operand" "=d")
(mod:SI (match_dup 1) (match_dup 2)))]
"TARGET_68020"
"divsl%.l %2,%3:%0")
then the way to mention this insn in a peephole is as follows:
(define_peephole
[...
(parallel
[(set (match_operand:SI 0 "general_operand" "=d")
(div:SI (match_operand:SI 1 "general_operand" "0")
(match_operand:SI 2 "general_operand" "dmsK")))
(set (match_operand:SI 3 "general_operand" "=d")
(mod:SI (match_dup 1) (match_dup 2)))])
...]
...)
File: gccint.info, Node: define_peephole2, Prev: define_peephole, Up: Peephole Definitions
16.18.2 RTL to RTL Peephole Optimizers
--------------------------------------
The `define_peephole2' definition tells the compiler how to substitute
one sequence of instructions for another sequence, what additional
scratch registers may be needed and what their lifetimes must be.
(define_peephole2
[INSN-PATTERN-1
INSN-PATTERN-2
...]
"CONDITION"
[NEW-INSN-PATTERN-1
NEW-INSN-PATTERN-2
...]
"PREPARATION-STATEMENTS")
The definition is almost identical to `define_split' (*note Insn
Splitting::) except that the pattern to match is not a single
instruction, but a sequence of instructions.
It is possible to request additional scratch registers for use in the
output template. If appropriate registers are not free, the pattern
will simply not match.
Scratch registers are requested with a `match_scratch' pattern at the
top level of the input pattern. The allocated register (initially) will
be dead at the point requested within the original sequence. If the
scratch is used at more than a single point, a `match_dup' pattern at
the top level of the input pattern marks the last position in the input
sequence at which the register must be available.
Here is an example from the IA-32 machine description:
(define_peephole2
[(match_scratch:SI 2 "r")
(parallel [(set (match_operand:SI 0 "register_operand" "")
(match_operator:SI 3 "arith_or_logical_operator"
[(match_dup 0)
(match_operand:SI 1 "memory_operand" "")]))
(clobber (reg:CC 17))])]
"! optimize_size && ! TARGET_READ_MODIFY"
[(set (match_dup 2) (match_dup 1))
(parallel [(set (match_dup 0)
(match_op_dup 3 [(match_dup 0) (match_dup 2)]))
(clobber (reg:CC 17))])]
"")
This pattern tries to split a load from its use in the hopes that we'll
be able to schedule around the memory load latency. It allocates a
single `SImode' register of class `GENERAL_REGS' (`"r"') that needs to
be live only at the point just before the arithmetic.
A real example requiring extended scratch lifetimes is harder to come
by, so here's a silly made-up example:
(define_peephole2
[(match_scratch:SI 4 "r")
(set (match_operand:SI 0 "" "") (match_operand:SI 1 "" ""))
(set (match_operand:SI 2 "" "") (match_dup 1))
(match_dup 4)
(set (match_operand:SI 3 "" "") (match_dup 1))]
"/* determine 1 does not overlap 0 and 2 */"
[(set (match_dup 4) (match_dup 1))
(set (match_dup 0) (match_dup 4))
(set (match_dup 2) (match_dup 4))]
(set (match_dup 3) (match_dup 4))]
"")
If we had not added the `(match_dup 4)' in the middle of the input
sequence, it might have been the case that the register we chose at the
beginning of the sequence is killed by the first or second `set'.
File: gccint.info, Node: Insn Attributes, Next: Conditional Execution, Prev: Peephole Definitions, Up: Machine Desc
16.19 Instruction Attributes
============================
In addition to describing the instruction supported by the target
machine, the `md' file also defines a group of "attributes" and a set of
values for each. Every generated insn is assigned a value for each
attribute. One possible attribute would be the effect that the insn
has on the machine's condition code. This attribute can then be used
by `NOTICE_UPDATE_CC' to track the condition codes.
* Menu:
* Defining Attributes:: Specifying attributes and their values.
* Expressions:: Valid expressions for attribute values.
* Tagging Insns:: Assigning attribute values to insns.
* Attr Example:: An example of assigning attributes.
* Insn Lengths:: Computing the length of insns.
* Constant Attributes:: Defining attributes that are constant.
* Delay Slots:: Defining delay slots required for a machine.
* Processor pipeline description:: Specifying information for insn scheduling.
File: gccint.info, Node: Defining Attributes, Next: Expressions, Up: Insn Attributes
16.19.1 Defining Attributes and their Values
--------------------------------------------
The `define_attr' expression is used to define each attribute required
by the target machine. It looks like:
(define_attr NAME LIST-OF-VALUES DEFAULT)
NAME is a string specifying the name of the attribute being defined.
LIST-OF-VALUES is either a string that specifies a comma-separated
list of values that can be assigned to the attribute, or a null string
to indicate that the attribute takes numeric values.
DEFAULT is an attribute expression that gives the value of this
attribute for insns that match patterns whose definition does not
include an explicit value for this attribute. *Note Attr Example::,
for more information on the handling of defaults. *Note Constant
Attributes::, for information on attributes that do not depend on any
particular insn.
For each defined attribute, a number of definitions are written to the
`insn-attr.h' file. For cases where an explicit set of values is
specified for an attribute, the following are defined:
* A `#define' is written for the symbol `HAVE_ATTR_NAME'.
* An enumerated class is defined for `attr_NAME' with elements of
the form `UPPER-NAME_UPPER-VALUE' where the attribute name and
value are first converted to uppercase.
* A function `get_attr_NAME' is defined that is passed an insn and
returns the attribute value for that insn.
For example, if the following is present in the `md' file:
(define_attr "type" "branch,fp,load,store,arith" ...)
the following lines will be written to the file `insn-attr.h'.
#define HAVE_ATTR_type
enum attr_type {TYPE_BRANCH, TYPE_FP, TYPE_LOAD,
TYPE_STORE, TYPE_ARITH};
extern enum attr_type get_attr_type ();
If the attribute takes numeric values, no `enum' type will be defined
and the function to obtain the attribute's value will return `int'.
There are attributes which are tied to a specific meaning. These
attributes are not free to use for other purposes:
`length'
The `length' attribute is used to calculate the length of emitted
code chunks. This is especially important when verifying branch
distances. *Note Insn Lengths::.
`enabled'
The `enabled' attribute can be defined to prevent certain
alternatives of an insn definition from being used during code
generation. *Note Disable Insn Alternatives::.
Another way of defining an attribute is to use:
(define_enum_attr "ATTR" "ENUM" DEFAULT)
This works in just the same way as `define_attr', except that the list
of values is taken from a separate enumeration called ENUM (*note
define_enum::). This form allows you to use the same list of values
for several attributes without having to repeat the list each time.
For example:
(define_enum "processor" [
model_a
model_b
...
])
(define_enum_attr "arch" "processor"
(const (symbol_ref "target_arch")))
(define_enum_attr "tune" "processor"
(const (symbol_ref "target_tune")))
defines the same attributes as:
(define_attr "arch" "model_a,model_b,..."
(const (symbol_ref "target_arch")))
(define_attr "tune" "model_a,model_b,..."
(const (symbol_ref "target_tune")))
but without duplicating the processor list. The second example
defines two separate C enums (`attr_arch' and `attr_tune') whereas the
first defines a single C enum (`processor').
File: gccint.info, Node: Expressions, Next: Tagging Insns, Prev: Defining Attributes, Up: Insn Attributes
16.19.2 Attribute Expressions
-----------------------------
RTL expressions used to define attributes use the codes described above
plus a few specific to attribute definitions, to be discussed below.
Attribute value expressions must have one of the following forms:
`(const_int I)'
The integer I specifies the value of a numeric attribute. I must
be non-negative.
The value of a numeric attribute can be specified either with a
`const_int', or as an integer represented as a string in
`const_string', `eq_attr' (see below), `attr', `symbol_ref',
simple arithmetic expressions, and `set_attr' overrides on
specific instructions (*note Tagging Insns::).
`(const_string VALUE)'
The string VALUE specifies a constant attribute value. If VALUE
is specified as `"*"', it means that the default value of the
attribute is to be used for the insn containing this expression.
`"*"' obviously cannot be used in the DEFAULT expression of a
`define_attr'.
If the attribute whose value is being specified is numeric, VALUE
must be a string containing a non-negative integer (normally
`const_int' would be used in this case). Otherwise, it must
contain one of the valid values for the attribute.
`(if_then_else TEST TRUE-VALUE FALSE-VALUE)'
TEST specifies an attribute test, whose format is defined below.
The value of this expression is TRUE-VALUE if TEST is true,
otherwise it is FALSE-VALUE.
`(cond [TEST1 VALUE1 ...] DEFAULT)'
The first operand of this expression is a vector containing an even
number of expressions and consisting of pairs of TEST and VALUE
expressions. The value of the `cond' expression is that of the
VALUE corresponding to the first true TEST expression. If none of
the TEST expressions are true, the value of the `cond' expression
is that of the DEFAULT expression.
TEST expressions can have one of the following forms:
`(const_int I)'
This test is true if I is nonzero and false otherwise.
`(not TEST)'
`(ior TEST1 TEST2)'
`(and TEST1 TEST2)'
These tests are true if the indicated logical function is true.
`(match_operand:M N PRED CONSTRAINTS)'
This test is true if operand N of the insn whose attribute value
is being determined has mode M (this part of the test is ignored
if M is `VOIDmode') and the function specified by the string PRED
returns a nonzero value when passed operand N and mode M (this
part of the test is ignored if PRED is the null string).
The CONSTRAINTS operand is ignored and should be the null string.
`(le ARITH1 ARITH2)'
`(leu ARITH1 ARITH2)'
`(lt ARITH1 ARITH2)'
`(ltu ARITH1 ARITH2)'
`(gt ARITH1 ARITH2)'
`(gtu ARITH1 ARITH2)'
`(ge ARITH1 ARITH2)'
`(geu ARITH1 ARITH2)'
`(ne ARITH1 ARITH2)'
`(eq ARITH1 ARITH2)'
These tests are true if the indicated comparison of the two
arithmetic expressions is true. Arithmetic expressions are formed
with `plus', `minus', `mult', `div', `mod', `abs', `neg', `and',
`ior', `xor', `not', `ashift', `lshiftrt', and `ashiftrt'
expressions.
`const_int' and `symbol_ref' are always valid terms (*note Insn
Lengths::,for additional forms). `symbol_ref' is a string
denoting a C expression that yields an `int' when evaluated by the
`get_attr_...' routine. It should normally be a global variable.
`(eq_attr NAME VALUE)'
NAME is a string specifying the name of an attribute.
VALUE is a string that is either a valid value for attribute NAME,
a comma-separated list of values, or `!' followed by a value or
list. If VALUE does not begin with a `!', this test is true if
the value of the NAME attribute of the current insn is in the list
specified by VALUE. If VALUE begins with a `!', this test is true
if the attribute's value is _not_ in the specified list.
For example,
(eq_attr "type" "load,store")
is equivalent to
(ior (eq_attr "type" "load") (eq_attr "type" "store"))
If NAME specifies an attribute of `alternative', it refers to the
value of the compiler variable `which_alternative' (*note Output
Statement::) and the values must be small integers. For example,
(eq_attr "alternative" "2,3")
is equivalent to
(ior (eq (symbol_ref "which_alternative") (const_int 2))
(eq (symbol_ref "which_alternative") (const_int 3)))
Note that, for most attributes, an `eq_attr' test is simplified in
cases where the value of the attribute being tested is known for
all insns matching a particular pattern. This is by far the most
common case.
`(attr_flag NAME)'
The value of an `attr_flag' expression is true if the flag
specified by NAME is true for the `insn' currently being scheduled.
NAME is a string specifying one of a fixed set of flags to test.
Test the flags `forward' and `backward' to determine the direction
of a conditional branch. Test the flags `very_likely', `likely',
`very_unlikely', and `unlikely' to determine if a conditional
branch is expected to be taken.
If the `very_likely' flag is true, then the `likely' flag is also
true. Likewise for the `very_unlikely' and `unlikely' flags.
This example describes a conditional branch delay slot which can
be nullified for forward branches that are taken (annul-true) or
for backward branches which are not taken (annul-false).
(define_delay (eq_attr "type" "cbranch")
[(eq_attr "in_branch_delay" "true")
(and (eq_attr "in_branch_delay" "true")
(attr_flag "forward"))
(and (eq_attr "in_branch_delay" "true")
(attr_flag "backward"))])
The `forward' and `backward' flags are false if the current `insn'
being scheduled is not a conditional branch.
The `very_likely' and `likely' flags are true if the `insn' being
scheduled is not a conditional branch. The `very_unlikely' and
`unlikely' flags are false if the `insn' being scheduled is not a
conditional branch.
`attr_flag' is only used during delay slot scheduling and has no
meaning to other passes of the compiler.
`(attr NAME)'
The value of another attribute is returned. This is most useful
for numeric attributes, as `eq_attr' and `attr_flag' produce more
efficient code for non-numeric attributes.
File: gccint.info, Node: Tagging Insns, Next: Attr Example, Prev: Expressions, Up: Insn Attributes
16.19.3 Assigning Attribute Values to Insns
-------------------------------------------
The value assigned to an attribute of an insn is primarily determined by
which pattern is matched by that insn (or which `define_peephole'
generated it). Every `define_insn' and `define_peephole' can have an
optional last argument to specify the values of attributes for matching
insns. The value of any attribute not specified in a particular insn
is set to the default value for that attribute, as specified in its
`define_attr'. Extensive use of default values for attributes permits
the specification of the values for only one or two attributes in the
definition of most insn patterns, as seen in the example in the next
section.
The optional last argument of `define_insn' and `define_peephole' is a
vector of expressions, each of which defines the value for a single
attribute. The most general way of assigning an attribute's value is
to use a `set' expression whose first operand is an `attr' expression
giving the name of the attribute being set. The second operand of the
`set' is an attribute expression (*note Expressions::) giving the value
of the attribute.
When the attribute value depends on the `alternative' attribute (i.e.,
which is the applicable alternative in the constraint of the insn), the
`set_attr_alternative' expression can be used. It allows the
specification of a vector of attribute expressions, one for each
alternative.
When the generality of arbitrary attribute expressions is not required,
the simpler `set_attr' expression can be used, which allows specifying
a string giving either a single attribute value or a list of attribute
values, one for each alternative.
The form of each of the above specifications is shown below. In each
case, NAME is a string specifying the attribute to be set.
`(set_attr NAME VALUE-STRING)'
VALUE-STRING is either a string giving the desired attribute value,
or a string containing a comma-separated list giving the values for
succeeding alternatives. The number of elements must match the
number of alternatives in the constraint of the insn pattern.
Note that it may be useful to specify `*' for some alternative, in
which case the attribute will assume its default value for insns
matching that alternative.
`(set_attr_alternative NAME [VALUE1 VALUE2 ...])'
Depending on the alternative of the insn, the value will be one of
the specified values. This is a shorthand for using a `cond' with
tests on the `alternative' attribute.
`(set (attr NAME) VALUE)'
The first operand of this `set' must be the special RTL expression
`attr', whose sole operand is a string giving the name of the
attribute being set. VALUE is the value of the attribute.
The following shows three different ways of representing the same
attribute value specification:
(set_attr "type" "load,store,arith")
(set_attr_alternative "type"
[(const_string "load") (const_string "store")
(const_string "arith")])
(set (attr "type")
(cond [(eq_attr "alternative" "1") (const_string "load")
(eq_attr "alternative" "2") (const_string "store")]
(const_string "arith")))
The `define_asm_attributes' expression provides a mechanism to specify
the attributes assigned to insns produced from an `asm' statement. It
has the form:
(define_asm_attributes [ATTR-SETS])
where ATTR-SETS is specified the same as for both the `define_insn' and
the `define_peephole' expressions.
These values will typically be the "worst case" attribute values. For
example, they might indicate that the condition code will be clobbered.
A specification for a `length' attribute is handled specially. The
way to compute the length of an `asm' insn is to multiply the length
specified in the expression `define_asm_attributes' by the number of
machine instructions specified in the `asm' statement, determined by
counting the number of semicolons and newlines in the string.
Therefore, the value of the `length' attribute specified in a
`define_asm_attributes' should be the maximum possible length of a
single machine instruction.
File: gccint.info, Node: Attr Example, Next: Insn Lengths, Prev: Tagging Insns, Up: Insn Attributes
16.19.4 Example of Attribute Specifications
-------------------------------------------
The judicious use of defaulting is important in the efficient use of
insn attributes. Typically, insns are divided into "types" and an
attribute, customarily called `type', is used to represent this value.
This attribute is normally used only to define the default value for
other attributes. An example will clarify this usage.
Assume we have a RISC machine with a condition code and in which only
full-word operations are performed in registers. Let us assume that we
can divide all insns into loads, stores, (integer) arithmetic
operations, floating point operations, and branches.
Here we will concern ourselves with determining the effect of an insn
on the condition code and will limit ourselves to the following possible
effects: The condition code can be set unpredictably (clobbered), not
be changed, be set to agree with the results of the operation, or only
changed if the item previously set into the condition code has been
modified.
Here is part of a sample `md' file for such a machine:
(define_attr "type" "load,store,arith,fp,branch" (const_string "arith"))
(define_attr "cc" "clobber,unchanged,set,change0"
(cond [(eq_attr "type" "load")
(const_string "change0")
(eq_attr "type" "store,branch")
(const_string "unchanged")
(eq_attr "type" "arith")
(if_then_else (match_operand:SI 0 "" "")
(const_string "set")
(const_string "clobber"))]
(const_string "clobber")))
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=r,r,m")
(match_operand:SI 1 "general_operand" "r,m,r"))]
""
"@
move %0,%1
load %0,%1
store %0,%1"
[(set_attr "type" "arith,load,store")])
Note that we assume in the above example that arithmetic operations
performed on quantities smaller than a machine word clobber the
condition code since they will set the condition code to a value
corresponding to the full-word result.
File: gccint.info, Node: Insn Lengths, Next: Constant Attributes, Prev: Attr Example, Up: Insn Attributes
16.19.5 Computing the Length of an Insn
---------------------------------------
For many machines, multiple types of branch instructions are provided,
each for different length branch displacements. In most cases, the
assembler will choose the correct instruction to use. However, when
the assembler cannot do so, GCC can when a special attribute, the
`length' attribute, is defined. This attribute must be defined to have
numeric values by specifying a null string in its `define_attr'.
In the case of the `length' attribute, two additional forms of
arithmetic terms are allowed in test expressions:
`(match_dup N)'
This refers to the address of operand N of the current insn, which
must be a `label_ref'.
`(pc)'
This refers to the address of the _current_ insn. It might have
been more consistent with other usage to make this the address of
the _next_ insn but this would be confusing because the length of
the current insn is to be computed.
For normal insns, the length will be determined by value of the
`length' attribute. In the case of `addr_vec' and `addr_diff_vec' insn
patterns, the length is computed as the number of vectors multiplied by
the size of each vector.
Lengths are measured in addressable storage units (bytes).
The following macros can be used to refine the length computation:
`ADJUST_INSN_LENGTH (INSN, LENGTH)'
If defined, modifies the length assigned to instruction INSN as a
function of the context in which it is used. LENGTH is an lvalue
that contains the initially computed length of the insn and should
be updated with the correct length of the insn.
This macro will normally not be required. A case in which it is
required is the ROMP. On this machine, the size of an `addr_vec'
insn must be increased by two to compensate for the fact that
alignment may be required.
The routine that returns `get_attr_length' (the value of the `length'
attribute) can be used by the output routine to determine the form of
the branch instruction to be written, as the example below illustrates.
As an example of the specification of variable-length branches,
consider the IBM 360. If we adopt the convention that a register will
be set to the starting address of a function, we can jump to labels
within 4k of the start using a four-byte instruction. Otherwise, we
need a six-byte sequence to load the address from memory and then
branch to it.
On such a machine, a pattern for a branch instruction might be
specified as follows:
(define_insn "jump"
[(set (pc)
(label_ref (match_operand 0 "" "")))]
""
{
return (get_attr_length (insn) == 4
? "b %l0" : "l r15,=a(%l0); br r15");
}
[(set (attr "length")
(if_then_else (lt (match_dup 0) (const_int 4096))
(const_int 4)
(const_int 6)))])
File: gccint.info, Node: Constant Attributes, Next: Delay Slots, Prev: Insn Lengths, Up: Insn Attributes
16.19.6 Constant Attributes
---------------------------
A special form of `define_attr', where the expression for the default
value is a `const' expression, indicates an attribute that is constant
for a given run of the compiler. Constant attributes may be used to
specify which variety of processor is used. For example,
(define_attr "cpu" "m88100,m88110,m88000"
(const
(cond [(symbol_ref "TARGET_88100") (const_string "m88100")
(symbol_ref "TARGET_88110") (const_string "m88110")]
(const_string "m88000"))))
(define_attr "memory" "fast,slow"
(const
(if_then_else (symbol_ref "TARGET_FAST_MEM")
(const_string "fast")
(const_string "slow"))))
The routine generated for constant attributes has no parameters as it
does not depend on any particular insn. RTL expressions used to define
the value of a constant attribute may use the `symbol_ref' form, but
may not use either the `match_operand' form or `eq_attr' forms
involving insn attributes.
File: gccint.info, Node: Delay Slots, Next: Processor pipeline description, Prev: Constant Attributes, Up: Insn Attributes
16.19.7 Delay Slot Scheduling
-----------------------------
The insn attribute mechanism can be used to specify the requirements for
delay slots, if any, on a target machine. An instruction is said to
require a "delay slot" if some instructions that are physically after
the instruction are executed as if they were located before it.
Classic examples are branch and call instructions, which often execute
the following instruction before the branch or call is performed.
On some machines, conditional branch instructions can optionally
"annul" instructions in the delay slot. This means that the
instruction will not be executed for certain branch outcomes. Both
instructions that annul if the branch is true and instructions that
annul if the branch is false are supported.
Delay slot scheduling differs from instruction scheduling in that
determining whether an instruction needs a delay slot is dependent only
on the type of instruction being generated, not on data flow between the
instructions. See the next section for a discussion of data-dependent
instruction scheduling.
The requirement of an insn needing one or more delay slots is indicated
via the `define_delay' expression. It has the following form:
(define_delay TEST
[DELAY-1 ANNUL-TRUE-1 ANNUL-FALSE-1
DELAY-2 ANNUL-TRUE-2 ANNUL-FALSE-2
...])
TEST is an attribute test that indicates whether this `define_delay'
applies to a particular insn. If so, the number of required delay
slots is determined by the length of the vector specified as the second
argument. An insn placed in delay slot N must satisfy attribute test
DELAY-N. ANNUL-TRUE-N is an attribute test that specifies which insns
may be annulled if the branch is true. Similarly, ANNUL-FALSE-N
specifies which insns in the delay slot may be annulled if the branch
is false. If annulling is not supported for that delay slot, `(nil)'
should be coded.
For example, in the common case where branch and call insns require a
single delay slot, which may contain any insn other than a branch or
call, the following would be placed in the `md' file:
(define_delay (eq_attr "type" "branch,call")
[(eq_attr "type" "!branch,call") (nil) (nil)])
Multiple `define_delay' expressions may be specified. In this case,
each such expression specifies different delay slot requirements and
there must be no insn for which tests in two `define_delay' expressions
are both true.
For example, if we have a machine that requires one delay slot for
branches but two for calls, no delay slot can contain a branch or call
insn, and any valid insn in the delay slot for the branch can be
annulled if the branch is true, we might represent this as follows:
(define_delay (eq_attr "type" "branch")
[(eq_attr "type" "!branch,call")
(eq_attr "type" "!branch,call")
(nil)])
(define_delay (eq_attr "type" "call")
[(eq_attr "type" "!branch,call") (nil) (nil)
(eq_attr "type" "!branch,call") (nil) (nil)])
File: gccint.info, Node: Processor pipeline description, Prev: Delay Slots, Up: Insn Attributes
16.19.8 Specifying processor pipeline description
-------------------------------------------------
To achieve better performance, most modern processors (super-pipelined,
superscalar RISC, and VLIW processors) have many "functional units" on
which several instructions can be executed simultaneously. An
instruction starts execution if its issue conditions are satisfied. If
not, the instruction is stalled until its conditions are satisfied.
Such "interlock (pipeline) delay" causes interruption of the fetching
of successor instructions (or demands nop instructions, e.g. for some
MIPS processors).
There are two major kinds of interlock delays in modern processors.
The first one is a data dependence delay determining "instruction
latency time". The instruction execution is not started until all
source data have been evaluated by prior instructions (there are more
complex cases when the instruction execution starts even when the data
are not available but will be ready in given time after the instruction
execution start). Taking the data dependence delays into account is
simple. The data dependence (true, output, and anti-dependence) delay
between two instructions is given by a constant. In most cases this
approach is adequate. The second kind of interlock delays is a
reservation delay. The reservation delay means that two instructions
under execution will be in need of shared processors resources, i.e.
buses, internal registers, and/or functional units, which are reserved
for some time. Taking this kind of delay into account is complex
especially for modern RISC processors.
The task of exploiting more processor parallelism is solved by an
instruction scheduler. For a better solution to this problem, the
instruction scheduler has to have an adequate description of the
processor parallelism (or "pipeline description"). GCC machine
descriptions describe processor parallelism and functional unit
reservations for groups of instructions with the aid of "regular
expressions".
The GCC instruction scheduler uses a "pipeline hazard recognizer" to
figure out the possibility of the instruction issue by the processor on
a given simulated processor cycle. The pipeline hazard recognizer is
automatically generated from the processor pipeline description. The
pipeline hazard recognizer generated from the machine description is
based on a deterministic finite state automaton (DFA): the instruction
issue is possible if there is a transition from one automaton state to
another one. This algorithm is very fast, and furthermore, its speed
is not dependent on processor complexity(1).
The rest of this section describes the directives that constitute an
automaton-based processor pipeline description. The order of these
constructions within the machine description file is not important.
The following optional construction describes names of automata
generated and used for the pipeline hazards recognition. Sometimes the
generated finite state automaton used by the pipeline hazard recognizer
is large. If we use more than one automaton and bind functional units
to the automata, the total size of the automata is usually less than
the size of the single automaton. If there is no one such
construction, only one finite state automaton is generated.
(define_automaton AUTOMATA-NAMES)
AUTOMATA-NAMES is a string giving names of the automata. The names
are separated by commas. All the automata should have unique names.
The automaton name is used in the constructions `define_cpu_unit' and
`define_query_cpu_unit'.
Each processor functional unit used in the description of instruction
reservations should be described by the following construction.
(define_cpu_unit UNIT-NAMES [AUTOMATON-NAME])
UNIT-NAMES is a string giving the names of the functional units
separated by commas. Don't use name `nothing', it is reserved for
other goals.
AUTOMATON-NAME is a string giving the name of the automaton with which
the unit is bound. The automaton should be described in construction
`define_automaton'. You should give "automaton-name", if there is a
defined automaton.
The assignment of units to automata are constrained by the uses of the
units in insn reservations. The most important constraint is: if a
unit reservation is present on a particular cycle of an alternative for
an insn reservation, then some unit from the same automaton must be
present on the same cycle for the other alternatives of the insn
reservation. The rest of the constraints are mentioned in the
description of the subsequent constructions.
The following construction describes CPU functional units analogously
to `define_cpu_unit'. The reservation of such units can be queried for
an automaton state. The instruction scheduler never queries
reservation of functional units for given automaton state. So as a
rule, you don't need this construction. This construction could be
used for future code generation goals (e.g. to generate VLIW insn
templates).
(define_query_cpu_unit UNIT-NAMES [AUTOMATON-NAME])
UNIT-NAMES is a string giving names of the functional units separated
by commas.
AUTOMATON-NAME is a string giving the name of the automaton with which
the unit is bound.
The following construction is the major one to describe pipeline
characteristics of an instruction.
(define_insn_reservation INSN-NAME DEFAULT_LATENCY
CONDITION REGEXP)
DEFAULT_LATENCY is a number giving latency time of the instruction.
There is an important difference between the old description and the
automaton based pipeline description. The latency time is used for all
dependencies when we use the old description. In the automaton based
pipeline description, the given latency time is only used for true
dependencies. The cost of anti-dependencies is always zero and the
cost of output dependencies is the difference between latency times of
the producing and consuming insns (if the difference is negative, the
cost is considered to be zero). You can always change the default
costs for any description by using the target hook
`TARGET_SCHED_ADJUST_COST' (*note Scheduling::).
INSN-NAME is a string giving the internal name of the insn. The
internal names are used in constructions `define_bypass' and in the
automaton description file generated for debugging. The internal name
has nothing in common with the names in `define_insn'. It is a good
practice to use insn classes described in the processor manual.
CONDITION defines what RTL insns are described by this construction.
You should remember that you will be in trouble if CONDITION for two or
more different `define_insn_reservation' constructions is TRUE for an
insn. In this case what reservation will be used for the insn is not
defined. Such cases are not checked during generation of the pipeline
hazards recognizer because in general recognizing that two conditions
may have the same value is quite difficult (especially if the conditions
contain `symbol_ref'). It is also not checked during the pipeline
hazard recognizer work because it would slow down the recognizer
considerably.
REGEXP is a string describing the reservation of the cpu's functional
units by the instruction. The reservations are described by a regular
expression according to the following syntax:
regexp = regexp "," oneof
| oneof
oneof = oneof "|" allof
| allof
allof = allof "+" repeat
| repeat
repeat = element "*" number
| element
element = cpu_function_unit_name
| reservation_name
| result_name
| "nothing"
| "(" regexp ")"
* `,' is used for describing the start of the next cycle in the
reservation.
* `|' is used for describing a reservation described by the first
regular expression *or* a reservation described by the second
regular expression *or* etc.
* `+' is used for describing a reservation described by the first
regular expression *and* a reservation described by the second
regular expression *and* etc.
* `*' is used for convenience and simply means a sequence in which
the regular expression are repeated NUMBER times with cycle
advancing (see `,').
* `cpu_function_unit_name' denotes reservation of the named
functional unit.
* `reservation_name' -- see description of construction
`define_reservation'.
* `nothing' denotes no unit reservations.
Sometimes unit reservations for different insns contain common parts.
In such case, you can simplify the pipeline description by describing
the common part by the following construction
(define_reservation RESERVATION-NAME REGEXP)
RESERVATION-NAME is a string giving name of REGEXP. Functional unit
names and reservation names are in the same name space. So the
reservation names should be different from the functional unit names
and can not be the reserved name `nothing'.
The following construction is used to describe exceptions in the
latency time for given instruction pair. This is so called bypasses.
(define_bypass NUMBER OUT_INSN_NAMES IN_INSN_NAMES
[GUARD])
NUMBER defines when the result generated by the instructions given in
string OUT_INSN_NAMES will be ready for the instructions given in
string IN_INSN_NAMES. The instructions in the string are separated by
commas.
GUARD is an optional string giving the name of a C function which
defines an additional guard for the bypass. The function will get the
two insns as parameters. If the function returns zero the bypass will
be ignored for this case. The additional guard is necessary to
recognize complicated bypasses, e.g. when the consumer is only an
address of insn `store' (not a stored value).
If there are more one bypass with the same output and input insns, the
chosen bypass is the first bypass with a guard in description whose
guard function returns nonzero. If there is no such bypass, then
bypass without the guard function is chosen.
The following five constructions are usually used to describe VLIW
processors, or more precisely, to describe a placement of small
instructions into VLIW instruction slots. They can be used for RISC
processors, too.
(exclusion_set UNIT-NAMES UNIT-NAMES)
(presence_set UNIT-NAMES PATTERNS)
(final_presence_set UNIT-NAMES PATTERNS)
(absence_set UNIT-NAMES PATTERNS)
(final_absence_set UNIT-NAMES PATTERNS)
UNIT-NAMES is a string giving names of functional units separated by
commas.
PATTERNS is a string giving patterns of functional units separated by
comma. Currently pattern is one unit or units separated by
white-spaces.
The first construction (`exclusion_set') means that each functional
unit in the first string can not be reserved simultaneously with a unit
whose name is in the second string and vice versa. For example, the
construction is useful for describing processors (e.g. some SPARC
processors) with a fully pipelined floating point functional unit which
can execute simultaneously only single floating point insns or only
double floating point insns.
The second construction (`presence_set') means that each functional
unit in the first string can not be reserved unless at least one of
pattern of units whose names are in the second string is reserved.
This is an asymmetric relation. For example, it is useful for
description that VLIW `slot1' is reserved after `slot0' reservation.
We could describe it by the following construction
(presence_set "slot1" "slot0")
Or `slot1' is reserved only after `slot0' and unit `b0' reservation.
In this case we could write
(presence_set "slot1" "slot0 b0")
The third construction (`final_presence_set') is analogous to
`presence_set'. The difference between them is when checking is done.
When an instruction is issued in given automaton state reflecting all
current and planned unit reservations, the automaton state is changed.
The first state is a source state, the second one is a result state.
Checking for `presence_set' is done on the source state reservation,
checking for `final_presence_set' is done on the result reservation.
This construction is useful to describe a reservation which is actually
two subsequent reservations. For example, if we use
(presence_set "slot1" "slot0")
the following insn will be never issued (because `slot1' requires
`slot0' which is absent in the source state).
(define_reservation "insn_and_nop" "slot0 + slot1")
but it can be issued if we use analogous `final_presence_set'.
The forth construction (`absence_set') means that each functional unit
in the first string can be reserved only if each pattern of units whose
names are in the second string is not reserved. This is an asymmetric
relation (actually `exclusion_set' is analogous to this one but it is
symmetric). For example it might be useful in a VLIW description to
say that `slot0' cannot be reserved after either `slot1' or `slot2'
have been reserved. This can be described as:
(absence_set "slot0" "slot1, slot2")
Or `slot2' can not be reserved if `slot0' and unit `b0' are reserved
or `slot1' and unit `b1' are reserved. In this case we could write
(absence_set "slot2" "slot0 b0, slot1 b1")
All functional units mentioned in a set should belong to the same
automaton.
The last construction (`final_absence_set') is analogous to
`absence_set' but checking is done on the result (state) reservation.
See comments for `final_presence_set'.
You can control the generator of the pipeline hazard recognizer with
the following construction.
(automata_option OPTIONS)
OPTIONS is a string giving options which affect the generated code.
Currently there are the following options:
* "no-minimization" makes no minimization of the automaton. This is
only worth to do when we are debugging the description and need to
look more accurately at reservations of states.
* "time" means printing time statistics about the generation of
automata.
* "stats" means printing statistics about the generated automata
such as the number of DFA states, NDFA states and arcs.
* "v" means a generation of the file describing the result automata.
The file has suffix `.dfa' and can be used for the description
verification and debugging.
* "w" means a generation of warning instead of error for
non-critical errors.
* "ndfa" makes nondeterministic finite state automata. This affects
the treatment of operator `|' in the regular expressions. The
usual treatment of the operator is to try the first alternative
and, if the reservation is not possible, the second alternative.
The nondeterministic treatment means trying all alternatives, some
of them may be rejected by reservations in the subsequent insns.
* "progress" means output of a progress bar showing how many states
were generated so far for automaton being processed. This is
useful during debugging a DFA description. If you see too many
generated states, you could interrupt the generator of the pipeline
hazard recognizer and try to figure out a reason for generation of
the huge automaton.
As an example, consider a superscalar RISC machine which can issue
three insns (two integer insns and one floating point insn) on the
cycle but can finish only two insns. To describe this, we define the
following functional units.
(define_cpu_unit "i0_pipeline, i1_pipeline, f_pipeline")
(define_cpu_unit "port0, port1")
All simple integer insns can be executed in any integer pipeline and
their result is ready in two cycles. The simple integer insns are
issued into the first pipeline unless it is reserved, otherwise they
are issued into the second pipeline. Integer division and
multiplication insns can be executed only in the second integer
pipeline and their results are ready correspondingly in 8 and 4 cycles.
The integer division is not pipelined, i.e. the subsequent integer
division insn can not be issued until the current division insn
finished. Floating point insns are fully pipelined and their results
are ready in 3 cycles. Where the result of a floating point insn is
used by an integer insn, an additional delay of one cycle is incurred.
To describe all of this we could specify
(define_cpu_unit "div")
(define_insn_reservation "simple" 2 (eq_attr "type" "int")
"(i0_pipeline | i1_pipeline), (port0 | port1)")
(define_insn_reservation "mult" 4 (eq_attr "type" "mult")
"i1_pipeline, nothing*2, (port0 | port1)")
(define_insn_reservation "div" 8 (eq_attr "type" "div")
"i1_pipeline, div*7, div + (port0 | port1)")
(define_insn_reservation "float" 3 (eq_attr "type" "float")
"f_pipeline, nothing, (port0 | port1))
(define_bypass 4 "float" "simple,mult,div")
To simplify the description we could describe the following reservation
(define_reservation "finish" "port0|port1")
and use it in all `define_insn_reservation' as in the following
construction
(define_insn_reservation "simple" 2 (eq_attr "type" "int")
"(i0_pipeline | i1_pipeline), finish")
---------- Footnotes ----------
(1) However, the size of the automaton depends on processor
complexity. To limit this effect, machine descriptions can split
orthogonal parts of the machine description among several automata: but
then, since each of these must be stepped independently, this does
cause a small decrease in the algorithm's performance.
File: gccint.info, Node: Conditional Execution, Next: Constant Definitions, Prev: Insn Attributes, Up: Machine Desc
16.20 Conditional Execution
===========================
A number of architectures provide for some form of conditional
execution, or predication. The hallmark of this feature is the ability
to nullify most of the instructions in the instruction set. When the
instruction set is large and not entirely symmetric, it can be quite
tedious to describe these forms directly in the `.md' file. An
alternative is the `define_cond_exec' template.
(define_cond_exec
[PREDICATE-PATTERN]
"CONDITION"
"OUTPUT-TEMPLATE")
PREDICATE-PATTERN is the condition that must be true for the insn to
be executed at runtime and should match a relational operator. One can
use `match_operator' to match several relational operators at once.
Any `match_operand' operands must have no more than one alternative.
CONDITION is a C expression that must be true for the generated
pattern to match.
OUTPUT-TEMPLATE is a string similar to the `define_insn' output
template (*note Output Template::), except that the `*' and `@' special
cases do not apply. This is only useful if the assembly text for the
predicate is a simple prefix to the main insn. In order to handle the
general case, there is a global variable `current_insn_predicate' that
will contain the entire predicate if the current insn is predicated,
and will otherwise be `NULL'.
When `define_cond_exec' is used, an implicit reference to the
`predicable' instruction attribute is made. *Note Insn Attributes::.
This attribute must be boolean (i.e. have exactly two elements in its
LIST-OF-VALUES). Further, it must not be used with complex
expressions. That is, the default and all uses in the insns must be a
simple constant, not dependent on the alternative or anything else.
For each `define_insn' for which the `predicable' attribute is true, a
new `define_insn' pattern will be generated that matches a predicated
version of the instruction. For example,
(define_insn "addsi"
[(set (match_operand:SI 0 "register_operand" "r")
(plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")))]
"TEST1"
"add %2,%1,%0")
(define_cond_exec
[(ne (match_operand:CC 0 "register_operand" "c")
(const_int 0))]
"TEST2"
"(%0)")
generates a new pattern
(define_insn ""
[(cond_exec
(ne (match_operand:CC 3 "register_operand" "c") (const_int 0))
(set (match_operand:SI 0 "register_operand" "r")
(plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r"))))]
"(TEST2) && (TEST1)"
"(%3) add %2,%1,%0")
File: gccint.info, Node: Constant Definitions, Next: Iterators, Prev: Conditional Execution, Up: Machine Desc
16.21 Constant Definitions
==========================
Using literal constants inside instruction patterns reduces legibility
and can be a maintenance problem.
To overcome this problem, you may use the `define_constants'
expression. It contains a vector of name-value pairs. From that point
on, wherever any of the names appears in the MD file, it is as if the
corresponding value had been written instead. You may use
`define_constants' multiple times; each appearance adds more constants
to the table. It is an error to redefine a constant with a different
value.
To come back to the a29k load multiple example, instead of
(define_insn ""
[(match_parallel 0 "load_multiple_operation"
[(set (match_operand:SI 1 "gpc_reg_operand" "=r")
(match_operand:SI 2 "memory_operand" "m"))
(use (reg:SI 179))
(clobber (reg:SI 179))])]
""
"loadm 0,0,%1,%2")
You could write:
(define_constants [
(R_BP 177)
(R_FC 178)
(R_CR 179)
(R_Q 180)
])
(define_insn ""
[(match_parallel 0 "load_multiple_operation"
[(set (match_operand:SI 1 "gpc_reg_operand" "=r")
(match_operand:SI 2 "memory_operand" "m"))
(use (reg:SI R_CR))
(clobber (reg:SI R_CR))])]
""
"loadm 0,0,%1,%2")
The constants that are defined with a define_constant are also output
in the insn-codes.h header file as #defines.
You can also use the machine description file to define enumerations.
Like the constants defined by `define_constant', these enumerations are
visible to both the machine description file and the main C code.
The syntax is as follows:
(define_c_enum "NAME" [
VALUE0
VALUE1
...
VALUEN
])
This definition causes the equivalent of the following C code to appear
in `insn-constants.h':
enum NAME {
VALUE0 = 0,
VALUE1 = 1,
...
VALUEN = N
};
#define NUM_CNAME_VALUES (N + 1)
where CNAME is the capitalized form of NAME. It also makes each
VALUEI available in the machine description file, just as if it had
been declared with:
(define_constants [(VALUEI I)])
Each VALUEI is usually an upper-case identifier and usually begins
with CNAME.
You can split the enumeration definition into as many statements as
you like. The above example is directly equivalent to:
(define_c_enum "NAME" [VALUE0])
(define_c_enum "NAME" [VALUE1])
...
(define_c_enum "NAME" [VALUEN])
Splitting the enumeration helps to improve the modularity of each
individual `.md' file. For example, if a port defines its
synchronization instructions in a separate `sync.md' file, it is
convenient to define all synchronization-specific enumeration values in
`sync.md' rather than in the main `.md' file.
Some enumeration names have special significance to GCC:
`unspecv'
If an enumeration called `unspecv' is defined, GCC will use it
when printing out `unspec_volatile' expressions. For example:
(define_c_enum "unspecv" [
UNSPECV_BLOCKAGE
])
causes GCC to print `(unspec_volatile ... 0)' as:
(unspec_volatile ... UNSPECV_BLOCKAGE)
`unspec'
If an enumeration called `unspec' is defined, GCC will use it when
printing out `unspec' expressions. GCC will also use it when
printing out `unspec_volatile' expressions unless an `unspecv'
enumeration is also defined. You can therefore decide whether to
keep separate enumerations for volatile and non-volatile
expressions or whether to use the same enumeration for both.
Another way of defining an enumeration is to use `define_enum':
(define_enum "NAME" [
VALUE0
VALUE1
...
VALUEN
])
This directive implies:
(define_c_enum "NAME" [
CNAME_CVALUE0
CNAME_CVALUE1
...
CNAME_CVALUEN
])
where CVALUEI is the capitalized form of VALUEI. However, unlike
`define_c_enum', the enumerations defined by `define_enum' can be used
in attribute specifications (*note define_enum_attr::).
File: gccint.info, Node: Iterators, Prev: Constant Definitions, Up: Machine Desc
16.22 Iterators
===============
Ports often need to define similar patterns for more than one machine
mode or for more than one rtx code. GCC provides some simple iterator
facilities to make this process easier.
* Menu:
* Mode Iterators:: Generating variations of patterns for different modes.
* Code Iterators:: Doing the same for codes.
File: gccint.info, Node: Mode Iterators, Next: Code Iterators, Up: Iterators
16.22.1 Mode Iterators
----------------------
Ports often need to define similar patterns for two or more different
modes. For example:
* If a processor has hardware support for both single and double
floating-point arithmetic, the `SFmode' patterns tend to be very
similar to the `DFmode' ones.
* If a port uses `SImode' pointers in one configuration and `DImode'
pointers in another, it will usually have very similar `SImode'
and `DImode' patterns for manipulating pointers.
Mode iterators allow several patterns to be instantiated from one
`.md' file template. They can be used with any type of rtx-based
construct, such as a `define_insn', `define_split', or
`define_peephole2'.
* Menu:
* Defining Mode Iterators:: Defining a new mode iterator.
* Substitutions:: Combining mode iterators with substitutions
* Examples:: Examples
File: gccint.info, Node: Defining Mode Iterators, Next: Substitutions, Up: Mode Iterators
16.22.1.1 Defining Mode Iterators
.................................
The syntax for defining a mode iterator is:
(define_mode_iterator NAME [(MODE1 "COND1") ... (MODEN "CONDN")])
This allows subsequent `.md' file constructs to use the mode suffix
`:NAME'. Every construct that does so will be expanded N times, once
with every use of `:NAME' replaced by `:MODE1', once with every use
replaced by `:MODE2', and so on. In the expansion for a particular
MODEI, every C condition will also require that CONDI be true.
For example:
(define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
defines a new mode suffix `:P'. Every construct that uses `:P' will
be expanded twice, once with every `:P' replaced by `:SI' and once with
every `:P' replaced by `:DI'. The `:SI' version will only apply if
`Pmode == SImode' and the `:DI' version will only apply if `Pmode ==
DImode'.
As with other `.md' conditions, an empty string is treated as "always
true". `(MODE "")' can also be abbreviated to `MODE'. For example:
(define_mode_iterator GPR [SI (DI "TARGET_64BIT")])
means that the `:DI' expansion only applies if `TARGET_64BIT' but that
the `:SI' expansion has no such constraint.
Iterators are applied in the order they are defined. This can be
significant if two iterators are used in a construct that requires
substitutions. *Note Substitutions::.
File: gccint.info, Node: Substitutions, Next: Examples, Prev: Defining Mode Iterators, Up: Mode Iterators
16.22.1.2 Substitution in Mode Iterators
........................................
If an `.md' file construct uses mode iterators, each version of the
construct will often need slightly different strings or modes. For
example:
* When a `define_expand' defines several `addM3' patterns (*note
Standard Names::), each expander will need to use the appropriate
mode name for M.
* When a `define_insn' defines several instruction patterns, each
instruction will often use a different assembler mnemonic.
* When a `define_insn' requires operands with different modes, using
an iterator for one of the operand modes usually requires a
specific mode for the other operand(s).
GCC supports such variations through a system of "mode attributes".
There are two standard attributes: `mode', which is the name of the
mode in lower case, and `MODE', which is the same thing in upper case.
You can define other attributes using:
(define_mode_attr NAME [(MODE1 "VALUE1") ... (MODEN "VALUEN")])
where NAME is the name of the attribute and VALUEI is the value
associated with MODEI.
When GCC replaces some :ITERATOR with :MODE, it will scan each string
and mode in the pattern for sequences of the form `<ITERATOR:ATTR>',
where ATTR is the name of a mode attribute. If the attribute is
defined for MODE, the whole `<...>' sequence will be replaced by the
appropriate attribute value.
For example, suppose an `.md' file has:
(define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
(define_mode_attr load [(SI "lw") (DI "ld")])
If one of the patterns that uses `:P' contains the string
`"<P:load>\t%0,%1"', the `SI' version of that pattern will use
`"lw\t%0,%1"' and the `DI' version will use `"ld\t%0,%1"'.
Here is an example of using an attribute for a mode:
(define_mode_iterator LONG [SI DI])
(define_mode_attr SHORT [(SI "HI") (DI "SI")])
(define_insn ...
(sign_extend:LONG (match_operand:<LONG:SHORT> ...)) ...)
The `ITERATOR:' prefix may be omitted, in which case the substitution
will be attempted for every iterator expansion.
File: gccint.info, Node: Examples, Prev: Substitutions, Up: Mode Iterators
16.22.1.3 Mode Iterator Examples
................................
Here is an example from the MIPS port. It defines the following modes
and attributes (among others):
(define_mode_iterator GPR [SI (DI "TARGET_64BIT")])
(define_mode_attr d [(SI "") (DI "d")])
and uses the following template to define both `subsi3' and `subdi3':
(define_insn "sub<mode>3"
[(set (match_operand:GPR 0 "register_operand" "=d")
(minus:GPR (match_operand:GPR 1 "register_operand" "d")
(match_operand:GPR 2 "register_operand" "d")))]
""
"<d>subu\t%0,%1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "<MODE>")])
This is exactly equivalent to:
(define_insn "subsi3"
[(set (match_operand:SI 0 "register_operand" "=d")
(minus:SI (match_operand:SI 1 "register_operand" "d")
(match_operand:SI 2 "register_operand" "d")))]
""
"subu\t%0,%1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "SI")])
(define_insn "subdi3"
[(set (match_operand:DI 0 "register_operand" "=d")
(minus:DI (match_operand:DI 1 "register_operand" "d")
(match_operand:DI 2 "register_operand" "d")))]
""
"dsubu\t%0,%1,%2"
[(set_attr "type" "arith")
(set_attr "mode" "DI")])
File: gccint.info, Node: Code Iterators, Prev: Mode Iterators, Up: Iterators
16.22.2 Code Iterators
----------------------
Code iterators operate in a similar way to mode iterators. *Note Mode
Iterators::.
The construct:
(define_code_iterator NAME [(CODE1 "COND1") ... (CODEN "CONDN")])
defines a pseudo rtx code NAME that can be instantiated as CODEI if
condition CONDI is true. Each CODEI must have the same rtx format.
*Note RTL Classes::.
As with mode iterators, each pattern that uses NAME will be expanded N
times, once with all uses of NAME replaced by CODE1, once with all uses
replaced by CODE2, and so on. *Note Defining Mode Iterators::.
It is possible to define attributes for codes as well as for modes.
There are two standard code attributes: `code', the name of the code in
lower case, and `CODE', the name of the code in upper case. Other
attributes are defined using:
(define_code_attr NAME [(CODE1 "VALUE1") ... (CODEN "VALUEN")])
Here's an example of code iterators in action, taken from the MIPS
port:
(define_code_iterator any_cond [unordered ordered unlt unge uneq ltgt unle ungt
eq ne gt ge lt le gtu geu ltu leu])
(define_expand "b<code>"
[(set (pc)
(if_then_else (any_cond:CC (cc0)
(const_int 0))
(label_ref (match_operand 0 ""))
(pc)))]
""
{
gen_conditional_branch (operands, <CODE>);
DONE;
})
This is equivalent to:
(define_expand "bunordered"
[(set (pc)
(if_then_else (unordered:CC (cc0)
(const_int 0))
(label_ref (match_operand 0 ""))
(pc)))]
""
{
gen_conditional_branch (operands, UNORDERED);
DONE;
})
(define_expand "bordered"
[(set (pc)
(if_then_else (ordered:CC (cc0)
(const_int 0))
(label_ref (match_operand 0 ""))
(pc)))]
""
{
gen_conditional_branch (operands, ORDERED);
DONE;
})
...
File: gccint.info, Node: Target Macros, Next: Host Config, Prev: Machine Desc, Up: Top
17 Target Description Macros and Functions
******************************************
In addition to the file `MACHINE.md', a machine description includes a
C header file conventionally given the name `MACHINE.h' and a C source
file named `MACHINE.c'. The header file defines numerous macros that
convey the information about the target machine that does not fit into
the scheme of the `.md' file. The file `tm.h' should be a link to
`MACHINE.h'. The header file `config.h' includes `tm.h' and most
compiler source files include `config.h'. The source file defines a
variable `targetm', which is a structure containing pointers to
functions and data relating to the target machine. `MACHINE.c' should
also contain their definitions, if they are not defined elsewhere in
GCC, and other functions called through the macros defined in the `.h'
file.
* Menu:
* Target Structure:: The `targetm' variable.
* Driver:: Controlling how the driver runs the compilation passes.
* Run-time Target:: Defining `-m' options like `-m68000' and `-m68020'.
* Per-Function Data:: Defining data structures for per-function information.
* Storage Layout:: Defining sizes and alignments of data.
* Type Layout:: Defining sizes and properties of basic user data types.
* Registers:: Naming and describing the hardware registers.
* Register Classes:: Defining the classes of hardware registers.
* Old Constraints:: The old way to define machine-specific constraints.
* Stack and Calling:: Defining which way the stack grows and by how much.
* Varargs:: Defining the varargs macros.
* Trampolines:: Code set up at run time to enter a nested function.
* Library Calls:: Controlling how library routines are implicitly called.
* Addressing Modes:: Defining addressing modes valid for memory operands.
* Anchored Addresses:: Defining how `-fsection-anchors' should work.
* Condition Code:: Defining how insns update the condition code.
* Costs:: Defining relative costs of different operations.
* Scheduling:: Adjusting the behavior of the instruction scheduler.
* Sections:: Dividing storage into text, data, and other sections.
* PIC:: Macros for position independent code.
* Assembler Format:: Defining how to write insns and pseudo-ops to output.
* Debugging Info:: Defining the format of debugging output.
* Floating Point:: Handling floating point for cross-compilers.
* Mode Switching:: Insertion of mode-switching instructions.
* Target Attributes:: Defining target-specific uses of `__attribute__'.
* Emulated TLS:: Emulated TLS support.
* MIPS Coprocessors:: MIPS coprocessor support and how to customize it.
* PCH Target:: Validity checking for precompiled headers.
* C++ ABI:: Controlling C++ ABI changes.
* Named Address Spaces:: Adding support for named address spaces
* Misc:: Everything else.
File: gccint.info, Node: Target Structure, Next: Driver, Up: Target Macros
17.1 The Global `targetm' Variable
==================================
-- Variable: struct gcc_target targetm
The target `.c' file must define the global `targetm' variable
which contains pointers to functions and data relating to the
target machine. The variable is declared in `target.h';
`target-def.h' defines the macro `TARGET_INITIALIZER' which is
used to initialize the variable, and macros for the default
initializers for elements of the structure. The `.c' file should
override those macros for which the default definition is
inappropriate. For example:
#include "target.h"
#include "target-def.h"
/* Initialize the GCC target structure. */
#undef TARGET_COMP_TYPE_ATTRIBUTES
#define TARGET_COMP_TYPE_ATTRIBUTES MACHINE_comp_type_attributes
struct gcc_target targetm = TARGET_INITIALIZER;
Where a macro should be defined in the `.c' file in this manner to form
part of the `targetm' structure, it is documented below as a "Target
Hook" with a prototype. Many macros will change in future from being
defined in the `.h' file to being part of the `targetm' structure.
File: gccint.info, Node: Driver, Next: Run-time Target, Prev: Target Structure, Up: Target Macros
17.2 Controlling the Compilation Driver, `gcc'
==============================================
You can control the compilation driver.
-- Macro: DRIVER_SELF_SPECS
A list of specs for the driver itself. It should be a suitable
initializer for an array of strings, with no surrounding braces.
The driver applies these specs to its own command line between
loading default `specs' files (but not command-line specified
ones) and choosing the multilib directory or running any
subcommands. It applies them in the order given, so each spec can
depend on the options added by earlier ones. It is also possible
to remove options using `%<OPTION' in the usual way.
This macro can be useful when a port has several interdependent
target options. It provides a way of standardizing the command
line so that the other specs are easier to write.
Do not define this macro if it does not need to do anything.
-- Macro: OPTION_DEFAULT_SPECS
A list of specs used to support configure-time default options
(i.e. `--with' options) in the driver. It should be a suitable
initializer for an array of structures, each containing two
strings, without the outermost pair of surrounding braces.
The first item in the pair is the name of the default. This must
match the code in `config.gcc' for the target. The second item is
a spec to apply if a default with this name was specified. The
string `%(VALUE)' in the spec will be replaced by the value of the
default everywhere it occurs.
The driver will apply these specs to its own command line between
loading default `specs' files and processing `DRIVER_SELF_SPECS',
using the same mechanism as `DRIVER_SELF_SPECS'.
Do not define this macro if it does not need to do anything.
-- Macro: CPP_SPEC
A C string constant that tells the GCC driver program options to
pass to CPP. It can also specify how to translate options you
give to GCC into options for GCC to pass to the CPP.
Do not define this macro if it does not need to do anything.
-- Macro: CPLUSPLUS_CPP_SPEC
This macro is just like `CPP_SPEC', but is used for C++, rather
than C. If you do not define this macro, then the value of
`CPP_SPEC' (if any) will be used instead.
-- Macro: CC1_SPEC
A C string constant that tells the GCC driver program options to
pass to `cc1', `cc1plus', `f771', and the other language front
ends. It can also specify how to translate options you give to
GCC into options for GCC to pass to front ends.
Do not define this macro if it does not need to do anything.
-- Macro: CC1PLUS_SPEC
A C string constant that tells the GCC driver program options to
pass to `cc1plus'. It can also specify how to translate options
you give to GCC into options for GCC to pass to the `cc1plus'.
Do not define this macro if it does not need to do anything. Note
that everything defined in CC1_SPEC is already passed to `cc1plus'
so there is no need to duplicate the contents of CC1_SPEC in
CC1PLUS_SPEC.
-- Macro: ASM_SPEC
A C string constant that tells the GCC driver program options to
pass to the assembler. It can also specify how to translate
options you give to GCC into options for GCC to pass to the
assembler. See the file `sun3.h' for an example of this.
Do not define this macro if it does not need to do anything.
-- Macro: ASM_FINAL_SPEC
A C string constant that tells the GCC driver program how to run
any programs which cleanup after the normal assembler. Normally,
this is not needed. See the file `mips.h' for an example of this.
Do not define this macro if it does not need to do anything.
-- Macro: AS_NEEDS_DASH_FOR_PIPED_INPUT
Define this macro, with no value, if the driver should give the
assembler an argument consisting of a single dash, `-', to
instruct it to read from its standard input (which will be a pipe
connected to the output of the compiler proper). This argument is
given after any `-o' option specifying the name of the output file.
If you do not define this macro, the assembler is assumed to read
its standard input if given no non-option arguments. If your
assembler cannot read standard input at all, use a `%{pipe:%e}'
construct; see `mips.h' for instance.
-- Macro: LINK_SPEC
A C string constant that tells the GCC driver program options to
pass to the linker. It can also specify how to translate options
you give to GCC into options for GCC to pass to the linker.
Do not define this macro if it does not need to do anything.
-- Macro: LIB_SPEC
Another C string constant used much like `LINK_SPEC'. The
difference between the two is that `LIB_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'.
-- Macro: LIBGCC_SPEC
Another C string constant that tells the GCC driver program how
and when to place a reference to `libgcc.a' into the linker
command line. This constant is placed both before and after the
value of `LIB_SPEC'.
If this macro is not defined, the GCC driver provides a default
that passes the string `-lgcc' to the linker.
-- Macro: REAL_LIBGCC_SPEC
By default, if `ENABLE_SHARED_LIBGCC' is defined, the
`LIBGCC_SPEC' is not directly used by the driver program but is
instead modified to refer to different versions of `libgcc.a'
depending on the values of the command line flags `-static',
`-shared', `-static-libgcc', and `-shared-libgcc'. On targets
where these modifications are inappropriate, define
`REAL_LIBGCC_SPEC' instead. `REAL_LIBGCC_SPEC' tells the driver
how to place a reference to `libgcc' on the link command line,
but, unlike `LIBGCC_SPEC', it is used unmodified.
-- Macro: USE_LD_AS_NEEDED
A macro that controls the modifications to `LIBGCC_SPEC' mentioned
in `REAL_LIBGCC_SPEC'. If nonzero, a spec will be generated that
uses -as-needed and the shared libgcc in place of the static
exception handler library, when linking without any of `-static',
`-static-libgcc', or `-shared-libgcc'.
-- Macro: LINK_EH_SPEC
If defined, this C string constant is added to `LINK_SPEC'. When
`USE_LD_AS_NEEDED' is zero or undefined, it also affects the
modifications to `LIBGCC_SPEC' mentioned in `REAL_LIBGCC_SPEC'.
-- Macro: 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'.
-- Macro: ENDFILE_SPEC
Another C string constant used much like `LINK_SPEC'. The
difference between the two is that `ENDFILE_SPEC' is used at the
very end of the command given to the linker.
Do not define this macro if it does not need to do anything.
-- Macro: THREAD_MODEL_SPEC
GCC `-v' will print the thread model GCC was configured to use.
However, this doesn't work on platforms that are multilibbed on
thread models, such as AIX 4.3. On such platforms, define
`THREAD_MODEL_SPEC' such that it evaluates to a string without
blanks that names one of the recognized thread models. `%*', the
default value of this macro, will expand to the value of
`thread_file' set in `config.gcc'.
-- Macro: SYSROOT_SUFFIX_SPEC
Define this macro to add a suffix to the target sysroot when GCC is
configured with a sysroot. This will cause GCC to search for
usr/lib, et al, within sysroot+suffix.
-- Macro: SYSROOT_HEADERS_SUFFIX_SPEC
Define this macro to add a headers_suffix to the target sysroot
when GCC is configured with a sysroot. This will cause GCC to
pass the updated sysroot+headers_suffix to CPP, causing it to
search for usr/include, et al, within sysroot+headers_suffix.
-- Macro: EXTRA_SPECS
Define this macro to provide additional specifications to put in
the `specs' file that can be used in various specifications like
`CC1_SPEC'.
The definition should be an initializer for an array of structures,
containing a string constant, that defines the specification name,
and a string constant that provides the specification.
Do not define this macro if it does not need to do anything.
`EXTRA_SPECS' is useful when an architecture contains several
related targets, which have various `..._SPECS' which are similar
to each other, and the maintainer would like one central place to
keep these definitions.
For example, the PowerPC System V.4 targets use `EXTRA_SPECS' to
define either `_CALL_SYSV' when the System V calling sequence is
used or `_CALL_AIX' when the older AIX-based calling sequence is
used.
The `config/rs6000/rs6000.h' target file defines:
#define EXTRA_SPECS \
{ "cpp_sysv_default", CPP_SYSV_DEFAULT },
#define CPP_SYS_DEFAULT ""
The `config/rs6000/sysv.h' target file defines:
#undef CPP_SPEC
#define CPP_SPEC \
"%{posix: -D_POSIX_SOURCE } \
%{mcall-sysv: -D_CALL_SYSV } \
%{!mcall-sysv: %(cpp_sysv_default) } \
%{msoft-float: -D_SOFT_FLOAT} %{mcpu=403: -D_SOFT_FLOAT}"
#undef CPP_SYSV_DEFAULT
#define CPP_SYSV_DEFAULT "-D_CALL_SYSV"
while the `config/rs6000/eabiaix.h' target file defines
`CPP_SYSV_DEFAULT' as:
#undef CPP_SYSV_DEFAULT
#define CPP_SYSV_DEFAULT "-D_CALL_AIX"
-- Macro: LINK_LIBGCC_SPECIAL_1
Define this macro if the driver program should find the library
`libgcc.a'. If you do not define this macro, the driver program
will pass the argument `-lgcc' to tell the linker to do the search.
-- Macro: LINK_GCC_C_SEQUENCE_SPEC
The sequence in which libgcc and libc are specified to the linker.
By default this is `%G %L %G'.
-- Macro: LINK_COMMAND_SPEC
A C string constant giving the complete command line need to
execute the linker. When you do this, you will need to update
your port each time a change is made to the link command line
within `gcc.c'. Therefore, define this macro only if you need to
completely redefine the command line for invoking the linker and
there is no other way to accomplish the effect you need.
Overriding this macro may be avoidable by overriding
`LINK_GCC_C_SEQUENCE_SPEC' instead.
-- Macro: LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
A nonzero value causes `collect2' to remove duplicate
`-LDIRECTORY' search directories from linking commands. Do not
give it a nonzero value if removing duplicate search directories
changes the linker's semantics.
-- Macro: MULTILIB_DEFAULTS
Define this macro as a C expression for the initializer of an
array of string to tell the driver program which options are
defaults for this target and thus do not need to be handled
specially when using `MULTILIB_OPTIONS'.
Do not define this macro if `MULTILIB_OPTIONS' is not defined in
the target makefile fragment or if none of the options listed in
`MULTILIB_OPTIONS' are set by default. *Note Target Fragment::.
-- Macro: RELATIVE_PREFIX_NOT_LINKDIR
Define this macro to tell `gcc' that it should only translate a
`-B' prefix into a `-L' linker option if the prefix indicates an
absolute file name.
-- Macro: MD_EXEC_PREFIX
If defined, this macro is an additional prefix to try after
`STANDARD_EXEC_PREFIX'. `MD_EXEC_PREFIX' is not searched when the
compiler is built as a cross compiler. If you define
`MD_EXEC_PREFIX', then be sure to add it to the list of
directories used to find the assembler in `configure.in'.
-- Macro: STANDARD_STARTFILE_PREFIX
Define this macro as a C string constant if you wish to override
the standard choice of `libdir' as the default prefix to try when
searching for startup files such as `crt0.o'.
`STANDARD_STARTFILE_PREFIX' is not searched when the compiler is
built as a cross compiler.
-- Macro: STANDARD_STARTFILE_PREFIX_1
Define this macro as a C string constant if you wish to override
the standard choice of `/lib' as a prefix to try after the default
prefix when searching for startup files such as `crt0.o'.
`STANDARD_STARTFILE_PREFIX_1' is not searched when the compiler is
built as a cross compiler.
-- Macro: STANDARD_STARTFILE_PREFIX_2
Define this macro as a C string constant if you wish to override
the standard choice of `/lib' as yet another prefix to try after
the default prefix when searching for startup files such as
`crt0.o'. `STANDARD_STARTFILE_PREFIX_2' is not searched when the
compiler is built as a cross compiler.
-- Macro: MD_STARTFILE_PREFIX
If defined, this macro supplies an additional prefix to try after
the standard prefixes. `MD_EXEC_PREFIX' is not searched when the
compiler is built as a cross compiler.
-- Macro: MD_STARTFILE_PREFIX_1
If defined, this macro supplies yet another prefix to try after the
standard prefixes. It is not searched when the compiler is built
as a cross compiler.
-- Macro: INIT_ENVIRONMENT
Define this macro as a C string constant if you wish to set
environment variables for programs called by the driver, such as
the assembler and loader. The driver passes the value of this
macro to `putenv' to initialize the necessary environment
variables.
-- Macro: LOCAL_INCLUDE_DIR
Define this macro as a C string constant if you wish to override
the standard choice of `/usr/local/include' as the default prefix
to try when searching for local header files. `LOCAL_INCLUDE_DIR'
comes before `SYSTEM_INCLUDE_DIR' in the search order.
Cross compilers do not search either `/usr/local/include' or its
replacement.
-- Macro: SYSTEM_INCLUDE_DIR
Define this macro as a C string constant if you wish to specify a
system-specific directory to search for header files before the
standard directory. `SYSTEM_INCLUDE_DIR' comes before
`STANDARD_INCLUDE_DIR' in the search order.
Cross compilers do not use this macro and do not search the
directory specified.
-- Macro: STANDARD_INCLUDE_DIR
Define this macro as a C string constant if you wish to override
the standard choice of `/usr/include' as the default prefix to try
when searching for header files.
Cross compilers ignore this macro and do not search either
`/usr/include' or its replacement.
-- Macro: STANDARD_INCLUDE_COMPONENT
The "component" corresponding to `STANDARD_INCLUDE_DIR'. See
`INCLUDE_DEFAULTS', below, for the description of components. If
you do not define this macro, no component is used.
-- Macro: INCLUDE_DEFAULTS
Define this macro if you wish to override the entire default
search path for include files. For a native compiler, the default
search path usually consists of `GCC_INCLUDE_DIR',
`LOCAL_INCLUDE_DIR', `SYSTEM_INCLUDE_DIR',
`GPLUSPLUS_INCLUDE_DIR', and `STANDARD_INCLUDE_DIR'. In addition,
`GPLUSPLUS_INCLUDE_DIR' and `GCC_INCLUDE_DIR' are defined
automatically by `Makefile', and specify private search areas for
GCC. The directory `GPLUSPLUS_INCLUDE_DIR' is used only for C++
programs.
The definition should be an initializer for an array of structures.
Each array element should have four elements: the directory name (a
string constant), the component name (also a string constant), a
flag for C++-only directories, and a flag showing that the
includes in the directory don't need to be wrapped in `extern `C''
when compiling C++. Mark the end of the array with a null element.
The component name denotes what GNU package the include file is
part of, if any, in all uppercase letters. For example, it might
be `GCC' or `BINUTILS'. If the package is part of a
vendor-supplied operating system, code the component name as `0'.
For example, here is the definition used for VAX/VMS:
#define INCLUDE_DEFAULTS \
{ \
{ "GNU_GXX_INCLUDE:", "G++", 1, 1}, \
{ "GNU_CC_INCLUDE:", "GCC", 0, 0}, \
{ "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0}, \
{ ".", 0, 0, 0}, \
{ 0, 0, 0, 0} \
}
Here is the order of prefixes tried for exec files:
1. Any prefixes specified by the user with `-B'.
2. The environment variable `GCC_EXEC_PREFIX' or, if `GCC_EXEC_PREFIX'
is not set and the compiler has not been installed in the
configure-time PREFIX, the location in which the compiler has
actually been installed.
3. The directories specified by the environment variable
`COMPILER_PATH'.
4. The macro `STANDARD_EXEC_PREFIX', if the compiler has been
installed in the configured-time PREFIX.
5. The location `/usr/libexec/gcc/', but only if this is a native
compiler.
6. The location `/usr/lib/gcc/', but only if this is a native
compiler.
7. The macro `MD_EXEC_PREFIX', if defined, but only if this is a
native compiler.
Here is the order of prefixes tried for startfiles:
1. Any prefixes specified by the user with `-B'.
2. The environment variable `GCC_EXEC_PREFIX' or its automatically
determined value based on the installed toolchain location.
3. The directories specified by the environment variable
`LIBRARY_PATH' (or port-specific name; native only, cross
compilers do not use this).
4. The macro `STANDARD_EXEC_PREFIX', but only if the toolchain is
installed in the configured PREFIX or this is a native compiler.
5. The location `/usr/lib/gcc/', but only if this is a native
compiler.
6. The macro `MD_EXEC_PREFIX', if defined, but only if this is a
native compiler.
7. The macro `MD_STARTFILE_PREFIX', if defined, but only if this is a
native compiler, or we have a target system root.
8. The macro `MD_STARTFILE_PREFIX_1', if defined, but only if this is
a native compiler, or we have a target system root.
9. The macro `STANDARD_STARTFILE_PREFIX', with any sysroot
modifications. If this path is relative it will be prefixed by
`GCC_EXEC_PREFIX' and the machine suffix or `STANDARD_EXEC_PREFIX'
and the machine suffix.
10. The macro `STANDARD_STARTFILE_PREFIX_1', but only if this is a
native compiler, or we have a target system root. The default for
this macro is `/lib/'.
11. The macro `STANDARD_STARTFILE_PREFIX_2', but only if this is a
native compiler, or we have a target system root. The default for
this macro is `/usr/lib/'.
File: gccint.info, Node: Run-time Target, Next: Per-Function Data, Prev: Driver, Up: Target Macros
17.3 Run-time Target Specification
==================================
Here are run-time target specifications.
-- Macro: TARGET_CPU_CPP_BUILTINS ()
This function-like macro expands to a block of code that defines
built-in preprocessor macros and assertions for the target CPU,
using the functions `builtin_define', `builtin_define_std' and
`builtin_assert'. When the front end calls this macro it provides
a trailing semicolon, and since it has finished command line
option processing your code can use those results freely.
`builtin_assert' takes a string in the form you pass to the
command-line option `-A', such as `cpu=mips', and creates the
assertion. `builtin_define' takes a string in the form accepted
by option `-D' and unconditionally defines the macro.
`builtin_define_std' takes a string representing the name of an
object-like macro. If it doesn't lie in the user's namespace,
`builtin_define_std' defines it unconditionally. Otherwise, it
defines a version with two leading underscores, and another version
with two leading and trailing underscores, and defines the original
only if an ISO standard was not requested on the command line. For
example, passing `unix' defines `__unix', `__unix__' and possibly
`unix'; passing `_mips' defines `__mips', `__mips__' and possibly
`_mips', and passing `_ABI64' defines only `_ABI64'.
You can also test for the C dialect being compiled. The variable
`c_language' is set to one of `clk_c', `clk_cplusplus' or
`clk_objective_c'. Note that if we are preprocessing assembler,
this variable will be `clk_c' but the function-like macro
`preprocessing_asm_p()' will return true, so you might want to
check for that first. If you need to check for strict ANSI, the
variable `flag_iso' can be used. The function-like macro
`preprocessing_trad_p()' can be used to check for traditional
preprocessing.
-- Macro: TARGET_OS_CPP_BUILTINS ()
Similarly to `TARGET_CPU_CPP_BUILTINS' but this macro is optional
and is used for the target operating system instead.
-- Macro: TARGET_OBJFMT_CPP_BUILTINS ()
Similarly to `TARGET_CPU_CPP_BUILTINS' but this macro is optional
and is used for the target object format. `elfos.h' uses this
macro to define `__ELF__', so you probably do not need to define
it yourself.
-- Variable: extern int target_flags
This variable is declared in `options.h', which is included before
any target-specific headers.
-- Target Hook: int TARGET_DEFAULT_TARGET_FLAGS
This variable specifies the initial value of `target_flags'. Its
default setting is 0.
-- Target Hook: bool TARGET_HANDLE_OPTION (size_t CODE, const char
*ARG, int VALUE)
This hook is called whenever the user specifies one of the
target-specific options described by the `.opt' definition files
(*note Options::). It has the opportunity to do some
option-specific processing and should return true if the option is
valid. The default definition does nothing but return true.
CODE specifies the `OPT_NAME' enumeration value associated with
the selected option; NAME is just a rendering of the option name
in which non-alphanumeric characters are replaced by underscores.
ARG specifies the string argument and is null if no argument was
given. If the option is flagged as a `UInteger' (*note Option
properties::), VALUE is the numeric value of the argument.
Otherwise VALUE is 1 if the positive form of the option was used
and 0 if the "no-" form was.
-- Target Hook: bool TARGET_HANDLE_C_OPTION (size_t CODE, const char
*ARG, int VALUE)
This target hook is called whenever the user specifies one of the
target-specific C language family options described by the `.opt'
definition files(*note Options::). It has the opportunity to do
some option-specific processing and should return true if the
option is valid. The arguments are like for
`TARGET_HANDLE_OPTION'. The default definition does nothing but
return false.
In general, you should use `TARGET_HANDLE_OPTION' to handle
options. However, if processing an option requires routines that
are only available in the C (and related language) front ends,
then you should use `TARGET_HANDLE_C_OPTION' instead.
-- Target Hook: tree TARGET_OBJC_CONSTRUCT_STRING_OBJECT (tree STRING)
Targets may provide a string object type that can be used within
and between C, C++ and their respective Objective-C dialects. A
string object might, for example, embed encoding and length
information. These objects are considered opaque to the compiler
and handled as references. An ideal implementation makes the
composition of the string object match that of the Objective-C
`NSString' (`NXString' for GNUStep), allowing efficient
interworking between C-only and Objective-C code. If a target
implements string objects then this hook should return a reference
to such an object constructed from the normal `C' string
representation provided in STRING. At present, the hook is used by
Objective-C only, to obtain a common-format string object when the
target provides one.
-- Target Hook: bool TARGET_STRING_OBJECT_REF_TYPE_P (const_tree
STRINGREF)
If a target implements string objects then this hook should return
`true' if STRINGREF is a valid reference to such an object.
-- Target Hook: void TARGET_CHECK_STRING_OBJECT_FORMAT_ARG (tree
FORMAT_ARG, tree ARGS_LIST)
If a target implements string objects then this hook should should
provide a facility to check the function arguments in ARGS_LIST
against the format specifiers in FORMAT_ARG where the type of
FORMAT_ARG is one recognized as a valid string reference type.
-- Macro: TARGET_VERSION
This macro is a C statement to print on `stderr' a string
describing the particular machine description choice. Every
machine description should define `TARGET_VERSION'. For example:
#ifdef MOTOROLA
#define TARGET_VERSION \
fprintf (stderr, " (68k, Motorola syntax)");
#else
#define TARGET_VERSION \
fprintf (stderr, " (68k, MIT syntax)");
#endif
-- Target Hook: void TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE (void)
This target function is similar to the hook
`TARGET_OPTION_OVERRIDE' but is called when the optimize level is
changed via an attribute or pragma or when it is reset at the end
of the code affected by the attribute or pragma. It is not called
at the beginning of compilation when `TARGET_OPTION_OVERRIDE' is
called so if you want to perform these actions then, you should
have `TARGET_OPTION_OVERRIDE' call
`TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE'.
-- Macro: C_COMMON_OVERRIDE_OPTIONS
This is similar to the `TARGET_OPTION_OVERRIDE' hook but is only
used in the C language frontends (C, Objective-C, C++,
Objective-C++) and so can be used to alter option flag variables
which only exist in those frontends.
-- Target Hook: const struct default_options *
TARGET_OPTION_OPTIMIZATION_TABLE
Some machines may desire to change what optimizations are
performed for various optimization levels. This variable, if
defined, describes options to enable at particular sets of
optimization levels. These options are processed once just after
the optimization level is determined and before the remainder of
the command options have been parsed, so may be overridden by other
options passed explicitly.
This processing is run once at program startup and when the
optimization options are changed via `#pragma GCC optimize' or by
using the `optimize' attribute.
-- Target Hook: void TARGET_OPTION_INIT_STRUCT (struct gcc_options
*OPTS)
Set target-dependent initial values of fields in OPTS.
-- Target Hook: void TARGET_OPTION_DEFAULT_PARAMS (void)
Set target-dependent default values for `--param' settings, using
calls to `set_default_param_value'.
-- Target Hook: void TARGET_HELP (void)
This hook is called in response to the user invoking
`--target-help' on the command line. It gives the target a chance
to display extra information on the target specific command line
options found in its `.opt' file.
-- Macro: SWITCHABLE_TARGET
Some targets need to switch between substantially different
subtargets during compilation. For example, the MIPS target has
one subtarget for the traditional MIPS architecture and another
for MIPS16. Source code can switch between these two
subarchitectures using the `mips16' and `nomips16' attributes.
Such subtargets can differ in things like the set of available
registers, the set of available instructions, the costs of various
operations, and so on. GCC caches a lot of this type of
information in global variables, and recomputing them for each
subtarget takes a significant amount of time. The compiler
therefore provides a facility for maintaining several versions of
the global variables and quickly switching between them; see
`target-globals.h' for details.
Define this macro to 1 if your target needs this facility. The
default is 0.
File: gccint.info, Node: Per-Function Data, Next: Storage Layout, Prev: Run-time Target, Up: Target Macros
17.4 Defining data structures for per-function information.
===========================================================
If the target needs to store information on a per-function basis, GCC
provides a macro and a couple of variables to allow this. Note, just
using statics to store the information is a bad idea, since GCC supports
nested functions, so you can be halfway through encoding one function
when another one comes along.
GCC defines a data structure called `struct function' which contains
all of the data specific to an individual function. This structure
contains a field called `machine' whose type is `struct
machine_function *', which can be used by targets to point to their own
specific data.
If a target needs per-function specific data it should define the type
`struct machine_function' and also the macro `INIT_EXPANDERS'. This
macro should be used to initialize the function pointer
`init_machine_status'. This pointer is explained below.
One typical use of per-function, target specific data is to create an
RTX to hold the register containing the function's return address. This
RTX can then be used to implement the `__builtin_return_address'
function, for level 0.
Note--earlier implementations of GCC used a single data area to hold
all of the per-function information. Thus when processing of a nested
function began the old per-function data had to be pushed onto a stack,
and when the processing was finished, it had to be popped off the
stack. GCC used to provide function pointers called
`save_machine_status' and `restore_machine_status' to handle the saving
and restoring of the target specific information. Since the single
data area approach is no longer used, these pointers are no longer
supported.
-- Macro: INIT_EXPANDERS
Macro called to initialize any target specific information. This
macro is called once per function, before generation of any RTL
has begun. The intention of this macro is to allow the
initialization of the function pointer `init_machine_status'.
-- Variable: void (*)(struct function *) init_machine_status
If this function pointer is non-`NULL' it will be called once per
function, before function compilation starts, in order to allow the
target to perform any target specific initialization of the
`struct function' structure. It is intended that this would be
used to initialize the `machine' of that structure.
`struct machine_function' structures are expected to be freed by
GC. Generally, any memory that they reference must be allocated
by using GC allocation, including the structure itself.
File: gccint.info, Node: Storage Layout, Next: Type Layout, Prev: Per-Function Data, Up: Target Macros
17.5 Storage Layout
===================
Note that the definitions of the macros in this table which are sizes or
alignments measured in bits do not need to be constant. They can be C
expressions that refer to static variables, such as the `target_flags'.
*Note Run-time Target::.
-- Macro: BITS_BIG_ENDIAN
Define this macro to have the value 1 if the most significant bit
in a byte has the lowest number; otherwise define it to have the
value zero. This means that bit-field instructions count from the
most significant bit. If the machine has no bit-field
instructions, then this must still be defined, but it doesn't
matter which value it is defined to. This macro need not be a
constant.
This macro does not affect the way structure fields are packed into
bytes or words; that is controlled by `BYTES_BIG_ENDIAN'.
-- Macro: BYTES_BIG_ENDIAN
Define this macro to have the value 1 if the most significant byte
in a word has the lowest number. This macro need not be a
constant.
-- Macro: WORDS_BIG_ENDIAN
Define this macro to have the value 1 if, in a multiword object,
the most significant word has the lowest number. This applies to
both memory locations and registers; GCC fundamentally assumes
that the order of words in memory is the same as the order in
registers. This macro need not be a constant.
-- Macro: FLOAT_WORDS_BIG_ENDIAN
Define this macro to have the value 1 if `DFmode', `XFmode' or
`TFmode' floating point numbers are stored in memory with the word
containing the sign bit at the lowest address; otherwise define it
to have the value 0. This macro need not be a constant.
You need not define this macro if the ordering is the same as for
multi-word integers.
-- Macro: BITS_PER_UNIT
Define this macro to be the number of bits in an addressable
storage unit (byte). If you do not define this macro the default
is 8.
-- Macro: BITS_PER_WORD
Number of bits in a word. If you do not define this macro, the
default is `BITS_PER_UNIT * UNITS_PER_WORD'.
-- Macro: MAX_BITS_PER_WORD
Maximum number of bits in a word. If this is undefined, the
default is `BITS_PER_WORD'. Otherwise, it is the constant value
that is the largest value that `BITS_PER_WORD' can have at
run-time.
-- Macro: UNITS_PER_WORD
Number of storage units in a word; normally the size of a
general-purpose register, a power of two from 1 or 8.
-- Macro: MIN_UNITS_PER_WORD
Minimum number of units in a word. If this is undefined, the
default is `UNITS_PER_WORD'. Otherwise, it is the constant value
that is the smallest value that `UNITS_PER_WORD' can have at
run-time.
-- Macro: POINTER_SIZE
Width of a pointer, in bits. You must specify a value no wider
than the width of `Pmode'. If it is not equal to the width of
`Pmode', you must define `POINTERS_EXTEND_UNSIGNED'. If you do
not specify a value the default is `BITS_PER_WORD'.
-- Macro: POINTERS_EXTEND_UNSIGNED
A C expression that determines how pointers should be extended from
`ptr_mode' to either `Pmode' or `word_mode'. It is greater than
zero if pointers should be zero-extended, zero if they should be
sign-extended, and negative if some other sort of conversion is
needed. In the last case, the extension is done by the target's
`ptr_extend' instruction.
You need not define this macro if the `ptr_mode', `Pmode' and
`word_mode' are all the same width.
-- Macro: PROMOTE_MODE (M, UNSIGNEDP, TYPE)
A macro to update M and UNSIGNEDP when an object whose type is
TYPE and which has the specified mode and signedness is to be
stored in a register. This macro is only called when TYPE is a
scalar type.
On most RISC machines, which only have operations that operate on
a full register, define this macro to set M to `word_mode' if M is
an integer mode narrower than `BITS_PER_WORD'. In most cases,
only integer modes should be widened because wider-precision
floating-point operations are usually more expensive than their
narrower counterparts.
For most machines, the macro definition does not change UNSIGNEDP.
However, some machines, have instructions that preferentially
handle either signed or unsigned quantities of certain modes. For
example, on the DEC Alpha, 32-bit loads from memory and 32-bit add
instructions sign-extend the result to 64 bits. On such machines,
set UNSIGNEDP according to which kind of extension is more
efficient.
Do not define this macro if it would never modify M.
-- Target Hook: enum machine_mode TARGET_PROMOTE_FUNCTION_MODE
(const_tree TYPE, enum machine_mode MODE, int *PUNSIGNEDP,
const_tree FUNTYPE, int FOR_RETURN)
Like `PROMOTE_MODE', but it is applied to outgoing function
arguments or function return values. The target hook should
return the new mode and possibly change `*PUNSIGNEDP' if the
promotion should change signedness. This function is called only
for scalar _or pointer_ types.
FOR_RETURN allows to distinguish the promotion of arguments and
return values. If it is `1', a return value is being promoted and
`TARGET_FUNCTION_VALUE' must perform the same promotions done here.
If it is `2', the returned mode should be that of the register in
which an incoming parameter is copied, or the outgoing result is
computed; then the hook should return the same mode as
`promote_mode', though the signedness may be different.
The default is to not promote arguments and return values. You can
also define the hook to
`default_promote_function_mode_always_promote' if you would like
to apply the same rules given by `PROMOTE_MODE'.
-- Macro: PARM_BOUNDARY
Normal alignment required for function parameters on the stack, in
bits. All stack parameters receive at least this much alignment
regardless of data type. On most machines, this is the same as the
size of an integer.
-- Macro: STACK_BOUNDARY
Define this macro to the minimum alignment enforced by hardware
for the stack pointer on this machine. The definition is a C
expression for the desired alignment (measured in bits). This
value is used as a default if `PREFERRED_STACK_BOUNDARY' is not
defined. On most machines, this should be the same as
`PARM_BOUNDARY'.
-- Macro: PREFERRED_STACK_BOUNDARY
Define this macro if you wish to preserve a certain alignment for
the stack pointer, greater than what the hardware enforces. The
definition is a C expression for the desired alignment (measured
in bits). This macro must evaluate to a value equal to or larger
than `STACK_BOUNDARY'.
-- Macro: INCOMING_STACK_BOUNDARY
Define this macro if the incoming stack boundary may be different
from `PREFERRED_STACK_BOUNDARY'. This macro must evaluate to a
value equal to or larger than `STACK_BOUNDARY'.
-- Macro: FUNCTION_BOUNDARY
Alignment required for a function entry point, in bits.
-- Macro: BIGGEST_ALIGNMENT
Biggest alignment that any data type can require on this machine,
in bits. Note that this is not the biggest alignment that is
supported, just the biggest alignment that, when violated, may
cause a fault.
-- Macro: MALLOC_ABI_ALIGNMENT
Alignment, in bits, a C conformant malloc implementation has to
provide. If not defined, the default value is `BITS_PER_WORD'.
-- Macro: ATTRIBUTE_ALIGNED_VALUE
Alignment used by the `__attribute__ ((aligned))' construct. If
not defined, the default value is `BIGGEST_ALIGNMENT'.
-- Macro: MINIMUM_ATOMIC_ALIGNMENT
If defined, the smallest alignment, in bits, that can be given to
an object that can be referenced in one operation, without
disturbing any nearby object. Normally, this is `BITS_PER_UNIT',
but may be larger on machines that don't have byte or half-word
store operations.
-- Macro: BIGGEST_FIELD_ALIGNMENT
Biggest alignment that any structure or union field can require on
this machine, in bits. If defined, this overrides
`BIGGEST_ALIGNMENT' for structure and union fields only, unless
the field alignment has been set by the `__attribute__ ((aligned
(N)))' construct.
-- Macro: ADJUST_FIELD_ALIGN (FIELD, COMPUTED)
An expression for the alignment of a structure field FIELD if the
alignment computed in the usual way (including applying of
`BIGGEST_ALIGNMENT' and `BIGGEST_FIELD_ALIGNMENT' to the
alignment) is COMPUTED. It overrides alignment only if the field
alignment has not been set by the `__attribute__ ((aligned (N)))'
construct.
-- Macro: MAX_STACK_ALIGNMENT
Biggest stack alignment guaranteed by the backend. Use this macro
to specify the maximum alignment of a variable on stack.
If not defined, the default value is `STACK_BOUNDARY'.
-- Macro: MAX_OFILE_ALIGNMENT
Biggest alignment supported by the object file format of this
machine. Use this macro to limit the alignment which can be
specified using the `__attribute__ ((aligned (N)))' construct. If
not defined, the default value is `BIGGEST_ALIGNMENT'.
On systems that use ELF, the default (in `config/elfos.h') is the
largest supported 32-bit ELF section alignment representable on a
32-bit host e.g. `(((unsigned HOST_WIDEST_INT) 1 << 28) * 8)'. On
32-bit ELF the largest supported section alignment in bits is
`(0x80000000 * 8)', but this is not representable on 32-bit hosts.
-- Macro: DATA_ALIGNMENT (TYPE, BASIC-ALIGN)
If defined, a C expression to compute the alignment for a variable
in the static store. TYPE is the data type, and BASIC-ALIGN is
the alignment that the object would ordinarily have. The value of
this macro is used instead of that alignment to align the object.
If this macro is not defined, then BASIC-ALIGN is used.
One use of this macro is to increase alignment of medium-size data
to make it all fit in fewer cache lines. Another is to cause
character arrays to be word-aligned so that `strcpy' calls that
copy constants to character arrays can be done inline.
-- Macro: CONSTANT_ALIGNMENT (CONSTANT, BASIC-ALIGN)
If defined, a C expression to compute the alignment given to a
constant that is being placed in memory. CONSTANT is the constant
and BASIC-ALIGN is the alignment that the object would ordinarily
have. The value of this macro is used instead of that alignment to
align the object.
If this macro is not defined, then BASIC-ALIGN is used.
The typical use of this macro is to increase alignment for string
constants to be word aligned so that `strcpy' calls that copy
constants can be done inline.
-- Macro: LOCAL_ALIGNMENT (TYPE, BASIC-ALIGN)
If defined, a C expression to compute the alignment for a variable
in the local store. TYPE is the data type, and BASIC-ALIGN is the
alignment that the object would ordinarily have. The value of this
macro is used instead of that alignment to align the object.
If this macro is not defined, then BASIC-ALIGN is used.
One use of this macro is to increase alignment of medium-size data
to make it all fit in fewer cache lines.
If the value of this macro has a type, it should be an unsigned
type.
-- Target Hook: HOST_WIDE_INT TARGET_VECTOR_ALIGNMENT (const_tree TYPE)
This hook can be used to define the alignment for a vector of type
TYPE, in order to comply with a platform ABI. The default is to
require natural alignment for vector types. The alignment
returned by this hook must be a power-of-two multiple of the
default alignment of the vector element type.
-- Macro: STACK_SLOT_ALIGNMENT (TYPE, MODE, BASIC-ALIGN)
If defined, a C expression to compute the alignment for stack slot.
TYPE is the data type, MODE is the widest mode available, and
BASIC-ALIGN is the alignment that the slot would ordinarily have.
The value of this macro is used instead of that alignment to align
the slot.
If this macro is not defined, then BASIC-ALIGN is used when TYPE
is `NULL'. Otherwise, `LOCAL_ALIGNMENT' will be used.
This macro is to set alignment of stack slot to the maximum
alignment of all possible modes which the slot may have.
If the value of this macro has a type, it should be an unsigned
type.
-- Macro: LOCAL_DECL_ALIGNMENT (DECL)
If defined, a C expression to compute the alignment for a local
variable DECL.
If this macro is not defined, then `LOCAL_ALIGNMENT (TREE_TYPE
(DECL), DECL_ALIGN (DECL))' is used.
One use of this macro is to increase alignment of medium-size data
to make it all fit in fewer cache lines.
If the value of this macro has a type, it should be an unsigned
type.
-- Macro: MINIMUM_ALIGNMENT (EXP, MODE, ALIGN)
If defined, a C expression to compute the minimum required
alignment for dynamic stack realignment purposes for EXP (a type
or decl), MODE, assuming normal alignment ALIGN.
If this macro is not defined, then ALIGN will be used.
-- Macro: EMPTY_FIELD_BOUNDARY
Alignment in bits to be given to a structure bit-field that
follows an empty field such as `int : 0;'.
If `PCC_BITFIELD_TYPE_MATTERS' is true, it overrides this macro.
-- Macro: STRUCTURE_SIZE_BOUNDARY
Number of bits which any structure or union's size must be a
multiple of. Each structure or union's size is rounded up to a
multiple of this.
If you do not define this macro, the default is the same as
`BITS_PER_UNIT'.
-- Macro: STRICT_ALIGNMENT
Define this macro to be the value 1 if instructions will fail to
work if given data not on the nominal alignment. If instructions
will merely go slower in that case, define this macro as 0.
-- Macro: PCC_BITFIELD_TYPE_MATTERS
Define this if you wish to imitate the way many other C compilers
handle alignment of bit-fields and the structures that contain
them.
The behavior is that the type written for a named bit-field (`int',
`short', or other integer type) imposes an alignment for the entire
structure, as if the structure really did contain an ordinary
field of that type. In addition, the bit-field is placed within
the structure so that it would fit within such a field, not
crossing a boundary for it.
Thus, on most machines, a named bit-field whose type is written as
`int' would not cross a four-byte boundary, and would force
four-byte alignment for the whole structure. (The alignment used
may not be four bytes; it is controlled by the other alignment
parameters.)
An unnamed bit-field will not affect the alignment of the
containing structure.
If the macro is defined, its definition should be a C expression;
a nonzero value for the expression enables this behavior.
Note that if this macro is not defined, or its value is zero, some
bit-fields may cross more than one alignment boundary. The
compiler can support such references if there are `insv', `extv',
and `extzv' insns that can directly reference memory.
The other known way of making bit-fields work is to define
`STRUCTURE_SIZE_BOUNDARY' as large as `BIGGEST_ALIGNMENT'. Then
every structure can be accessed with fullwords.
Unless the machine has bit-field instructions or you define
`STRUCTURE_SIZE_BOUNDARY' that way, you must define
`PCC_BITFIELD_TYPE_MATTERS' to have a nonzero value.
If your aim is to make GCC use the same conventions for laying out
bit-fields as are used by another compiler, here is how to
investigate what the other compiler does. Compile and run this
program:
struct foo1
{
char x;
char :0;
char y;
};
struct foo2
{
char x;
int :0;
char y;
};
main ()
{
printf ("Size of foo1 is %d\n",
sizeof (struct foo1));
printf ("Size of foo2 is %d\n",
sizeof (struct foo2));
exit (0);
}
If this prints 2 and 5, then the compiler's behavior is what you
would get from `PCC_BITFIELD_TYPE_MATTERS'.
-- Macro: BITFIELD_NBYTES_LIMITED
Like `PCC_BITFIELD_TYPE_MATTERS' except that its effect is limited
to aligning a bit-field within the structure.
-- Target Hook: bool TARGET_ALIGN_ANON_BITFIELD (void)
When `PCC_BITFIELD_TYPE_MATTERS' is true this hook will determine
whether unnamed bitfields affect the alignment of the containing
structure. The hook should return true if the structure should
inherit the alignment requirements of an unnamed bitfield's type.
-- Target Hook: bool TARGET_NARROW_VOLATILE_BITFIELD (void)
This target hook should return `true' if accesses to volatile
bitfields should use the narrowest mode possible. It should
return `false' if these accesses should use the bitfield container
type.
The default is `!TARGET_STRICT_ALIGN'.
-- Macro: MEMBER_TYPE_FORCES_BLK (FIELD, MODE)
Return 1 if a structure or array containing FIELD should be
accessed using `BLKMODE'.
If FIELD is the only field in the structure, MODE is its mode,
otherwise MODE is VOIDmode. MODE is provided in the case where
structures of one field would require the structure's mode to
retain the field's mode.
Normally, this is not needed.
-- Macro: ROUND_TYPE_ALIGN (TYPE, COMPUTED, SPECIFIED)
Define this macro as an expression for the alignment of a type
(given by TYPE as a tree node) if the alignment computed in the
usual way is COMPUTED and the alignment explicitly specified was
SPECIFIED.
The default is to use SPECIFIED if it is larger; otherwise, use
the smaller of COMPUTED and `BIGGEST_ALIGNMENT'
-- Macro: MAX_FIXED_MODE_SIZE
An integer expression for the size in bits of the largest integer
machine mode that should actually be used. All integer machine
modes of this size or smaller can be used for structures and
unions with the appropriate sizes. If this macro is undefined,
`GET_MODE_BITSIZE (DImode)' is assumed.
-- Macro: STACK_SAVEAREA_MODE (SAVE_LEVEL)
If defined, an expression of type `enum machine_mode' that
specifies the mode of the save area operand of a
`save_stack_LEVEL' named pattern (*note Standard Names::).
SAVE_LEVEL is one of `SAVE_BLOCK', `SAVE_FUNCTION', or
`SAVE_NONLOCAL' and selects which of the three named patterns is
having its mode specified.
You need not define this macro if it always returns `Pmode'. You
would most commonly define this macro if the `save_stack_LEVEL'
patterns need to support both a 32- and a 64-bit mode.
-- Macro: STACK_SIZE_MODE
If defined, an expression of type `enum machine_mode' that
specifies the mode of the size increment operand of an
`allocate_stack' named pattern (*note Standard Names::).
You need not define this macro if it always returns `word_mode'.
You would most commonly define this macro if the `allocate_stack'
pattern needs to support both a 32- and a 64-bit mode.
-- Target Hook: enum machine_mode TARGET_LIBGCC_CMP_RETURN_MODE (void)
This target hook should return the mode to be used for the return
value of compare instructions expanded to libgcc calls. If not
defined `word_mode' is returned which is the right choice for a
majority of targets.
-- Target Hook: enum machine_mode TARGET_LIBGCC_SHIFT_COUNT_MODE (void)
This target hook should return the mode to be used for the shift
count operand of shift instructions expanded to libgcc calls. If
not defined `word_mode' is returned which is the right choice for
a majority of targets.
-- Target Hook: enum machine_mode TARGET_UNWIND_WORD_MODE (void)
Return machine mode to be used for `_Unwind_Word' type. The
default is to use `word_mode'.
-- Macro: ROUND_TOWARDS_ZERO
If defined, this macro should be true if the prevailing rounding
mode is towards zero.
Defining this macro only affects the way `libgcc.a' emulates
floating-point arithmetic.
Not defining this macro is equivalent to returning zero.
-- Macro: LARGEST_EXPONENT_IS_NORMAL (SIZE)
This macro should return true if floats with SIZE bits do not have
a NaN or infinity representation, but use the largest exponent for
normal numbers instead.
Defining this macro only affects the way `libgcc.a' emulates
floating-point arithmetic.
The default definition of this macro returns false for all sizes.
-- Target Hook: bool TARGET_MS_BITFIELD_LAYOUT_P (const_tree
RECORD_TYPE)
This target hook returns `true' if bit-fields in the given
RECORD_TYPE are to be laid out following the rules of Microsoft
Visual C/C++, namely: (i) a bit-field won't share the same storage
unit with the previous bit-field if their underlying types have
different sizes, and the bit-field will be aligned to the highest
alignment of the underlying types of itself and of the previous
bit-field; (ii) a zero-sized bit-field will affect the alignment of
the whole enclosing structure, even if it is unnamed; except that
(iii) a zero-sized bit-field will be disregarded unless it follows
another bit-field of nonzero size. If this hook returns `true',
other macros that control bit-field layout are ignored.
When a bit-field is inserted into a packed record, the whole size
of the underlying type is used by one or more same-size adjacent
bit-fields (that is, if its long:3, 32 bits is used in the record,
and any additional adjacent long bit-fields are packed into the
same chunk of 32 bits. However, if the size changes, a new field
of that size is allocated). In an unpacked record, this is the
same as using alignment, but not equivalent when packing.
If both MS bit-fields and `__attribute__((packed))' are used, the
latter will take precedence. If `__attribute__((packed))' is used
on a single field when MS bit-fields are in use, it will take
precedence for that field, but the alignment of the rest of the
structure may affect its placement.
-- Target Hook: bool TARGET_DECIMAL_FLOAT_SUPPORTED_P (void)
Returns true if the target supports decimal floating point.
-- Target Hook: bool TARGET_FIXED_POINT_SUPPORTED_P (void)
Returns true if the target supports fixed-point arithmetic.
-- Target Hook: void TARGET_EXPAND_TO_RTL_HOOK (void)
This hook is called just before expansion into rtl, allowing the
target to perform additional initializations or analysis before
the expansion. For example, the rs6000 port uses it to allocate a
scratch stack slot for use in copying SDmode values between memory
and floating point registers whenever the function being expanded
has any SDmode usage.
-- Target Hook: void TARGET_INSTANTIATE_DECLS (void)
This hook allows the backend to perform additional instantiations
on rtl that are not actually in any insns yet, but will be later.
-- Target Hook: const char * TARGET_MANGLE_TYPE (const_tree TYPE)
If your target defines any fundamental types, or any types your
target uses should be mangled differently from the default, define
this hook to return the appropriate encoding for these types as
part of a C++ mangled name. The TYPE argument is the tree
structure representing the type to be mangled. The hook may be
applied to trees which are not target-specific fundamental types;
it should return `NULL' for all such types, as well as arguments
it does not recognize. If the return value is not `NULL', it must
point to a statically-allocated string constant.
Target-specific fundamental types might be new fundamental types or
qualified versions of ordinary fundamental types. Encode new
fundamental types as `u N NAME', where NAME is the name used for
the type in source code, and N is the length of NAME in decimal.
Encode qualified versions of ordinary types as `U N NAME CODE',
where NAME is the name used for the type qualifier in source code,
N is the length of NAME as above, and CODE is the code used to
represent the unqualified version of this type. (See
`write_builtin_type' in `cp/mangle.c' for the list of codes.) In
both cases the spaces are for clarity; do not include any spaces
in your string.
This hook is applied to types prior to typedef resolution. If the
mangled name for a particular type depends only on that type's
main variant, you can perform typedef resolution yourself using
`TYPE_MAIN_VARIANT' before mangling.
The default version of this hook always returns `NULL', which is
appropriate for a target that does not define any new fundamental
types.
File: gccint.info, Node: Type Layout, Next: Registers, Prev: Storage Layout, Up: Target Macros
17.6 Layout of Source Language Data Types
=========================================
These macros define the sizes and other characteristics of the standard
basic data types used in programs being compiled. Unlike the macros in
the previous section, these apply to specific features of C and related
languages, rather than to fundamental aspects of storage layout.
-- Macro: 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.
-- Macro: 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.)
-- Macro: 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.
-- Macro: ADA_LONG_TYPE_SIZE
On some machines, the size used for the Ada equivalent of the type
`long' by a native Ada compiler differs from that used by C. In
that situation, define this macro to be a C expression to be used
for the size of that type. If you don't define this, the default
is the value of `LONG_TYPE_SIZE'.
-- Macro: 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. If you want to support GNU Ada on your machine, the value
of this macro must be at least 64.
-- Macro: 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
`BITS_PER_UNIT'.
-- Macro: BOOL_TYPE_SIZE
A C expression for the size in bits of the C++ type `bool' and C99
type `_Bool' on the target machine. If you don't define this, and
you probably shouldn't, the default is `CHAR_TYPE_SIZE'.
-- Macro: 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.
-- Macro: 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.
-- Macro: 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.
-- Macro: SHORT_FRACT_TYPE_SIZE
A C expression for the size in bits of the type `short _Fract' on
the target machine. If you don't define this, the default is
`BITS_PER_UNIT'.
-- Macro: FRACT_TYPE_SIZE
A C expression for the size in bits of the type `_Fract' on the
target machine. If you don't define this, the default is
`BITS_PER_UNIT * 2'.
-- Macro: LONG_FRACT_TYPE_SIZE
A C expression for the size in bits of the type `long _Fract' on
the target machine. If you don't define this, the default is
`BITS_PER_UNIT * 4'.
-- Macro: LONG_LONG_FRACT_TYPE_SIZE
A C expression for the size in bits of the type `long long _Fract'
on the target machine. If you don't define this, the default is
`BITS_PER_UNIT * 8'.
-- Macro: SHORT_ACCUM_TYPE_SIZE
A C expression for the size in bits of the type `short _Accum' on
the target machine. If you don't define this, the default is
`BITS_PER_UNIT * 2'.
-- Macro: ACCUM_TYPE_SIZE
A C expression for the size in bits of the type `_Accum' on the
target machine. If you don't define this, the default is
`BITS_PER_UNIT * 4'.
-- Macro: LONG_ACCUM_TYPE_SIZE
A C expression for the size in bits of the type `long _Accum' on
the target machine. If you don't define this, the default is
`BITS_PER_UNIT * 8'.
-- Macro: LONG_LONG_ACCUM_TYPE_SIZE
A C expression for the size in bits of the type `long long _Accum'
on the target machine. If you don't define this, the default is
`BITS_PER_UNIT * 16'.
-- Macro: LIBGCC2_LONG_DOUBLE_TYPE_SIZE
Define this macro if `LONG_DOUBLE_TYPE_SIZE' is not constant or if
you want routines in `libgcc2.a' for a size other than
`LONG_DOUBLE_TYPE_SIZE'. If you don't define this, the default is
`LONG_DOUBLE_TYPE_SIZE'.
-- Macro: LIBGCC2_HAS_DF_MODE
Define this macro if neither `DOUBLE_TYPE_SIZE' nor
`LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is `DFmode' but you want `DFmode'
routines in `libgcc2.a' anyway. If you don't define this and
either `DOUBLE_TYPE_SIZE' or `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 64
then the default is 1, otherwise it is 0.
-- Macro: LIBGCC2_HAS_XF_MODE
Define this macro if `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is not
`XFmode' but you want `XFmode' routines in `libgcc2.a' anyway. If
you don't define this and `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 80
then the default is 1, otherwise it is 0.
-- Macro: LIBGCC2_HAS_TF_MODE
Define this macro if `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is not
`TFmode' but you want `TFmode' routines in `libgcc2.a' anyway. If
you don't define this and `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 128
then the default is 1, otherwise it is 0.
-- Macro: SF_SIZE
-- Macro: DF_SIZE
-- Macro: XF_SIZE
-- Macro: TF_SIZE
Define these macros to be the size in bits of the mantissa of
`SFmode', `DFmode', `XFmode' and `TFmode' values, if the defaults
in `libgcc2.h' are inappropriate. By default, `FLT_MANT_DIG' is
used for `SF_SIZE', `LDBL_MANT_DIG' for `XF_SIZE' and `TF_SIZE',
and `DBL_MANT_DIG' or `LDBL_MANT_DIG' for `DF_SIZE' according to
whether `DOUBLE_TYPE_SIZE' or `LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is
64.
-- Macro: TARGET_FLT_EVAL_METHOD
A C expression for the value for `FLT_EVAL_METHOD' in `float.h',
assuming, if applicable, that the floating-point control word is
in its default state. If you do not define this macro the value of
`FLT_EVAL_METHOD' will be zero.
-- Macro: WIDEST_HARDWARE_FP_SIZE
A C expression for the size in bits of the widest floating-point
format supported by the hardware. If you define this macro, you
must specify a value less than or equal to the value of
`LONG_DOUBLE_TYPE_SIZE'. If you do not define this macro, the
value of `LONG_DOUBLE_TYPE_SIZE' is the default.
-- Macro: 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'.
-- Target Hook: bool TARGET_DEFAULT_SHORT_ENUMS (void)
This target hook should return true if the compiler should give an
`enum' type only as many bytes as it takes to represent the range
of possible values of that type. It should return false if all
`enum' types should be allocated like `int'.
The default is to return false.
-- Macro: SIZE_TYPE
A C expression for a string describing the name of the data type
to use for size values. The typedef name `size_t' is defined
using the contents of the string.
The string can contain more than one keyword. If so, separate
them with spaces, and write first any length keyword, then
`unsigned' if appropriate, and finally `int'. The string must
exactly match one of the data type names defined in the function
`init_decl_processing' in the file `c-decl.c'. You may not omit
`int' or change the order--that would cause the compiler to crash
on startup.
If you don't define this macro, the default is `"long unsigned
int"'.
-- Macro: PTRDIFF_TYPE
A C expression for a string describing the name of the data type
to use for the result of subtracting two pointers. The typedef
name `ptrdiff_t' is defined using the contents of the string. See
`SIZE_TYPE' above for more information.
If you don't define this macro, the default is `"long int"'.
-- Macro: WCHAR_TYPE
A C expression for a string describing the name of the data type
to use for wide characters. The typedef name `wchar_t' is defined
using the contents of the string. See `SIZE_TYPE' above for more
information.
If you don't define this macro, the default is `"int"'.
-- Macro: WCHAR_TYPE_SIZE
A C expression for the size in bits of the data type for wide
characters. This is used in `cpp', which cannot make use of
`WCHAR_TYPE'.
-- Macro: WINT_TYPE
A C expression for a string describing the name of the data type to
use for wide characters passed to `printf' and returned from
`getwc'. The typedef name `wint_t' is defined using the contents
of the string. See `SIZE_TYPE' above for more information.
If you don't define this macro, the default is `"unsigned int"'.
-- Macro: INTMAX_TYPE
A C expression for a string describing the name of the data type
that can represent any value of any standard or extended signed
integer type. The typedef name `intmax_t' is defined using the
contents of the string. See `SIZE_TYPE' above for more
information.
If you don't define this macro, the default is the first of
`"int"', `"long int"', or `"long long int"' that has as much
precision as `long long int'.
-- Macro: UINTMAX_TYPE
A C expression for a string describing the name of the data type
that can represent any value of any standard or extended unsigned
integer type. The typedef name `uintmax_t' is defined using the
contents of the string. See `SIZE_TYPE' above for more
information.
If you don't define this macro, the default is the first of
`"unsigned int"', `"long unsigned int"', or `"long long unsigned
int"' that has as much precision as `long long unsigned int'.
-- Macro: SIG_ATOMIC_TYPE
-- Macro: INT8_TYPE
-- Macro: INT16_TYPE
-- Macro: INT32_TYPE
-- Macro: INT64_TYPE
-- Macro: UINT8_TYPE
-- Macro: UINT16_TYPE
-- Macro: UINT32_TYPE
-- Macro: UINT64_TYPE
-- Macro: INT_LEAST8_TYPE
-- Macro: INT_LEAST16_TYPE
-- Macro: INT_LEAST32_TYPE
-- Macro: INT_LEAST64_TYPE
-- Macro: UINT_LEAST8_TYPE
-- Macro: UINT_LEAST16_TYPE
-- Macro: UINT_LEAST32_TYPE
-- Macro: UINT_LEAST64_TYPE
-- Macro: INT_FAST8_TYPE
-- Macro: INT_FAST16_TYPE
-- Macro: INT_FAST32_TYPE
-- Macro: INT_FAST64_TYPE
-- Macro: UINT_FAST8_TYPE
-- Macro: UINT_FAST16_TYPE
-- Macro: UINT_FAST32_TYPE
-- Macro: UINT_FAST64_TYPE
-- Macro: INTPTR_TYPE
-- Macro: UINTPTR_TYPE
C expressions for the standard types `sig_atomic_t', `int8_t',
`int16_t', `int32_t', `int64_t', `uint8_t', `uint16_t',
`uint32_t', `uint64_t', `int_least8_t', `int_least16_t',
`int_least32_t', `int_least64_t', `uint_least8_t',
`uint_least16_t', `uint_least32_t', `uint_least64_t',
`int_fast8_t', `int_fast16_t', `int_fast32_t', `int_fast64_t',
`uint_fast8_t', `uint_fast16_t', `uint_fast32_t', `uint_fast64_t',
`intptr_t', and `uintptr_t'. See `SIZE_TYPE' above for more
information.
If any of these macros evaluates to a null pointer, the
corresponding type is not supported; if GCC is configured to
provide `<stdint.h>' in such a case, the header provided may not
conform to C99, depending on the type in question. The defaults
for all of these macros are null pointers.
-- Macro: TARGET_PTRMEMFUNC_VBIT_LOCATION
The C++ compiler represents a pointer-to-member-function with a
struct that looks like:
struct {
union {
void (*fn)();
ptrdiff_t vtable_index;
};
ptrdiff_t delta;
};
The C++ compiler must use one bit to indicate whether the function
that will be called through a pointer-to-member-function is
virtual. Normally, we assume that the low-order bit of a function
pointer must always be zero. Then, by ensuring that the
vtable_index is odd, we can distinguish which variant of the union
is in use. But, on some platforms function pointers can be odd,
and so this doesn't work. In that case, we use the low-order bit
of the `delta' field, and shift the remainder of the `delta' field
to the left.
GCC will automatically make the right selection about where to
store this bit using the `FUNCTION_BOUNDARY' setting for your
platform. However, some platforms such as ARM/Thumb have
`FUNCTION_BOUNDARY' set such that functions always start at even
addresses, but the lowest bit of pointers to functions indicate
whether the function at that address is in ARM or Thumb mode. If
this is the case of your architecture, you should define this
macro to `ptrmemfunc_vbit_in_delta'.
In general, you should not have to define this macro. On
architectures in which function addresses are always even,
according to `FUNCTION_BOUNDARY', GCC will automatically define
this macro to `ptrmemfunc_vbit_in_pfn'.
-- Macro: TARGET_VTABLE_USES_DESCRIPTORS
Normally, the C++ compiler uses function pointers in vtables. This
macro allows the target to change to use "function descriptors"
instead. Function descriptors are found on targets for whom a
function pointer is actually a small data structure. Normally the
data structure consists of the actual code address plus a data
pointer to which the function's data is relative.
If vtables are used, the value of this macro should be the number
of words that the function descriptor occupies.
-- Macro: TARGET_VTABLE_ENTRY_ALIGN
By default, the vtable entries are void pointers, the so the
alignment is the same as pointer alignment. The value of this
macro specifies the alignment of the vtable entry in bits. It
should be defined only when special alignment is necessary. */
-- Macro: TARGET_VTABLE_DATA_ENTRY_DISTANCE
There are a few non-descriptor entries in the vtable at offsets
below zero. If these entries must be padded (say, to preserve the
alignment specified by `TARGET_VTABLE_ENTRY_ALIGN'), set this to
the number of words in each data entry.
File: gccint.info, Node: Registers, Next: Register Classes, Prev: Type Layout, Up: Target Macros
17.7 Register Usage
===================
This section explains how to describe what registers the target machine
has, and how (in general) they can be used.
The description of which registers a specific instruction can use is
done with register classes; see *note Register Classes::. For
information on using registers to access a stack frame, see *note Frame
Registers::. For passing values in registers, see *note Register
Arguments::. For returning values in registers, see *note Scalar
Return::.
* Menu:
* Register Basics:: Number and kinds of registers.
* Allocation Order:: Order in which registers are allocated.
* Values in Registers:: What kinds of values each reg can hold.
* Leaf Functions:: Renumbering registers for leaf functions.
* Stack Registers:: Handling a register stack such as 80387.
File: gccint.info, Node: Register Basics, Next: Allocation Order, Up: Registers
17.7.1 Basic Characteristics of Registers
-----------------------------------------
Registers have various characteristics.
-- Macro: FIRST_PSEUDO_REGISTER
Number of hardware registers known to the compiler. They receive
numbers 0 through `FIRST_PSEUDO_REGISTER-1'; thus, the first
pseudo register's number really is assigned the number
`FIRST_PSEUDO_REGISTER'.
-- Macro: FIXED_REGISTERS
An initializer that says which registers are used for fixed
purposes all throughout the compiled code and are therefore not
available for general allocation. These would include the stack
pointer, the frame pointer (except on machines where that can be
used as a general register when no frame pointer is needed), the
program counter on machines where that is considered one of the
addressable registers, and any other numbered register with a
standard use.
This information is expressed as a sequence of numbers, separated
by commas and surrounded by braces. The Nth number is 1 if
register N is fixed, 0 otherwise.
The table initialized from this macro, and the table initialized by
the following one, may be overridden at run time either
automatically, by the actions of the macro
`CONDITIONAL_REGISTER_USAGE', or by the user with the command
options `-ffixed-REG', `-fcall-used-REG' and `-fcall-saved-REG'.
-- Macro: CALL_USED_REGISTERS
Like `FIXED_REGISTERS' but has 1 for each register that is
clobbered (in general) by function calls as well as for fixed
registers. This macro therefore identifies the registers that are
not available for general allocation of values that must live
across function calls.
If a register has 0 in `CALL_USED_REGISTERS', the compiler
automatically saves it on function entry and restores it on
function exit, if the register is used within the function.
-- Macro: CALL_REALLY_USED_REGISTERS
Like `CALL_USED_REGISTERS' except this macro doesn't require that
the entire set of `FIXED_REGISTERS' be included.
(`CALL_USED_REGISTERS' must be a superset of `FIXED_REGISTERS').
This macro is optional. If not specified, it defaults to the value
of `CALL_USED_REGISTERS'.
-- Macro: HARD_REGNO_CALL_PART_CLOBBERED (REGNO, MODE)
A C expression that is nonzero if it is not permissible to store a
value of mode MODE in hard register number REGNO across a call
without some part of it being clobbered. For most machines this
macro need not be defined. It is only required for machines that
do not preserve the entire contents of a register across a call.
-- Target Hook: void TARGET_CONDITIONAL_REGISTER_USAGE (void)
This hook may conditionally modify five variables `fixed_regs',
`call_used_regs', `global_regs', `reg_names', and
`reg_class_contents', to take into account any dependence of these
register sets on target flags. The first three of these are of
type `char []' (interpreted as Boolean vectors). `global_regs' is
a `const char *[]', and `reg_class_contents' is a `HARD_REG_SET'.
Before the macro is called, `fixed_regs', `call_used_regs',
`reg_class_contents', and `reg_names' have been initialized from
`FIXED_REGISTERS', `CALL_USED_REGISTERS', `REG_CLASS_CONTENTS',
and `REGISTER_NAMES', respectively. `global_regs' has been
cleared, and any `-ffixed-REG', `-fcall-used-REG' and
`-fcall-saved-REG' command options have been applied.
If the usage of an entire class of registers depends on the target
flags, you may indicate this to GCC by using this macro to modify
`fixed_regs' and `call_used_regs' to 1 for each of the registers
in the classes which should not be used by GCC. Also define the
macro `REG_CLASS_FROM_LETTER' / `REG_CLASS_FROM_CONSTRAINT' to
return `NO_REGS' if it is called with a letter for a class that
shouldn't be used.
(However, if this class is not included in `GENERAL_REGS' and all
of the insn patterns whose constraints permit this class are
controlled by target switches, then GCC will automatically avoid
using these registers when the target switches are opposed to
them.)
-- Macro: INCOMING_REGNO (OUT)
Define this macro if the target machine has register windows.
This C expression returns the register number as seen by the
called function corresponding to the register number OUT as seen
by the calling function. Return OUT if register number OUT is not
an outbound register.
-- Macro: OUTGOING_REGNO (IN)
Define this macro if the target machine has register windows.
This C expression returns the register number as seen by the
calling function corresponding to the register number IN as seen
by the called function. Return IN if register number IN is not an
inbound register.
-- Macro: LOCAL_REGNO (REGNO)
Define this macro if the target machine has register windows.
This C expression returns true if the register is call-saved but
is in the register window. Unlike most call-saved registers, such
registers need not be explicitly restored on function exit or
during non-local gotos.
-- Macro: PC_REGNUM
If the program counter has a register number, define this as that
register number. Otherwise, do not define it.
File: gccint.info, Node: Allocation Order, Next: Values in Registers, Prev: Register Basics, Up: Registers
17.7.2 Order of Allocation of Registers
---------------------------------------
Registers are allocated in order.
-- Macro: REG_ALLOC_ORDER
If defined, an initializer for a vector of integers, containing the
numbers of hard registers in the order in which GCC should prefer
to use them (from most preferred to least).
If this macro is not defined, registers are used lowest numbered
first (all else being equal).
One use of this macro is on machines where the highest numbered
registers must always be saved and the save-multiple-registers
instruction supports only sequences of consecutive registers. On
such machines, define `REG_ALLOC_ORDER' to be an initializer that
lists the highest numbered allocable register first.
-- Macro: ADJUST_REG_ALLOC_ORDER
A C statement (sans semicolon) to choose the order in which to
allocate hard registers for pseudo-registers local to a basic
block.
Store the desired register order in the array `reg_alloc_order'.
Element 0 should be the register to allocate first; element 1, the
next register; and so on.
The macro body should not assume anything about the contents of
`reg_alloc_order' before execution of the macro.
On most machines, it is not necessary to define this macro.
-- Macro: HONOR_REG_ALLOC_ORDER
Normally, IRA tries to estimate the costs for saving a register in
the prologue and restoring it in the epilogue. This discourages
it from using call-saved registers. If a machine wants to ensure
that IRA allocates registers in the order given by REG_ALLOC_ORDER
even if some call-saved registers appear earlier than call-used
ones, this macro should be defined.
-- Macro: IRA_HARD_REGNO_ADD_COST_MULTIPLIER (REGNO)
In some case register allocation order is not enough for the
Integrated Register Allocator (IRA) to generate a good code. If
this macro is defined, it should return a floating point value
based on REGNO. The cost of using REGNO for a pseudo will be
increased by approximately the pseudo's usage frequency times the
value returned by this macro. Not defining this macro is
equivalent to having it always return `0.0'.
On most machines, it is not necessary to define this macro.
File: gccint.info, Node: Values in Registers, Next: Leaf Functions, Prev: Allocation Order, Up: Registers
17.7.3 How Values Fit in Registers
----------------------------------
This section discusses the macros that describe which kinds of values
(specifically, which machine modes) each register can hold, and how many
consecutive registers are needed for a given mode.
-- Macro: HARD_REGNO_NREGS (REGNO, MODE)
A C expression for the number of consecutive hard registers,
starting at register number REGNO, required to hold a value of mode
MODE. This macro must never return zero, even if a register
cannot hold the requested mode - indicate that with
HARD_REGNO_MODE_OK and/or CANNOT_CHANGE_MODE_CLASS instead.
On a machine where all registers are exactly one word, a suitable
definition of this macro is
#define HARD_REGNO_NREGS(REGNO, MODE) \
((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \
/ UNITS_PER_WORD)
-- Macro: HARD_REGNO_NREGS_HAS_PADDING (REGNO, MODE)
A C expression that is nonzero if a value of mode MODE, stored in
memory, ends with padding that causes it to take up more space than
in registers starting at register number REGNO (as determined by
multiplying GCC's notion of the size of the register when
containing this mode by the number of registers returned by
`HARD_REGNO_NREGS'). By default this is zero.
For example, if a floating-point value is stored in three 32-bit
registers but takes up 128 bits in memory, then this would be
nonzero.
This macros only needs to be defined if there are cases where
`subreg_get_info' would otherwise wrongly determine that a
`subreg' can be represented by an offset to the register number,
when in fact such a `subreg' would contain some of the padding not
stored in registers and so not be representable.
-- Macro: HARD_REGNO_NREGS_WITH_PADDING (REGNO, MODE)
For values of REGNO and MODE for which
`HARD_REGNO_NREGS_HAS_PADDING' returns nonzero, a C expression
returning the greater number of registers required to hold the
value including any padding. In the example above, the value
would be four.
-- Macro: REGMODE_NATURAL_SIZE (MODE)
Define this macro if the natural size of registers that hold values
of mode MODE is not the word size. It is a C expression that
should give the natural size in bytes for the specified mode. It
is used by the register allocator to try to optimize its results.
This happens for example on SPARC 64-bit where the natural size of
floating-point registers is still 32-bit.
-- Macro: HARD_REGNO_MODE_OK (REGNO, MODE)
A C expression that is nonzero if it is permissible to store a
value of mode MODE in hard register number REGNO (or in several
registers starting with that one). For a machine where all
registers are equivalent, a suitable definition is
#define HARD_REGNO_MODE_OK(REGNO, MODE) 1
You need not include code to check for the numbers of fixed
registers, because the allocation mechanism considers them to be
always occupied.
On some machines, double-precision values must be kept in even/odd
register pairs. You can implement that by defining this macro to
reject odd register numbers for such modes.
The minimum requirement for a mode to be OK in a register is that
the `movMODE' instruction pattern support moves between the
register and other hard register in the same class and that moving
a value into the register and back out not alter it.
Since the same instruction used to move `word_mode' will work for
all narrower integer modes, it is not necessary on any machine for
`HARD_REGNO_MODE_OK' to distinguish between these modes, provided
you define patterns `movhi', etc., to take advantage of this. This
is useful because of the interaction between `HARD_REGNO_MODE_OK'
and `MODES_TIEABLE_P'; it is very desirable for all integer modes
to be tieable.
Many machines have special registers for floating point arithmetic.
Often people assume that floating point machine modes are allowed
only in floating point registers. This is not true. Any
registers that can hold integers can safely _hold_ a floating
point machine mode, whether or not floating arithmetic can be done
on it in those registers. Integer move instructions can be used
to move the values.
On some machines, though, the converse is true: fixed-point machine
modes may not go in floating registers. This is true if the
floating registers normalize any value stored in them, because
storing a non-floating value there would garble it. In this case,
`HARD_REGNO_MODE_OK' should reject fixed-point machine modes in
floating registers. But if the floating registers do not
automatically normalize, if you can store any bit pattern in one
and retrieve it unchanged without a trap, then any machine mode
may go in a floating register, so you can define this macro to say
so.
The primary significance of special floating registers is rather
that they are the registers acceptable in floating point arithmetic
instructions. However, this is of no concern to
`HARD_REGNO_MODE_OK'. You handle it by writing the proper
constraints for those instructions.
On some machines, the floating registers are especially slow to
access, so that it is better to store a value in a stack frame
than in such a register if floating point arithmetic is not being
done. As long as the floating registers are not in class
`GENERAL_REGS', they will not be used unless some pattern's
constraint asks for one.
-- Macro: HARD_REGNO_RENAME_OK (FROM, TO)
A C expression that is nonzero if it is OK to rename a hard
register FROM to another hard register TO.
One common use of this macro is to prevent renaming of a register
to another register that is not saved by a prologue in an interrupt
handler.
The default is always nonzero.
-- Macro: MODES_TIEABLE_P (MODE1, MODE2)
A C expression that is nonzero if a value of mode MODE1 is
accessible in mode MODE2 without copying.
If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R,
MODE2)' are always the same for any R, then `MODES_TIEABLE_P
(MODE1, MODE2)' should be nonzero. If they differ for any R, you
should define this macro to return zero unless some other
mechanism ensures the accessibility of the value in a narrower
mode.
You should define this macro to return nonzero in as many cases as
possible since doing so will allow GCC to perform better register
allocation.
-- Target Hook: bool TARGET_HARD_REGNO_SCRATCH_OK (unsigned int REGNO)
This target hook should return `true' if it is OK to use a hard
register REGNO as scratch reg in peephole2.
One common use of this macro is to prevent using of a register that
is not saved by a prologue in an interrupt handler.
The default version of this hook always returns `true'.
-- Macro: AVOID_CCMODE_COPIES
Define this macro if the compiler should avoid copies to/from
`CCmode' registers. You should only define this macro if support
for copying to/from `CCmode' is incomplete.
File: gccint.info, Node: Leaf Functions, Next: Stack Registers, Prev: Values in Registers, Up: Registers
17.7.4 Handling Leaf Functions
------------------------------
On some machines, a leaf function (i.e., one which makes no calls) can
run more efficiently if it does not make its own register window.
Often this means it is required to receive its arguments in the
registers where they are passed by the caller, instead of the registers
where they would normally arrive.
The special treatment for leaf functions generally applies only when
other conditions are met; for example, often they may use only those
registers for its own variables and temporaries. We use the term "leaf
function" to mean a function that is suitable for this special
handling, so that functions with no calls are not necessarily "leaf
functions".
GCC assigns register numbers before it knows whether the function is
suitable for leaf function treatment. So it needs to renumber the
registers in order to output a leaf function. The following macros
accomplish this.
-- Macro: LEAF_REGISTERS
Name of a char vector, indexed by hard register number, which
contains 1 for a register that is allowable in a candidate for leaf
function treatment.
If leaf function treatment involves renumbering the registers,
then the registers marked here should be the ones before
renumbering--those that GCC would ordinarily allocate. The
registers which will actually be used in the assembler code, after
renumbering, should not be marked with 1 in this vector.
Define this macro only if the target machine offers a way to
optimize the treatment of leaf functions.
-- Macro: LEAF_REG_REMAP (REGNO)
A C expression whose value is the register number to which REGNO
should be renumbered, when a function is treated as a leaf
function.
If REGNO is a register number which should not appear in a leaf
function before renumbering, then the expression should yield -1,
which will cause the compiler to abort.
Define this macro only if the target machine offers a way to
optimize the treatment of leaf functions, and registers need to be
renumbered to do this.
`TARGET_ASM_FUNCTION_PROLOGUE' and `TARGET_ASM_FUNCTION_EPILOGUE' must
usually treat leaf functions specially. They can test the C variable
`current_function_is_leaf' which is nonzero for leaf functions.
`current_function_is_leaf' is set prior to local register allocation
and is valid for the remaining compiler passes. They can also test the
C variable `current_function_uses_only_leaf_regs' which is nonzero for
leaf functions which only use leaf registers.
`current_function_uses_only_leaf_regs' is valid after all passes that
modify the instructions have been run and is only useful if
`LEAF_REGISTERS' is defined.
File: gccint.info, Node: Stack Registers, Prev: Leaf Functions, Up: Registers
17.7.5 Registers That Form a Stack
----------------------------------
There are special features to handle computers where some of the
"registers" form a stack. Stack registers are normally written by
pushing onto the stack, and are numbered relative to the top of the
stack.
Currently, GCC can only handle one group of stack-like registers, and
they must be consecutively numbered. Furthermore, the existing support
for stack-like registers is specific to the 80387 floating point
coprocessor. If you have a new architecture that uses stack-like
registers, you will need to do substantial work on `reg-stack.c' and
write your machine description to cooperate with it, as well as
defining these macros.
-- Macro: STACK_REGS
Define this if the machine has any stack-like registers.
-- Macro: STACK_REG_COVER_CLASS
This is a cover class containing the stack registers. Define this
if the machine has any stack-like registers.
-- Macro: FIRST_STACK_REG
The number of the first stack-like register. This one is the top
of the stack.
-- Macro: LAST_STACK_REG
The number of the last stack-like register. This one is the
bottom of the stack.
File: gccint.info, Node: Register Classes, Next: Old Constraints, Prev: Registers, Up: Target Macros
17.8 Register Classes
=====================
On many machines, the numbered registers are not all equivalent. For
example, certain registers may not be allowed for indexed addressing;
certain registers may not be allowed in some instructions. These
machine restrictions are described to the compiler using "register
classes".
You define a number of register classes, giving each one a name and
saying which of the registers belong to it. Then you can specify
register classes that are allowed as operands to particular instruction
patterns.
In general, each register will belong to several classes. In fact, one
class must be named `ALL_REGS' and contain all the registers. Another
class must be named `NO_REGS' and contain no registers. Often the
union of two classes will be another class; however, this is not
required.
One of the classes must be named `GENERAL_REGS'. There is nothing
terribly special about the name, but the operand constraint letters `r'
and `g' specify this class. If `GENERAL_REGS' is the same as
`ALL_REGS', just define it as a macro which expands to `ALL_REGS'.
Order the classes so that if class X is contained in class Y then X
has a lower class number than Y.
The way classes other than `GENERAL_REGS' are specified in operand
constraints is through machine-dependent operand constraint letters.
You can define such letters to correspond to various classes, then use
them in operand constraints.
You should define a class for the union of two classes whenever some
instruction allows both classes. For example, if an instruction allows
either a floating point (coprocessor) register or a general register
for a certain operand, you should define a class `FLOAT_OR_GENERAL_REGS'
which includes both of them. Otherwise you will get suboptimal code,
or even internal compiler errors when reload cannot find a register in
the the class computed via `reg_class_subunion'.
You must also specify certain redundant information about the register
classes: for each class, which classes contain it and which ones are
contained in it; for each pair of classes, the largest class contained
in their union.
When a value occupying several consecutive registers is expected in a
certain class, all the registers used must belong to that class.
Therefore, register classes cannot be used to enforce a requirement for
a register pair to start with an even-numbered register. The way to
specify this requirement is with `HARD_REGNO_MODE_OK'.
Register classes used for input-operands of bitwise-and or shift
instructions have a special requirement: each such class must have, for
each fixed-point machine mode, a subclass whose registers can transfer
that mode to or from memory. For example, on some machines, the
operations for single-byte values (`QImode') are limited to certain
registers. When this is so, each register class that is used in a
bitwise-and or shift instruction must have a subclass consisting of
registers from which single-byte values can be loaded or stored. This
is so that `PREFERRED_RELOAD_CLASS' can always have a possible value to
return.
-- Data type: enum reg_class
An enumerated type that must be defined with all the register
class names as enumerated values. `NO_REGS' must be first.
`ALL_REGS' must be the last register class, followed by one more
enumerated value, `LIM_REG_CLASSES', which is not a register class
but rather tells how many classes there are.
Each register class has a number, which is the value of casting
the class name to type `int'. The number serves as an index in
many of the tables described below.
-- Macro: N_REG_CLASSES
The number of distinct register classes, defined as follows:
#define N_REG_CLASSES (int) LIM_REG_CLASSES
-- Macro: REG_CLASS_NAMES
An initializer containing the names of the register classes as C
string constants. These names are used in writing some of the
debugging dumps.
-- Macro: REG_CLASS_CONTENTS
An initializer containing the contents of the register classes, as
integers which are bit masks. The Nth integer specifies the
contents of class N. The way the integer MASK is interpreted is
that register R is in the class if `MASK & (1 << R)' is 1.
When the machine has more than 32 registers, an integer does not
suffice. Then the integers are replaced by sub-initializers,
braced groupings containing several integers. Each
sub-initializer must be suitable as an initializer for the type
`HARD_REG_SET' which is defined in `hard-reg-set.h'. In this
situation, the first integer in each sub-initializer corresponds to
registers 0 through 31, the second integer to registers 32 through
63, and so on.
-- Macro: REGNO_REG_CLASS (REGNO)
A C expression whose value is a register class containing hard
register REGNO. In general there is more than one such class;
choose a class which is "minimal", meaning that no smaller class
also contains the register.
-- Macro: BASE_REG_CLASS
A macro whose definition is the name of the class to which a valid
base register must belong. A base register is one used in an
address which is the register value plus a displacement.
-- Macro: MODE_BASE_REG_CLASS (MODE)
This is a variation of the `BASE_REG_CLASS' macro which allows the
selection of a base register in a mode dependent manner. If MODE
is VOIDmode then it should return the same value as
`BASE_REG_CLASS'.
-- Macro: MODE_BASE_REG_REG_CLASS (MODE)
A C expression whose value is the register class to which a valid
base register must belong in order to be used in a base plus index
register address. You should define this macro if base plus index
addresses have different requirements than other base register
uses.
-- Macro: MODE_CODE_BASE_REG_CLASS (MODE, OUTER_CODE, INDEX_CODE)
A C expression whose value is the register class to which a valid
base register must belong. OUTER_CODE and INDEX_CODE define the
context in which the base register occurs. OUTER_CODE is the code
of the immediately enclosing expression (`MEM' for the top level
of an address, `ADDRESS' for something that occurs in an
`address_operand'). INDEX_CODE is the code of the corresponding
index expression if OUTER_CODE is `PLUS'; `SCRATCH' otherwise.
-- Macro: INDEX_REG_CLASS
A macro whose definition is the name of the class to which a valid
index register must belong. An index register is one used in an
address where its value is either multiplied by a scale factor or
added to another register (as well as added to a displacement).
-- Macro: REGNO_OK_FOR_BASE_P (NUM)
A C expression which is nonzero if register number NUM is suitable
for use as a base register in operand addresses.
-- Macro: REGNO_MODE_OK_FOR_BASE_P (NUM, MODE)
A C expression that is just like `REGNO_OK_FOR_BASE_P', except that
that expression may examine the mode of the memory reference in
MODE. You should define this macro if the mode of the memory
reference affects whether a register may be used as a base
register. If you define this macro, the compiler will use it
instead of `REGNO_OK_FOR_BASE_P'. The mode may be `VOIDmode' for
addresses that appear outside a `MEM', i.e., as an
`address_operand'.
-- Macro: REGNO_MODE_OK_FOR_REG_BASE_P (NUM, MODE)
A C expression which is nonzero if register number NUM is suitable
for use as a base register in base plus index operand addresses,
accessing memory in mode MODE. It may be either a suitable hard
register or a pseudo register that has been allocated such a hard
register. You should define this macro if base plus index
addresses have different requirements than other base register
uses.
Use of this macro is deprecated; please use the more general
`REGNO_MODE_CODE_OK_FOR_BASE_P'.
-- Macro: REGNO_MODE_CODE_OK_FOR_BASE_P (NUM, MODE, OUTER_CODE,
INDEX_CODE)
A C expression that is just like `REGNO_MODE_OK_FOR_BASE_P', except
that that expression may examine the context in which the register
appears in the memory reference. OUTER_CODE is the code of the
immediately enclosing expression (`MEM' if at the top level of the
address, `ADDRESS' for something that occurs in an
`address_operand'). INDEX_CODE is the code of the corresponding
index expression if OUTER_CODE is `PLUS'; `SCRATCH' otherwise.
The mode may be `VOIDmode' for addresses that appear outside a
`MEM', i.e., as an `address_operand'.
-- Macro: REGNO_OK_FOR_INDEX_P (NUM)
A C expression which is nonzero if register number NUM is suitable
for use as an index register in operand addresses. It may be
either a suitable hard register or a pseudo register that has been
allocated such a hard 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.
-- Target Hook: reg_class_t TARGET_PREFERRED_RENAME_CLASS (reg_class_t
RCLASS)
A target hook that places additional preference on the register
class to use when it is necessary to rename a register in class
RCLASS to another class, or perhaps NO_REGS, if no preferred
register class is found or hook `preferred_rename_class' is not
implemented. Sometimes returning a more restrictive class makes
better code. For example, on ARM, thumb-2 instructions using
`LO_REGS' may be smaller than instructions using `GENERIC_REGS'.
By returning `LO_REGS' from `preferred_rename_class', code size
can be reduced.
-- Target Hook: reg_class_t TARGET_PREFERRED_RELOAD_CLASS (rtx X,
reg_class_t RCLASS)
A target hook that places additional restrictions on the register
class to use when it is necessary to copy value X into a register
in class RCLASS. The value is a register class; perhaps RCLASS,
or perhaps another, smaller class.
The default version of this hook always returns value of `rclass'
argument.
Sometimes returning a more restrictive class makes better code.
For example, on the 68000, when X is an integer constant that is
in range for a `moveq' instruction, the value of this macro is
always `DATA_REGS' as long as RCLASS includes the data registers.
Requiring a data register guarantees that a `moveq' will be used.
One case where `TARGET_PREFERRED_RELOAD_CLASS' must not return
RCLASS is if X is a legitimate constant which cannot be loaded
into some register class. By returning `NO_REGS' you can force X
into a memory location. For example, rs6000 can load immediate
values into general-purpose registers, but does not have an
instruction for loading an immediate value into a floating-point
register, so `TARGET_PREFERRED_RELOAD_CLASS' returns `NO_REGS' when
X is a floating-point constant. If the constant can't be loaded
into any kind of register, code generation will be better if
`LEGITIMATE_CONSTANT_P' makes the constant illegitimate instead of
using `TARGET_PREFERRED_RELOAD_CLASS'.
If an insn has pseudos in it after register allocation, reload
will go through the alternatives and call repeatedly
`TARGET_PREFERRED_RELOAD_CLASS' to find the best one. Returning
`NO_REGS', in this case, makes reload add a `!' in front of the
constraint: the x86 back-end uses this feature to discourage usage
of 387 registers when math is done in the SSE registers (and vice
versa).
-- Macro: PREFERRED_RELOAD_CLASS (X, CLASS)
A C expression that places additional restrictions on the register
class to use when it is necessary to copy value X into a register
in class CLASS. The value is a register class; perhaps CLASS, or
perhaps another, smaller class. On many machines, the following
definition is safe:
#define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS
Sometimes returning a more restrictive class makes better code.
For example, on the 68000, when X is an integer constant that is
in range for a `moveq' instruction, the value of this macro is
always `DATA_REGS' as long as CLASS includes the data registers.
Requiring a data register guarantees that a `moveq' will be used.
One case where `PREFERRED_RELOAD_CLASS' must not return CLASS is
if X is a legitimate constant which cannot be loaded into some
register class. By returning `NO_REGS' you can force X into a
memory location. For example, rs6000 can load immediate values
into general-purpose registers, but does not have an instruction
for loading an immediate value into a floating-point register, so
`PREFERRED_RELOAD_CLASS' returns `NO_REGS' when X is a
floating-point constant. If the constant can't be loaded into any
kind of register, code generation will be better if
`LEGITIMATE_CONSTANT_P' makes the constant illegitimate instead of
using `PREFERRED_RELOAD_CLASS'.
If an insn has pseudos in it after register allocation, reload
will go through the alternatives and call repeatedly
`PREFERRED_RELOAD_CLASS' to find the best one. Returning
`NO_REGS', in this case, makes reload add a `!' in front of the
constraint: the x86 back-end uses this feature to discourage usage
of 387 registers when math is done in the SSE registers (and vice
versa).
-- Macro: PREFERRED_OUTPUT_RELOAD_CLASS (X, CLASS)
Like `PREFERRED_RELOAD_CLASS', but for output reloads instead of
input reloads. If you don't define this macro, the default is to
use CLASS, unchanged.
You can also use `PREFERRED_OUTPUT_RELOAD_CLASS' to discourage
reload from using some alternatives, like `PREFERRED_RELOAD_CLASS'.
-- Target Hook: reg_class_t TARGET_PREFERRED_OUTPUT_RELOAD_CLASS (rtx
X, reg_class_t RCLASS)
Like `TARGET_PREFERRED_RELOAD_CLASS', but for output reloads
instead of input reloads.
The default version of this hook always returns value of `rclass'
argument.
You can also use `TARGET_PREFERRED_OUTPUT_RELOAD_CLASS' to
discourage reload from using some alternatives, like
`TARGET_PREFERRED_RELOAD_CLASS'.
-- Macro: LIMIT_RELOAD_CLASS (MODE, CLASS)
A C expression that places additional restrictions on the register
class to use when it is necessary to be able to hold a value of
mode MODE in a reload register for which class CLASS would
ordinarily be used.
Unlike `PREFERRED_RELOAD_CLASS', this macro should be used when
there are certain modes that simply can't go in certain reload
classes.
The value is a register class; perhaps CLASS, or perhaps another,
smaller class.
Don't define this macro unless the target machine has limitations
which require the macro to do something nontrivial.
-- Target Hook: reg_class_t TARGET_SECONDARY_RELOAD (bool IN_P, rtx X,
reg_class_t RELOAD_CLASS, enum machine_mode RELOAD_MODE,
secondary_reload_info *SRI)
Many machines have some registers that cannot be copied directly
to or from memory or even from other types of registers. An
example is the `MQ' register, which on most machines, can only be
copied to or from general registers, but not memory. Below, we
shall be using the term 'intermediate register' when a move
operation cannot be performed directly, but has to be done by
copying the source into the intermediate register first, and then
copying the intermediate register to the destination. An
intermediate register always has the same mode as source and
destination. Since it holds the actual value being copied, reload
might apply optimizations to re-use an intermediate register and
eliding the copy from the source when it can determine that the
intermediate register still holds the required value.
Another kind of secondary reload is required on some machines which
allow copying all registers to and from memory, but require a
scratch register for stores to some memory locations (e.g., those
with symbolic address on the RT, and those with certain symbolic
address on the SPARC when compiling PIC). Scratch registers need
not have the same mode as the value being copied, and usually hold
a different value than that being copied. Special patterns in the
md file are needed to describe how the copy is performed with the
help of the scratch register; these patterns also describe the
number, register class(es) and mode(s) of the scratch register(s).
In some cases, both an intermediate and a scratch register are
required.
For input reloads, this target hook is called with nonzero IN_P,
and X is an rtx that needs to be copied to a register of class
RELOAD_CLASS in RELOAD_MODE. For output reloads, this target hook
is called with zero IN_P, and a register of class RELOAD_CLASS
needs to be copied to rtx X in RELOAD_MODE.
If copying a register of RELOAD_CLASS from/to X requires an
intermediate register, the hook `secondary_reload' should return
the register class required for this intermediate register. If no
intermediate register is required, it should return NO_REGS. If
more than one intermediate register is required, describe the one
that is closest in the copy chain to the reload register.
If scratch registers are needed, you also have to describe how to
perform the copy from/to the reload register to/from this closest
intermediate register. Or if no intermediate register is
required, but still a scratch register is needed, describe the
copy from/to the reload register to/from the reload operand X.
You do this by setting `sri->icode' to the instruction code of a
pattern in the md file which performs the move. Operands 0 and 1
are the output and input of this copy, respectively. Operands
from operand 2 onward are for scratch operands. These scratch
operands must have a mode, and a single-register-class output
constraint.
When an intermediate register is used, the `secondary_reload' hook
will be called again to determine how to copy the intermediate
register to/from the reload operand X, so your hook must also have
code to handle the register class of the intermediate operand.
X might be a pseudo-register or a `subreg' of a pseudo-register,
which could either be in a hard register or in memory. Use
`true_regnum' to find out; it will return -1 if the pseudo is in
memory and the hard register number if it is in a register.
Scratch operands in memory (constraint `"=m"' / `"=&m"') are
currently not supported. For the time being, you will have to
continue to use `SECONDARY_MEMORY_NEEDED' for that purpose.
`copy_cost' also uses this target hook to find out how values are
copied. If you want it to include some extra cost for the need to
allocate (a) scratch register(s), set `sri->extra_cost' to the
additional cost. Or if two dependent moves are supposed to have a
lower cost than the sum of the individual moves due to expected
fortuitous scheduling and/or special forwarding logic, you can set
`sri->extra_cost' to a negative amount.
-- Macro: SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
-- Macro: SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X)
-- Macro: SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X)
These macros are obsolete, new ports should use the target hook
`TARGET_SECONDARY_RELOAD' instead.
These are obsolete macros, replaced by the
`TARGET_SECONDARY_RELOAD' target hook. Older ports still define
these macros to indicate to the reload phase that it may need to
allocate at least one register for a reload in addition to the
register to contain the data. Specifically, if copying X to a
register CLASS in MODE requires an intermediate register, you were
supposed to define `SECONDARY_INPUT_RELOAD_CLASS' to return the
largest register class all of whose registers can be used as
intermediate registers or scratch registers.
If copying a register CLASS in MODE to X requires an intermediate
or scratch register, `SECONDARY_OUTPUT_RELOAD_CLASS' was supposed
to be defined be defined to return the largest register class
required. If the requirements for input and output reloads were
the same, the macro `SECONDARY_RELOAD_CLASS' should have been used
instead of defining both macros identically.
The values returned by these macros are often `GENERAL_REGS'.
Return `NO_REGS' if no spare register is needed; i.e., if X can be
directly copied to or from a register of CLASS in MODE without
requiring a scratch register. Do not define this macro if it
would always return `NO_REGS'.
If a scratch register is required (either with or without an
intermediate register), you were supposed to define patterns for
`reload_inM' or `reload_outM', as required (*note Standard
Names::. These patterns, which were normally implemented with a
`define_expand', should be similar to the `movM' patterns, except
that operand 2 is the scratch register.
These patterns need constraints for the reload register and scratch
register that contain a single register class. If the original
reload register (whose class is CLASS) can meet the constraint
given in the pattern, the value returned by these macros is used
for the class of the scratch register. Otherwise, two additional
reload registers are required. Their classes are obtained from
the constraints in the insn pattern.
X might be a pseudo-register or a `subreg' of a pseudo-register,
which could either be in a hard register or in memory. Use
`true_regnum' to find out; it will return -1 if the pseudo is in
memory and the hard register number if it is in a register.
These macros should not be used in the case where a particular
class of registers can only be copied to memory and not to another
class of registers. In that case, secondary reload registers are
not needed and would not be helpful. Instead, a stack location
must be used to perform the copy and the `movM' pattern should use
memory as an intermediate storage. This case often occurs between
floating-point and general registers.
-- Macro: SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M)
Certain machines have the property that some registers cannot be
copied to some other registers without using memory. Define this
macro on those machines to be a C expression that is nonzero if
objects of mode M in registers of CLASS1 can only be copied to
registers of class CLASS2 by storing a register of CLASS1 into
memory and loading that memory location into a register of CLASS2.
Do not define this macro if its value would always be zero.
-- Macro: SECONDARY_MEMORY_NEEDED_RTX (MODE)
Normally when `SECONDARY_MEMORY_NEEDED' is defined, the compiler
allocates a stack slot for a memory location needed for register
copies. If this macro is defined, the compiler instead uses the
memory location defined by this macro.
Do not define this macro if you do not define
`SECONDARY_MEMORY_NEEDED'.
-- Macro: SECONDARY_MEMORY_NEEDED_MODE (MODE)
When the compiler needs a secondary memory location to copy
between two registers of mode MODE, it normally allocates
sufficient memory to hold a quantity of `BITS_PER_WORD' bits and
performs the store and load operations in a mode that many bits
wide and whose class is the same as that of MODE.
This is right thing to do on most machines because it ensures that
all bits of the register are copied and prevents accesses to the
registers in a narrower mode, which some machines prohibit for
floating-point registers.
However, this default behavior is not correct on some machines,
such as the DEC Alpha, that store short integers in floating-point
registers differently than in integer registers. On those
machines, the default widening will not work correctly and you
must define this macro to suppress that widening in some cases.
See the file `alpha.h' for details.
Do not define this macro if you do not define
`SECONDARY_MEMORY_NEEDED' or if widening MODE to a mode that is
`BITS_PER_WORD' bits wide is correct for your machine.
-- Target Hook: bool TARGET_CLASS_LIKELY_SPILLED_P (reg_class_t RCLASS)
A target hook which returns `true' if pseudos that have been
assigned to registers of class RCLASS would likely be spilled
because registers of RCLASS are needed for spill registers.
The default version of this target hook returns `true' if RCLASS
has exactly one register and `false' otherwise. On most machines,
this default should be used. Only use this target hook to some
other expression if pseudos allocated by `local-alloc.c' end up in
memory because their hard registers were needed for spill
registers. If this target hook returns `false' for those classes,
those pseudos will only be allocated by `global.c', which knows
how to reallocate the pseudo to another register. If there would
not be another register available for reallocation, you should not
change the implementation of this target hook since the only
effect of such implementation would be to slow down register
allocation.
-- Macro: CLASS_MAX_NREGS (CLASS, MODE)
A C expression for the maximum number of consecutive registers of
class CLASS needed to hold a value of mode MODE.
This is closely related to the macro `HARD_REGNO_NREGS'. In fact,
the value of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be
the maximum value of `HARD_REGNO_NREGS (REGNO, MODE)' for all
REGNO values in the class CLASS.
This macro helps control the handling of multiple-word values in
the reload pass.
-- Macro: CANNOT_CHANGE_MODE_CLASS (FROM, TO, CLASS)
If defined, a C expression that returns nonzero for a CLASS for
which a change from mode FROM to mode TO is invalid.
For the example, loading 32-bit integer or floating-point objects
into floating-point registers on the Alpha extends them to 64 bits.
Therefore loading a 64-bit object and then storing it as a 32-bit
object does not store the low-order 32 bits, as would be the case
for a normal register. Therefore, `alpha.h' defines
`CANNOT_CHANGE_MODE_CLASS' as below:
#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
(GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \
? reg_classes_intersect_p (FLOAT_REGS, (CLASS)) : 0)
-- Target Hook: const reg_class_t * TARGET_IRA_COVER_CLASSES (void)
Return an array of cover classes for the Integrated Register
Allocator (IRA). Cover classes are a set of non-intersecting
register classes covering all hard registers used for register
allocation purposes. If a move between two registers in the same
cover class is possible, it should be cheaper than a load or store
of the registers. The array is terminated by a `LIM_REG_CLASSES'
element.
The order of cover classes in the array is important. If two
classes have the same cost of usage for a pseudo, the class
occurred first in the array is chosen for the pseudo.
This hook is called once at compiler startup, after the
command-line options have been processed. It is then re-examined
by every call to `target_reinit'.
The default implementation returns `IRA_COVER_CLASSES', if defined,
otherwise there is no default implementation. You must define
either this macro or `IRA_COVER_CLASSES' in order to use the
integrated register allocator with Chaitin-Briggs coloring. If the
macro is not defined, the only available coloring algorithm is
Chow's priority coloring.
This hook must not be modified from `NULL' to non-`NULL' or vice
versa by command-line option processing.
-- Macro: IRA_COVER_CLASSES
See the documentation for `TARGET_IRA_COVER_CLASSES'.
File: gccint.info, Node: Old Constraints, Next: Stack and Calling, Prev: Register Classes, Up: Target Macros
17.9 Obsolete Macros for Defining Constraints
=============================================
Machine-specific constraints can be defined with these macros instead
of the machine description constructs described in *note Define
Constraints::. This mechanism is obsolete. New ports should not use
it; old ports should convert to the new mechanism.
-- Macro: CONSTRAINT_LEN (CHAR, STR)
For the constraint at the start of STR, which starts with the
letter C, return the length. This allows you to have register
class / constant / extra constraints that are longer than a single
letter; you don't need to define this macro if you can do with
single-letter constraints only. The definition of this macro
should use DEFAULT_CONSTRAINT_LEN for all the characters that you
don't want to handle specially. There are some sanity checks in
genoutput.c that check the constraint lengths for the md file, so
you can also use this macro to help you while you are
transitioning from a byzantine single-letter-constraint scheme:
when you return a negative length for a constraint you want to
re-use, genoutput will complain about every instance where it is
used in the md file.
-- Macro: REG_CLASS_FROM_LETTER (CHAR)
A C expression which defines the machine-dependent operand
constraint letters for register classes. If CHAR is such a
letter, the value should be the register class corresponding to
it. Otherwise, the value should be `NO_REGS'. The register
letter `r', corresponding to class `GENERAL_REGS', will not be
passed to this macro; you do not need to handle it.
-- Macro: REG_CLASS_FROM_CONSTRAINT (CHAR, STR)
Like `REG_CLASS_FROM_LETTER', but you also get the constraint
string passed in STR, so that you can use suffixes to distinguish
between different variants.
-- Macro: CONST_OK_FOR_LETTER_P (VALUE, C)
A C expression that defines the machine-dependent operand
constraint letters (`I', `J', `K', ... `P') that specify
particular ranges of integer values. If C is one of those
letters, the expression should check that VALUE, an integer, is in
the appropriate range and return 1 if so, 0 otherwise. If C is
not one of those letters, the value should be 0 regardless of
VALUE.
-- Macro: CONST_OK_FOR_CONSTRAINT_P (VALUE, C, STR)
Like `CONST_OK_FOR_LETTER_P', but you also get the constraint
string passed in STR, so that you can use suffixes to distinguish
between different variants.
-- Macro: CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C)
A C expression that defines the machine-dependent operand
constraint letters that specify particular ranges of
`const_double' values (`G' or `H').
If C is one of those letters, the expression should check that
VALUE, an RTX of code `const_double', is in the appropriate range
and return 1 if so, 0 otherwise. If C is not one of those
letters, the value should be 0 regardless of VALUE.
`const_double' is used for all floating-point constants and for
`DImode' fixed-point constants. A given letter can accept either
or both kinds of values. It can use `GET_MODE' to distinguish
between these kinds.
-- Macro: CONST_DOUBLE_OK_FOR_CONSTRAINT_P (VALUE, C, STR)
Like `CONST_DOUBLE_OK_FOR_LETTER_P', but you also get the
constraint string passed in STR, so that you can use suffixes to
distinguish between different variants.
-- Macro: EXTRA_CONSTRAINT (VALUE, C)
A C expression that defines the optional machine-dependent
constraint letters that can be used to segregate specific types of
operands, usually memory references, for the target machine. Any
letter that is not elsewhere defined and not matched by
`REG_CLASS_FROM_LETTER' / `REG_CLASS_FROM_CONSTRAINT' may be used.
Normally this macro will not be defined.
If it is required for a particular target machine, it should
return 1 if VALUE corresponds to the operand type represented by
the constraint letter C. If C is not defined as an extra
constraint, the value returned should be 0 regardless of VALUE.
For example, on the ROMP, load instructions cannot have their
output in r0 if the memory reference contains a symbolic address.
Constraint letter `Q' is defined as representing a memory address
that does _not_ contain a symbolic address. An alternative is
specified with a `Q' constraint on the input and `r' on the
output. The next alternative specifies `m' on the input and a
register class that does not include r0 on the output.
-- Macro: EXTRA_CONSTRAINT_STR (VALUE, C, STR)
Like `EXTRA_CONSTRAINT', but you also get the constraint string
passed in STR, so that you can use suffixes to distinguish between
different variants.
-- Macro: EXTRA_MEMORY_CONSTRAINT (C, STR)
A C expression that defines the optional machine-dependent
constraint letters, amongst those accepted by `EXTRA_CONSTRAINT',
that should be treated like memory constraints by the reload pass.
It should return 1 if the operand type represented by the
constraint at the start of STR, the first letter of which is the
letter C, comprises a subset of all memory references including
all those whose address is simply a base register. This allows
the reload pass to reload an operand, if it does not directly
correspond to the operand type of C, by copying its address into a
base register.
For example, on the S/390, some instructions do not accept
arbitrary memory references, but only those that do not make use
of an index register. The constraint letter `Q' is defined via
`EXTRA_CONSTRAINT' as representing a memory address of this type.
If the letter `Q' is marked as `EXTRA_MEMORY_CONSTRAINT', a `Q'
constraint can handle any memory operand, because the reload pass
knows it can be reloaded by copying the memory address into a base
register if required. This is analogous to the way an `o'
constraint can handle any memory operand.
-- Macro: EXTRA_ADDRESS_CONSTRAINT (C, STR)
A C expression that defines the optional machine-dependent
constraint letters, amongst those accepted by `EXTRA_CONSTRAINT' /
`EXTRA_CONSTRAINT_STR', that should be treated like address
constraints by the reload pass.
It should return 1 if the operand type represented by the
constraint at the start of STR, which starts with the letter C,
comprises a subset of all memory addresses including all those
that consist of just a base register. This allows the reload pass
to reload an operand, if it does not directly correspond to the
operand type of STR, by copying it into a base register.
Any constraint marked as `EXTRA_ADDRESS_CONSTRAINT' can only be
used with the `address_operand' predicate. It is treated
analogously to the `p' constraint.
File: gccint.info, Node: Stack and Calling, Next: Varargs, Prev: Old Constraints, Up: Target Macros
17.10 Stack Layout and Calling Conventions
==========================================
This describes the stack layout and calling conventions.
* Menu:
* Frame Layout::
* Exception Handling::
* Stack Checking::
* Frame Registers::
* Elimination::
* Stack Arguments::
* Register Arguments::
* Scalar Return::
* Aggregate Return::
* Caller Saves::
* Function Entry::
* Profiling::
* Tail Calls::
* Stack Smashing Protection::
File: gccint.info, Node: Frame Layout, Next: Exception Handling, Up: Stack and Calling
17.10.1 Basic Stack Layout
--------------------------
Here is the basic stack layout.
-- Macro: STACK_GROWS_DOWNWARD
Define this macro if pushing a word onto the stack moves the stack
pointer to a smaller address.
When we say, "define this macro if ...", it means that the
compiler checks this macro only with `#ifdef' so the precise
definition used does not matter.
-- Macro: STACK_PUSH_CODE
This macro defines the operation used when something is pushed on
the stack. In RTL, a push operation will be `(set (mem
(STACK_PUSH_CODE (reg sp))) ...)'
The choices are `PRE_DEC', `POST_DEC', `PRE_INC', and `POST_INC'.
Which of these is correct depends on the stack direction and on
whether the stack pointer points to the last item on the stack or
whether it points to the space for the next item on the stack.
The default is `PRE_DEC' when `STACK_GROWS_DOWNWARD' is defined,
which is almost always right, and `PRE_INC' otherwise, which is
often wrong.
-- Macro: FRAME_GROWS_DOWNWARD
Define this macro to nonzero value if the addresses of local
variable slots are at negative offsets from the frame pointer.
-- Macro: ARGS_GROW_DOWNWARD
Define this macro if successive arguments to a function occupy
decreasing addresses on the stack.
-- Macro: STARTING_FRAME_OFFSET
Offset from the frame pointer to the first local variable slot to
be allocated.
If `FRAME_GROWS_DOWNWARD', find the next slot's offset by
subtracting the first slot's length from `STARTING_FRAME_OFFSET'.
Otherwise, it is found by adding the length of the first slot to
the value `STARTING_FRAME_OFFSET'.
-- Macro: STACK_ALIGNMENT_NEEDED
Define to zero to disable final alignment of the stack during
reload. The nonzero default for this macro is suitable for most
ports.
On ports where `STARTING_FRAME_OFFSET' is nonzero or where there
is a register save block following the local block that doesn't
require alignment to `STACK_BOUNDARY', it may be beneficial to
disable stack alignment and do it in the backend.
-- Macro: STACK_POINTER_OFFSET
Offset from the stack pointer register to the first location at
which outgoing arguments are placed. If not specified, the
default value of zero is used. This is the proper value for most
machines.
If `ARGS_GROW_DOWNWARD', this is the offset to the location above
the first location at which outgoing arguments are placed.
-- Macro: FIRST_PARM_OFFSET (FUNDECL)
Offset from the argument pointer register to the first argument's
address. On some machines it may depend on the data type of the
function.
If `ARGS_GROW_DOWNWARD', this is the offset to the location above
the first argument's address.
-- Macro: STACK_DYNAMIC_OFFSET (FUNDECL)
Offset from the stack pointer register to an item dynamically
allocated on the stack, e.g., by `alloca'.
The default value for this macro is `STACK_POINTER_OFFSET' plus the
length of the outgoing arguments. The default is correct for most
machines. See `function.c' for details.
-- Macro: INITIAL_FRAME_ADDRESS_RTX
A C expression whose value is RTL representing the address of the
initial stack frame. This address is passed to `RETURN_ADDR_RTX'
and `DYNAMIC_CHAIN_ADDRESS'. If you don't define this macro, a
reasonable default value will be used. Define this macro in order
to make frame pointer elimination work in the presence of
`__builtin_frame_address (count)' and `__builtin_return_address
(count)' for `count' not equal to zero.
-- Macro: DYNAMIC_CHAIN_ADDRESS (FRAMEADDR)
A C expression whose value is RTL representing the address in a
stack frame where the pointer to the caller's frame is stored.
Assume that FRAMEADDR is an RTL expression for the address of the
stack frame itself.
If you don't define this macro, the default is to return the value
of FRAMEADDR--that is, the stack frame address is also the address
of the stack word that points to the previous frame.
-- Macro: SETUP_FRAME_ADDRESSES
If defined, a C expression that produces the machine-specific code
to setup the stack so that arbitrary frames can be accessed. For
example, on the SPARC, we must flush all of the register windows
to the stack before we can access arbitrary stack frames. You
will seldom need to define this macro.
-- Target Hook: rtx TARGET_BUILTIN_SETJMP_FRAME_VALUE (void)
This target hook should return an rtx that is used to store the
address of the current frame into the built in `setjmp' buffer.
The default value, `virtual_stack_vars_rtx', is correct for most
machines. One reason you may need to define this target hook is if
`hard_frame_pointer_rtx' is the appropriate value on your machine.
-- Macro: FRAME_ADDR_RTX (FRAMEADDR)
A C expression whose value is RTL representing the value of the
frame address for the current frame. FRAMEADDR is the frame
pointer of the current frame. This is used for
__builtin_frame_address. You need only define this macro if the
frame address is not the same as the frame pointer. Most machines
do not need to define it.
-- Macro: RETURN_ADDR_RTX (COUNT, FRAMEADDR)
A C expression whose value is RTL representing the value of the
return address for the frame COUNT steps up from the current
frame, after the prologue. FRAMEADDR is the frame pointer of the
COUNT frame, or the frame pointer of the COUNT - 1 frame if
`RETURN_ADDR_IN_PREVIOUS_FRAME' is defined.
The value of the expression must always be the correct address when
COUNT is zero, but may be `NULL_RTX' if there is no way to
determine the return address of other frames.
-- Macro: RETURN_ADDR_IN_PREVIOUS_FRAME
Define this if the return address of a particular stack frame is
accessed from the frame pointer of the previous stack frame.
-- Macro: INCOMING_RETURN_ADDR_RTX
A C expression whose value is RTL representing the location of the
incoming return address at the beginning of any function, before
the prologue. This RTL is either a `REG', indicating that the
return value is saved in `REG', or a `MEM' representing a location
in the stack.
You only need to define this macro if you want to support call
frame debugging information like that provided by DWARF 2.
If this RTL is a `REG', you should also define
`DWARF_FRAME_RETURN_COLUMN' to `DWARF_FRAME_REGNUM (REGNO)'.
-- Macro: DWARF_ALT_FRAME_RETURN_COLUMN
A C expression whose value is an integer giving a DWARF 2 column
number that may be used as an alternative return column. The
column must not correspond to any gcc hard register (that is, it
must not be in the range of `DWARF_FRAME_REGNUM').
This macro can be useful if `DWARF_FRAME_RETURN_COLUMN' is set to a
general register, but an alternative column needs to be used for
signal frames. Some targets have also used different frame return
columns over time.
-- Macro: DWARF_ZERO_REG
A C expression whose value is an integer giving a DWARF 2 register
number that is considered to always have the value zero. This
should only be defined if the target has an architected zero
register, and someone decided it was a good idea to use that
register number to terminate the stack backtrace. New ports
should avoid this.
-- Target Hook: void TARGET_DWARF_HANDLE_FRAME_UNSPEC (const char
*LABEL, rtx PATTERN, int INDEX)
This target hook allows the backend to emit frame-related insns
that contain UNSPECs or UNSPEC_VOLATILEs. The DWARF 2 call frame
debugging info engine will invoke it on insns of the form
(set (reg) (unspec [...] UNSPEC_INDEX))
and
(set (reg) (unspec_volatile [...] UNSPECV_INDEX)).
to let the backend emit the call frame instructions. LABEL is the
CFI label attached to the insn, PATTERN is the pattern of the insn
and INDEX is `UNSPEC_INDEX' or `UNSPECV_INDEX'.
-- Macro: INCOMING_FRAME_SP_OFFSET
A C expression whose value is an integer giving the offset, in
bytes, from the value of the stack pointer register to the top of
the stack frame at the beginning of any function, before the
prologue. The top of the frame is defined to be the value of the
stack pointer in the previous frame, just before the call
instruction.
You only need to define this macro if you want to support call
frame debugging information like that provided by DWARF 2.
-- Macro: ARG_POINTER_CFA_OFFSET (FUNDECL)
A C expression whose value is an integer giving the offset, in
bytes, from the argument pointer to the canonical frame address
(cfa). The final value should coincide with that calculated by
`INCOMING_FRAME_SP_OFFSET'. Which is unfortunately not usable
during virtual register instantiation.
The default value for this macro is `FIRST_PARM_OFFSET (fundecl) +
crtl->args.pretend_args_size', which is correct for most machines;
in general, the arguments are found immediately before the stack
frame. Note that this is not the case on some targets that save
registers into the caller's frame, such as SPARC and rs6000, and
so such targets need to define this macro.
You only need to define this macro if the default is incorrect,
and you want to support call frame debugging information like that
provided by DWARF 2.
-- Macro: FRAME_POINTER_CFA_OFFSET (FUNDECL)
If defined, a C expression whose value is an integer giving the
offset in bytes from the frame pointer to the canonical frame
address (cfa). The final value should coincide with that
calculated by `INCOMING_FRAME_SP_OFFSET'.
Normally the CFA is calculated as an offset from the argument
pointer, via `ARG_POINTER_CFA_OFFSET', but if the argument pointer
is variable due to the ABI, this may not be possible. If this
macro is defined, it implies that the virtual register
instantiation should be based on the frame pointer instead of the
argument pointer. Only one of `FRAME_POINTER_CFA_OFFSET' and
`ARG_POINTER_CFA_OFFSET' should be defined.
-- Macro: CFA_FRAME_BASE_OFFSET (FUNDECL)
If defined, a C expression whose value is an integer giving the
offset in bytes from the canonical frame address (cfa) to the
frame base used in DWARF 2 debug information. The default is
zero. A different value may reduce the size of debug information
on some ports.
File: gccint.info, Node: Exception Handling, Next: Stack Checking, Prev: Frame Layout, Up: Stack and Calling
17.10.2 Exception Handling Support
----------------------------------
-- Macro: EH_RETURN_DATA_REGNO (N)
A C expression whose value is the Nth register number used for
data by exception handlers, or `INVALID_REGNUM' if fewer than N
registers are usable.
The exception handling library routines communicate with the
exception handlers via a set of agreed upon registers. Ideally
these registers should be call-clobbered; it is possible to use
call-saved registers, but may negatively impact code size. The
target must support at least 2 data registers, but should define 4
if there are enough free registers.
You must define this macro if you want to support call frame
exception handling like that provided by DWARF 2.
-- Macro: EH_RETURN_STACKADJ_RTX
A C expression whose value is RTL representing a location in which
to store a stack adjustment to be applied before function return.
This is used to unwind the stack to an exception handler's call
frame. It will be assigned zero on code paths that return
normally.
Typically this is a call-clobbered hard register that is otherwise
untouched by the epilogue, but could also be a stack slot.
Do not define this macro if the stack pointer is saved and restored
by the regular prolog and epilog code in the call frame itself; in
this case, the exception handling library routines will update the
stack location to be restored in place. Otherwise, you must define
this macro if you want to support call frame exception handling
like that provided by DWARF 2.
-- Macro: EH_RETURN_HANDLER_RTX
A C expression whose value is RTL representing a location in which
to store the address of an exception handler to which we should
return. It will not be assigned on code paths that return
normally.
Typically this is the location in the call frame at which the
normal return address is stored. For targets that return by
popping an address off the stack, this might be a memory address
just below the _target_ call frame rather than inside the current
call frame. If defined, `EH_RETURN_STACKADJ_RTX' will have already
been assigned, so it may be used to calculate the location of the
target call frame.
Some targets have more complex requirements than storing to an
address calculable during initial code generation. In that case
the `eh_return' instruction pattern should be used instead.
If you want to support call frame exception handling, you must
define either this macro or the `eh_return' instruction pattern.
-- Macro: RETURN_ADDR_OFFSET
If defined, an integer-valued C expression for which rtl will be
generated to add it to the exception handler address before it is
searched in the exception handling tables, and to subtract it
again from the address before using it to return to the exception
handler.
-- Macro: ASM_PREFERRED_EH_DATA_FORMAT (CODE, GLOBAL)
This macro chooses the encoding of pointers embedded in the
exception handling sections. If at all possible, this should be
defined such that the exception handling section will not require
dynamic relocations, and so may be read-only.
CODE is 0 for data, 1 for code labels, 2 for function pointers.
GLOBAL is true if the symbol may be affected by dynamic
relocations. The macro should return a combination of the
`DW_EH_PE_*' defines as found in `dwarf2.h'.
If this macro is not defined, pointers will not be encoded but
represented directly.
-- Macro: ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX (FILE, ENCODING, SIZE,
ADDR, DONE)
This macro allows the target to emit whatever special magic is
required to represent the encoding chosen by
`ASM_PREFERRED_EH_DATA_FORMAT'. Generic code takes care of
pc-relative and indirect encodings; this must be defined if the
target uses text-relative or data-relative encodings.
This is a C statement that branches to DONE if the format was
handled. ENCODING is the format chosen, SIZE is the number of
bytes that the format occupies, ADDR is the `SYMBOL_REF' to be
emitted.
-- Macro: MD_UNWIND_SUPPORT
A string specifying a file to be #include'd in unwind-dw2.c. The
file so included typically defines `MD_FALLBACK_FRAME_STATE_FOR'.
-- Macro: MD_FALLBACK_FRAME_STATE_FOR (CONTEXT, FS)
This macro allows the target to add CPU and operating system
specific code to the call-frame unwinder for use when there is no
unwind data available. The most common reason to implement this
macro is to unwind through signal frames.
This macro is called from `uw_frame_state_for' in `unwind-dw2.c',
`unwind-dw2-xtensa.c' and `unwind-ia64.c'. CONTEXT is an
`_Unwind_Context'; FS is an `_Unwind_FrameState'. Examine
`context->ra' for the address of the code being executed and
`context->cfa' for the stack pointer value. If the frame can be
decoded, the register save addresses should be updated in FS and
the macro should evaluate to `_URC_NO_REASON'. If the frame
cannot be decoded, the macro should evaluate to
`_URC_END_OF_STACK'.
For proper signal handling in Java this macro is accompanied by
`MAKE_THROW_FRAME', defined in `libjava/include/*-signal.h'
headers.
-- Macro: MD_HANDLE_UNWABI (CONTEXT, FS)
This macro allows the target to add operating system specific code
to the call-frame unwinder to handle the IA-64 `.unwabi' unwinding
directive, usually used for signal or interrupt frames.
This macro is called from `uw_update_context' in `unwind-ia64.c'.
CONTEXT is an `_Unwind_Context'; FS is an `_Unwind_FrameState'.
Examine `fs->unwabi' for the abi and context in the `.unwabi'
directive. If the `.unwabi' directive can be handled, the
register save addresses should be updated in FS.
-- Macro: TARGET_USES_WEAK_UNWIND_INFO
A C expression that evaluates to true if the target requires unwind
info to be given comdat linkage. Define it to be `1' if comdat
linkage is necessary. The default is `0'.
File: gccint.info, Node: Stack Checking, Next: Frame Registers, Prev: Exception Handling, Up: Stack and Calling
17.10.3 Specifying How Stack Checking is Done
---------------------------------------------
GCC will check that stack references are within the boundaries of the
stack, if the option `-fstack-check' is specified, in one of three ways:
1. If the value of the `STACK_CHECK_BUILTIN' macro is nonzero, GCC
will assume that you have arranged for full stack checking to be
done at appropriate places in the configuration files. GCC will
not do other special processing.
2. If `STACK_CHECK_BUILTIN' is zero and the value of the
`STACK_CHECK_STATIC_BUILTIN' macro is nonzero, GCC will assume
that you have arranged for static stack checking (checking of the
static stack frame of functions) to be done at appropriate places
in the configuration files. GCC will only emit code to do dynamic
stack checking (checking on dynamic stack allocations) using the
third approach below.
3. If neither of the above are true, GCC will generate code to
periodically "probe" the stack pointer using the values of the
macros defined below.
If neither STACK_CHECK_BUILTIN nor STACK_CHECK_STATIC_BUILTIN is
defined, GCC will change its allocation strategy for large objects if
the option `-fstack-check' is specified: they will always be allocated
dynamically if their size exceeds `STACK_CHECK_MAX_VAR_SIZE' bytes.
-- Macro: STACK_CHECK_BUILTIN
A nonzero value if stack checking is done by the configuration
files in a machine-dependent manner. You should define this macro
if stack checking is required by the ABI of your machine or if you
would like to do stack checking in some more efficient way than
the generic approach. The default value of this macro is zero.
-- Macro: STACK_CHECK_STATIC_BUILTIN
A nonzero value if static stack checking is done by the
configuration files in a machine-dependent manner. You should
define this macro if you would like to do static stack checking in
some more efficient way than the generic approach. The default
value of this macro is zero.
-- Macro: STACK_CHECK_PROBE_INTERVAL_EXP
An integer specifying the interval at which GCC must generate
stack probe instructions, defined as 2 raised to this integer.
You will normally define this macro so that the interval be no
larger than the size of the "guard pages" at the end of a stack
area. The default value of 12 (4096-byte interval) is suitable
for most systems.
-- Macro: STACK_CHECK_MOVING_SP
An integer which is nonzero if GCC should move the stack pointer
page by page when doing probes. This can be necessary on systems
where the stack pointer contains the bottom address of the memory
area accessible to the executing thread at any point in time. In
this situation an alternate signal stack is required in order to
be able to recover from a stack overflow. The default value of
this macro is zero.
-- Macro: STACK_CHECK_PROTECT
The number of bytes of stack needed to recover from a stack
overflow, for languages where such a recovery is supported. The
default value of 75 words with the `setjmp'/`longjmp'-based
exception handling mechanism and 8192 bytes with other exception
handling mechanisms should be adequate for most machines.
The following macros are relevant only if neither STACK_CHECK_BUILTIN
nor STACK_CHECK_STATIC_BUILTIN is defined; you can omit them altogether
in the opposite case.
-- Macro: STACK_CHECK_MAX_FRAME_SIZE
The maximum size of a stack frame, in bytes. GCC will generate
probe instructions in non-leaf functions to ensure at least this
many bytes of stack are available. If a stack frame is larger
than this size, stack checking will not be reliable and GCC will
issue a warning. The default is chosen so that GCC only generates
one instruction on most systems. You should normally not change
the default value of this macro.
-- Macro: STACK_CHECK_FIXED_FRAME_SIZE
GCC uses this value to generate the above warning message. It
represents the amount of fixed frame used by a function, not
including space for any callee-saved registers, temporaries and
user variables. You need only specify an upper bound for this
amount and will normally use the default of four words.
-- Macro: STACK_CHECK_MAX_VAR_SIZE
The maximum size, in bytes, of an object that GCC will place in the
fixed area of the stack frame when the user specifies
`-fstack-check'. GCC computed the default from the values of the
above macros and you will normally not need to override that
default.
File: gccint.info, Node: Frame Registers, Next: Elimination, Prev: Stack Checking, Up: Stack and Calling
17.10.4 Registers That Address the Stack Frame
----------------------------------------------
This discusses registers that address the stack frame.
-- Macro: STACK_POINTER_REGNUM
The register number of the stack pointer register, which must also
be a fixed register according to `FIXED_REGISTERS'. On most
machines, the hardware determines which register this is.
-- Macro: FRAME_POINTER_REGNUM
The register number of the frame pointer register, which is used to
access automatic variables in the stack frame. On some machines,
the hardware determines which register this is. On other
machines, you can choose any register you wish for this purpose.
-- Macro: HARD_FRAME_POINTER_REGNUM
On some machines the offset between the frame pointer and starting
offset of the automatic variables is not known until after register
allocation has been done (for example, because the saved registers
are between these two locations). On those machines, define
`FRAME_POINTER_REGNUM' the number of a special, fixed register to
be used internally until the offset is known, and define
`HARD_FRAME_POINTER_REGNUM' to be the actual hard register number
used for the frame pointer.
You should define this macro only in the very rare circumstances
when it is not possible to calculate the offset between the frame
pointer and the automatic variables until after register
allocation has been completed. When this macro is defined, you
must also indicate in your definition of `ELIMINABLE_REGS' how to
eliminate `FRAME_POINTER_REGNUM' into either
`HARD_FRAME_POINTER_REGNUM' or `STACK_POINTER_REGNUM'.
Do not define this macro if it would be the same as
`FRAME_POINTER_REGNUM'.
-- Macro: ARG_POINTER_REGNUM
The register number of the arg pointer register, which is used to
access the function's argument list. On some machines, this is
the same as the frame pointer register. On some machines, the
hardware determines which register this is. On other machines,
you can choose any register you wish for this purpose. If this is
not the same register as the frame pointer register, then you must
mark it as a fixed register according to `FIXED_REGISTERS', or
arrange to be able to eliminate it (*note Elimination::).
-- Macro: HARD_FRAME_POINTER_IS_FRAME_POINTER
Define this to a preprocessor constant that is nonzero if
`hard_frame_pointer_rtx' and `frame_pointer_rtx' should be the
same. The default definition is `(HARD_FRAME_POINTER_REGNUM ==
FRAME_POINTER_REGNUM)'; you only need to define this macro if that
definition is not suitable for use in preprocessor conditionals.
-- Macro: HARD_FRAME_POINTER_IS_ARG_POINTER
Define this to a preprocessor constant that is nonzero if
`hard_frame_pointer_rtx' and `arg_pointer_rtx' should be the same.
The default definition is `(HARD_FRAME_POINTER_REGNUM ==
ARG_POINTER_REGNUM)'; you only need to define this macro if that
definition is not suitable for use in preprocessor conditionals.
-- Macro: RETURN_ADDRESS_POINTER_REGNUM
The register number of the return address pointer register, which
is used to access the current function's return address from the
stack. On some machines, the return address is not at a fixed
offset from the frame pointer or stack pointer or argument
pointer. This register can be defined to point to the return
address on the stack, and then be converted by `ELIMINABLE_REGS'
into either the frame pointer or stack pointer.
Do not define this macro unless there is no other way to get the
return address from the stack.
-- Macro: STATIC_CHAIN_REGNUM
-- Macro: STATIC_CHAIN_INCOMING_REGNUM
Register numbers used for passing a function's static chain
pointer. If register windows are used, the register number as
seen by the called function is `STATIC_CHAIN_INCOMING_REGNUM',
while the register number as seen by the calling function is
`STATIC_CHAIN_REGNUM'. If these registers are the same,
`STATIC_CHAIN_INCOMING_REGNUM' need not be defined.
The static chain register need not be a fixed register.
If the static chain is passed in memory, these macros should not be
defined; instead, the `TARGET_STATIC_CHAIN' hook should be used.
-- Target Hook: rtx TARGET_STATIC_CHAIN (const_tree FNDECL, bool
INCOMING_P)
This hook replaces the use of `STATIC_CHAIN_REGNUM' et al for
targets that may use different static chain locations for different
nested functions. This may be required if the target has function
attributes that affect the calling conventions of the function and
those calling conventions use different static chain locations.
The default version of this hook uses `STATIC_CHAIN_REGNUM' et al.
If the static chain is passed in memory, this hook should be used
to provide rtx giving `mem' expressions that denote where they are
stored. Often the `mem' expression as seen by the caller will be
at an offset from the stack pointer and the `mem' expression as
seen by the callee will be at an offset from the frame pointer. The
variables `stack_pointer_rtx', `frame_pointer_rtx', and
`arg_pointer_rtx' will have been initialized and should be used to
refer to those items.
-- Macro: DWARF_FRAME_REGISTERS
This macro specifies the maximum number of hard registers that can
be saved in a call frame. This is used to size data structures
used in DWARF2 exception handling.
Prior to GCC 3.0, this macro was needed in order to establish a
stable exception handling ABI in the face of adding new hard
registers for ISA extensions. In GCC 3.0 and later, the EH ABI is
insulated from changes in the number of hard registers.
Nevertheless, this macro can still be used to reduce the runtime
memory requirements of the exception handling routines, which can
be substantial if the ISA contains a lot of registers that are not
call-saved.
If this macro is not defined, it defaults to
`FIRST_PSEUDO_REGISTER'.
-- Macro: PRE_GCC3_DWARF_FRAME_REGISTERS
This macro is similar to `DWARF_FRAME_REGISTERS', but is provided
for backward compatibility in pre GCC 3.0 compiled code.
If this macro is not defined, it defaults to
`DWARF_FRAME_REGISTERS'.
-- Macro: DWARF_REG_TO_UNWIND_COLUMN (REGNO)
Define this macro if the target's representation for dwarf
registers is different than the internal representation for unwind
column. Given a dwarf register, this macro should return the
internal unwind column number to use instead.
See the PowerPC's SPE target for an example.
-- Macro: DWARF_FRAME_REGNUM (REGNO)
Define this macro if the target's representation for dwarf
registers used in .eh_frame or .debug_frame is different from that
used in other debug info sections. Given a GCC hard register
number, this macro should return the .eh_frame register number.
The default is `DBX_REGISTER_NUMBER (REGNO)'.
-- Macro: DWARF2_FRAME_REG_OUT (REGNO, FOR_EH)
Define this macro to map register numbers held in the call frame
info that GCC has collected using `DWARF_FRAME_REGNUM' to those
that should be output in .debug_frame (`FOR_EH' is zero) and
.eh_frame (`FOR_EH' is nonzero). The default is to return `REGNO'.
File: gccint.info, Node: Elimination, Next: Stack Arguments, Prev: Frame Registers, Up: Stack and Calling
17.10.5 Eliminating Frame Pointer and Arg Pointer
-------------------------------------------------
This is about eliminating the frame pointer and arg pointer.
-- Target Hook: bool TARGET_FRAME_POINTER_REQUIRED (void)
This target hook should return `true' if a function must have and
use a frame pointer. This target hook is called in the reload
pass. If its return value is `true' the function will have a
frame pointer.
This target hook can in principle examine the current function and
decide according to the facts, but on most machines the constant
`false' or the constant `true' suffices. Use `false' when the
machine allows code to be generated with no frame pointer, and
doing so saves some time or space. Use `true' when there is no
possible advantage to avoiding a frame pointer.
In certain cases, the compiler does not know how to produce valid
code without a frame pointer. The compiler recognizes those cases
and automatically gives the function a frame pointer regardless of
what `TARGET_FRAME_POINTER_REQUIRED' returns. You don't need to
worry about them.
In a function that does not require a frame pointer, the frame
pointer register can be allocated for ordinary usage, unless you
mark it as a fixed register. See `FIXED_REGISTERS' for more
information.
Default return value is `false'.
-- Macro: INITIAL_FRAME_POINTER_OFFSET (DEPTH-VAR)
A C statement to store in the variable DEPTH-VAR the difference
between the frame pointer and the stack pointer values immediately
after the function prologue. The value would be computed from
information such as the result of `get_frame_size ()' and the
tables of registers `regs_ever_live' and `call_used_regs'.
If `ELIMINABLE_REGS' is defined, this macro will be not be used and
need not be defined. Otherwise, it must be defined even if
`TARGET_FRAME_POINTER_REQUIRED' always returns true; in that case,
you may set DEPTH-VAR to anything.
-- Macro: ELIMINABLE_REGS
If defined, this macro specifies a table of register pairs used to
eliminate unneeded registers that point into the stack frame. If
it is not defined, the only elimination attempted by the compiler
is to replace references to the frame pointer with references to
the stack pointer.
The definition of this macro is a list of structure
initializations, each of which specifies an original and
replacement register.
On some machines, the position of the argument pointer is not
known until the compilation is completed. In such a case, a
separate hard register must be used for the argument pointer.
This register can be eliminated by replacing it with either the
frame pointer or the argument pointer, depending on whether or not
the frame pointer has been eliminated.
In this case, you might specify:
#define ELIMINABLE_REGS \
{{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
{ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
Note that the elimination of the argument pointer with the stack
pointer is specified first since that is the preferred elimination.
-- Target Hook: bool TARGET_CAN_ELIMINATE (const int FROM_REG, const
int TO_REG)
This target hook should returns `true' if the compiler is allowed
to try to replace register number FROM_REG with register number
TO_REG. This target hook need only be defined if `ELIMINABLE_REGS'
is defined, and will usually be `true', since most of the cases
preventing register elimination are things that the compiler
already knows about.
Default return value is `true'.
-- Macro: INITIAL_ELIMINATION_OFFSET (FROM-REG, TO-REG, OFFSET-VAR)
This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It
specifies the initial difference between the specified pair of
registers. This macro must be defined if `ELIMINABLE_REGS' is
defined.
File: gccint.info, Node: Stack Arguments, Next: Register Arguments, Prev: Elimination, Up: Stack and Calling
17.10.6 Passing Function Arguments on the Stack
-----------------------------------------------
The macros in this section control how arguments are passed on the
stack. See the following section for other macros that control passing
certain arguments in registers.
-- Target Hook: bool TARGET_PROMOTE_PROTOTYPES (const_tree FNTYPE)
This target hook returns `true' if an argument declared in a
prototype as an integral type smaller than `int' 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. The default is to not promote prototypes.
-- Macro: PUSH_ARGS
A C expression. If nonzero, push insns will be used to pass
outgoing arguments. If the target machine does not have a push
instruction, set it to zero. That directs GCC to use an alternate
strategy: to allocate the entire argument block and then store the
arguments into it. When `PUSH_ARGS' is nonzero, `PUSH_ROUNDING'
must be defined too.
-- Macro: PUSH_ARGS_REVERSED
A C expression. If nonzero, function arguments will be evaluated
from last to first, rather than from first to last. If this macro
is not defined, it defaults to `PUSH_ARGS' on targets where the
stack and args grow in opposite directions, and 0 otherwise.
-- Macro: PUSH_ROUNDING (NPUSHED)
A C expression that is the number of bytes actually pushed onto the
stack when an instruction attempts to push NPUSHED bytes.
On some machines, the definition
#define PUSH_ROUNDING(BYTES) (BYTES)
will suffice. But on other machines, instructions that appear to
push one byte actually push two bytes in an attempt to maintain
alignment. Then the definition should be
#define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1)
If the value of this macro has a type, it should be an unsigned
type.
-- Macro: ACCUMULATE_OUTGOING_ARGS
A C expression. If nonzero, the maximum amount of space required
for outgoing arguments will be computed and placed into the
variable `current_function_outgoing_args_size'. No space will be
pushed onto the stack for each call; instead, the function
prologue should increase the stack frame size by this amount.
Setting both `PUSH_ARGS' and `ACCUMULATE_OUTGOING_ARGS' is not
proper.
-- Macro: REG_PARM_STACK_SPACE (FNDECL)
Define this macro if functions should assume that stack space has
been allocated for arguments even when their values are passed in
registers.
The value of this macro is the size, in bytes, of the area
reserved for arguments passed in registers for the function
represented by FNDECL, which can be zero if GCC is calling a
library function. The argument FNDECL can be the FUNCTION_DECL,
or the type itself of the function.
This space can be allocated by the caller, or be a part of the
machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE' says
which.
-- Macro: OUTGOING_REG_PARM_STACK_SPACE (FNTYPE)
Define this to a nonzero value if it is the responsibility of the
caller to allocate the area reserved for arguments passed in
registers when calling a function of FNTYPE. FNTYPE may be NULL
if the function called is a library function.
If `ACCUMULATE_OUTGOING_ARGS' is defined, this macro controls
whether the space for these arguments counts in the value of
`current_function_outgoing_args_size'.
-- Macro: STACK_PARMS_IN_REG_PARM_AREA
Define this macro if `REG_PARM_STACK_SPACE' is defined, but the
stack parameters don't skip the area specified by it.
Normally, when a parameter is not passed in registers, it is
placed on the stack beyond the `REG_PARM_STACK_SPACE' area.
Defining this macro suppresses this behavior and causes the
parameter to be passed on the stack in its natural location.
-- Target Hook: int TARGET_RETURN_POPS_ARGS (tree FUNDECL, tree
FUNTYPE, int SIZE)
This target hook returns the number of bytes of its own arguments
that a function pops on returning, or 0 if the function pops no
arguments and the caller must therefore pop them all after the
function returns.
FUNDECL is a C variable whose value is a tree node that describes
the function in question. Normally it is a node of type
`FUNCTION_DECL' that describes the declaration of the function.
From this you can obtain the `DECL_ATTRIBUTES' of the function.
FUNTYPE is a C variable whose value is a tree node that describes
the function in question. Normally it is a node of type
`FUNCTION_TYPE' that describes the data type of the function.
From this it is possible to obtain the data types of the value and
arguments (if known).
When a call to a library function is being considered, FUNDECL
will contain an identifier node for the library function. Thus, if
you need to distinguish among various library functions, you can
do so by their names. Note that "library function" in this
context means a function used to perform arithmetic, whose name is
known specially in the compiler and was not mentioned in the C
code being compiled.
SIZE is the number of bytes of arguments passed on the stack. If
a variable number of bytes is passed, it is zero, and argument
popping will always be the responsibility of the calling function.
On the VAX, all functions always pop their arguments, so the
definition of this macro is SIZE. On the 68000, using the standard
calling convention, no functions pop their arguments, so the value
of the macro is always 0 in this case. But an alternative calling
convention is available in which functions that take a fixed
number of arguments pop them but other functions (such as
`printf') pop nothing (the caller pops all). When this convention
is in use, FUNTYPE is examined to determine whether a function
takes a fixed number of arguments.
-- Macro: CALL_POPS_ARGS (CUM)
A C expression that should indicate the number of bytes a call
sequence pops off the stack. It is added to the value of
`RETURN_POPS_ARGS' when compiling a function call.
CUM is the variable in which all arguments to the called function
have been accumulated.
On certain architectures, such as the SH5, a call trampoline is
used that pops certain registers off the stack, depending on the
arguments that have been passed to the function. Since this is a
property of the call site, not of the called function,
`RETURN_POPS_ARGS' is not appropriate.
File: gccint.info, Node: Register Arguments, Next: Scalar Return, Prev: Stack Arguments, Up: Stack and Calling
17.10.7 Passing Arguments in Registers
--------------------------------------
This section describes the macros which let you control how various
types of arguments are passed in registers or how they are arranged in
the stack.
-- Macro: FUNCTION_ARG (CUM, MODE, TYPE, NAMED)
A C expression that controls whether a function argument is passed
in a register, and which register.
The arguments are CUM, which summarizes all the previous
arguments; MODE, the machine mode of the argument; TYPE, the data
type of the argument as a tree node or 0 if that is not known
(which happens for C support library functions); and NAMED, which
is 1 for an ordinary argument and 0 for nameless arguments that
correspond to `...' in the called function's prototype. TYPE can
be an incomplete type if a syntax error has previously occurred.
The value of the expression is usually either a `reg' RTX for the
hard register in which to pass the argument, or zero to pass the
argument on the stack.
For machines like the VAX and 68000, where normally all arguments
are pushed, zero suffices as a definition.
The value of the expression can also be a `parallel' RTX. This is
used when an argument is passed in multiple locations. The mode
of the `parallel' should be the mode of the entire argument. The
`parallel' holds any number of `expr_list' pairs; each one
describes where part of the argument is passed. In each
`expr_list' the first operand must be a `reg' RTX for the hard
register in which to pass this part of the argument, and the mode
of the register RTX indicates how large this part of the argument
is. The second operand of the `expr_list' is a `const_int' which
gives the offset in bytes into the entire argument of where this
part starts. As a special exception the first `expr_list' in the
`parallel' RTX may have a first operand of zero. This indicates
that the entire argument is also stored on the stack.
The last time this macro is called, it is called with `MODE ==
VOIDmode', and its result is passed to the `call' or `call_value'
pattern as operands 2 and 3 respectively.
The usual way to make the ISO library `stdarg.h' work on a machine
where some arguments are usually passed in registers, is to cause
nameless arguments to be passed on the stack instead. This is done
by making `FUNCTION_ARG' return 0 whenever NAMED is 0.
You may use the hook `targetm.calls.must_pass_in_stack' in the
definition of this macro to determine if this argument is of a
type that must be passed in the stack. If `REG_PARM_STACK_SPACE'
is not defined and `FUNCTION_ARG' returns nonzero for such an
argument, the compiler will abort. If `REG_PARM_STACK_SPACE' is
defined, the argument will be computed in the stack and then
loaded into a register.
-- Target Hook: bool TARGET_MUST_PASS_IN_STACK (enum machine_mode
MODE, const_tree TYPE)
This target hook should return `true' if we should not pass TYPE
solely in registers. The file `expr.h' defines a definition that
is usually appropriate, refer to `expr.h' for additional
documentation.
-- Macro: FUNCTION_INCOMING_ARG (CUM, MODE, TYPE, NAMED)
Define this macro if the target machine has "register windows", so
that the register in which a function sees an arguments is not
necessarily the same as the one in which the caller passed the
argument.
For such machines, `FUNCTION_ARG' computes the register in which
the caller passes the value, and `FUNCTION_INCOMING_ARG' should be
defined in a similar fashion to tell the function being called
where the arguments will arrive.
If `FUNCTION_INCOMING_ARG' is not defined, `FUNCTION_ARG' serves
both purposes.
-- Target Hook: int TARGET_ARG_PARTIAL_BYTES (CUMULATIVE_ARGS *CUM,
enum machine_mode MODE, tree TYPE, bool NAMED)
This target hook returns the number of bytes at the beginning of an
argument that must be put in registers. The value must be zero for
arguments that are passed entirely in registers or that are
entirely pushed on the stack.
On some machines, certain arguments must be passed partially in
registers and partially in memory. On these machines, typically
the first few words of arguments are passed in registers, and the
rest on the stack. If a multi-word argument (a `double' or a
structure) crosses that boundary, its first few words must be
passed in registers and the rest must be pushed. This macro tells
the compiler when this occurs, and how many bytes should go in
registers.
`FUNCTION_ARG' for these arguments should return the first
register to be used by the caller for this argument; likewise
`FUNCTION_INCOMING_ARG', for the called function.
-- Target Hook: bool TARGET_PASS_BY_REFERENCE (CUMULATIVE_ARGS *CUM,
enum machine_mode MODE, const_tree TYPE, bool NAMED)
This target hook should return `true' if an argument at the
position indicated by CUM should be passed by reference. This
predicate is queried after target independent reasons for being
passed by reference, such as `TREE_ADDRESSABLE (type)'.
If the hook returns true, a copy of that argument is made in
memory and a pointer to the argument is passed instead of the
argument itself. The pointer is passed in whatever way is
appropriate for passing a pointer to that type.
-- Target Hook: bool TARGET_CALLEE_COPIES (CUMULATIVE_ARGS *CUM, enum
machine_mode MODE, const_tree TYPE, bool NAMED)
The function argument described by the parameters to this hook is
known to be passed by reference. The hook should return true if
the function argument should be copied by the callee instead of
copied by the caller.
For any argument for which the hook returns true, if it can be
determined that the argument is not modified, then a copy need not
be generated.
The default version of this hook always returns false.
-- Macro: CUMULATIVE_ARGS
A C type for declaring a variable that is used as the first
argument of `FUNCTION_ARG' and other related values. For some
target machines, the type `int' suffices and can hold the number
of bytes of argument so far.
There is no need to record in `CUMULATIVE_ARGS' anything about the
arguments that have been passed on the stack. The compiler has
other variables to keep track of that. For target machines on
which all arguments are passed on the stack, there is no need to
store anything in `CUMULATIVE_ARGS'; however, the data structure
must exist and should not be empty, so use `int'.
-- Macro: OVERRIDE_ABI_FORMAT (FNDECL)
If defined, this macro is called before generating any code for a
function, but after the CFUN descriptor for the function has been
created. The back end may use this macro to update CFUN to
reflect an ABI other than that which would normally be used by
default. If the compiler is generating code for a
compiler-generated function, FNDECL may be `NULL'.
-- Macro: INIT_CUMULATIVE_ARGS (CUM, FNTYPE, LIBNAME, FNDECL,
N_NAMED_ARGS)
A C statement (sans semicolon) for initializing the variable CUM
for the state at the beginning of the argument list. The variable
has type `CUMULATIVE_ARGS'. The value of FNTYPE is the tree node
for the data type of the function which will receive the args, or
0 if the args are to a compiler support library function. For
direct calls that are not libcalls, FNDECL contain the declaration
node of the function. FNDECL is also set when
`INIT_CUMULATIVE_ARGS' is used to find arguments for the function
being compiled. N_NAMED_ARGS is set to the number of named
arguments, including a structure return address if it is passed as
a parameter, when making a call. When processing incoming
arguments, N_NAMED_ARGS is set to -1.
When processing a call to a compiler support library function,
LIBNAME identifies which one. It is a `symbol_ref' rtx which
contains the name of the function, as a string. LIBNAME is 0 when
an ordinary C function call is being processed. Thus, each time
this macro is called, either LIBNAME or FNTYPE is nonzero, but
never both of them at once.
-- Macro: INIT_CUMULATIVE_LIBCALL_ARGS (CUM, MODE, LIBNAME)
Like `INIT_CUMULATIVE_ARGS' but only used for outgoing libcalls,
it gets a `MODE' argument instead of FNTYPE, that would be `NULL'.
INDIRECT would always be zero, too. If this macro is not defined,
`INIT_CUMULATIVE_ARGS (cum, NULL_RTX, libname, 0)' is used instead.
-- Macro: INIT_CUMULATIVE_INCOMING_ARGS (CUM, FNTYPE, LIBNAME)
Like `INIT_CUMULATIVE_ARGS' but overrides it for the purposes of
finding the arguments for the function being compiled. If this
macro is undefined, `INIT_CUMULATIVE_ARGS' is used instead.
The value passed for LIBNAME is always 0, since library routines
with special calling conventions are never compiled with GCC. The
argument LIBNAME exists for symmetry with `INIT_CUMULATIVE_ARGS'.
-- Macro: FUNCTION_ARG_ADVANCE (CUM, MODE, TYPE, NAMED)
A C statement (sans semicolon) to update the summarizer variable
CUM to advance past an argument in the argument list. The values
MODE, TYPE and NAMED describe that argument. Once this is done,
the variable CUM is suitable for analyzing the _following_
argument with `FUNCTION_ARG', etc.
This macro need not do anything if the argument in question was
passed on the stack. The compiler knows how to track the amount
of stack space used for arguments without any special help.
-- Macro: FUNCTION_ARG_OFFSET (MODE, TYPE)
If defined, a C expression that is the number of bytes to add to
the offset of the argument passed in memory. This is needed for
the SPU, which passes `char' and `short' arguments in the preferred
slot that is in the middle of the quad word instead of starting at
the top.
-- Macro: FUNCTION_ARG_PADDING (MODE, TYPE)
If defined, a C expression which determines whether, and in which
direction, to pad out an argument with extra space. The value
should be of type `enum direction': either `upward' to pad above
the argument, `downward' to pad below, or `none' to inhibit
padding.
The _amount_ of padding is always just enough to reach the next
multiple of `TARGET_FUNCTION_ARG_BOUNDARY'; this macro does not
control it.
This macro has a default definition which is right for most
systems. For little-endian machines, the default is to pad
upward. For big-endian machines, the default is to pad downward
for an argument of constant size shorter than an `int', and upward
otherwise.
-- Macro: PAD_VARARGS_DOWN
If defined, a C expression which determines whether the default
implementation of va_arg will attempt to pad down before reading
the next argument, if that argument is smaller than its aligned
space as controlled by `PARM_BOUNDARY'. If this macro is not
defined, all such arguments are padded down if `BYTES_BIG_ENDIAN'
is true.
-- Macro: BLOCK_REG_PADDING (MODE, TYPE, FIRST)
Specify padding for the last element of a block move between
registers and memory. FIRST is nonzero if this is the only
element. Defining this macro allows better control of register
function parameters on big-endian machines, without using
`PARALLEL' rtl. In particular, `MUST_PASS_IN_STACK' need not test
padding and mode of types in registers, as there is no longer a
"wrong" part of a register; For example, a three byte aggregate
may be passed in the high part of a register if so required.
-- Target Hook: unsigned int TARGET_FUNCTION_ARG_BOUNDARY (enum
machine_mode MODE, const_tree TYPE)
This hook returns the alignment boundary, in bits, of an argument
with the specified mode and type. The default hook returns
`PARM_BOUNDARY' for all arguments.
-- Macro: FUNCTION_ARG_REGNO_P (REGNO)
A C expression that is nonzero if REGNO is the number of a hard
register in which function arguments are sometimes passed. This
does _not_ include implicit arguments such as the static chain and
the structure-value address. On many machines, no registers can be
used for this purpose since all function arguments are pushed on
the stack.
-- Target Hook: bool TARGET_SPLIT_COMPLEX_ARG (const_tree TYPE)
This hook should return true if parameter of type TYPE are passed
as two scalar parameters. By default, GCC will attempt to pack
complex arguments into the target's word size. Some ABIs require
complex arguments to be split and treated as their individual
components. For example, on AIX64, complex floats should be
passed in a pair of floating point registers, even though a
complex float would fit in one 64-bit floating point register.
The default value of this hook is `NULL', which is treated as
always false.
-- Target Hook: tree TARGET_BUILD_BUILTIN_VA_LIST (void)
This hook returns a type node for `va_list' for the target. The
default version of the hook returns `void*'.
-- Target Hook: int TARGET_ENUM_VA_LIST_P (int IDX, const char
**PNAME, tree *PTREE)
This target hook is used in function `c_common_nodes_and_builtins'
to iterate through the target specific builtin types for va_list.
The variable IDX is used as iterator. PNAME has to be a pointer to
a `const char *' and PTREE a pointer to a `tree' typed variable.
The arguments PNAME and PTREE are used to store the result of this
macro and are set to the name of the va_list builtin type and its
internal type. If the return value of this macro is zero, then
there is no more element. Otherwise the IDX should be increased
for the next call of this macro to iterate through all types.
-- Target Hook: tree TARGET_FN_ABI_VA_LIST (tree FNDECL)
This hook returns the va_list type of the calling convention
specified by FNDECL. The default version of this hook returns
`va_list_type_node'.
-- Target Hook: tree TARGET_CANONICAL_VA_LIST_TYPE (tree TYPE)
This hook returns the va_list type of the calling convention
specified by the type of TYPE. If TYPE is not a valid va_list
type, it returns `NULL_TREE'.
-- Target Hook: tree TARGET_GIMPLIFY_VA_ARG_EXPR (tree VALIST, tree
TYPE, gimple_seq *PRE_P, gimple_seq *POST_P)
This hook performs target-specific gimplification of
`VA_ARG_EXPR'. The first two parameters correspond to the
arguments to `va_arg'; the latter two are as in
`gimplify.c:gimplify_expr'.
-- Target Hook: bool TARGET_VALID_POINTER_MODE (enum machine_mode MODE)
Define this to return nonzero if the port can handle pointers with
machine mode MODE. The default version of this hook returns true
for both `ptr_mode' and `Pmode'.
-- Target Hook: bool TARGET_REF_MAY_ALIAS_ERRNO (struct ao_ref_s *REF)
Define this to return nonzero if the memory reference REF may
alias with the system C library errno location. The default
version of this hook assumes the system C library errno location
is either a declaration of type int or accessed by dereferencing
a pointer to int.
-- Target Hook: bool TARGET_SCALAR_MODE_SUPPORTED_P (enum machine_mode
MODE)
Define this to return nonzero if the port is prepared to handle
insns involving scalar mode MODE. For a scalar mode to be
considered supported, all the basic arithmetic and comparisons
must work.
The default version of this hook returns true for any mode
required to handle the basic C types (as defined by the port).
Included here are the double-word arithmetic supported by the code
in `optabs.c'.
-- Target Hook: bool TARGET_VECTOR_MODE_SUPPORTED_P (enum machine_mode
MODE)
Define this to return nonzero if the port is prepared to handle
insns involving vector mode MODE. At the very least, it must have
move patterns for this mode.
-- Target Hook: bool TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P (enum
machine_mode MODE)
Define this to return nonzero for machine modes for which the port
has small register classes. If this target hook returns nonzero
for a given MODE, the compiler will try to minimize the lifetime
of registers in MODE. The hook may be called with `VOIDmode' as
argument. In this case, the hook is expected to return nonzero if
it returns nonzero for any mode.
On some machines, it is risky to let hard registers live across
arbitrary insns. Typically, these machines have instructions that
require values to be in specific registers (like an accumulator),
and reload will fail if the required hard register is used for
another purpose across such an insn.
Passes before reload do not know which hard registers will be used
in an instruction, but the machine modes of the registers set or
used in the instruction are already known. And for some machines,
register classes are small for, say, integer registers but not for
floating point registers. For example, the AMD x86-64
architecture requires specific registers for the legacy x86
integer instructions, but there are many SSE registers for
floating point operations. On such targets, a good strategy may
be to return nonzero from this hook for `INTEGRAL_MODE_P' machine
modes but zero for the SSE register classes.
The default version of this hook returns false for any mode. It
is always safe to redefine this hook to return with a nonzero
value. But if you unnecessarily define it, you will reduce the
amount of optimizations that can be performed in some cases. If
you do not define this hook to return a nonzero value when it is
required, the compiler will run out of spill registers and print a
fatal error message.
-- Target Hook: unsigned int TARGET_FLAGS_REGNUM
If the target has a dedicated flags register, and it needs to use
the post-reload comparison elimination pass, then this value
should be set appropriately.
File: gccint.info, Node: Scalar Return, Next: Aggregate Return, Prev: Register Arguments, Up: Stack and Calling
17.10.8 How Scalar Function Values Are Returned
-----------------------------------------------
This section discusses the macros that control returning scalars as
values--values that can fit in registers.
-- Target Hook: rtx TARGET_FUNCTION_VALUE (const_tree RET_TYPE,
const_tree FN_DECL_OR_TYPE, bool OUTGOING)
Define this to return an RTX representing the place where a
function returns or receives a value of data type RET_TYPE, a tree
node representing a data type. FN_DECL_OR_TYPE is a tree node
representing `FUNCTION_DECL' or `FUNCTION_TYPE' of a function
being called. If OUTGOING is false, the hook should compute the
register in which the caller will see the return value.
Otherwise, the hook should return an RTX representing the place
where a function returns a value.
On many machines, only `TYPE_MODE (RET_TYPE)' is relevant.
(Actually, on most machines, scalar values are returned in the same
place regardless of mode.) The value of the expression is usually
a `reg' RTX for the hard register where the return value is stored.
The value can also be a `parallel' RTX, if the return value is in
multiple places. See `FUNCTION_ARG' for an explanation of the
`parallel' form. Note that the callee will populate every
location specified in the `parallel', but if the first element of
the `parallel' contains the whole return value, callers will use
that element as the canonical location and ignore the others. The
m68k port uses this type of `parallel' to return pointers in both
`%a0' (the canonical location) and `%d0'.
If `TARGET_PROMOTE_FUNCTION_RETURN' returns true, you must apply
the same promotion rules specified in `PROMOTE_MODE' if VALTYPE is
a scalar type.
If the precise function being called is known, FUNC is a tree node
(`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This
makes it possible to use a different value-returning convention
for specific functions when all their calls are known.
Some target machines have "register windows" so that the register
in which a function returns its value is not the same as the one
in which the caller sees the value. For such machines, you should
return different RTX depending on OUTGOING.
`TARGET_FUNCTION_VALUE' is not used for return values with
aggregate data types, because these are returned in another way.
See `TARGET_STRUCT_VALUE_RTX' and related macros, below.
-- Macro: FUNCTION_VALUE (VALTYPE, FUNC)
This macro has been deprecated. Use `TARGET_FUNCTION_VALUE' for a
new target instead.
-- Macro: LIBCALL_VALUE (MODE)
A C expression to create an RTX representing the place where a
library function returns a value of mode MODE.
Note that "library function" in this context means a compiler
support routine, used to perform arithmetic, whose name is known
specially by the compiler and was not mentioned in the C code being
compiled.
-- Target Hook: rtx TARGET_LIBCALL_VALUE (enum machine_mode MODE,
const_rtx FUN)
Define this hook if the back-end needs to know the name of the
libcall function in order to determine where the result should be
returned.
The mode of the result is given by MODE and the name of the called
library function is given by FUN. The hook should return an RTX
representing the place where the library function result will be
returned.
If this hook is not defined, then LIBCALL_VALUE will be used.
-- Macro: FUNCTION_VALUE_REGNO_P (REGNO)
A C expression that is nonzero if REGNO is the number of a hard
register in which the values of called function may come back.
A register whose use for returning values is limited to serving as
the second of a pair (for a value of type `double', say) need not
be recognized by this macro. So for most machines, this definition
suffices:
#define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)
If the machine has register windows, so that the caller and the
called function use different registers for the return value, this
macro should recognize only the caller's register numbers.
This macro has been deprecated. Use
`TARGET_FUNCTION_VALUE_REGNO_P' for a new target instead.
-- Target Hook: bool TARGET_FUNCTION_VALUE_REGNO_P (const unsigned int
REGNO)
A target hook that return `true' if REGNO is the number of a hard
register in which the values of called function may come back.
A register whose use for returning values is limited to serving as
the second of a pair (for a value of type `double', say) need not
be recognized by this target hook.
If the machine has register windows, so that the caller and the
called function use different registers for the return value, this
target hook should recognize only the caller's register numbers.
If this hook is not defined, then FUNCTION_VALUE_REGNO_P will be
used.
-- Macro: APPLY_RESULT_SIZE
Define this macro if `untyped_call' and `untyped_return' need more
space than is implied by `FUNCTION_VALUE_REGNO_P' for saving and
restoring an arbitrary return value.
-- Target Hook: bool TARGET_RETURN_IN_MSB (const_tree TYPE)
This hook should return true if values of type TYPE are returned
at the most significant end of a register (in other words, if they
are padded at the least significant end). You can assume that TYPE
is returned in a register; the caller is required to check this.
Note that the register provided by `TARGET_FUNCTION_VALUE' must be
able to hold the complete return value. For example, if a 1-, 2-
or 3-byte structure is returned at the most significant end of a
4-byte register, `TARGET_FUNCTION_VALUE' should provide an
`SImode' rtx.
File: gccint.info, Node: Aggregate Return, Next: Caller Saves, Prev: Scalar Return, Up: Stack and Calling
17.10.9 How Large Values Are Returned
-------------------------------------
When a function value's mode is `BLKmode' (and in some other cases),
the value is not returned according to `TARGET_FUNCTION_VALUE' (*note
Scalar Return::). Instead, the caller passes the address of a block of
memory in which the value should be stored. This address is called the
"structure value address".
This section describes how to control returning structure values in
memory.
-- Target Hook: bool TARGET_RETURN_IN_MEMORY (const_tree TYPE,
const_tree FNTYPE)
This target hook should return a nonzero value to say to return the
function value in memory, just as large structures are always
returned. Here TYPE will be the data type of the value, and FNTYPE
will be the type of the function doing the returning, or `NULL' for
libcalls.
Note that values of mode `BLKmode' must be explicitly handled by
this function. Also, the option `-fpcc-struct-return' takes
effect regardless of this macro. On most systems, it is possible
to leave the hook undefined; this causes a default definition to
be used, whose value is the constant 1 for `BLKmode' values, and 0
otherwise.
Do not use this hook to indicate that structures and unions should
always be returned in memory. You should instead use
`DEFAULT_PCC_STRUCT_RETURN' to indicate this.
-- Macro: DEFAULT_PCC_STRUCT_RETURN
Define this macro to be 1 if all structure and union return values
must be in memory. Since this results in slower code, this should
be defined only if needed for compatibility with other compilers
or with an ABI. If you define this macro to be 0, then the
conventions used for structure and union return values are decided
by the `TARGET_RETURN_IN_MEMORY' target hook.
If not defined, this defaults to the value 1.
-- Target Hook: rtx TARGET_STRUCT_VALUE_RTX (tree FNDECL, int INCOMING)
This target hook should return the location of the structure value
address (normally a `mem' or `reg'), or 0 if the address is passed
as an "invisible" first argument. Note that FNDECL may be `NULL',
for libcalls. You do not need to define this target hook if the
address is always passed as an "invisible" first argument.
On some architectures the place where the structure value address
is found by the called function is not the same place that the
caller put it. This can be due to register windows, or it could
be because the function prologue moves it to a different place.
INCOMING is `1' or `2' when the location is needed in the context
of the called function, and `0' in the context of the caller.
If INCOMING is nonzero and the address is to be found on the
stack, return a `mem' which refers to the frame pointer. If
INCOMING is `2', the result is being used to fetch the structure
value address at the beginning of a function. If you need to emit
adjusting code, you should do it at this point.
-- Macro: PCC_STATIC_STRUCT_RETURN
Define this macro if the usual system convention on the target
machine for returning structures and unions is for the called
function to return the address of a static variable containing the
value.
Do not define this if the usual system convention is for the
caller to pass an address to the subroutine.
This macro has effect in `-fpcc-struct-return' mode, but it does
nothing when you use `-freg-struct-return' mode.
-- Target Hook: enum machine_mode TARGET_GET_RAW_RESULT_MODE (int
REGNO)
This target hook returns the mode to be used when accessing raw
return registers in `__builtin_return'. Define this macro if the
value in REG_RAW_MODE is not correct.
-- Target Hook: enum machine_mode TARGET_GET_RAW_ARG_MODE (int REGNO)
This target hook returns the mode to be used when accessing raw
argument registers in `__builtin_apply_args'. Define this macro
if the value in REG_RAW_MODE is not correct.
File: gccint.info, Node: Caller Saves, Next: Function Entry, Prev: Aggregate Return, Up: Stack and Calling
17.10.10 Caller-Saves Register Allocation
-----------------------------------------
If you enable it, GCC can save registers around function calls. This
makes it possible to use call-clobbered registers to hold variables that
must live across calls.
-- Macro: CALLER_SAVE_PROFITABLE (REFS, CALLS)
A C expression to determine whether it is worthwhile to consider
placing a pseudo-register in a call-clobbered hard register and
saving and restoring it around each function call. The expression
should be 1 when this is worth doing, and 0 otherwise.
If you don't define this macro, a default is used which is good on
most machines: `4 * CALLS < REFS'.
-- Macro: HARD_REGNO_CALLER_SAVE_MODE (REGNO, NREGS)
A C expression specifying which mode is required for saving NREGS
of a pseudo-register in call-clobbered hard register REGNO. If
REGNO is unsuitable for caller save, `VOIDmode' should be
returned. For most machines this macro need not be defined since
GCC will select the smallest suitable mode.
File: gccint.info, Node: Function Entry, Next: Profiling, Prev: Caller Saves, Up: Stack and Calling
17.10.11 Function Entry and Exit
--------------------------------
This section describes the macros that output function entry
("prologue") and exit ("epilogue") code.
-- Target Hook: void TARGET_ASM_FUNCTION_PROLOGUE (FILE *FILE,
HOST_WIDE_INT SIZE)
If defined, a function that outputs the assembler code for entry
to a function. The prologue is responsible for setting up the
stack frame, initializing the frame pointer register, saving
registers that must be saved, and allocating SIZE additional bytes
of storage for the local variables. SIZE is an integer. FILE is
a stdio stream to which the assembler code should be output.
The label for the beginning of the function need not be output by
this macro. That has already been done when the macro is run.
To determine which registers to save, the macro can refer to the
array `regs_ever_live': element R is nonzero if hard register R is
used anywhere within the function. This implies the function
prologue should save register R, provided it is not one of the
call-used registers. (`TARGET_ASM_FUNCTION_EPILOGUE' must
likewise use `regs_ever_live'.)
On machines that have "register windows", the function entry code
does not save on the stack the registers that are in the windows,
even if they are supposed to be preserved by function calls;
instead it takes appropriate steps to "push" the register stack,
if any non-call-used registers are used in the function.
On machines where functions may or may not have frame-pointers, the
function entry code must vary accordingly; it must set up the frame
pointer if one is wanted, and not otherwise. To determine whether
a frame pointer is in wanted, the macro can refer to the variable
`frame_pointer_needed'. The variable's value will be 1 at run
time in a function that needs a frame pointer. *Note
Elimination::.
The function entry code is responsible for allocating any stack
space required for the function. This stack space consists of the
regions listed below. In most cases, these regions are allocated
in the order listed, with the last listed region closest to the
top of the stack (the lowest address if `STACK_GROWS_DOWNWARD' is
defined, and the highest address if it is not defined). You can
use a different order for a machine if doing so is more convenient
or required for compatibility reasons. Except in cases where
required by standard or by a debugger, there is no reason why the
stack layout used by GCC need agree with that used by other
compilers for a machine.
-- Target Hook: void TARGET_ASM_FUNCTION_END_PROLOGUE (FILE *FILE)
If defined, a function that outputs assembler code at the end of a
prologue. This should be used when the function prologue is being
emitted as RTL, and you have some extra assembler that needs to be
emitted. *Note prologue instruction pattern::.
-- Target Hook: void TARGET_ASM_FUNCTION_BEGIN_EPILOGUE (FILE *FILE)
If defined, a function that outputs assembler code at the start of
an epilogue. This should be used when the function epilogue is
being emitted as RTL, and you have some extra assembler that needs
to be emitted. *Note epilogue instruction pattern::.
-- Target Hook: void TARGET_ASM_FUNCTION_EPILOGUE (FILE *FILE,
HOST_WIDE_INT SIZE)
If defined, a function that outputs the assembler code for exit
from a function. The epilogue is responsible for restoring the
saved registers and stack pointer to their values when the
function was called, and returning control to the caller. This
macro takes the same arguments as the macro
`TARGET_ASM_FUNCTION_PROLOGUE', and the registers to restore are
determined from `regs_ever_live' and `CALL_USED_REGISTERS' in the
same way.
On some machines, there is a single instruction that does all the
work of returning from the function. On these machines, give that
instruction the name `return' and do not define the macro
`TARGET_ASM_FUNCTION_EPILOGUE' at all.
Do not define a pattern named `return' if you want the
`TARGET_ASM_FUNCTION_EPILOGUE' to be used. If you want the target
switches to control whether return instructions or epilogues are
used, define a `return' pattern with a validity condition that
tests the target switches appropriately. If the `return'
pattern's validity condition is false, epilogues will be used.
On machines where functions may or may not have frame-pointers, the
function exit code must vary accordingly. Sometimes the code for
these two cases is completely different. To determine whether a
frame pointer is wanted, the macro can refer to the variable
`frame_pointer_needed'. The variable's value will be 1 when
compiling a function that needs a frame pointer.
Normally, `TARGET_ASM_FUNCTION_PROLOGUE' and
`TARGET_ASM_FUNCTION_EPILOGUE' must treat leaf functions specially.
The C variable `current_function_is_leaf' is nonzero for such a
function. *Note Leaf Functions::.
On some machines, some functions pop their arguments on exit while
others leave that for the caller to do. For example, the 68020
when given `-mrtd' pops arguments in functions that take a fixed
number of arguments.
Your definition of the macro `RETURN_POPS_ARGS' decides which
functions pop their own arguments. `TARGET_ASM_FUNCTION_EPILOGUE'
needs to know what was decided. The number of bytes of the current
function's arguments that this function should pop is available in
`crtl->args.pops_args'. *Note Scalar Return::.
* A region of `current_function_pretend_args_size' bytes of
uninitialized space just underneath the first argument arriving on
the stack. (This may not be at the very start of the allocated
stack region if the calling sequence has pushed anything else
since pushing the stack arguments. But usually, on such machines,
nothing else has been pushed yet, because the function prologue
itself does all the pushing.) This region is used on machines
where an argument may be passed partly in registers and partly in
memory, and, in some cases to support the features in `<stdarg.h>'.
* An area of memory used to save certain registers used by the
function. The size of this area, which may also include space for
such things as the return address and pointers to previous stack
frames, is machine-specific and usually depends on which registers
have been used in the function. Machines with register windows
often do not require a save area.
* A region of at least SIZE bytes, possibly rounded up to an
allocation boundary, to contain the local variables of the
function. On some machines, this region and the save area may
occur in the opposite order, with the save area closer to the top
of the stack.
* Optionally, when `ACCUMULATE_OUTGOING_ARGS' is defined, a region of
`current_function_outgoing_args_size' bytes to be used for outgoing
argument lists of the function. *Note Stack Arguments::.
-- Macro: EXIT_IGNORE_STACK
Define this macro as a C expression that is nonzero if the return
instruction or the function epilogue ignores the value of the stack
pointer; in other words, if it is safe to delete an instruction to
adjust the stack pointer before a return from the function. The
default is 0.
Note that this macro's value is relevant only for functions for
which frame pointers are maintained. It is never safe to delete a
final stack adjustment in a function that has no frame pointer,
and the compiler knows this regardless of `EXIT_IGNORE_STACK'.
-- Macro: EPILOGUE_USES (REGNO)
Define this macro as a C expression that is nonzero for registers
that are used by the epilogue or the `return' pattern. The stack
and frame pointer registers are already assumed to be used as
needed.
-- Macro: EH_USES (REGNO)
Define this macro as a C expression that is nonzero for registers
that are used by the exception handling mechanism, and so should
be considered live on entry to an exception edge.
-- Macro: DELAY_SLOTS_FOR_EPILOGUE
Define this macro if the function epilogue contains delay slots to
which instructions from the rest of the function can be "moved".
The definition should be a C expression whose value is an integer
representing the number of delay slots there.
-- Macro: ELIGIBLE_FOR_EPILOGUE_DELAY (INSN, N)
A C expression that returns 1 if INSN can be placed in delay slot
number N of the epilogue.
The argument N is an integer which identifies the delay slot now
being considered (since different slots may have different rules of
eligibility). It is never negative and is always less than the
number of epilogue delay slots (what `DELAY_SLOTS_FOR_EPILOGUE'
returns). If you reject a particular insn for a given delay slot,
in principle, it may be reconsidered for a subsequent delay slot.
Also, other insns may (at least in principle) be considered for
the so far unfilled delay slot.
The insns accepted to fill the epilogue delay slots are put in an
RTL list made with `insn_list' objects, stored in the variable
`current_function_epilogue_delay_list'. The insn for the first
delay slot comes first in the list. Your definition of the macro
`TARGET_ASM_FUNCTION_EPILOGUE' should fill the delay slots by
outputting the insns in this list, usually by calling
`final_scan_insn'.
You need not define this macro if you did not define
`DELAY_SLOTS_FOR_EPILOGUE'.
-- Target Hook: void TARGET_ASM_OUTPUT_MI_THUNK (FILE *FILE, tree
THUNK_FNDECL, HOST_WIDE_INT DELTA, HOST_WIDE_INT
VCALL_OFFSET, tree FUNCTION)
A function that outputs the assembler code for a thunk function,
used to implement C++ virtual function calls with multiple
inheritance. The thunk acts as a wrapper around a virtual
function, adjusting the implicit object parameter before handing
control off to the real function.
First, emit code to add the integer DELTA to the location that
contains the incoming first argument. Assume that this argument
contains a pointer, and is the one used to pass the `this' pointer
in C++. This is the incoming argument _before_ the function
prologue, e.g. `%o0' on a sparc. The addition must preserve the
values of all other incoming arguments.
Then, if VCALL_OFFSET is nonzero, an additional adjustment should
be made after adding `delta'. In particular, if P is the adjusted
pointer, the following adjustment should be made:
p += (*((ptrdiff_t **)p))[vcall_offset/sizeof(ptrdiff_t)]
After the additions, emit code to jump to FUNCTION, which is a
`FUNCTION_DECL'. This is a direct pure jump, not a call, and does
not touch the return address. Hence returning from FUNCTION will
return to whoever called the current `thunk'.
The effect must be as if FUNCTION had been called directly with
the adjusted first argument. This macro is responsible for
emitting all of the code for a thunk function;
`TARGET_ASM_FUNCTION_PROLOGUE' and `TARGET_ASM_FUNCTION_EPILOGUE'
are not invoked.
The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already
been extracted from it.) It might possibly be useful on some
targets, but probably not.
If you do not define this macro, the target-independent code in
the C++ front end will generate a less efficient heavyweight thunk
that calls FUNCTION instead of jumping to it. The generic
approach does not support varargs.
-- Target Hook: bool TARGET_ASM_CAN_OUTPUT_MI_THUNK (const_tree
THUNK_FNDECL, HOST_WIDE_INT DELTA, HOST_WIDE_INT
VCALL_OFFSET, const_tree FUNCTION)
A function that returns true if TARGET_ASM_OUTPUT_MI_THUNK would
be able to output the assembler code for the thunk function
specified by the arguments it is passed, and false otherwise. In
the latter case, the generic approach will be used by the C++
front end, with the limitations previously exposed.
File: gccint.info, Node: Profiling, Next: Tail Calls, Prev: Function Entry, Up: Stack and Calling
17.10.12 Generating Code for Profiling
--------------------------------------
These macros will help you generate code for profiling.
-- Macro: FUNCTION_PROFILER (FILE, LABELNO)
A C statement or compound statement to output to FILE some
assembler code to call the profiling subroutine `mcount'.
The details of how `mcount' expects to be called are determined by
your operating system environment, not by GCC. To figure them out,
compile a small program for profiling using the system's installed
C compiler and look at the assembler code that results.
Older implementations of `mcount' expect the address of a counter
variable to be loaded into some register. The name of this
variable is `LP' followed by the number LABELNO, so you would
generate the name using `LP%d' in a `fprintf'.
-- Macro: PROFILE_HOOK
A C statement or compound statement to output to FILE some assembly
code to call the profiling subroutine `mcount' even the target does
not support profiling.
-- Macro: NO_PROFILE_COUNTERS
Define this macro to be an expression with a nonzero value if the
`mcount' subroutine on your system does not need a counter variable
allocated for each function. This is true for almost all modern
implementations. If you define this macro, you must not use the
LABELNO argument to `FUNCTION_PROFILER'.
-- Macro: PROFILE_BEFORE_PROLOGUE
Define this macro if the code for function profiling should come
before the function prologue. Normally, the profiling code comes
after.
File: gccint.info, Node: Tail Calls, Next: Stack Smashing Protection, Prev: Profiling, Up: Stack and Calling
17.10.13 Permitting tail calls
------------------------------
-- Target Hook: bool TARGET_FUNCTION_OK_FOR_SIBCALL (tree DECL, tree
EXP)
True if it is ok to do sibling call optimization for the specified
call expression EXP. DECL will be the called function, or `NULL'
if this is an indirect call.
It is not uncommon for limitations of calling conventions to
prevent tail calls to functions outside the current unit of
translation, or during PIC compilation. The hook is used to
enforce these restrictions, as the `sibcall' md pattern can not
fail, or fall over to a "normal" call. The criteria for
successful sibling call optimization may vary greatly between
different architectures.
-- Target Hook: void TARGET_EXTRA_LIVE_ON_ENTRY (bitmap REGS)
Add any hard registers to REGS that are live on entry to the
function. This hook only needs to be defined to provide registers
that cannot be found by examination of FUNCTION_ARG_REGNO_P, the
callee saved registers, STATIC_CHAIN_INCOMING_REGNUM,
STATIC_CHAIN_REGNUM, TARGET_STRUCT_VALUE_RTX,
FRAME_POINTER_REGNUM, EH_USES, FRAME_POINTER_REGNUM,
ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM.
File: gccint.info, Node: Stack Smashing Protection, Prev: Tail Calls, Up: Stack and Calling
17.10.14 Stack smashing protection
----------------------------------
-- Target Hook: tree TARGET_STACK_PROTECT_GUARD (void)
This hook returns a `DECL' node for the external variable to use
for the stack protection guard. This variable is initialized by
the runtime to some random value and is used to initialize the
guard value that is placed at the top of the local stack frame.
The type of this variable must be `ptr_type_node'.
The default version of this hook creates a variable called
`__stack_chk_guard', which is normally defined in `libgcc2.c'.
-- Target Hook: tree TARGET_STACK_PROTECT_FAIL (void)
This hook returns a tree expression that alerts the runtime that
the stack protect guard variable has been modified. This
expression should involve a call to a `noreturn' function.
The default version of this hook invokes a function called
`__stack_chk_fail', taking no arguments. This function is
normally defined in `libgcc2.c'.
-- Target Hook: bool TARGET_SUPPORTS_SPLIT_STACK (bool REPORT, struct
gcc_options *OPTS)
Whether this target supports splitting the stack when the options
described in OPTS have been passed. This is called after options
have been parsed, so the target may reject splitting the stack in
some configurations. The default version of this hook returns
false. If REPORT is true, this function may issue a warning or
error; if REPORT is false, it must simply return a value
File: gccint.info, Node: Varargs, Next: Trampolines, Prev: Stack and Calling, Up: Target Macros
17.11 Implementing the Varargs Macros
=====================================
GCC comes with an implementation of `<varargs.h>' and `<stdarg.h>' that
work without change on machines that pass arguments on the stack.
Other machines require their own implementations of varargs, and the
two machine independent header files must have conditionals to include
it.
ISO `<stdarg.h>' differs from traditional `<varargs.h>' mainly in the
calling convention for `va_start'. The traditional implementation
takes just one argument, which is the variable in which to store the
argument pointer. The ISO implementation of `va_start' takes an
additional second argument. The user is supposed to write the last
named argument of the function here.
However, `va_start' should not use this argument. The way to find the
end of the named arguments is with the built-in functions described
below.
-- Macro: __builtin_saveregs ()
Use this built-in function to save the argument registers in
memory so that the varargs mechanism can access them. Both ISO
and traditional versions of `va_start' must use
`__builtin_saveregs', unless you use
`TARGET_SETUP_INCOMING_VARARGS' (see below) instead.
On some machines, `__builtin_saveregs' is open-coded under the
control of the target hook `TARGET_EXPAND_BUILTIN_SAVEREGS'. On
other machines, it calls a routine written in assembler language,
found in `libgcc2.c'.
Code generated for the call to `__builtin_saveregs' appears at the
beginning of the function, as opposed to where the call to
`__builtin_saveregs' is written, regardless of what the code is.
This is because the registers must be saved before the function
starts to use them for its own purposes.
-- Macro: __builtin_next_arg (LASTARG)
This builtin returns the address of the first anonymous stack
argument, as type `void *'. If `ARGS_GROW_DOWNWARD', it returns
the address of the location above the first anonymous stack
argument. Use it in `va_start' to initialize the pointer for
fetching arguments from the stack. Also use it in `va_start' to
verify that the second parameter LASTARG is the last named argument
of the current function.
-- Macro: __builtin_classify_type (OBJECT)
Since each machine has its own conventions for which data types are
passed in which kind of register, your implementation of `va_arg'
has to embody these conventions. The easiest way to categorize the
specified data type is to use `__builtin_classify_type' together
with `sizeof' and `__alignof__'.
`__builtin_classify_type' ignores the value of OBJECT, considering
only its data type. It returns an integer describing what kind of
type that is--integer, floating, pointer, structure, and so on.
The file `typeclass.h' defines an enumeration that you can use to
interpret the values of `__builtin_classify_type'.
These machine description macros help implement varargs:
-- Target Hook: rtx TARGET_EXPAND_BUILTIN_SAVEREGS (void)
If defined, this hook produces the machine-specific code for a
call to `__builtin_saveregs'. This code will be moved to the very
beginning of the function, before any parameter access are made.
The return value of this function should be an RTX that contains
the value to use as the return of `__builtin_saveregs'.
-- Target Hook: void TARGET_SETUP_INCOMING_VARARGS (CUMULATIVE_ARGS
*ARGS_SO_FAR, enum machine_mode MODE, tree TYPE, int
*PRETEND_ARGS_SIZE, int SECOND_TIME)
This target hook offers an alternative to using
`__builtin_saveregs' and defining the hook
`TARGET_EXPAND_BUILTIN_SAVEREGS'. Use it to store the anonymous
register arguments into the stack so that all the arguments appear
to have been passed consecutively on the stack. Once this is
done, you can use the standard implementation of varargs that
works for machines that pass all their arguments on the stack.
The argument ARGS_SO_FAR points to the `CUMULATIVE_ARGS' data
structure, containing the values that are obtained after
processing the named arguments. The arguments MODE and TYPE
describe the last named argument--its machine mode and its data
type as a tree node.
The target hook should do two things: first, push onto the stack
all the argument registers _not_ used for the named arguments, and
second, store the size of the data thus pushed into the
`int'-valued variable pointed to by PRETEND_ARGS_SIZE. The value
that you store here will serve as additional offset for setting up
the stack frame.
Because you must generate code to push the anonymous arguments at
compile time without knowing their data types,
`TARGET_SETUP_INCOMING_VARARGS' is only useful on machines that
have just a single category of argument register and use it
uniformly for all data types.
If the argument SECOND_TIME is nonzero, it means that the
arguments of the function are being analyzed for the second time.
This happens for an inline function, which is not actually
compiled until the end of the source file. The hook
`TARGET_SETUP_INCOMING_VARARGS' should not generate any
instructions in this case.
-- Target Hook: bool TARGET_STRICT_ARGUMENT_NAMING (CUMULATIVE_ARGS
*CA)
Define this hook to return `true' if the location where a function
argument is passed depends on whether or not it is a named
argument.
This hook controls how the NAMED argument to `FUNCTION_ARG' is set
for varargs and stdarg functions. If this hook returns `true',
the NAMED argument is always true for named arguments, and false
for unnamed arguments. If it returns `false', but
`TARGET_PRETEND_OUTGOING_VARARGS_NAMED' returns `true', then all
arguments are treated as named. Otherwise, all named arguments
except the last are treated as named.
You need not define this hook if it always returns `false'.
-- Target Hook: bool TARGET_PRETEND_OUTGOING_VARARGS_NAMED
(CUMULATIVE_ARGS *CA)
If you need to conditionally change ABIs so that one works with
`TARGET_SETUP_INCOMING_VARARGS', but the other works like neither
`TARGET_SETUP_INCOMING_VARARGS' nor
`TARGET_STRICT_ARGUMENT_NAMING' was defined, then define this hook
to return `true' if `TARGET_SETUP_INCOMING_VARARGS' is used,
`false' otherwise. Otherwise, you should not define this hook.
File: gccint.info, Node: Trampolines, Next: Library Calls, Prev: Varargs, Up: Target Macros
17.12 Trampolines for Nested Functions
======================================
A "trampoline" is a small piece of code that is created at run time
when the address of a nested function is taken. It normally resides on
the stack, in the stack frame of the containing function. These macros
tell GCC how to generate code to allocate and initialize a trampoline.
The instructions in the trampoline must do two things: load a constant
address into the static chain register, and jump to the real address of
the nested function. On CISC machines such as the m68k, this requires
two instructions, a move immediate and a jump. Then the two addresses
exist in the trampoline as word-long immediate operands. On RISC
machines, it is often necessary to load each address into a register in
two parts. Then pieces of each address form separate immediate
operands.
The code generated to initialize the trampoline must store the variable
parts--the static chain value and the function address--into the
immediate operands of the instructions. On a CISC machine, this is
simply a matter of copying each address to a memory reference at the
proper offset from the start of the trampoline. On a RISC machine, it
may be necessary to take out pieces of the address and store them
separately.
-- Target Hook: void TARGET_ASM_TRAMPOLINE_TEMPLATE (FILE *F)
This hook is called by `assemble_trampoline_template' to output,
on the stream F, assembler code for a block of data that contains
the constant parts of a trampoline. This code should not include a
label--the label is taken care of automatically.
If you do not define this hook, it means no template is needed for
the target. Do not define this hook on systems where the block
move code to copy the trampoline into place would be larger than
the code to generate it on the spot.
-- Macro: TRAMPOLINE_SECTION
Return the section into which the trampoline template is to be
placed (*note Sections::). The default value is
`readonly_data_section'.
-- Macro: TRAMPOLINE_SIZE
A C expression for the size in bytes of the trampoline, as an
integer.
-- Macro: TRAMPOLINE_ALIGNMENT
Alignment required for trampolines, in bits.
If you don't define this macro, the value of `FUNCTION_ALIGNMENT'
is used for aligning trampolines.
-- Target Hook: void TARGET_TRAMPOLINE_INIT (rtx M_TRAMP, tree FNDECL,
rtx STATIC_CHAIN)
This hook is called to initialize a trampoline. M_TRAMP is an RTX
for the memory block for the trampoline; FNDECL is the
`FUNCTION_DECL' for the nested function; STATIC_CHAIN is an RTX
for the static chain value that should be passed to the function
when it is called.
If the target defines `TARGET_ASM_TRAMPOLINE_TEMPLATE', then the
first thing this hook should do is emit a block move into M_TRAMP
from the memory block returned by `assemble_trampoline_template'.
Note that the block move need only cover the constant parts of the
trampoline. If the target isolates the variable parts of the
trampoline to the end, not all `TRAMPOLINE_SIZE' bytes need be
copied.
If the target requires any other actions, such as flushing caches
or enabling stack execution, these actions should be performed
after initializing the trampoline proper.
-- Target Hook: rtx TARGET_TRAMPOLINE_ADJUST_ADDRESS (rtx ADDR)
This hook should perform any machine-specific adjustment in the
address of the trampoline. Its argument contains the address of
the memory block that was passed to `TARGET_TRAMPOLINE_INIT'. In
case the address to be used for a function call should be
different from the address at which the template was stored, the
different address should be returned; otherwise ADDR should be
returned unchanged. If this hook is not defined, ADDR will be
used for function calls.
Implementing trampolines is difficult on many machines because they
have separate instruction and data caches. Writing into a stack
location fails to clear the memory in the instruction cache, so when
the program jumps to that location, it executes the old contents.
Here are two possible solutions. One is to clear the relevant parts of
the instruction cache whenever a trampoline is set up. The other is to
make all trampolines identical, by having them jump to a standard
subroutine. The former technique makes trampoline execution faster; the
latter makes initialization faster.
To clear the instruction cache when a trampoline is initialized, define
the following macro.
-- Macro: CLEAR_INSN_CACHE (BEG, END)
If defined, expands to a C expression clearing the _instruction
cache_ in the specified interval. The definition of this macro
would typically be a series of `asm' statements. Both BEG and END
are both pointer expressions.
The operating system may also require the stack to be made executable
before calling the trampoline. To implement this requirement, define
the following macro.
-- Macro: ENABLE_EXECUTE_STACK
Define this macro if certain operations must be performed before
executing code located on the stack. The macro should expand to a
series of C file-scope constructs (e.g. functions) and provide a
unique entry point named `__enable_execute_stack'. The target is
responsible for emitting calls to the entry point in the code, for
example from the `TARGET_TRAMPOLINE_INIT' hook.
To use a standard subroutine, define the following macro. In addition,
you must make sure that the instructions in a trampoline fill an entire
cache line with identical instructions, or else ensure that the
beginning of the trampoline code is always aligned at the same point in
its cache line. Look in `m68k.h' as a guide.
-- Macro: TRANSFER_FROM_TRAMPOLINE
Define this macro if trampolines need a special subroutine to do
their work. The macro should expand to a series of `asm'
statements which will be compiled with GCC. They go in a library
function named `__transfer_from_trampoline'.
If you need to avoid executing the ordinary prologue code of a
compiled C function when you jump to the subroutine, you can do so
by placing a special label of your own in the assembler code. Use
one `asm' statement to generate an assembler label, and another to
make the label global. Then trampolines can use that label to
jump directly to your special assembler code.
File: gccint.info, Node: Library Calls, Next: Addressing Modes, Prev: Trampolines, Up: Target Macros
17.13 Implicit Calls to Library Routines
========================================
Here is an explanation of implicit calls to library routines.
-- Macro: DECLARE_LIBRARY_RENAMES
This macro, if defined, should expand to a piece of C code that
will get expanded when compiling functions for libgcc.a. It can
be used to provide alternate names for GCC's internal library
functions if there are ABI-mandated names that the compiler should
provide.
-- Target Hook: void TARGET_INIT_LIBFUNCS (void)
This hook should declare additional library routines or rename
existing ones, using the functions `set_optab_libfunc' and
`init_one_libfunc' defined in `optabs.c'. `init_optabs' calls
this macro after initializing all the normal library routines.
The default is to do nothing. Most ports don't need to define
this hook.
-- Macro: FLOAT_LIB_COMPARE_RETURNS_BOOL (MODE, COMPARISON)
This macro should return `true' if the library routine that
implements the floating point comparison operator COMPARISON in
mode MODE will return a boolean, and FALSE if it will return a
tristate.
GCC's own floating point libraries return tristates from the
comparison operators, so the default returns false always. Most
ports don't need to define this macro.
-- Macro: TARGET_LIB_INT_CMP_BIASED
This macro should evaluate to `true' if the integer comparison
functions (like `__cmpdi2') return 0 to indicate that the first
operand is smaller than the second, 1 to indicate that they are
equal, and 2 to indicate that the first operand is greater than
the second. If this macro evaluates to `false' the comparison
functions return -1, 0, and 1 instead of 0, 1, and 2. If the
target uses the routines in `libgcc.a', you do not need to define
this macro.
-- Macro: TARGET_EDOM
The value of `EDOM' on the target machine, as a C integer constant
expression. If you don't define this macro, GCC does not attempt
to deposit the value of `EDOM' into `errno' directly. Look in
`/usr/include/errno.h' to find the value of `EDOM' on your system.
If you do not define `TARGET_EDOM', then compiled code reports
domain errors by calling the library function and letting it
report the error. If mathematical functions on your system use
`matherr' when there is an error, then you should leave
`TARGET_EDOM' undefined so that `matherr' is used normally.
-- Macro: GEN_ERRNO_RTX
Define this macro as a C expression to create an rtl expression
that refers to the global "variable" `errno'. (On certain systems,
`errno' may not actually be a variable.) If you don't define this
macro, a reasonable default is used.
-- Macro: TARGET_C99_FUNCTIONS
When this macro is nonzero, GCC will implicitly optimize `sin'
calls into `sinf' and similarly for other functions defined by C99
standard. The default is zero because a number of existing
systems lack support for these functions in their runtime so this
macro needs to be redefined to one on systems that do support the
C99 runtime.
-- Macro: TARGET_HAS_SINCOS
When this macro is nonzero, GCC will implicitly optimize calls to
`sin' and `cos' with the same argument to a call to `sincos'. The
default is zero. The target has to provide the following
functions:
void sincos(double x, double *sin, double *cos);
void sincosf(float x, float *sin, float *cos);
void sincosl(long double x, long double *sin, long double *cos);
-- Macro: NEXT_OBJC_RUNTIME
Define this macro to generate code for Objective-C message sending
using the calling convention of the NeXT system. This calling
convention involves passing the object, the selector and the
method arguments all at once to the method-lookup library function.
The default calling convention passes just the object and the
selector to the lookup function, which returns a pointer to the
method.
File: gccint.info, Node: Addressing Modes, Next: Anchored Addresses, Prev: Library Calls, Up: Target Macros
17.14 Addressing Modes
======================
This is about addressing modes.
-- Macro: HAVE_PRE_INCREMENT
-- Macro: HAVE_PRE_DECREMENT
-- Macro: HAVE_POST_INCREMENT
-- Macro: HAVE_POST_DECREMENT
A C expression that is nonzero if the machine supports
pre-increment, pre-decrement, post-increment, or post-decrement
addressing respectively.
-- Macro: HAVE_PRE_MODIFY_DISP
-- Macro: HAVE_POST_MODIFY_DISP
A C expression that is nonzero if the machine supports pre- or
post-address side-effect generation involving constants other than
the size of the memory operand.
-- Macro: HAVE_PRE_MODIFY_REG
-- Macro: HAVE_POST_MODIFY_REG
A C expression that is nonzero if the machine supports pre- or
post-address side-effect generation involving a register
displacement.
-- Macro: CONSTANT_ADDRESS_P (X)
A C expression that is 1 if the RTX X is a constant which is a
valid address. On most machines the default definition of
`(CONSTANT_P (X) && GET_CODE (X) != CONST_DOUBLE)' is acceptable,
but a few machines are more restrictive as to which constant
addresses are supported.
-- Macro: CONSTANT_P (X)
`CONSTANT_P', which is defined by target-independent code, accepts
integer-values expressions whose values are not explicitly known,
such as `symbol_ref', `label_ref', and `high' expressions and
`const' arithmetic expressions, in addition to `const_int' and
`const_double' expressions.
-- Macro: 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
`TARGET_LEGITIMATE_ADDRESS_P' would ever accept.
-- Target Hook: bool TARGET_LEGITIMATE_ADDRESS_P (enum machine_mode
MODE, rtx X, bool STRICT)
A function that returns whether X (an RTX) is a legitimate memory
address on the target machine for a memory operand of mode MODE.
Legitimate addresses are defined in two variants: a strict variant
and a non-strict one. The STRICT parameter chooses which variant
is desired by the caller.
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. This is because in
contexts where some kind of register is required, a
pseudo-register with no hard register must be rejected. For
non-hard registers, the strict variant should look up the
`reg_renumber' array; it should then proceed using the hard
register number in the array, or treat the pseudo as a memory
reference if the array holds `-1'.
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.
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
specifically as legitimate addresses. Normally you would simply
recognize any `const' as legitimate.
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'.
On some machines, whether a symbolic address is legitimate depends
on the section that the address refers to. On these machines,
define the target hook `TARGET_ENCODE_SECTION_INFO' to store the
information into the `symbol_ref', and then check for it here.
When you see a `const', you will have to look inside it to find the
`symbol_ref' in order to determine the section. *Note Assembler
Format::.
Some ports are still using a deprecated legacy substitute for this
hook, the `GO_IF_LEGITIMATE_ADDRESS' macro. This macro has this
syntax:
#define GO_IF_LEGITIMATE_ADDRESS (MODE, X, LABEL)
and should `goto LABEL' if the address X is a valid address on the
target machine for a memory operand of mode MODE.
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.
Using the hook is usually simpler because it limits the number of
files that are recompiled when changes are made.
-- Macro: TARGET_MEM_CONSTRAINT
A single character to be used instead of the default `'m''
character for general memory addresses. This defines the
constraint letter which matches the memory addresses accepted by
`TARGET_LEGITIMATE_ADDRESS_P'. Define this macro if you want to
support new address formats in your back end without changing the
semantics of the `'m'' constraint. This is necessary in order to
preserve functionality of inline assembly constructs using the
`'m'' constraint.
-- Macro: FIND_BASE_TERM (X)
A C expression to determine the base term of address X, or to
provide a simplified version of X from which `alias.c' can easily
find the base term. This macro is used in only two places:
`find_base_value' and `find_base_term' in `alias.c'.
It is always safe for this macro to not be defined. It exists so
that alias analysis can understand machine-dependent addresses.
The typical use of this macro is to handle addresses containing a
label_ref or symbol_ref within an UNSPEC.
-- Target Hook: rtx TARGET_LEGITIMIZE_ADDRESS (rtx X, rtx OLDX, enum
machine_mode MODE)
This hook is given an invalid memory address X for an operand of
mode MODE and should try to return a valid memory address.
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 of the hook should not alter the substructure of X. If
it transforms X into a more legitimate form, it should return the
new X.
It is not necessary for this hook to come up with a legitimate
address. The compiler has standard ways of doing so in all cases.
In fact, it is safe to omit this hook or make it return X if it
cannot find a valid way to legitimize the address. But often a
machine-dependent strategy can generate better code.
-- Macro: LEGITIMIZE_RELOAD_ADDRESS (X, MODE, OPNUM, TYPE, IND_LEVELS,
WIN)
A C compound statement that attempts to replace X, which is an
address that needs reloading, with a valid memory address for an
operand of mode MODE. WIN will be a C statement label elsewhere
in the code. It is not necessary to define this macro, but it
might be useful for performance reasons.
For example, on the i386, it is sometimes possible to use a single
reload register instead of two by reloading a sum of two pseudo
registers into a register. On the other hand, for number of RISC
processors offsets are limited so that often an intermediate
address needs to be generated in order to address a stack slot.
By defining `LEGITIMIZE_RELOAD_ADDRESS' appropriately, the
intermediate addresses generated for adjacent some stack slots can
be made identical, and thus be shared.
_Note_: This macro should be used with caution. It is necessary
to know something of how reload works in order to effectively use
this, and it is quite easy to produce macros that build in too
much knowledge of reload internals.
_Note_: This macro must be able to reload an address created by a
previous invocation of this macro. If it fails to handle such
addresses then the compiler may generate incorrect code or abort.
The macro definition should use `push_reload' to indicate parts
that need reloading; OPNUM, TYPE and IND_LEVELS are usually
suitable to be passed unaltered to `push_reload'.
The code generated by this macro must 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. This
also applies to parts that you change indirectly by calling
`push_reload'.
The macro definition may use `strict_memory_address_p' to test if
the address has become legitimate.
If you want to change only a part of X, one standard way of doing
this is to use `copy_rtx'. Note, however, that it unshares only a
single level of rtl. Thus, if the part to be changed is not at the
top level, you'll need to replace first the top level. It is not
necessary for this macro to come up with a legitimate address;
but often a machine-dependent strategy can generate better code.
-- Target Hook: bool TARGET_MODE_DEPENDENT_ADDRESS_P (const_rtx ADDR)
This hook returns `true' if memory address ADDR can have different
meanings depending on the machine mode of the memory reference it
is used for or if the address is valid for some modes but not
others.
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.
The default version of this hook returns `false'.
-- Macro: 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 or if the address is valid for some modes but not
others.
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.
These are obsolete macros, replaced by the
`TARGET_MODE_DEPENDENT_ADDRESS_P' target hook.
-- Macro: 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 X
satisfies `CONSTANT_P', so you need not check this. In fact, `1'
is a suitable definition for this macro on machines where anything
`CONSTANT_P' is valid.
-- Target Hook: rtx TARGET_DELEGITIMIZE_ADDRESS (rtx X)
This hook is used to undo the possibly obfuscating effects of the
`LEGITIMIZE_ADDRESS' and `LEGITIMIZE_RELOAD_ADDRESS' target
macros. Some backend implementations of these macros wrap symbol
references inside an `UNSPEC' rtx to represent PIC or similar
addressing modes. This target hook allows GCC's optimizers to
understand the semantics of these opaque `UNSPEC's by converting
them back into their original form.
-- Target Hook: bool TARGET_CANNOT_FORCE_CONST_MEM (rtx X)
This hook should return true if X is of a form that cannot (or
should not) be spilled to the constant pool. The default version
of this hook returns false.
The primary reason to define this hook is to prevent reload from
deciding that a non-legitimate constant would be better reloaded
from the constant pool instead of spilling and reloading a register
holding the constant. This restriction is often true of addresses
of TLS symbols for various targets.
-- Target Hook: bool TARGET_USE_BLOCKS_FOR_CONSTANT_P (enum
machine_mode MODE, const_rtx X)
This hook should return true if pool entries for constant X can be
placed in an `object_block' structure. MODE is the mode of X.
The default version returns false for all constants.
-- Target Hook: tree TARGET_BUILTIN_RECIPROCAL (unsigned FN, bool
MD_FN, bool SQRT)
This hook should return the DECL of a function that implements
reciprocal of the builtin function with builtin function code FN,
or `NULL_TREE' if such a function is not available. MD_FN is true
when FN is a code of a machine-dependent builtin function. When
SQRT is true, additional optimizations that apply only to the
reciprocal of a square root function are performed, and only
reciprocals of `sqrt' function are valid.
-- Target Hook: tree TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD (void)
This hook should return the DECL of a function F that given an
address ADDR as an argument returns a mask M that can be used to
extract from two vectors the relevant data that resides in ADDR in
case ADDR is not properly aligned.
The autovectorizer, when vectorizing a load operation from an
address ADDR that may be unaligned, will generate two vector loads
from the two aligned addresses around ADDR. It then generates a
`REALIGN_LOAD' operation to extract the relevant data from the two
loaded vectors. The first two arguments to `REALIGN_LOAD', V1 and
V2, are the two vectors, each of size VS, and the third argument,
OFF, defines how the data will be extracted from these two
vectors: if OFF is 0, then the returned vector is V2; otherwise,
the returned vector is composed from the last VS-OFF elements of
V1 concatenated to the first OFF elements of V2.
If this hook is defined, the autovectorizer will generate a call
to F (using the DECL tree that this hook returns) and will use the
return value of F as the argument OFF to `REALIGN_LOAD'.
Therefore, the mask M returned by F should comply with the
semantics expected by `REALIGN_LOAD' described above. If this
hook is not defined, then ADDR will be used as the argument OFF to
`REALIGN_LOAD', in which case the low log2(VS) - 1 bits of ADDR
will be considered.
-- Target Hook: tree TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN (tree X)
This hook should return the DECL of a function F that implements
widening multiplication of the even elements of two input vectors
of type X.
If this hook is defined, the autovectorizer will use it along with
the `TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD' target hook when
vectorizing widening multiplication in cases that the order of the
results does not have to be preserved (e.g. used only by a
reduction computation). Otherwise, the `widen_mult_hi/lo' idioms
will be used.
-- Target Hook: tree TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD (tree X)
This hook should return the DECL of a function F that implements
widening multiplication of the odd elements of two input vectors
of type X.
If this hook is defined, the autovectorizer will use it along with
the `TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN' target hook when
vectorizing widening multiplication in cases that the order of the
results does not have to be preserved (e.g. used only by a
reduction computation). Otherwise, the `widen_mult_hi/lo' idioms
will be used.
-- Target Hook: int TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST (enum
vect_cost_for_stmt TYPE_OF_COST, tree VECTYPE, int MISALIGN)
Returns cost of different scalar or vector statements for
vectorization cost model. For vector memory operations the cost
may depend on type (VECTYPE) and misalignment value (MISALIGN).
-- Target Hook: bool TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE
(const_tree TYPE, bool IS_PACKED)
Return true if vector alignment is reachable (by peeling N
iterations) for the given type.
-- Target Hook: tree TARGET_VECTORIZE_BUILTIN_VEC_PERM (tree TYPE,
tree *MASK_ELEMENT_TYPE)
Target builtin that implements vector permute.
-- Target Hook: bool TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK (tree
VEC_TYPE, tree MASK)
Return true if a vector created for `builtin_vec_perm' is valid.
-- Target Hook: tree TARGET_VECTORIZE_BUILTIN_CONVERSION (unsigned
CODE, tree DEST_TYPE, tree SRC_TYPE)
This hook should return the DECL of a function that implements
conversion of the input vector of type SRC_TYPE to type DEST_TYPE.
The value of CODE is one of the enumerators in `enum tree_code' and
specifies how the conversion is to be applied (truncation,
rounding, etc.).
If this hook is defined, the autovectorizer will use the
`TARGET_VECTORIZE_BUILTIN_CONVERSION' target hook when vectorizing
conversion. Otherwise, it will return `NULL_TREE'.
-- Target Hook: tree TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION
(tree FNDECL, tree VEC_TYPE_OUT, tree VEC_TYPE_IN)
This hook should return the decl of a function that implements the
vectorized variant of the builtin function with builtin function
code CODE or `NULL_TREE' if such a function is not available. The
value of FNDECL is the builtin function declaration. The return
type of the vectorized function shall be of vector type
VEC_TYPE_OUT and the argument types should be VEC_TYPE_IN.
-- Target Hook: bool TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT
(enum machine_mode MODE, const_tree TYPE, int MISALIGNMENT,
bool IS_PACKED)
This hook should return true if the target supports misaligned
vector store/load of a specific factor denoted in the MISALIGNMENT
parameter. The vector store/load should be of machine mode MODE
and the elements in the vectors should be of type TYPE. IS_PACKED
parameter is true if the memory access is defined in a packed
struct.
-- Target Hook: enum machine_mode TARGET_VECTORIZE_PREFERRED_SIMD_MODE
(enum machine_mode MODE)
This hook should return the preferred mode for vectorizing scalar
mode MODE. The default is equal to `word_mode', because the
vectorizer can do some transformations even in absence of
specialized SIMD hardware.
-- Target Hook: unsigned int
TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES (void)
This hook should return a mask of sizes that should be iterated
over after trying to autovectorize using the vector size derived
from the mode returned by `TARGET_VECTORIZE_PREFERRED_SIMD_MODE'.
The default is zero which means to not iterate over other vector
sizes.
File: gccint.info, Node: Anchored Addresses, Next: Condition Code, Prev: Addressing Modes, Up: Target Macros
17.15 Anchored Addresses
========================
GCC usually addresses every static object as a separate entity. For
example, if we have:
static int a, b, c;
int foo (void) { return a + b + c; }
the code for `foo' will usually calculate three separate symbolic
addresses: those of `a', `b' and `c'. On some targets, it would be
better to calculate just one symbolic address and access the three
variables relative to it. The equivalent pseudocode would be something
like:
int foo (void)
{
register int *xr = &x;
return xr[&a - &x] + xr[&b - &x] + xr[&c - &x];
}
(which isn't valid C). We refer to shared addresses like `x' as
"section anchors". Their use is controlled by `-fsection-anchors'.
The hooks below describe the target properties that GCC needs to know
in order to make effective use of section anchors. It won't use
section anchors at all unless either `TARGET_MIN_ANCHOR_OFFSET' or
`TARGET_MAX_ANCHOR_OFFSET' is set to a nonzero value.
-- Target Hook: HOST_WIDE_INT TARGET_MIN_ANCHOR_OFFSET
The minimum offset that should be applied to a section anchor. On
most targets, it should be the smallest offset that can be applied
to a base register while still giving a legitimate address for
every mode. The default value is 0.
-- Target Hook: HOST_WIDE_INT TARGET_MAX_ANCHOR_OFFSET
Like `TARGET_MIN_ANCHOR_OFFSET', but the maximum (inclusive)
offset that should be applied to section anchors. The default
value is 0.
-- Target Hook: void TARGET_ASM_OUTPUT_ANCHOR (rtx X)
Write the assembly code to define section anchor X, which is a
`SYMBOL_REF' for which `SYMBOL_REF_ANCHOR_P (X)' is true. The
hook is called with the assembly output position set to the
beginning of `SYMBOL_REF_BLOCK (X)'.
If `ASM_OUTPUT_DEF' is available, the hook's default definition
uses it to define the symbol as `. + SYMBOL_REF_BLOCK_OFFSET (X)'.
If `ASM_OUTPUT_DEF' is not available, the hook's default definition
is `NULL', which disables the use of section anchors altogether.
-- Target Hook: bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (const_rtx X)
Return true if GCC should attempt to use anchors to access
`SYMBOL_REF' X. You can assume `SYMBOL_REF_HAS_BLOCK_INFO_P (X)'
and `!SYMBOL_REF_ANCHOR_P (X)'.
The default version is correct for most targets, but you might
need to intercept this hook to handle things like target-specific
attributes or target-specific sections.
File: gccint.info, Node: Condition Code, Next: Costs, Prev: Anchored Addresses, Up: Target Macros
17.16 Condition Code Status
===========================
The macros in this section can be split in two families, according to
the two ways of representing condition codes in GCC.
The first representation is the so called `(cc0)' representation
(*note Jump Patterns::), where all instructions can have an implicit
clobber of the condition codes. The second is the condition code
register representation, which provides better schedulability for
architectures that do have a condition code register, but on which most
instructions do not affect it. The latter category includes most RISC
machines.
The implicit clobbering poses a strong restriction on the placement of
the definition and use of the condition code, which need to be in
adjacent insns for machines using `(cc0)'. This can prevent important
optimizations on some machines. For example, on the IBM RS/6000, there
is a delay for taken branches unless the condition code register is set
three instructions earlier than the conditional branch. The instruction
scheduler cannot perform this optimization if it is not permitted to
separate the definition and use of the condition code register.
For this reason, it is possible and suggested to use a register to
represent the condition code for new ports. If there is a specific
condition code register in the machine, use a hard register. If the
condition code or comparison result can be placed in any general
register, or if there are multiple condition registers, use a pseudo
register. Registers used to store the condition code value will
usually have a mode that is in class `MODE_CC'.
Alternatively, you can use `BImode' if the comparison operator is
specified already in the compare instruction. In this case, you are not
interested in most macros in this section.
* Menu:
* CC0 Condition Codes:: Old style representation of condition codes.
* MODE_CC Condition Codes:: Modern representation of condition codes.
* Cond Exec Macros:: Macros to control conditional execution.
File: gccint.info, Node: CC0 Condition Codes, Next: MODE_CC Condition Codes, Up: Condition Code
17.16.1 Representation of condition codes using `(cc0)'
-------------------------------------------------------
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'.
-- Macro: CC_STATUS_MDEP
C code for a data type which is used for declaring the `mdep'
component of `cc_status'. It defaults to `int'.
This macro is not used on machines that do not use `cc0'.
-- Macro: 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.
This macro is not used on machines that do not use `cc0'.
-- Macro: 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)'.
This macro is not used on machines that do not use `cc0'.
If there are insns 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'.
A possible definition of `NOTICE_UPDATE_CC' is to call a function
that looks at an attribute (*note Insn Attributes::) named, for
example, `cc'. This avoids having detailed information about
patterns in two places, the `md' file and in `NOTICE_UPDATE_CC'.
File: gccint.info, Node: MODE_CC Condition Codes, Next: Cond Exec Macros, Prev: CC0 Condition Codes, Up: Condition Code
17.16.2 Representation of condition codes using registers
---------------------------------------------------------
-- Macro: SELECT_CC_MODE (OP, X, Y)
On many machines, the condition code may be produced by other
instructions than compares, for example the branch can use
directly the condition code set by a subtract instruction.
However, on some machines when the condition code is set this way
some bits (such as the overflow bit) are not set in the same way
as a test instruction, so that a different branch instruction must
be used for some conditional branches. When this happens, use the
machine mode of the condition code register to record different
formats of the condition code register. Modes can also be used to
record which compare instruction (e.g. a signed or an unsigned
comparison) produced the condition codes.
If other modes than `CCmode' are required, add them to
`MACHINE-modes.def' and define `SELECT_CC_MODE' to choose a mode
given an operand of a compare. This is needed because the modes
have to be chosen not only during RTL generation but also, for
example, by instruction combination. The result of
`SELECT_CC_MODE' should be consistent with the mode used in the
patterns; for example to support the case of the add on the SPARC
discussed above, we have the pattern
(define_insn ""
[(set (reg:CC_NOOV 0)
(compare:CC_NOOV
(plus:SI (match_operand:SI 0 "register_operand" "%r")
(match_operand:SI 1 "arith_operand" "rI"))
(const_int 0)))]
""
"...")
together with a `SELECT_CC_MODE' that returns `CC_NOOVmode' for
comparisons whose argument is a `plus':
#define SELECT_CC_MODE(OP,X,Y) \
(GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode) \
: ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS \
|| GET_CODE (X) == NEG) \
? CC_NOOVmode : CCmode))
Another reason to use modes is to retain information on which
operands were used by the comparison; see `REVERSIBLE_CC_MODE'
later in this section.
You should define this macro if and only if you define extra CC
modes in `MACHINE-modes.def'.
-- Macro: CANONICALIZE_COMPARISON (CODE, OP0, OP1)
On some machines not all possible comparisons are defined, but you
can convert an invalid comparison into a valid one. For example,
the Alpha does not have a `GT' comparison, but you can use an `LT'
comparison instead and swap the order of the operands.
On such machines, define this macro to be a C statement to do any
required conversions. CODE is the initial comparison code and OP0
and OP1 are the left and right operands of the comparison,
respectively. You should modify CODE, OP0, and OP1 as required.
GCC will not assume that the comparison resulting from this macro
is valid but will see if the resulting insn matches a pattern in
the `md' file.
You need not define this macro if it would never change the
comparison code or operands.
-- Macro: REVERSIBLE_CC_MODE (MODE)
A C expression whose value is one if it is always safe to reverse a
comparison whose mode is MODE. If `SELECT_CC_MODE' can ever
return MODE for a floating-point inequality comparison, then
`REVERSIBLE_CC_MODE (MODE)' must be zero.
You need not define this macro if it would always returns zero or
if the floating-point format is anything other than
`IEEE_FLOAT_FORMAT'. For example, here is the definition used on
the SPARC, where floating-point inequality comparisons are always
given `CCFPEmode':
#define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode)
-- Macro: REVERSE_CONDITION (CODE, MODE)
A C expression whose value is reversed condition code of the CODE
for comparison done in CC_MODE MODE. The macro is used only in
case `REVERSIBLE_CC_MODE (MODE)' is nonzero. Define this macro in
case machine has some non-standard way how to reverse certain
conditionals. For instance in case all floating point conditions
are non-trapping, compiler may freely convert unordered compares
to ordered one. Then definition may look like:
#define REVERSE_CONDITION(CODE, MODE) \
((MODE) != CCFPmode ? reverse_condition (CODE) \
: reverse_condition_maybe_unordered (CODE))
-- Target Hook: bool TARGET_FIXED_CONDITION_CODE_REGS (unsigned int
*P1, unsigned int *P2)
On targets which do not use `(cc0)', and which use a hard register
rather than a pseudo-register to hold condition codes, the regular
CSE passes are often not able to identify cases in which the hard
register is set to a common value. Use this hook to enable a
small pass which optimizes such cases. This hook should return
true to enable this pass, and it should set the integers to which
its arguments point to the hard register numbers used for
condition codes. When there is only one such register, as is true
on most systems, the integer pointed to by P2 should be set to
`INVALID_REGNUM'.
The default version of this hook returns false.
-- Target Hook: enum machine_mode TARGET_CC_MODES_COMPATIBLE (enum
machine_mode M1, enum machine_mode M2)
On targets which use multiple condition code modes in class
`MODE_CC', it is sometimes the case that a comparison can be
validly done in more than one mode. On such a system, define this
target hook to take two mode arguments and to return a mode in
which both comparisons may be validly done. If there is no such
mode, return `VOIDmode'.
The default version of this hook checks whether the modes are the
same. If they are, it returns that mode. If they are different,
it returns `VOIDmode'.
File: gccint.info, Node: Cond Exec Macros, Prev: MODE_CC Condition Codes, Up: Condition Code
17.16.3 Macros to control conditional execution
-----------------------------------------------
There is one macro that may need to be defined for targets supporting
conditional execution, independent of how they represent conditional
branches.
-- Macro: REVERSE_CONDEXEC_PREDICATES_P (OP1, OP2)
A C expression that returns true if the conditional execution
predicate OP1, a comparison operation, is the inverse of OP2 and
vice versa. Define this to return 0 if the target has conditional
execution predicates that cannot be reversed safely. There is no
need to validate that the arguments of op1 and op2 are the same,
this is done separately. If no expansion is specified, this macro
is defined as follows:
#define REVERSE_CONDEXEC_PREDICATES_P (x, y) \
(GET_CODE ((x)) == reversed_comparison_code ((y), NULL))
File: gccint.info, Node: Costs, Next: Scheduling, Prev: Condition Code, Up: Target Macros
17.17 Describing Relative Costs of Operations
=============================================
These macros let you describe the relative speed of various operations
on the target machine.
-- Macro: REGISTER_MOVE_COST (MODE, FROM, TO)
A C expression for the cost of moving data of mode MODE from a
register in class FROM to one in class TO. The classes are
expressed using the enumeration values such as `GENERAL_REGS'. A
value of 2 is the default; other values are interpreted relative to
that.
It is not required that the cost always equal 2 when FROM is the
same as TO; on some machines it is expensive to move between
registers if they are not general registers.
If reload sees an insn consisting of a single `set' between two
hard registers, and if `REGISTER_MOVE_COST' applied to their
classes returns a value of 2, reload does not check to ensure that
the constraints of the insn are met. Setting a cost of other than
2 will allow reload to verify that the constraints are met. You
should do this if the `movM' pattern's constraints do not allow
such copying.
These macros are obsolete, new ports should use the target hook
`TARGET_REGISTER_MOVE_COST' instead.
-- Target Hook: int TARGET_REGISTER_MOVE_COST (enum machine_mode MODE,
reg_class_t FROM, reg_class_t TO)
This target hook should return the cost of moving data of mode MODE
from a register in class FROM to one in class TO. The classes are
expressed using the enumeration values such as `GENERAL_REGS'. A
value of 2 is the default; other values are interpreted relative to
that.
It is not required that the cost always equal 2 when FROM is the
same as TO; on some machines it is expensive to move between
registers if they are not general registers.
If reload sees an insn consisting of a single `set' between two
hard registers, and if `TARGET_REGISTER_MOVE_COST' applied to their
classes returns a value of 2, reload does not check to ensure that
the constraints of the insn are met. Setting a cost of other than
2 will allow reload to verify that the constraints are met. You
should do this if the `movM' pattern's constraints do not allow
such copying.
The default version of this function returns 2.
-- Macro: MEMORY_MOVE_COST (MODE, CLASS, IN)
A C expression for the cost of moving data of mode MODE between a
register of class CLASS and memory; IN is zero if the value is to
be written to memory, nonzero if it is to be read in. This cost
is relative to those in `REGISTER_MOVE_COST'. If moving between
registers and memory is more expensive than between two registers,
you should define this macro to express the relative cost.
If you do not define this macro, GCC uses a default cost of 4 plus
the cost of copying via a secondary reload register, if one is
needed. If your machine requires a secondary reload register to
copy between memory and a register of CLASS but the reload
mechanism is more complex than copying via an intermediate, define
this macro to reflect the actual cost of the move.
GCC defines the function `memory_move_secondary_cost' if secondary
reloads are needed. It computes the costs due to copying via a
secondary register. If your machine copies from memory using a
secondary register in the conventional way but the default base
value of 4 is not correct for your machine, define this macro to
add some other value to the result of that function. The
arguments to that function are the same as to this macro.
These macros are obsolete, new ports should use the target hook
`TARGET_MEMORY_MOVE_COST' instead.
-- Target Hook: int TARGET_MEMORY_MOVE_COST (enum machine_mode MODE,
reg_class_t RCLASS, bool IN)
This target hook should return the cost of moving data of mode MODE
between a register of class RCLASS and memory; IN is `false' if
the value is to be written to memory, `true' if it is to be read
in. This cost is relative to those in `TARGET_REGISTER_MOVE_COST'.
If moving between registers and memory is more expensive than
between two registers, you should add this target hook to express
the relative cost.
If you do not add this target hook, GCC uses a default cost of 4
plus the cost of copying via a secondary reload register, if one is
needed. If your machine requires a secondary reload register to
copy between memory and a register of RCLASS but the reload
mechanism is more complex than copying via an intermediate, use
this target hook to reflect the actual cost of the move.
GCC defines the function `memory_move_secondary_cost' if secondary
reloads are needed. It computes the costs due to copying via a
secondary register. If your machine copies from memory using a
secondary register in the conventional way but the default base
value of 4 is not correct for your machine, use this target hook
to add some other value to the result of that function. The
arguments to that function are the same as to this target hook.
-- Macro: BRANCH_COST (SPEED_P, PREDICTABLE_P)
A C expression for the cost of a branch instruction. A value of 1
is the default; other values are interpreted relative to that.
Parameter SPEED_P is true when the branch in question should be
optimized for speed. When it is false, `BRANCH_COST' should
return a value optimal for code size rather than performance.
PREDICTABLE_P is true for well-predicted branches. On many
architectures the `BRANCH_COST' can be reduced then.
Here are additional macros which do not specify precise relative costs,
but only that certain actions are more expensive than GCC would
ordinarily expect.
-- Macro: 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 no
faster than accessing a word of memory, i.e., if such access
require more than one instruction or if there is no difference in
cost between byte and (aligned) word loads.
When this macro is not defined, the compiler will access a field by
finding the smallest containing object; when it is defined, a
fullword load will be used if alignment permits. Unless bytes
accesses are faster than word accesses, using word accesses is
preferable since it may eliminate subsequent memory access if
subsequent accesses occur to other fields in the same word of the
structure, but to different bytes.
-- Macro: SLOW_UNALIGNED_ACCESS (MODE, ALIGNMENT)
Define this macro to be the value 1 if memory accesses described
by the MODE and ALIGNMENT parameters have a cost many times greater
than aligned accesses, for example if they are emulated in a trap
handler.
When this macro is nonzero, the compiler will act as if
`STRICT_ALIGNMENT' were nonzero when generating code for block
moves. This can cause significantly more instructions to be
produced. Therefore, do not set this macro nonzero if unaligned
accesses only add a cycle or two to the time for a memory access.
If the value of this macro is always zero, it need not be defined.
If this macro is defined, it should produce a nonzero value when
`STRICT_ALIGNMENT' is nonzero.
-- Macro: MOVE_RATIO (SPEED)
The threshold of number of scalar memory-to-memory move insns,
_below_ which a sequence of insns should be generated instead of a
string move insn or a library call. Increasing the value will
always make code faster, but eventually incurs high cost in
increased code size.
Note that on machines where the corresponding move insn is a
`define_expand' that emits a sequence of insns, this macro counts
the number of such sequences.
The parameter SPEED is true if the code is currently being
optimized for speed rather than size.
If you don't define this, a reasonable default is used.
-- Macro: MOVE_BY_PIECES_P (SIZE, ALIGNMENT)
A C expression used to determine whether `move_by_pieces' will be
used to copy a chunk of memory, or whether some other block move
mechanism will be used. Defaults to 1 if `move_by_pieces_ninsns'
returns less than `MOVE_RATIO'.
-- Macro: MOVE_MAX_PIECES
A C expression used by `move_by_pieces' to determine the largest
unit a load or store used to copy memory is. Defaults to
`MOVE_MAX'.
-- Macro: CLEAR_RATIO (SPEED)
The threshold of number of scalar move insns, _below_ which a
sequence of insns should be generated to clear memory instead of a
string clear insn or a library call. Increasing the value will
always make code faster, but eventually incurs high cost in
increased code size.
The parameter SPEED is true if the code is currently being
optimized for speed rather than size.
If you don't define this, a reasonable default is used.
-- Macro: CLEAR_BY_PIECES_P (SIZE, ALIGNMENT)
A C expression used to determine whether `clear_by_pieces' will be
used to clear a chunk of memory, or whether some other block clear
mechanism will be used. Defaults to 1 if `move_by_pieces_ninsns'
returns less than `CLEAR_RATIO'.
-- Macro: SET_RATIO (SPEED)
The threshold of number of scalar move insns, _below_ which a
sequence of insns should be generated to set memory to a constant
value, instead of a block set insn or a library call. Increasing
the value will always make code faster, but eventually incurs high
cost in increased code size.
The parameter SPEED is true if the code is currently being
optimized for speed rather than size.
If you don't define this, it defaults to the value of `MOVE_RATIO'.
-- Macro: SET_BY_PIECES_P (SIZE, ALIGNMENT)
A C expression used to determine whether `store_by_pieces' will be
used to set a chunk of memory to a constant value, or whether some
other mechanism will be used. Used by `__builtin_memset' when
storing values other than constant zero. Defaults to 1 if
`move_by_pieces_ninsns' returns less than `SET_RATIO'.
-- Macro: STORE_BY_PIECES_P (SIZE, ALIGNMENT)
A C expression used to determine whether `store_by_pieces' will be
used to set a chunk of memory to a constant string value, or
whether some other mechanism will be used. Used by
`__builtin_strcpy' when called with a constant source string.
Defaults to 1 if `move_by_pieces_ninsns' returns less than
`MOVE_RATIO'.
-- Macro: USE_LOAD_POST_INCREMENT (MODE)
A C expression used to determine whether a load postincrement is a
good thing to use for a given mode. Defaults to the value of
`HAVE_POST_INCREMENT'.
-- Macro: USE_LOAD_POST_DECREMENT (MODE)
A C expression used to determine whether a load postdecrement is a
good thing to use for a given mode. Defaults to the value of
`HAVE_POST_DECREMENT'.
-- Macro: USE_LOAD_PRE_INCREMENT (MODE)
A C expression used to determine whether a load preincrement is a
good thing to use for a given mode. Defaults to the value of
`HAVE_PRE_INCREMENT'.
-- Macro: USE_LOAD_PRE_DECREMENT (MODE)
A C expression used to determine whether a load predecrement is a
good thing to use for a given mode. Defaults to the value of
`HAVE_PRE_DECREMENT'.
-- Macro: USE_STORE_POST_INCREMENT (MODE)
A C expression used to determine whether a store postincrement is
a good thing to use for a given mode. Defaults to the value of
`HAVE_POST_INCREMENT'.
-- Macro: USE_STORE_POST_DECREMENT (MODE)
A C expression used to determine whether a store postdecrement is
a good thing to use for a given mode. Defaults to the value of
`HAVE_POST_DECREMENT'.
-- Macro: USE_STORE_PRE_INCREMENT (MODE)
This macro is used to determine whether a store preincrement is a
good thing to use for a given mode. Defaults to the value of
`HAVE_PRE_INCREMENT'.
-- Macro: USE_STORE_PRE_DECREMENT (MODE)
This macro is used to determine whether a store predecrement is a
good thing to use for a given mode. Defaults to the value of
`HAVE_PRE_DECREMENT'.
-- Macro: 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.
-- Macro: RANGE_TEST_NON_SHORT_CIRCUIT
Define this macro if a non-short-circuit operation produced by
`fold_range_test ()' is optimal. This macro defaults to true if
`BRANCH_COST' is greater than or equal to the value 2.
-- Target Hook: bool TARGET_RTX_COSTS (rtx X, int CODE, int
OUTER_CODE, int *TOTAL, bool SPEED)
This target hook describes the relative costs of RTL expressions.
The cost may depend on the precise form of the expression, which is
available for examination in X, and the rtx code of the expression
in which it is contained, found in OUTER_CODE. CODE is the
expression code--redundant, since it can be obtained with
`GET_CODE (X)'.
In implementing this hook, you can use the construct
`COSTS_N_INSNS (N)' to specify a cost equal to N fast instructions.
On entry to the hook, `*TOTAL' contains a default estimate for the
cost of the expression. The hook should modify this value as
necessary. Traditionally, the default costs are `COSTS_N_INSNS
(5)' for multiplications, `COSTS_N_INSNS (7)' for division and
modulus operations, and `COSTS_N_INSNS (1)' for all other
operations.
When optimizing for code size, i.e. when `speed' is false, this
target hook should be used to estimate the relative size cost of
an expression, again relative to `COSTS_N_INSNS'.
The hook returns true when all subexpressions of X have been
processed, and false when `rtx_cost' should recurse.
-- Target Hook: int TARGET_ADDRESS_COST (rtx ADDRESS, bool SPEED)
This hook computes the cost of an addressing mode that contains
ADDRESS. If not defined, the cost is computed from the ADDRESS
expression and the `TARGET_RTX_COST' hook.
For most CISC machines, the default cost is a good approximation
of the true cost of the addressing mode. However, on RISC
machines, all instructions normally have the same length and
execution time. Hence all addresses will have equal costs.
In cases where more than one form of an address is known, the form
with the lowest cost will be used. If multiple forms have the
same, lowest, cost, the one that is the most complex will be used.
For example, suppose an address that is equal to the sum of a
register and a constant is used twice in the same basic block.
When this macro is not defined, the address will be computed in a
register and memory references will be indirect through that
register. On machines where the cost of the addressing mode
containing the sum is no higher than that of a simple indirect
reference, this will produce an additional instruction and
possibly require an additional register. Proper specification of
this macro eliminates this overhead for such machines.
This hook is never called with an invalid address.
On machines where an address involving more than one register is as
cheap as an address computation involving only one register,
defining `TARGET_ADDRESS_COST' to reflect this can cause two
registers to be live over a region of code where only one would
have been if `TARGET_ADDRESS_COST' were not defined in that
manner. This effect should be considered in the definition of
this macro. Equivalent costs should probably only be given to
addresses with different numbers of registers on machines with
lots of registers.
File: gccint.info, Node: Scheduling, Next: Sections, Prev: Costs, Up: Target Macros
17.18 Adjusting the Instruction Scheduler
=========================================
The instruction scheduler may need a fair amount of machine-specific
adjustment in order to produce good code. GCC provides several target
hooks for this purpose. It is usually enough to define just a few of
them: try the first ones in this list first.
-- Target Hook: int TARGET_SCHED_ISSUE_RATE (void)
This hook returns the maximum number of instructions that can ever
issue at the same time on the target machine. The default is one.
Although the insn scheduler can define itself the possibility of
issue an insn on the same cycle, the value can serve as an
additional constraint to issue insns on the same simulated
processor cycle (see hooks `TARGET_SCHED_REORDER' and
`TARGET_SCHED_REORDER2'). This value must be constant over the
entire compilation. If you need it to vary depending on what the
instructions are, you must use `TARGET_SCHED_VARIABLE_ISSUE'.
-- Target Hook: int TARGET_SCHED_VARIABLE_ISSUE (FILE *FILE, int
VERBOSE, rtx INSN, int MORE)
This hook is executed by the scheduler after it has scheduled an
insn from the ready list. It should return the number of insns
which can still be issued in the current cycle. The default is
`MORE - 1' for insns other than `CLOBBER' and `USE', which
normally are not counted against the issue rate. You should
define this hook if some insns take more machine resources than
others, so that fewer insns can follow them in the same cycle.
FILE is either a null pointer, or a stdio stream to write any
debug output to. VERBOSE is the verbose level provided by
`-fsched-verbose-N'. INSN is the instruction that was scheduled.
-- Target Hook: int TARGET_SCHED_ADJUST_COST (rtx INSN, rtx LINK, rtx
DEP_INSN, int COST)
This function corrects the value of COST based on the relationship
between INSN and DEP_INSN through the dependence LINK. It should
return the new value. The default is to make no adjustment to
COST. This can be used for example to specify to the scheduler
using the traditional pipeline description that an output- or
anti-dependence does not incur the same cost as a data-dependence.
If the scheduler using the automaton based pipeline description,
the cost of anti-dependence is zero and the cost of
output-dependence is maximum of one and the difference of latency
times of the first and the second insns. If these values are not
acceptable, you could use the hook to modify them too. See also
*note Processor pipeline description::.
-- Target Hook: int TARGET_SCHED_ADJUST_PRIORITY (rtx INSN, int
PRIORITY)
This hook adjusts the integer scheduling priority PRIORITY of
INSN. It should return the new priority. Increase the priority to
execute INSN earlier, reduce the priority to execute INSN later.
Do not define this hook if you do not need to adjust the
scheduling priorities of insns.
-- Target Hook: int TARGET_SCHED_REORDER (FILE *FILE, int VERBOSE, rtx
*READY, int *N_READYP, int CLOCK)
This hook is executed by the scheduler after it has scheduled the
ready list, to allow the machine description to reorder it (for
example to combine two small instructions together on `VLIW'
machines). FILE is either a null pointer, or a stdio stream to
write any debug output to. VERBOSE is the verbose level provided
by `-fsched-verbose-N'. READY is a pointer to the ready list of
instructions that are ready to be scheduled. N_READYP is a
pointer to the number of elements in the ready list. The scheduler
reads the ready list in reverse order, starting with
READY[*N_READYP - 1] and going to READY[0]. CLOCK is the timer
tick of the scheduler. You may modify the ready list and the
number of ready insns. The return value is the number of insns
that can issue this cycle; normally this is just `issue_rate'.
See also `TARGET_SCHED_REORDER2'.
-- Target Hook: int TARGET_SCHED_REORDER2 (FILE *FILE, int VERBOSE,
rtx *READY, int *N_READYP, int CLOCK)
Like `TARGET_SCHED_REORDER', but called at a different time. That
function is called whenever the scheduler starts a new cycle.
This one is called once per iteration over a cycle, immediately
after `TARGET_SCHED_VARIABLE_ISSUE'; it can reorder the ready list
and return the number of insns to be scheduled in the same cycle.
Defining this hook can be useful if there are frequent situations
where scheduling one insn causes other insns to become ready in
the same cycle. These other insns can then be taken into account
properly.
-- Target Hook: void TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK (rtx
HEAD, rtx TAIL)
This hook is called after evaluation forward dependencies of insns
in chain given by two parameter values (HEAD and TAIL
correspondingly) but before insns scheduling of the insn chain.
For example, it can be used for better insn classification if it
requires analysis of dependencies. This hook can use backward and
forward dependencies of the insn scheduler because they are already
calculated.
-- Target Hook: void TARGET_SCHED_INIT (FILE *FILE, int VERBOSE, int
MAX_READY)
This hook is executed by the scheduler at the beginning of each
block of instructions that are to be scheduled. FILE is either a
null pointer, or a stdio stream to write any debug output to.
VERBOSE is the verbose level provided by `-fsched-verbose-N'.
MAX_READY is the maximum number of insns in the current scheduling
region that can be live at the same time. This can be used to
allocate scratch space if it is needed, e.g. by
`TARGET_SCHED_REORDER'.
-- Target Hook: void TARGET_SCHED_FINISH (FILE *FILE, int VERBOSE)
This hook is executed by the scheduler at the end of each block of
instructions that are to be scheduled. It can be used to perform
cleanup of any actions done by the other scheduling hooks. FILE
is either a null pointer, or a stdio stream to write any debug
output to. VERBOSE is the verbose level provided by
`-fsched-verbose-N'.
-- Target Hook: void TARGET_SCHED_INIT_GLOBAL (FILE *FILE, int
VERBOSE, int OLD_MAX_UID)
This hook is executed by the scheduler after function level
initializations. FILE is either a null pointer, or a stdio stream
to write any debug output to. VERBOSE is the verbose level
provided by `-fsched-verbose-N'. OLD_MAX_UID is the maximum insn
uid when scheduling begins.
-- Target Hook: void TARGET_SCHED_FINISH_GLOBAL (FILE *FILE, int
VERBOSE)
This is the cleanup hook corresponding to
`TARGET_SCHED_INIT_GLOBAL'. FILE is either a null pointer, or a
stdio stream to write any debug output to. VERBOSE is the verbose
level provided by `-fsched-verbose-N'.
-- Target Hook: rtx TARGET_SCHED_DFA_PRE_CYCLE_INSN (void)
The hook returns an RTL insn. The automaton state used in the
pipeline hazard recognizer is changed as if the insn were scheduled
when the new simulated processor cycle starts. Usage of the hook
may simplify the automaton pipeline description for some VLIW
processors. If the hook is defined, it is used only for the
automaton based pipeline description. The default is not to
change the state when the new simulated processor cycle starts.
-- Target Hook: void TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN (void)
The hook can be used to initialize data used by the previous hook.
-- Target Hook: rtx TARGET_SCHED_DFA_POST_CYCLE_INSN (void)
The hook is analogous to `TARGET_SCHED_DFA_PRE_CYCLE_INSN' but used
to changed the state as if the insn were scheduled when the new
simulated processor cycle finishes.
-- Target Hook: void TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN (void)
The hook is analogous to `TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN' but
used to initialize data used by the previous hook.
-- Target Hook: void TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE (void)
The hook to notify target that the current simulated cycle is
about to finish. The hook is analogous to
`TARGET_SCHED_DFA_PRE_CYCLE_INSN' but used to change the state in
more complicated situations - e.g., when advancing state on a
single insn is not enough.
-- Target Hook: void TARGET_SCHED_DFA_POST_ADVANCE_CYCLE (void)
The hook to notify target that new simulated cycle has just
started. The hook is analogous to
`TARGET_SCHED_DFA_POST_CYCLE_INSN' but used to change the state in
more complicated situations - e.g., when advancing state on a
single insn is not enough.
-- Target Hook: int TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
(void)
This hook controls better choosing an insn from the ready insn
queue for the DFA-based insn scheduler. Usually the scheduler
chooses the first insn from the queue. If the hook returns a
positive value, an additional scheduler code tries all
permutations of `TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
()' subsequent ready insns to choose an insn whose issue will
result in maximal number of issued insns on the same cycle. For
the VLIW processor, the code could actually solve the problem of
packing simple insns into the VLIW insn. Of course, if the rules
of VLIW packing are described in the automaton.
This code also could be used for superscalar RISC processors. Let
us consider a superscalar RISC processor with 3 pipelines. Some
insns can be executed in pipelines A or B, some insns can be
executed only in pipelines B or C, and one insn can be executed in
pipeline B. The processor may issue the 1st insn into A and the
2nd one into B. In this case, the 3rd insn will wait for freeing B
until the next cycle. If the scheduler issues the 3rd insn the
first, the processor could issue all 3 insns per cycle.
Actually this code demonstrates advantages of the automaton based
pipeline hazard recognizer. We try quickly and easy many insn
schedules to choose the best one.
The default is no multipass scheduling.
-- Target Hook: int
TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD (rtx INSN)
This hook controls what insns from the ready insn queue will be
considered for the multipass insn scheduling. If the hook returns
zero for INSN, the insn will be not chosen to be issued.
The default is that any ready insns can be chosen to be issued.
-- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BEGIN (void
*DATA, char *READY_TRY, int N_READY, bool FIRST_CYCLE_INSN_P)
This hook prepares the target backend for a new round of multipass
scheduling.
-- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_ISSUE (void
*DATA, char *READY_TRY, int N_READY, rtx INSN, const void
*PREV_DATA)
This hook is called when multipass scheduling evaluates
instruction INSN.
-- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BACKTRACK
(const void *DATA, char *READY_TRY, int N_READY)
This is called when multipass scheduling backtracks from
evaluation of an instruction.
-- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_END (const
void *DATA)
This hook notifies the target about the result of the concluded
current round of multipass scheduling.
-- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_INIT (void
*DATA)
This hook initializes target-specific data used in multipass
scheduling.
-- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_FINI (void
*DATA)
This hook finalizes target-specific data used in multipass
scheduling.
-- Target Hook: int TARGET_SCHED_DFA_NEW_CYCLE (FILE *DUMP, int
VERBOSE, rtx INSN, int LAST_CLOCK, int CLOCK, int *SORT_P)
This hook is called by the insn scheduler before issuing INSN on
cycle CLOCK. If the hook returns nonzero, INSN is not issued on
this processor cycle. Instead, the processor cycle is advanced.
If *SORT_P is zero, the insn ready queue is not sorted on the new
cycle start as usually. DUMP and VERBOSE specify the file and
verbosity level to use for debugging output. LAST_CLOCK and CLOCK
are, respectively, the processor cycle on which the previous insn
has been issued, and the current processor cycle.
-- Target Hook: bool TARGET_SCHED_IS_COSTLY_DEPENDENCE (struct _dep
*_DEP, int COST, int DISTANCE)
This hook is used to define which dependences are considered
costly by the target, so costly that it is not advisable to
schedule the insns that are involved in the dependence too close
to one another. The parameters to this hook are as follows: The
first parameter _DEP is the dependence being evaluated. The
second parameter COST is the cost of the dependence as estimated
by the scheduler, and the third parameter DISTANCE is the distance
in cycles between the two insns. The hook returns `true' if
considering the distance between the two insns the dependence
between them is considered costly by the target, and `false'
otherwise.
Defining this hook can be useful in multiple-issue out-of-order
machines, where (a) it's practically hopeless to predict the
actual data/resource delays, however: (b) there's a better chance
to predict the actual grouping that will be formed, and (c)
correctly emulating the grouping can be very important. In such
targets one may want to allow issuing dependent insns closer to
one another--i.e., closer than the dependence distance; however,
not in cases of "costly dependences", which this hooks allows to
define.
-- Target Hook: void TARGET_SCHED_H_I_D_EXTENDED (void)
This hook is called by the insn scheduler after emitting a new
instruction to the instruction stream. The hook notifies a target
backend to extend its per instruction data structures.
-- Target Hook: void * TARGET_SCHED_ALLOC_SCHED_CONTEXT (void)
Return a pointer to a store large enough to hold target scheduling
context.
-- Target Hook: void TARGET_SCHED_INIT_SCHED_CONTEXT (void *TC, bool
CLEAN_P)
Initialize store pointed to by TC to hold target scheduling
context. It CLEAN_P is true then initialize TC as if scheduler is
at the beginning of the block. Otherwise, copy the current
context into TC.
-- Target Hook: void TARGET_SCHED_SET_SCHED_CONTEXT (void *TC)
Copy target scheduling context pointed to by TC to the current
context.
-- Target Hook: void TARGET_SCHED_CLEAR_SCHED_CONTEXT (void *TC)
Deallocate internal data in target scheduling context pointed to
by TC.
-- Target Hook: void TARGET_SCHED_FREE_SCHED_CONTEXT (void *TC)
Deallocate a store for target scheduling context pointed to by TC.
-- Target Hook: int TARGET_SCHED_SPECULATE_INSN (rtx INSN, int
REQUEST, rtx *NEW_PAT)
This hook is called by the insn scheduler when INSN has only
speculative dependencies and therefore can be scheduled
speculatively. The hook is used to check if the pattern of INSN
has a speculative version and, in case of successful check, to
generate that speculative pattern. The hook should return 1, if
the instruction has a speculative form, or -1, if it doesn't.
REQUEST describes the type of requested speculation. If the
return value equals 1 then NEW_PAT is assigned the generated
speculative pattern.
-- Target Hook: bool TARGET_SCHED_NEEDS_BLOCK_P (int DEP_STATUS)
This hook is called by the insn scheduler during generation of
recovery code for INSN. It should return `true', if the
corresponding check instruction should branch to recovery code, or
`false' otherwise.
-- Target Hook: rtx TARGET_SCHED_GEN_SPEC_CHECK (rtx INSN, rtx LABEL,
int MUTATE_P)
This hook is called by the insn scheduler to generate a pattern
for recovery check instruction. If MUTATE_P is zero, then INSN is
a speculative instruction for which the check should be generated.
LABEL is either a label of a basic block, where recovery code
should be emitted, or a null pointer, when requested check doesn't
branch to recovery code (a simple check). If MUTATE_P is nonzero,
then a pattern for a branchy check corresponding to a simple check
denoted by INSN should be generated. In this case LABEL can't be
null.
-- Target Hook: bool
TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC (const_rtx
INSN)
This hook is used as a workaround for
`TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD' not being
called on the first instruction of the ready list. The hook is
used to discard speculative instructions that stand first in the
ready list from being scheduled on the current cycle. If the hook
returns `false', INSN will not be chosen to be issued. For
non-speculative instructions, the hook should always return
`true'. For example, in the ia64 backend the hook is used to
cancel data speculative insns when the ALAT table is nearly full.
-- Target Hook: void TARGET_SCHED_SET_SCHED_FLAGS (struct
spec_info_def *SPEC_INFO)
This hook is used by the insn scheduler to find out what features
should be enabled/used. The structure *SPEC_INFO should be filled
in by the target. The structure describes speculation types that
can be used in the scheduler.
-- Target Hook: int TARGET_SCHED_SMS_RES_MII (struct ddg *G)
This hook is called by the swing modulo scheduler to calculate a
resource-based lower bound which is based on the resources
available in the machine and the resources required by each
instruction. The target backend can use G to calculate such
bound. A very simple lower bound will be used in case this hook
is not implemented: the total number of instructions divided by
the issue rate.
-- Target Hook: bool TARGET_SCHED_DISPATCH (rtx INSN, int X)
This hook is called by Haifa Scheduler. It returns true if
dispatch scheduling is supported in hardware and the condition
specified in the parameter is true.
-- Target Hook: void TARGET_SCHED_DISPATCH_DO (rtx INSN, int X)
This hook is called by Haifa Scheduler. It performs the operation
specified in its second parameter.
File: gccint.info, Node: Sections, Next: PIC, Prev: Scheduling, Up: Target Macros
17.19 Dividing the Output into Sections (Texts, Data, ...)
==========================================================
An object file is divided into sections containing different types of
data. In the most common case, there are three sections: the "text
section", which holds instructions and read-only data; the "data
section", which holds initialized writable data; and the "bss section",
which holds uninitialized data. Some systems have other kinds of
sections.
`varasm.c' provides several well-known sections, such as
`text_section', `data_section' and `bss_section'. The normal way of
controlling a `FOO_section' variable is to define the associated
`FOO_SECTION_ASM_OP' macro, as described below. The macros are only
read once, when `varasm.c' initializes itself, so their values must be
run-time constants. They may however depend on command-line flags.
_Note:_ Some run-time files, such `crtstuff.c', also make use of the
`FOO_SECTION_ASM_OP' macros, and expect them to be string literals.
Some assemblers require a different string to be written every time a
section is selected. If your assembler falls into this category, you
should define the `TARGET_ASM_INIT_SECTIONS' hook and use
`get_unnamed_section' to set up the sections.
You must always create a `text_section', either by defining
`TEXT_SECTION_ASM_OP' or by initializing `text_section' in
`TARGET_ASM_INIT_SECTIONS'. The same is true of `data_section' and
`DATA_SECTION_ASM_OP'. If you do not create a distinct
`readonly_data_section', the default is to reuse `text_section'.
All the other `varasm.c' sections are optional, and are null if the
target does not provide them.
-- Macro: TEXT_SECTION_ASM_OP
A C expression whose value is a string, including spacing,
containing the assembler operation that should precede
instructions and read-only data. Normally `"\t.text"' is right.
-- Macro: HOT_TEXT_SECTION_NAME
If defined, a C string constant for the name of the section
containing most frequently executed functions of the program. If
not defined, GCC will provide a default definition if the target
supports named sections.
-- Macro: UNLIKELY_EXECUTED_TEXT_SECTION_NAME
If defined, a C string constant for the name of the section
containing unlikely executed functions in the program.
-- Macro: DATA_SECTION_ASM_OP
A C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data
as writable initialized data. Normally `"\t.data"' is right.
-- Macro: SDATA_SECTION_ASM_OP
If defined, a C expression whose value is a string, including
spacing, containing the assembler operation to identify the
following data as initialized, writable small data.
-- Macro: READONLY_DATA_SECTION_ASM_OP
A C expression whose value is a string, including spacing,
containing the assembler operation to identify the following data
as read-only initialized data.
-- Macro: BSS_SECTION_ASM_OP
If defined, a C expression whose value is a string, including
spacing, containing the assembler operation to identify the
following data as uninitialized global data. If not defined, and
neither `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
uninitialized global data will be output in the data section if
`-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
used.
-- Macro: SBSS_SECTION_ASM_OP
If defined, a C expression whose value is a string, including
spacing, containing the assembler operation to identify the
following data as uninitialized, writable small data.
-- Macro: TLS_COMMON_ASM_OP
If defined, a C expression whose value is a string containing the
assembler operation to identify the following data as thread-local
common data. The default is `".tls_common"'.
-- Macro: TLS_SECTION_ASM_FLAG
If defined, a C expression whose value is a character constant
containing the flag used to mark a section as a TLS section. The
default is `'T''.
-- Macro: INIT_SECTION_ASM_OP
If defined, a C expression whose value is a string, including
spacing, containing the assembler operation to identify the
following data as initialization code. If not defined, GCC will
assume such a section does not exist. This section has no
corresponding `init_section' variable; it is used entirely in
runtime code.
-- Macro: FINI_SECTION_ASM_OP
If defined, a C expression whose value is a string, including
spacing, containing the assembler operation to identify the
following data as finalization code. If not defined, GCC will
assume such a section does not exist. This section has no
corresponding `fini_section' variable; it is used entirely in
runtime code.
-- Macro: INIT_ARRAY_SECTION_ASM_OP
If defined, a C expression whose value is a string, including
spacing, containing the assembler operation to identify the
following data as part of the `.init_array' (or equivalent)
section. If not defined, GCC will assume such a section does not
exist. Do not define both this macro and `INIT_SECTION_ASM_OP'.
-- Macro: FINI_ARRAY_SECTION_ASM_OP
If defined, a C expression whose value is a string, including
spacing, containing the assembler operation to identify the
following data as part of the `.fini_array' (or equivalent)
section. If not defined, GCC will assume such a section does not
exist. Do not define both this macro and `FINI_SECTION_ASM_OP'.
-- Macro: CRT_CALL_STATIC_FUNCTION (SECTION_OP, FUNCTION)
If defined, an ASM statement that switches to a different section
via SECTION_OP, calls FUNCTION, and switches back to the text
section. This is used in `crtstuff.c' if `INIT_SECTION_ASM_OP' or
`FINI_SECTION_ASM_OP' to calls to initialization and finalization
functions from the init and fini sections. By default, this macro
uses a simple function call. Some ports need hand-crafted
assembly code to avoid dependencies on registers initialized in
the function prologue or to ensure that constant pools don't end
up too far way in the text section.
-- Macro: TARGET_LIBGCC_SDATA_SECTION
If defined, a string which names the section into which small
variables defined in crtstuff and libgcc should go. This is useful
when the target has options for optimizing access to small data,
and you want the crtstuff and libgcc routines to be conservative
in what they expect of your application yet liberal in what your
application expects. For example, for targets with a `.sdata'
section (like MIPS), you could compile crtstuff with `-G 0' so
that it doesn't require small data support from your application,
but use this macro to put small data into `.sdata' so that your
application can access these variables whether it uses small data
or not.
-- Macro: FORCE_CODE_SECTION_ALIGN
If defined, an ASM statement that aligns a code section to some
arbitrary boundary. This is used to force all fragments of the
`.init' and `.fini' sections to have to same alignment and thus
prevent the linker from having to add any padding.
-- Macro: JUMP_TABLES_IN_TEXT_SECTION
Define this macro to be an expression with a nonzero value if jump
tables (for `tablejump' insns) should be output in the text
section, along with the assembler instructions. Otherwise, the
readonly data section is used.
This macro is irrelevant if there is no separate readonly data
section.
-- Target Hook: void TARGET_ASM_INIT_SECTIONS (void)
Define this hook if you need to do something special to set up the
`varasm.c' sections, or if your target has some special sections
of its own that you need to create.
GCC calls this hook after processing the command line, but before
writing any assembly code, and before calling any of the
section-returning hooks described below.
-- Target Hook: int TARGET_ASM_RELOC_RW_MASK (void)
Return a mask describing how relocations should be treated when
selecting sections. Bit 1 should be set if global relocations
should be placed in a read-write section; bit 0 should be set if
local relocations should be placed in a read-write section.
The default version of this function returns 3 when `-fpic' is in
effect, and 0 otherwise. The hook is typically redefined when the
target cannot support (some kinds of) dynamic relocations in
read-only sections even in executables.
-- Target Hook: section * TARGET_ASM_SELECT_SECTION (tree EXP, int
RELOC, unsigned HOST_WIDE_INT ALIGN)
Return the section into which EXP should be placed. You can
assume that EXP is either a `VAR_DECL' node or a constant of some
sort. RELOC indicates whether the initial value of EXP requires
link-time relocations. Bit 0 is set when variable contains local
relocations only, while bit 1 is set for global relocations.
ALIGN is the constant alignment in bits.
The default version of this function takes care of putting
read-only variables in `readonly_data_section'.
See also USE_SELECT_SECTION_FOR_FUNCTIONS.
-- Macro: USE_SELECT_SECTION_FOR_FUNCTIONS
Define this macro if you wish TARGET_ASM_SELECT_SECTION to be
called for `FUNCTION_DECL's as well as for variables and constants.
In the case of a `FUNCTION_DECL', RELOC will be zero if the
function has been determined to be likely to be called, and
nonzero if it is unlikely to be called.
-- Target Hook: void TARGET_ASM_UNIQUE_SECTION (tree DECL, int RELOC)
Build up a unique section name, expressed as a `STRING_CST' node,
and assign it to `DECL_SECTION_NAME (DECL)'. As with
`TARGET_ASM_SELECT_SECTION', RELOC indicates whether the initial
value of EXP requires link-time relocations.
The default version of this function appends the symbol name to the
ELF section name that would normally be used for the symbol. For
example, the function `foo' would be placed in `.text.foo'.
Whatever the actual target object format, this is often good
enough.
-- Target Hook: section * TARGET_ASM_FUNCTION_RODATA_SECTION (tree
DECL)
Return the readonly data section associated with
`DECL_SECTION_NAME (DECL)'. The default version of this function
selects `.gnu.linkonce.r.name' if the function's section is
`.gnu.linkonce.t.name', `.rodata.name' if function is in
`.text.name', and the normal readonly-data section otherwise.
-- Target Hook: section * TARGET_ASM_SELECT_RTX_SECTION (enum
machine_mode MODE, rtx X, unsigned HOST_WIDE_INT ALIGN)
Return the section into which a constant X, of mode MODE, should
be placed. You can assume that X is some kind of constant in RTL.
The argument MODE is redundant except in the case of a `const_int'
rtx. ALIGN is the constant alignment in bits.
The default version of this function takes care of putting symbolic
constants in `flag_pic' mode in `data_section' and everything else
in `readonly_data_section'.
-- Target Hook: tree TARGET_MANGLE_DECL_ASSEMBLER_NAME (tree DECL,
tree ID)
Define this hook if you need to postprocess the assembler name
generated by target-independent code. The ID provided to this
hook will be the computed name (e.g., the macro `DECL_NAME' of the
DECL in C, or the mangled name of the DECL in C++). The return
value of the hook is an `IDENTIFIER_NODE' for the appropriate
mangled name on your target system. The default implementation of
this hook just returns the ID provided.
-- Target Hook: void TARGET_ENCODE_SECTION_INFO (tree DECL, rtx RTL,
int NEW_DECL_P)
Define this hook if references to a symbol or a constant must be
treated differently depending on something about the variable or
function named by the symbol (such as what section it is in).
The hook is executed immediately after rtl has been created for
DECL, which may be a variable or function declaration or an entry
in the constant pool. In either case, RTL is the rtl in question.
Do _not_ use `DECL_RTL (DECL)' in this hook; that field may not
have been initialized yet.
In the case of a constant, it is safe to assume that the rtl is a
`mem' whose address is a `symbol_ref'. Most decls will also have
this form, but that is not guaranteed. Global register variables,
for instance, will have a `reg' for their rtl. (Normally the
right thing to do with such unusual rtl is leave it alone.)
The NEW_DECL_P argument will be true if this is the first time
that `TARGET_ENCODE_SECTION_INFO' has been invoked on this decl.
It will be false for subsequent invocations, which will happen for
duplicate declarations. Whether or not anything must be done for
the duplicate declaration depends on whether the hook examines
`DECL_ATTRIBUTES'. NEW_DECL_P is always true when the hook is
called for a constant.
The usual thing for this hook to do is to record flags in the
`symbol_ref', using `SYMBOL_REF_FLAG' or `SYMBOL_REF_FLAGS'.
Historically, the name string was modified if it was necessary to
encode more than one bit of information, but this practice is now
discouraged; use `SYMBOL_REF_FLAGS'.
The default definition of this hook, `default_encode_section_info'
in `varasm.c', sets a number of commonly-useful bits in
`SYMBOL_REF_FLAGS'. Check whether the default does what you need
before overriding it.
-- Target Hook: const char * TARGET_STRIP_NAME_ENCODING (const char
*NAME)
Decode NAME and return the real name part, sans the characters
that `TARGET_ENCODE_SECTION_INFO' may have added.
-- Target Hook: bool TARGET_IN_SMALL_DATA_P (const_tree EXP)
Returns true if EXP should be placed into a "small data" section.
The default version of this hook always returns false.
-- Target Hook: bool TARGET_HAVE_SRODATA_SECTION
Contains the value true if the target places read-only "small
data" into a separate section. The default value is false.
-- Target Hook: bool TARGET_PROFILE_BEFORE_PROLOGUE (void)
It returns true if target wants profile code emitted before
prologue.
The default version of this hook use the target macro
`PROFILE_BEFORE_PROLOGUE'.
-- Target Hook: bool TARGET_BINDS_LOCAL_P (const_tree EXP)
Returns true if EXP names an object for which name resolution
rules must resolve to the current "module" (dynamic shared library
or executable image).
The default version of this hook implements the name resolution
rules for ELF, which has a looser model of global name binding
than other currently supported object file formats.
-- Target Hook: bool TARGET_HAVE_TLS
Contains the value true if the target supports thread-local
storage. The default value is false.
File: gccint.info, Node: PIC, Next: Assembler Format, Prev: Sections, Up: Target Macros
17.20 Position Independent Code
===============================
This section describes macros that help implement generation of position
independent code. Simply defining these macros is not enough to
generate valid PIC; you must also add support to the hook
`TARGET_LEGITIMATE_ADDRESS_P' and to the macro `PRINT_OPERAND_ADDRESS',
as well as `LEGITIMIZE_ADDRESS'. You must modify the definition of
`movsi' to do something appropriate when the source operand contains a
symbolic address. You may also need to alter the handling of switch
statements so that they use relative addresses.
-- Macro: PIC_OFFSET_TABLE_REGNUM
The register number of the register used to address a table of
static data addresses in memory. In some cases this register is
defined by a processor's "application binary interface" (ABI).
When this macro is defined, RTL is generated for this register
once, as with the stack pointer and frame pointer registers. If
this macro is not defined, it is up to the machine-dependent files
to allocate such a register (if necessary). Note that this
register must be fixed when in use (e.g. when `flag_pic' is true).
-- Macro: PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
A C expression that is nonzero if the register defined by
`PIC_OFFSET_TABLE_REGNUM' is clobbered by calls. If not defined,
the default is zero. Do not define this macro if
`PIC_OFFSET_TABLE_REGNUM' is not defined.
-- Macro: LEGITIMATE_PIC_OPERAND_P (X)
A C expression that is nonzero if X is a legitimate immediate
operand on the target machine when generating position independent
code. You can assume that X satisfies `CONSTANT_P', so you need
not check this. You can also assume FLAG_PIC is true, so you need
not check it either. You need not define this macro if all
constants (including `SYMBOL_REF') can be immediate operands when
generating position independent code.
File: gccint.info, Node: Assembler Format, Next: Debugging Info, Prev: PIC, Up: Target Macros
17.21 Defining the Output Assembler Language
============================================
This section describes macros whose principal purpose is to describe how
to write instructions in assembler language--rather than what the
instructions do.
* Menu:
* File Framework:: Structural information for the assembler file.
* Data Output:: Output of constants (numbers, strings, addresses).
* Uninitialized Data:: Output of uninitialized variables.
* Label Output:: Output and generation of labels.
* Initialization:: General principles of initialization
and termination routines.
* Macros for Initialization::
Specific macros that control the handling of
initialization and termination routines.
* Instruction Output:: Output of actual instructions.
* Dispatch Tables:: Output of jump tables.
* Exception Region Output:: Output of exception region code.
* Alignment Output:: Pseudo ops for alignment and skipping data.
File: gccint.info, Node: File Framework, Next: Data Output, Up: Assembler Format
17.21.1 The Overall Framework of an Assembler File
--------------------------------------------------
This describes the overall framework of an assembly file.
-- Target Hook: void TARGET_ASM_FILE_START (void)
Output to `asm_out_file' any text which the assembler expects to
find at the beginning of a file. The default behavior is
controlled by two flags, documented below. Unless your target's
assembler is quite unusual, if you override the default, you
should call `default_file_start' at some point in your target
hook. This lets other target files rely on these variables.
-- Target Hook: bool TARGET_ASM_FILE_START_APP_OFF
If this flag is true, the text of the macro `ASM_APP_OFF' will be
printed as the very first line in the assembly file, unless
`-fverbose-asm' is in effect. (If that macro has been defined to
the empty string, this variable has no effect.) With the normal
definition of `ASM_APP_OFF', the effect is to notify the GNU
assembler that it need not bother stripping comments or extra
whitespace from its input. This allows it to work a bit faster.
The default is false. You should not set it to true unless you
have verified that your port does not generate any extra
whitespace or comments that will cause GAS to issue errors in
NO_APP mode.
-- Target Hook: bool TARGET_ASM_FILE_START_FILE_DIRECTIVE
If this flag is true, `output_file_directive' will be called for
the primary source file, immediately after printing `ASM_APP_OFF'
(if that is enabled). Most ELF assemblers expect this to be done.
The default is false.
-- Target Hook: void TARGET_ASM_FILE_END (void)
Output to `asm_out_file' any text which the assembler expects to
find at the end of a file. The default is to output nothing.
-- Function: void file_end_indicate_exec_stack ()
Some systems use a common convention, the `.note.GNU-stack'
special section, to indicate whether or not an object file relies
on the stack being executable. If your system uses this
convention, you should define `TARGET_ASM_FILE_END' to this
function. If you need to do other things in that hook, have your
hook function call this function.
-- Target Hook: void TARGET_ASM_LTO_START (void)
Output to `asm_out_file' any text which the assembler expects to
find at the start of an LTO section. The default is to output
nothing.
-- Target Hook: void TARGET_ASM_LTO_END (void)
Output to `asm_out_file' any text which the assembler expects to
find at the end of an LTO section. The default is to output
nothing.
-- Target Hook: void TARGET_ASM_CODE_END (void)
Output to `asm_out_file' any text which is needed before emitting
unwind info and debug info at the end of a file. Some targets emit
here PIC setup thunks that cannot be emitted at the end of file,
because they couldn't have unwind info then. The default is to
output nothing.
-- Macro: ASM_COMMENT_START
A C string constant describing how to begin a comment in the target
assembler language. The compiler assumes that the comment will
end at the end of the line.
-- Macro: 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.
-- Macro: 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.
-- Macro: ASM_OUTPUT_SOURCE_FILENAME (STREAM, NAME)
A C statement to output COFF information or DWARF 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 output for
the file format in use is appropriate.
-- Target Hook: void TARGET_ASM_OUTPUT_SOURCE_FILENAME (FILE *FILE,
const char *NAME)
Output COFF information or DWARF debugging information which
indicates that filename NAME is the current source file to the
stdio stream FILE.
This target hook need not be defined if the standard form of
output for the file format in use is appropriate.
-- Macro: OUTPUT_QUOTED_STRING (STREAM, STRING)
A C statement to output the string STRING to the stdio stream
STREAM. If you do not call the function `output_quoted_string' in
your config files, GCC will only call it to output filenames to
the assembler source. So you can use it to canonicalize the format
of the filename using this macro.
-- Macro: 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 Hook: void TARGET_ASM_NAMED_SECTION (const char *NAME,
unsigned int FLAGS, tree DECL)
Output assembly directives to switch to section NAME. The section
should have attributes as specified by FLAGS, which is a bit mask
of the `SECTION_*' flags defined in `output.h'. If DECL is
non-NULL, it is the `VAR_DECL' or `FUNCTION_DECL' with which this
section is associated.
-- Target Hook: section * TARGET_ASM_FUNCTION_SECTION (tree DECL, enum
node_frequency FREQ, bool STARTUP, bool EXIT)
Return preferred text (sub)section for function DECL. Main
purpose of this function is to separate cold, normal and hot
functions. STARTUP is true when function is known to be used only
at startup (from static constructors or it is `main()'). EXIT is
true when function is known to be used only at exit (from static
destructors). Return NULL if function should go to default text
section.
-- Target Hook: void TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS (FILE
*FILE, tree DECL, bool NEW_IS_COLD)
Used by the target to emit any assembler directives or additional
labels needed when a function is partitioned between different
sections. Output should be written to FILE. The function decl
is available as DECL and the new section is `cold' if NEW_IS_COLD
is `true'.
-- Target Hook: bool TARGET_HAVE_NAMED_SECTIONS
This flag is true if the target supports
`TARGET_ASM_NAMED_SECTION'. It must not be modified by
command-line option processing.
-- Target Hook: bool TARGET_HAVE_SWITCHABLE_BSS_SECTIONS
This flag is true if we can create zeroed data by switching to a
BSS section and then using `ASM_OUTPUT_SKIP' to allocate the space.
This is true on most ELF targets.
-- Target Hook: unsigned int TARGET_SECTION_TYPE_FLAGS (tree DECL,
const char *NAME, int RELOC)
Choose a set of section attributes for use by
`TARGET_ASM_NAMED_SECTION' based on a variable or function decl, a
section name, and whether or not the declaration's initializer may
contain runtime relocations. DECL may be null, in which case
read-write data should be assumed.
The default version of this function handles choosing code vs data,
read-only vs read-write data, and `flag_pic'. You should only
need to override this if your target has special flags that might
be set via `__attribute__'.
-- Target Hook: int TARGET_ASM_RECORD_GCC_SWITCHES (print_switch_type
TYPE, const char *TEXT)
Provides the target with the ability to record the gcc command line
switches that have been passed to the compiler, and options that
are enabled. The TYPE argument specifies what is being recorded.
It can take the following values:
`SWITCH_TYPE_PASSED'
TEXT is a command line switch that has been set by the user.
`SWITCH_TYPE_ENABLED'
TEXT is an option which has been enabled. This might be as a
direct result of a command line switch, or because it is
enabled by default or because it has been enabled as a side
effect of a different command line switch. For example, the
`-O2' switch enables various different individual
optimization passes.
`SWITCH_TYPE_DESCRIPTIVE'
TEXT is either NULL or some descriptive text which should be
ignored. If TEXT is NULL then it is being used to warn the
target hook that either recording is starting or ending. The
first time TYPE is SWITCH_TYPE_DESCRIPTIVE and TEXT is NULL,
the warning is for start up and the second time the warning
is for wind down. This feature is to allow the target hook
to make any necessary preparations before it starts to record
switches and to perform any necessary tidying up after it has
finished recording switches.
`SWITCH_TYPE_LINE_START'
This option can be ignored by this target hook.
`SWITCH_TYPE_LINE_END'
This option can be ignored by this target hook.
The hook's return value must be zero. Other return values may be
supported in the future.
By default this hook is set to NULL, but an example implementation
is provided for ELF based targets. Called ELF_RECORD_GCC_SWITCHES,
it records the switches as ASCII text inside a new, string
mergeable section in the assembler output file. The name of the
new section is provided by the
`TARGET_ASM_RECORD_GCC_SWITCHES_SECTION' target hook.
-- Target Hook: const char * TARGET_ASM_RECORD_GCC_SWITCHES_SECTION
This is the name of the section that will be created by the example
ELF implementation of the `TARGET_ASM_RECORD_GCC_SWITCHES' target
hook.
File: gccint.info, Node: Data Output, Next: Uninitialized Data, Prev: File Framework, Up: Assembler Format
17.21.2 Output of Data
----------------------
-- Target Hook: const char * TARGET_ASM_BYTE_OP
-- Target Hook: const char * TARGET_ASM_ALIGNED_HI_OP
-- Target Hook: const char * TARGET_ASM_ALIGNED_SI_OP
-- Target Hook: const char * TARGET_ASM_ALIGNED_DI_OP
-- Target Hook: const char * TARGET_ASM_ALIGNED_TI_OP
-- Target Hook: const char * TARGET_ASM_UNALIGNED_HI_OP
-- Target Hook: const char * TARGET_ASM_UNALIGNED_SI_OP
-- Target Hook: const char * TARGET_ASM_UNALIGNED_DI_OP
-- Target Hook: const char * TARGET_ASM_UNALIGNED_TI_OP
These hooks specify assembly directives for creating certain kinds
of integer object. The `TARGET_ASM_BYTE_OP' directive creates a
byte-sized object, the `TARGET_ASM_ALIGNED_HI_OP' one creates an
aligned two-byte object, and so on. Any of the hooks may be
`NULL', indicating that no suitable directive is available.
The compiler will print these strings at the start of a new line,
followed immediately by the object's initial value. In most cases,
the string should contain a tab, a pseudo-op, and then another tab.
-- Target Hook: bool TARGET_ASM_INTEGER (rtx X, unsigned int SIZE, int
ALIGNED_P)
The `assemble_integer' function uses this hook to output an
integer object. X is the object's value, SIZE is its size in
bytes and ALIGNED_P indicates whether it is aligned. The function
should return `true' if it was able to output the object. If it
returns false, `assemble_integer' will try to split the object
into smaller parts.
The default implementation of this hook will use the
`TARGET_ASM_BYTE_OP' family of strings, returning `false' when the
relevant string is `NULL'.
-- Target Hook: bool TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA (FILE *FILE,
rtx X)
A target hook to recognize RTX patterns that `output_addr_const'
can't deal with, and output assembly code to FILE corresponding to
the pattern X. This may be used to allow machine-dependent
`UNSPEC's to appear within constants.
If target hook fails to recognize a pattern, it must return
`false', so that a standard error message is printed. If it
prints an error message itself, by calling, for example,
`output_operand_lossage', it may just return `true'.
-- Macro: OUTPUT_ADDR_CONST_EXTRA (STREAM, X, FAIL)
A C statement to recognize RTX patterns that `output_addr_const'
can't deal with, and output assembly code to STREAM corresponding
to the pattern X. This may be used to allow machine-dependent
`UNSPEC's to appear within constants.
If `OUTPUT_ADDR_CONST_EXTRA' fails to recognize a pattern, it must
`goto fail', so that a standard error message is printed. If it
prints an error message itself, by calling, for example,
`output_operand_lossage', it may just complete normally.
-- Macro: 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'.
-- Macro: ASM_OUTPUT_FDESC (STREAM, DECL, N)
A C statement to output word N of a function descriptor for DECL.
This must be defined if `TARGET_VTABLE_USES_DESCRIPTORS' is
defined, and is otherwise unused.
-- Macro: CONSTANT_POOL_BEFORE_FUNCTION
You may define this macro as a C expression. You should define the
expression to have a nonzero value if GCC should output the
constant pool for a function before the code for the function, or
a zero value if GCC should output the constant pool after the
function. If you do not define this macro, the usual case, GCC
will output the constant pool before the function.
-- Macro: ASM_OUTPUT_POOL_PROLOGUE (FILE, FUNNAME, FUNDECL, SIZE)
A C statement to output assembler commands to define the start of
the constant pool for a function. FUNNAME is a string giving the
name of the function. Should the return type of the function be
required, it can be obtained via FUNDECL. SIZE is the size, in
bytes, of the constant pool that will be written immediately after
this call.
If no constant-pool prefix is required, the usual case, this macro
need not be defined.
-- Macro: ASM_OUTPUT_SPECIAL_POOL_ENTRY (FILE, X, MODE, ALIGN,
LABELNO, JUMPTO)
A C statement (with or without semicolon) to output a constant in
the constant pool, if it needs special treatment. (This macro
need not do anything for RTL expressions that can be output
normally.)
The argument FILE is the standard I/O stream to output the
assembler code on. X is the RTL expression for the constant to
output, and MODE is the machine mode (in case X is a `const_int').
ALIGN is the required alignment for the value X; you should output
an assembler directive to force this much alignment.
The argument LABELNO is a number to use in an internal label for
the address of this pool entry. The definition of this macro is
responsible for outputting the label definition at the proper
place. Here is how to do this:
`(*targetm.asm_out.internal_label)' (FILE, "LC", LABELNO);
When you output a pool entry specially, you should end with a
`goto' to the label JUMPTO. This will prevent the same pool entry
from being output a second time in the usual manner.
You need not define this macro if it would do nothing.
-- Macro: ASM_OUTPUT_POOL_EPILOGUE (FILE FUNNAME FUNDECL SIZE)
A C statement to output assembler commands to at the end of the
constant pool for a function. FUNNAME is a string giving the name
of the function. Should the return type of the function be
required, you can obtain it via FUNDECL. SIZE is the size, in
bytes, of the constant pool that GCC wrote immediately before this
call.
If no constant-pool epilogue is required, the usual case, you need
not define this macro.
-- Macro: IS_ASM_LOGICAL_LINE_SEPARATOR (C, STR)
Define this macro as a C expression which is nonzero if C is used
as a logical line separator by the assembler. STR points to the
position in the string where C was found; this can be used if a
line separator uses multiple characters.
If you do not define this macro, the default is that only the
character `;' is treated as a logical line separator.
-- Target Hook: const char * TARGET_ASM_OPEN_PAREN
-- Target Hook: const char * TARGET_ASM_CLOSE_PAREN
These target hooks are C string constants, describing the syntax
in the assembler for grouping arithmetic expressions. If not
overridden, they default to normal parentheses, which is correct
for most assemblers.
These macros are provided by `real.h' for writing the definitions of
`ASM_OUTPUT_DOUBLE' and the like:
-- Macro: REAL_VALUE_TO_TARGET_SINGLE (X, L)
-- Macro: REAL_VALUE_TO_TARGET_DOUBLE (X, L)
-- Macro: REAL_VALUE_TO_TARGET_LONG_DOUBLE (X, L)
-- Macro: REAL_VALUE_TO_TARGET_DECIMAL32 (X, L)
-- Macro: REAL_VALUE_TO_TARGET_DECIMAL64 (X, L)
-- Macro: REAL_VALUE_TO_TARGET_DECIMAL128 (X, L)
These translate X, of type `REAL_VALUE_TYPE', to the target's
floating point representation, and store its bit pattern in the
variable L. For `REAL_VALUE_TO_TARGET_SINGLE' and
`REAL_VALUE_TO_TARGET_DECIMAL32', this variable should be a simple
`long int'. For the others, it should be an array of `long int'.
The number of elements in this array is determined by the size of
the desired target floating point data type: 32 bits of it go in
each `long int' array element. Each array element holds 32 bits
of the result, even if `long int' is wider than 32 bits on the
host machine.
The array element values are designed so that you can print them
out using `fprintf' in the order they should appear in the target
machine's memory.
File: gccint.info, Node: Uninitialized Data, Next: Label Output, Prev: Data Output, Up: Assembler Format
17.21.3 Output of Uninitialized Variables
-----------------------------------------
Each of the macros in this section is used to do the whole job of
outputting a single uninitialized variable.
-- Macro: 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. It is possible that SIZE
may be zero, for instance if a struct with no other member than a
zero-length array is defined. In this case, the backend must
output a symbol definition that allocates at least one byte, both
so that the address of the resulting object does not compare equal
to any other, and because some object formats cannot even express
the concept of a zero-sized common symbol, as that is how they
represent an ordinary undefined external.
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
common global variables are output.
-- Macro: ASM_OUTPUT_ALIGNED_COMMON (STREAM, NAME, SIZE, ALIGNMENT)
Like `ASM_OUTPUT_COMMON' except takes the required alignment as a
separate, explicit argument. If you define this macro, it is used
in place of `ASM_OUTPUT_COMMON', and gives you more flexibility in
handling the required alignment of the variable. The alignment is
specified as the number of bits.
-- Macro: ASM_OUTPUT_ALIGNED_DECL_COMMON (STREAM, DECL, NAME, SIZE,
ALIGNMENT)
Like `ASM_OUTPUT_ALIGNED_COMMON' except that DECL of the variable
to be output, if there is one, or `NULL_TREE' if there is no
corresponding variable. If you define this macro, GCC will use it
in place of both `ASM_OUTPUT_COMMON' and
`ASM_OUTPUT_ALIGNED_COMMON'. Define this macro when you need to
see the variable's decl in order to chose what to output.
-- Macro: ASM_OUTPUT_BSS (STREAM, DECL, NAME, SIZE, ROUNDED)
A C statement (sans semicolon) to output to the stdio stream
STREAM the assembler definition of uninitialized global DECL named
NAME whose size is SIZE bytes. The variable ROUNDED is the size
rounded up to whatever alignment the caller wants.
Try to use function `asm_output_bss' defined in `varasm.c' when
defining this macro. If unable, 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.
There are two ways of handling global BSS. One is to define either
this macro or its aligned counterpart, `ASM_OUTPUT_ALIGNED_BSS'.
The other is to have `TARGET_ASM_SELECT_SECTION' return a
switchable BSS section (*note
TARGET_HAVE_SWITCHABLE_BSS_SECTIONS::). You do not need to do
both.
Some languages do not have `common' data, and require a non-common
form of global BSS in order to handle uninitialized globals
efficiently. C++ is one example of this. However, if the target
does not support global BSS, the front end may choose to make
globals common in order to save space in the object file.
-- Macro: ASM_OUTPUT_ALIGNED_BSS (STREAM, DECL, NAME, SIZE, ALIGNMENT)
Like `ASM_OUTPUT_BSS' except takes the required alignment as a
separate, explicit argument. If you define this macro, it is used
in place of `ASM_OUTPUT_BSS', and gives you more flexibility in
handling the required alignment of the variable. The alignment is
specified as the number of bits.
Try to use function `asm_output_aligned_bss' defined in file
`varasm.c' when defining this macro.
-- Macro: 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.
-- Macro: ASM_OUTPUT_ALIGNED_LOCAL (STREAM, NAME, SIZE, ALIGNMENT)
Like `ASM_OUTPUT_LOCAL' except takes the required alignment as a
separate, explicit argument. If you define this macro, it is used
in place of `ASM_OUTPUT_LOCAL', and gives you more flexibility in
handling the required alignment of the variable. The alignment is
specified as the number of bits.
-- Macro: ASM_OUTPUT_ALIGNED_DECL_LOCAL (STREAM, DECL, NAME, SIZE,
ALIGNMENT)
Like `ASM_OUTPUT_ALIGNED_DECL' except that DECL of the variable to
be output, if there is one, or `NULL_TREE' if there is no
corresponding variable. If you define this macro, GCC will use it
in place of both `ASM_OUTPUT_DECL' and `ASM_OUTPUT_ALIGNED_DECL'.
Define this macro when you need to see the variable's decl in
order to chose what to output.
File: gccint.info, Node: Label Output, Next: Initialization, Prev: Uninitialized Data, Up: Assembler Format
17.21.4 Output and Generation of Labels
---------------------------------------
This is about outputting labels.
-- Macro: 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. A default definition
of this macro is provided which is correct for most systems.
-- Macro: ASM_OUTPUT_FUNCTION_LABEL (STREAM, NAME, DECL)
A C statement (sans semicolon) to output to the stdio stream
STREAM the assembler definition of a label named NAME of a
function. 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.
A default definition of this macro is provided which is correct
for most systems.
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').
-- Macro: ASM_OUTPUT_INTERNAL_LABEL (STREAM, NAME)
Identical to `ASM_OUTPUT_LABEL', except that NAME is known to
refer to a compiler-generated label. The default definition uses
`assemble_name_raw', which is like `assemble_name' except that it
is more efficient.
-- Macro: SIZE_ASM_OP
A C string containing the appropriate assembler directive to
specify the size of a symbol, without any arguments. On systems
that use ELF, the default (in `config/elfos.h') is `"\t.size\t"';
on other systems, the default is not to define this macro.
Define this macro only if it is correct to use the default
definitions of `ASM_OUTPUT_SIZE_DIRECTIVE' and
`ASM_OUTPUT_MEASURED_SIZE' for your system. If you need your own
custom definitions of those macros, or if you do not need explicit
symbol sizes at all, do not define this macro.
-- Macro: ASM_OUTPUT_SIZE_DIRECTIVE (STREAM, NAME, SIZE)
A C statement (sans semicolon) to output to the stdio stream
STREAM a directive telling the assembler that the size of the
symbol NAME is SIZE. SIZE is a `HOST_WIDE_INT'. If you define
`SIZE_ASM_OP', a default definition of this macro is provided.
-- Macro: ASM_OUTPUT_MEASURED_SIZE (STREAM, NAME)
A C statement (sans semicolon) to output to the stdio stream
STREAM a directive telling the assembler to calculate the size of
the symbol NAME by subtracting its address from the current
address.
If you define `SIZE_ASM_OP', a default definition of this macro is
provided. The default assumes that the assembler recognizes a
special `.' symbol as referring to the current address, and can
calculate the difference between this and another symbol. If your
assembler does not recognize `.' or cannot do calculations with
it, you will need to redefine `ASM_OUTPUT_MEASURED_SIZE' to use
some other technique.
-- Macro: TYPE_ASM_OP
A C string containing the appropriate assembler directive to
specify the type of a symbol, without any arguments. On systems
that use ELF, the default (in `config/elfos.h') is `"\t.type\t"';
on other systems, the default is not to define this macro.
Define this macro only if it is correct to use the default
definition of `ASM_OUTPUT_TYPE_DIRECTIVE' for your system. If you
need your own custom definition of this macro, or if you do not
need explicit symbol types at all, do not define this macro.
-- Macro: TYPE_OPERAND_FMT
A C string which specifies (using `printf' syntax) the format of
the second operand to `TYPE_ASM_OP'. On systems that use ELF, the
default (in `config/elfos.h') is `"@%s"'; on other systems, the
default is not to define this macro.
Define this macro only if it is correct to use the default
definition of `ASM_OUTPUT_TYPE_DIRECTIVE' for your system. If you
need your own custom definition of this macro, or if you do not
need explicit symbol types at all, do not define this macro.
-- Macro: ASM_OUTPUT_TYPE_DIRECTIVE (STREAM, TYPE)
A C statement (sans semicolon) to output to the stdio stream
STREAM a directive telling the assembler that the type of the
symbol NAME is TYPE. TYPE is a C string; currently, that string
is always either `"function"' or `"object"', but you should not
count on this.
If you define `TYPE_ASM_OP' and `TYPE_OPERAND_FMT', a default
definition of this macro is provided.
-- Macro: 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_FUNCTION_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_FUNCTION_LABEL').
You may wish to use `ASM_OUTPUT_TYPE_DIRECTIVE' in the definition
of this macro.
-- Macro: ASM_DECLARE_FUNCTION_SIZE (STREAM, NAME, DECL)
A C statement (sans semicolon) to output to the stdio stream
STREAM any text necessary for declaring the size of a function
which is being defined. The argument NAME is the name of the
function. The argument DECL is the `FUNCTION_DECL' tree node
representing the function.
If this macro is not defined, then the function size is not
defined.
You may wish to use `ASM_OUTPUT_MEASURED_SIZE' in the definition
of this macro.
-- Macro: ASM_DECLARE_OBJECT_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 an
initialized variable which is being defined. This macro must
output the label definition (perhaps using `ASM_OUTPUT_LABEL').
The argument DECL is the `VAR_DECL' tree node representing the
variable.
If this macro is not defined, then the variable name is defined in
the usual manner as a label (by means of `ASM_OUTPUT_LABEL').
You may wish to use `ASM_OUTPUT_TYPE_DIRECTIVE' and/or
`ASM_OUTPUT_SIZE_DIRECTIVE' in the definition of this macro.
-- Target Hook: void TARGET_ASM_DECLARE_CONSTANT_NAME (FILE *FILE,
const char *NAME, const_tree EXPR, HOST_WIDE_INT SIZE)
A target hook to output to the stdio stream FILE any text necessary
for declaring the name NAME of a constant which is being defined.
This target hook is responsible for outputting the label
definition (perhaps using `assemble_label'). The argument EXP is
the value of the constant, and SIZE is the size of the constant in
bytes. The NAME will be an internal label.
The default version of this target hook, define the NAME in the
usual manner as a label (by means of `assemble_label').
You may wish to use `ASM_OUTPUT_TYPE_DIRECTIVE' in this target
hook.
-- Macro: ASM_DECLARE_REGISTER_GLOBAL (STREAM, DECL, REGNO, NAME)
A C statement (sans semicolon) to output to the stdio stream
STREAM any text necessary for claiming a register REGNO for a
global variable DECL with name NAME.
If you don't define this macro, that is equivalent to defining it
to do nothing.
-- Macro: ASM_FINISH_DECLARE_OBJECT (STREAM, DECL, TOPLEVEL, ATEND)
A C statement (sans semicolon) to finish up declaring a variable
name once the compiler has processed its initializer fully and
thus has had a chance to determine the size of an array when
controlled by an initializer. This is used on systems where it's
necessary to declare something about the size of the object.
If you don't define this macro, that is equivalent to defining it
to do nothing.
You may wish to use `ASM_OUTPUT_SIZE_DIRECTIVE' and/or
`ASM_OUTPUT_MEASURED_SIZE' in the definition of this macro.
-- Target Hook: void TARGET_ASM_GLOBALIZE_LABEL (FILE *STREAM, const
char *NAME)
This target hook is a function to output to the stdio stream
STREAM some commands that will make the label NAME global; that
is, available for reference from other files.
The default implementation relies on a proper definition of
`GLOBAL_ASM_OP'.
-- Target Hook: void TARGET_ASM_GLOBALIZE_DECL_NAME (FILE *STREAM,
tree DECL)
This target hook is a function to output to the stdio stream
STREAM some commands that will make the name associated with DECL
global; that is, available for reference from other files.
The default implementation uses the TARGET_ASM_GLOBALIZE_LABEL
target hook.
-- Macro: ASM_WEAKEN_LABEL (STREAM, NAME)
A C statement (sans semicolon) to output to the stdio stream
STREAM some commands that will make the label NAME weak; that is,
available for reference from other files but only used if no other
definition is available. 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 weak,
and a newline.
If you don't define this macro or `ASM_WEAKEN_DECL', GCC will not
support weak symbols and you should not define the `SUPPORTS_WEAK'
macro.
-- Macro: ASM_WEAKEN_DECL (STREAM, DECL, NAME, VALUE)
Combines (and replaces) the function of `ASM_WEAKEN_LABEL' and
`ASM_OUTPUT_WEAK_ALIAS', allowing access to the associated function
or variable decl. If VALUE is not `NULL', this C statement should
output to the stdio stream STREAM assembler code which defines
(equates) the weak symbol NAME to have the value VALUE. If VALUE
is `NULL', it should output commands to make NAME weak.
-- Macro: ASM_OUTPUT_WEAKREF (STREAM, DECL, NAME, VALUE)
Outputs a directive that enables NAME to be used to refer to
symbol VALUE with weak-symbol semantics. `decl' is the
declaration of `name'.
-- Macro: SUPPORTS_WEAK
A preprocessor constant expression which evaluates to true if the
target supports weak symbols.
If you don't define this macro, `defaults.h' provides a default
definition. If either `ASM_WEAKEN_LABEL' or `ASM_WEAKEN_DECL' is
defined, the default definition is `1'; otherwise, it is `0'.
-- Macro: TARGET_SUPPORTS_WEAK
A C expression which evaluates to true if the target supports weak
symbols.
If you don't define this macro, `defaults.h' provides a default
definition. The default definition is `(SUPPORTS_WEAK)'. Define
this macro if you want to control weak symbol support with a
compiler flag such as `-melf'.
-- Macro: MAKE_DECL_ONE_ONLY (DECL)
A C statement (sans semicolon) to mark DECL to be emitted as a
public symbol such that extra copies in multiple translation units
will be discarded by the linker. Define this macro if your object
file format provides support for this concept, such as the `COMDAT'
section flags in the Microsoft Windows PE/COFF format, and this
support requires changes to DECL, such as putting it in a separate
section.
-- Macro: SUPPORTS_ONE_ONLY
A C expression which evaluates to true if the target supports
one-only semantics.
If you don't define this macro, `varasm.c' provides a default
definition. If `MAKE_DECL_ONE_ONLY' is defined, the default
definition is `1'; otherwise, it is `0'. Define this macro if you
want to control one-only symbol support with a compiler flag, or if
setting the `DECL_ONE_ONLY' flag is enough to mark a declaration to
be emitted as one-only.
-- Target Hook: void TARGET_ASM_ASSEMBLE_VISIBILITY (tree DECL, int
VISIBILITY)
This target hook is a function to output to ASM_OUT_FILE some
commands that will make the symbol(s) associated with DECL have
hidden, protected or internal visibility as specified by
VISIBILITY.
-- Macro: TARGET_WEAK_NOT_IN_ARCHIVE_TOC
A C expression that evaluates to true if the target's linker
expects that weak symbols do not appear in a static archive's
table of contents. The default is `0'.
Leaving weak symbols out of an archive's table of contents means
that, if a symbol will only have a definition in one translation
unit and will have undefined references from other translation
units, that symbol should not be weak. Defining this macro to be
nonzero will thus have the effect that certain symbols that would
normally be weak (explicit template instantiations, and vtables
for polymorphic classes with noninline key methods) will instead
be nonweak.
The C++ ABI requires this macro to be zero. Define this macro for
targets where full C++ ABI compliance is impossible and where
linker restrictions require weak symbols to be left out of a
static archive's table of contents.
-- Macro: 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.
-- Target Hook: void TARGET_ASM_EXTERNAL_LIBCALL (rtx SYMREF)
This target hook is a function to output to ASM_OUT_FILE an
assembler pseudo-op to declare a library function name external.
The name of the library function is given by SYMREF, which is a
`symbol_ref'.
-- Target Hook: void TARGET_ASM_MARK_DECL_PRESERVED (const char
*SYMBOL)
This target hook is a function to output to ASM_OUT_FILE an
assembler directive to annotate SYMBOL as used. The Darwin target
uses the .no_dead_code_strip directive.
-- Macro: ASM_OUTPUT_LABELREF (STREAM, NAME)
A C statement (sans semicolon) to output to the stdio stream
STREAM a reference in assembler syntax to a label named NAME.
This should add `_' 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'.
-- Target Hook: tree TARGET_MANGLE_ASSEMBLER_NAME (const char *NAME)
Given a symbol NAME, perform same mangling as `varasm.c''s
`assemble_name', but in memory rather than to a file stream,
returning result as an `IDENTIFIER_NODE'. Required for correct
LTO symtabs. The default implementation calls the
`TARGET_STRIP_NAME_ENCODING' hook and then prepends the
`USER_LABEL_PREFIX', if any.
-- Macro: ASM_OUTPUT_SYMBOL_REF (STREAM, SYM)
A C statement (sans semicolon) to output a reference to
`SYMBOL_REF' SYM. If not defined, `assemble_name' will be used to
output the name of the symbol. This macro may be used to modify
the way a symbol is referenced depending on information encoded by
`TARGET_ENCODE_SECTION_INFO'.
-- Macro: ASM_OUTPUT_LABEL_REF (STREAM, BUF)
A C statement (sans semicolon) to output a reference to BUF, the
result of `ASM_GENERATE_INTERNAL_LABEL'. If not defined,
`assemble_name' will be used to output the name of the symbol.
This macro is not used by `output_asm_label', or the `%l'
specifier that calls it; the intention is that this macro should
be set when it is necessary to output a label differently when its
address is being taken.
-- Target Hook: void TARGET_ASM_INTERNAL_LABEL (FILE *STREAM, const
char *PREFIX, unsigned long LABELNO)
A function to output to the stdio stream STREAM a label whose name
is made from the string PREFIX and the number LABELNO.
It is absolutely essential that these labels be distinct from the
labels used for user-level functions and variables. Otherwise,
certain programs will have name conflicts with internal labels.
It is desirable to exclude internal labels from the symbol table
of the object file. Most assemblers have a naming convention for
labels that should be excluded; on many systems, the letter `L' at
the beginning of a label has this effect. You should find out what
convention your system uses, and follow it.
The default version of this function utilizes
`ASM_GENERATE_INTERNAL_LABEL'.
-- Macro: ASM_OUTPUT_DEBUG_LABEL (STREAM, PREFIX, NUM)
A C statement to output to the stdio stream STREAM a debug info
label whose name is made from the string PREFIX and the number
NUM. This is useful for VLIW targets, where debug info labels may
need to be treated differently than branch target labels. On some
systems, branch target labels must be at the beginning of
instruction bundles, but debug info labels can occur in the middle
of instruction bundles.
If this macro is not defined, then
`(*targetm.asm_out.internal_label)' will be used.
-- Macro: 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 `assemble_name', should
produce the output that `(*targetm.asm_out.internal_label)' would
produce with the same PREFIX and NUM.
If the string begins with `*', then `assemble_name' will output
the rest of the string unchanged. It is often convenient for
`ASM_GENERATE_INTERNAL_LABEL' to use `*' in this way. If the
string doesn't start with `*', then `ASM_OUTPUT_LABELREF' gets to
output the string, and may change it. (Of course,
`ASM_OUTPUT_LABELREF' is also part of your machine description, so
you should know what it does on your machine.)
-- 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.
The string will be used as an 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.
If this macro is not defined, a default definition will be provided
which is correct for most systems.
-- Macro: ASM_OUTPUT_DEF (STREAM, NAME, VALUE)
A C statement to output to the stdio stream STREAM assembler code
which defines (equates) the symbol NAME to have the value VALUE.
If `SET_ASM_OP' is defined, a default definition is provided which
is correct for most systems.
-- Macro: ASM_OUTPUT_DEF_FROM_DECLS (STREAM, DECL_OF_NAME,
DECL_OF_VALUE)
A C statement to output to the stdio stream STREAM assembler code
which defines (equates) the symbol whose tree node is DECL_OF_NAME
to have the value of the tree node DECL_OF_VALUE. This macro will
be used in preference to `ASM_OUTPUT_DEF' if it is defined and if
the tree nodes are available.
If `SET_ASM_OP' is defined, a default definition is provided which
is correct for most systems.
-- Macro: TARGET_DEFERRED_OUTPUT_DEFS (DECL_OF_NAME, DECL_OF_VALUE)
A C statement that evaluates to true if the assembler code which
defines (equates) the symbol whose tree node is DECL_OF_NAME to
have the value of the tree node DECL_OF_VALUE should be emitted
near the end of the current compilation unit. The default is to
not defer output of defines. This macro affects defines output by
`ASM_OUTPUT_DEF' and `ASM_OUTPUT_DEF_FROM_DECLS'.
-- Macro: ASM_OUTPUT_WEAK_ALIAS (STREAM, NAME, VALUE)
A C statement to output to the stdio stream STREAM assembler code
which defines (equates) the weak symbol NAME to have the value
VALUE. If VALUE is `NULL', it defines NAME as an undefined weak
symbol.
Define this macro if the target only supports weak aliases; define
`ASM_OUTPUT_DEF' instead if possible.
-- Macro: OBJC_GEN_METHOD_LABEL (BUF, IS_INST, CLASS_NAME, CAT_NAME,
SEL_NAME)
Define this macro to override the default assembler names used for
Objective-C methods.
The default name is a unique method number followed by the name of
the class (e.g. `_1_Foo'). For methods in categories, the name of
the category is also included in the assembler name (e.g.
`_1_Foo_Bar').
These names are safe on most systems, but make debugging difficult
since the method's selector is not present in the name.
Therefore, particular systems define other ways of computing names.
BUF is an expression of type `char *' which gives you a buffer in
which to store the name; its length is as long as CLASS_NAME,
CAT_NAME and SEL_NAME put together, plus 50 characters extra.
The argument IS_INST specifies whether the method is an instance
method or a class method; CLASS_NAME is the name of the class;
CAT_NAME is the name of the category (or `NULL' if the method is
not in a category); and SEL_NAME is the name of the selector.
On systems where the assembler can handle quoted names, you can
use this macro to provide more human-readable names.
-- Macro: ASM_DECLARE_CLASS_REFERENCE (STREAM, NAME)
A C statement (sans semicolon) to output to the stdio stream
STREAM commands to declare that the label NAME is an Objective-C
class reference. This is only needed for targets whose linkers
have special support for NeXT-style runtimes.
-- Macro: ASM_DECLARE_UNRESOLVED_REFERENCE (STREAM, NAME)
A C statement (sans semicolon) to output to the stdio stream
STREAM commands to declare that the label NAME is an unresolved
Objective-C class reference. This is only needed for targets
whose linkers have special support for NeXT-style runtimes.
File: gccint.info, Node: Initialization, Next: Macros for Initialization, Prev: Label Output, Up: Assembler Format
17.21.5 How Initialization Functions Are Handled
------------------------------------------------
The compiled code for certain languages includes "constructors" (also
called "initialization routines")--functions to initialize data in the
program when the program is started. These functions need to be called
before the program is "started"--that is to say, before `main' is
called.
Compiling some languages generates "destructors" (also called
"termination routines") that should be called when the program
terminates.
To make the initialization and termination functions work, the compiler
must output something in the assembler code to cause those functions to
be called at the appropriate time. When you port the compiler to a new
system, you need to specify how to do this.
There are two major ways that GCC currently supports the execution of
initialization and termination functions. Each way has two variants.
Much of the structure is common to all four variations.
The linker must build two lists of these functions--a list of
initialization functions, called `__CTOR_LIST__', and a list of
termination functions, called `__DTOR_LIST__'.
Each list always begins with an ignored function pointer (which may
hold 0, -1, or a count of the function pointers after it, depending on
the environment). This is followed by a series of zero or more function
pointers to constructors (or destructors), followed by a function
pointer containing zero.
Depending on the operating system and its executable file format,
either `crtstuff.c' or `libgcc2.c' traverses these lists at startup
time and exit time. Constructors are called in reverse order of the
list; destructors in forward order.
The best way to handle static constructors works only for object file
formats which provide arbitrarily-named sections. A section is set
aside for a list of constructors, and another for a list of destructors.
Traditionally these are called `.ctors' and `.dtors'. Each object file
that defines an initialization function also puts a word in the
constructor section to point to that function. The linker accumulates
all these words into one contiguous `.ctors' section. Termination
functions are handled similarly.
This method will be chosen as the default by `target-def.h' if
`TARGET_ASM_NAMED_SECTION' is defined. A target that does not support
arbitrary sections, but does support special designated constructor and
destructor sections may define `CTORS_SECTION_ASM_OP' and
`DTORS_SECTION_ASM_OP' to achieve the same effect.
When arbitrary sections are available, there are two variants,
depending upon how the code in `crtstuff.c' is called. On systems that
support a ".init" section which is executed at program startup, parts
of `crtstuff.c' are compiled into that section. The program is linked
by the `gcc' driver like this:
ld -o OUTPUT_FILE crti.o crtbegin.o ... -lgcc crtend.o crtn.o
The prologue of a function (`__init') appears in the `.init' section
of `crti.o'; the epilogue appears in `crtn.o'. Likewise for the
function `__fini' in the ".fini" section. Normally these files are
provided by the operating system or by the GNU C library, but are
provided by GCC for a few targets.
The objects `crtbegin.o' and `crtend.o' are (for most targets)
compiled from `crtstuff.c'. They contain, among other things, code
fragments within the `.init' and `.fini' sections that branch to
routines in the `.text' section. The linker will pull all parts of a
section together, which results in a complete `__init' function that
invokes the routines we need at startup.
To use this variant, you must define the `INIT_SECTION_ASM_OP' macro
properly.
If no init section is available, when GCC compiles any function called
`main' (or more accurately, any function designated as a program entry
point by the language front end calling `expand_main_function'), it
inserts a procedure call to `__main' as the first executable code after
the function prologue. The `__main' function is defined in `libgcc2.c'
and runs the global constructors.
In file formats that don't support arbitrary sections, there are again
two variants. In the simplest variant, the GNU linker (GNU `ld') and
an `a.out' format must be used. In this case, `TARGET_ASM_CONSTRUCTOR'
is defined to produce a `.stabs' entry of type `N_SETT', referencing
the name `__CTOR_LIST__', and with the address of the void function
containing the initialization code as its value. The GNU linker
recognizes this as a request to add the value to a "set"; the values
are accumulated, and are eventually placed in the executable as a
vector in the format described above, with a leading (ignored) count
and a trailing zero element. `TARGET_ASM_DESTRUCTOR' is handled
similarly. Since no init section is available, the absence of
`INIT_SECTION_ASM_OP' causes the compilation of `main' to call `__main'
as above, starting the initialization process.
The last variant uses neither arbitrary sections nor the GNU linker.
This is preferable when you want to do dynamic linking and when using
file formats which the GNU linker does not support, such as `ECOFF'. In
this case, `TARGET_HAVE_CTORS_DTORS' is false, initialization and
termination functions are recognized simply by their names. This
requires an extra program in the linkage step, called `collect2'. This
program pretends to be the linker, for use with GCC; it does its job by
running the ordinary linker, but also arranges to include the vectors of
initialization and termination functions. These functions are called
via `__main' as described above. In order to use this method,
`use_collect2' must be defined in the target in `config.gcc'.
The following section describes the specific macros that control and
customize the handling of initialization and termination functions.
File: gccint.info, Node: Macros for Initialization, Next: Instruction Output, Prev: Initialization, Up: Assembler Format
17.21.6 Macros Controlling Initialization Routines
--------------------------------------------------
Here are the macros that control how the compiler handles initialization
and termination functions:
-- Macro: INIT_SECTION_ASM_OP
If defined, a C string constant, including spacing, for the
assembler operation to identify the following data as
initialization code. If not defined, GCC will assume such a
section does not exist. When you are using special sections for
initialization and termination functions, this macro also controls
how `crtstuff.c' and `libgcc2.c' arrange to run the initialization
functions.
-- Macro: HAS_INIT_SECTION
If defined, `main' will not call `__main' as described above.
This macro should be defined for systems that control start-up code
on a symbol-by-symbol basis, such as OSF/1, and should not be
defined explicitly for systems that support `INIT_SECTION_ASM_OP'.
-- Macro: LD_INIT_SWITCH
If defined, a C string constant for a switch that tells the linker
that the following symbol is an initialization routine.
-- Macro: LD_FINI_SWITCH
If defined, a C string constant for a switch that tells the linker
that the following symbol is a finalization routine.
-- Macro: COLLECT_SHARED_INIT_FUNC (STREAM, FUNC)
If defined, a C statement that will write a function that can be
automatically called when a shared library is loaded. The function
should call FUNC, which takes no arguments. If not defined, and
the object format requires an explicit initialization function,
then a function called `_GLOBAL__DI' will be generated.
This function and the following one are used by collect2 when
linking a shared library that needs constructors or destructors,
or has DWARF2 exception tables embedded in the code.
-- Macro: COLLECT_SHARED_FINI_FUNC (STREAM, FUNC)
If defined, a C statement that will write a function that can be
automatically called when a shared library is unloaded. The
function should call FUNC, which takes no arguments. If not
defined, and the object format requires an explicit finalization
function, then a function called `_GLOBAL__DD' will be generated.
-- Macro: INVOKE__main
If defined, `main' will call `__main' despite the presence of
`INIT_SECTION_ASM_OP'. This macro should be defined for systems
where the init section is not actually run automatically, but is
still useful for collecting the lists of constructors and
destructors.
-- Macro: SUPPORTS_INIT_PRIORITY
If nonzero, the C++ `init_priority' attribute is supported and the
compiler should emit instructions to control the order of
initialization of objects. If zero, the compiler will issue an
error message upon encountering an `init_priority' attribute.
-- Target Hook: bool TARGET_HAVE_CTORS_DTORS
This value is true if the target supports some "native" method of
collecting constructors and destructors to be run at startup and
exit. It is false if we must use `collect2'.
-- Target Hook: void TARGET_ASM_CONSTRUCTOR (rtx SYMBOL, int PRIORITY)
If defined, a function that outputs assembler code to arrange to
call the function referenced by SYMBOL at initialization time.
Assume that SYMBOL is a `SYMBOL_REF' for a function taking no
arguments and with no return value. If the target supports
initialization priorities, PRIORITY is a value between 0 and
`MAX_INIT_PRIORITY'; otherwise it must be `DEFAULT_INIT_PRIORITY'.
If this macro is not defined by the target, a suitable default will
be chosen if (1) the target supports arbitrary section names, (2)
the target defines `CTORS_SECTION_ASM_OP', or (3) `USE_COLLECT2'
is not defined.
-- Target Hook: void TARGET_ASM_DESTRUCTOR (rtx SYMBOL, int PRIORITY)
This is like `TARGET_ASM_CONSTRUCTOR' but used for termination
functions rather than initialization functions.
If `TARGET_HAVE_CTORS_DTORS' is true, the initialization routine
generated for the generated object file will have static linkage.
If your system uses `collect2' as the means of processing
constructors, then that program normally uses `nm' to scan an object
file for constructor functions to be called.
On certain kinds of systems, you can define this macro to make
`collect2' work faster (and, in some cases, make it work at all):
-- Macro: OBJECT_FORMAT_COFF
Define this macro if the system uses COFF (Common Object File
Format) object files, so that `collect2' can assume this format
and scan object files directly for dynamic constructor/destructor
functions.
This macro is effective only in a native compiler; `collect2' as
part of a cross compiler always uses `nm' for the target machine.
-- Macro: REAL_NM_FILE_NAME
Define this macro as a C string constant containing the file name
to use to execute `nm'. The default is to search the path
normally for `nm'.
-- Macro: NM_FLAGS
`collect2' calls `nm' to scan object files for static constructors
and destructors and LTO info. By default, `-n' is passed. Define
`NM_FLAGS' to a C string constant if other options are needed to
get the same output format as GNU `nm -n' produces.
If your system supports shared libraries and has a program to list the
dynamic dependencies of a given library or executable, you can define
these macros to enable support for running initialization and
termination functions in shared libraries:
-- Macro: LDD_SUFFIX
Define this macro to a C string constant containing the name of
the program which lists dynamic dependencies, like `ldd' under
SunOS 4.
-- Macro: PARSE_LDD_OUTPUT (PTR)
Define this macro to be C code that extracts filenames from the
output of the program denoted by `LDD_SUFFIX'. PTR is a variable
of type `char *' that points to the beginning of a line of output
from `LDD_SUFFIX'. If the line lists a dynamic dependency, the
code must advance PTR to the beginning of the filename on that
line. Otherwise, it must set PTR to `NULL'.
-- Macro: SHLIB_SUFFIX
Define this macro to a C string constant containing the default
shared library extension of the target (e.g., `".so"'). `collect2'
strips version information after this suffix when generating global
constructor and destructor names. This define is only needed on
targets that use `collect2' to process constructors and
destructors.
File: gccint.info, Node: Instruction Output, Next: Dispatch Tables, Prev: Macros for Initialization, Up: Assembler Format
17.21.7 Output of Assembler Instructions
----------------------------------------
This describes assembler instruction output.
-- Macro: 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.
-- Macro: ADDITIONAL_REGISTER_NAMES
If defined, a C initializer for an array of structures containing
a name and a register number. This macro defines additional names
for hard registers, thus allowing the `asm' option in declarations
to refer to registers using alternate names.
-- Macro: OVERLAPPING_REGISTER_NAMES
If defined, a C initializer for an array of structures containing a
name, a register number and a count of the number of consecutive
machine registers the name overlaps. This macro defines additional
names for hard registers, thus allowing the `asm' option in
declarations to refer to registers using alternate names. Unlike
`ADDITIONAL_REGISTER_NAMES', this macro should be used when the
register name implies multiple underlying registers.
This macro should be used when it is important that a clobber in an
`asm' statement clobbers all the underlying values implied by the
register name. For example, on ARM, clobbering the
double-precision VFP register "d0" implies clobbering both
single-precision registers "s0" and "s1".
-- Macro: 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_data.operand'.
If the macro definition does nothing, the instruction is output in
the usual way.
-- Macro: 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.
-- Target Hook: void TARGET_ASM_FINAL_POSTSCAN_INSN (FILE *FILE, rtx
INSN, rtx *OPVEC, int NOPERANDS)
If defined, this target hook is a function which is executed just
after the output of assembler code for INSN, to change the mode of
the assembler if necessary.
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 was used to convert the insn
template into assembler code, so you can change the assembler mode
by checking the contents of the vector.
-- Macro: 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.
-- Macro: 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.
-- Macro: 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.
On some machines, the syntax for a symbolic address depends on the
section that the address refers to. On these machines, define the
hook `TARGET_ENCODE_SECTION_INFO' to store the information into the
`symbol_ref', and then check for it here. *Note Assembler
Format::.
-- Macro: 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.
-- Macro: REGISTER_PREFIX
-- Macro: LOCAL_LABEL_PREFIX
-- Macro: USER_LABEL_PREFIX
-- Macro: IMMEDIATE_PREFIX
If defined, C string expressions to be used for the `%R', `%L',
`%U', and `%I' options of `asm_fprintf' (see `final.c'). These
are useful when a single `md' file must support multiple assembler
formats. In that case, the various `tm.h' files can define these
macros differently.
-- Macro: ASM_FPRINTF_EXTENSIONS (FILE, ARGPTR, FORMAT)
If defined this macro should expand to a series of `case'
statements which will be parsed inside the `switch' statement of
the `asm_fprintf' function. This allows targets to define extra
printf formats which may useful when generating their assembler
statements. Note that uppercase letters are reserved for future
generic extensions to asm_fprintf, and so are not available to
target specific code. The output file is given by the parameter
FILE. The varargs input pointer is ARGPTR and the rest of the
format string, starting the character after the one that is being
switched upon, is pointed to by FORMAT.
-- Macro: ASSEMBLER_DIALECT
If your target supports multiple dialects of assembler language
(such as different opcodes), define this macro as a C expression
that gives the numeric index of the assembler language dialect to
use, with zero as the first variant.
If this macro is defined, you may use constructs of the form
`{option0|option1|option2...}'
in the output templates of patterns (*note Output Template::) or
in the first argument of `asm_fprintf'. This construct outputs
`option0', `option1', `option2', etc., if the value of
`ASSEMBLER_DIALECT' is zero, one, two, etc. Any special characters
within these strings retain their usual meaning. If there are
fewer alternatives within the braces than the value of
`ASSEMBLER_DIALECT', the construct outputs nothing.
If you do not define this macro, the characters `{', `|' and `}'
do not have any special meaning when used in templates or operands
to `asm_fprintf'.
Define the macros `REGISTER_PREFIX', `LOCAL_LABEL_PREFIX',
`USER_LABEL_PREFIX' and `IMMEDIATE_PREFIX' if you can express the
variations in assembler language syntax with that mechanism.
Define `ASSEMBLER_DIALECT' and use the `{option0|option1}' syntax
if the syntax variant are larger and involve such things as
different opcodes or operand order.
-- Macro: 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.
-- Macro: 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.
File: gccint.info, Node: Dispatch Tables, Next: Exception Region Output, Prev: Instruction Output, Up: Assembler Format
17.21.8 Output of Dispatch Tables
---------------------------------
This concerns dispatch tables.
-- Macro: ASM_OUTPUT_ADDR_DIFF_ELT (STREAM, BODY, VALUE, REL)
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
`(*targetm.asm_out.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)
You must provide this macro on machines where the addresses in a
dispatch table are relative to the table's own address. If
defined, GCC will also use this macro on all machines when
producing PIC. BODY is the body of the `ADDR_DIFF_VEC'; it is
provided so that the mode and flags can be read.
-- Macro: 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
`(*targetm.asm_out.internal_label)'. For example,
fprintf (STREAM, "\t.word L%d\n", VALUE)
-- Macro: 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
`(*targetm.asm_out.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
`(*targetm.asm_out.internal_label)'.
-- Macro: 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.
-- Target Hook: void TARGET_ASM_EMIT_UNWIND_LABEL (FILE *STREAM, tree
DECL, int FOR_EH, int EMPTY)
This target hook emits a label at the beginning of each FDE. It
should be defined on targets where FDEs need special labels, and it
should write the appropriate label, for the FDE associated with the
function declaration DECL, to the stdio stream STREAM. The third
argument, FOR_EH, is a boolean: true if this is for an exception
table. The fourth argument, EMPTY, is a boolean: true if this is
a placeholder label for an omitted FDE.
The default is that FDEs are not given nonlocal labels.
-- Target Hook: void TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL (FILE *STREAM)
This target hook emits a label at the beginning of the exception
table. It should be defined on targets where it is desirable for
the table to be broken up according to function.
The default is that no label is emitted.
-- Target Hook: void TARGET_ASM_EMIT_EXCEPT_PERSONALITY (rtx
PERSONALITY)
If the target implements `TARGET_ASM_UNWIND_EMIT', this hook may
be used to emit a directive to install a personality hook into the
unwind info. This hook should not be used if dwarf2 unwind info
is used.
-- Target Hook: void TARGET_ASM_UNWIND_EMIT (FILE *STREAM, rtx INSN)
This target hook emits assembly directives required to unwind the
given instruction. This is only used when
`TARGET_EXCEPT_UNWIND_INFO' returns `UI_TARGET'.
-- Target Hook: bool TARGET_ASM_UNWIND_EMIT_BEFORE_INSN
True if the `TARGET_ASM_UNWIND_EMIT' hook should be called before
the assembly for INSN has been emitted, false if the hook should
be called afterward.
File: gccint.info, Node: Exception Region Output, Next: Alignment Output, Prev: Dispatch Tables, Up: Assembler Format
17.21.9 Assembler Commands for Exception Regions
------------------------------------------------
This describes commands marking the start and the end of an exception
region.
-- Macro: EH_FRAME_SECTION_NAME
If defined, a C string constant for the name of the section
containing exception handling frame unwind information. If not
defined, GCC will provide a default definition if the target
supports named sections. `crtstuff.c' uses this macro to switch
to the appropriate section.
You should define this symbol if your target supports DWARF 2 frame
unwind information and the default definition does not work.
-- Macro: EH_FRAME_IN_DATA_SECTION
If defined, DWARF 2 frame unwind information will be placed in the
data section even though the target supports named sections. This
might be necessary, for instance, if the system linker does garbage
collection and sections cannot be marked as not to be collected.
Do not define this macro unless `TARGET_ASM_NAMED_SECTION' is also
defined.
-- Macro: EH_TABLES_CAN_BE_READ_ONLY
Define this macro to 1 if your target is such that no frame unwind
information encoding used with non-PIC code will ever require a
runtime relocation, but the linker may not support merging
read-only and read-write sections into a single read-write section.
-- Macro: MASK_RETURN_ADDR
An rtx used to mask the return address found via
`RETURN_ADDR_RTX', so that it does not contain any extraneous set
bits in it.
-- Macro: DWARF2_UNWIND_INFO
Define this macro to 0 if your target supports DWARF 2 frame unwind
information, but it does not yet work with exception handling.
Otherwise, if your target supports this information (if it defines
`INCOMING_RETURN_ADDR_RTX' and either `UNALIGNED_INT_ASM_OP' or
`OBJECT_FORMAT_ELF'), GCC will provide a default definition of 1.
-- Target Hook: enum unwind_info_type TARGET_EXCEPT_UNWIND_INFO
(struct gcc_options *OPTS)
This hook defines the mechanism that will be used for exception
handling by the target. If the target has ABI specified unwind
tables, the hook should return `UI_TARGET'. If the target is to
use the `setjmp'/`longjmp'-based exception handling scheme, the
hook should return `UI_SJLJ'. If the target supports DWARF 2
frame unwind information, the hook should return `UI_DWARF2'.
A target may, if exceptions are disabled, choose to return
`UI_NONE'. This may end up simplifying other parts of
target-specific code. The default implementation of this hook
never returns `UI_NONE'.
Note that the value returned by this hook should be constant. It
should not depend on anything except the command-line switches
described by OPTS. In particular, the setting `UI_SJLJ' must be
fixed at compiler start-up as C pre-processor macros and builtin
functions related to exception handling are set up depending on
this setting.
The default implementation of the hook first honors the
`--enable-sjlj-exceptions' configure option, then
`DWARF2_UNWIND_INFO', and finally defaults to `UI_SJLJ'. If
`DWARF2_UNWIND_INFO' depends on command-line options, the target
must define this hook so that OPTS is used correctly.
-- Target Hook: bool TARGET_UNWIND_TABLES_DEFAULT
This variable should be set to `true' if the target ABI requires
unwinding tables even when exceptions are not used. It must not
be modified by command-line option processing.
-- Macro: DONT_USE_BUILTIN_SETJMP
Define this macro to 1 if the `setjmp'/`longjmp'-based scheme
should use the `setjmp'/`longjmp' functions from the C library
instead of the `__builtin_setjmp'/`__builtin_longjmp' machinery.
-- Macro: DWARF_CIE_DATA_ALIGNMENT
This macro need only be defined if the target might save registers
in the function prologue at an offset to the stack pointer that is
not aligned to `UNITS_PER_WORD'. The definition should be the
negative minimum alignment if `STACK_GROWS_DOWNWARD' is defined,
and the positive minimum alignment otherwise. *Note SDB and
DWARF::. Only applicable if the target supports DWARF 2 frame
unwind information.
-- Target Hook: bool TARGET_TERMINATE_DW2_EH_FRAME_INFO
Contains the value true if the target should add a zero word onto
the end of a Dwarf-2 frame info section when used for exception
handling. Default value is false if `EH_FRAME_SECTION_NAME' is
defined, and true otherwise.
-- Target Hook: rtx TARGET_DWARF_REGISTER_SPAN (rtx REG)
Given a register, this hook should return a parallel of registers
to represent where to find the register pieces. Define this hook
if the register and its mode are represented in Dwarf in
non-contiguous locations, or if the register should be represented
in more than one register in Dwarf. Otherwise, this hook should
return `NULL_RTX'. If not defined, the default is to return
`NULL_RTX'.
-- Target Hook: void TARGET_INIT_DWARF_REG_SIZES_EXTRA (tree ADDRESS)
If some registers are represented in Dwarf-2 unwind information in
multiple pieces, define this hook to fill in information about the
sizes of those pieces in the table used by the unwinder at runtime.
It will be called by `expand_builtin_init_dwarf_reg_sizes' after
filling in a single size corresponding to each hard register;
ADDRESS is the address of the table.
-- Target Hook: bool TARGET_ASM_TTYPE (rtx SYM)
This hook is used to output a reference from a frame unwinding
table to the type_info object identified by SYM. It should return
`true' if the reference was output. Returning `false' will cause
the reference to be output using the normal Dwarf2 routines.
-- Target Hook: bool TARGET_ARM_EABI_UNWINDER
This flag should be set to `true' on targets that use an ARM EABI
based unwinding library, and `false' on other targets. This
effects the format of unwinding tables, and how the unwinder in
entered after running a cleanup. The default is `false'.
File: gccint.info, Node: Alignment Output, Prev: Exception Region Output, Up: Assembler Format
17.21.10 Assembler Commands for Alignment
-----------------------------------------
This describes commands for alignment.
-- Macro: JUMP_ALIGN (LABEL)
The alignment (log base 2) to put in front of LABEL, which is a
common destination of jumps and has no fallthru incoming edge.
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.
Unless it's necessary to inspect the LABEL parameter, it is better
to set the variable ALIGN_JUMPS in the target's
`TARGET_OPTION_OVERRIDE'. Otherwise, you should try to honor the
user's selection in ALIGN_JUMPS in a `JUMP_ALIGN' implementation.
-- Target Hook: int TARGET_ASM_JUMP_ALIGN_MAX_SKIP (rtx LABEL)
The maximum number of bytes to skip before LABEL when applying
`JUMP_ALIGN'. This works only if `ASM_OUTPUT_MAX_SKIP_ALIGN' is
defined.
-- Macro: LABEL_ALIGN_AFTER_BARRIER (LABEL)
The alignment (log base 2) to put in front of LABEL, which follows
a `BARRIER'.
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.
-- Target Hook: int TARGET_ASM_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP (rtx
LABEL)
The maximum number of bytes to skip before LABEL when applying
`LABEL_ALIGN_AFTER_BARRIER'. This works only if
`ASM_OUTPUT_MAX_SKIP_ALIGN' is defined.
-- Macro: LOOP_ALIGN (LABEL)
The alignment (log base 2) to put in front of LABEL, which follows
a `NOTE_INSN_LOOP_BEG' note.
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.
Unless it's necessary to inspect the LABEL parameter, it is better
to set the variable `align_loops' in the target's
`TARGET_OPTION_OVERRIDE'. Otherwise, you should try to honor the
user's selection in `align_loops' in a `LOOP_ALIGN' implementation.
-- Target Hook: int TARGET_ASM_LOOP_ALIGN_MAX_SKIP (rtx LABEL)
The maximum number of bytes to skip when applying `LOOP_ALIGN' to
LABEL. This works only if `ASM_OUTPUT_MAX_SKIP_ALIGN' is defined.
-- Macro: LABEL_ALIGN (LABEL)
The alignment (log base 2) to put in front of LABEL. If
`LABEL_ALIGN_AFTER_BARRIER' / `LOOP_ALIGN' specify a different
alignment, the maximum of the specified values is used.
Unless it's necessary to inspect the LABEL parameter, it is better
to set the variable `align_labels' in the target's
`TARGET_OPTION_OVERRIDE'. Otherwise, you should try to honor the
user's selection in `align_labels' in a `LABEL_ALIGN'
implementation.
-- Target Hook: int TARGET_ASM_LABEL_ALIGN_MAX_SKIP (rtx LABEL)
The maximum number of bytes to skip when applying `LABEL_ALIGN' to
LABEL. This works only if `ASM_OUTPUT_MAX_SKIP_ALIGN' is defined.
-- Macro: 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.
Those bytes should be zero when loaded. NBYTES will be a C
expression of type `unsigned HOST_WIDE_INT'.
-- Macro: ASM_NO_SKIP_IN_TEXT
Define this macro if `ASM_OUTPUT_SKIP' should not be used in the
text section because it fails to put zeros in the bytes that are
skipped. This is true on many Unix systems, where the pseudo-op
to skip bytes produces no-op instructions rather than zeros when
used in the text section.
-- Macro: ASM_OUTPUT_ALIGN (STREAM, POWER)
A C statement to output to the stdio stream STREAM an assembler
command to advance the location counter to a multiple of 2 to the
POWER bytes. POWER will be a C expression of type `int'.
-- Macro: ASM_OUTPUT_ALIGN_WITH_NOP (STREAM, POWER)
Like `ASM_OUTPUT_ALIGN', except that the "nop" instruction is used
for padding, if necessary.
-- Macro: ASM_OUTPUT_MAX_SKIP_ALIGN (STREAM, POWER, MAX_SKIP)
A C statement to output to the stdio stream STREAM an assembler
command to advance the location counter to a multiple of 2 to the
POWER bytes, but only if MAX_SKIP or fewer bytes are needed to
satisfy the alignment request. POWER and MAX_SKIP will be a C
expression of type `int'.
File: gccint.info, Node: Debugging Info, Next: Floating Point, Prev: Assembler Format, Up: Target Macros
17.22 Controlling Debugging Information Format
==============================================
This describes how to specify debugging information.
* Menu:
* All Debuggers:: Macros that affect all debugging formats uniformly.
* DBX Options:: Macros enabling specific options in DBX format.
* DBX Hooks:: Hook macros for varying DBX format.
* File Names and DBX:: Macros controlling output of file names in DBX format.
* SDB and DWARF:: Macros for SDB (COFF) and DWARF formats.
* VMS Debug:: Macros for VMS debug format.
File: gccint.info, Node: All Debuggers, Next: DBX Options, Up: Debugging Info
17.22.1 Macros Affecting All Debugging Formats
----------------------------------------------
These macros affect all debugging formats.
-- Macro: DBX_REGISTER_NUMBER (REGNO)
A C expression that returns the DBX register number for the
compiler register number REGNO. In the default macro provided,
the value of this expression will 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.
If two registers have consecutive numbers inside GCC, and they can
be used as a pair to hold a multiword value, then they _must_ have
consecutive numbers after renumbering with `DBX_REGISTER_NUMBER'.
Otherwise, debuggers will be unable to access such a pair, because
they expect register pairs to be consecutive in their own
numbering scheme.
If you find yourself defining `DBX_REGISTER_NUMBER' in way that
does not preserve register pairs, then what you must do instead is
redefine the actual register numbering scheme.
-- Macro: DEBUGGER_AUTO_OFFSET (X)
A C expression that returns the integer offset value for an
automatic variable having address X (an RTL expression). The
default computation assumes that X is based on the frame-pointer
and gives the offset from the frame-pointer. This is required for
targets that produce debugging output for DBX or COFF-style
debugging output for SDB and allow the frame-pointer to be
eliminated when the `-g' options is used.
-- Macro: DEBUGGER_ARG_OFFSET (OFFSET, X)
A C expression that returns the integer offset value for an
argument having address X (an RTL expression). The nominal offset
is OFFSET.
-- Macro: PREFERRED_DEBUGGING_TYPE
A C expression that returns the type of debugging output GCC should
produce when the user specifies just `-g'. Define this if you
have arranged for GCC to support more than one format of debugging
output. Currently, the allowable values are `DBX_DEBUG',
`SDB_DEBUG', `DWARF_DEBUG', `DWARF2_DEBUG', `XCOFF_DEBUG',
`VMS_DEBUG', and `VMS_AND_DWARF2_DEBUG'.
When the user specifies `-ggdb', GCC normally also uses the value
of this macro to select the debugging output format, but with two
exceptions. If `DWARF2_DEBUGGING_INFO' is defined, GCC uses the
value `DWARF2_DEBUG'. Otherwise, if `DBX_DEBUGGING_INFO' is
defined, GCC uses `DBX_DEBUG'.
The value of this macro only affects the default debugging output;
the user can always get a specific type of output by using
`-gstabs', `-gcoff', `-gdwarf-2', `-gxcoff', or `-gvms'.
File: gccint.info, Node: DBX Options, Next: DBX Hooks, Prev: All Debuggers, Up: Debugging Info
17.22.2 Specific Options for DBX Output
---------------------------------------
These are specific options for DBX output.
-- Macro: DBX_DEBUGGING_INFO
Define this macro if GCC should produce debugging output for DBX
in response to the `-g' option.
-- Macro: XCOFF_DEBUGGING_INFO
Define this macro if GCC should produce XCOFF format debugging
output in response to the `-g' option. This is a variant of DBX
format.
-- Macro: DEFAULT_GDB_EXTENSIONS
Define this macro to control whether GCC should by default generate
GDB's extended version of DBX debugging information (assuming
DBX-format debugging information is enabled at all). If you don't
define the macro, the default is 1: always generate the extended
information if there is any occasion to.
-- Macro: DEBUG_SYMS_TEXT
Define this macro if all `.stabs' commands should be output while
in the text section.
-- Macro: ASM_STABS_OP
A C string constant, including spacing, naming the assembler
pseudo op to use instead of `"\t.stabs\t"' to define an ordinary
debugging symbol. If you don't define this macro, `"\t.stabs\t"'
is used. This macro applies only to DBX debugging information
format.
-- Macro: ASM_STABD_OP
A C string constant, including spacing, naming the assembler
pseudo op to use instead of `"\t.stabd\t"' to define a debugging
symbol whose value is the current location. If you don't define
this macro, `"\t.stabd\t"' is used. This macro applies only to
DBX debugging information format.
-- Macro: ASM_STABN_OP
A C string constant, including spacing, naming the assembler
pseudo op to use instead of `"\t.stabn\t"' to define a debugging
symbol with no name. If you don't define this macro,
`"\t.stabn\t"' is used. This macro applies only to DBX debugging
information format.
-- Macro: 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.
-- Macro: 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.
-- Macro: 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.
-- Macro: 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.
-- Macro: DBX_TYPE_DECL_STABS_CODE
The value to use in the "code" field of the `.stabs' directive for
a typedef. The default is `N_LSYM'.
-- Macro: DBX_STATIC_CONST_VAR_CODE
The value to use in the "code" field of the `.stabs' directive for
a static variable located in the text section. DBX format does not
provide any "right" way to do this. The default is `N_FUN'.
-- Macro: DBX_REGPARM_STABS_CODE
The value to use in the "code" field of the `.stabs' directive for
a parameter passed in registers. DBX format does not provide any
"right" way to do this. The default is `N_RSYM'.
-- Macro: DBX_REGPARM_STABS_LETTER
The letter to use in DBX symbol data to identify a symbol as a
parameter passed in registers. DBX format does not customarily
provide any way to do this. The default is `'P''.
-- Macro: DBX_FUNCTION_FIRST
Define this macro if the DBX information for a function and its
arguments should precede the assembler code for the function.
Normally, in DBX format, the debugging information entirely
follows the assembler code.
-- Macro: DBX_BLOCKS_FUNCTION_RELATIVE
Define this macro, with value 1, if the value of a symbol
describing the scope of a block (`N_LBRAC' or `N_RBRAC') should be
relative to the start of the enclosing function. Normally, GCC
uses an absolute address.
-- Macro: DBX_LINES_FUNCTION_RELATIVE
Define this macro, with value 1, if the value of a symbol
indicating the current line number (`N_SLINE') should be relative
to the start of the enclosing function. Normally, GCC uses an
absolute address.
-- Macro: DBX_USE_BINCL
Define this macro if GCC should generate `N_BINCL' and `N_EINCL'
stabs for included header files, as on Sun systems. This macro
also directs GCC to output a type number as a pair of a file
number and a type number within the file. Normally, GCC does not
generate `N_BINCL' or `N_EINCL' stabs, and it outputs a single
number for a type number.
File: gccint.info, Node: DBX Hooks, Next: File Names and DBX, Prev: DBX Options, Up: Debugging Info
17.22.3 Open-Ended Hooks for DBX Format
---------------------------------------
These are hooks for DBX format.
-- Macro: DBX_OUTPUT_LBRAC (STREAM, NAME)
Define this macro to say how to output to STREAM the debugging
information for the start of a scope level for variable names. The
argument NAME is the name of an assembler symbol (for use with
`assemble_name') whose value is the address where the scope begins.
-- Macro: DBX_OUTPUT_RBRAC (STREAM, NAME)
Like `DBX_OUTPUT_LBRAC', but for the end of a scope level.
-- Macro: DBX_OUTPUT_NFUN (STREAM, LSCOPE_LABEL, DECL)
Define this macro if the target machine requires special handling
to output an `N_FUN' entry for the function DECL.
-- Macro: DBX_OUTPUT_SOURCE_LINE (STREAM, LINE, COUNTER)
A C statement to output DBX debugging information before code for
line number LINE of the current source file to the stdio stream
STREAM. COUNTER is the number of time the macro was invoked,
including the current invocation; it is intended to generate
unique labels in the assembly output.
This macro should not be defined if the default output is correct,
or if it can be made correct by defining
`DBX_LINES_FUNCTION_RELATIVE'.
-- Macro: NO_DBX_FUNCTION_END
Some stabs encapsulation formats (in particular ECOFF), cannot
handle the `.stabs "",N_FUN,,0,0,Lscope-function-1' gdb dbx
extension construct. On those machines, define this macro to turn
this feature off without disturbing the rest of the gdb extensions.
-- Macro: NO_DBX_BNSYM_ENSYM
Some assemblers cannot handle the `.stabd BNSYM/ENSYM,0,0' gdb dbx
extension construct. On those machines, define this macro to turn
this feature off without disturbing the rest of the gdb extensions.
File: gccint.info, Node: File Names and DBX, Next: SDB and DWARF, Prev: DBX Hooks, Up: Debugging Info
17.22.4 File Names in DBX Format
--------------------------------
This describes file names in DBX format.
-- Macro: DBX_OUTPUT_MAIN_SOURCE_FILENAME (STREAM, NAME)
A C statement to output DBX debugging information to the stdio
stream STREAM, which indicates that file NAME is the main source
file--the file specified as the input file for compilation. This
macro is called only once, at the beginning of compilation.
This macro need not be defined if the standard form of output for
DBX debugging information is appropriate.
It may be necessary to refer to a label equal to the beginning of
the text section. You can use `assemble_name (stream,
ltext_label_name)' to do so. If you do this, you must also set
the variable USED_LTEXT_LABEL_NAME to `true'.
-- Macro: NO_DBX_MAIN_SOURCE_DIRECTORY
Define this macro, with value 1, if GCC should not emit an
indication of the current directory for compilation and current
source language at the beginning of the file.
-- Macro: NO_DBX_GCC_MARKER
Define this macro, with value 1, if GCC should not emit an
indication that this object file was compiled by GCC. The default
is to emit an `N_OPT' stab at the beginning of every source file,
with `gcc2_compiled.' for the string and value 0.
-- Macro: DBX_OUTPUT_MAIN_SOURCE_FILE_END (STREAM, NAME)
A C statement to output DBX debugging information at the end of
compilation of the main source file NAME. Output should be
written to the stdio stream STREAM.
If you don't define this macro, nothing special is output at the
end of compilation, which is correct for most machines.
-- Macro: DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END
Define this macro _instead of_ defining
`DBX_OUTPUT_MAIN_SOURCE_FILE_END', if what needs to be output at
the end of compilation is an `N_SO' stab with an empty string,
whose value is the highest absolute text address in the file.
File: gccint.info, Node: SDB and DWARF, Next: VMS Debug, Prev: File Names and DBX, Up: Debugging Info
17.22.5 Macros for SDB and DWARF Output
---------------------------------------
Here are macros for SDB and DWARF output.
-- Macro: SDB_DEBUGGING_INFO
Define this macro if GCC should produce COFF-style debugging output
for SDB in response to the `-g' option.
-- Macro: DWARF2_DEBUGGING_INFO
Define this macro if GCC should produce dwarf version 2 format
debugging output in response to the `-g' option.
-- Target Hook: int TARGET_DWARF_CALLING_CONVENTION (const_tree
FUNCTION)
Define this to enable the dwarf attribute
`DW_AT_calling_convention' to be emitted for each function.
Instead of an integer return the enum value for the `DW_CC_'
tag.
To support optional call frame debugging information, you must also
define `INCOMING_RETURN_ADDR_RTX' and either set
`RTX_FRAME_RELATED_P' on the prologue insns if you use RTL for the
prologue, or call `dwarf2out_def_cfa' and `dwarf2out_reg_save' as
appropriate from `TARGET_ASM_FUNCTION_PROLOGUE' if you don't.
-- Macro: DWARF2_FRAME_INFO
Define this macro to a nonzero value if GCC should always output
Dwarf 2 frame information. If `TARGET_EXCEPT_UNWIND_INFO' (*note
Exception Region Output::) returns `UI_DWARF2', and exceptions are
enabled, GCC will output this information not matter how you
define `DWARF2_FRAME_INFO'.
-- Target Hook: enum unwind_info_type TARGET_DEBUG_UNWIND_INFO (void)
This hook defines the mechanism that will be used for describing
frame unwind information to the debugger. Normally the hook will
return `UI_DWARF2' if DWARF 2 debug information is enabled, and
return `UI_NONE' otherwise.
A target may return `UI_DWARF2' even when DWARF 2 debug information
is disabled in order to always output DWARF 2 frame information.
A target may return `UI_TARGET' if it has ABI specified unwind
tables. This will suppress generation of the normal debug frame
unwind information.
-- Macro: DWARF2_ASM_LINE_DEBUG_INFO
Define this macro to be a nonzero value if the assembler can
generate Dwarf 2 line debug info sections. This will result in
much more compact line number tables, and hence is desirable if it
works.
-- Target Hook: bool TARGET_WANT_DEBUG_PUB_SECTIONS
True if the `.debug_pubtypes' and `.debug_pubnames' sections
should be emitted. These sections are not used on most platforms,
and in particular GDB does not use them.
-- Target Hook: bool TARGET_DELAY_SCHED2
True if sched2 is not to be run at its normal place. This usually
means it will be run as part of machine-specific reorg.
-- Target Hook: bool TARGET_DELAY_VARTRACK
True if vartrack is not to be run at its normal place. This
usually means it will be run as part of machine-specific reorg.
-- Macro: ASM_OUTPUT_DWARF_DELTA (STREAM, SIZE, LABEL1, LABEL2)
A C statement to issue assembly directives that create a difference
LAB1 minus LAB2, using an integer of the given SIZE.
-- Macro: ASM_OUTPUT_DWARF_VMS_DELTA (STREAM, SIZE, LABEL1, LABEL2)
A C statement to issue assembly directives that create a difference
between the two given labels in system defined units, e.g.
instruction slots on IA64 VMS, using an integer of the given size.
-- Macro: ASM_OUTPUT_DWARF_OFFSET (STREAM, SIZE, LABEL, SECTION)
A C statement to issue assembly directives that create a
section-relative reference to the given LABEL, using an integer of
the given SIZE. The label is known to be defined in the given
SECTION.
-- Macro: ASM_OUTPUT_DWARF_PCREL (STREAM, SIZE, LABEL)
A C statement to issue assembly directives that create a
self-relative reference to the given LABEL, using an integer of
the given SIZE.
-- Macro: ASM_OUTPUT_DWARF_TABLE_REF (LABEL)
A C statement to issue assembly directives that create a reference
to the DWARF table identifier LABEL from the current section. This
is used on some systems to avoid garbage collecting a DWARF table
which is referenced by a function.
-- Target Hook: void TARGET_ASM_OUTPUT_DWARF_DTPREL (FILE *FILE, int
SIZE, rtx X)
If defined, this target hook is a function which outputs a
DTP-relative reference to the given TLS symbol of the specified
size.
-- Macro: PUT_SDB_...
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.
-- Macro: SDB_DELIM
Some assemblers do not support a semicolon as a delimiter, even
between SDB assembler directives. In that case, define this macro
to be the delimiter to use (usually `\n'). It is not necessary to
define a new set of `PUT_SDB_OP' macros if this is the only change
required.
-- Macro: SDB_ALLOW_UNKNOWN_REFERENCES
Define this macro to allow references to unknown structure, union,
or enumeration tags to be emitted. Standard COFF does not allow
handling of unknown references, MIPS ECOFF has support for it.
-- Macro: SDB_ALLOW_FORWARD_REFERENCES
Define this macro to allow references to structure, union, or
enumeration tags that have not yet been seen to be handled. Some
assemblers choke if forward tags are used, while some require it.
-- Macro: SDB_OUTPUT_SOURCE_LINE (STREAM, LINE)
A C statement to output SDB debugging information before code for
line number LINE of the current source file to the stdio stream
STREAM. The default is to emit an `.ln' directive.
File: gccint.info, Node: VMS Debug, Prev: SDB and DWARF, Up: Debugging Info
17.22.6 Macros for VMS Debug Format
-----------------------------------
Here are macros for VMS debug format.
-- Macro: VMS_DEBUGGING_INFO
Define this macro if GCC should produce debugging output for VMS
in response to the `-g' option. The default behavior for VMS is
to generate minimal debug info for a traceback in the absence of
`-g' unless explicitly overridden with `-g0'. This behavior is
controlled by `TARGET_OPTION_OPTIMIZATION' and
`TARGET_OPTION_OVERRIDE'.
File: gccint.info, Node: Floating Point, Next: Mode Switching, Prev: Debugging Info, Up: Target Macros
17.23 Cross Compilation and Floating Point
==========================================
While all modern machines use twos-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, all floating point constants must be represented in
the target machine's format. Therefore, the cross compiler cannot
safely use the host machine's floating point arithmetic; it must emulate
the target's arithmetic. To ensure consistency, GCC always uses
emulation to work with floating point values, even when the host and
target floating point formats are identical.
The following macros are provided by `real.h' for the compiler to use.
All parts of the compiler which generate or optimize floating-point
calculations must use these macros. They may evaluate their operands
more than once, so operands must not have side effects.
-- Macro: REAL_VALUE_TYPE
The C data type to be used to hold a floating point value in the
target machine's format. Typically this is a `struct' containing
an array of `HOST_WIDE_INT', but all code should treat it as an
opaque quantity.
-- Macro: int REAL_VALUES_EQUAL (REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y)
Compares for equality the two values, X and Y. If the target
floating point format supports negative zeroes and/or NaNs,
`REAL_VALUES_EQUAL (-0.0, 0.0)' is true, and `REAL_VALUES_EQUAL
(NaN, NaN)' is false.
-- Macro: int REAL_VALUES_LESS (REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y)
Tests whether X is less than Y.
-- Macro: HOST_WIDE_INT REAL_VALUE_FIX (REAL_VALUE_TYPE X)
Truncates X to a signed integer, rounding toward zero.
-- Macro: unsigned HOST_WIDE_INT REAL_VALUE_UNSIGNED_FIX
(REAL_VALUE_TYPE X)
Truncates X to an unsigned integer, rounding toward zero. If X is
negative, returns zero.
-- Macro: REAL_VALUE_TYPE REAL_VALUE_ATOF (const char *STRING, enum
machine_mode MODE)
Converts STRING into a floating point number in the target
machine's representation for mode MODE. This routine can handle
both decimal and hexadecimal floating point constants, using the
syntax defined by the C language for both.
-- Macro: int REAL_VALUE_NEGATIVE (REAL_VALUE_TYPE X)
Returns 1 if X is negative (including negative zero), 0 otherwise.
-- Macro: int REAL_VALUE_ISINF (REAL_VALUE_TYPE X)
Determines whether X represents infinity (positive or negative).
-- Macro: int REAL_VALUE_ISNAN (REAL_VALUE_TYPE X)
Determines whether X represents a "NaN" (not-a-number).
-- Macro: void REAL_ARITHMETIC (REAL_VALUE_TYPE OUTPUT, enum tree_code
CODE, REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y)
Calculates an arithmetic operation on the two floating point values
X and Y, storing the result in OUTPUT (which must be a variable).
The operation to be performed is specified by CODE. Only the
following codes are supported: `PLUS_EXPR', `MINUS_EXPR',
`MULT_EXPR', `RDIV_EXPR', `MAX_EXPR', `MIN_EXPR'.
If `REAL_ARITHMETIC' is asked to evaluate division by zero and the
target's floating point format cannot represent infinity, it will
call `abort'. Callers should check for this situation first, using
`MODE_HAS_INFINITIES'. *Note Storage Layout::.
-- Macro: REAL_VALUE_TYPE REAL_VALUE_NEGATE (REAL_VALUE_TYPE X)
Returns the negative of the floating point value X.
-- Macro: REAL_VALUE_TYPE REAL_VALUE_ABS (REAL_VALUE_TYPE X)
Returns the absolute value of X.
-- Macro: REAL_VALUE_TYPE REAL_VALUE_TRUNCATE (REAL_VALUE_TYPE MODE,
enum machine_mode X)
Truncates the floating point value X to fit in MODE. The return
value is still a full-size `REAL_VALUE_TYPE', but it has an
appropriate bit pattern to be output as a floating constant whose
precision accords with mode MODE.
-- Macro: void REAL_VALUE_TO_INT (HOST_WIDE_INT LOW, HOST_WIDE_INT
HIGH, REAL_VALUE_TYPE X)
Converts a floating point value X into a double-precision integer
which is then stored into LOW and HIGH. If the value is not
integral, it is truncated.
-- Macro: void REAL_VALUE_FROM_INT (REAL_VALUE_TYPE X, HOST_WIDE_INT
LOW, HOST_WIDE_INT HIGH, enum machine_mode MODE)
Converts a double-precision integer found in LOW and HIGH, into a
floating point value which is then stored into X. The value is
truncated to fit in mode MODE.
File: gccint.info, Node: Mode Switching, Next: Target Attributes, Prev: Floating Point, Up: Target Macros
17.24 Mode Switching Instructions
=================================
The following macros control mode switching optimizations:
-- Macro: OPTIMIZE_MODE_SWITCHING (ENTITY)
Define this macro if the port needs extra instructions inserted
for mode switching in an optimizing compilation.
For an example, the SH4 can perform both single and double
precision floating point operations, but to perform a single
precision operation, the FPSCR PR bit has to be cleared, while for
a double precision operation, this bit has to be set. Changing
the PR bit requires a general purpose register as a scratch
register, hence these FPSCR sets have to be inserted before
reload, i.e. you can't put this into instruction emitting or
`TARGET_MACHINE_DEPENDENT_REORG'.
You can have multiple entities that are mode-switched, and select
at run time which entities actually need it.
`OPTIMIZE_MODE_SWITCHING' should return nonzero for any ENTITY
that needs mode-switching. If you define this macro, you also
have to define `NUM_MODES_FOR_MODE_SWITCHING', `MODE_NEEDED',
`MODE_PRIORITY_TO_MODE' and `EMIT_MODE_SET'. `MODE_AFTER',
`MODE_ENTRY', and `MODE_EXIT' are optional.
-- Macro: NUM_MODES_FOR_MODE_SWITCHING
If you define `OPTIMIZE_MODE_SWITCHING', you have to define this as
initializer for an array of integers. Each initializer element N
refers to an entity that needs mode switching, and specifies the
number of different modes that might need to be set for this
entity. The position of the initializer in the
initializer--starting counting at zero--determines the integer
that is used to refer to the mode-switched entity in question. In
macros that take mode arguments / yield a mode result, modes are
represented as numbers 0 ... N - 1. N is used to specify that no
mode switch is needed / supplied.
-- Macro: MODE_NEEDED (ENTITY, INSN)
ENTITY is an integer specifying a mode-switched entity. If
`OPTIMIZE_MODE_SWITCHING' is defined, you must define this macro to
return an integer value not larger than the corresponding element
in `NUM_MODES_FOR_MODE_SWITCHING', to denote the mode that ENTITY
must be switched into prior to the execution of INSN.
-- Macro: MODE_AFTER (MODE, INSN)
If this macro is defined, it is evaluated for every INSN during
mode switching. It determines the mode that an insn results in (if
different from the incoming mode).
-- Macro: MODE_ENTRY (ENTITY)
If this macro is defined, it is evaluated for every ENTITY that
needs mode switching. It should evaluate to an integer, which is
a mode that ENTITY is assumed to be switched to at function entry.
If `MODE_ENTRY' is defined then `MODE_EXIT' must be defined.
-- Macro: MODE_EXIT (ENTITY)
If this macro is defined, it is evaluated for every ENTITY that
needs mode switching. It should evaluate to an integer, which is
a mode that ENTITY is assumed to be switched to at function exit.
If `MODE_EXIT' is defined then `MODE_ENTRY' must be defined.
-- Macro: MODE_PRIORITY_TO_MODE (ENTITY, N)
This macro specifies the order in which modes for ENTITY are
processed. 0 is the highest priority,
`NUM_MODES_FOR_MODE_SWITCHING[ENTITY] - 1' the lowest. The value
of the macro should be an integer designating a mode for ENTITY.
For any fixed ENTITY, `mode_priority_to_mode' (ENTITY, N) shall be
a bijection in 0 ... `num_modes_for_mode_switching[ENTITY] - 1'.
-- Macro: EMIT_MODE_SET (ENTITY, MODE, HARD_REGS_LIVE)
Generate one or more insns to set ENTITY to MODE. HARD_REG_LIVE
is the set of hard registers live at the point where the insn(s)
are to be inserted.
File: gccint.info, Node: Target Attributes, Next: Emulated TLS, Prev: Mode Switching, Up: Target Macros
17.25 Defining target-specific uses of `__attribute__'
======================================================
Target-specific attributes may be defined for functions, data and types.
These are described using the following target hooks; they also need to
be documented in `extend.texi'.
-- Target Hook: const struct attribute_spec * TARGET_ATTRIBUTE_TABLE
If defined, this target hook points to an array of `struct
attribute_spec' (defined in `tree.h') specifying the machine
specific attributes for this target and some of the restrictions
on the entities to which these attributes are applied and the
arguments they take.
-- Target Hook: bool TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P (const_tree
NAME)
If defined, this target hook is a function which returns true if
the machine-specific attribute named NAME expects an identifier
given as its first argument to be passed on as a plain identifier,
not subjected to name lookup. If this is not defined, the default
is false for all machine-specific attributes.
-- Target Hook: int TARGET_COMP_TYPE_ATTRIBUTES (const_tree TYPE1,
const_tree TYPE2)
If defined, this target hook is a function which returns zero if
the attributes on TYPE1 and TYPE2 are incompatible, one if they
are compatible, and two if they are nearly compatible (which
causes a warning to be generated). If this is not defined,
machine-specific attributes are supposed always to be compatible.
-- Target Hook: void TARGET_SET_DEFAULT_TYPE_ATTRIBUTES (tree TYPE)
If defined, this target hook is a function which assigns default
attributes to the newly defined TYPE.
-- Target Hook: tree TARGET_MERGE_TYPE_ATTRIBUTES (tree TYPE1, tree
TYPE2)
Define this target hook if the merging of type attributes needs
special handling. If defined, the result is a list of the combined
`TYPE_ATTRIBUTES' of TYPE1 and TYPE2. It is assumed that
`comptypes' has already been called and returned 1. This function
may call `merge_attributes' to handle machine-independent merging.
-- Target Hook: tree TARGET_MERGE_DECL_ATTRIBUTES (tree OLDDECL, tree
NEWDECL)
Define this target hook if the merging of decl attributes needs
special handling. If defined, the result is a list of the combined
`DECL_ATTRIBUTES' of OLDDECL and NEWDECL. NEWDECL is a duplicate
declaration of OLDDECL. Examples of when this is needed are when
one attribute overrides another, or when an attribute is nullified
by a subsequent definition. This function may call
`merge_attributes' to handle machine-independent merging.
If the only target-specific handling you require is `dllimport'
for Microsoft Windows targets, you should define the macro
`TARGET_DLLIMPORT_DECL_ATTRIBUTES' to `1'. The compiler will then
define a function called `merge_dllimport_decl_attributes' which
can then be defined as the expansion of
`TARGET_MERGE_DECL_ATTRIBUTES'. You can also add
`handle_dll_attribute' in the attribute table for your port to
perform initial processing of the `dllimport' and `dllexport'
attributes. This is done in `i386/cygwin.h' and `i386/i386.c',
for example.
-- Target Hook: bool TARGET_VALID_DLLIMPORT_ATTRIBUTE_P (const_tree
DECL)
DECL is a variable or function with `__attribute__((dllimport))'
specified. Use this hook if the target needs to add extra
validation checks to `handle_dll_attribute'.
-- Macro: TARGET_DECLSPEC
Define this macro to a nonzero value if you want to treat
`__declspec(X)' as equivalent to `__attribute((X))'. By default,
this behavior is enabled only for targets that define
`TARGET_DLLIMPORT_DECL_ATTRIBUTES'. The current implementation of
`__declspec' is via a built-in macro, but you should not rely on
this implementation detail.
-- Target Hook: void TARGET_INSERT_ATTRIBUTES (tree NODE, tree
*ATTR_PTR)
Define this target hook if you want to be able to add attributes
to a decl when it is being created. This is normally useful for
back ends which wish to implement a pragma by using the attributes
which correspond to the pragma's effect. The NODE argument is the
decl which is being created. The ATTR_PTR argument is a pointer
to the attribute list for this decl. The list itself should not
be modified, since it may be shared with other decls, but
attributes may be chained on the head of the list and `*ATTR_PTR'
modified to point to the new attributes, or a copy of the list may
be made if further changes are needed.
-- Target Hook: bool TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P (const_tree
FNDECL)
This target hook returns `true' if it is ok to inline FNDECL into
the current function, despite its having target-specific
attributes, `false' otherwise. By default, if a function has a
target specific attribute attached to it, it will not be inlined.
-- Target Hook: bool TARGET_OPTION_VALID_ATTRIBUTE_P (tree FNDECL,
tree NAME, tree ARGS, int FLAGS)
This hook is called to parse the `attribute(option("..."))', and
it allows the function to set different target machine compile time
options for the current function that might be different than the
options specified on the command line. The hook should return
`true' if the options are valid.
The hook should set the DECL_FUNCTION_SPECIFIC_TARGET field in the
function declaration to hold a pointer to a target specific STRUCT
CL_TARGET_OPTION structure.
-- Target Hook: void TARGET_OPTION_SAVE (struct cl_target_option *PTR)
This hook is called to save any additional target specific
information in the STRUCT CL_TARGET_OPTION structure for function
specific options. *Note Option file format::.
-- Target Hook: void TARGET_OPTION_RESTORE (struct cl_target_option
*PTR)
This hook is called to restore any additional target specific
information in the STRUCT CL_TARGET_OPTION structure for function
specific options.
-- Target Hook: void TARGET_OPTION_PRINT (FILE *FILE, int INDENT,
struct cl_target_option *PTR)
This hook is called to print any additional target specific
information in the STRUCT CL_TARGET_OPTION structure for function
specific options.
-- Target Hook: bool TARGET_OPTION_PRAGMA_PARSE (tree ARGS, tree
POP_TARGET)
This target hook parses the options for `#pragma GCC option' to
set the machine specific options for functions that occur later in
the input stream. The options should be the same as handled by the
`TARGET_OPTION_VALID_ATTRIBUTE_P' hook.
-- Target Hook: void TARGET_OPTION_OVERRIDE (void)
Sometimes certain combinations of command options do not make
sense on a particular target machine. You can override the hook
`TARGET_OPTION_OVERRIDE' to take account of this. This hooks is
called once just after all the command options have been parsed.
Don't use this hook to turn on various extra optimizations for
`-O'. That is what `TARGET_OPTION_OPTIMIZATION' is for.
If you need to do something whenever the optimization level is
changed via the optimize attribute or pragma, see
`TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE'
-- Target Hook: bool TARGET_CAN_INLINE_P (tree CALLER, tree CALLEE)
This target hook returns `false' if the CALLER function cannot
inline CALLEE, based on target specific information. By default,
inlining is not allowed if the callee function has function
specific target options and the caller does not use the same
options.
File: gccint.info, Node: Emulated TLS, Next: MIPS Coprocessors, Prev: Target Attributes, Up: Target Macros
17.26 Emulating TLS
===================
For targets whose psABI does not provide Thread Local Storage via
specific relocations and instruction sequences, an emulation layer is
used. A set of target hooks allows this emulation layer to be
configured for the requirements of a particular target. For instance
the psABI may in fact specify TLS support in terms of an emulation
layer.
The emulation layer works by creating a control object for every TLS
object. To access the TLS object, a lookup function is provided which,
when given the address of the control object, will return the address
of the current thread's instance of the TLS object.
-- Target Hook: const char * TARGET_EMUTLS_GET_ADDRESS
Contains the name of the helper function that uses a TLS control
object to locate a TLS instance. The default causes libgcc's
emulated TLS helper function to be used.
-- Target Hook: const char * TARGET_EMUTLS_REGISTER_COMMON
Contains the name of the helper function that should be used at
program startup to register TLS objects that are implicitly
initialized to zero. If this is `NULL', all TLS objects will have
explicit initializers. The default causes libgcc's emulated TLS
registration function to be used.
-- Target Hook: const char * TARGET_EMUTLS_VAR_SECTION
Contains the name of the section in which TLS control variables
should be placed. The default of `NULL' allows these to be placed
in any section.
-- Target Hook: const char * TARGET_EMUTLS_TMPL_SECTION
Contains the name of the section in which TLS initializers should
be placed. The default of `NULL' allows these to be placed in any
section.
-- Target Hook: const char * TARGET_EMUTLS_VAR_PREFIX
Contains the prefix to be prepended to TLS control variable names.
The default of `NULL' uses a target-specific prefix.
-- Target Hook: const char * TARGET_EMUTLS_TMPL_PREFIX
Contains the prefix to be prepended to TLS initializer objects.
The default of `NULL' uses a target-specific prefix.
-- Target Hook: tree TARGET_EMUTLS_VAR_FIELDS (tree TYPE, tree *NAME)
Specifies a function that generates the FIELD_DECLs for a TLS
control object type. TYPE is the RECORD_TYPE the fields are for
and NAME should be filled with the structure tag, if the default of
`__emutls_object' is unsuitable. The default creates a type
suitable for libgcc's emulated TLS function.
-- Target Hook: tree TARGET_EMUTLS_VAR_INIT (tree VAR, tree DECL, tree
TMPL_ADDR)
Specifies a function that generates the CONSTRUCTOR to initialize a
TLS control object. VAR is the TLS control object, DECL is the
TLS object and TMPL_ADDR is the address of the initializer. The
default initializes libgcc's emulated TLS control object.
-- Target Hook: bool TARGET_EMUTLS_VAR_ALIGN_FIXED
Specifies whether the alignment of TLS control variable objects is
fixed and should not be increased as some backends may do to
optimize single objects. The default is false.
-- Target Hook: bool TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS
Specifies whether a DWARF `DW_OP_form_tls_address' location
descriptor may be used to describe emulated TLS control objects.
File: gccint.info, Node: MIPS Coprocessors, Next: PCH Target, Prev: Emulated TLS, Up: Target Macros
17.27 Defining coprocessor specifics for MIPS targets.
======================================================
The MIPS specification allows MIPS implementations to have as many as 4
coprocessors, each with as many as 32 private registers. GCC supports
accessing these registers and transferring values between the registers
and memory using asm-ized variables. For example:
register unsigned int cp0count asm ("c0r1");
unsigned int d;
d = cp0count + 3;
("c0r1" is the default name of register 1 in coprocessor 0; alternate
names may be added as described below, or the default names may be
overridden entirely in `SUBTARGET_CONDITIONAL_REGISTER_USAGE'.)
Coprocessor registers are assumed to be epilogue-used; sets to them
will be preserved even if it does not appear that the register is used
again later in the function.
Another note: according to the MIPS spec, coprocessor 1 (if present) is
the FPU. One accesses COP1 registers through standard mips
floating-point support; they are not included in this mechanism.
There is one macro used in defining the MIPS coprocessor interface
which you may want to override in subtargets; it is described below.
-- Macro: ALL_COP_ADDITIONAL_REGISTER_NAMES
A comma-separated list (with leading comma) of pairs describing the
alternate names of coprocessor registers. The format of each
entry should be
{ ALTERNATENAME, REGISTER_NUMBER}
Default: empty.
File: gccint.info, Node: PCH Target, Next: C++ ABI, Prev: MIPS Coprocessors, Up: Target Macros
17.28 Parameters for Precompiled Header Validity Checking
=========================================================
-- Target Hook: void * TARGET_GET_PCH_VALIDITY (size_t *SZ)
This hook returns a pointer to the data needed by
`TARGET_PCH_VALID_P' and sets `*SZ' to the size of the data in
bytes.
-- Target Hook: const char * TARGET_PCH_VALID_P (const void *DATA,
size_t SZ)
This hook checks whether the options used to create a PCH file are
compatible with the current settings. It returns `NULL' if so and
a suitable error message if not. Error messages will be presented
to the user and must be localized using `_(MSG)'.
DATA is the data that was returned by `TARGET_GET_PCH_VALIDITY'
when the PCH file was created and SZ is the size of that data in
bytes. It's safe to assume that the data was created by the same
version of the compiler, so no format checking is needed.
The default definition of `default_pch_valid_p' should be suitable
for most targets.
-- Target Hook: const char * TARGET_CHECK_PCH_TARGET_FLAGS (int
PCH_FLAGS)
If this hook is nonnull, the default implementation of
`TARGET_PCH_VALID_P' will use it to check for compatible values of
`target_flags'. PCH_FLAGS specifies the value that `target_flags'
had when the PCH file was created. The return value is the same
as for `TARGET_PCH_VALID_P'.
File: gccint.info, Node: C++ ABI, Next: Named Address Spaces, Prev: PCH Target, Up: Target Macros
17.29 C++ ABI parameters
========================
-- Target Hook: tree TARGET_CXX_GUARD_TYPE (void)
Define this hook to override the integer type used for guard
variables. These are used to implement one-time construction of
static objects. The default is long_long_integer_type_node.
-- Target Hook: bool TARGET_CXX_GUARD_MASK_BIT (void)
This hook determines how guard variables are used. It should
return `false' (the default) if the first byte should be used. A
return value of `true' indicates that only the least significant
bit should be used.
-- Target Hook: tree TARGET_CXX_GET_COOKIE_SIZE (tree TYPE)
This hook returns the size of the cookie to use when allocating an
array whose elements have the indicated TYPE. Assumes that it is
already known that a cookie is needed. The default is `max(sizeof
(size_t), alignof(type))', as defined in section 2.7 of the
IA64/Generic C++ ABI.
-- Target Hook: bool TARGET_CXX_COOKIE_HAS_SIZE (void)
This hook should return `true' if the element size should be
stored in array cookies. The default is to return `false'.
-- Target Hook: int TARGET_CXX_IMPORT_EXPORT_CLASS (tree TYPE, int
IMPORT_EXPORT)
If defined by a backend this hook allows the decision made to
export class TYPE to be overruled. Upon entry IMPORT_EXPORT will
contain 1 if the class is going to be exported, -1 if it is going
to be imported and 0 otherwise. This function should return the
modified value and perform any other actions necessary to support
the backend's targeted operating system.
-- Target Hook: bool TARGET_CXX_CDTOR_RETURNS_THIS (void)
This hook should return `true' if constructors and destructors
return the address of the object created/destroyed. The default
is to return `false'.
-- Target Hook: bool TARGET_CXX_KEY_METHOD_MAY_BE_INLINE (void)
This hook returns true if the key method for a class (i.e., the
method which, if defined in the current translation unit, causes
the virtual table to be emitted) may be an inline function. Under
the standard Itanium C++ ABI the key method may be an inline
function so long as the function is not declared inline in the
class definition. Under some variants of the ABI, an inline
function can never be the key method. The default is to return
`true'.
-- Target Hook: void TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY (tree
DECL)
DECL is a virtual table, virtual table table, typeinfo object, or
other similar implicit class data object that will be emitted with
external linkage in this translation unit. No ELF visibility has
been explicitly specified. If the target needs to specify a
visibility other than that of the containing class, use this hook
to set `DECL_VISIBILITY' and `DECL_VISIBILITY_SPECIFIED'.
-- Target Hook: bool TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT (void)
This hook returns true (the default) if virtual tables and other
similar implicit class data objects are always COMDAT if they have
external linkage. If this hook returns false, then class data for
classes whose virtual table will be emitted in only one translation
unit will not be COMDAT.
-- Target Hook: bool TARGET_CXX_LIBRARY_RTTI_COMDAT (void)
This hook returns true (the default) if the RTTI information for
the basic types which is defined in the C++ runtime should always
be COMDAT, false if it should not be COMDAT.
-- Target Hook: bool TARGET_CXX_USE_AEABI_ATEXIT (void)
This hook returns true if `__aeabi_atexit' (as defined by the ARM
EABI) should be used to register static destructors when
`-fuse-cxa-atexit' is in effect. The default is to return false
to use `__cxa_atexit'.
-- Target Hook: bool TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT (void)
This hook returns true if the target `atexit' function can be used
in the same manner as `__cxa_atexit' to register C++ static
destructors. This requires that `atexit'-registered functions in
shared libraries are run in the correct order when the libraries
are unloaded. The default is to return false.
-- Target Hook: void TARGET_CXX_ADJUST_CLASS_AT_DEFINITION (tree TYPE)
TYPE is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that has
just been defined. Use this hook to make adjustments to the class
(eg, tweak visibility or perform any other required target
modifications).
File: gccint.info, Node: Named Address Spaces, Next: Misc, Prev: C++ ABI, Up: Target Macros
17.30 Adding support for named address spaces
=============================================
The draft technical report of the ISO/IEC JTC1 S22 WG14 N1275 standards
committee, `Programming Languages - C - Extensions to support embedded
processors', specifies a syntax for embedded processors to specify
alternate address spaces. You can configure a GCC port to support
section 5.1 of the draft report to add support for address spaces other
than the default address space. These address spaces are new keywords
that are similar to the `volatile' and `const' type attributes.
Pointers to named address spaces can have a different size than
pointers to the generic address space.
For example, the SPU port uses the `__ea' address space to refer to
memory in the host processor, rather than memory local to the SPU
processor. Access to memory in the `__ea' address space involves
issuing DMA operations to move data between the host processor and the
local processor memory address space. Pointers in the `__ea' address
space are either 32 bits or 64 bits based on the `-mea32' or `-mea64'
switches (native SPU pointers are always 32 bits).
Internally, address spaces are represented as a small integer in the
range 0 to 15 with address space 0 being reserved for the generic
address space.
To register a named address space qualifier keyword with the C front
end, the target may call the `c_register_addr_space' routine. For
example, the SPU port uses the following to declare `__ea' as the
keyword for named address space #1:
#define ADDR_SPACE_EA 1
c_register_addr_space ("__ea", ADDR_SPACE_EA);
-- Target Hook: enum machine_mode TARGET_ADDR_SPACE_POINTER_MODE
(addr_space_t ADDRESS_SPACE)
Define this to return the machine mode to use for pointers to
ADDRESS_SPACE if the target supports named address spaces. The
default version of this hook returns `ptr_mode' for the generic
address space only.
-- Target Hook: enum machine_mode TARGET_ADDR_SPACE_ADDRESS_MODE
(addr_space_t ADDRESS_SPACE)
Define this to return the machine mode to use for addresses in
ADDRESS_SPACE if the target supports named address spaces. The
default version of this hook returns `Pmode' for the generic
address space only.
-- Target Hook: bool TARGET_ADDR_SPACE_VALID_POINTER_MODE (enum
machine_mode MODE, addr_space_t AS)
Define this to return nonzero if the port can handle pointers with
machine mode MODE to address space AS. This target hook is the
same as the `TARGET_VALID_POINTER_MODE' target hook, except that
it includes explicit named address space support. The default
version of this hook returns true for the modes returned by either
the `TARGET_ADDR_SPACE_POINTER_MODE' or
`TARGET_ADDR_SPACE_ADDRESS_MODE' target hooks for the given
address space.
-- Target Hook: bool TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P (enum
machine_mode MODE, rtx EXP, bool STRICT, addr_space_t AS)
Define this to return true if EXP is a valid address for mode MODE
in the named address space AS. The STRICT parameter says whether
strict addressing is in effect after reload has finished. This
target hook is the same as the `TARGET_LEGITIMATE_ADDRESS_P'
target hook, except that it includes explicit named address space
support.
-- Target Hook: rtx TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS (rtx X, rtx
OLDX, enum machine_mode MODE, addr_space_t AS)
Define this to modify an invalid address X to be a valid address
with mode MODE in the named address space AS. This target hook is
the same as the `TARGET_LEGITIMIZE_ADDRESS' target hook, except
that it includes explicit named address space support.
-- Target Hook: bool TARGET_ADDR_SPACE_SUBSET_P (addr_space_t
SUPERSET, addr_space_t SUBSET)
Define this to return whether the SUBSET named address space is
contained within the SUPERSET named address space. Pointers to a
named address space that is a subset of another named address space
will be converted automatically without a cast if used together in
arithmetic operations. Pointers to a superset address space can be
converted to pointers to a subset address space via explicit casts.
-- Target Hook: rtx TARGET_ADDR_SPACE_CONVERT (rtx OP, tree FROM_TYPE,
tree TO_TYPE)
Define this to convert the pointer expression represented by the
RTL OP with type FROM_TYPE that points to a named address space to
a new pointer expression with type TO_TYPE that points to a
different named address space. When this hook it called, it is
guaranteed that one of the two address spaces is a subset of the
other, as determined by the `TARGET_ADDR_SPACE_SUBSET_P' target
hook.
File: gccint.info, Node: Misc, Prev: Named Address Spaces, Up: Target Macros
17.31 Miscellaneous Parameters
==============================
Here are several miscellaneous parameters.
-- Macro: HAS_LONG_COND_BRANCH
Define this boolean macro to indicate whether or not your
architecture has conditional branches that can span all of memory.
It is used in conjunction with an optimization that partitions hot
and cold basic blocks into separate sections of the executable.
If this macro is set to false, gcc will convert any conditional
branches that attempt to cross between sections into unconditional
branches or indirect jumps.
-- Macro: HAS_LONG_UNCOND_BRANCH
Define this boolean macro to indicate whether or not your
architecture has unconditional branches that can span all of
memory. It is used in conjunction with an optimization that
partitions hot and cold basic blocks into separate sections of the
executable. If this macro is set to false, gcc will convert any
unconditional branches that attempt to cross between sections into
indirect jumps.
-- Macro: CASE_VECTOR_MODE
An alias for a machine mode name. This is the machine mode that
elements of a jump-table should have.
-- Macro: CASE_VECTOR_SHORTEN_MODE (MIN_OFFSET, MAX_OFFSET, BODY)
Optional: return the preferred mode for an `addr_diff_vec' when
the minimum and maximum offset are known. If you define this, it
enables extra code in branch shortening to deal with
`addr_diff_vec'. To make this work, you also have to define
`INSN_ALIGN' and make the alignment for `addr_diff_vec' explicit.
The BODY argument is provided so that the offset_unsigned and scale
flags can be updated.
-- Macro: CASE_VECTOR_PC_RELATIVE
Define this macro to be a C expression to indicate when jump-tables
should contain relative addresses. You need not define this macro
if jump-tables never contain relative addresses, or jump-tables
should contain relative addresses only when `-fPIC' or `-fPIC' is
in effect.
-- Target Hook: unsigned int TARGET_CASE_VALUES_THRESHOLD (void)
This function return the smallest number of different values for
which it is best to use a jump-table instead of a tree of
conditional branches. The default is four for machines with a
`casesi' instruction and five otherwise. This is best for most
machines.
-- Macro: CASE_USE_BIT_TESTS
Define this macro to be a C expression to indicate whether C switch
statements may be implemented by a sequence of bit tests. This is
advantageous on processors that can efficiently implement left
shift of 1 by the number of bits held in a register, but
inappropriate on targets that would require a loop. By default,
this macro returns `true' if the target defines an `ashlsi3'
pattern, and `false' otherwise.
-- Macro: WORD_REGISTER_OPERATIONS
Define this macro if operations between registers with integral
mode smaller than a word are always performed on the entire
register. Most RISC machines have this property and most CISC
machines do not.
-- Macro: LOAD_EXTEND_OP (MEM_MODE)
Define this macro to be a C expression indicating when insns that
read memory in MEM_MODE, an integral mode narrower than a word,
set the bits outside of MEM_MODE to be either the sign-extension
or the zero-extension of the data read. Return `SIGN_EXTEND' for
values of MEM_MODE for which the insn sign-extends, `ZERO_EXTEND'
for which it zero-extends, and `UNKNOWN' for other modes.
This macro is not called with MEM_MODE non-integral or with a width
greater than or equal to `BITS_PER_WORD', so you may return any
value in this case. Do not define this macro if it would always
return `UNKNOWN'. On machines where this macro is defined, you
will normally define it as the constant `SIGN_EXTEND' or
`ZERO_EXTEND'.
You may return a non-`UNKNOWN' value even if for some hard
registers the sign extension is not performed, if for the
`REGNO_REG_CLASS' of these hard registers
`CANNOT_CHANGE_MODE_CLASS' returns nonzero when the FROM mode is
MEM_MODE and the TO mode is any integral mode larger than this but
not larger than `word_mode'.
You must return `UNKNOWN' if for some hard registers that allow
this mode, `CANNOT_CHANGE_MODE_CLASS' says that they cannot change
to `word_mode', but that they can change to another integral mode
that is larger then MEM_MODE but still smaller than `word_mode'.
-- Macro: SHORT_IMMEDIATES_SIGN_EXTEND
Define this macro if loading short immediate values into registers
sign extends.
-- Macro: 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.
-- Target Hook: unsigned int TARGET_MIN_DIVISIONS_FOR_RECIP_MUL (enum
machine_mode MODE)
When `-ffast-math' is in effect, GCC tries to optimize divisions
by the same divisor, by turning them into multiplications by the
reciprocal. This target hook specifies the minimum number of
divisions that should be there for GCC to perform the optimization
for a variable of mode MODE. The default implementation returns 3
if the machine has an instruction for the division, and 2 if it
does not.
-- Macro: MOVE_MAX
The maximum number of bytes that a single instruction can move
quickly between memory and registers or between two memory
locations.
-- Macro: MAX_MOVE_MAX
The maximum number of bytes that a single instruction can move
quickly between memory and registers or between two memory
locations. If this is undefined, the default is `MOVE_MAX'.
Otherwise, it is the constant value that is the largest value that
`MOVE_MAX' can have at run-time.
-- Macro: SHIFT_COUNT_TRUNCATED
A C expression that is nonzero if on this machine the number of
bits actually used for the count of a shift operation is equal to
the number of bits needed to represent the size of the object
being shifted. When this macro is nonzero, the compiler will
assume that it is safe to omit a sign-extend, zero-extend, and
certain bitwise `and' instructions that truncates the count of a
shift operation. On machines that have instructions that act on
bit-fields at variable positions, which may include `bit test'
instructions, a nonzero `SHIFT_COUNT_TRUNCATED' also enables
deletion of truncations of the values that serve as arguments to
bit-field instructions.
If both types of instructions truncate the count (for shifts) and
position (for bit-field operations), or if no variable-position
bit-field instructions exist, you should define this macro.
However, on some machines, such as the 80386 and the 680x0,
truncation only applies to shift operations and not the (real or
pretended) bit-field operations. Define `SHIFT_COUNT_TRUNCATED'
to be zero on such machines. Instead, add patterns to the `md'
file that include the implied truncation of the shift instructions.
You need not define this macro if it would always have the value
of zero.
-- Target Hook: unsigned HOST_WIDE_INT TARGET_SHIFT_TRUNCATION_MASK
(enum machine_mode MODE)
This function describes how the standard shift patterns for MODE
deal with shifts by negative amounts or by more than the width of
the mode. *Note shift patterns::.
On many machines, the shift patterns will apply a mask M to the
shift count, meaning that a fixed-width shift of X by Y is
equivalent to an arbitrary-width shift of X by Y & M. If this is
true for mode MODE, the function should return M, otherwise it
should return 0. A return value of 0 indicates that no particular
behavior is guaranteed.
Note that, unlike `SHIFT_COUNT_TRUNCATED', this function does
_not_ apply to general shift rtxes; it applies only to instructions
that are generated by the named shift patterns.
The default implementation of this function returns
`GET_MODE_BITSIZE (MODE) - 1' if `SHIFT_COUNT_TRUNCATED' and 0
otherwise. This definition is always safe, but if
`SHIFT_COUNT_TRUNCATED' is false, and some shift patterns
nevertheless truncate the shift count, you may get better code by
overriding it.
-- Macro: 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.
When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for
modes for which `MODES_TIEABLE_P' is 0, suboptimal code can result.
If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in
such cases may improve things.
-- Target Hook: int TARGET_MODE_REP_EXTENDED (enum machine_mode MODE,
enum machine_mode REP_MODE)
The representation of an integral mode can be such that the values
are always extended to a wider integral mode. Return
`SIGN_EXTEND' if values of MODE are represented in sign-extended
form to REP_MODE. Return `UNKNOWN' otherwise. (Currently, none
of the targets use zero-extended representation this way so unlike
`LOAD_EXTEND_OP', `TARGET_MODE_REP_EXTENDED' is expected to return
either `SIGN_EXTEND' or `UNKNOWN'. Also no target extends MODE to
REP_MODE so that REP_MODE is not the next widest integral mode and
currently we take advantage of this fact.)
Similarly to `LOAD_EXTEND_OP' you may return a non-`UNKNOWN' value
even if the extension is not performed on certain hard registers
as long as for the `REGNO_REG_CLASS' of these hard registers
`CANNOT_CHANGE_MODE_CLASS' returns nonzero.
Note that `TARGET_MODE_REP_EXTENDED' and `LOAD_EXTEND_OP' describe
two related properties. If you define `TARGET_MODE_REP_EXTENDED
(mode, word_mode)' you probably also want to define
`LOAD_EXTEND_OP (mode)' to return the same type of extension.
In order to enforce the representation of `mode',
`TRULY_NOOP_TRUNCATION' should return false when truncating to
`mode'.
-- Macro: STORE_FLAG_VALUE
A C expression describing the value returned by a comparison
operator with an integral mode and stored by a store-flag
instruction (`cstoreMODE4') when the condition is true. This
description must apply to _all_ the `cstoreMODE4' patterns and all
the comparison operators whose results have a `MODE_INT' mode.
A value of 1 or -1 means that the instruction implementing the
comparison operator returns exactly 1 or -1 when the comparison is
true and 0 when the comparison is false. Otherwise, the value
indicates which bits of the result are guaranteed to be 1 when the
comparison is true. This value is interpreted in the mode of the
comparison operation, which is given by the mode of the first
operand in the `cstoreMODE4' pattern. Either the low bit or the
sign bit of `STORE_FLAG_VALUE' be on. Presently, only those bits
are used by the compiler.
If `STORE_FLAG_VALUE' is neither 1 or -1, the compiler will
generate code that depends only on the specified bits. It can also
replace comparison operators with equivalent operations if they
cause the required bits to be set, even if the remaining bits are
undefined. For example, on a machine whose comparison operators
return an `SImode' value and where `STORE_FLAG_VALUE' is defined as
`0x80000000', saying that just the sign bit is relevant, the
expression
(ne:SI (and:SI X (const_int POWER-OF-2)) (const_int 0))
can be converted to
(ashift:SI X (const_int N))
where N is the appropriate shift count to move the bit being
tested into the sign bit.
There is no way to describe a machine that always sets the
low-order bit for a true value, but does not guarantee the value
of any other bits, but we do not know of any machine that has such
an instruction. If you are trying to port GCC to such a machine,
include an instruction to perform a logical-and of the result with
1 in the pattern for the comparison operators and let us know at
<gcc@gcc.gnu.org>.
Often, a machine will have multiple instructions that obtain a
value from a comparison (or the condition codes). Here are rules
to guide the choice of value for `STORE_FLAG_VALUE', and hence the
instructions to be used:
* Use the shortest sequence that yields a valid definition for
`STORE_FLAG_VALUE'. It is more efficient for the compiler to
"normalize" the value (convert it to, e.g., 1 or 0) than for
the comparison operators to do so because there may be
opportunities to combine the normalization with other
operations.
* For equal-length sequences, use a value of 1 or -1, with -1
being slightly preferred on machines with expensive jumps and
1 preferred on other machines.
* As a second choice, choose a value of `0x80000001' if
instructions exist that set both the sign and low-order bits
but do not define the others.
* Otherwise, use a value of `0x80000000'.
Many machines can produce both the value chosen for
`STORE_FLAG_VALUE' and its negation in the same number of
instructions. On those machines, you should also define a pattern
for those cases, e.g., one matching
(set A (neg:M (ne:M B C)))
Some machines can also perform `and' or `plus' operations on
condition code values with less instructions than the corresponding
`cstoreMODE4' insn followed by `and' or `plus'. On those
machines, define the appropriate patterns. Use the names `incscc'
and `decscc', respectively, for the patterns which perform `plus'
or `minus' operations on condition code values. See `rs6000.md'
for some examples. The GNU Superoptimizer can be used to find
such instruction sequences on other machines.
If this macro is not defined, the default value, 1, is used. You
need not define `STORE_FLAG_VALUE' if the machine has no store-flag
instructions, or if the value generated by these instructions is 1.
-- Macro: FLOAT_STORE_FLAG_VALUE (MODE)
A C expression that gives a nonzero `REAL_VALUE_TYPE' value that is
returned when comparison operators with floating-point results are
true. Define this macro on machines that have comparison
operations that return floating-point values. If there are no
such operations, do not define this macro.
-- Macro: VECTOR_STORE_FLAG_VALUE (MODE)
A C expression that gives a rtx representing the nonzero true
element for vector comparisons. The returned rtx should be valid
for the inner mode of MODE which is guaranteed to be a vector
mode. Define this macro on machines that have vector comparison
operations that return a vector result. If there are no such
operations, do not define this macro. Typically, this macro is
defined as `const1_rtx' or `constm1_rtx'. This macro may return
`NULL_RTX' to prevent the compiler optimizing such vector
comparison operations for the given mode.
-- Macro: CLZ_DEFINED_VALUE_AT_ZERO (MODE, VALUE)
-- Macro: CTZ_DEFINED_VALUE_AT_ZERO (MODE, VALUE)
A C expression that indicates whether the architecture defines a
value for `clz' or `ctz' with a zero operand. A result of `0'
indicates the value is undefined. If the value is defined for
only the RTL expression, the macro should evaluate to `1'; if the
value applies also to the corresponding optab entry (which is
normally the case if it expands directly into the corresponding
RTL), then the macro should evaluate to `2'. In the cases where
the value is defined, VALUE should be set to this value.
If this macro is not defined, the value of `clz' or `ctz' at zero
is assumed to be undefined.
This macro must be defined if the target's expansion for `ffs'
relies on a particular value to get correct results. Otherwise it
is not necessary, though it may be used to optimize some corner
cases, and to provide a default expansion for the `ffs' optab.
Note that regardless of this macro the "definedness" of `clz' and
`ctz' at zero do _not_ extend to the builtin functions visible to
the user. Thus one may be free to adjust the value at will to
match the target expansion of these operations without fear of
breaking the API.
-- Macro: Pmode
An alias for the machine mode for pointers. On most machines,
define this to be the integer mode corresponding to the width of a
hardware pointer; `SImode' on 32-bit machine or `DImode' on 64-bit
machines. On some machines you must define this to be one of the
partial integer modes, such as `PSImode'.
The width of `Pmode' must be at least as large as the value of
`POINTER_SIZE'. If it is not equal, you must define the macro
`POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to
`Pmode'.
-- Macro: FUNCTION_MODE
An alias for the machine mode used for memory references to
functions being called, in `call' RTL expressions. On most CISC
machines, where an instruction can begin at any byte address, this
should be `QImode'. On most RISC machines, where all instructions
have fixed size and alignment, this should be a mode with the same
size and alignment as the machine instruction words - typically
`SImode' or `HImode'.
-- Macro: STDC_0_IN_SYSTEM_HEADERS
In normal operation, the preprocessor expands `__STDC__' to the
constant 1, to signify that GCC conforms to ISO Standard C. On
some hosts, like Solaris, the system compiler uses a different
convention, where `__STDC__' is normally 0, but is 1 if the user
specifies strict conformance to the C Standard.
Defining `STDC_0_IN_SYSTEM_HEADERS' makes GNU CPP follows the host
convention when processing system header files, but when
processing user files `__STDC__' will always expand to 1.
-- Macro: NO_IMPLICIT_EXTERN_C
Define this macro if the system header files support C++ as well
as C. This macro inhibits the usual method of using system header
files in C++, which is to pretend that the file's contents are
enclosed in `extern "C" {...}'.
-- Macro: REGISTER_TARGET_PRAGMAS ()
Define this macro if you want to implement any target-specific
pragmas. If defined, it is a C expression which makes a series of
calls to `c_register_pragma' or `c_register_pragma_with_expansion'
for each pragma. The macro may also do any setup required for the
pragmas.
The primary reason to define this macro is to provide
compatibility with other compilers for the same target. In
general, we discourage definition of target-specific pragmas for
GCC.
If the pragma can be implemented by attributes then you should
consider defining the target hook `TARGET_INSERT_ATTRIBUTES' as
well.
Preprocessor macros that appear on pragma lines are not expanded.
All `#pragma' directives that do not match any registered pragma
are silently ignored, unless the user specifies
`-Wunknown-pragmas'.
-- Function: void c_register_pragma (const char *SPACE, const char
*NAME, void (*CALLBACK) (struct cpp_reader *))
-- Function: void c_register_pragma_with_expansion (const char *SPACE,
const char *NAME, void (*CALLBACK) (struct cpp_reader *))
Each call to `c_register_pragma' or
`c_register_pragma_with_expansion' establishes one pragma. The
CALLBACK routine will be called when the preprocessor encounters a
pragma of the form
#pragma [SPACE] NAME ...
SPACE is the case-sensitive namespace of the pragma, or `NULL' to
put the pragma in the global namespace. The callback routine
receives PFILE as its first argument, which can be passed on to
cpplib's functions if necessary. You can lex tokens after the
NAME by calling `pragma_lex'. Tokens that are not read by the
callback will be silently ignored. The end of the line is
indicated by a token of type `CPP_EOF'. Macro expansion occurs on
the arguments of pragmas registered with
`c_register_pragma_with_expansion' but not on the arguments of
pragmas registered with `c_register_pragma'.
Note that the use of `pragma_lex' is specific to the C and C++
compilers. It will not work in the Java or Fortran compilers, or
any other language compilers for that matter. Thus if
`pragma_lex' is going to be called from target-specific code, it
must only be done so when building the C and C++ compilers. This
can be done by defining the variables `c_target_objs' and
`cxx_target_objs' in the target entry in the `config.gcc' file.
These variables should name the target-specific, language-specific
object file which contains the code that uses `pragma_lex'. Note
it will also be necessary to add a rule to the makefile fragment
pointed to by `tmake_file' that shows how to build this object
file.
-- Macro: HANDLE_PRAGMA_PACK_WITH_EXPANSION
Define this macro if macros should be expanded in the arguments of
`#pragma pack'.
-- Target Hook: bool TARGET_HANDLE_PRAGMA_EXTERN_PREFIX
True if `#pragma extern_prefix' is to be supported.
-- Macro: TARGET_DEFAULT_PACK_STRUCT
If your target requires a structure packing default other than 0
(meaning the machine default), define this macro to the necessary
value (in bytes). This must be a value that would also be valid
to use with `#pragma pack()' (that is, a small power of two).
-- Macro: DOLLARS_IN_IDENTIFIERS
Define this macro to control use of the character `$' in
identifier names for the C family of languages. 0 means `$' is
not allowed by default; 1 means it is allowed. 1 is the default;
there is no need to define this macro in that case.
-- Macro: NO_DOLLAR_IN_LABEL
Define this macro if the assembler does not accept the character
`$' in label names. By default constructors and destructors in
G++ have `$' in the identifiers. If this macro is defined, `.' is
used instead.
-- Macro: NO_DOT_IN_LABEL
Define this macro if the assembler does not accept the character
`.' in label names. By default constructors and destructors in G++
have names that use `.'. If this macro is defined, these names
are rewritten to avoid `.'.
-- Macro: INSN_SETS_ARE_DELAYED (INSN)
Define this macro as a C expression that is nonzero if it is safe
for the delay slot scheduler to place instructions in the delay
slot of INSN, even if they appear to use a resource set or
clobbered in INSN. INSN is always a `jump_insn' or an `insn'; GCC
knows that every `call_insn' has this behavior. On machines where
some `insn' or `jump_insn' is really a function call and hence has
this behavior, you should define this macro.
You need not define this macro if it would always return zero.
-- Macro: INSN_REFERENCES_ARE_DELAYED (INSN)
Define this macro as a C expression that is nonzero if it is safe
for the delay slot scheduler to place instructions in the delay
slot of INSN, even if they appear to set or clobber a resource
referenced in INSN. INSN is always a `jump_insn' or an `insn'.
On machines where some `insn' or `jump_insn' is really a function
call and its operands are registers whose use is actually in the
subroutine it calls, you should define this macro. Doing so
allows the delay slot scheduler to move instructions which copy
arguments into the argument registers into the delay slot of INSN.
You need not define this macro if it would always return zero.
-- Macro: MULTIPLE_SYMBOL_SPACES
Define this macro as a C expression that is nonzero if, in some
cases, global symbols from one translation unit may not be bound
to undefined symbols in another translation unit without user
intervention. For instance, under Microsoft Windows symbols must
be explicitly imported from shared libraries (DLLs).
You need not define this macro if it would always evaluate to zero.
-- Target Hook: tree TARGET_MD_ASM_CLOBBERS (tree OUTPUTS, tree
INPUTS, tree CLOBBERS)
This target hook should add to CLOBBERS `STRING_CST' trees for any
hard regs the port wishes to automatically clobber for an asm. It
should return the result of the last `tree_cons' used to add a
clobber. The OUTPUTS, INPUTS and CLOBBER lists are the
corresponding parameters to the asm and may be inspected to avoid
clobbering a register that is an input or output of the asm. You
can use `tree_overlaps_hard_reg_set', declared in `tree.h', to test
for overlap with regards to asm-declared registers.
-- Macro: MATH_LIBRARY
Define this macro as a C string constant for the linker argument
to link in the system math library, minus the initial `"-l"', or
`""' if the target does not have a separate math library.
You need only define this macro if the default of `"m"' is wrong.
-- Macro: LIBRARY_PATH_ENV
Define this macro as a C string constant for the environment
variable that specifies where the linker should look for libraries.
You need only define this macro if the default of `"LIBRARY_PATH"'
is wrong.
-- Macro: TARGET_POSIX_IO
Define this macro if the target supports the following POSIX file
functions, access, mkdir and file locking with fcntl / F_SETLKW.
Defining `TARGET_POSIX_IO' will enable the test coverage code to
use file locking when exiting a program, which avoids race
conditions if the program has forked. It will also create
directories at run-time for cross-profiling.
-- Macro: MAX_CONDITIONAL_EXECUTE
A C expression for the maximum number of instructions to execute
via conditional execution instructions instead of a branch. A
value of `BRANCH_COST'+1 is the default if the machine does not
use cc0, and 1 if it does use cc0.
-- Macro: IFCVT_MODIFY_TESTS (CE_INFO, TRUE_EXPR, FALSE_EXPR)
Used if the target needs to perform machine-dependent
modifications on the conditionals used for turning basic blocks
into conditionally executed code. CE_INFO points to a data
structure, `struct ce_if_block', which contains information about
the currently processed blocks. TRUE_EXPR and FALSE_EXPR are the
tests that are used for converting the then-block and the
else-block, respectively. Set either TRUE_EXPR or FALSE_EXPR to a
null pointer if the tests cannot be converted.
-- Macro: IFCVT_MODIFY_MULTIPLE_TESTS (CE_INFO, BB, TRUE_EXPR,
FALSE_EXPR)
Like `IFCVT_MODIFY_TESTS', but used when converting more
complicated if-statements into conditions combined by `and' and
`or' operations. BB contains the basic block that contains the
test that is currently being processed and about to be turned into
a condition.
-- Macro: IFCVT_MODIFY_INSN (CE_INFO, PATTERN, INSN)
A C expression to modify the PATTERN of an INSN that is to be
converted to conditional execution format. CE_INFO points to a
data structure, `struct ce_if_block', which contains information
about the currently processed blocks.
-- Macro: IFCVT_MODIFY_FINAL (CE_INFO)
A C expression to perform any final machine dependent
modifications in converting code to conditional execution. The
involved basic blocks can be found in the `struct ce_if_block'
structure that is pointed to by CE_INFO.
-- Macro: IFCVT_MODIFY_CANCEL (CE_INFO)
A C expression to cancel any machine dependent modifications in
converting code to conditional execution. The involved basic
blocks can be found in the `struct ce_if_block' structure that is
pointed to by CE_INFO.
-- Macro: IFCVT_INIT_EXTRA_FIELDS (CE_INFO)
A C expression to initialize any extra fields in a `struct
ce_if_block' structure, which are defined by the
`IFCVT_EXTRA_FIELDS' macro.
-- Macro: IFCVT_EXTRA_FIELDS
If defined, it should expand to a set of field declarations that
will be added to the `struct ce_if_block' structure. These should
be initialized by the `IFCVT_INIT_EXTRA_FIELDS' macro.
-- Target Hook: void TARGET_MACHINE_DEPENDENT_REORG (void)
If non-null, this hook performs a target-specific pass over the
instruction stream. The compiler will run it at all optimization
levels, just before the point at which it normally does
delayed-branch scheduling.
The exact purpose of the hook varies from target to target. Some
use it to do transformations that are necessary for correctness,
such as laying out in-function constant pools or avoiding hardware
hazards. Others use it as an opportunity to do some
machine-dependent optimizations.
You need not implement the hook if it has nothing to do. The
default definition is null.
-- Target Hook: void TARGET_INIT_BUILTINS (void)
Define this hook if you have any machine-specific built-in
functions that need to be defined. It should be a function that
performs the necessary setup.
Machine specific built-in functions can be useful to expand
special machine instructions that would otherwise not normally be
generated because they have no equivalent in the source language
(for example, SIMD vector instructions or prefetch instructions).
To create a built-in function, call the function
`lang_hooks.builtin_function' which is defined by the language
front end. You can use any type nodes set up by
`build_common_tree_nodes' and `build_common_tree_nodes_2'; only
language front ends that use those two functions will call
`TARGET_INIT_BUILTINS'.
-- Target Hook: tree TARGET_BUILTIN_DECL (unsigned CODE, bool
INITIALIZE_P)
Define this hook if you have any machine-specific built-in
functions that need to be defined. It should be a function that
returns the builtin function declaration for the builtin function
code CODE. If there is no such builtin and it cannot be
initialized at this time if INITIALIZE_P is true the function
should return `NULL_TREE'. If CODE is out of range the function
should return `error_mark_node'.
-- Target Hook: rtx TARGET_EXPAND_BUILTIN (tree EXP, rtx TARGET, rtx
SUBTARGET, enum machine_mode MODE, int IGNORE)
Expand a call to a machine specific built-in function that was set
up by `TARGET_INIT_BUILTINS'. EXP is the expression for the
function call; the result should go to TARGET if that is
convenient, and have mode MODE if that is convenient. SUBTARGET
may be used as the target for computing one of EXP's operands.
IGNORE is nonzero if the value is to be ignored. This function
should return the result of the call to the built-in function.
-- Target Hook: tree TARGET_RESOLVE_OVERLOADED_BUILTIN (unsigned int
LOC, tree FNDECL, void *ARGLIST)
Select a replacement for a machine specific built-in function that
was set up by `TARGET_INIT_BUILTINS'. This is done _before_
regular type checking, and so allows the target to implement a
crude form of function overloading. FNDECL is the declaration of
the built-in function. ARGLIST is the list of arguments passed to
the built-in function. The result is a complete expression that
implements the operation, usually another `CALL_EXPR'. ARGLIST
really has type `VEC(tree,gc)*'
-- Target Hook: tree TARGET_FOLD_BUILTIN (tree FNDECL, int N_ARGS,
tree *ARGP, bool IGNORE)
Fold a call to a machine specific built-in function that was set
up by `TARGET_INIT_BUILTINS'. FNDECL is the declaration of the
built-in function. N_ARGS is the number of arguments passed to
the function; the arguments themselves are pointed to by ARGP.
The result is another tree containing a simplified expression for
the call's result. If IGNORE is true the value will be ignored.
-- Target Hook: const char * TARGET_INVALID_WITHIN_DOLOOP (const_rtx
INSN)
Take an instruction in INSN and return NULL if it is valid within a
low-overhead loop, otherwise return a string explaining why doloop
could not be applied.
Many targets use special registers for low-overhead looping. For
any instruction that clobbers these this function should return a
string indicating the reason why the doloop could not be applied.
By default, the RTL loop optimizer does not use a present doloop
pattern for loops containing function calls or branch on table
instructions.
-- Macro: MD_CAN_REDIRECT_BRANCH (BRANCH1, BRANCH2)
Take a branch insn in BRANCH1 and another in BRANCH2. Return true
if redirecting BRANCH1 to the destination of BRANCH2 is possible.
On some targets, branches may have a limited range. Optimizing the
filling of delay slots can result in branches being redirected,
and this may in turn cause a branch offset to overflow.
-- Target Hook: bool TARGET_COMMUTATIVE_P (const_rtx X, int OUTER_CODE)
This target hook returns `true' if X is considered to be
commutative. Usually, this is just COMMUTATIVE_P (X), but the HP
PA doesn't consider PLUS to be commutative inside a MEM.
OUTER_CODE is the rtx code of the enclosing rtl, if known,
otherwise it is UNKNOWN.
-- Target Hook: rtx TARGET_ALLOCATE_INITIAL_VALUE (rtx HARD_REG)
When the initial value of a hard register has been copied in a
pseudo register, it is often not necessary to actually allocate
another register to this pseudo register, because the original
hard register or a stack slot it has been saved into can be used.
`TARGET_ALLOCATE_INITIAL_VALUE' is called at the start of register
allocation once for each hard register that had its initial value
copied by using `get_func_hard_reg_initial_val' or
`get_hard_reg_initial_val'. Possible values are `NULL_RTX', if
you don't want to do any special allocation, a `REG' rtx--that
would typically be the hard register itself, if it is known not to
be clobbered--or a `MEM'. If you are returning a `MEM', this is
only a hint for the allocator; it might decide to use another
register anyways. You may use `current_function_leaf_function' in
the hook, functions that use `REG_N_SETS', to determine if the hard
register in question will not be clobbered. The default value of
this hook is `NULL', which disables any special allocation.
-- Target Hook: int TARGET_UNSPEC_MAY_TRAP_P (const_rtx X, unsigned
FLAGS)
This target hook returns nonzero if X, an `unspec' or
`unspec_volatile' operation, might cause a trap. Targets can use
this hook to enhance precision of analysis for `unspec' and
`unspec_volatile' operations. You may call `may_trap_p_1' to
analyze inner elements of X in which case FLAGS should be passed
along.
-- Target Hook: void TARGET_SET_CURRENT_FUNCTION (tree DECL)
The compiler invokes this hook whenever it changes its current
function context (`cfun'). You can define this function if the
back end needs to perform any initialization or reset actions on a
per-function basis. For example, it may be used to implement
function attributes that affect register usage or code generation
patterns. The argument DECL is the declaration for the new
function context, and may be null to indicate that the compiler
has left a function context and is returning to processing at the
top level. The default hook function does nothing.
GCC sets `cfun' to a dummy function context during initialization
of some parts of the back end. The hook function is not invoked
in this situation; you need not worry about the hook being invoked
recursively, or when the back end is in a partially-initialized
state. `cfun' might be `NULL' to indicate processing at top level,
outside of any function scope.
-- Macro: TARGET_OBJECT_SUFFIX
Define this macro to be a C string representing the suffix for
object files on your target machine. If you do not define this
macro, GCC will use `.o' as the suffix for object files.
-- Macro: TARGET_EXECUTABLE_SUFFIX
Define this macro to be a C string representing the suffix to be
automatically added to executable files on your target machine.
If you do not define this macro, GCC will use the null string as
the suffix for executable files.
-- Macro: COLLECT_EXPORT_LIST
If defined, `collect2' will scan the individual object files
specified on its command line and create an export list for the
linker. Define this macro for systems like AIX, where the linker
discards object files that are not referenced from `main' and uses
export lists.
-- Macro: MODIFY_JNI_METHOD_CALL (MDECL)
Define this macro to a C expression representing a variant of the
method call MDECL, if Java Native Interface (JNI) methods must be
invoked differently from other methods on your target. For
example, on 32-bit Microsoft Windows, JNI methods must be invoked
using the `stdcall' calling convention and this macro is then
defined as this expression:
build_type_attribute_variant (MDECL,
build_tree_list
(get_identifier ("stdcall"),
NULL))
-- Target Hook: bool TARGET_CANNOT_MODIFY_JUMPS_P (void)
This target hook returns `true' past the point in which new jump
instructions could be created. On machines that require a
register for every jump such as the SHmedia ISA of SH5, this point
would typically be reload, so this target hook should be defined
to a function such as:
static bool
cannot_modify_jumps_past_reload_p ()
{
return (reload_completed || reload_in_progress);
}
-- Target Hook: reg_class_t TARGET_BRANCH_TARGET_REGISTER_CLASS (void)
This target hook returns a register class for which branch target
register optimizations should be applied. All registers in this
class should be usable interchangeably. After reload, registers
in this class will be re-allocated and loads will be hoisted out
of loops and be subjected to inter-block scheduling.
-- Target Hook: bool TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED (bool
AFTER_PROLOGUE_EPILOGUE_GEN)
Branch target register optimization will by default exclude
callee-saved registers that are not already live during the
current function; if this target hook returns true, they will be
included. The target code must than make sure that all target
registers in the class returned by
`TARGET_BRANCH_TARGET_REGISTER_CLASS' that might need saving are
saved. AFTER_PROLOGUE_EPILOGUE_GEN indicates if prologues and
epilogues have already been generated. Note, even if you only
return true when AFTER_PROLOGUE_EPILOGUE_GEN is false, you still
are likely to have to make special provisions in
`INITIAL_ELIMINATION_OFFSET' to reserve space for caller-saved
target registers.
-- Target Hook: bool TARGET_HAVE_CONDITIONAL_EXECUTION (void)
This target hook returns true if the target supports conditional
execution. This target hook is required only when the target has
several different modes and they have different conditional
execution capability, such as ARM.
-- Target Hook: unsigned TARGET_LOOP_UNROLL_ADJUST (unsigned NUNROLL,
struct loop *LOOP)
This target hook returns a new value for the number of times LOOP
should be unrolled. The parameter NUNROLL is the number of times
the loop is to be unrolled. The parameter LOOP is a pointer to the
loop, which is going to be checked for unrolling. This target hook
is required only when the target has special constraints like
maximum number of memory accesses.
-- Macro: POWI_MAX_MULTS
If defined, this macro is interpreted as a signed integer C
expression that specifies the maximum number of floating point
multiplications that should be emitted when expanding
exponentiation by an integer constant inline. When this value is
defined, exponentiation requiring more than this number of
multiplications is implemented by calling the system library's
`pow', `powf' or `powl' routines. The default value places no
upper bound on the multiplication count.
-- Macro: void TARGET_EXTRA_INCLUDES (const char *SYSROOT, const char
*IPREFIX, int STDINC)
This target hook should register any extra include files for the
target. The parameter STDINC indicates if normal include files
are present. The parameter SYSROOT is the system root directory.
The parameter IPREFIX is the prefix for the gcc directory.
-- Macro: void TARGET_EXTRA_PRE_INCLUDES (const char *SYSROOT, const
char *IPREFIX, int STDINC)
This target hook should register any extra include files for the
target before any standard headers. The parameter STDINC
indicates if normal include files are present. The parameter
SYSROOT is the system root directory. The parameter IPREFIX is
the prefix for the gcc directory.
-- Macro: void TARGET_OPTF (char *PATH)
This target hook should register special include paths for the
target. The parameter PATH is the include to register. On Darwin
systems, this is used for Framework includes, which have semantics
that are different from `-I'.
-- Macro: bool TARGET_USE_LOCAL_THUNK_ALIAS_P (tree FNDECL)
This target macro returns `true' if it is safe to use a local alias
for a virtual function FNDECL when constructing thunks, `false'
otherwise. By default, the macro returns `true' for all
functions, if a target supports aliases (i.e. defines
`ASM_OUTPUT_DEF'), `false' otherwise,
-- Macro: TARGET_FORMAT_TYPES
If defined, this macro is the name of a global variable containing
target-specific format checking information for the `-Wformat'
option. The default is to have no target-specific format checks.
-- Macro: TARGET_N_FORMAT_TYPES
If defined, this macro is the number of entries in
`TARGET_FORMAT_TYPES'.
-- Macro: TARGET_OVERRIDES_FORMAT_ATTRIBUTES
If defined, this macro is the name of a global variable containing
target-specific format overrides for the `-Wformat' option. The
default is to have no target-specific format overrides. If defined,
`TARGET_FORMAT_TYPES' must be defined, too.
-- Macro: TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT
If defined, this macro specifies the number of entries in
`TARGET_OVERRIDES_FORMAT_ATTRIBUTES'.
-- Macro: TARGET_OVERRIDES_FORMAT_INIT
If defined, this macro specifies the optional initialization
routine for target specific customizations of the system printf
and scanf formatter settings.
-- Target Hook: bool TARGET_RELAXED_ORDERING
If set to `true', means that the target's memory model does not
guarantee that loads which do not depend on one another will access
main memory in the order of the instruction stream; if ordering is
important, an explicit memory barrier must be used. This is true
of many recent processors which implement a policy of "relaxed,"
"weak," or "release" memory consistency, such as Alpha, PowerPC,
and ia64. The default is `false'.
-- Target Hook: const char * TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN
(const_tree TYPELIST, const_tree FUNCDECL, const_tree VAL)
If defined, this macro returns the diagnostic message when it is
illegal to pass argument VAL to function FUNCDECL with prototype
TYPELIST.
-- Target Hook: const char * TARGET_INVALID_CONVERSION (const_tree
FROMTYPE, const_tree TOTYPE)
If defined, this macro returns the diagnostic message when it is
invalid to convert from FROMTYPE to TOTYPE, or `NULL' if validity
should be determined by the front end.
-- Target Hook: const char * TARGET_INVALID_UNARY_OP (int OP,
const_tree TYPE)
If defined, this macro returns the diagnostic message when it is
invalid to apply operation OP (where unary plus is denoted by
`CONVERT_EXPR') to an operand of type TYPE, or `NULL' if validity
should be determined by the front end.
-- Target Hook: const char * TARGET_INVALID_BINARY_OP (int OP,
const_tree TYPE1, const_tree TYPE2)
If defined, this macro returns the diagnostic message when it is
invalid to apply operation OP to operands of types TYPE1 and
TYPE2, or `NULL' if validity should be determined by the front end.
-- Target Hook: const char * TARGET_INVALID_PARAMETER_TYPE (const_tree
TYPE)
If defined, this macro returns the diagnostic message when it is
invalid for functions to include parameters of type TYPE, or
`NULL' if validity should be determined by the front end. This is
currently used only by the C and C++ front ends.
-- Target Hook: const char * TARGET_INVALID_RETURN_TYPE (const_tree
TYPE)
If defined, this macro returns the diagnostic message when it is
invalid for functions to have return type TYPE, or `NULL' if
validity should be determined by the front end. This is currently
used only by the C and C++ front ends.
-- Target Hook: tree TARGET_PROMOTED_TYPE (const_tree TYPE)
If defined, this target hook returns the type to which values of
TYPE should be promoted when they appear in expressions, analogous
to the integer promotions, or `NULL_TREE' to use the front end's
normal promotion rules. This hook is useful when there are
target-specific types with special promotion rules. This is
currently used only by the C and C++ front ends.
-- Target Hook: tree TARGET_CONVERT_TO_TYPE (tree TYPE, tree EXPR)
If defined, this hook returns the result of converting EXPR to
TYPE. It should return the converted expression, or `NULL_TREE'
to apply the front end's normal conversion rules. This hook is
useful when there are target-specific types with special
conversion rules. This is currently used only by the C and C++
front ends.
-- Macro: TARGET_USE_JCR_SECTION
This macro determines whether to use the JCR section to register
Java classes. By default, TARGET_USE_JCR_SECTION is defined to 1
if both SUPPORTS_WEAK and TARGET_HAVE_NAMED_SECTIONS are true,
else 0.
-- Macro: OBJC_JBLEN
This macro determines the size of the objective C jump buffer for
the NeXT runtime. By default, OBJC_JBLEN is defined to an
innocuous value.
-- Macro: LIBGCC2_UNWIND_ATTRIBUTE
Define this macro if any target-specific attributes need to be
attached to the functions in `libgcc' that provide low-level
support for call stack unwinding. It is used in declarations in
`unwind-generic.h' and the associated definitions of those
functions.
-- Target Hook: void TARGET_UPDATE_STACK_BOUNDARY (void)
Define this macro to update the current function stack boundary if
necessary.
-- Target Hook: rtx TARGET_GET_DRAP_RTX (void)
This hook should return an rtx for Dynamic Realign Argument
Pointer (DRAP) if a different argument pointer register is needed
to access the function's argument list due to stack realignment.
Return `NULL' if no DRAP is needed.
-- Target Hook: bool TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS (void)
When optimization is disabled, this hook indicates whether or not
arguments should be allocated to stack slots. Normally, GCC
allocates stacks slots for arguments when not optimizing in order
to make debugging easier. However, when a function is declared
with `__attribute__((naked))', there is no stack frame, and the
compiler cannot safely move arguments from the registers in which
they are passed to the stack. Therefore, this hook should return
true in general, but false for naked functions. The default
implementation always returns true.
-- Target Hook: unsigned HOST_WIDE_INT TARGET_CONST_ANCHOR
On some architectures it can take multiple instructions to
synthesize a constant. If there is another constant already in a
register that is close enough in value then it is preferable that
the new constant is computed from this register using immediate
addition or subtraction. We accomplish this through CSE. Besides
the value of the constant we also add a lower and an upper
constant anchor to the available expressions. These are then
queried when encountering new constants. The anchors are computed
by rounding the constant up and down to a multiple of the value of
`TARGET_CONST_ANCHOR'. `TARGET_CONST_ANCHOR' should be the
maximum positive value accepted by immediate-add plus one. We
currently assume that the value of `TARGET_CONST_ANCHOR' is a
power of 2. For example, on MIPS, where add-immediate takes a
16-bit signed value, `TARGET_CONST_ANCHOR' is set to `0x8000'.
The default value is zero, which disables this optimization.
File: gccint.info, Node: Host Config, Next: Fragments, Prev: Target Macros, Up: Top
18 Host Configuration
*********************
Most details about the machine and system on which the compiler is
actually running are detected by the `configure' script. Some things
are impossible for `configure' to detect; these are described in two
ways, either by macros defined in a file named `xm-MACHINE.h' or by
hook functions in the file specified by the OUT_HOST_HOOK_OBJ variable
in `config.gcc'. (The intention is that very few hosts will need a
header file but nearly every fully supported host will need to override
some hooks.)
If you need to define only a few macros, and they have simple
definitions, consider using the `xm_defines' variable in your
`config.gcc' entry instead of creating a host configuration header.
*Note System Config::.
* Menu:
* Host Common:: Things every host probably needs implemented.
* Filesystem:: Your host can't have the letter `a' in filenames?
* Host Misc:: Rare configuration options for hosts.
File: gccint.info, Node: Host Common, Next: Filesystem, Up: Host Config
18.1 Host Common
================
Some things are just not portable, even between similar operating
systems, and are too difficult for autoconf to detect. They get
implemented using hook functions in the file specified by the
HOST_HOOK_OBJ variable in `config.gcc'.
-- Host Hook: void HOST_HOOKS_EXTRA_SIGNALS (void)
This host hook is used to set up handling for extra signals. The
most common thing to do in this hook is to detect stack overflow.
-- Host Hook: void * HOST_HOOKS_GT_PCH_GET_ADDRESS (size_t SIZE, int
FD)
This host hook returns the address of some space that is likely to
be free in some subsequent invocation of the compiler. We intend
to load the PCH data at this address such that the data need not
be relocated. The area should be able to hold SIZE bytes. If the
host uses `mmap', FD is an open file descriptor that can be used
for probing.
-- Host Hook: int HOST_HOOKS_GT_PCH_USE_ADDRESS (void * ADDRESS,
size_t SIZE, int FD, size_t OFFSET)
This host hook is called when a PCH file is about to be loaded.
We want to load SIZE bytes from FD at OFFSET into memory at
ADDRESS. The given address will be the result of a previous
invocation of `HOST_HOOKS_GT_PCH_GET_ADDRESS'. Return -1 if we
couldn't allocate SIZE bytes at ADDRESS. Return 0 if the memory
is allocated but the data is not loaded. Return 1 if the hook has
performed everything.
If the implementation uses reserved address space, free any
reserved space beyond SIZE, regardless of the return value. If no
PCH will be loaded, this hook may be called with SIZE zero, in
which case all reserved address space should be freed.
Do not try to handle values of ADDRESS that could not have been
returned by this executable; just return -1. Such values usually
indicate an out-of-date PCH file (built by some other GCC
executable), and such a PCH file won't work.
-- Host Hook: size_t HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY (void);
This host hook returns the alignment required for allocating
virtual memory. Usually this is the same as getpagesize, but on
some hosts the alignment for reserving memory differs from the
pagesize for committing memory.
File: gccint.info, Node: Filesystem, Next: Host Misc, Prev: Host Common, Up: Host Config
18.2 Host Filesystem
====================
GCC needs to know a number of things about the semantics of the host
machine's filesystem. Filesystems with Unix and MS-DOS semantics are
automatically detected. For other systems, you can define the
following macros in `xm-MACHINE.h'.
`HAVE_DOS_BASED_FILE_SYSTEM'
This macro is automatically defined by `system.h' if the host file
system obeys the semantics defined by MS-DOS instead of Unix. DOS
file systems are case insensitive, file specifications may begin
with a drive letter, and both forward slash and backslash (`/' and
`\') are directory separators.
`DIR_SEPARATOR'
`DIR_SEPARATOR_2'
If defined, these macros expand to character constants specifying
separators for directory names within a file specification.
`system.h' will automatically give them appropriate values on Unix
and MS-DOS file systems. If your file system is neither of these,
define one or both appropriately in `xm-MACHINE.h'.
However, operating systems like VMS, where constructing a pathname
is more complicated than just stringing together directory names
separated by a special character, should not define either of these
macros.
`PATH_SEPARATOR'
If defined, this macro should expand to a character constant
specifying the separator for elements of search paths. The default
value is a colon (`:'). DOS-based systems usually, but not
always, use semicolon (`;').
`VMS'
Define this macro if the host system is VMS.
`HOST_OBJECT_SUFFIX'
Define this macro to be a C string representing the suffix for
object files on your host machine. If you do not define this
macro, GCC will use `.o' as the suffix for object files.
`HOST_EXECUTABLE_SUFFIX'
Define this macro to be a C string representing the suffix for
executable files on your host machine. If you do not define this
macro, GCC will use the null string as the suffix for executable
files.
`HOST_BIT_BUCKET'
A pathname defined by the host operating system, which can be
opened as a file and written to, but all the information written
is discarded. This is commonly known as a "bit bucket" or "null
device". If you do not define this macro, GCC will use
`/dev/null' as the bit bucket. If the host does not support a bit
bucket, define this macro to an invalid filename.
`UPDATE_PATH_HOST_CANONICALIZE (PATH)'
If defined, a C statement (sans semicolon) that performs
host-dependent canonicalization when a path used in a compilation
driver or preprocessor is canonicalized. PATH is a malloc-ed path
to be canonicalized. If the C statement does canonicalize PATH
into a different buffer, the old path should be freed and the new
buffer should have been allocated with malloc.
`DUMPFILE_FORMAT'
Define this macro to be a C string representing the format to use
for constructing the index part of debugging dump file names. The
resultant string must fit in fifteen bytes. The full filename
will be the concatenation of: the prefix of the assembler file
name, the string resulting from applying this format to an index
number, and a string unique to each dump file kind, e.g. `rtl'.
If you do not define this macro, GCC will use `.%02d.'. You should
define this macro if using the default will create an invalid file
name.
`DELETE_IF_ORDINARY'
Define this macro to be a C statement (sans semicolon) that
performs host-dependent removal of ordinary temp files in the
compilation driver.
If you do not define this macro, GCC will use the default version.
You should define this macro if the default version does not
reliably remove the temp file as, for example, on VMS which allows
multiple versions of a file.
`HOST_LACKS_INODE_NUMBERS'
Define this macro if the host filesystem does not report
meaningful inode numbers in struct stat.
File: gccint.info, Node: Host Misc, Prev: Filesystem, Up: Host Config
18.3 Host Misc
==============
`FATAL_EXIT_CODE'
A C expression for the status code to be returned when the compiler
exits after serious errors. The default is the system-provided
macro `EXIT_FAILURE', or `1' if the system doesn't define that
macro. Define this macro only if these defaults are incorrect.
`SUCCESS_EXIT_CODE'
A C expression for the status code to be returned when the compiler
exits without serious errors. (Warnings are not serious errors.)
The default is the system-provided macro `EXIT_SUCCESS', or `0' if
the system doesn't define that macro. Define this macro only if
these defaults are incorrect.
`USE_C_ALLOCA'
Define this macro if GCC should use the C implementation of
`alloca' provided by `libiberty.a'. This only affects how some
parts of the compiler itself allocate memory. It does not change
code generation.
When GCC is built with a compiler other than itself, the C `alloca'
is always used. This is because most other implementations have
serious bugs. You should define this macro only on a system where
no stack-based `alloca' can possibly work. For instance, if a
system has a small limit on the size of the stack, GCC's builtin
`alloca' will not work reliably.
`COLLECT2_HOST_INITIALIZATION'
If defined, a C statement (sans semicolon) that performs
host-dependent initialization when `collect2' is being initialized.
`GCC_DRIVER_HOST_INITIALIZATION'
If defined, a C statement (sans semicolon) that performs
host-dependent initialization when a compilation driver is being
initialized.
`HOST_LONG_LONG_FORMAT'
If defined, the string used to indicate an argument of type `long
long' to functions like `printf'. The default value is `"ll"'.
`HOST_LONG_FORMAT'
If defined, the string used to indicate an argument of type `long'
to functions like `printf'. The default value is `"l"'.
`HOST_PTR_PRINTF'
If defined, the string used to indicate an argument of type `void
*' to functions like `printf'. The default value is `"%p"'.
In addition, if `configure' generates an incorrect definition of any
of the macros in `auto-host.h', you can override that definition in a
host configuration header. If you need to do this, first see if it is
possible to fix `configure'.
File: gccint.info, Node: Fragments, Next: Collect2, Prev: Host Config, Up: Top
19 Makefile Fragments
*********************
When you configure GCC using the `configure' script, it will construct
the file `Makefile' from the template file `Makefile.in'. When it does
this, it can incorporate makefile fragments from the `config'
directory. These are used to set Makefile parameters that are not
amenable to being calculated by autoconf. The list of fragments to
incorporate is set by `config.gcc' (and occasionally `config.build' and
`config.host'); *Note System Config::.
Fragments are named either `t-TARGET' or `x-HOST', depending on
whether they are relevant to configuring GCC to produce code for a
particular target, or to configuring GCC to run on a particular host.
Here TARGET and HOST are mnemonics which usually have some relationship
to the canonical system name, but no formal connection.
If these files do not exist, it means nothing needs to be added for a
given target or host. Most targets need a few `t-TARGET' fragments,
but needing `x-HOST' fragments is rare.
* Menu:
* Target Fragment:: Writing `t-TARGET' files.
* Host Fragment:: Writing `x-HOST' files.
File: gccint.info, Node: Target Fragment, Next: Host Fragment, Up: Fragments
19.1 Target Makefile Fragments
==============================
Target makefile fragments can set these Makefile variables.
`LIBGCC2_CFLAGS'
Compiler flags to use when compiling `libgcc2.c'.
`LIB2FUNCS_EXTRA'
A list of source file names to be compiled or assembled and
inserted into `libgcc.a'.
`Floating Point Emulation'
To have GCC include software floating point libraries in `libgcc.a'
define `FPBIT' and `DPBIT' along with a few rules as follows:
# We want fine grained libraries, so use the new code
# to build the floating point emulation libraries.
FPBIT = fp-bit.c
DPBIT = dp-bit.c
fp-bit.c: $(srcdir)/config/fp-bit.c
echo '#define FLOAT' > fp-bit.c
cat $(srcdir)/config/fp-bit.c >> fp-bit.c
dp-bit.c: $(srcdir)/config/fp-bit.c
cat $(srcdir)/config/fp-bit.c > dp-bit.c
You may need to provide additional #defines at the beginning of
`fp-bit.c' and `dp-bit.c' to control target endianness and other
options.
`CRTSTUFF_T_CFLAGS'
Special flags used when compiling `crtstuff.c'. *Note
Initialization::.
`CRTSTUFF_T_CFLAGS_S'
Special flags used when compiling `crtstuff.c' for shared linking.
Used if you use `crtbeginS.o' and `crtendS.o' in `EXTRA-PARTS'.
*Note Initialization::.
`MULTILIB_OPTIONS'
For some targets, invoking GCC in different ways produces objects
that can not be linked together. For example, for some targets GCC
produces both big and little endian code. For these targets, you
must arrange for multiple versions of `libgcc.a' to be compiled,
one for each set of incompatible options. When GCC invokes the
linker, it arranges to link in the right version of `libgcc.a',
based on the command line options used.
The `MULTILIB_OPTIONS' macro lists the set of options for which
special versions of `libgcc.a' must be built. Write options that
are mutually incompatible side by side, separated by a slash.
Write options that may be used together separated by a space. The
build procedure will build all combinations of compatible options.
For example, if you set `MULTILIB_OPTIONS' to `m68000/m68020
msoft-float', `Makefile' will build special versions of `libgcc.a'
using the following sets of options: `-m68000', `-m68020',
`-msoft-float', `-m68000 -msoft-float', and `-m68020 -msoft-float'.
`MULTILIB_DIRNAMES'
If `MULTILIB_OPTIONS' is used, this variable specifies the
directory names that should be used to hold the various libraries.
Write one element in `MULTILIB_DIRNAMES' for each element in
`MULTILIB_OPTIONS'. If `MULTILIB_DIRNAMES' is not used, the
default value will be `MULTILIB_OPTIONS', with all slashes treated
as spaces.
`MULTILIB_DIRNAMES' describes the multilib directories using GCC
conventions and is applied to directories that are part of the GCC
installation. When multilib-enabled, the compiler will add a
subdirectory of the form PREFIX/MULTILIB before each directory in
the search path for libraries and crt files.
For example, if `MULTILIB_OPTIONS' is set to `m68000/m68020
msoft-float', then the default value of `MULTILIB_DIRNAMES' is
`m68000 m68020 msoft-float'. You may specify a different value if
you desire a different set of directory names.
`MULTILIB_MATCHES'
Sometimes the same option may be written in two different ways.
If an option is listed in `MULTILIB_OPTIONS', GCC needs to know
about any synonyms. In that case, set `MULTILIB_MATCHES' to a
list of items of the form `option=option' to describe all relevant
synonyms. For example, `m68000=mc68000 m68020=mc68020'.
`MULTILIB_EXCEPTIONS'
Sometimes when there are multiple sets of `MULTILIB_OPTIONS' being
specified, there are combinations that should not be built. In
that case, set `MULTILIB_EXCEPTIONS' to be all of the switch
exceptions in shell case syntax that should not be built.
For example the ARM processor cannot execute both hardware floating
point instructions and the reduced size THUMB instructions at the
same time, so there is no need to build libraries with both of
these options enabled. Therefore `MULTILIB_EXCEPTIONS' is set to:
*mthumb/*mhard-float*
`MULTILIB_EXTRA_OPTS'
Sometimes it is desirable that when building multiple versions of
`libgcc.a' certain options should always be passed on to the
compiler. In that case, set `MULTILIB_EXTRA_OPTS' to be the list
of options to be used for all builds. If you set this, you should
probably set `CRTSTUFF_T_CFLAGS' to a dash followed by it.
`NATIVE_SYSTEM_HEADER_DIR'
If the default location for system headers is not `/usr/include',
you must set this to the directory containing the headers. This
value should match the value of the `SYSTEM_INCLUDE_DIR' macro.
`MULTILIB_OSDIRNAMES'
If `MULTILIB_OPTIONS' is used, this variable specifies a list of
subdirectory names, that are used to modify the search path
depending on the chosen multilib. Unlike `MULTILIB_DIRNAMES',
`MULTILIB_OSDIRNAMES' describes the multilib directories using
operating systems conventions, and is applied to the directories
such as `lib' or those in the `LIBRARY_PATH' environment variable.
The format is either the same as of `MULTILIB_DIRNAMES', or a set
of mappings. When it is the same as `MULTILIB_DIRNAMES', it
describes the multilib directories using operating system
conventions, rather than GCC conventions. When it is a set of
mappings of the form GCCDIR=OSDIR, the left side gives the GCC
convention and the right gives the equivalent OS defined location.
If the OSDIR part begins with a `!', GCC will not search in the
non-multilib directory and use exclusively the multilib directory.
Otherwise, the compiler will examine the search path for libraries
and crt files twice; the first time it will add MULTILIB to each
directory in the search path, the second it will not.
For configurations that support both multilib and multiarch,
`MULTILIB_OSDIRNAMES' also encodes the multiarch name, thus
subsuming `MULTIARCH_DIRNAME'. The multiarch name is appended to
each directory name, separated by a colon (e.g.
`../lib32:i386-linux-gnu').
Each multiarch subdirectory will be searched before the
corresponding OS multilib directory, for example
`/lib/i386-linux-gnu' before `/lib/../lib32'. The multiarch name
will also be used to modify the system header search path, as
explained for `MULTIARCH_DIRNAME'.
`MULTIARCH_DIRNAME'
This variable specifies the multiarch name for configurations that
are multiarch-enabled but not multilibbed configurations.
The multiarch name is used to augment the search path for
libraries, crt files and system header files with additional
locations. The compiler will add a multiarch subdirectory of the
form PREFIX/MULTIARCH before each directory in the library and crt
search path. It will also add two directories
`LOCAL_INCLUDE_DIR'/MULTIARCH and
`NATIVE_SYSTEM_HEADER_DIR'/MULTIARCH) to the system header search
path, respectively before `LOCAL_INCLUDE_DIR' and
`NATIVE_SYSTEM_HEADER_DIR'.
`MULTIARCH_DIRNAME' is not used for configurations that support
both multilib and multiarch. In that case, multiarch names are
encoded in `MULTILIB_OSDIRNAMES' instead.
More documentation about multiarch can be found at
`http://wiki.debian.org/Multiarch'.
`SPECS'
Unfortunately, setting `MULTILIB_EXTRA_OPTS' is not enough, since
it does not affect the build of target libraries, at least not the
build of the default multilib. One possible work-around is to use
`DRIVER_SELF_SPECS' to bring options from the `specs' file as if
they had been passed in the compiler driver command line.
However, you don't want to be adding these options after the
toolchain is installed, so you can instead tweak the `specs' file
that will be used during the toolchain build, while you still
install the original, built-in `specs'. The trick is to set
`SPECS' to some other filename (say `specs.install'), that will
then be created out of the built-in specs, and introduce a
`Makefile' rule to generate the `specs' file that's going to be
used at build time out of your `specs.install'.
`T_CFLAGS'
These are extra flags to pass to the C compiler. They are used
both when building GCC, and when compiling things with the
just-built GCC. This variable is deprecated and should not be
used.
File: gccint.info, Node: Host Fragment, Prev: Target Fragment, Up: Fragments
19.2 Host Makefile Fragments
============================
The use of `x-HOST' fragments is discouraged. You should only use it
for makefile dependencies.
File: gccint.info, Node: Collect2, Next: Header Dirs, Prev: Fragments, Up: Top
20 `collect2'
*************
GCC uses a utility called `collect2' on nearly all systems to arrange
to call various initialization functions at start time.
The program `collect2' works by linking the program once and looking
through the linker output file for symbols with particular names
indicating they are constructor functions. If it finds any, it creates
a new temporary `.c' file containing a table of them, compiles it, and
links the program a second time including that file.
The actual calls to the constructors are carried out by a subroutine
called `__main', which is called (automatically) at the beginning of
the body of `main' (provided `main' was compiled with GNU CC). Calling
`__main' is necessary, even when compiling C code, to allow linking C
and C++ object code together. (If you use `-nostdlib', you get an
unresolved reference to `__main', since it's defined in the standard
GCC library. Include `-lgcc' at the end of your compiler command line
to resolve this reference.)
The program `collect2' is installed as `ld' in the directory where the
passes of the compiler are installed. When `collect2' needs to find
the _real_ `ld', it tries the following file names:
* a hard coded linker file name, if GCC was configured with the
`--with-ld' option.
* `real-ld' in the directories listed in the compiler's search
directories.
* `real-ld' in the directories listed in the environment variable
`PATH'.
* The file specified in the `REAL_LD_FILE_NAME' configuration macro,
if specified.
* `ld' in the compiler's search directories, except that `collect2'
will not execute itself recursively.
* `ld' in `PATH'.
"The compiler's search directories" means all the directories where
`gcc' searches for passes of the compiler. This includes directories
that you specify with `-B'.
Cross-compilers search a little differently:
* `real-ld' in the compiler's search directories.
* `TARGET-real-ld' in `PATH'.
* The file specified in the `REAL_LD_FILE_NAME' configuration macro,
if specified.
* `ld' in the compiler's search directories.
* `TARGET-ld' in `PATH'.
`collect2' explicitly avoids running `ld' using the file name under
which `collect2' itself was invoked. In fact, it remembers up a list
of such names--in case one copy of `collect2' finds another copy (or
version) of `collect2' installed as `ld' in a second place in the
search path.
`collect2' searches for the utilities `nm' and `strip' using the same
algorithm as above for `ld'.
File: gccint.info, Node: Header Dirs, Next: Type Information, Prev: Collect2, Up: Top
21 Standard Header File Directories
***********************************
`GCC_INCLUDE_DIR' means the same thing for native and cross. It is
where GCC stores its private include files, and also where GCC stores
the fixed include files. A cross compiled GCC runs `fixincludes' on
the header files in `$(tooldir)/include'. (If the cross compilation
header files need to be fixed, they must be installed before GCC is
built. If the cross compilation header files are already suitable for
GCC, nothing special need be done).
`GPLUSPLUS_INCLUDE_DIR' means the same thing for native and cross. It
is where `g++' looks first for header files. The C++ library installs
only target independent header files in that directory.
`LOCAL_INCLUDE_DIR' is used only by native compilers. GCC doesn't
install anything there. It is normally `/usr/local/include'. This is
where local additions to a packaged system should place header files.
`CROSS_INCLUDE_DIR' is used only by cross compilers. GCC doesn't
install anything there.
`TOOL_INCLUDE_DIR' is used for both native and cross compilers. It is
the place for other packages to install header files that GCC will use.
For a cross-compiler, this is the equivalent of `/usr/include'. When
you build a cross-compiler, `fixincludes' processes any header files in
this directory.
File: gccint.info, Node: Type Information, Next: Plugins, Prev: Header Dirs, Up: Top
22 Memory Management and Type Information
*****************************************
GCC uses some fairly sophisticated memory management techniques, which
involve determining information about GCC's data structures from GCC's
source code and using this information to perform garbage collection and
implement precompiled headers.
A full C parser would be too complicated for this task, so a limited
subset of C is interpreted and special markers are used to determine
what parts of the source to look at. All `struct' and `union'
declarations that define data structures that are allocated under
control of the garbage collector must be marked. All global variables
that hold pointers to garbage-collected memory must also be marked.
Finally, all global variables that need to be saved and restored by a
precompiled header must be marked. (The precompiled header mechanism
can only save static variables if they're scalar. Complex data
structures must be allocated in garbage-collected memory to be saved in
a precompiled header.)
The full format of a marker is
GTY (([OPTION] [(PARAM)], [OPTION] [(PARAM)] ...))
but in most cases no options are needed. The outer double parentheses
are still necessary, though: `GTY(())'. Markers can appear:
* In a structure definition, before the open brace;
* In a global variable declaration, after the keyword `static' or
`extern'; and
* In a structure field definition, before the name of the field.
Here are some examples of marking simple data structures and globals.
struct GTY(()) TAG
{
FIELDS...
};
typedef struct GTY(()) TAG
{
FIELDS...
} *TYPENAME;
static GTY(()) struct TAG *LIST; /* points to GC memory */
static GTY(()) int COUNTER; /* save counter in a PCH */
The parser understands simple typedefs such as `typedef struct TAG
*NAME;' and `typedef int NAME;'. These don't need to be marked.
* Menu:
* GTY Options:: What goes inside a `GTY(())'.
* GGC Roots:: Making global variables GGC roots.
* Files:: How the generated files work.
* Invoking the garbage collector:: How to invoke the garbage collector.
* Troubleshooting:: When something does not work as expected.
File: gccint.info, Node: GTY Options, Next: GGC Roots, Up: Type Information
22.1 The Inside of a `GTY(())'
==============================
Sometimes the C code is not enough to fully describe the type
structure. Extra information can be provided with `GTY' options and
additional markers. Some options take a parameter, which may be either
a string or a type name, depending on the parameter. If an option
takes no parameter, it is acceptable either to omit the parameter
entirely, or to provide an empty string as a parameter. For example,
`GTY ((skip))' and `GTY ((skip ("")))' are equivalent.
When the parameter is a string, often it is a fragment of C code. Four
special escapes may be used in these strings, to refer to pieces of the
data structure being marked:
`%h'
The current structure.
`%1'
The structure that immediately contains the current structure.
`%0'
The outermost structure that contains the current structure.
`%a'
A partial expression of the form `[i1][i2]...' that indexes the
array item currently being marked.
For instance, suppose that you have a structure of the form
struct A {
...
};
struct B {
struct A foo[12];
};
and `b' is a variable of type `struct B'. When marking `b.foo[11]',
`%h' would expand to `b.foo[11]', `%0' and `%1' would both expand to
`b', and `%a' would expand to `[11]'.
As in ordinary C, adjacent strings will be concatenated; this is
helpful when you have a complicated expression.
GTY ((chain_next ("TREE_CODE (&%h.generic) == INTEGER_TYPE"
" ? TYPE_NEXT_VARIANT (&%h.generic)"
" : TREE_CHAIN (&%h.generic)")))
The available options are:
`length ("EXPRESSION")'
There are two places the type machinery will need to be explicitly
told the length of an array. The first case is when a structure
ends in a variable-length array, like this:
struct GTY(()) rtvec_def {
int num_elem; /* number of elements */
rtx GTY ((length ("%h.num_elem"))) elem[1];
};
In this case, the `length' option is used to override the specified
array length (which should usually be `1'). The parameter of the
option is a fragment of C code that calculates the length.
The second case is when a structure or a global variable contains a
pointer to an array, like this:
struct gimple_omp_for_iter * GTY((length ("%h.collapse"))) iter;
In this case, `iter' has been allocated by writing something like
x->iter = ggc_alloc_cleared_vec_gimple_omp_for_iter (collapse);
and the `collapse' provides the length of the field.
This second use of `length' also works on global variables, like: static GTY((length("reg_known_value_size"))) rtx *reg_known_value;
`skip'
If `skip' is applied to a field, the type machinery will ignore it.
This is somewhat dangerous; the only safe use is in a union when
one field really isn't ever used.
`desc ("EXPRESSION")'
`tag ("CONSTANT")'
`default'
The type machinery needs to be told which field of a `union' is
currently active. This is done by giving each field a constant
`tag' value, and then specifying a discriminator using `desc'.
The value of the expression given by `desc' is compared against
each `tag' value, each of which should be different. If no `tag'
is matched, the field marked with `default' is used if there is
one, otherwise no field in the union will be marked.
In the `desc' option, the "current structure" is the union that it
discriminates. Use `%1' to mean the structure containing it.
There are no escapes available to the `tag' option, since it is a
constant.
For example,
struct GTY(()) tree_binding
{
struct tree_common common;
union tree_binding_u {
tree GTY ((tag ("0"))) scope;
struct cp_binding_level * GTY ((tag ("1"))) level;
} GTY ((desc ("BINDING_HAS_LEVEL_P ((tree)&%0)"))) xscope;
tree value;
};
In this example, the value of BINDING_HAS_LEVEL_P when applied to a
`struct tree_binding *' is presumed to be 0 or 1. If 1, the type
mechanism will treat the field `level' as being present and if 0,
will treat the field `scope' as being present.
`param_is (TYPE)'
`use_param'
Sometimes it's convenient to define some data structure to work on
generic pointers (that is, `PTR') and then use it with a specific
type. `param_is' specifies the real type pointed to, and
`use_param' says where in the generic data structure that type
should be put.
For instance, to have a `htab_t' that points to trees, one would
write the definition of `htab_t' like this:
typedef struct GTY(()) {
...
void ** GTY ((use_param, ...)) entries;
...
} htab_t;
and then declare variables like this:
static htab_t GTY ((param_is (union tree_node))) ict;
`paramN_is (TYPE)'
`use_paramN'
In more complicated cases, the data structure might need to work on
several different types, which might not necessarily all be
pointers. For this, `param1_is' through `param9_is' may be used to
specify the real type of a field identified by `use_param1' through
`use_param9'.
`use_params'
When a structure contains another structure that is parameterized,
there's no need to do anything special, the inner structure
inherits the parameters of the outer one. When a structure
contains a pointer to a parameterized structure, the type
machinery won't automatically detect this (it could, it just
doesn't yet), so it's necessary to tell it that the pointed-to
structure should use the same parameters as the outer structure.
This is done by marking the pointer with the `use_params' option.
`deletable'
`deletable', when applied to a global variable, indicates that when
garbage collection runs, there's no need to mark anything pointed
to by this variable, it can just be set to `NULL' instead. This
is used to keep a list of free structures around for re-use.
`if_marked ("EXPRESSION")'
Suppose you want some kinds of object to be unique, and so you put
them in a hash table. If garbage collection marks the hash table,
these objects will never be freed, even if the last other
reference to them goes away. GGC has special handling to deal
with this: if you use the `if_marked' option on a global hash
table, GGC will call the routine whose name is the parameter to
the option on each hash table entry. If the routine returns
nonzero, the hash table entry will be marked as usual. If the
routine returns zero, the hash table entry will be deleted.
The routine `ggc_marked_p' can be used to determine if an element
has been marked already; in fact, the usual case is to use
`if_marked ("ggc_marked_p")'.
`mark_hook ("HOOK-ROUTINE-NAME")'
If provided for a structure or union type, the given
HOOK-ROUTINE-NAME (between double-quotes) is the name of a routine
called when the garbage collector has just marked the data as
reachable. This routine should not change the data, or call any ggc
routine. Its only argument is a pointer to the just marked (const)
structure or union.
`maybe_undef'
When applied to a field, `maybe_undef' indicates that it's OK if
the structure that this fields points to is never defined, so long
as this field is always `NULL'. This is used to avoid requiring
backends to define certain optional structures. It doesn't work
with language frontends.
`nested_ptr (TYPE, "TO EXPRESSION", "FROM EXPRESSION")'
The type machinery expects all pointers to point to the start of an
object. Sometimes for abstraction purposes it's convenient to have
a pointer which points inside an object. So long as it's possible
to convert the original object to and from the pointer, such
pointers can still be used. TYPE is the type of the original
object, the TO EXPRESSION returns the pointer given the original
object, and the FROM EXPRESSION returns the original object given
the pointer. The pointer will be available using the `%h' escape.
`chain_next ("EXPRESSION")'
`chain_prev ("EXPRESSION")'
`chain_circular ("EXPRESSION")'
It's helpful for the type machinery to know if objects are often
chained together in long lists; this lets it generate code that
uses less stack space by iterating along the list instead of
recursing down it. `chain_next' is an expression for the next
item in the list, `chain_prev' is an expression for the previous
item. For singly linked lists, use only `chain_next'; for doubly
linked lists, use both. The machinery requires that taking the
next item of the previous item gives the original item.
`chain_circular' is similar to `chain_next', but can be used for
circular single linked lists.
`reorder ("FUNCTION NAME")'
Some data structures depend on the relative ordering of pointers.
If the precompiled header machinery needs to change that ordering,
it will call the function referenced by the `reorder' option,
before changing the pointers in the object that's pointed to by
the field the option applies to. The function must take four
arguments, with the signature
`void *, void *, gt_pointer_operator, void *'. The first
parameter is a pointer to the structure that contains the object
being updated, or the object itself if there is no containing
structure. The second parameter is a cookie that should be
ignored. The third parameter is a routine that, given a pointer,
will update it to its correct new value. The fourth parameter is
a cookie that must be passed to the second parameter.
PCH cannot handle data structures that depend on the absolute
values of pointers. `reorder' functions can be expensive. When
possible, it is better to depend on properties of the data, like
an ID number or the hash of a string instead.
`variable_size'
The type machinery expects the types to be of constant size. When
this is not true, for example, with structs that have array fields
or unions, the type machinery cannot tell how many bytes need to
be allocated at each allocation. The `variable_size' is used to
mark such types. The type machinery then provides allocators that
take a parameter indicating an exact size of object being
allocated. Note that the size must be provided in bytes whereas
the `length' option works with array lengths in number of elements.
For example,
struct GTY((variable_size)) sorted_fields_type {
int len;
tree GTY((length ("%h.len"))) elts[1];
};
Then the objects of `struct sorted_fields_type' are allocated in GC
memory as follows:
field_vec = ggc_alloc_sorted_fields_type (size);
If FIELD_VEC->ELTS stores N elements, then SIZE could be
calculated as follows:
size_t size = sizeof (struct sorted_fields_type) + n * sizeof (tree);
`special ("NAME")'
The `special' option is used to mark types that have to be dealt
with by special case machinery. The parameter is the name of the
special case. See `gengtype.c' for further details. Avoid adding
new special cases unless there is no other alternative.
File: gccint.info, Node: GGC Roots, Next: Files, Prev: GTY Options, Up: Type Information
22.2 Marking Roots for the Garbage Collector
============================================
In addition to keeping track of types, the type machinery also locates
the global variables ("roots") that the garbage collector starts at.
Roots must be declared using one of the following syntaxes:
* `extern GTY(([OPTIONS])) TYPE NAME;'
* `static GTY(([OPTIONS])) TYPE NAME;'
The syntax
* `GTY(([OPTIONS])) TYPE NAME;'
is _not_ accepted. There should be an `extern' declaration of such a
variable in a header somewhere--mark that, not the definition. Or, if
the variable is only used in one file, make it `static'.
File: gccint.info, Node: Files, Next: Invoking the garbage collector, Prev: GGC Roots, Up: Type Information
22.3 Source Files Containing Type Information
=============================================
Whenever you add `GTY' markers to a source file that previously had
none, or create a new source file containing `GTY' markers, there are
three things you need to do:
1. You need to add the file to the list of source files the type
machinery scans. There are four cases:
a. For a back-end file, this is usually done automatically; if
not, you should add it to `target_gtfiles' in the appropriate
port's entries in `config.gcc'.
b. For files shared by all front ends, add the filename to the
`GTFILES' variable in `Makefile.in'.
c. For files that are part of one front end, add the filename to
the `gtfiles' variable defined in the appropriate
`config-lang.in'. For C, the file is `c-config-lang.in'.
Headers should appear before non-headers in this list.
d. For files that are part of some but not all front ends, add
the filename to the `gtfiles' variable of _all_ the front ends
that use it.
2. If the file was a header file, you'll need to check that it's
included in the right place to be visible to the generated files.
For a back-end header file, this should be done automatically.
For a front-end header file, it needs to be included by the same
file that includes `gtype-LANG.h'. For other header files, it
needs to be included in `gtype-desc.c', which is a generated file,
so add it to `ifiles' in `open_base_file' in `gengtype.c'.
For source files that aren't header files, the machinery will
generate a header file that should be included in the source file
you just changed. The file will be called `gt-PATH.h' where PATH
is the pathname relative to the `gcc' directory with slashes
replaced by -, so for example the header file to be included in
`cp/parser.c' is called `gt-cp-parser.c'. The generated header
file should be included after everything else in the source file.
Don't forget to mention this file as a dependency in the
`Makefile'!
For language frontends, there is another file that needs to be included
somewhere. It will be called `gtype-LANG.h', where LANG is the name of
the subdirectory the language is contained in.
Plugins can add additional root tables. Run the `gengtype' utility in
plugin mode as `gengtype -P pluginout.h SOURCE-DIR FILE-LIST PLUGIN*.C'
with your plugin files PLUGIN*.C using `GTY' to generate the
PLUGINOUT.H file. The GCC build tree is needed to be present in that
mode.
File: gccint.info, Node: Invoking the garbage collector, Next: Troubleshooting, Prev: Files, Up: Type Information
22.4 How to invoke the garbage collector
========================================
The GCC garbage collector GGC is only invoked explicitly. In contrast
with many other garbage collectors, it is not implicitly invoked by
allocation routines when a lot of memory has been consumed. So the only
way to have GGC reclaim storage it to call the `ggc_collect' function
explicitly. This call is an expensive operation, as it may have to
scan the entire heap. Beware that local variables (on the GCC call
stack) are not followed by such an invocation (as many other garbage
collectors do): you should reference all your data from static or
external `GTY'-ed variables, and it is advised to call `ggc_collect'
with a shallow call stack. The GGC is an exact mark and sweep garbage
collector (so it does not scan the call stack for pointers). In
practice GCC passes don't often call `ggc_collect' themselves, because
it is called by the pass manager between passes.
At the time of the `ggc_collect' call all pointers in the GC-marked
structures must be valid or `NULL'. In practice this means that there
should not be uninitialized pointer fields in the structures even if
your code never reads or writes those fields at a particular instance.
One way to ensure this is to use cleared versions of allocators unless
all the fields are initialized manually immediately after allocation.
File: gccint.info, Node: Troubleshooting, Prev: Invoking the garbage collector, Up: Type Information
22.5 Troubleshooting the garbage collector
==========================================
With the current garbage collector implementation, most issues should
show up as GCC compilation errors. Some of the most commonly
encountered issues are described below.
* Gengtype does not produce allocators for a `GTY'-marked type.
Gengtype checks if there is at least one possible path from GC
roots to at least one instance of each type before outputting
allocators. If there is no such path, the `GTY' markers will be
ignored and no allocators will be output. Solve this by making
sure that there exists at least one such path. If creating it is
unfeasible or raises a "code smell", consider if you really must
use GC for allocating such type.
* Link-time errors about undefined `gt_ggc_r_foo_bar' and
similarly-named symbols. Check if your `foo_bar' source file has
`#include "gt-foo_bar.h"' as its very last line.
File: gccint.info, Node: Plugins, Next: LTO, Prev: Type Information, Up: Top
23 Plugins
**********
23.1 Loading Plugins
====================
Plugins are supported on platforms that support `-ldl -rdynamic'. They
are loaded by the compiler using `dlopen' and invoked at pre-determined
locations in the compilation process.
Plugins are loaded with
`-fplugin=/path/to/NAME.so' `-fplugin-arg-NAME-KEY1[=VALUE1]'
The plugin arguments are parsed by GCC and passed to respective
plugins as key-value pairs. Multiple plugins can be invoked by
specifying multiple `-fplugin' arguments.
A plugin can be simply given by its short name (no dots or slashes).
When simply passing `-fplugin=NAME', the plugin is loaded from the
`plugin' directory, so `-fplugin=NAME' is the same as `-fplugin=`gcc
-print-file-name=plugin`/NAME.so', using backquote shell syntax to
query the `plugin' directory.
23.2 Plugin API
===============
Plugins are activated by the compiler at specific events as defined in
`gcc-plugin.h'. For each event of interest, the plugin should call
`register_callback' specifying the name of the event and address of the
callback function that will handle that event.
The header `gcc-plugin.h' must be the first gcc header to be included.
23.2.1 Plugin license check
---------------------------
Every plugin should define the global symbol `plugin_is_GPL_compatible'
to assert that it has been licensed under a GPL-compatible license. If
this symbol does not exist, the compiler will emit a fatal error and
exit with the error message:
fatal error: plugin NAME is not licensed under a GPL-compatible license
NAME: undefined symbol: plugin_is_GPL_compatible
compilation terminated
The declared type of the symbol should be int, to match a forward
declaration in `gcc-plugin.h' that suppresses C++ mangling. It does
not need to be in any allocated section, though. The compiler merely
asserts that the symbol exists in the global scope. Something like
this is enough:
int plugin_is_GPL_compatible;
23.2.2 Plugin initialization
----------------------------
Every plugin should export a function called `plugin_init' that is
called right after the plugin is loaded. This function is responsible
for registering all the callbacks required by the plugin and do any
other required initialization.
This function is called from `compile_file' right before invoking the
parser. The arguments to `plugin_init' are:
* `plugin_info': Plugin invocation information.
* `version': GCC version.
The `plugin_info' struct is defined as follows:
struct plugin_name_args
{
char *base_name; /* Short name of the plugin
(filename without .so suffix). */
const char *full_name; /* Path to the plugin as specified with
-fplugin=. */
int argc; /* Number of arguments specified with
-fplugin-arg-.... */
struct plugin_argument *argv; /* Array of ARGC key-value pairs. */
const char *version; /* Version string provided by plugin. */
const char *help; /* Help string provided by plugin. */
}
If initialization fails, `plugin_init' must return a non-zero value.
Otherwise, it should return 0.
The version of the GCC compiler loading the plugin is described by the
following structure:
struct plugin_gcc_version
{
const char *basever;
const char *datestamp;
const char *devphase;
const char *revision;
const char *configuration_arguments;
};
The function `plugin_default_version_check' takes two pointers to such
structure and compare them field by field. It can be used by the
plugin's `plugin_init' function.
The version of GCC used to compile the plugin can be found in the
symbol `gcc_version' defined in the header `plugin-version.h'. The
recommended version check to perform looks like
#include "plugin-version.h"
...
int
plugin_init (struct plugin_name_args *plugin_info,
struct plugin_gcc_version *version)
{
if (!plugin_default_version_check (version, &gcc_version))
return 1;
}
but you can also check the individual fields if you want a less strict
check.
23.2.3 Plugin callbacks
-----------------------
Callback functions have the following prototype:
/* The prototype for a plugin callback function.
gcc_data - event-specific data provided by GCC
user_data - plugin-specific data provided by the plug-in. */
typedef void (*plugin_callback_func)(void *gcc_data, void *user_data);
Callbacks can be invoked at the following pre-determined events:
enum plugin_event
{
PLUGIN_PASS_MANAGER_SETUP, /* To hook into pass manager. */
PLUGIN_FINISH_TYPE, /* After finishing parsing a type. */
PLUGIN_FINISH_UNIT, /* Useful for summary processing. */
PLUGIN_PRE_GENERICIZE, /* Allows to see low level AST in C and C++ frontends. */
PLUGIN_FINISH, /* Called before GCC exits. */
PLUGIN_INFO, /* Information about the plugin. */
PLUGIN_GGC_START, /* Called at start of GCC Garbage Collection. */
PLUGIN_GGC_MARKING, /* Extend the GGC marking. */
PLUGIN_GGC_END, /* Called at end of GGC. */
PLUGIN_REGISTER_GGC_ROOTS, /* Register an extra GGC root table. */
PLUGIN_REGISTER_GGC_CACHES, /* Register an extra GGC cache table. */
PLUGIN_ATTRIBUTES, /* Called during attribute registration */
PLUGIN_START_UNIT, /* Called before processing a translation unit. */
PLUGIN_PRAGMAS, /* Called during pragma registration. */
/* Called before first pass from all_passes. */
PLUGIN_ALL_PASSES_START,
/* Called after last pass from all_passes. */
PLUGIN_ALL_PASSES_END,
/* Called before first ipa pass. */
PLUGIN_ALL_IPA_PASSES_START,
/* Called after last ipa pass. */
PLUGIN_ALL_IPA_PASSES_END,
/* Allows to override pass gate decision for current_pass. */
PLUGIN_OVERRIDE_GATE,
/* Called before executing a pass. */
PLUGIN_PASS_EXECUTION,
/* Called before executing subpasses of a GIMPLE_PASS in
execute_ipa_pass_list. */
PLUGIN_EARLY_GIMPLE_PASSES_START,
/* Called after executing subpasses of a GIMPLE_PASS in
execute_ipa_pass_list. */
PLUGIN_EARLY_GIMPLE_PASSES_END,
/* Called when a pass is first instantiated. */
PLUGIN_NEW_PASS,
PLUGIN_EVENT_FIRST_DYNAMIC /* Dummy event used for indexing callback
array. */
};
In addition, plugins can also look up the enumerator of a named event,
and / or generate new events dynamically, by calling the function
`get_named_event_id'.
To register a callback, the plugin calls `register_callback' with the
arguments:
* `char *name': Plugin name.
* `int event': The event code.
* `plugin_callback_func callback': The function that handles `event'.
* `void *user_data': Pointer to plugin-specific data.
For the PLUGIN_PASS_MANAGER_SETUP, PLUGIN_INFO,
PLUGIN_REGISTER_GGC_ROOTS and PLUGIN_REGISTER_GGC_CACHES pseudo-events
the `callback' should be null, and the `user_data' is specific.
When the PLUGIN_PRAGMAS event is triggered (with a null pointer as
data from GCC), plugins may register their own pragmas using functions
like `c_register_pragma' or `c_register_pragma_with_expansion'.
23.3 Interacting with the pass manager
======================================
There needs to be a way to add/reorder/remove passes dynamically. This
is useful for both analysis plugins (plugging in after a certain pass
such as CFG or an IPA pass) and optimization plugins.
Basic support for inserting new passes or replacing existing passes is
provided. A plugin registers a new pass with GCC by calling
`register_callback' with the `PLUGIN_PASS_MANAGER_SETUP' event and a
pointer to a `struct register_pass_info' object defined as follows
enum pass_positioning_ops
{
PASS_POS_INSERT_AFTER, // Insert after the reference pass.
PASS_POS_INSERT_BEFORE, // Insert before the reference pass.
PASS_POS_REPLACE // Replace the reference pass.
};
struct register_pass_info
{
struct opt_pass *pass; /* New pass provided by the plugin. */
const char *reference_pass_name; /* Name of the reference pass for hooking
up the new pass. */
int ref_pass_instance_number; /* Insert the pass at the specified
instance number of the reference pass. */
/* Do it for every instance if it is 0. */
enum pass_positioning_ops pos_op; /* how to insert the new pass. */
};
/* Sample plugin code that registers a new pass. */
int
plugin_init (struct plugin_name_args *plugin_info,
struct plugin_gcc_version *version)
{
struct register_pass_info pass_info;
...
/* Code to fill in the pass_info object with new pass information. */
...
/* Register the new pass. */
register_callback (plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info);
...
}
23.4 Interacting with the GCC Garbage Collector
===============================================
Some plugins may want to be informed when GGC (the GCC Garbage
Collector) is running. They can register callbacks for the
`PLUGIN_GGC_START' and `PLUGIN_GGC_END' events (for which the callback
is called with a null `gcc_data') to be notified of the start or end of
the GCC garbage collection.
Some plugins may need to have GGC mark additional data. This can be
done by registering a callback (called with a null `gcc_data') for the
`PLUGIN_GGC_MARKING' event. Such callbacks can call the `ggc_set_mark'
routine, preferably thru the `ggc_mark' macro (and conversely, these
routines should usually not be used in plugins outside of the
`PLUGIN_GGC_MARKING' event).
Some plugins may need to add extra GGC root tables, e.g. to handle
their own `GTY'-ed data. This can be done with the
`PLUGIN_REGISTER_GGC_ROOTS' pseudo-event with a null callback and the
extra root table (of type `struct ggc_root_tab*') as `user_data'.
Plugins that want to use the `if_marked' hash table option can add the
extra GGC cache tables generated by `gengtype' using the
`PLUGIN_REGISTER_GGC_CACHES' pseudo-event with a null callback and the
extra cache table (of type `struct ggc_cache_tab*') as `user_data'.
Running the `gengtype -p SOURCE-DIR FILE-LIST PLUGIN*.C ...' utility
generates these extra root tables.
You should understand the details of memory management inside GCC
before using `PLUGIN_GGC_MARKING', `PLUGIN_REGISTER_GGC_ROOTS' or
`PLUGIN_REGISTER_GGC_CACHES'.
23.5 Giving information about a plugin
======================================
A plugin should give some information to the user about itself. This
uses the following structure:
struct plugin_info
{
const char *version;
const char *help;
};
Such a structure is passed as the `user_data' by the plugin's init
routine using `register_callback' with the `PLUGIN_INFO' pseudo-event
and a null callback.
23.6 Registering custom attributes or pragmas
=============================================
For analysis (or other) purposes it is useful to be able to add custom
attributes or pragmas.
The `PLUGIN_ATTRIBUTES' callback is called during attribute
registration. Use the `register_attribute' function to register custom
attributes.
/* Attribute handler callback */
static tree
handle_user_attribute (tree *node, tree name, tree args,
int flags, bool *no_add_attrs)
{
return NULL_TREE;
}
/* Attribute definition */
static struct attribute_spec user_attr =
{ "user", 1, 1, false, false, false, handle_user_attribute };
/* Plugin callback called during attribute registration.
Registered with register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL)
*/
static void
register_attributes (void *event_data, void *data)
{
warning (0, G_("Callback to register attributes"));
register_attribute (&user_attr);
}
The `PLUGIN_PRAGMAS' callback is called during pragmas registration.
Use the `c_register_pragma' or `c_register_pragma_with_expansion'
functions to register custom pragmas.
/* Plugin callback called during pragmas registration. Registered with
register_callback (plugin_name, PLUGIN_PRAGMAS,
register_my_pragma, NULL);
*/
static void
register_my_pragma (void *event_data, void *data)
{
warning (0, G_("Callback to register pragmas"));
c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello);
}
It is suggested to pass `"GCCPLUGIN"' (or a short name identifying
your plugin) as the "space" argument of your pragma.
23.7 Recording information about pass execution
===============================================
The event PLUGIN_PASS_EXECUTION passes the pointer to the executed pass
(the same as current_pass) as `gcc_data' to the callback. You can also
inspect cfun to find out about which function this pass is executed for.
Note that this event will only be invoked if the gate check (if
applicable, modified by PLUGIN_OVERRIDE_GATE) succeeds. You can use
other hooks, like `PLUGIN_ALL_PASSES_START', `PLUGIN_ALL_PASSES_END',
`PLUGIN_ALL_IPA_PASSES_START', `PLUGIN_ALL_IPA_PASSES_END',
`PLUGIN_EARLY_GIMPLE_PASSES_START', and/or
`PLUGIN_EARLY_GIMPLE_PASSES_END' to manipulate global state in your
plugin(s) in order to get context for the pass execution.
23.8 Controlling which passes are being run
===========================================
After the original gate function for a pass is called, its result - the
gate status - is stored as an integer. Then the event
`PLUGIN_OVERRIDE_GATE' is invoked, with a pointer to the gate status in
the `gcc_data' parameter to the callback function. A nonzero value of
the gate status means that the pass is to be executed. You can both
read and write the gate status via the passed pointer.
23.9 Keeping track of available passes
======================================
When your plugin is loaded, you can inspect the various pass lists to
determine what passes are available. However, other plugins might add
new passes. Also, future changes to GCC might cause generic passes to
be added after plugin loading. When a pass is first added to one of
the pass lists, the event `PLUGIN_NEW_PASS' is invoked, with the
callback parameter `gcc_data' pointing to the new pass.
23.10 Building GCC plugins
==========================
If plugins are enabled, GCC installs the headers needed to build a
plugin (somewhere in the installation tree, e.g. under `/usr/local').
In particular a `plugin/include' directory is installed, containing all
the header files needed to build plugins.
On most systems, you can query this `plugin' directory by invoking
`gcc -print-file-name=plugin' (replace if needed `gcc' with the
appropriate program path).
Inside plugins, this `plugin' directory name can be queried by calling
`default_plugin_dir_name ()'.
The following GNU Makefile excerpt shows how to build a simple plugin:
GCC=gcc
PLUGIN_SOURCE_FILES= plugin1.c plugin2.c
PLUGIN_OBJECT_FILES= $(patsubst %.c,%.o,$(PLUGIN_SOURCE_FILES))
GCCPLUGINS_DIR:= $(shell $(GCC) -print-file-name=plugin)
CFLAGS+= -I$(GCCPLUGINS_DIR)/include -fPIC -O2
plugin.so: $(PLUGIN_OBJECT_FILES)
$(GCC) -shared $^ -o $@
A single source file plugin may be built with `gcc -I`gcc
-print-file-name=plugin`/include -fPIC -shared -O2 plugin.c -o
plugin.so', using backquote shell syntax to query the `plugin'
directory.
Plugins needing to use `gengtype' require a GCC build directory for
the same version of GCC that they will be linked against.
File: gccint.info, Node: LTO, Next: Funding, Prev: Plugins, Up: Top
24 Link Time Optimization
*************************
24.1 Design Overview
====================
Link time optimization is implemented as a GCC front end for a bytecode
representation of GIMPLE that is emitted in special sections of `.o'
files. Currently, LTO support is enabled in most ELF-based systems, as
well as darwin, cygwin and mingw systems.
Since GIMPLE bytecode is saved alongside final object code, object
files generated with LTO support are larger than regular object files.
This "fat" object format makes it easy to integrate LTO into existing
build systems, as one can, for instance, produce archives of the files.
Additionally, one might be able to ship one set of fat objects which
could be used both for development and the production of optimized
builds. A, perhaps surprising, side effect of this feature is that any
mistake in the toolchain that leads to LTO information not being used
(e.g. an older `libtool' calling `ld' directly). This is both an
advantage, as the system is more robust, and a disadvantage, as the
user is not informed that the optimization has been disabled.
The current implementation only produces "fat" objects, effectively
doubling compilation time and increasing file sizes up to 5x the
original size. This hides the problem that some tools, such as `ar'
and `nm', need to understand symbol tables of LTO sections. These
tools were extended to use the plugin infrastructure, and with these
problems solved, GCC will also support "slim" objects consisting of the
intermediate code alone.
At the highest level, LTO splits the compiler in two. The first half
(the "writer") produces a streaming representation of all the internal
data structures needed to optimize and generate code. This includes
declarations, types, the callgraph and the GIMPLE representation of
function bodies.
When `-flto' is given during compilation of a source file, the pass
manager executes all the passes in `all_lto_gen_passes'. Currently,
this phase is composed of two IPA passes:
* `pass_ipa_lto_gimple_out' This pass executes the function
`lto_output' in `lto-streamer-out.c', which traverses the call
graph encoding every reachable declaration, type and function.
This generates a memory representation of all the file sections
described below.
* `pass_ipa_lto_finish_out' This pass executes the function
`produce_asm_for_decls' in `lto-streamer-out.c', which takes the
memory image built in the previous pass and encodes it in the
corresponding ELF file sections.
The second half of LTO support is the "reader". This is implemented
as the GCC front end `lto1' in `lto/lto.c'. When `collect2' detects a
link set of `.o'/`.a' files with LTO information and the `-flto' is
enabled, it invokes `lto1' which reads the set of files and aggregates
them into a single translation unit for optimization. The main entry
point for the reader is `lto/lto.c':`lto_main'.
24.1.1 LTO modes of operation
-----------------------------
One of the main goals of the GCC link-time infrastructure was to allow
effective compilation of large programs. For this reason GCC
implements two link-time compilation modes.
1. _LTO mode_, in which the whole program is read into the compiler
at link-time and optimized in a similar way as if it were a single
source-level compilation unit.
2. _WHOPR or partitioned mode_, designed to utilize multiple CPUs
and/or a distributed compilation environment to quickly link large
applications. WHOPR stands for WHOle Program optimizeR (not to be
confused with the semantics of `-fwhole-program'). It partitions
the aggregated callgraph from many different `.o' files and
distributes the compilation of the sub-graphs to different CPUs.
Note that distributed compilation is not implemented yet, but since
the parallelism is facilitated via generating a `Makefile', it
would be easy to implement.
WHOPR splits LTO into three main stages:
1. Local generation (LGEN) This stage executes in parallel. Every
file in the program is compiled into the intermediate language and
packaged together with the local call-graph and summary
information. This stage is the same for both the LTO and WHOPR
compilation mode.
2. Whole Program Analysis (WPA) WPA is performed sequentially. The
global call-graph is generated, and a global analysis procedure
makes transformation decisions. The global call-graph is
partitioned to facilitate parallel optimization during phase 3.
The results of the WPA stage are stored into new object files
which contain the partitions of program expressed in the
intermediate language and the optimization decisions.
3. Local transformations (LTRANS) This stage executes in parallel.
All the decisions made during phase 2 are implemented locally in
each partitioned object file, and the final object code is
generated. Optimizations which cannot be decided efficiently
during the phase 2 may be performed on the local call-graph
partitions.
WHOPR can be seen as an extension of the usual LTO mode of
compilation. In LTO, WPA and LTRANS are executed within a single
execution of the compiler, after the whole program has been read into
memory.
When compiling in WHOPR mode, the callgraph is partitioned during the
WPA stage. The whole program is split into a given number of
partitions of roughly the same size. The compiler tries to minimize
the number of references which cross partition boundaries. The main
advantage of WHOPR is to allow the parallel execution of LTRANS stages,
which are the most time-consuming part of the compilation process.
Additionally, it avoids the need to load the whole program into memory.
24.2 LTO file sections
======================
LTO information is stored in several ELF sections inside object files.
Data structures and enum codes for sections are defined in
`lto-streamer.h'.
These sections are emitted from `lto-streamer-out.c' and mapped in all
at once from `lto/lto.c':`lto_file_read'. The individual functions
dealing with the reading/writing of each section are described below.
* Command line options (`.gnu.lto_.opts')
This section contains the command line options used to generate the
object files. This is used at link time to determine the
optimization level and other settings when they are not explicitly
specified at the linker command line.
Currently, GCC does not support combining LTO object files compiled
with different set of the command line options into a single
binary. At link time, the options given on the command line and
the options saved on all the files in a link-time set are applied
globally. No attempt is made at validating the combination of
flags (other than the usual validation done by option processing).
This is implemented in `lto/lto.c':`lto_read_all_file_options'.
* Symbol table (`.gnu.lto_.symtab')
This table replaces the ELF symbol table for functions and
variables represented in the LTO IL. Symbols used and exported by
the optimized assembly code of "fat" objects might not match the
ones used and exported by the intermediate code. This table is
necessary because the intermediate code is less optimized and thus
requires a separate symbol table.
Additionally, the binary code in the "fat" object will lack a call
to a function, since the call was optimized out at compilation time
after the intermediate language was streamed out. In some special
cases, the same optimization may not happen during link-time
optimization. This would lead to an undefined symbol if only one
symbol table was used.
The symbol table is emitted in
`lto-streamer-out.c':`produce_symtab'.
* Global declarations and types (`.gnu.lto_.decls')
This section contains an intermediate language dump of all
declarations and types required to represent the callgraph, static
variables and top-level debug info.
The contents of this section are emitted in
`lto-streamer-out.c':`produce_asm_for_decls'. Types and symbols
are emitted in a topological order that preserves the sharing of
pointers when the file is read back in
(`lto.c':`read_cgraph_and_symbols').
* The callgraph (`.gnu.lto_.cgraph')
This section contains the basic data structure used by the GCC
inter-procedural optimization infrastructure. This section stores
an annotated multi-graph which represents the functions and call
sites as well as the variables, aliases and top-level `asm'
statements.
This section is emitted in `lto-streamer-out.c':`output_cgraph'
and read in `lto-cgraph.c':`input_cgraph'.
* IPA references (`.gnu.lto_.refs')
This section contains references between function and static
variables. It is emitted by `lto-cgraph.c':`output_refs' and read
by `lto-cgraph.c':`input_refs'.
* Function bodies (`.gnu.lto_.function_body.<name>')
This section contains function bodies in the intermediate language
representation. Every function body is in a separate section to
allow copying of the section independently to different object
files or reading the function on demand.
Functions are emitted in `lto-streamer-out.c':`output_function'
and read in `lto-streamer-in.c':`input_function'.
* Static variable initializers (`.gnu.lto_.vars')
This section contains all the symbols in the global variable pool.
It is emitted by `lto-cgraph.c':`output_varpool' and read in
`lto-cgraph.c':`input_cgraph'.
* Summaries and optimization summaries used by IPA passes
(`.gnu.lto_.<xxx>', where `<xxx>' is one of `jmpfuncs',
`pureconst' or `reference')
These sections are used by IPA passes that need to emit summary
information during LTO generation to be read and aggregated at
link time. Each pass is responsible for implementing two pass
manager hooks: one for writing the summary and another for reading
it in. The format of these sections is entirely up to each
individual pass. The only requirement is that the writer and
reader hooks agree on the format.
24.3 Using summary information in IPA passes
============================================
Programs are represented internally as a _callgraph_ (a multi-graph
where nodes are functions and edges are call sites) and a _varpool_ (a
list of static and external variables in the program).
The inter-procedural optimization is organized as a sequence of
individual passes, which operate on the callgraph and the varpool. To
make the implementation of WHOPR possible, every inter-procedural
optimization pass is split into several stages that are executed at
different times during WHOPR compilation:
* LGEN time
1. _Generate summary_ (`generate_summary' in `struct
ipa_opt_pass_d'). This stage analyzes every function body
and variable initializer is examined and stores relevant
information into a pass-specific data structure.
2. _Write summary_ (`write_summary' in `struct ipa_opt_pass_d').
This stage writes all the pass-specific information generated
by `generate_summary'. Summaries go into their own
`LTO_section_*' sections that have to be declared in
`lto-streamer.h':`enum lto_section_type'. A new section is
created by calling `create_output_block' and data can be
written using the `lto_output_*' routines.
* WPA time
1. _Read summary_ (`read_summary' in `struct ipa_opt_pass_d').
This stage reads all the pass-specific information in exactly
the same order that it was written by `write_summary'.
2. _Execute_ (`execute' in `struct opt_pass'). This performs
inter-procedural propagation. This must be done without
actual access to the individual function bodies or variable
initializers. Typically, this results in a transitive
closure operation over the summary information of all the
nodes in the callgraph.
3. _Write optimization summary_ (`write_optimization_summary' in
`struct ipa_opt_pass_d'). This writes the result of the
inter-procedural propagation into the object file. This can
use the same data structures and helper routines used in
`write_summary'.
* LTRANS time
1. _Read optimization summary_ (`read_optimization_summary' in
`struct ipa_opt_pass_d'). The counterpart to
`write_optimization_summary'. This reads the interprocedural
optimization decisions in exactly the same format emitted by
`write_optimization_summary'.
2. _Transform_ (`function_transform' and `variable_transform' in
`struct ipa_opt_pass_d'). The actual function bodies and
variable initializers are updated based on the information
passed down from the _Execute_ stage.
The implementation of the inter-procedural passes are shared between
LTO, WHOPR and classic non-LTO compilation.
* During the traditional file-by-file mode every pass executes its
own _Generate summary_, _Execute_, and _Transform_ stages within
the single execution context of the compiler.
* In LTO compilation mode, every pass uses _Generate summary_ and
_Write summary_ stages at compilation time, while the _Read
summary_, _Execute_, and _Transform_ stages are executed at link
time.
* In WHOPR mode all stages are used.
To simplify development, the GCC pass manager differentiates between
normal inter-procedural passes and small inter-procedural passes. A
_small inter-procedural pass_ (`SIMPLE_IPA_PASS') is a pass that does
everything at once and thus it can not be executed during WPA in WHOPR
mode. It defines only the _Execute_ stage and during this stage it
accesses and modifies the function bodies. Such passes are useful for
optimization at LGEN or LTRANS time and are used, for example, to
implement early optimization before writing object files. The simple
inter-procedural passes can also be used for easier prototyping and
development of a new inter-procedural pass.
24.3.1 Virtual clones
---------------------
One of the main challenges of introducing the WHOPR compilation mode
was addressing the interactions between optimization passes. In LTO
compilation mode, the passes are executed in a sequence, each of which
consists of analysis (or _Generate summary_), propagation (or
_Execute_) and _Transform_ stages. Once the work of one pass is
finished, the next pass sees the updated program representation and can
execute. This makes the individual passes dependent on each other.
In WHOPR mode all passes first execute their _Generate summary_ stage.
Then summary writing marks the end of the LGEN stage. At WPA time, the
summaries are read back into memory and all passes run the _Execute_
stage. Optimization summaries are streamed and sent to LTRANS, where
all the passes execute the _Transform_ stage.
Most optimization passes split naturally into analysis, propagation
and transformation stages. But some do not. The main problem arises
when one pass performs changes and the following pass gets confused by
seeing different callgraphs between the _Transform_ stage and the
_Generate summary_ or _Execute_ stage. This means that the passes are
required to communicate their decisions with each other.
To facilitate this communication, the GCC callgraph infrastructure
implements _virtual clones_, a method of representing the changes
performed by the optimization passes in the callgraph without needing
to update function bodies.
A _virtual clone_ in the callgraph is a function that has no
associated body, just a description of how to create its body based on
a different function (which itself may be a virtual clone).
The description of function modifications includes adjustments to the
function's signature (which allows, for example, removing or adding
function arguments), substitutions to perform on the function body,
and, for inlined functions, a pointer to the function that it will be
inlined into.
It is also possible to redirect any edge of the callgraph from a
function to its virtual clone. This implies updating of the call site
to adjust for the new function signature.
Most of the transformations performed by inter-procedural
optimizations can be represented via virtual clones. For instance, a
constant propagation pass can produce a virtual clone of the function
which replaces one of its arguments by a constant. The inliner can
represent its decisions by producing a clone of a function whose body
will be later integrated into a given function.
Using _virtual clones_, the program can be easily updated during the
_Execute_ stage, solving most of pass interactions problems that would
otherwise occur during _Transform_.
Virtual clones are later materialized in the LTRANS stage and turned
into real functions. Passes executed after the virtual clone were
introduced also perform their _Transform_ stage on new functions, so
for a pass there is no significant difference between operating on a
real function or a virtual clone introduced before its _Execute_ stage.
Optimization passes then work on virtual clones introduced before
their _Execute_ stage as if they were real functions. The only
difference is that clones are not visible during the _Generate Summary_
stage.
To keep function summaries updated, the callgraph interface allows an
optimizer to register a callback that is called every time a new clone
is introduced as well as when the actual function or variable is
generated or when a function or variable is removed. These hooks are
registered in the _Generate summary_ stage and allow the pass to keep
its information intact until the _Execute_ stage. The same hooks can
also be registered during the _Execute_ stage to keep the optimization
summaries updated for the _Transform_ stage.
24.3.2 IPA references
---------------------
GCC represents IPA references in the callgraph. For a function or
variable `A', the _IPA reference_ is a list of all locations where the
address of `A' is taken and, when `A' is a variable, a list of all
direct stores and reads to/from `A'. References represent an oriented
multi-graph on the union of nodes of the callgraph and the varpool. See
`ipa-reference.c':`ipa_reference_write_optimization_summary' and
`ipa-reference.c':`ipa_reference_read_optimization_summary' for details.
24.3.3 Jump functions
---------------------
Suppose that an optimization pass sees a function `A' and it knows the
values of (some of) its arguments. The _jump function_ describes the
value of a parameter of a given function call in function `A' based on
this knowledge.
Jump functions are used by several optimizations, such as the
inter-procedural constant propagation pass and the devirtualization
pass. The inliner also uses jump functions to perform inlining of
callbacks.
24.4 Whole program assumptions, linker plugin and symbol visibilities
=====================================================================
Link-time optimization gives relatively minor benefits when used alone.
The problem is that propagation of inter-procedural information does
not work well across functions and variables that are called or
referenced by other compilation units (such as from a dynamically
linked library). We say that such functions are variables are
_externally visible_.
To make the situation even more difficult, many applications organize
themselves as a set of shared libraries, and the default ELF visibility
rules allow one to overwrite any externally visible symbol with a
different symbol at runtime. This basically disables any optimizations
across such functions and variables, because the compiler cannot be
sure that the function body it is seeing is the same function body that
will be used at runtime. Any function or variable not declared
`static' in the sources degrades the quality of inter-procedural
optimization.
To avoid this problem the compiler must assume that it sees the whole
program when doing link-time optimization. Strictly speaking, the
whole program is rarely visible even at link-time. Standard system
libraries are usually linked dynamically or not provided with the
link-time information. In GCC, the whole program option
(`-fwhole-program') asserts that every function and variable defined in
the current compilation unit is static, except for function `main'
(note: at link time, the current unit is the union of all objects
compiled with LTO). Since some functions and variables need to be
referenced externally, for example by another DSO or from an assembler
file, GCC also provides the function and variable attribute
`externally_visible' which can be used to disable the effect of
`-fwhole-program' on a specific symbol.
The whole program mode assumptions are slightly more complex in C++,
where inline functions in headers are put into _COMDAT_ sections.
COMDAT function and variables can be defined by multiple object files
and their bodies are unified at link-time and dynamic link-time.
COMDAT functions are changed to local only when their address is not
taken and thus un-sharing them with a library is not harmful. COMDAT
variables always remain externally visible, however for readonly
variables it is assumed that their initializers cannot be overwritten
by a different value.
GCC provides the function and variable attribute `visibility' that can
be used to specify the visibility of externally visible symbols (or
alternatively an `-fdefault-visibility' command line option). ELF
defines the `default', `protected', `hidden' and `internal'
visibilities.
The most commonly used is visibility is `hidden'. It specifies that
the symbol cannot be referenced from outside of the current shared
library. Unfortunately, this information cannot be used directly by
the link-time optimization in the compiler since the whole shared
library also might contain non-LTO objects and those are not visible to
the compiler.
GCC solves this problem using linker plugins. A _linker plugin_ is an
interface to the linker that allows an external program to claim the
ownership of a given object file. The linker then performs the linking
procedure by querying the plugin about the symbol table of the claimed
objects and once the linking decisions are complete, the plugin is
allowed to provide the final object file before the actual linking is
made. The linker plugin obtains the symbol resolution information
which specifies which symbols provided by the claimed objects are bound
from the rest of a binary being linked.
Currently, the linker plugin works only in combination with the Gold
linker, but a GNU ld implementation is under development.
GCC is designed to be independent of the rest of the toolchain and
aims to support linkers without plugin support. For this reason it
does not use the linker plugin by default. Instead, the object files
are examined by `collect2' before being passed to the linker and
objects found to have LTO sections are passed to `lto1' first. This
mode does not work for library archives. The decision on what object
files from the archive are needed depends on the actual linking and
thus GCC would have to implement the linker itself. The resolution
information is missing too and thus GCC needs to make an educated guess
based on `-fwhole-program'. Without the linker plugin GCC also assumes
that symbols are declared `hidden' and not referred by non-LTO code by
default.
24.5 Internal flags controlling `lto1'
======================================
The following flags are passed into `lto1' and are not meant to be used
directly from the command line.
* -fwpa This option runs the serial part of the link-time optimizer
performing the inter-procedural propagation (WPA mode). The
compiler reads in summary information from all inputs and performs
an analysis based on summary information only. It generates
object files for subsequent runs of the link-time optimizer where
individual object files are optimized using both summary
information from the WPA mode and the actual function bodies. It
then drives the LTRANS phase.
* -fltrans This option runs the link-time optimizer in the
local-transformation (LTRANS) mode, which reads in output from a
previous run of the LTO in WPA mode. In the LTRANS mode, LTO
optimizes an object and produces the final assembly.
* -fltrans-output-list=FILE This option specifies a file to which
the names of LTRANS output files are written. This option is only
meaningful in conjunction with `-fwpa'.
File: gccint.info, Node: Funding, Next: GNU Project, Prev: LTO, Up: Top
Funding Free Software
*********************
If you want to have more free software a few years from now, it makes
sense for you to help encourage people to contribute funds for its
development. The most effective approach known is to encourage
commercial redistributors to donate.
Users of free software systems can boost the pace of development by
encouraging for-a-fee distributors to donate part of their selling price
to free software developers--the Free Software Foundation, and others.
The way to convince distributors to do this is to demand it and expect
it from them. So when you compare distributors, judge them partly by
how much they give to free software development. Show distributors
they must compete to be the one who gives the most.
To make this approach work, you must insist on numbers that you can
compare, such as, "We will donate ten dollars to the Frobnitz project
for each disk sold." Don't be satisfied with a vague promise, such as
"A portion of the profits are donated," since it doesn't give a basis
for comparison.
Even a precise fraction "of the profits from this disk" is not very
meaningful, since creative accounting and unrelated business decisions
can greatly alter what fraction of the sales price counts as profit.
If the price you pay is $50, ten percent of the profit is probably less
than a dollar; it might be a few cents, or nothing at all.
Some redistributors do development work themselves. This is useful
too; but to keep everyone honest, you need to inquire how much they do,
and what kind. Some kinds of development make much more long-term
difference than others. For example, maintaining a separate version of
a program contributes very little; maintaining the standard version of a
program for the whole community contributes much. Easy new ports
contribute little, since someone else would surely do them; difficult
ports such as adding a new CPU to the GNU Compiler Collection
contribute more; major new features or packages contribute the most.
By establishing the idea that supporting further development is "the
proper thing to do" when distributing free software for a fee, we can
assure a steady flow of resources into making more free software.
Copyright (C) 1994 Free Software Foundation, Inc.
Verbatim copying and redistribution of this section is permitted
without royalty; alteration is not permitted.
File: gccint.info, Node: GNU Project, Next: Copying, Prev: Funding, Up: Top
The GNU Project and GNU/Linux
*****************************
The GNU Project was launched in 1984 to develop a complete Unix-like
operating system which is free software: the GNU system. (GNU is a
recursive acronym for "GNU's Not Unix"; it is pronounced "guh-NEW".)
Variants of the GNU operating system, which use the kernel Linux, are
now widely used; though these systems are often referred to as "Linux",
they are more accurately called GNU/Linux systems.
For more information, see:
`http://www.gnu.org/'
`http://www.gnu.org/gnu/linux-and-gnu.html'
File: gccint.info, Node: Copying, Next: GNU Free Documentation License, Prev: GNU Project, Up: Top
GNU General Public License
**************************
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/'
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Preamble
========
The GNU General Public License is a free, copyleft license for software
and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program-to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you
have certain responsibilities if you distribute copies of the software,
or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the
manufacturer can do so. This is fundamentally incompatible with the
aim of protecting users' freedom to change the software. The
systematic pattern of such abuse occurs in the area of products for
individuals to use, which is precisely where it is most unacceptable.
Therefore, we have designed this version of the GPL to prohibit the
practice for those products. If such problems arise substantially in
other domains, we stand ready to extend this provision to those domains
in future versions of the GPL, as needed to protect the freedom of
users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
====================
0. Definitions.
"This License" refers to version 3 of the GNU General Public
License.
"Copyright" also means copyright-like laws that apply to other
kinds of works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the
work in a fashion requiring copyright permission, other than the
making of an exact copy. The resulting work is called a "modified
version" of the earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work
based on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it
on a computer or modifying a private copy. Propagation includes
copying, distribution (with or without modification), making
available to the public, and in some countries other activities as
well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user
through a computer network, with no transfer of a copy, is not
conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to
the extent that warranties are provided), that licensees may
convey the work under this License, and how to view a copy of this
License. If the interface presents a list of user commands or
options, such as a menu, a prominent item in the list meets this
criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any
non-source form of a work.
A "Standard Interface" means an interface that either is an
official standard defined by a recognized standards body, or, in
the case of interfaces specified for a particular programming
language, one that is widely used among developers working in that
language.
The "System Libraries" of an executable work include anything,
other than the work as a whole, that (a) is included in the normal
form of packaging a Major Component, but which is not part of that
Major Component, and (b) serves only to enable use of the work
with that Major Component, or to implement a Standard Interface
for which an implementation is available to the public in source
code form. A "Major Component", in this context, means a major
essential component (kernel, window system, and so on) of the
specific operating system (if any) on which the executable work
runs, or a compiler used to produce the work, or an object code
interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including
scripts to control those activities. However, it does not include
the work's System Libraries, or general-purpose tools or generally
available free programs which are used unmodified in performing
those activities but which are not part of the work. For example,
Corresponding Source includes interface definition files
associated with source files for the work, and the source code for
shared libraries and dynamically linked subprograms that the work
is specifically designed to require, such as by intimate data
communication or control flow between those subprograms and other
parts of the work.
The Corresponding Source need not include anything that users can
regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running
a covered work is covered by this License only if the output,
given its content, constitutes a covered work. This License
acknowledges your rights of fair use or other equivalent, as
provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise
remains in force. You may convey covered works to others for the
sole purpose of having them make modifications exclusively for
you, or provide you with facilities for running those works,
provided that you comply with the terms of this License in
conveying all material for which you do not control copyright.
Those thus making or running the covered works for you must do so
exclusively on your behalf, under your direction and control, on
terms that prohibit them from making any copies of your
copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section
10 makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under
article 11 of the WIPO copyright treaty adopted on 20 December
1996, or similar laws prohibiting or restricting circumvention of
such measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such
circumvention is effected by exercising rights under this License
with respect to the covered work, and you disclaim any intention
to limit operation or modification of the work as a means of
enforcing, against the work's users, your or third parties' legal
rights to forbid circumvention of technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the
code; keep intact all notices of the absence of any warranty; and
give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these
conditions:
a. The work must carry prominent notices stating that you
modified it, and giving a relevant date.
b. The work must carry prominent notices stating that it is
released under this License and any conditions added under
section 7. This requirement modifies the requirement in
section 4 to "keep intact all notices".
c. You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable
section 7 additional terms, to the whole of the work, and all
its parts, regardless of how they are packaged. This License
gives no permission to license the work in any other way, but
it does not invalidate such permission if you have separately
received it.
d. If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has
interactive interfaces that do not display Appropriate Legal
Notices, your work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered
work, and which are not combined with it such as to form a larger
program, in or on a volume of a storage or distribution medium, is
called an "aggregate" if the compilation and its resulting
copyright are not used to limit the access or legal rights of the
compilation's users beyond what the individual works permit.
Inclusion of a covered work in an aggregate does not cause this
License to apply to the other parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this
License, in one of these ways:
a. Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b. Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for
as long as you offer spare parts or customer support for that
product model, to give anyone who possesses the object code
either (1) a copy of the Corresponding Source for all the
software in the product that is covered by this License, on a
durable physical medium customarily used for software
interchange, for a price no more than your reasonable cost of
physically performing this conveying of source, or (2) access
to copy the Corresponding Source from a network server at no
charge.
c. Convey individual copies of the object code with a copy of
the written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially,
and only if you received the object code with such an offer,
in accord with subsection 6b.
d. Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access
to the Corresponding Source in the same way through the same
place at no further charge. You need not require recipients
to copy the Corresponding Source along with the object code.
If the place to copy the object code is a network server, the
Corresponding Source may be on a different server (operated
by you or a third party) that supports equivalent copying
facilities, provided you maintain clear directions next to
the object code saying where to find the Corresponding Source.
Regardless of what server hosts the Corresponding Source, you
remain obligated to ensure that it is available for as long
as needed to satisfy these requirements.
e. Convey the object code using peer-to-peer transmission,
provided you inform other peers where the object code and
Corresponding Source of the work are being offered to the
general public at no charge under subsection 6d.
A separable portion of the object code, whose source code is
excluded from the Corresponding Source as a System Library, need
not be included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means
any tangible personal property which is normally used for personal,
family, or household purposes, or (2) anything designed or sold for
incorporation into a dwelling. In determining whether a product
is a consumer product, doubtful cases shall be resolved in favor of
coverage. For a particular product received by a particular user,
"normally used" refers to a typical or common use of that class of
product, regardless of the status of the particular user or of the
way in which the particular user actually uses, or expects or is
expected to use, the product. A product is a consumer product
regardless of whether the product has substantial commercial,
industrial or non-consumer uses, unless such uses represent the
only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to
install and execute modified versions of a covered work in that
User Product from a modified version of its Corresponding Source.
The information must suffice to ensure that the continued
functioning of the modified object code is in no case prevented or
interfered with solely because modification has been made.
If you convey an object code work under this section in, or with,
or specifically for use in, a User Product, and the conveying
occurs as part of a transaction in which the right of possession
and use of the User Product is transferred to the recipient in
perpetuity or for a fixed term (regardless of how the transaction
is characterized), the Corresponding Source conveyed under this
section must be accompanied by the Installation Information. But
this requirement does not apply if neither you nor any third party
retains the ability to install modified object code on the User
Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not
include a requirement to continue to provide support service,
warranty, or updates for a work that has been modified or
installed by the recipient, or for the User Product in which it
has been modified or installed. Access to a network may be denied
when the modification itself materially and adversely affects the
operation of the network or violates the rules and protocols for
communication across the network.
Corresponding Source conveyed, and Installation Information
provided, in accord with this section must be in a format that is
publicly documented (and with an implementation available to the
public in source code form), and must require no special password
or key for unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of
this License by making exceptions from one or more of its
conditions. Additional permissions that are applicable to the
entire Program shall be treated as though they were included in
this License, to the extent that they are valid under applicable
law. If additional permissions apply only to part of the Program,
that part may be used separately under those permissions, but the
entire Program remains governed by this License without regard to
the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part
of it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material
you add to a covered work, you may (if authorized by the copyright
holders of that material) supplement the terms of this License
with terms:
a. Disclaiming warranty or limiting liability differently from
the terms of sections 15 and 16 of this License; or
b. Requiring preservation of specified reasonable legal notices
or author attributions in that material or in the Appropriate
Legal Notices displayed by works containing it; or
c. Prohibiting misrepresentation of the origin of that material,
or requiring that modified versions of such material be
marked in reasonable ways as different from the original
version; or
d. Limiting the use for publicity purposes of names of licensors
or authors of the material; or
e. Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f. Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified
versions of it) with contractual assumptions of liability to
the recipient, for any liability that these contractual
assumptions directly impose on those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as
you received it, or any part of it, contains a notice stating that
it is governed by this License along with a term that is a further
restriction, you may remove that term. If a license document
contains a further restriction but permits relicensing or
conveying under this License, you may add to a covered work
material governed by the terms of that license document, provided
that the further restriction does not survive such relicensing or
conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in
the form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights
under this License (including any patent licenses granted under
the third paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly
and finally terminates your license, and (b) permanently, if the
copyright holder fails to notify you of the violation by some
reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from
that copyright holder, and you cure the violation prior to 30 days
after your receipt of the notice.
Termination of your rights under this section does not terminate
the licenses of parties who have received copies or rights from
you under this License. If your rights have been terminated and
not permanently reinstated, you do not qualify to receive new
licenses for the same material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer
transmission to receive a copy likewise does not require
acceptance. However, nothing other than this License grants you
permission to propagate or modify any covered work. These actions
infringe copyright if you do not accept this License. Therefore,
by modifying or propagating a covered work, you indicate your
acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not
responsible for enforcing compliance by third parties with this
License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a
covered work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or
could give under the previous paragraph, plus a right to
possession of the Corresponding Source of the work from the
predecessor in interest, if the predecessor has it or can get it
with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you
may not impose a license fee, royalty, or other charge for
exercise of rights granted under this License, and you may not
initiate litigation (including a cross-claim or counterclaim in a
lawsuit) alleging that any patent claim is infringed by making,
using, selling, offering for sale, or importing the Program or any
portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.
The work thus licensed is called the contributor's "contributor
version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner,
permitted by this License, of making, using, or selling its
contributor version, but do not include claims that would be
infringed only as a consequence of further modification of the
contributor version. For purposes of this definition, "control"
includes the right to grant patent sublicenses in a manner
consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide,
royalty-free patent license under the contributor's essential
patent claims, to make, use, sell, offer for sale, import and
otherwise run, modify and propagate the contents of its
contributor version.
In the following three paragraphs, a "patent license" is any
express agreement or commitment, however denominated, not to
enforce a patent (such as an express permission to practice a
patent or covenant not to sue for patent infringement). To
"grant" such a patent license to a party means to make such an
agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent
license, and the Corresponding Source of the work is not available
for anyone to copy, free of charge and under the terms of this
License, through a publicly available network server or other
readily accessible means, then you must either (1) cause the
Corresponding Source to be so available, or (2) arrange to deprive
yourself of the benefit of the patent license for this particular
work, or (3) arrange, in a manner consistent with the requirements
of this License, to extend the patent license to downstream
recipients. "Knowingly relying" means you have actual knowledge
that, but for the patent license, your conveying the covered work
in a country, or your recipient's use of the covered work in a
country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate,
modify or convey a specific copy of the covered work, then the
patent license you grant is automatically extended to all
recipients of the covered work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that
are specifically granted under this License. You may not convey a
covered work if you are a party to an arrangement with a third
party that is in the business of distributing software, under
which you make payment to the third party based on the extent of
your activity of conveying the work, and under which the third
party grants, to any of the parties who would receive the covered
work from you, a discriminatory patent license (a) in connection
with copies of the covered work conveyed by you (or copies made
from those copies), or (b) primarily for and in connection with
specific products or compilations that contain the covered work,
unless you entered into that arrangement, or that patent license
was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order,
agreement or otherwise) that contradict the conditions of this
License, they do not excuse you from the conditions of this
License. If you cannot convey a covered work so as to satisfy
simultaneously your obligations under this License and any other
pertinent obligations, then as a consequence you may not convey it
at all. For example, if you agree to terms that obligate you to
collect a royalty for further conveying from those to whom you
convey the Program, the only way you could satisfy both those
terms and this License would be to refrain entirely from conveying
the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a
single combined work, and to convey the resulting work. The terms
of this License will continue to apply to the part which is the
covered work, but the special requirements of the GNU Affero
General Public License, section 13, concerning interaction through
a network will apply to the combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new
versions of the GNU General Public License from time to time.
Such new versions will be similar in spirit to the present
version, but may differ in detail to address new problems or
concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU
General Public License "or any later version" applies to it, you
have the option of following the terms and conditions either of
that numbered version or of any later version published by the
Free Software Foundation. If the Program does not specify a
version number of the GNU General Public License, you may choose
any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that
proxy's public statement of acceptance of a version permanently
authorizes you to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
THE POSSIBILITY OF SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely
approximates an absolute waiver of all civil liability in
connection with the Program, unless a warranty or assumption of
liability accompanies a copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
===========================
How to Apply These Terms to Your New Programs
=============================================
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
Copyright (C) YEAR NAME OF AUTHOR
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see `http://www.gnu.org/licenses/'.
Also add information on how to contact you by electronic and paper
mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
PROGRAM Copyright (C) YEAR NAME OF AUTHOR
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License. Of course, your
program's commands might be different; for a GUI interface, you would
use an "about box".
You should also get your employer (if you work as a programmer) or
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. For more information on this, and how to apply and follow
the GNU GPL, see `http://www.gnu.org/licenses/'.
The GNU General Public License does not permit incorporating your
program into proprietary programs. If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library. If this is what you want to do, use the
GNU Lesser General Public License instead of this License. But first,
please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.
File: gccint.info, Node: GNU Free Documentation License, Next: Contributors, Prev: Copying, Up: Top
GNU Free Documentation License
******************************
Version 1.3, 3 November 2008
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
`http://fsf.org/'
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or
noncommercially. Secondarily, this License preserves for the
author and publisher a way to get credit for their work, while not
being considered responsible for modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.
It complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for
free software, because free software needs free documentation: a
free program should come with manuals providing the same freedoms
that the software does. But this License is not limited to
software manuals; it can be used for any textual work, regardless
of subject matter or whether it is published as a printed book.
We recommend this License principally for works whose purpose is
instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium,
that contains a notice placed by the copyright holder saying it
can be distributed under the terms of this License. Such a notice
grants a world-wide, royalty-free license, unlimited in duration,
to use that work under the conditions stated herein. The
"Document", below, refers to any such manual or work. Any member
of the public is a licensee, and is addressed as "you". You
accept the license if you copy, modify or distribute the work in a
way requiring permission under copyright law.
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could
fall directly within that overall subject. (Thus, if the Document
is in part a textbook of mathematics, a Secondary Section may not
explain any mathematics.) The relationship could be a matter of
historical connection with the subject or with related matters, or
of legal, commercial, philosophical, ethical or political position
regarding them.
The "Invariant Sections" are certain Secondary Sections whose
titles are designated, as being those of Invariant Sections, in
the notice that says that the Document is released under this
License. If a section does not fit the above definition of
Secondary then it is not allowed to be designated as Invariant.
The Document may contain zero Invariant Sections. If the Document
does not identify any Invariant Sections then there are none.
The "Cover Texts" are certain short passages of text that are
listed, as Front-Cover Texts or Back-Cover Texts, in the notice
that says that the Document is released under this License. A
Front-Cover Text may be at most 5 words, and a Back-Cover Text may
be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images
composed of pixels) generic paint programs or (for drawings) some
widely available drawing editor, and that is suitable for input to
text formatters or for automatic translation to a variety of
formats suitable for input to text formatters. A copy made in an
otherwise Transparent file format whose markup, or absence of
markup, has been arranged to thwart or discourage subsequent
modification by readers is not Transparent. An image format is
not Transparent if used for any substantial amount of text. A
copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format,
SGML or XML using a publicly available DTD, and
standard-conforming simple HTML, PostScript or PDF designed for
human modification. Examples of transparent image formats include
PNG, XCF and JPG. Opaque formats include proprietary formats that
can be read and edited only by proprietary word processors, SGML or
XML for which the DTD and/or processing tools are not generally
available, and the machine-generated HTML, PostScript or PDF
produced by some word processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the
material this License requires to appear in the title page. For
works in formats which do not have any title page as such, "Title
Page" means the text near the most prominent appearance of the
work's title, preceding the beginning of the body of the text.
The "publisher" means any person or entity that distributes copies
of the Document to the public.
A section "Entitled XYZ" means a named subunit of the Document
whose title either is precisely XYZ or contains XYZ in parentheses
following text that translates XYZ in another language. (Here XYZ
stands for a specific section name mentioned below, such as
"Acknowledgements", "Dedications", "Endorsements", or "History".)
To "Preserve the Title" of such a section when you modify the
Document means that it remains a section "Entitled XYZ" according
to this definition.
The Document may include Warranty Disclaimers next to the notice
which states that this License applies to the Document. These
Warranty Disclaimers are considered to be included by reference in
this License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and
has no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License
applies to the Document are reproduced in all copies, and that you
add no other conditions whatsoever to those of this License. You
may not use technical measures to obstruct or control the reading
or further copying of the copies you make or distribute. However,
you may accept compensation in exchange for copies. If you
distribute a large enough number of copies you must also follow
the conditions in section 3.
You may also lend copies, under the same conditions stated above,
and you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly
have printed covers) of the Document, numbering more than 100, and
the Document's license notice requires Cover Texts, you must
enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and
Back-Cover Texts on the back cover. Both covers must also clearly
and legibly identify you as the publisher of these copies. The
front cover must present the full title with all words of the
title equally prominent and visible. You may add other material
on the covers in addition. Copying with changes limited to the
covers, as long as they preserve the title of the Document and
satisfy these conditions, can be treated as verbatim copying in
other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto
adjacent pages.
If you publish or distribute Opaque copies of the Document
numbering more than 100, you must either include a
machine-readable Transparent copy along with each Opaque copy, or
state in or with each Opaque copy a computer-network location from
which the general network-using public has access to download
using public-standard network protocols a complete Transparent
copy of the Document, free of added material. If you use the
latter option, you must take reasonably prudent steps, when you
begin distribution of Opaque copies in quantity, to ensure that
this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you
distribute an Opaque copy (directly or through your agents or
retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of
the Document well before redistributing any large number of
copies, to give them a chance to provide you with an updated
version of the Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document
under the conditions of sections 2 and 3 above, provided that you
release the Modified Version under precisely this License, with
the Modified Version filling the role of the Document, thus
licensing distribution and modification of the Modified Version to
whoever possesses a copy of it. In addition, you must do these
things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title
distinct from that of the Document, and from those of
previous versions (which should, if there were any, be listed
in the History section of the Document). You may use the
same title as a previous version if the original publisher of
that version gives permission.
B. List on the Title Page, as authors, one or more persons or
entities responsible for authorship of the modifications in
the Modified Version, together with at least five of the
principal authors of the Document (all of its principal
authors, if it has fewer than five), unless they release you
from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license
notice giving the public permission to use the Modified
Version under the terms of this License, in the form shown in
the Addendum below.
G. Preserve in that license notice the full lists of Invariant
Sections and required Cover Texts given in the Document's
license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title,
and add to it an item stating at least the title, year, new
authors, and publisher of the Modified Version as given on
the Title Page. If there is no section Entitled "History" in
the Document, create one stating the title, year, authors,
and publisher of the Document as given on its Title Page,
then add an item describing the Modified Version as stated in
the previous sentence.
J. Preserve the network location, if any, given in the Document
for public access to a Transparent copy of the Document, and
likewise the network locations given in the Document for
previous versions it was based on. These may be placed in
the "History" section. You may omit a network location for a
work that was published at least four years before the
Document itself, or if the original publisher of the version
it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
Preserve the Title of the section, and preserve in the
section all the substance and tone of each of the contributor
acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section
titles.
M. Delete any section Entitled "Endorsements". Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled
"Endorsements" or to conflict in title with any Invariant
Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no
material copied from the Document, you may at your option
designate some or all of these sections as invariant. To do this,
add their titles to the list of Invariant Sections in the Modified
Version's license notice. These titles must be distinct from any
other section titles.
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text
has been approved by an organization as the authoritative
definition of a standard.
You may add a passage of up to five words as a Front-Cover Text,
and a passage of up to 25 words as a Back-Cover Text, to the end
of the list of Cover Texts in the Modified Version. Only one
passage of Front-Cover Text and one of Back-Cover Text may be
added by (or through arrangements made by) any one entity. If the
Document already includes a cover text for the same cover,
previously added by you or by arrangement made by the same entity
you are acting on behalf of, you may not add another; but you may
replace the old one, on explicit permission from the previous
publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this
License give permission to use their names for publicity for or to
assert or imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under
this License, under the terms defined in section 4 above for
modified versions, provided that you include in the combination
all of the Invariant Sections of all of the original documents,
unmodified, and list them all as Invariant Sections of your
combined work in its license notice, and that you preserve all
their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name
but different contents, make the title of each such section unique
by adding at the end of it, in parentheses, the name of the
original author or publisher of that section if known, or else a
unique number. Make the same adjustment to the section titles in
the list of Invariant Sections in the license notice of the
combined work.
In the combination, you must combine any sections Entitled
"History" in the various original documents, forming one section
Entitled "History"; likewise combine any sections Entitled
"Acknowledgements", and any sections Entitled "Dedications". You
must delete all sections Entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the
rules of this License for verbatim copying of each of the
documents in all other respects.
You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert
a copy of this License into the extracted document, and follow
this License in all other respects regarding verbatim copying of
that document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other
separate and independent documents or works, in or on a volume of
a storage or distribution medium, is called an "aggregate" if the
copyright resulting from the compilation is not used to limit the
legal rights of the compilation's users beyond what the individual
works permit. When the Document is included in an aggregate, this
License does not apply to the other works in the aggregate which
are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half
of the entire aggregate, the Document's Cover Texts may be placed
on covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic
form. Otherwise they must appear on printed covers that bracket
the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section
4. Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also
include the original English version of this License and the
original versions of those notices and disclaimers. In case of a
disagreement between the translation and the original version of
this License or a notice or disclaimer, the original version will
prevail.
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to
Preserve its Title (section 1) will typically require changing the
actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense, or distribute it is void,
and will automatically terminate your rights under this License.
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly
and finally terminates your license, and (b) permanently, if the
copyright holder fails to notify you of the violation by some
reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from
that copyright holder, and you cure the violation prior to 30 days
after your receipt of the notice.
Termination of your rights under this section does not terminate
the licenses of parties who have received copies or rights from
you under this License. If your rights have been terminated and
not permanently reinstated, receipt of a copy of some or all of
the same material does not give you any rights to use it.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of
the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
`http://www.gnu.org/copyleft/'.
Each version of the License is given a distinguishing version
number. If the Document specifies that a particular numbered
version of this License "or any later version" applies to it, you
have the option of following the terms and conditions either of
that specified version or of any later version that has been
published (not as a draft) by the Free Software Foundation. If
the Document does not specify a version number of this License,
you may choose any version ever published (not as a draft) by the
Free Software Foundation. If the Document specifies that a proxy
can decide which future versions of this License can be used, that
proxy's public statement of acceptance of a version permanently
authorizes you to choose that version for the Document.
11. RELICENSING
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server.
A "Massive Multiauthor Collaboration" (or "MMC") contained in the
site means any set of copyrightable works thus published on the MMC
site.
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
"Incorporate" means to publish or republish a Document, in whole or
in part, as part of another Document.
An MMC is "eligible for relicensing" if it is licensed under this
License, and if all works that were first published under this
License somewhere other than this MMC, and subsequently
incorporated in whole or in part into the MMC, (1) had no cover
texts or invariant sections, and (2) were thus incorporated prior
to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the
site under CC-BY-SA on the same site at any time before August 1,
2009, provided the MMC is eligible for relicensing.
ADDENDUM: How to use this License for your documents
====================================================
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:
Copyright (C) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:
with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License, to
permit their use in free software.
File: gccint.info, Node: Contributors, Next: Option Index, Prev: GNU Free Documentation License, Up: Top
Contributors to GCC
*******************
The GCC project would like to thank its many contributors. Without
them the project would not have been nearly as successful as it has
been. Any omissions in this list are accidental. Feel free to contact
<law@redhat.com> or <gerald@pfeifer.com> if you have been left out or
some of your contributions are not listed. Please keep this list in
alphabetical order.
* Analog Devices helped implement the support for complex data types
and iterators.
* John David Anglin for threading-related fixes and improvements to
libstdc++-v3, and the HP-UX port.
* James van Artsdalen wrote the code that makes efficient use of the
Intel 80387 register stack.
* Abramo and Roberto Bagnara for the SysV68 Motorola 3300 Delta
Series port.
* Alasdair Baird for various bug fixes.
* Giovanni Bajo for analyzing lots of complicated C++ problem
reports.
* Peter Barada for his work to improve code generation for new
ColdFire cores.
* Gerald Baumgartner added the signature extension to the C++ front
end.
* Godmar Back for his Java improvements and encouragement.
* Scott Bambrough for help porting the Java compiler.
* Wolfgang Bangerth for processing tons of bug reports.
* Jon Beniston for his Microsoft Windows port of Java and port to
Lattice Mico32.
* Daniel Berlin for better DWARF2 support, faster/better
optimizations, improved alias analysis, plus migrating GCC to
Bugzilla.
* Geoff Berry for his Java object serialization work and various
patches.
* Uros Bizjak for the implementation of x87 math built-in functions
and for various middle end and i386 back end improvements and bug
fixes.
* Eric Blake for helping to make GCJ and libgcj conform to the
specifications.
* Janne Blomqvist for contributions to GNU Fortran.
* Segher Boessenkool for various fixes.
* Hans-J. Boehm for his garbage collector, IA-64 libffi port, and
other Java work.
* Neil Booth for work on cpplib, lang hooks, debug hooks and other
miscellaneous clean-ups.
* Steven Bosscher for integrating the GNU Fortran front end into GCC
and for contributing to the tree-ssa branch.
* Eric Botcazou for fixing middle- and backend bugs left and right.
* Per Bothner for his direction via the steering committee and
various improvements to the infrastructure for supporting new
languages. Chill front end implementation. Initial
implementations of cpplib, fix-header, config.guess, libio, and
past C++ library (libg++) maintainer. Dreaming up, designing and
implementing much of GCJ.
* Devon Bowen helped port GCC to the Tahoe.
* Don Bowman for mips-vxworks contributions.
* Dave Brolley for work on cpplib and Chill.
* Paul Brook for work on the ARM architecture and maintaining GNU
Fortran.
* Robert Brown implemented the support for Encore 32000 systems.
* Christian Bruel for improvements to local store elimination.
* Herman A.J. ten Brugge for various fixes.
* Joerg Brunsmann for Java compiler hacking and help with the GCJ
FAQ.
* Joe Buck for his direction via the steering committee.
* Craig Burley for leadership of the G77 Fortran effort.
* Stephan Buys for contributing Doxygen notes for libstdc++.
* Paolo Carlini for libstdc++ work: lots of efficiency improvements
to the C++ strings, streambufs and formatted I/O, hard detective
work on the frustrating localization issues, and keeping up with
the problem reports.
* John Carr for his alias work, SPARC hacking, infrastructure
improvements, previous contributions to the steering committee,
loop optimizations, etc.
* Stephane Carrez for 68HC11 and 68HC12 ports.
* Steve Chamberlain for support for the Renesas SH and H8 processors
and the PicoJava processor, and for GCJ config fixes.
* Glenn Chambers for help with the GCJ FAQ.
* John-Marc Chandonia for various libgcj patches.
* Denis Chertykov for contributing and maintaining the AVR port, the
first GCC port for an 8-bit architecture.
* Scott Christley for his Objective-C contributions.
* Eric Christopher for his Java porting help and clean-ups.
* Branko Cibej for more warning contributions.
* The GNU Classpath project for all of their merged runtime code.
* Nick Clifton for arm, mcore, fr30, v850, m32r, rx work, `--help',
and other random hacking.
* Michael Cook for libstdc++ cleanup patches to reduce warnings.
* R. Kelley Cook for making GCC buildable from a read-only directory
as well as other miscellaneous build process and documentation
clean-ups.
* Ralf Corsepius for SH testing and minor bug fixing.
* Stan Cox for care and feeding of the x86 port and lots of behind
the scenes hacking.
* Alex Crain provided changes for the 3b1.
* Ian Dall for major improvements to the NS32k port.
* Paul Dale for his work to add uClinux platform support to the m68k
backend.
* Dario Dariol contributed the four varieties of sample programs
that print a copy of their source.
* Russell Davidson for fstream and stringstream fixes in libstdc++.
* Bud Davis for work on the G77 and GNU Fortran compilers.
* Mo DeJong for GCJ and libgcj bug fixes.
* DJ Delorie for the DJGPP port, build and libiberty maintenance,
various bug fixes, and the M32C and MeP ports.
* Arnaud Desitter for helping to debug GNU Fortran.
* Gabriel Dos Reis for contributions to G++, contributions and
maintenance of GCC diagnostics infrastructure, libstdc++-v3,
including `valarray<>', `complex<>', maintaining the numerics
library (including that pesky `<limits>' :-) and keeping
up-to-date anything to do with numbers.
* Ulrich Drepper for his work on glibc, testing of GCC using glibc,
ISO C99 support, CFG dumping support, etc., plus support of the
C++ runtime libraries including for all kinds of C interface
issues, contributing and maintaining `complex<>', sanity checking
and disbursement, configuration architecture, libio maintenance,
and early math work.
* Zdenek Dvorak for a new loop unroller and various fixes.
* Michael Eager for his work on the Xilinx MicroBlaze port.
* Richard Earnshaw for his ongoing work with the ARM.
* David Edelsohn for his direction via the steering committee,
ongoing work with the RS6000/PowerPC port, help cleaning up Haifa
loop changes, doing the entire AIX port of libstdc++ with his bare
hands, and for ensuring GCC properly keeps working on AIX.
* Kevin Ediger for the floating point formatting of num_put::do_put
in libstdc++.
* Phil Edwards for libstdc++ work including configuration hackery,
documentation maintainer, chief breaker of the web pages, the
occasional iostream bug fix, and work on shared library symbol
versioning.
* Paul Eggert for random hacking all over GCC.
* Mark Elbrecht for various DJGPP improvements, and for libstdc++
configuration support for locales and fstream-related fixes.
* Vadim Egorov for libstdc++ fixes in strings, streambufs, and
iostreams.
* Christian Ehrhardt for dealing with bug reports.
* Ben Elliston for his work to move the Objective-C runtime into its
own subdirectory and for his work on autoconf.
* Revital Eres for work on the PowerPC 750CL port.
* Marc Espie for OpenBSD support.
* Doug Evans for much of the global optimization framework, arc,
m32r, and SPARC work.
* Christopher Faylor for his work on the Cygwin port and for caring
and feeding the gcc.gnu.org box and saving its users tons of spam.
* Fred Fish for BeOS support and Ada fixes.
* Ivan Fontes Garcia for the Portuguese translation of the GCJ FAQ.
* Peter Gerwinski for various bug fixes and the Pascal front end.
* Kaveh R. Ghazi for his direction via the steering committee,
amazing work to make `-W -Wall -W* -Werror' useful, and
continuously testing GCC on a plethora of platforms. Kaveh
extends his gratitude to the CAIP Center at Rutgers University for
providing him with computing resources to work on Free Software
since the late 1980s.
* John Gilmore for a donation to the FSF earmarked improving GNU
Java.
* Judy Goldberg for c++ contributions.
* Torbjorn Granlund for various fixes and the c-torture testsuite,
multiply- and divide-by-constant optimization, improved long long
support, improved leaf function register allocation, and his
direction via the steering committee.
* Anthony Green for his `-Os' contributions, the moxie port, and
Java front end work.
* Stu Grossman for gdb hacking, allowing GCJ developers to debug
Java code.
* Michael K. Gschwind contributed the port to the PDP-11.
* Richard Guenther for his ongoing middle-end contributions and bug
fixes and for release management.
* Ron Guilmette implemented the `protoize' and `unprotoize' tools,
the support for Dwarf symbolic debugging information, and much of
the support for System V Release 4. He has also worked heavily on
the Intel 386 and 860 support.
* Mostafa Hagog for Swing Modulo Scheduling (SMS) and post reload
GCSE.
* Bruno Haible for improvements in the runtime overhead for EH, new
warnings and assorted bug fixes.
* Andrew Haley for his amazing Java compiler and library efforts.
* Chris Hanson assisted in making GCC work on HP-UX for the 9000
series 300.
* Michael Hayes for various thankless work he's done trying to get
the c30/c40 ports functional. Lots of loop and unroll
improvements and fixes.
* Dara Hazeghi for wading through myriads of target-specific bug
reports.
* Kate Hedstrom for staking the G77 folks with an initial testsuite.
* Richard Henderson for his ongoing SPARC, alpha, ia32, and ia64
work, loop opts, and generally fixing lots of old problems we've
ignored for years, flow rewrite and lots of further stuff,
including reviewing tons of patches.
* Aldy Hernandez for working on the PowerPC port, SIMD support, and
various fixes.
* Nobuyuki Hikichi of Software Research Associates, Tokyo,
contributed the support for the Sony NEWS machine.
* Kazu Hirata for caring and feeding the Renesas H8/300 port and
various fixes.
* Katherine Holcomb for work on GNU Fortran.
* Manfred Hollstein for his ongoing work to keep the m88k alive, lots
of testing and bug fixing, particularly of GCC configury code.
* Steve Holmgren for MachTen patches.
* Jan Hubicka for his x86 port improvements.
* Falk Hueffner for working on C and optimization bug reports.
* Bernardo Innocenti for his m68k work, including merging of
ColdFire improvements and uClinux support.
* Christian Iseli for various bug fixes.
* Kamil Iskra for general m68k hacking.
* Lee Iverson for random fixes and MIPS testing.
* Andreas Jaeger for testing and benchmarking of GCC and various bug
fixes.
* Jakub Jelinek for his SPARC work and sibling call optimizations as
well as lots of bug fixes and test cases, and for improving the
Java build system.
* Janis Johnson for ia64 testing and fixes, her quality improvement
sidetracks, and web page maintenance.
* Kean Johnston for SCO OpenServer support and various fixes.
* Tim Josling for the sample language treelang based originally on
Richard Kenner's "toy" language.
* Nicolai Josuttis for additional libstdc++ documentation.
* Klaus Kaempf for his ongoing work to make alpha-vms a viable
target.
* Steven G. Kargl for work on GNU Fortran.
* David Kashtan of SRI adapted GCC to VMS.
* Ryszard Kabatek for many, many libstdc++ bug fixes and
optimizations of strings, especially member functions, and for
auto_ptr fixes.
* Geoffrey Keating for his ongoing work to make the PPC work for
GNU/Linux and his automatic regression tester.
* Brendan Kehoe for his ongoing work with G++ and for a lot of early
work in just about every part of libstdc++.
* Oliver M. Kellogg of Deutsche Aerospace contributed the port to the
MIL-STD-1750A.
* Richard Kenner of the New York University Ultracomputer Research
Laboratory wrote the machine descriptions for the AMD 29000, the
DEC Alpha, the IBM RT PC, and the IBM RS/6000 as well as the
support for instruction attributes. He also made changes to
better support RISC processors including changes to common
subexpression elimination, strength reduction, function calling
sequence handling, and condition code support, in addition to
generalizing the code for frame pointer elimination and delay slot
scheduling. Richard Kenner was also the head maintainer of GCC
for several years.
* Mumit Khan for various contributions to the Cygwin and Mingw32
ports and maintaining binary releases for Microsoft Windows hosts,
and for massive libstdc++ porting work to Cygwin/Mingw32.
* Robin Kirkham for cpu32 support.
* Mark Klein for PA improvements.
* Thomas Koenig for various bug fixes.
* Bruce Korb for the new and improved fixincludes code.
* Benjamin Kosnik for his G++ work and for leading the libstdc++-v3
effort.
* Charles LaBrec contributed the support for the Integrated Solutions
68020 system.
* Asher Langton and Mike Kumbera for contributing Cray pointer
support to GNU Fortran, and for other GNU Fortran improvements.
* Jeff Law for his direction via the steering committee,
coordinating the entire egcs project and GCC 2.95, rolling out
snapshots and releases, handling merges from GCC2, reviewing tons
of patches that might have fallen through the cracks else, and
random but extensive hacking.
* Marc Lehmann for his direction via the steering committee and
helping with analysis and improvements of x86 performance.
* Victor Leikehman for work on GNU Fortran.
* Ted Lemon wrote parts of the RTL reader and printer.
* Kriang Lerdsuwanakij for C++ improvements including template as
template parameter support, and many C++ fixes.
* Warren Levy for tremendous work on libgcj (Java Runtime Library)
and random work on the Java front end.
* Alain Lichnewsky ported GCC to the MIPS CPU.
* Oskar Liljeblad for hacking on AWT and his many Java bug reports
and patches.
* Robert Lipe for OpenServer support, new testsuites, testing, etc.
* Chen Liqin for various S+core related fixes/improvement, and for
maintaining the S+core port.
* Weiwen Liu for testing and various bug fixes.
* Manuel Lo'pez-Iba'n~ez for improving `-Wconversion' and many other
diagnostics fixes and improvements.
* Dave Love for his ongoing work with the Fortran front end and
runtime libraries.
* Martin von Lo"wis for internal consistency checking infrastructure,
various C++ improvements including namespace support, and tons of
assistance with libstdc++/compiler merges.
* H.J. Lu for his previous contributions to the steering committee,
many x86 bug reports, prototype patches, and keeping the GNU/Linux
ports working.
* Greg McGary for random fixes and (someday) bounded pointers.
* Andrew MacLeod for his ongoing work in building a real EH system,
various code generation improvements, work on the global
optimizer, etc.
* Vladimir Makarov for hacking some ugly i960 problems, PowerPC
hacking improvements to compile-time performance, overall
knowledge and direction in the area of instruction scheduling, and
design and implementation of the automaton based instruction
scheduler.
* Bob Manson for his behind the scenes work on dejagnu.
* Philip Martin for lots of libstdc++ string and vector iterator
fixes and improvements, and string clean up and testsuites.
* All of the Mauve project contributors, for Java test code.
* Bryce McKinlay for numerous GCJ and libgcj fixes and improvements.
* Adam Megacz for his work on the Microsoft Windows port of GCJ.
* Michael Meissner for LRS framework, ia32, m32r, v850, m88k, MIPS,
powerpc, haifa, ECOFF debug support, and other assorted hacking.
* Jason Merrill for his direction via the steering committee and
leading the G++ effort.
* Martin Michlmayr for testing GCC on several architectures using the
entire Debian archive.
* David Miller for his direction via the steering committee, lots of
SPARC work, improvements in jump.c and interfacing with the Linux
kernel developers.
* Gary Miller ported GCC to Charles River Data Systems machines.
* Alfred Minarik for libstdc++ string and ios bug fixes, and turning
the entire libstdc++ testsuite namespace-compatible.
* Mark Mitchell for his direction via the steering committee,
mountains of C++ work, load/store hoisting out of loops, alias
analysis improvements, ISO C `restrict' support, and serving as
release manager for GCC 3.x.
* Alan Modra for various GNU/Linux bits and testing.
* Toon Moene for his direction via the steering committee, Fortran
maintenance, and his ongoing work to make us make Fortran run fast.
* Jason Molenda for major help in the care and feeding of all the
services on the gcc.gnu.org (formerly egcs.cygnus.com)
machine--mail, web services, ftp services, etc etc. Doing all
this work on scrap paper and the backs of envelopes would have
been... difficult.
* Catherine Moore for fixing various ugly problems we have sent her
way, including the haifa bug which was killing the Alpha & PowerPC
Linux kernels.
* Mike Moreton for his various Java patches.
* David Mosberger-Tang for various Alpha improvements, and for the
initial IA-64 port.
* Stephen Moshier contributed the floating point emulator that
assists in cross-compilation and permits support for floating
point numbers wider than 64 bits and for ISO C99 support.
* Bill Moyer for his behind the scenes work on various issues.
* Philippe De Muyter for his work on the m68k port.
* Joseph S. Myers for his work on the PDP-11 port, format checking
and ISO C99 support, and continuous emphasis on (and contributions
to) documentation.
* Nathan Myers for his work on libstdc++-v3: architecture and
authorship through the first three snapshots, including
implementation of locale infrastructure, string, shadow C headers,
and the initial project documentation (DESIGN, CHECKLIST, and so
forth). Later, more work on MT-safe string and shadow headers.
* Felix Natter for documentation on porting libstdc++.
* Nathanael Nerode for cleaning up the configuration/build process.
* NeXT, Inc. donated the front end that supports the Objective-C
language.
* Hans-Peter Nilsson for the CRIS and MMIX ports, improvements to
the search engine setup, various documentation fixes and other
small fixes.
* Geoff Noer for his work on getting cygwin native builds working.
* Diego Novillo for his work on Tree SSA, OpenMP, SPEC performance
tracking web pages, GIMPLE tuples, and assorted fixes.
* David O'Brien for the FreeBSD/alpha, FreeBSD/AMD x86-64,
FreeBSD/ARM, FreeBSD/PowerPC, and FreeBSD/SPARC64 ports and
related infrastructure improvements.
* Alexandre Oliva for various build infrastructure improvements,
scripts and amazing testing work, including keeping libtool issues
sane and happy.
* Stefan Olsson for work on mt_alloc.
* Melissa O'Neill for various NeXT fixes.
* Rainer Orth for random MIPS work, including improvements to GCC's
o32 ABI support, improvements to dejagnu's MIPS support, Java
configuration clean-ups and porting work, and maintaining the
IRIX, Solaris 2, and Tru64 UNIX ports.
* Hartmut Penner for work on the s390 port.
* Paul Petersen wrote the machine description for the Alliant FX/8.
* Alexandre Petit-Bianco for implementing much of the Java compiler
and continued Java maintainership.
* Matthias Pfaller for major improvements to the NS32k port.
* Gerald Pfeifer for his direction via the steering committee,
pointing out lots of problems we need to solve, maintenance of the
web pages, and taking care of documentation maintenance in general.
* Andrew Pinski for processing bug reports by the dozen.
* Ovidiu Predescu for his work on the Objective-C front end and
runtime libraries.
* Jerry Quinn for major performance improvements in C++ formatted
I/O.
* Ken Raeburn for various improvements to checker, MIPS ports and
various cleanups in the compiler.
* Rolf W. Rasmussen for hacking on AWT.
* David Reese of Sun Microsystems contributed to the Solaris on
PowerPC port.
* Volker Reichelt for keeping up with the problem reports.
* Joern Rennecke for maintaining the sh port, loop, regmove & reload
hacking.
* Loren J. Rittle for improvements to libstdc++-v3 including the
FreeBSD port, threading fixes, thread-related configury changes,
critical threading documentation, and solutions to really tricky
I/O problems, as well as keeping GCC properly working on FreeBSD
and continuous testing.
* Craig Rodrigues for processing tons of bug reports.
* Ola Ro"nnerup for work on mt_alloc.
* Gavin Romig-Koch for lots of behind the scenes MIPS work.
* David Ronis inspired and encouraged Craig to rewrite the G77
documentation in texinfo format by contributing a first pass at a
translation of the old `g77-0.5.16/f/DOC' file.
* Ken Rose for fixes to GCC's delay slot filling code.
* Paul Rubin wrote most of the preprocessor.
* Pe'tur Runo'lfsson for major performance improvements in C++
formatted I/O and large file support in C++ filebuf.
* Chip Salzenberg for libstdc++ patches and improvements to locales,
traits, Makefiles, libio, libtool hackery, and "long long" support.
* Juha Sarlin for improvements to the H8 code generator.
* Greg Satz assisted in making GCC work on HP-UX for the 9000 series
300.
* Roger Sayle for improvements to constant folding and GCC's RTL
optimizers as well as for fixing numerous bugs.
* Bradley Schatz for his work on the GCJ FAQ.
* Peter Schauer wrote the code to allow debugging to work on the
Alpha.
* William Schelter did most of the work on the Intel 80386 support.
* Tobias Schlu"ter for work on GNU Fortran.
* Bernd Schmidt for various code generation improvements and major
work in the reload pass as well a serving as release manager for
GCC 2.95.3.
* Peter Schmid for constant testing of libstdc++--especially
application testing, going above and beyond what was requested for
the release criteria--and libstdc++ header file tweaks.
* Jason Schroeder for jcf-dump patches.
* Andreas Schwab for his work on the m68k port.
* Lars Segerlund for work on GNU Fortran.
* Dodji Seketeli for numerous C++ bug fixes and debug info
improvements.
* Joel Sherrill for his direction via the steering committee, RTEMS
contributions and RTEMS testing.
* Nathan Sidwell for many C++ fixes/improvements.
* Jeffrey Siegal for helping RMS with the original design of GCC,
some code which handles the parse tree and RTL data structures,
constant folding and help with the original VAX & m68k ports.
* Kenny Simpson for prompting libstdc++ fixes due to defect reports
from the LWG (thereby keeping GCC in line with updates from the
ISO).
* Franz Sirl for his ongoing work with making the PPC port stable
for GNU/Linux.
* Andrey Slepuhin for assorted AIX hacking.
* Trevor Smigiel for contributing the SPU port.
* Christopher Smith did the port for Convex machines.
* Danny Smith for his major efforts on the Mingw (and Cygwin) ports.
* Randy Smith finished the Sun FPA support.
* Scott Snyder for queue, iterator, istream, and string fixes and
libstdc++ testsuite entries. Also for providing the patch to G77
to add rudimentary support for `INTEGER*1', `INTEGER*2', and
`LOGICAL*1'.
* Brad Spencer for contributions to the GLIBCPP_FORCE_NEW technique.
* Richard Stallman, for writing the original GCC and launching the
GNU project.
* Jan Stein of the Chalmers Computer Society provided support for
Genix, as well as part of the 32000 machine description.
* Nigel Stephens for various mips16 related fixes/improvements.
* Jonathan Stone wrote the machine description for the Pyramid
computer.
* Graham Stott for various infrastructure improvements.
* John Stracke for his Java HTTP protocol fixes.
* Mike Stump for his Elxsi port, G++ contributions over the years
and more recently his vxworks contributions
* Jeff Sturm for Java porting help, bug fixes, and encouragement.
* Shigeya Suzuki for this fixes for the bsdi platforms.
* Ian Lance Taylor for the Go frontend, the initial mips16 and mips64
support, general configury hacking, fixincludes, etc.
* Holger Teutsch provided the support for the Clipper CPU.
* Gary Thomas for his ongoing work to make the PPC work for
GNU/Linux.
* Philipp Thomas for random bug fixes throughout the compiler
* Jason Thorpe for thread support in libstdc++ on NetBSD.
* Kresten Krab Thorup wrote the run time support for the Objective-C
language and the fantastic Java bytecode interpreter.
* Michael Tiemann for random bug fixes, the first instruction
scheduler, initial C++ support, function integration, NS32k, SPARC
and M88k machine description work, delay slot scheduling.
* Andreas Tobler for his work porting libgcj to Darwin.
* Teemu Torma for thread safe exception handling support.
* Leonard Tower wrote parts of the parser, RTL generator, and RTL
definitions, and of the VAX machine description.
* Daniel Towner and Hariharan Sandanagobalane contributed and
maintain the picoChip port.
* Tom Tromey for internationalization support and for his many Java
contributions and libgcj maintainership.
* Lassi Tuura for improvements to config.guess to determine HP
processor types.
* Petter Urkedal for libstdc++ CXXFLAGS, math, and algorithms fixes.
* Andy Vaught for the design and initial implementation of the GNU
Fortran front end.
* Brent Verner for work with the libstdc++ cshadow files and their
associated configure steps.
* Todd Vierling for contributions for NetBSD ports.
* Jonathan Wakely for contributing libstdc++ Doxygen notes and XHTML
guidance.
* Dean Wakerley for converting the install documentation from HTML
to texinfo in time for GCC 3.0.
* Krister Walfridsson for random bug fixes.
* Feng Wang for contributions to GNU Fortran.
* Stephen M. Webb for time and effort on making libstdc++ shadow
files work with the tricky Solaris 8+ headers, and for pushing the
build-time header tree.
* John Wehle for various improvements for the x86 code generator,
related infrastructure improvements to help x86 code generation,
value range propagation and other work, WE32k port.
* Ulrich Weigand for work on the s390 port.
* Zack Weinberg for major work on cpplib and various other bug fixes.
* Matt Welsh for help with Linux Threads support in GCJ.
* Urban Widmark for help fixing java.io.
* Mark Wielaard for new Java library code and his work integrating
with Classpath.
* Dale Wiles helped port GCC to the Tahoe.
* Bob Wilson from Tensilica, Inc. for the Xtensa port.
* Jim Wilson for his direction via the steering committee, tackling
hard problems in various places that nobody else wanted to work
on, strength reduction and other loop optimizations.
* Paul Woegerer and Tal Agmon for the CRX port.
* Carlo Wood for various fixes.
* Tom Wood for work on the m88k port.
* Canqun Yang for work on GNU Fortran.
* Masanobu Yuhara of Fujitsu Laboratories implemented the machine
description for the Tron architecture (specifically, the Gmicro).
* Kevin Zachmann helped port GCC to the Tahoe.
* Ayal Zaks for Swing Modulo Scheduling (SMS).
* Xiaoqiang Zhang for work on GNU Fortran.
* Gilles Zunino for help porting Java to Irix.
The following people are recognized for their contributions to GNAT,
the Ada front end of GCC:
* Bernard Banner
* Romain Berrendonner
* Geert Bosch
* Emmanuel Briot
* Joel Brobecker
* Ben Brosgol
* Vincent Celier
* Arnaud Charlet
* Chien Chieng
* Cyrille Comar
* Cyrille Crozes
* Robert Dewar
* Gary Dismukes
* Robert Duff
* Ed Falis
* Ramon Fernandez
* Sam Figueroa
* Vasiliy Fofanov
* Michael Friess
* Franco Gasperoni
* Ted Giering
* Matthew Gingell
* Laurent Guerby
* Jerome Guitton
* Olivier Hainque
* Jerome Hugues
* Hristian Kirtchev
* Jerome Lambourg
* Bruno Leclerc
* Albert Lee
* Sean McNeil
* Javier Miranda
* Laurent Nana
* Pascal Obry
* Dong-Ik Oh
* Laurent Pautet
* Brett Porter
* Thomas Quinot
* Nicolas Roche
* Pat Rogers
* Jose Ruiz
* Douglas Rupp
* Sergey Rybin
* Gail Schenker
* Ed Schonberg
* Nicolas Setton
* Samuel Tardieu
The following people are recognized for their contributions of new
features, bug reports, testing and integration of classpath/libgcj for
GCC version 4.1:
* Lillian Angel for `JTree' implementation and lots Free Swing
additions and bug fixes.
* Wolfgang Baer for `GapContent' bug fixes.
* Anthony Balkissoon for `JList', Free Swing 1.5 updates and mouse
event fixes, lots of Free Swing work including `JTable' editing.
* Stuart Ballard for RMI constant fixes.
* Goffredo Baroncelli for `HTTPURLConnection' fixes.
* Gary Benson for `MessageFormat' fixes.
* Daniel Bonniot for `Serialization' fixes.
* Chris Burdess for lots of gnu.xml and http protocol fixes, `StAX'
and `DOM xml:id' support.
* Ka-Hing Cheung for `TreePath' and `TreeSelection' fixes.
* Archie Cobbs for build fixes, VM interface updates,
`URLClassLoader' updates.
* Kelley Cook for build fixes.
* Martin Cordova for Suggestions for better `SocketTimeoutException'.
* David Daney for `BitSet' bug fixes, `HttpURLConnection' rewrite
and improvements.
* Thomas Fitzsimmons for lots of upgrades to the gtk+ AWT and Cairo
2D support. Lots of imageio framework additions, lots of AWT and
Free Swing bug fixes.
* Jeroen Frijters for `ClassLoader' and nio cleanups, serialization
fixes, better `Proxy' support, bug fixes and IKVM integration.
* Santiago Gala for `AccessControlContext' fixes.
* Nicolas Geoffray for `VMClassLoader' and `AccessController'
improvements.
* David Gilbert for `basic' and `metal' icon and plaf support and
lots of documenting, Lots of Free Swing and metal theme additions.
`MetalIconFactory' implementation.
* Anthony Green for `MIDI' framework, `ALSA' and `DSSI' providers.
* Andrew Haley for `Serialization' and `URLClassLoader' fixes, gcj
build speedups.
* Kim Ho for `JFileChooser' implementation.
* Andrew John Hughes for `Locale' and net fixes, URI RFC2986
updates, `Serialization' fixes, `Properties' XML support and
generic branch work, VMIntegration guide update.
* Bastiaan Huisman for `TimeZone' bug fixing.
* Andreas Jaeger for mprec updates.
* Paul Jenner for better `-Werror' support.
* Ito Kazumitsu for `NetworkInterface' implementation and updates.
* Roman Kennke for `BoxLayout', `GrayFilter' and `SplitPane', plus
bug fixes all over. Lots of Free Swing work including styled text.
* Simon Kitching for `String' cleanups and optimization suggestions.
* Michael Koch for configuration fixes, `Locale' updates, bug and
build fixes.
* Guilhem Lavaux for configuration, thread and channel fixes and
Kaffe integration. JCL native `Pointer' updates. Logger bug fixes.
* David Lichteblau for JCL support library global/local reference
cleanups.
* Aaron Luchko for JDWP updates and documentation fixes.
* Ziga Mahkovec for `Graphics2D' upgraded to Cairo 0.5 and new regex
features.
* Sven de Marothy for BMP imageio support, CSS and `TextLayout'
fixes. `GtkImage' rewrite, 2D, awt, free swing and date/time fixes
and implementing the Qt4 peers.
* Casey Marshall for crypto algorithm fixes, `FileChannel' lock,
`SystemLogger' and `FileHandler' rotate implementations, NIO
`FileChannel.map' support, security and policy updates.
* Bryce McKinlay for RMI work.
* Audrius Meskauskas for lots of Free Corba, RMI and HTML work plus
testing and documenting.
* Kalle Olavi Niemitalo for build fixes.
* Rainer Orth for build fixes.
* Andrew Overholt for `File' locking fixes.
* Ingo Proetel for `Image', `Logger' and `URLClassLoader' updates.
* Olga Rodimina for `MenuSelectionManager' implementation.
* Jan Roehrich for `BasicTreeUI' and `JTree' fixes.
* Julian Scheid for documentation updates and gjdoc support.
* Christian Schlichtherle for zip fixes and cleanups.
* Robert Schuster for documentation updates and beans fixes,
`TreeNode' enumerations and `ActionCommand' and various fixes, XML
and URL, AWT and Free Swing bug fixes.
* Keith Seitz for lots of JDWP work.
* Christian Thalinger for 64-bit cleanups, Configuration and VM
interface fixes and `CACAO' integration, `fdlibm' updates.
* Gael Thomas for `VMClassLoader' boot packages support suggestions.
* Andreas Tobler for Darwin and Solaris testing and fixing, `Qt4'
support for Darwin/OS X, `Graphics2D' support, `gtk+' updates.
* Dalibor Topic for better `DEBUG' support, build cleanups and Kaffe
integration. `Qt4' build infrastructure, `SHA1PRNG' and
`GdkPixbugDecoder' updates.
* Tom Tromey for Eclipse integration, generics work, lots of bug
fixes and gcj integration including coordinating The Big Merge.
* Mark Wielaard for bug fixes, packaging and release management,
`Clipboard' implementation, system call interrupts and network
timeouts and `GdkPixpufDecoder' fixes.
In addition to the above, all of which also contributed time and
energy in testing GCC, we would like to thank the following for their
contributions to testing:
* Michael Abd-El-Malek
* Thomas Arend
* Bonzo Armstrong
* Steven Ashe
* Chris Baldwin
* David Billinghurst
* Jim Blandy
* Stephane Bortzmeyer
* Horst von Brand
* Frank Braun
* Rodney Brown
* Sidney Cadot
* Bradford Castalia
* Robert Clark
* Jonathan Corbet
* Ralph Doncaster
* Richard Emberson
* Levente Farkas
* Graham Fawcett
* Mark Fernyhough
* Robert A. French
* Jo"rgen Freyh
* Mark K. Gardner
* Charles-Antoine Gauthier
* Yung Shing Gene
* David Gilbert
* Simon Gornall
* Fred Gray
* John Griffin
* Patrik Hagglund
* Phil Hargett
* Amancio Hasty
* Takafumi Hayashi
* Bryan W. Headley
* Kevin B. Hendricks
* Joep Jansen
* Christian Joensson
* Michel Kern
* David Kidd
* Tobias Kuipers
* Anand Krishnaswamy
* A. O. V. Le Blanc
* llewelly
* Damon Love
* Brad Lucier
* Matthias Klose
* Martin Knoblauch
* Rick Lutowski
* Jesse Macnish
* Stefan Morrell
* Anon A. Mous
* Matthias Mueller
* Pekka Nikander
* Rick Niles
* Jon Olson
* Magnus Persson
* Chris Pollard
* Richard Polton
* Derk Reefman
* David Rees
* Paul Reilly
* Tom Reilly
* Torsten Rueger
* Danny Sadinoff
* Marc Schifer
* Erik Schnetter
* Wayne K. Schroll
* David Schuler
* Vin Shelton
* Tim Souder
* Adam Sulmicki
* Bill Thorson
* George Talbot
* Pedro A. M. Vazquez
* Gregory Warnes
* Ian Watson
* David E. Young
* And many others
And finally we'd like to thank everyone who uses the compiler, provides
feedback and generally reminds us why we're doing this work in the first
place.
File: gccint.info, Node: Option Index, Next: Concept Index, Prev: Contributors, Up: Top
Option Index
************
GCC's command line options are indexed here without any initial `-' or
`--'. Where an option has both positive and negative forms (such as
`-fOPTION' and `-fno-OPTION'), relevant entries in the manual are
indexed under the most appropriate form; it may sometimes be useful to
look up both forms.
[index ]
* Menu:
* fltrans: LTO. (line 499)
* fltrans-output-list: LTO. (line 504)
* fwpa: LTO. (line 490)
* msoft-float: Soft float library routines.
(line 6)
File: gccint.info, Node: Concept Index, Prev: Option Index, Up: Top
Concept Index
*************
[index ]
* Menu:
* ! in constraint: Multi-Alternative. (line 47)
* # in constraint: Modifiers. (line 67)
* # in template: Output Template. (line 66)
* #pragma: Misc. (line 381)
* % in constraint: Modifiers. (line 45)
* % in GTY option: GTY Options. (line 18)
* % in template: Output Template. (line 6)
* & in constraint: Modifiers. (line 25)
* (nil): RTL Objects. (line 73)
* * in constraint: Modifiers. (line 72)
* * in template: Output Statement. (line 29)
* + in constraint: Modifiers. (line 12)
* -fsection-anchors <1>: Anchored Addresses. (line 6)
* -fsection-anchors: Special Accessors. (line 110)
* /c in RTL dump: Flags. (line 239)
* /f in RTL dump: Flags. (line 247)
* /i in RTL dump: Flags. (line 299)
* /j in RTL dump: Flags. (line 314)
* /s in RTL dump: Flags. (line 263)
* /u in RTL dump: Flags. (line 324)
* /v in RTL dump: Flags. (line 356)
* 0 in constraint: Simple Constraints. (line 130)
* < in constraint: Simple Constraints. (line 48)
* = in constraint: Modifiers. (line 8)
* > in constraint: Simple Constraints. (line 61)
* ? in constraint: Multi-Alternative. (line 41)
* \: Output Template. (line 46)
* __absvdi2: Integer library routines.
(line 107)
* __absvsi2: Integer library routines.
(line 106)
* __addda3: Fixed-point fractional library routines.
(line 45)
* __adddf3: Soft float library routines.
(line 23)
* __adddq3: Fixed-point fractional library routines.
(line 33)
* __addha3: Fixed-point fractional library routines.
(line 43)
* __addhq3: Fixed-point fractional library routines.
(line 30)
* __addqq3: Fixed-point fractional library routines.
(line 29)
* __addsa3: Fixed-point fractional library routines.
(line 44)
* __addsf3: Soft float library routines.
(line 22)
* __addsq3: Fixed-point fractional library routines.
(line 31)
* __addta3: Fixed-point fractional library routines.
(line 47)
* __addtf3: Soft float library routines.
(line 25)
* __adduda3: Fixed-point fractional library routines.
(line 53)
* __addudq3: Fixed-point fractional library routines.
(line 41)
* __adduha3: Fixed-point fractional library routines.
(line 49)
* __adduhq3: Fixed-point fractional library routines.
(line 37)
* __adduqq3: Fixed-point fractional library routines.
(line 35)
* __addusa3: Fixed-point fractional library routines.
(line 51)
* __addusq3: Fixed-point fractional library routines.
(line 39)
* __adduta3: Fixed-point fractional library routines.
(line 55)
* __addvdi3: Integer library routines.
(line 111)
* __addvsi3: Integer library routines.
(line 110)
* __addxf3: Soft float library routines.
(line 27)
* __ashlda3: Fixed-point fractional library routines.
(line 351)
* __ashldi3: Integer library routines.
(line 14)
* __ashldq3: Fixed-point fractional library routines.
(line 340)
* __ashlha3: Fixed-point fractional library routines.
(line 349)
* __ashlhq3: Fixed-point fractional library routines.
(line 337)
* __ashlqq3: Fixed-point fractional library routines.
(line 336)
* __ashlsa3: Fixed-point fractional library routines.
(line 350)
* __ashlsi3: Integer library routines.
(line 13)
* __ashlsq3: Fixed-point fractional library routines.
(line 338)
* __ashlta3: Fixed-point fractional library routines.
(line 353)
* __ashlti3: Integer library routines.
(line 15)
* __ashluda3: Fixed-point fractional library routines.
(line 359)
* __ashludq3: Fixed-point fractional library routines.
(line 348)
* __ashluha3: Fixed-point fractional library routines.
(line 355)
* __ashluhq3: Fixed-point fractional library routines.
(line 344)
* __ashluqq3: Fixed-point fractional library routines.
(line 342)
* __ashlusa3: Fixed-point fractional library routines.
(line 357)
* __ashlusq3: Fixed-point fractional library routines.
(line 346)
* __ashluta3: Fixed-point fractional library routines.
(line 361)
* __ashrda3: Fixed-point fractional library routines.
(line 371)
* __ashrdi3: Integer library routines.
(line 19)
* __ashrdq3: Fixed-point fractional library routines.
(line 368)
* __ashrha3: Fixed-point fractional library routines.
(line 369)
* __ashrhq3: Fixed-point fractional library routines.
(line 365)
* __ashrqq3: Fixed-point fractional library routines.
(line 364)
* __ashrsa3: Fixed-point fractional library routines.
(line 370)
* __ashrsi3: Integer library routines.
(line 18)
* __ashrsq3: Fixed-point fractional library routines.
(line 366)
* __ashrta3: Fixed-point fractional library routines.
(line 373)
* __ashrti3: Integer library routines.
(line 20)
* __bid_adddd3: Decimal float library routines.
(line 25)
* __bid_addsd3: Decimal float library routines.
(line 21)
* __bid_addtd3: Decimal float library routines.
(line 29)
* __bid_divdd3: Decimal float library routines.
(line 68)
* __bid_divsd3: Decimal float library routines.
(line 64)
* __bid_divtd3: Decimal float library routines.
(line 72)
* __bid_eqdd2: Decimal float library routines.
(line 259)
* __bid_eqsd2: Decimal float library routines.
(line 257)
* __bid_eqtd2: Decimal float library routines.
(line 261)
* __bid_extendddtd2: Decimal float library routines.
(line 92)
* __bid_extendddtf: Decimal float library routines.
(line 140)
* __bid_extendddxf: Decimal float library routines.
(line 134)
* __bid_extenddfdd: Decimal float library routines.
(line 147)
* __bid_extenddftd: Decimal float library routines.
(line 107)
* __bid_extendsddd2: Decimal float library routines.
(line 88)
* __bid_extendsddf: Decimal float library routines.
(line 128)
* __bid_extendsdtd2: Decimal float library routines.
(line 90)
* __bid_extendsdtf: Decimal float library routines.
(line 138)
* __bid_extendsdxf: Decimal float library routines.
(line 132)
* __bid_extendsfdd: Decimal float library routines.
(line 103)
* __bid_extendsfsd: Decimal float library routines.
(line 145)
* __bid_extendsftd: Decimal float library routines.
(line 105)
* __bid_extendtftd: Decimal float library routines.
(line 149)
* __bid_extendxftd: Decimal float library routines.
(line 109)
* __bid_fixdddi: Decimal float library routines.
(line 170)
* __bid_fixddsi: Decimal float library routines.
(line 162)
* __bid_fixsddi: Decimal float library routines.
(line 168)
* __bid_fixsdsi: Decimal float library routines.
(line 160)
* __bid_fixtddi: Decimal float library routines.
(line 172)
* __bid_fixtdsi: Decimal float library routines.
(line 164)
* __bid_fixunsdddi: Decimal float library routines.
(line 187)
* __bid_fixunsddsi: Decimal float library routines.
(line 178)
* __bid_fixunssddi: Decimal float library routines.
(line 185)
* __bid_fixunssdsi: Decimal float library routines.
(line 176)
* __bid_fixunstddi: Decimal float library routines.
(line 189)
* __bid_fixunstdsi: Decimal float library routines.
(line 180)
* __bid_floatdidd: Decimal float library routines.
(line 205)
* __bid_floatdisd: Decimal float library routines.
(line 203)
* __bid_floatditd: Decimal float library routines.
(line 207)
* __bid_floatsidd: Decimal float library routines.
(line 196)
* __bid_floatsisd: Decimal float library routines.
(line 194)
* __bid_floatsitd: Decimal float library routines.
(line 198)
* __bid_floatunsdidd: Decimal float library routines.
(line 223)
* __bid_floatunsdisd: Decimal float library routines.
(line 221)
* __bid_floatunsditd: Decimal float library routines.
(line 225)
* __bid_floatunssidd: Decimal float library routines.
(line 214)
* __bid_floatunssisd: Decimal float library routines.
(line 212)
* __bid_floatunssitd: Decimal float library routines.
(line 216)
* __bid_gedd2: Decimal float library routines.
(line 277)
* __bid_gesd2: Decimal float library routines.
(line 275)
* __bid_getd2: Decimal float library routines.
(line 279)
* __bid_gtdd2: Decimal float library routines.
(line 304)
* __bid_gtsd2: Decimal float library routines.
(line 302)
* __bid_gttd2: Decimal float library routines.
(line 306)
* __bid_ledd2: Decimal float library routines.
(line 295)
* __bid_lesd2: Decimal float library routines.
(line 293)
* __bid_letd2: Decimal float library routines.
(line 297)
* __bid_ltdd2: Decimal float library routines.
(line 286)
* __bid_ltsd2: Decimal float library routines.
(line 284)
* __bid_lttd2: Decimal float library routines.
(line 288)
* __bid_muldd3: Decimal float library routines.
(line 54)
* __bid_mulsd3: Decimal float library routines.
(line 50)
* __bid_multd3: Decimal float library routines.
(line 58)
* __bid_nedd2: Decimal float library routines.
(line 268)
* __bid_negdd2: Decimal float library routines.
(line 78)
* __bid_negsd2: Decimal float library routines.
(line 76)
* __bid_negtd2: Decimal float library routines.
(line 80)
* __bid_nesd2: Decimal float library routines.
(line 266)
* __bid_netd2: Decimal float library routines.
(line 270)
* __bid_subdd3: Decimal float library routines.
(line 39)
* __bid_subsd3: Decimal float library routines.
(line 35)
* __bid_subtd3: Decimal float library routines.
(line 43)
* __bid_truncdddf: Decimal float library routines.
(line 153)
* __bid_truncddsd2: Decimal float library routines.
(line 94)
* __bid_truncddsf: Decimal float library routines.
(line 124)
* __bid_truncdfsd: Decimal float library routines.
(line 111)
* __bid_truncsdsf: Decimal float library routines.
(line 151)
* __bid_trunctddd2: Decimal float library routines.
(line 98)
* __bid_trunctddf: Decimal float library routines.
(line 130)
* __bid_trunctdsd2: Decimal float library routines.
(line 96)
* __bid_trunctdsf: Decimal float library routines.
(line 126)
* __bid_trunctdtf: Decimal float library routines.
(line 155)
* __bid_trunctdxf: Decimal float library routines.
(line 136)
* __bid_trunctfdd: Decimal float library routines.
(line 119)
* __bid_trunctfsd: Decimal float library routines.
(line 115)
* __bid_truncxfdd: Decimal float library routines.
(line 117)
* __bid_truncxfsd: Decimal float library routines.
(line 113)
* __bid_unorddd2: Decimal float library routines.
(line 235)
* __bid_unordsd2: Decimal float library routines.
(line 233)
* __bid_unordtd2: Decimal float library routines.
(line 237)
* __bswapdi2: Integer library routines.
(line 162)
* __bswapsi2: Integer library routines.
(line 161)
* __builtin_classify_type: Varargs. (line 51)
* __builtin_next_arg: Varargs. (line 42)
* __builtin_saveregs: Varargs. (line 24)
* __clear_cache: Miscellaneous routines.
(line 10)
* __clzdi2: Integer library routines.
(line 131)
* __clzsi2: Integer library routines.
(line 130)
* __clzti2: Integer library routines.
(line 132)
* __cmpda2: Fixed-point fractional library routines.
(line 451)
* __cmpdf2: Soft float library routines.
(line 164)
* __cmpdi2: Integer library routines.
(line 87)
* __cmpdq2: Fixed-point fractional library routines.
(line 441)
* __cmpha2: Fixed-point fractional library routines.
(line 449)
* __cmphq2: Fixed-point fractional library routines.
(line 438)
* __cmpqq2: Fixed-point fractional library routines.
(line 437)
* __cmpsa2: Fixed-point fractional library routines.
(line 450)
* __cmpsf2: Soft float library routines.
(line 163)
* __cmpsq2: Fixed-point fractional library routines.
(line 439)
* __cmpta2: Fixed-point fractional library routines.
(line 453)
* __cmptf2: Soft float library routines.
(line 165)
* __cmpti2: Integer library routines.
(line 88)
* __cmpuda2: Fixed-point fractional library routines.
(line 458)
* __cmpudq2: Fixed-point fractional library routines.
(line 448)
* __cmpuha2: Fixed-point fractional library routines.
(line 455)
* __cmpuhq2: Fixed-point fractional library routines.
(line 444)
* __cmpuqq2: Fixed-point fractional library routines.
(line 443)
* __cmpusa2: Fixed-point fractional library routines.
(line 456)
* __cmpusq2: Fixed-point fractional library routines.
(line 446)
* __cmputa2: Fixed-point fractional library routines.
(line 460)
* __CTOR_LIST__: Initialization. (line 25)
* __ctzdi2: Integer library routines.
(line 138)
* __ctzsi2: Integer library routines.
(line 137)
* __ctzti2: Integer library routines.
(line 139)
* __divda3: Fixed-point fractional library routines.
(line 227)
* __divdc3: Soft float library routines.
(line 252)
* __divdf3: Soft float library routines.
(line 48)
* __divdi3: Integer library routines.
(line 25)
* __divdq3: Fixed-point fractional library routines.
(line 223)
* __divha3: Fixed-point fractional library routines.
(line 225)
* __divhq3: Fixed-point fractional library routines.
(line 220)
* __divqq3: Fixed-point fractional library routines.
(line 219)
* __divsa3: Fixed-point fractional library routines.
(line 226)
* __divsc3: Soft float library routines.
(line 250)
* __divsf3: Soft float library routines.
(line 47)
* __divsi3: Integer library routines.
(line 24)
* __divsq3: Fixed-point fractional library routines.
(line 221)
* __divta3: Fixed-point fractional library routines.
(line 229)
* __divtc3: Soft float library routines.
(line 254)
* __divtf3: Soft float library routines.
(line 50)
* __divti3: Integer library routines.
(line 26)
* __divxc3: Soft float library routines.
(line 256)
* __divxf3: Soft float library routines.
(line 52)
* __dpd_adddd3: Decimal float library routines.
(line 23)
* __dpd_addsd3: Decimal float library routines.
(line 19)
* __dpd_addtd3: Decimal float library routines.
(line 27)
* __dpd_divdd3: Decimal float library routines.
(line 66)
* __dpd_divsd3: Decimal float library routines.
(line 62)
* __dpd_divtd3: Decimal float library routines.
(line 70)
* __dpd_eqdd2: Decimal float library routines.
(line 258)
* __dpd_eqsd2: Decimal float library routines.
(line 256)
* __dpd_eqtd2: Decimal float library routines.
(line 260)
* __dpd_extendddtd2: Decimal float library routines.
(line 91)
* __dpd_extendddtf: Decimal float library routines.
(line 139)
* __dpd_extendddxf: Decimal float library routines.
(line 133)
* __dpd_extenddfdd: Decimal float library routines.
(line 146)
* __dpd_extenddftd: Decimal float library routines.
(line 106)
* __dpd_extendsddd2: Decimal float library routines.
(line 87)
* __dpd_extendsddf: Decimal float library routines.
(line 127)
* __dpd_extendsdtd2: Decimal float library routines.
(line 89)
* __dpd_extendsdtf: Decimal float library routines.
(line 137)
* __dpd_extendsdxf: Decimal float library routines.
(line 131)
* __dpd_extendsfdd: Decimal float library routines.
(line 102)
* __dpd_extendsfsd: Decimal float library routines.
(line 144)
* __dpd_extendsftd: Decimal float library routines.
(line 104)
* __dpd_extendtftd: Decimal float library routines.
(line 148)
* __dpd_extendxftd: Decimal float library routines.
(line 108)
* __dpd_fixdddi: Decimal float library routines.
(line 169)
* __dpd_fixddsi: Decimal float library routines.
(line 161)
* __dpd_fixsddi: Decimal float library routines.
(line 167)
* __dpd_fixsdsi: Decimal float library routines.
(line 159)
* __dpd_fixtddi: Decimal float library routines.
(line 171)
* __dpd_fixtdsi: Decimal float library routines.
(line 163)
* __dpd_fixunsdddi: Decimal float library routines.
(line 186)
* __dpd_fixunsddsi: Decimal float library routines.
(line 177)
* __dpd_fixunssddi: Decimal float library routines.
(line 184)
* __dpd_fixunssdsi: Decimal float library routines.
(line 175)
* __dpd_fixunstddi: Decimal float library routines.
(line 188)
* __dpd_fixunstdsi: Decimal float library routines.
(line 179)
* __dpd_floatdidd: Decimal float library routines.
(line 204)
* __dpd_floatdisd: Decimal float library routines.
(line 202)
* __dpd_floatditd: Decimal float library routines.
(line 206)
* __dpd_floatsidd: Decimal float library routines.
(line 195)
* __dpd_floatsisd: Decimal float library routines.
(line 193)
* __dpd_floatsitd: Decimal float library routines.
(line 197)
* __dpd_floatunsdidd: Decimal float library routines.
(line 222)
* __dpd_floatunsdisd: Decimal float library routines.
(line 220)
* __dpd_floatunsditd: Decimal float library routines.
(line 224)
* __dpd_floatunssidd: Decimal float library routines.
(line 213)
* __dpd_floatunssisd: Decimal float library routines.
(line 211)
* __dpd_floatunssitd: Decimal float library routines.
(line 215)
* __dpd_gedd2: Decimal float library routines.
(line 276)
* __dpd_gesd2: Decimal float library routines.
(line 274)
* __dpd_getd2: Decimal float library routines.
(line 278)
* __dpd_gtdd2: Decimal float library routines.
(line 303)
* __dpd_gtsd2: Decimal float library routines.
(line 301)
* __dpd_gttd2: Decimal float library routines.
(line 305)
* __dpd_ledd2: Decimal float library routines.
(line 294)
* __dpd_lesd2: Decimal float library routines.
(line 292)
* __dpd_letd2: Decimal float library routines.
(line 296)
* __dpd_ltdd2: Decimal float library routines.
(line 285)
* __dpd_ltsd2: Decimal float library routines.
(line 283)
* __dpd_lttd2: Decimal float library routines.
(line 287)
* __dpd_muldd3: Decimal float library routines.
(line 52)
* __dpd_mulsd3: Decimal float library routines.
(line 48)
* __dpd_multd3: Decimal float library routines.
(line 56)
* __dpd_nedd2: Decimal float library routines.
(line 267)
* __dpd_negdd2: Decimal float library routines.
(line 77)
* __dpd_negsd2: Decimal float library routines.
(line 75)
* __dpd_negtd2: Decimal float library routines.
(line 79)
* __dpd_nesd2: Decimal float library routines.
(line 265)
* __dpd_netd2: Decimal float library routines.
(line 269)
* __dpd_subdd3: Decimal float library routines.
(line 37)
* __dpd_subsd3: Decimal float library routines.
(line 33)
* __dpd_subtd3: Decimal float library routines.
(line 41)
* __dpd_truncdddf: Decimal float library routines.
(line 152)
* __dpd_truncddsd2: Decimal float library routines.
(line 93)
* __dpd_truncddsf: Decimal float library routines.
(line 123)
* __dpd_truncdfsd: Decimal float library routines.
(line 110)
* __dpd_truncsdsf: Decimal float library routines.
(line 150)
* __dpd_trunctddd2: Decimal float library routines.
(line 97)
* __dpd_trunctddf: Decimal float library routines.
(line 129)
* __dpd_trunctdsd2: Decimal float library routines.
(line 95)
* __dpd_trunctdsf: Decimal float library routines.
(line 125)
* __dpd_trunctdtf: Decimal float library routines.
(line 154)
* __dpd_trunctdxf: Decimal float library routines.
(line 135)
* __dpd_trunctfdd: Decimal float library routines.
(line 118)
* __dpd_trunctfsd: Decimal float library routines.
(line 114)
* __dpd_truncxfdd: Decimal float library routines.
(line 116)
* __dpd_truncxfsd: Decimal float library routines.
(line 112)
* __dpd_unorddd2: Decimal float library routines.
(line 234)
* __dpd_unordsd2: Decimal float library routines.
(line 232)
* __dpd_unordtd2: Decimal float library routines.
(line 236)
* __DTOR_LIST__: Initialization. (line 25)
* __eqdf2: Soft float library routines.
(line 194)
* __eqsf2: Soft float library routines.
(line 193)
* __eqtf2: Soft float library routines.
(line 195)
* __extenddftf2: Soft float library routines.
(line 68)
* __extenddfxf2: Soft float library routines.
(line 69)
* __extendsfdf2: Soft float library routines.
(line 65)
* __extendsftf2: Soft float library routines.
(line 66)
* __extendsfxf2: Soft float library routines.
(line 67)
* __ffsdi2: Integer library routines.
(line 144)
* __ffsti2: Integer library routines.
(line 145)
* __fixdfdi: Soft float library routines.
(line 88)
* __fixdfsi: Soft float library routines.
(line 81)
* __fixdfti: Soft float library routines.
(line 94)
* __fixsfdi: Soft float library routines.
(line 87)
* __fixsfsi: Soft float library routines.
(line 80)
* __fixsfti: Soft float library routines.
(line 93)
* __fixtfdi: Soft float library routines.
(line 89)
* __fixtfsi: Soft float library routines.
(line 82)
* __fixtfti: Soft float library routines.
(line 95)
* __fixunsdfdi: Soft float library routines.
(line 108)
* __fixunsdfsi: Soft float library routines.
(line 101)
* __fixunsdfti: Soft float library routines.
(line 115)
* __fixunssfdi: Soft float library routines.
(line 107)
* __fixunssfsi: Soft float library routines.
(line 100)
* __fixunssfti: Soft float library routines.
(line 114)
* __fixunstfdi: Soft float library routines.
(line 109)
* __fixunstfsi: Soft float library routines.
(line 102)
* __fixunstfti: Soft float library routines.
(line 116)
* __fixunsxfdi: Soft float library routines.
(line 110)
* __fixunsxfsi: Soft float library routines.
(line 103)
* __fixunsxfti: Soft float library routines.
(line 117)
* __fixxfdi: Soft float library routines.
(line 90)
* __fixxfsi: Soft float library routines.
(line 83)
* __fixxfti: Soft float library routines.
(line 96)
* __floatdidf: Soft float library routines.
(line 128)
* __floatdisf: Soft float library routines.
(line 127)
* __floatditf: Soft float library routines.
(line 129)
* __floatdixf: Soft float library routines.
(line 130)
* __floatsidf: Soft float library routines.
(line 122)
* __floatsisf: Soft float library routines.
(line 121)
* __floatsitf: Soft float library routines.
(line 123)
* __floatsixf: Soft float library routines.
(line 124)
* __floattidf: Soft float library routines.
(line 134)
* __floattisf: Soft float library routines.
(line 133)
* __floattitf: Soft float library routines.
(line 135)
* __floattixf: Soft float library routines.
(line 136)
* __floatundidf: Soft float library routines.
(line 146)
* __floatundisf: Soft float library routines.
(line 145)
* __floatunditf: Soft float library routines.
(line 147)
* __floatundixf: Soft float library routines.
(line 148)
* __floatunsidf: Soft float library routines.
(line 140)
* __floatunsisf: Soft float library routines.
(line 139)
* __floatunsitf: Soft float library routines.
(line 141)
* __floatunsixf: Soft float library routines.
(line 142)
* __floatuntidf: Soft float library routines.
(line 152)
* __floatuntisf: Soft float library routines.
(line 151)
* __floatuntitf: Soft float library routines.
(line 153)
* __floatuntixf: Soft float library routines.
(line 154)
* __fractdadf: Fixed-point fractional library routines.
(line 636)
* __fractdadi: Fixed-point fractional library routines.
(line 633)
* __fractdadq: Fixed-point fractional library routines.
(line 616)
* __fractdaha2: Fixed-point fractional library routines.
(line 617)
* __fractdahi: Fixed-point fractional library routines.
(line 631)
* __fractdahq: Fixed-point fractional library routines.
(line 614)
* __fractdaqi: Fixed-point fractional library routines.
(line 630)
* __fractdaqq: Fixed-point fractional library routines.
(line 613)
* __fractdasa2: Fixed-point fractional library routines.
(line 618)
* __fractdasf: Fixed-point fractional library routines.
(line 635)
* __fractdasi: Fixed-point fractional library routines.
(line 632)
* __fractdasq: Fixed-point fractional library routines.
(line 615)
* __fractdata2: Fixed-point fractional library routines.
(line 619)
* __fractdati: Fixed-point fractional library routines.
(line 634)
* __fractdauda: Fixed-point fractional library routines.
(line 627)
* __fractdaudq: Fixed-point fractional library routines.
(line 624)
* __fractdauha: Fixed-point fractional library routines.
(line 625)
* __fractdauhq: Fixed-point fractional library routines.
(line 621)
* __fractdauqq: Fixed-point fractional library routines.
(line 620)
* __fractdausa: Fixed-point fractional library routines.
(line 626)
* __fractdausq: Fixed-point fractional library routines.
(line 622)
* __fractdauta: Fixed-point fractional library routines.
(line 629)
* __fractdfda: Fixed-point fractional library routines.
(line 1025)
* __fractdfdq: Fixed-point fractional library routines.
(line 1022)
* __fractdfha: Fixed-point fractional library routines.
(line 1023)
* __fractdfhq: Fixed-point fractional library routines.
(line 1020)
* __fractdfqq: Fixed-point fractional library routines.
(line 1019)
* __fractdfsa: Fixed-point fractional library routines.
(line 1024)
* __fractdfsq: Fixed-point fractional library routines.
(line 1021)
* __fractdfta: Fixed-point fractional library routines.
(line 1026)
* __fractdfuda: Fixed-point fractional library routines.
(line 1033)
* __fractdfudq: Fixed-point fractional library routines.
(line 1030)
* __fractdfuha: Fixed-point fractional library routines.
(line 1031)
* __fractdfuhq: Fixed-point fractional library routines.
(line 1028)
* __fractdfuqq: Fixed-point fractional library routines.
(line 1027)
* __fractdfusa: Fixed-point fractional library routines.
(line 1032)
* __fractdfusq: Fixed-point fractional library routines.
(line 1029)
* __fractdfuta: Fixed-point fractional library routines.
(line 1034)
* __fractdida: Fixed-point fractional library routines.
(line 975)
* __fractdidq: Fixed-point fractional library routines.
(line 972)
* __fractdiha: Fixed-point fractional library routines.
(line 973)
* __fractdihq: Fixed-point fractional library routines.
(line 970)
* __fractdiqq: Fixed-point fractional library routines.
(line 969)
* __fractdisa: Fixed-point fractional library routines.
(line 974)
* __fractdisq: Fixed-point fractional library routines.
(line 971)
* __fractdita: Fixed-point fractional library routines.
(line 976)
* __fractdiuda: Fixed-point fractional library routines.
(line 983)
* __fractdiudq: Fixed-point fractional library routines.
(line 980)
* __fractdiuha: Fixed-point fractional library routines.
(line 981)
* __fractdiuhq: Fixed-point fractional library routines.
(line 978)
* __fractdiuqq: Fixed-point fractional library routines.
(line 977)
* __fractdiusa: Fixed-point fractional library routines.
(line 982)
* __fractdiusq: Fixed-point fractional library routines.
(line 979)
* __fractdiuta: Fixed-point fractional library routines.
(line 984)
* __fractdqda: Fixed-point fractional library routines.
(line 544)
* __fractdqdf: Fixed-point fractional library routines.
(line 566)
* __fractdqdi: Fixed-point fractional library routines.
(line 563)
* __fractdqha: Fixed-point fractional library routines.
(line 542)
* __fractdqhi: Fixed-point fractional library routines.
(line 561)
* __fractdqhq2: Fixed-point fractional library routines.
(line 540)
* __fractdqqi: Fixed-point fractional library routines.
(line 560)
* __fractdqqq2: Fixed-point fractional library routines.
(line 539)
* __fractdqsa: Fixed-point fractional library routines.
(line 543)
* __fractdqsf: Fixed-point fractional library routines.
(line 565)
* __fractdqsi: Fixed-point fractional library routines.
(line 562)
* __fractdqsq2: Fixed-point fractional library routines.
(line 541)
* __fractdqta: Fixed-point fractional library routines.
(line 545)
* __fractdqti: Fixed-point fractional library routines.
(line 564)
* __fractdquda: Fixed-point fractional library routines.
(line 557)
* __fractdqudq: Fixed-point fractional library routines.
(line 552)
* __fractdquha: Fixed-point fractional library routines.
(line 554)
* __fractdquhq: Fixed-point fractional library routines.
(line 548)
* __fractdquqq: Fixed-point fractional library routines.
(line 547)
* __fractdqusa: Fixed-point fractional library routines.
(line 555)
* __fractdqusq: Fixed-point fractional library routines.
(line 550)
* __fractdquta: Fixed-point fractional library routines.
(line 559)
* __fracthada2: Fixed-point fractional library routines.
(line 572)
* __fracthadf: Fixed-point fractional library routines.
(line 590)
* __fracthadi: Fixed-point fractional library routines.
(line 587)
* __fracthadq: Fixed-point fractional library routines.
(line 570)
* __fracthahi: Fixed-point fractional library routines.
(line 585)
* __fracthahq: Fixed-point fractional library routines.
(line 568)
* __fracthaqi: Fixed-point fractional library routines.
(line 584)
* __fracthaqq: Fixed-point fractional library routines.
(line 567)
* __fracthasa2: Fixed-point fractional library routines.
(line 571)
* __fracthasf: Fixed-point fractional library routines.
(line 589)
* __fracthasi: Fixed-point fractional library routines.
(line 586)
* __fracthasq: Fixed-point fractional library routines.
(line 569)
* __fracthata2: Fixed-point fractional library routines.
(line 573)
* __fracthati: Fixed-point fractional library routines.
(line 588)
* __fracthauda: Fixed-point fractional library routines.
(line 581)
* __fracthaudq: Fixed-point fractional library routines.
(line 578)
* __fracthauha: Fixed-point fractional library routines.
(line 579)
* __fracthauhq: Fixed-point fractional library routines.
(line 575)
* __fracthauqq: Fixed-point fractional library routines.
(line 574)
* __fracthausa: Fixed-point fractional library routines.
(line 580)
* __fracthausq: Fixed-point fractional library routines.
(line 576)
* __fracthauta: Fixed-point fractional library routines.
(line 583)
* __fracthida: Fixed-point fractional library routines.
(line 943)
* __fracthidq: Fixed-point fractional library routines.
(line 940)
* __fracthiha: Fixed-point fractional library routines.
(line 941)
* __fracthihq: Fixed-point fractional library routines.
(line 938)
* __fracthiqq: Fixed-point fractional library routines.
(line 937)
* __fracthisa: Fixed-point fractional library routines.
(line 942)
* __fracthisq: Fixed-point fractional library routines.
(line 939)
* __fracthita: Fixed-point fractional library routines.
(line 944)
* __fracthiuda: Fixed-point fractional library routines.
(line 951)
* __fracthiudq: Fixed-point fractional library routines.
(line 948)
* __fracthiuha: Fixed-point fractional library routines.
(line 949)
* __fracthiuhq: Fixed-point fractional library routines.
(line 946)
* __fracthiuqq: Fixed-point fractional library routines.
(line 945)
* __fracthiusa: Fixed-point fractional library routines.
(line 950)
* __fracthiusq: Fixed-point fractional library routines.
(line 947)
* __fracthiuta: Fixed-point fractional library routines.
(line 952)
* __fracthqda: Fixed-point fractional library routines.
(line 498)
* __fracthqdf: Fixed-point fractional library routines.
(line 514)
* __fracthqdi: Fixed-point fractional library routines.
(line 511)
* __fracthqdq2: Fixed-point fractional library routines.
(line 495)
* __fracthqha: Fixed-point fractional library routines.
(line 496)
* __fracthqhi: Fixed-point fractional library routines.
(line 509)
* __fracthqqi: Fixed-point fractional library routines.
(line 508)
* __fracthqqq2: Fixed-point fractional library routines.
(line 493)
* __fracthqsa: Fixed-point fractional library routines.
(line 497)
* __fracthqsf: Fixed-point fractional library routines.
(line 513)
* __fracthqsi: Fixed-point fractional library routines.
(line 510)
* __fracthqsq2: Fixed-point fractional library routines.
(line 494)
* __fracthqta: Fixed-point fractional library routines.
(line 499)
* __fracthqti: Fixed-point fractional library routines.
(line 512)
* __fracthquda: Fixed-point fractional library routines.
(line 506)
* __fracthqudq: Fixed-point fractional library routines.
(line 503)
* __fracthquha: Fixed-point fractional library routines.
(line 504)
* __fracthquhq: Fixed-point fractional library routines.
(line 501)
* __fracthquqq: Fixed-point fractional library routines.
(line 500)
* __fracthqusa: Fixed-point fractional library routines.
(line 505)
* __fracthqusq: Fixed-point fractional library routines.
(line 502)
* __fracthquta: Fixed-point fractional library routines.
(line 507)
* __fractqida: Fixed-point fractional library routines.
(line 925)
* __fractqidq: Fixed-point fractional library routines.
(line 922)
* __fractqiha: Fixed-point fractional library routines.
(line 923)
* __fractqihq: Fixed-point fractional library routines.
(line 920)
* __fractqiqq: Fixed-point fractional library routines.
(line 919)
* __fractqisa: Fixed-point fractional library routines.
(line 924)
* __fractqisq: Fixed-point fractional library routines.
(line 921)
* __fractqita: Fixed-point fractional library routines.
(line 926)
* __fractqiuda: Fixed-point fractional library routines.
(line 934)
* __fractqiudq: Fixed-point fractional library routines.
(line 931)
* __fractqiuha: Fixed-point fractional library routines.
(line 932)
* __fractqiuhq: Fixed-point fractional library routines.
(line 928)
* __fractqiuqq: Fixed-point fractional library routines.
(line 927)
* __fractqiusa: Fixed-point fractional library routines.
(line 933)
* __fractqiusq: Fixed-point fractional library routines.
(line 929)
* __fractqiuta: Fixed-point fractional library routines.
(line 936)
* __fractqqda: Fixed-point fractional library routines.
(line 474)
* __fractqqdf: Fixed-point fractional library routines.
(line 492)
* __fractqqdi: Fixed-point fractional library routines.
(line 489)
* __fractqqdq2: Fixed-point fractional library routines.
(line 471)
* __fractqqha: Fixed-point fractional library routines.
(line 472)
* __fractqqhi: Fixed-point fractional library routines.
(line 487)
* __fractqqhq2: Fixed-point fractional library routines.
(line 469)
* __fractqqqi: Fixed-point fractional library routines.
(line 486)
* __fractqqsa: Fixed-point fractional library routines.
(line 473)
* __fractqqsf: Fixed-point fractional library routines.
(line 491)
* __fractqqsi: Fixed-point fractional library routines.
(line 488)
* __fractqqsq2: Fixed-point fractional library routines.
(line 470)
* __fractqqta: Fixed-point fractional library routines.
(line 475)
* __fractqqti: Fixed-point fractional library routines.
(line 490)
* __fractqquda: Fixed-point fractional library routines.
(line 483)
* __fractqqudq: Fixed-point fractional library routines.
(line 480)
* __fractqquha: Fixed-point fractional library routines.
(line 481)
* __fractqquhq: Fixed-point fractional library routines.
(line 477)
* __fractqquqq: Fixed-point fractional library routines.
(line 476)
* __fractqqusa: Fixed-point fractional library routines.
(line 482)
* __fractqqusq: Fixed-point fractional library routines.
(line 478)
* __fractqquta: Fixed-point fractional library routines.
(line 485)
* __fractsada2: Fixed-point fractional library routines.
(line 596)
* __fractsadf: Fixed-point fractional library routines.
(line 612)
* __fractsadi: Fixed-point fractional library routines.
(line 609)
* __fractsadq: Fixed-point fractional library routines.
(line 594)
* __fractsaha2: Fixed-point fractional library routines.
(line 595)
* __fractsahi: Fixed-point fractional library routines.
(line 607)
* __fractsahq: Fixed-point fractional library routines.
(line 592)
* __fractsaqi: Fixed-point fractional library routines.
(line 606)
* __fractsaqq: Fixed-point fractional library routines.
(line 591)
* __fractsasf: Fixed-point fractional library routines.
(line 611)
* __fractsasi: Fixed-point fractional library routines.
(line 608)
* __fractsasq: Fixed-point fractional library routines.
(line 593)
* __fractsata2: Fixed-point fractional library routines.
(line 597)
* __fractsati: Fixed-point fractional library routines.
(line 610)
* __fractsauda: Fixed-point fractional library routines.
(line 604)
* __fractsaudq: Fixed-point fractional library routines.
(line 601)
* __fractsauha: Fixed-point fractional library routines.
(line 602)
* __fractsauhq: Fixed-point fractional library routines.
(line 599)
* __fractsauqq: Fixed-point fractional library routines.
(line 598)
* __fractsausa: Fixed-point fractional library routines.
(line 603)
* __fractsausq: Fixed-point fractional library routines.
(line 600)
* __fractsauta: Fixed-point fractional library routines.
(line 605)
* __fractsfda: Fixed-point fractional library routines.
(line 1009)
* __fractsfdq: Fixed-point fractional library routines.
(line 1006)
* __fractsfha: Fixed-point fractional library routines.
(line 1007)
* __fractsfhq: Fixed-point fractional library routines.
(line 1004)
* __fractsfqq: Fixed-point fractional library routines.
(line 1003)
* __fractsfsa: Fixed-point fractional library routines.
(line 1008)
* __fractsfsq: Fixed-point fractional library routines.
(line 1005)
* __fractsfta: Fixed-point fractional library routines.
(line 1010)
* __fractsfuda: Fixed-point fractional library routines.
(line 1017)
* __fractsfudq: Fixed-point fractional library routines.
(line 1014)
* __fractsfuha: Fixed-point fractional library routines.
(line 1015)
* __fractsfuhq: Fixed-point fractional library routines.
(line 1012)
* __fractsfuqq: Fixed-point fractional library routines.
(line 1011)
* __fractsfusa: Fixed-point fractional library routines.
(line 1016)
* __fractsfusq: Fixed-point fractional library routines.
(line 1013)
* __fractsfuta: Fixed-point fractional library routines.
(line 1018)
* __fractsida: Fixed-point fractional library routines.
(line 959)
* __fractsidq: Fixed-point fractional library routines.
(line 956)
* __fractsiha: Fixed-point fractional library routines.
(line 957)
* __fractsihq: Fixed-point fractional library routines.
(line 954)
* __fractsiqq: Fixed-point fractional library routines.
(line 953)
* __fractsisa: Fixed-point fractional library routines.
(line 958)
* __fractsisq: Fixed-point fractional library routines.
(line 955)
* __fractsita: Fixed-point fractional library routines.
(line 960)
* __fractsiuda: Fixed-point fractional library routines.
(line 967)
* __fractsiudq: Fixed-point fractional library routines.
(line 964)
* __fractsiuha: Fixed-point fractional library routines.
(line 965)
* __fractsiuhq: Fixed-point fractional library routines.
(line 962)
* __fractsiuqq: Fixed-point fractional library routines.
(line 961)
* __fractsiusa: Fixed-point fractional library routines.
(line 966)
* __fractsiusq: Fixed-point fractional library routines.
(line 963)
* __fractsiuta: Fixed-point fractional library routines.
(line 968)
* __fractsqda: Fixed-point fractional library routines.
(line 520)
* __fractsqdf: Fixed-point fractional library routines.
(line 538)
* __fractsqdi: Fixed-point fractional library routines.
(line 535)
* __fractsqdq2: Fixed-point fractional library routines.
(line 517)
* __fractsqha: Fixed-point fractional library routines.
(line 518)
* __fractsqhi: Fixed-point fractional library routines.
(line 533)
* __fractsqhq2: Fixed-point fractional library routines.
(line 516)
* __fractsqqi: Fixed-point fractional library routines.
(line 532)
* __fractsqqq2: Fixed-point fractional library routines.
(line 515)
* __fractsqsa: Fixed-point fractional library routines.
(line 519)
* __fractsqsf: Fixed-point fractional library routines.
(line 537)
* __fractsqsi: Fixed-point fractional library routines.
(line 534)
* __fractsqta: Fixed-point fractional library routines.
(line 521)
* __fractsqti: Fixed-point fractional library routines.
(line 536)
* __fractsquda: Fixed-point fractional library routines.
(line 529)
* __fractsqudq: Fixed-point fractional library routines.
(line 526)
* __fractsquha: Fixed-point fractional library routines.
(line 527)
* __fractsquhq: Fixed-point fractional library routines.
(line 523)
* __fractsquqq: Fixed-point fractional library routines.
(line 522)
* __fractsqusa: Fixed-point fractional library routines.
(line 528)
* __fractsqusq: Fixed-point fractional library routines.
(line 524)
* __fractsquta: Fixed-point fractional library routines.
(line 531)
* __fracttada2: Fixed-point fractional library routines.
(line 643)
* __fracttadf: Fixed-point fractional library routines.
(line 664)
* __fracttadi: Fixed-point fractional library routines.
(line 661)
* __fracttadq: Fixed-point fractional library routines.
(line 640)
* __fracttaha2: Fixed-point fractional library routines.
(line 641)
* __fracttahi: Fixed-point fractional library routines.
(line 659)
* __fracttahq: Fixed-point fractional library routines.
(line 638)
* __fracttaqi: Fixed-point fractional library routines.
(line 658)
* __fracttaqq: Fixed-point fractional library routines.
(line 637)
* __fracttasa2: Fixed-point fractional library routines.
(line 642)
* __fracttasf: Fixed-point fractional library routines.
(line 663)
* __fracttasi: Fixed-point fractional library routines.
(line 660)
* __fracttasq: Fixed-point fractional library routines.
(line 639)
* __fracttati: Fixed-point fractional library routines.
(line 662)
* __fracttauda: Fixed-point fractional library routines.
(line 655)
* __fracttaudq: Fixed-point fractional library routines.
(line 650)
* __fracttauha: Fixed-point fractional library routines.
(line 652)
* __fracttauhq: Fixed-point fractional library routines.
(line 646)
* __fracttauqq: Fixed-point fractional library routines.
(line 645)
* __fracttausa: Fixed-point fractional library routines.
(line 653)
* __fracttausq: Fixed-point fractional library routines.
(line 648)
* __fracttauta: Fixed-point fractional library routines.
(line 657)
* __fracttida: Fixed-point fractional library routines.
(line 991)
* __fracttidq: Fixed-point fractional library routines.
(line 988)
* __fracttiha: Fixed-point fractional library routines.
(line 989)
* __fracttihq: Fixed-point fractional library routines.
(line 986)
* __fracttiqq: Fixed-point fractional library routines.
(line 985)
* __fracttisa: Fixed-point fractional library routines.
(line 990)
* __fracttisq: Fixed-point fractional library routines.
(line 987)
* __fracttita: Fixed-point fractional library routines.
(line 992)
* __fracttiuda: Fixed-point fractional library routines.
(line 1000)
* __fracttiudq: Fixed-point fractional library routines.
(line 997)
* __fracttiuha: Fixed-point fractional library routines.
(line 998)
* __fracttiuhq: Fixed-point fractional library routines.
(line 994)
* __fracttiuqq: Fixed-point fractional library routines.
(line 993)
* __fracttiusa: Fixed-point fractional library routines.
(line 999)
* __fracttiusq: Fixed-point fractional library routines.
(line 995)
* __fracttiuta: Fixed-point fractional library routines.
(line 1002)
* __fractudada: Fixed-point fractional library routines.
(line 858)
* __fractudadf: Fixed-point fractional library routines.
(line 881)
* __fractudadi: Fixed-point fractional library routines.
(line 878)
* __fractudadq: Fixed-point fractional library routines.
(line 855)
* __fractudaha: Fixed-point fractional library routines.
(line 856)
* __fractudahi: Fixed-point fractional library routines.
(line 876)
* __fractudahq: Fixed-point fractional library routines.
(line 852)
* __fractudaqi: Fixed-point fractional library routines.
(line 875)
* __fractudaqq: Fixed-point fractional library routines.
(line 851)
* __fractudasa: Fixed-point fractional library routines.
(line 857)
* __fractudasf: Fixed-point fractional library routines.
(line 880)
* __fractudasi: Fixed-point fractional library routines.
(line 877)
* __fractudasq: Fixed-point fractional library routines.
(line 853)
* __fractudata: Fixed-point fractional library routines.
(line 860)
* __fractudati: Fixed-point fractional library routines.
(line 879)
* __fractudaudq: Fixed-point fractional library routines.
(line 868)
* __fractudauha2: Fixed-point fractional library routines.
(line 870)
* __fractudauhq: Fixed-point fractional library routines.
(line 864)
* __fractudauqq: Fixed-point fractional library routines.
(line 862)
* __fractudausa2: Fixed-point fractional library routines.
(line 872)
* __fractudausq: Fixed-point fractional library routines.
(line 866)
* __fractudauta2: Fixed-point fractional library routines.
(line 874)
* __fractudqda: Fixed-point fractional library routines.
(line 766)
* __fractudqdf: Fixed-point fractional library routines.
(line 791)
* __fractudqdi: Fixed-point fractional library routines.
(line 787)
* __fractudqdq: Fixed-point fractional library routines.
(line 761)
* __fractudqha: Fixed-point fractional library routines.
(line 763)
* __fractudqhi: Fixed-point fractional library routines.
(line 785)
* __fractudqhq: Fixed-point fractional library routines.
(line 757)
* __fractudqqi: Fixed-point fractional library routines.
(line 784)
* __fractudqqq: Fixed-point fractional library routines.
(line 756)
* __fractudqsa: Fixed-point fractional library routines.
(line 764)
* __fractudqsf: Fixed-point fractional library routines.
(line 790)
* __fractudqsi: Fixed-point fractional library routines.
(line 786)
* __fractudqsq: Fixed-point fractional library routines.
(line 759)
* __fractudqta: Fixed-point fractional library routines.
(line 768)
* __fractudqti: Fixed-point fractional library routines.
(line 789)
* __fractudquda: Fixed-point fractional library routines.
(line 780)
* __fractudquha: Fixed-point fractional library routines.
(line 776)
* __fractudquhq2: Fixed-point fractional library routines.
(line 772)
* __fractudquqq2: Fixed-point fractional library routines.
(line 770)
* __fractudqusa: Fixed-point fractional library routines.
(line 778)
* __fractudqusq2: Fixed-point fractional library routines.
(line 774)
* __fractudquta: Fixed-point fractional library routines.
(line 782)
* __fractuhada: Fixed-point fractional library routines.
(line 799)
* __fractuhadf: Fixed-point fractional library routines.
(line 822)
* __fractuhadi: Fixed-point fractional library routines.
(line 819)
* __fractuhadq: Fixed-point fractional library routines.
(line 796)
* __fractuhaha: Fixed-point fractional library routines.
(line 797)
* __fractuhahi: Fixed-point fractional library routines.
(line 817)
* __fractuhahq: Fixed-point fractional library routines.
(line 793)
* __fractuhaqi: Fixed-point fractional library routines.
(line 816)
* __fractuhaqq: Fixed-point fractional library routines.
(line 792)
* __fractuhasa: Fixed-point fractional library routines.
(line 798)
* __fractuhasf: Fixed-point fractional library routines.
(line 821)
* __fractuhasi: Fixed-point fractional library routines.
(line 818)
* __fractuhasq: Fixed-point fractional library routines.
(line 794)
* __fractuhata: Fixed-point fractional library routines.
(line 801)
* __fractuhati: Fixed-point fractional library routines.
(line 820)
* __fractuhauda2: Fixed-point fractional library routines.
(line 813)
* __fractuhaudq: Fixed-point fractional library routines.
(line 809)
* __fractuhauhq: Fixed-point fractional library routines.
(line 805)
* __fractuhauqq: Fixed-point fractional library routines.
(line 803)
* __fractuhausa2: Fixed-point fractional library routines.
(line 811)
* __fractuhausq: Fixed-point fractional library routines.
(line 807)
* __fractuhauta2: Fixed-point fractional library routines.
(line 815)
* __fractuhqda: Fixed-point fractional library routines.
(line 702)
* __fractuhqdf: Fixed-point fractional library routines.
(line 723)
* __fractuhqdi: Fixed-point fractional library routines.
(line 720)
* __fractuhqdq: Fixed-point fractional library routines.
(line 699)
* __fractuhqha: Fixed-point fractional library routines.
(line 700)
* __fractuhqhi: Fixed-point fractional library routines.
(line 718)
* __fractuhqhq: Fixed-point fractional library routines.
(line 697)
* __fractuhqqi: Fixed-point fractional library routines.
(line 717)
* __fractuhqqq: Fixed-point fractional library routines.
(line 696)
* __fractuhqsa: Fixed-point fractional library routines.
(line 701)
* __fractuhqsf: Fixed-point fractional library routines.
(line 722)
* __fractuhqsi: Fixed-point fractional library routines.
(line 719)
* __fractuhqsq: Fixed-point fractional library routines.
(line 698)
* __fractuhqta: Fixed-point fractional library routines.
(line 703)
* __fractuhqti: Fixed-point fractional library routines.
(line 721)
* __fractuhquda: Fixed-point fractional library routines.
(line 714)
* __fractuhqudq2: Fixed-point fractional library routines.
(line 709)
* __fractuhquha: Fixed-point fractional library routines.
(line 711)
* __fractuhquqq2: Fixed-point fractional library routines.
(line 705)
* __fractuhqusa: Fixed-point fractional library routines.
(line 712)
* __fractuhqusq2: Fixed-point fractional library routines.
(line 707)
* __fractuhquta: Fixed-point fractional library routines.
(line 716)
* __fractunsdadi: Fixed-point fractional library routines.
(line 1555)
* __fractunsdahi: Fixed-point fractional library routines.
(line 1553)
* __fractunsdaqi: Fixed-point fractional library routines.
(line 1552)
* __fractunsdasi: Fixed-point fractional library routines.
(line 1554)
* __fractunsdati: Fixed-point fractional library routines.
(line 1556)
* __fractunsdida: Fixed-point fractional library routines.
(line 1707)
* __fractunsdidq: Fixed-point fractional library routines.
(line 1704)
* __fractunsdiha: Fixed-point fractional library routines.
(line 1705)
* __fractunsdihq: Fixed-point fractional library routines.
(line 1702)
* __fractunsdiqq: Fixed-point fractional library routines.
(line 1701)
* __fractunsdisa: Fixed-point fractional library routines.
(line 1706)
* __fractunsdisq: Fixed-point fractional library routines.
(line 1703)
* __fractunsdita: Fixed-point fractional library routines.
(line 1708)
* __fractunsdiuda: Fixed-point fractional library routines.
(line 1720)
* __fractunsdiudq: Fixed-point fractional library routines.
(line 1715)
* __fractunsdiuha: Fixed-point fractional library routines.
(line 1717)
* __fractunsdiuhq: Fixed-point fractional library routines.
(line 1711)
* __fractunsdiuqq: Fixed-point fractional library routines.
(line 1710)
* __fractunsdiusa: Fixed-point fractional library routines.
(line 1718)
* __fractunsdiusq: Fixed-point fractional library routines.
(line 1713)
* __fractunsdiuta: Fixed-point fractional library routines.
(line 1722)
* __fractunsdqdi: Fixed-point fractional library routines.
(line 1539)
* __fractunsdqhi: Fixed-point fractional library routines.
(line 1537)
* __fractunsdqqi: Fixed-point fractional library routines.
(line 1536)
* __fractunsdqsi: Fixed-point fractional library routines.
(line 1538)
* __fractunsdqti: Fixed-point fractional library routines.
(line 1541)
* __fractunshadi: Fixed-point fractional library routines.
(line 1545)
* __fractunshahi: Fixed-point fractional library routines.
(line 1543)
* __fractunshaqi: Fixed-point fractional library routines.
(line 1542)
* __fractunshasi: Fixed-point fractional library routines.
(line 1544)
* __fractunshati: Fixed-point fractional library routines.
(line 1546)
* __fractunshida: Fixed-point fractional library routines.
(line 1663)
* __fractunshidq: Fixed-point fractional library routines.
(line 1660)
* __fractunshiha: Fixed-point fractional library routines.
(line 1661)
* __fractunshihq: Fixed-point fractional library routines.
(line 1658)
* __fractunshiqq: Fixed-point fractional library routines.
(line 1657)
* __fractunshisa: Fixed-point fractional library routines.
(line 1662)
* __fractunshisq: Fixed-point fractional library routines.
(line 1659)
* __fractunshita: Fixed-point fractional library routines.
(line 1664)
* __fractunshiuda: Fixed-point fractional library routines.
(line 1676)
* __fractunshiudq: Fixed-point fractional library routines.
(line 1671)
* __fractunshiuha: Fixed-point fractional library routines.
(line 1673)
* __fractunshiuhq: Fixed-point fractional library routines.
(line 1667)
* __fractunshiuqq: Fixed-point fractional library routines.
(line 1666)
* __fractunshiusa: Fixed-point fractional library routines.
(line 1674)
* __fractunshiusq: Fixed-point fractional library routines.
(line 1669)
* __fractunshiuta: Fixed-point fractional library routines.
(line 1678)
* __fractunshqdi: Fixed-point fractional library routines.
(line 1529)
* __fractunshqhi: Fixed-point fractional library routines.
(line 1527)
* __fractunshqqi: Fixed-point fractional library routines.
(line 1526)
* __fractunshqsi: Fixed-point fractional library routines.
(line 1528)
* __fractunshqti: Fixed-point fractional library routines.
(line 1530)
* __fractunsqida: Fixed-point fractional library routines.
(line 1641)
* __fractunsqidq: Fixed-point fractional library routines.
(line 1638)
* __fractunsqiha: Fixed-point fractional library routines.
(line 1639)
* __fractunsqihq: Fixed-point fractional library routines.
(line 1636)
* __fractunsqiqq: Fixed-point fractional library routines.
(line 1635)
* __fractunsqisa: Fixed-point fractional library routines.
(line 1640)
* __fractunsqisq: Fixed-point fractional library routines.
(line 1637)
* __fractunsqita: Fixed-point fractional library routines.
(line 1642)
* __fractunsqiuda: Fixed-point fractional library routines.
(line 1654)
* __fractunsqiudq: Fixed-point fractional library routines.
(line 1649)
* __fractunsqiuha: Fixed-point fractional library routines.
(line 1651)
* __fractunsqiuhq: Fixed-point fractional library routines.
(line 1645)
* __fractunsqiuqq: Fixed-point fractional library routines.
(line 1644)
* __fractunsqiusa: Fixed-point fractional library routines.
(line 1652)
* __fractunsqiusq: Fixed-point fractional library routines.
(line 1647)
* __fractunsqiuta: Fixed-point fractional library routines.
(line 1656)
* __fractunsqqdi: Fixed-point fractional library routines.
(line 1524)
* __fractunsqqhi: Fixed-point fractional library routines.
(line 1522)
* __fractunsqqqi: Fixed-point fractional library routines.
(line 1521)
* __fractunsqqsi: Fixed-point fractional library routines.
(line 1523)
* __fractunsqqti: Fixed-point fractional library routines.
(line 1525)
* __fractunssadi: Fixed-point fractional library routines.
(line 1550)
* __fractunssahi: Fixed-point fractional library routines.
(line 1548)
* __fractunssaqi: Fixed-point fractional library routines.
(line 1547)
* __fractunssasi: Fixed-point fractional library routines.
(line 1549)
* __fractunssati: Fixed-point fractional library routines.
(line 1551)
* __fractunssida: Fixed-point fractional library routines.
(line 1685)
* __fractunssidq: Fixed-point fractional library routines.
(line 1682)
* __fractunssiha: Fixed-point fractional library routines.
(line 1683)
* __fractunssihq: Fixed-point fractional library routines.
(line 1680)
* __fractunssiqq: Fixed-point fractional library routines.
(line 1679)
* __fractunssisa: Fixed-point fractional library routines.
(line 1684)
* __fractunssisq: Fixed-point fractional library routines.
(line 1681)
* __fractunssita: Fixed-point fractional library routines.
(line 1686)
* __fractunssiuda: Fixed-point fractional library routines.
(line 1698)
* __fractunssiudq: Fixed-point fractional library routines.
(line 1693)
* __fractunssiuha: Fixed-point fractional library routines.
(line 1695)
* __fractunssiuhq: Fixed-point fractional library routines.
(line 1689)
* __fractunssiuqq: Fixed-point fractional library routines.
(line 1688)
* __fractunssiusa: Fixed-point fractional library routines.
(line 1696)
* __fractunssiusq: Fixed-point fractional library routines.
(line 1691)
* __fractunssiuta: Fixed-point fractional library routines.
(line 1700)
* __fractunssqdi: Fixed-point fractional library routines.
(line 1534)
* __fractunssqhi: Fixed-point fractional library routines.
(line 1532)
* __fractunssqqi: Fixed-point fractional library routines.
(line 1531)
* __fractunssqsi: Fixed-point fractional library routines.
(line 1533)
* __fractunssqti: Fixed-point fractional library routines.
(line 1535)
* __fractunstadi: Fixed-point fractional library routines.
(line 1560)
* __fractunstahi: Fixed-point fractional library routines.
(line 1558)
* __fractunstaqi: Fixed-point fractional library routines.
(line 1557)
* __fractunstasi: Fixed-point fractional library routines.
(line 1559)
* __fractunstati: Fixed-point fractional library routines.
(line 1562)
* __fractunstida: Fixed-point fractional library routines.
(line 1730)
* __fractunstidq: Fixed-point fractional library routines.
(line 1727)
* __fractunstiha: Fixed-point fractional library routines.
(line 1728)
* __fractunstihq: Fixed-point fractional library routines.
(line 1724)
* __fractunstiqq: Fixed-point fractional library routines.
(line 1723)
* __fractunstisa: Fixed-point fractional library routines.
(line 1729)
* __fractunstisq: Fixed-point fractional library routines.
(line 1725)
* __fractunstita: Fixed-point fractional library routines.
(line 1732)
* __fractunstiuda: Fixed-point fractional library routines.
(line 1746)
* __fractunstiudq: Fixed-point fractional library routines.
(line 1740)
* __fractunstiuha: Fixed-point fractional library routines.
(line 1742)
* __fractunstiuhq: Fixed-point fractional library routines.
(line 1736)
* __fractunstiuqq: Fixed-point fractional library routines.
(line 1734)
* __fractunstiusa: Fixed-point fractional library routines.
(line 1744)
* __fractunstiusq: Fixed-point fractional library routines.
(line 1738)
* __fractunstiuta: Fixed-point fractional library routines.
(line 1748)
* __fractunsudadi: Fixed-point fractional library routines.
(line 1622)
* __fractunsudahi: Fixed-point fractional library routines.
(line 1618)
* __fractunsudaqi: Fixed-point fractional library routines.
(line 1616)
* __fractunsudasi: Fixed-point fractional library routines.
(line 1620)
* __fractunsudati: Fixed-point fractional library routines.
(line 1624)
* __fractunsudqdi: Fixed-point fractional library routines.
(line 1596)
* __fractunsudqhi: Fixed-point fractional library routines.
(line 1592)
* __fractunsudqqi: Fixed-point fractional library routines.
(line 1590)
* __fractunsudqsi: Fixed-point fractional library routines.
(line 1594)
* __fractunsudqti: Fixed-point fractional library routines.
(line 1598)
* __fractunsuhadi: Fixed-point fractional library routines.
(line 1606)
* __fractunsuhahi: Fixed-point fractional library routines.
(line 1602)
* __fractunsuhaqi: Fixed-point fractional library routines.
(line 1600)
* __fractunsuhasi: Fixed-point fractional library routines.
(line 1604)
* __fractunsuhati: Fixed-point fractional library routines.
(line 1608)
* __fractunsuhqdi: Fixed-point fractional library routines.
(line 1576)
* __fractunsuhqhi: Fixed-point fractional library routines.
(line 1574)
* __fractunsuhqqi: Fixed-point fractional library routines.
(line 1573)
* __fractunsuhqsi: Fixed-point fractional library routines.
(line 1575)
* __fractunsuhqti: Fixed-point fractional library routines.
(line 1578)
* __fractunsuqqdi: Fixed-point fractional library routines.
(line 1570)
* __fractunsuqqhi: Fixed-point fractional library routines.
(line 1566)
* __fractunsuqqqi: Fixed-point fractional library routines.
(line 1564)
* __fractunsuqqsi: Fixed-point fractional library routines.
(line 1568)
* __fractunsuqqti: Fixed-point fractional library routines.
(line 1572)
* __fractunsusadi: Fixed-point fractional library routines.
(line 1612)
* __fractunsusahi: Fixed-point fractional library routines.
(line 1610)
* __fractunsusaqi: Fixed-point fractional library routines.
(line 1609)
* __fractunsusasi: Fixed-point fractional library routines.
(line 1611)
* __fractunsusati: Fixed-point fractional library routines.
(line 1614)
* __fractunsusqdi: Fixed-point fractional library routines.
(line 1586)
* __fractunsusqhi: Fixed-point fractional library routines.
(line 1582)
* __fractunsusqqi: Fixed-point fractional library routines.
(line 1580)
* __fractunsusqsi: Fixed-point fractional library routines.
(line 1584)
* __fractunsusqti: Fixed-point fractional library routines.
(line 1588)
* __fractunsutadi: Fixed-point fractional library routines.
(line 1632)
* __fractunsutahi: Fixed-point fractional library routines.
(line 1628)
* __fractunsutaqi: Fixed-point fractional library routines.
(line 1626)
* __fractunsutasi: Fixed-point fractional library routines.
(line 1630)
* __fractunsutati: Fixed-point fractional library routines.
(line 1634)
* __fractuqqda: Fixed-point fractional library routines.
(line 672)
* __fractuqqdf: Fixed-point fractional library routines.
(line 695)
* __fractuqqdi: Fixed-point fractional library routines.
(line 692)
* __fractuqqdq: Fixed-point fractional library routines.
(line 669)
* __fractuqqha: Fixed-point fractional library routines.
(line 670)
* __fractuqqhi: Fixed-point fractional library routines.
(line 690)
* __fractuqqhq: Fixed-point fractional library routines.
(line 666)
* __fractuqqqi: Fixed-point fractional library routines.
(line 689)
* __fractuqqqq: Fixed-point fractional library routines.
(line 665)
* __fractuqqsa: Fixed-point fractional library routines.
(line 671)
* __fractuqqsf: Fixed-point fractional library routines.
(line 694)
* __fractuqqsi: Fixed-point fractional library routines.
(line 691)
* __fractuqqsq: Fixed-point fractional library routines.
(line 667)
* __fractuqqta: Fixed-point fractional library routines.
(line 674)
* __fractuqqti: Fixed-point fractional library routines.
(line 693)
* __fractuqquda: Fixed-point fractional library routines.
(line 686)
* __fractuqqudq2: Fixed-point fractional library routines.
(line 680)
* __fractuqquha: Fixed-point fractional library routines.
(line 682)
* __fractuqquhq2: Fixed-point fractional library routines.
(line 676)
* __fractuqqusa: Fixed-point fractional library routines.
(line 684)
* __fractuqqusq2: Fixed-point fractional library routines.
(line 678)
* __fractuqquta: Fixed-point fractional library routines.
(line 688)
* __fractusada: Fixed-point fractional library routines.
(line 829)
* __fractusadf: Fixed-point fractional library routines.
(line 850)
* __fractusadi: Fixed-point fractional library routines.
(line 847)
* __fractusadq: Fixed-point fractional library routines.
(line 826)
* __fractusaha: Fixed-point fractional library routines.
(line 827)
* __fractusahi: Fixed-point fractional library routines.
(line 845)
* __fractusahq: Fixed-point fractional library routines.
(line 824)
* __fractusaqi: Fixed-point fractional library routines.
(line 844)
* __fractusaqq: Fixed-point fractional library routines.
(line 823)
* __fractusasa: Fixed-point fractional library routines.
(line 828)
* __fractusasf: Fixed-point fractional library routines.
(line 849)
* __fractusasi: Fixed-point fractional library routines.
(line 846)
* __fractusasq: Fixed-point fractional library routines.
(line 825)
* __fractusata: Fixed-point fractional library routines.
(line 830)
* __fractusati: Fixed-point fractional library routines.
(line 848)
* __fractusauda2: Fixed-point fractional library routines.
(line 841)
* __fractusaudq: Fixed-point fractional library routines.
(line 837)
* __fractusauha2: Fixed-point fractional library routines.
(line 839)
* __fractusauhq: Fixed-point fractional library routines.
(line 833)
* __fractusauqq: Fixed-point fractional library routines.
(line 832)
* __fractusausq: Fixed-point fractional library routines.
(line 835)
* __fractusauta2: Fixed-point fractional library routines.
(line 843)
* __fractusqda: Fixed-point fractional library routines.
(line 731)
* __fractusqdf: Fixed-point fractional library routines.
(line 754)
* __fractusqdi: Fixed-point fractional library routines.
(line 751)
* __fractusqdq: Fixed-point fractional library routines.
(line 728)
* __fractusqha: Fixed-point fractional library routines.
(line 729)
* __fractusqhi: Fixed-point fractional library routines.
(line 749)
* __fractusqhq: Fixed-point fractional library routines.
(line 725)
* __fractusqqi: Fixed-point fractional library routines.
(line 748)
* __fractusqqq: Fixed-point fractional library routines.
(line 724)
* __fractusqsa: Fixed-point fractional library routines.
(line 730)
* __fractusqsf: Fixed-point fractional library routines.
(line 753)
* __fractusqsi: Fixed-point fractional library routines.
(line 750)
* __fractusqsq: Fixed-point fractional library routines.
(line 726)
* __fractusqta: Fixed-point fractional library routines.
(line 733)
* __fractusqti: Fixed-point fractional library routines.
(line 752)
* __fractusquda: Fixed-point fractional library routines.
(line 745)
* __fractusqudq2: Fixed-point fractional library routines.
(line 739)
* __fractusquha: Fixed-point fractional library routines.
(line 741)
* __fractusquhq2: Fixed-point fractional library routines.
(line 737)
* __fractusquqq2: Fixed-point fractional library routines.
(line 735)
* __fractusqusa: Fixed-point fractional library routines.
(line 743)
* __fractusquta: Fixed-point fractional library routines.
(line 747)
* __fractutada: Fixed-point fractional library routines.
(line 893)
* __fractutadf: Fixed-point fractional library routines.
(line 918)
* __fractutadi: Fixed-point fractional library routines.
(line 914)
* __fractutadq: Fixed-point fractional library routines.
(line 888)
* __fractutaha: Fixed-point fractional library routines.
(line 890)
* __fractutahi: Fixed-point fractional library routines.
(line 912)
* __fractutahq: Fixed-point fractional library routines.
(line 884)
* __fractutaqi: Fixed-point fractional library routines.
(line 911)
* __fractutaqq: Fixed-point fractional library routines.
(line 883)
* __fractutasa: Fixed-point fractional library routines.
(line 891)
* __fractutasf: Fixed-point fractional library routines.
(line 917)
* __fractutasi: Fixed-point fractional library routines.
(line 913)
* __fractutasq: Fixed-point fractional library routines.
(line 886)
* __fractutata: Fixed-point fractional library routines.
(line 895)
* __fractutati: Fixed-point fractional library routines.
(line 916)
* __fractutauda2: Fixed-point fractional library routines.
(line 909)
* __fractutaudq: Fixed-point fractional library routines.
(line 903)
* __fractutauha2: Fixed-point fractional library routines.
(line 905)
* __fractutauhq: Fixed-point fractional library routines.
(line 899)
* __fractutauqq: Fixed-point fractional library routines.
(line 897)
* __fractutausa2: Fixed-point fractional library routines.
(line 907)
* __fractutausq: Fixed-point fractional library routines.
(line 901)
* __gedf2: Soft float library routines.
(line 206)
* __gesf2: Soft float library routines.
(line 205)
* __getf2: Soft float library routines.
(line 207)
* __gtdf2: Soft float library routines.
(line 224)
* __gtsf2: Soft float library routines.
(line 223)
* __gttf2: Soft float library routines.
(line 225)
* __ledf2: Soft float library routines.
(line 218)
* __lesf2: Soft float library routines.
(line 217)
* __letf2: Soft float library routines.
(line 219)
* __lshrdi3: Integer library routines.
(line 31)
* __lshrsi3: Integer library routines.
(line 30)
* __lshrti3: Integer library routines.
(line 32)
* __lshruda3: Fixed-point fractional library routines.
(line 390)
* __lshrudq3: Fixed-point fractional library routines.
(line 384)
* __lshruha3: Fixed-point fractional library routines.
(line 386)
* __lshruhq3: Fixed-point fractional library routines.
(line 380)
* __lshruqq3: Fixed-point fractional library routines.
(line 378)
* __lshrusa3: Fixed-point fractional library routines.
(line 388)
* __lshrusq3: Fixed-point fractional library routines.
(line 382)
* __lshruta3: Fixed-point fractional library routines.
(line 392)
* __ltdf2: Soft float library routines.
(line 212)
* __ltsf2: Soft float library routines.
(line 211)
* __lttf2: Soft float library routines.
(line 213)
* __main: Collect2. (line 15)
* __moddi3: Integer library routines.
(line 37)
* __modsi3: Integer library routines.
(line 36)
* __modti3: Integer library routines.
(line 38)
* __morestack_current_segment: Miscellaneous routines.
(line 46)
* __morestack_initial_sp: Miscellaneous routines.
(line 47)
* __morestack_segments: Miscellaneous routines.
(line 45)
* __mulda3: Fixed-point fractional library routines.
(line 171)
* __muldc3: Soft float library routines.
(line 241)
* __muldf3: Soft float library routines.
(line 40)
* __muldi3: Integer library routines.
(line 43)
* __muldq3: Fixed-point fractional library routines.
(line 159)
* __mulha3: Fixed-point fractional library routines.
(line 169)
* __mulhq3: Fixed-point fractional library routines.
(line 156)
* __mulqq3: Fixed-point fractional library routines.
(line 155)
* __mulsa3: Fixed-point fractional library routines.
(line 170)
* __mulsc3: Soft float library routines.
(line 239)
* __mulsf3: Soft float library routines.
(line 39)
* __mulsi3: Integer library routines.
(line 42)
* __mulsq3: Fixed-point fractional library routines.
(line 157)
* __multa3: Fixed-point fractional library routines.
(line 173)
* __multc3: Soft float library routines.
(line 243)
* __multf3: Soft float library routines.
(line 42)
* __multi3: Integer library routines.
(line 44)
* __muluda3: Fixed-point fractional library routines.
(line 179)
* __muludq3: Fixed-point fractional library routines.
(line 167)
* __muluha3: Fixed-point fractional library routines.
(line 175)
* __muluhq3: Fixed-point fractional library routines.
(line 163)
* __muluqq3: Fixed-point fractional library routines.
(line 161)
* __mulusa3: Fixed-point fractional library routines.
(line 177)
* __mulusq3: Fixed-point fractional library routines.
(line 165)
* __muluta3: Fixed-point fractional library routines.
(line 181)
* __mulvdi3: Integer library routines.
(line 115)
* __mulvsi3: Integer library routines.
(line 114)
* __mulxc3: Soft float library routines.
(line 245)
* __mulxf3: Soft float library routines.
(line 44)
* __nedf2: Soft float library routines.
(line 200)
* __negda2: Fixed-point fractional library routines.
(line 299)
* __negdf2: Soft float library routines.
(line 56)
* __negdi2: Integer library routines.
(line 47)
* __negdq2: Fixed-point fractional library routines.
(line 289)
* __negha2: Fixed-point fractional library routines.
(line 297)
* __neghq2: Fixed-point fractional library routines.
(line 287)
* __negqq2: Fixed-point fractional library routines.
(line 286)
* __negsa2: Fixed-point fractional library routines.
(line 298)
* __negsf2: Soft float library routines.
(line 55)
* __negsq2: Fixed-point fractional library routines.
(line 288)
* __negta2: Fixed-point fractional library routines.
(line 300)
* __negtf2: Soft float library routines.
(line 57)
* __negti2: Integer library routines.
(line 48)
* __neguda2: Fixed-point fractional library routines.
(line 305)
* __negudq2: Fixed-point fractional library routines.
(line 296)
* __neguha2: Fixed-point fractional library routines.
(line 302)
* __neguhq2: Fixed-point fractional library routines.
(line 292)
* __neguqq2: Fixed-point fractional library routines.
(line 291)
* __negusa2: Fixed-point fractional library routines.
(line 303)
* __negusq2: Fixed-point fractional library routines.
(line 294)
* __neguta2: Fixed-point fractional library routines.
(line 307)
* __negvdi2: Integer library routines.
(line 119)
* __negvsi2: Integer library routines.
(line 118)
* __negxf2: Soft float library routines.
(line 58)
* __nesf2: Soft float library routines.
(line 199)
* __netf2: Soft float library routines.
(line 201)
* __paritydi2: Integer library routines.
(line 151)
* __paritysi2: Integer library routines.
(line 150)
* __parityti2: Integer library routines.
(line 152)
* __popcountdi2: Integer library routines.
(line 157)
* __popcountsi2: Integer library routines.
(line 156)
* __popcountti2: Integer library routines.
(line 158)
* __powidf2: Soft float library routines.
(line 233)
* __powisf2: Soft float library routines.
(line 232)
* __powitf2: Soft float library routines.
(line 234)
* __powixf2: Soft float library routines.
(line 235)
* __satfractdadq: Fixed-point fractional library routines.
(line 1153)
* __satfractdaha2: Fixed-point fractional library routines.
(line 1154)
* __satfractdahq: Fixed-point fractional library routines.
(line 1151)
* __satfractdaqq: Fixed-point fractional library routines.
(line 1150)
* __satfractdasa2: Fixed-point fractional library routines.
(line 1155)
* __satfractdasq: Fixed-point fractional library routines.
(line 1152)
* __satfractdata2: Fixed-point fractional library routines.
(line 1156)
* __satfractdauda: Fixed-point fractional library routines.
(line 1166)
* __satfractdaudq: Fixed-point fractional library routines.
(line 1162)
* __satfractdauha: Fixed-point fractional library routines.
(line 1164)
* __satfractdauhq: Fixed-point fractional library routines.
(line 1159)
* __satfractdauqq: Fixed-point fractional library routines.
(line 1158)
* __satfractdausa: Fixed-point fractional library routines.
(line 1165)
* __satfractdausq: Fixed-point fractional library routines.
(line 1160)
* __satfractdauta: Fixed-point fractional library routines.
(line 1168)
* __satfractdfda: Fixed-point fractional library routines.
(line 1506)
* __satfractdfdq: Fixed-point fractional library routines.
(line 1503)
* __satfractdfha: Fixed-point fractional library routines.
(line 1504)
* __satfractdfhq: Fixed-point fractional library routines.
(line 1501)
* __satfractdfqq: Fixed-point fractional library routines.
(line 1500)
* __satfractdfsa: Fixed-point fractional library routines.
(line 1505)
* __satfractdfsq: Fixed-point fractional library routines.
(line 1502)
* __satfractdfta: Fixed-point fractional library routines.
(line 1507)
* __satfractdfuda: Fixed-point fractional library routines.
(line 1515)
* __satfractdfudq: Fixed-point fractional library routines.
(line 1512)
* __satfractdfuha: Fixed-point fractional library routines.
(line 1513)
* __satfractdfuhq: Fixed-point fractional library routines.
(line 1509)
* __satfractdfuqq: Fixed-point fractional library routines.
(line 1508)
* __satfractdfusa: Fixed-point fractional library routines.
(line 1514)
* __satfractdfusq: Fixed-point fractional library routines.
(line 1510)
* __satfractdfuta: Fixed-point fractional library routines.
(line 1517)
* __satfractdida: Fixed-point fractional library routines.
(line 1456)
* __satfractdidq: Fixed-point fractional library routines.
(line 1453)
* __satfractdiha: Fixed-point fractional library routines.
(line 1454)
* __satfractdihq: Fixed-point fractional library routines.
(line 1451)
* __satfractdiqq: Fixed-point fractional library routines.
(line 1450)
* __satfractdisa: Fixed-point fractional library routines.
(line 1455)
* __satfractdisq: Fixed-point fractional library routines.
(line 1452)
* __satfractdita: Fixed-point fractional library routines.
(line 1457)
* __satfractdiuda: Fixed-point fractional library routines.
(line 1464)
* __satfractdiudq: Fixed-point fractional library routines.
(line 1461)
* __satfractdiuha: Fixed-point fractional library routines.
(line 1462)
* __satfractdiuhq: Fixed-point fractional library routines.
(line 1459)
* __satfractdiuqq: Fixed-point fractional library routines.
(line 1458)
* __satfractdiusa: Fixed-point fractional library routines.
(line 1463)
* __satfractdiusq: Fixed-point fractional library routines.
(line 1460)
* __satfractdiuta: Fixed-point fractional library routines.
(line 1465)
* __satfractdqda: Fixed-point fractional library routines.
(line 1098)
* __satfractdqha: Fixed-point fractional library routines.
(line 1096)
* __satfractdqhq2: Fixed-point fractional library routines.
(line 1094)
* __satfractdqqq2: Fixed-point fractional library routines.
(line 1093)
* __satfractdqsa: Fixed-point fractional library routines.
(line 1097)
* __satfractdqsq2: Fixed-point fractional library routines.
(line 1095)
* __satfractdqta: Fixed-point fractional library routines.
(line 1099)
* __satfractdquda: Fixed-point fractional library routines.
(line 1111)
* __satfractdqudq: Fixed-point fractional library routines.
(line 1106)
* __satfractdquha: Fixed-point fractional library routines.
(line 1108)
* __satfractdquhq: Fixed-point fractional library routines.
(line 1102)
* __satfractdquqq: Fixed-point fractional library routines.
(line 1101)
* __satfractdqusa: Fixed-point fractional library routines.
(line 1109)
* __satfractdqusq: Fixed-point fractional library routines.
(line 1104)
* __satfractdquta: Fixed-point fractional library routines.
(line 1113)
* __satfracthada2: Fixed-point fractional library routines.
(line 1119)
* __satfracthadq: Fixed-point fractional library routines.
(line 1117)
* __satfracthahq: Fixed-point fractional library routines.
(line 1115)
* __satfracthaqq: Fixed-point fractional library routines.
(line 1114)
* __satfracthasa2: Fixed-point fractional library routines.
(line 1118)
* __satfracthasq: Fixed-point fractional library routines.
(line 1116)
* __satfracthata2: Fixed-point fractional library routines.
(line 1120)
* __satfracthauda: Fixed-point fractional library routines.
(line 1132)
* __satfracthaudq: Fixed-point fractional library routines.
(line 1127)
* __satfracthauha: Fixed-point fractional library routines.
(line 1129)
* __satfracthauhq: Fixed-point fractional library routines.
(line 1123)
* __satfracthauqq: Fixed-point fractional library routines.
(line 1122)
* __satfracthausa: Fixed-point fractional library routines.
(line 1130)
* __satfracthausq: Fixed-point fractional library routines.
(line 1125)
* __satfracthauta: Fixed-point fractional library routines.
(line 1134)
* __satfracthida: Fixed-point fractional library routines.
(line 1424)
* __satfracthidq: Fixed-point fractional library routines.
(line 1421)
* __satfracthiha: Fixed-point fractional library routines.
(line 1422)
* __satfracthihq: Fixed-point fractional library routines.
(line 1419)
* __satfracthiqq: Fixed-point fractional library routines.
(line 1418)
* __satfracthisa: Fixed-point fractional library routines.
(line 1423)
* __satfracthisq: Fixed-point fractional library routines.
(line 1420)
* __satfracthita: Fixed-point fractional library routines.
(line 1425)
* __satfracthiuda: Fixed-point fractional library routines.
(line 1432)
* __satfracthiudq: Fixed-point fractional library routines.
(line 1429)
* __satfracthiuha: Fixed-point fractional library routines.
(line 1430)
* __satfracthiuhq: Fixed-point fractional library routines.
(line 1427)
* __satfracthiuqq: Fixed-point fractional library routines.
(line 1426)
* __satfracthiusa: Fixed-point fractional library routines.
(line 1431)
* __satfracthiusq: Fixed-point fractional library routines.
(line 1428)
* __satfracthiuta: Fixed-point fractional library routines.
(line 1433)
* __satfracthqda: Fixed-point fractional library routines.
(line 1064)
* __satfracthqdq2: Fixed-point fractional library routines.
(line 1061)
* __satfracthqha: Fixed-point fractional library routines.
(line 1062)
* __satfracthqqq2: Fixed-point fractional library routines.
(line 1059)
* __satfracthqsa: Fixed-point fractional library routines.
(line 1063)
* __satfracthqsq2: Fixed-point fractional library routines.
(line 1060)
* __satfracthqta: Fixed-point fractional library routines.
(line 1065)
* __satfracthquda: Fixed-point fractional library routines.
(line 1072)
* __satfracthqudq: Fixed-point fractional library routines.
(line 1069)
* __satfracthquha: Fixed-point fractional library routines.
(line 1070)
* __satfracthquhq: Fixed-point fractional library routines.
(line 1067)
* __satfracthquqq: Fixed-point fractional library routines.
(line 1066)
* __satfracthqusa: Fixed-point fractional library routines.
(line 1071)
* __satfracthqusq: Fixed-point fractional library routines.
(line 1068)
* __satfracthquta: Fixed-point fractional library routines.
(line 1073)
* __satfractqida: Fixed-point fractional library routines.
(line 1402)
* __satfractqidq: Fixed-point fractional library routines.
(line 1399)
* __satfractqiha: Fixed-point fractional library routines.
(line 1400)
* __satfractqihq: Fixed-point fractional library routines.
(line 1397)
* __satfractqiqq: Fixed-point fractional library routines.
(line 1396)
* __satfractqisa: Fixed-point fractional library routines.
(line 1401)
* __satfractqisq: Fixed-point fractional library routines.
(line 1398)
* __satfractqita: Fixed-point fractional library routines.
(line 1403)
* __satfractqiuda: Fixed-point fractional library routines.
(line 1415)
* __satfractqiudq: Fixed-point fractional library routines.
(line 1410)
* __satfractqiuha: Fixed-point fractional library routines.
(line 1412)
* __satfractqiuhq: Fixed-point fractional library routines.
(line 1406)
* __satfractqiuqq: Fixed-point fractional library routines.
(line 1405)
* __satfractqiusa: Fixed-point fractional library routines.
(line 1413)
* __satfractqiusq: Fixed-point fractional library routines.
(line 1408)
* __satfractqiuta: Fixed-point fractional library routines.
(line 1417)
* __satfractqqda: Fixed-point fractional library routines.
(line 1043)
* __satfractqqdq2: Fixed-point fractional library routines.
(line 1040)
* __satfractqqha: Fixed-point fractional library routines.
(line 1041)
* __satfractqqhq2: Fixed-point fractional library routines.
(line 1038)
* __satfractqqsa: Fixed-point fractional library routines.
(line 1042)
* __satfractqqsq2: Fixed-point fractional library routines.
(line 1039)
* __satfractqqta: Fixed-point fractional library routines.
(line 1044)
* __satfractqquda: Fixed-point fractional library routines.
(line 1056)
* __satfractqqudq: Fixed-point fractional library routines.
(line 1051)
* __satfractqquha: Fixed-point fractional library routines.
(line 1053)
* __satfractqquhq: Fixed-point fractional library routines.
(line 1047)
* __satfractqquqq: Fixed-point fractional library routines.
(line 1046)
* __satfractqqusa: Fixed-point fractional library routines.
(line 1054)
* __satfractqqusq: Fixed-point fractional library routines.
(line 1049)
* __satfractqquta: Fixed-point fractional library routines.
(line 1058)
* __satfractsada2: Fixed-point fractional library routines.
(line 1140)
* __satfractsadq: Fixed-point fractional library routines.
(line 1138)
* __satfractsaha2: Fixed-point fractional library routines.
(line 1139)
* __satfractsahq: Fixed-point fractional library routines.
(line 1136)
* __satfractsaqq: Fixed-point fractional library routines.
(line 1135)
* __satfractsasq: Fixed-point fractional library routines.
(line 1137)
* __satfractsata2: Fixed-point fractional library routines.
(line 1141)
* __satfractsauda: Fixed-point fractional library routines.
(line 1148)
* __satfractsaudq: Fixed-point fractional library routines.
(line 1145)
* __satfractsauha: Fixed-point fractional library routines.
(line 1146)
* __satfractsauhq: Fixed-point fractional library routines.
(line 1143)
* __satfractsauqq: Fixed-point fractional library routines.
(line 1142)
* __satfractsausa: Fixed-point fractional library routines.
(line 1147)
* __satfractsausq: Fixed-point fractional library routines.
(line 1144)
* __satfractsauta: Fixed-point fractional library routines.
(line 1149)
* __satfractsfda: Fixed-point fractional library routines.
(line 1490)
* __satfractsfdq: Fixed-point fractional library routines.
(line 1487)
* __satfractsfha: Fixed-point fractional library routines.
(line 1488)
* __satfractsfhq: Fixed-point fractional library routines.
(line 1485)
* __satfractsfqq: Fixed-point fractional library routines.
(line 1484)
* __satfractsfsa: Fixed-point fractional library routines.
(line 1489)
* __satfractsfsq: Fixed-point fractional library routines.
(line 1486)
* __satfractsfta: Fixed-point fractional library routines.
(line 1491)
* __satfractsfuda: Fixed-point fractional library routines.
(line 1498)
* __satfractsfudq: Fixed-point fractional library routines.
(line 1495)
* __satfractsfuha: Fixed-point fractional library routines.
(line 1496)
* __satfractsfuhq: Fixed-point fractional library routines.
(line 1493)
* __satfractsfuqq: Fixed-point fractional library routines.
(line 1492)
* __satfractsfusa: Fixed-point fractional library routines.
(line 1497)
* __satfractsfusq: Fixed-point fractional library routines.
(line 1494)
* __satfractsfuta: Fixed-point fractional library routines.
(line 1499)
* __satfractsida: Fixed-point fractional library routines.
(line 1440)
* __satfractsidq: Fixed-point fractional library routines.
(line 1437)
* __satfractsiha: Fixed-point fractional library routines.
(line 1438)
* __satfractsihq: Fixed-point fractional library routines.
(line 1435)
* __satfractsiqq: Fixed-point fractional library routines.
(line 1434)
* __satfractsisa: Fixed-point fractional library routines.
(line 1439)
* __satfractsisq: Fixed-point fractional library routines.
(line 1436)
* __satfractsita: Fixed-point fractional library routines.
(line 1441)
* __satfractsiuda: Fixed-point fractional library routines.
(line 1448)
* __satfractsiudq: Fixed-point fractional library routines.
(line 1445)
* __satfractsiuha: Fixed-point fractional library routines.
(line 1446)
* __satfractsiuhq: Fixed-point fractional library routines.
(line 1443)
* __satfractsiuqq: Fixed-point fractional library routines.
(line 1442)
* __satfractsiusa: Fixed-point fractional library routines.
(line 1447)
* __satfractsiusq: Fixed-point fractional library routines.
(line 1444)
* __satfractsiuta: Fixed-point fractional library routines.
(line 1449)
* __satfractsqda: Fixed-point fractional library routines.
(line 1079)
* __satfractsqdq2: Fixed-point fractional library routines.
(line 1076)
* __satfractsqha: Fixed-point fractional library routines.
(line 1077)
* __satfractsqhq2: Fixed-point fractional library routines.
(line 1075)
* __satfractsqqq2: Fixed-point fractional library routines.
(line 1074)
* __satfractsqsa: Fixed-point fractional library routines.
(line 1078)
* __satfractsqta: Fixed-point fractional library routines.
(line 1080)
* __satfractsquda: Fixed-point fractional library routines.
(line 1090)
* __satfractsqudq: Fixed-point fractional library routines.
(line 1086)
* __satfractsquha: Fixed-point fractional library routines.
(line 1088)
* __satfractsquhq: Fixed-point fractional library routines.
(line 1083)
* __satfractsquqq: Fixed-point fractional library routines.
(line 1082)
* __satfractsqusa: Fixed-point fractional library routines.
(line 1089)
* __satfractsqusq: Fixed-point fractional library routines.
(line 1084)
* __satfractsquta: Fixed-point fractional library routines.
(line 1092)
* __satfracttada2: Fixed-point fractional library routines.
(line 1175)
* __satfracttadq: Fixed-point fractional library routines.
(line 1172)
* __satfracttaha2: Fixed-point fractional library routines.
(line 1173)
* __satfracttahq: Fixed-point fractional library routines.
(line 1170)
* __satfracttaqq: Fixed-point fractional library routines.
(line 1169)
* __satfracttasa2: Fixed-point fractional library routines.
(line 1174)
* __satfracttasq: Fixed-point fractional library routines.
(line 1171)
* __satfracttauda: Fixed-point fractional library routines.
(line 1187)
* __satfracttaudq: Fixed-point fractional library routines.
(line 1182)
* __satfracttauha: Fixed-point fractional library routines.
(line 1184)
* __satfracttauhq: Fixed-point fractional library routines.
(line 1178)
* __satfracttauqq: Fixed-point fractional library routines.
(line 1177)
* __satfracttausa: Fixed-point fractional library routines.
(line 1185)
* __satfracttausq: Fixed-point fractional library routines.
(line 1180)
* __satfracttauta: Fixed-point fractional library routines.
(line 1189)
* __satfracttida: Fixed-point fractional library routines.
(line 1472)
* __satfracttidq: Fixed-point fractional library routines.
(line 1469)
* __satfracttiha: Fixed-point fractional library routines.
(line 1470)
* __satfracttihq: Fixed-point fractional library routines.
(line 1467)
* __satfracttiqq: Fixed-point fractional library routines.
(line 1466)
* __satfracttisa: Fixed-point fractional library routines.
(line 1471)
* __satfracttisq: Fixed-point fractional library routines.
(line 1468)
* __satfracttita: Fixed-point fractional library routines.
(line 1473)
* __satfracttiuda: Fixed-point fractional library routines.
(line 1481)
* __satfracttiudq: Fixed-point fractional library routines.
(line 1478)
* __satfracttiuha: Fixed-point fractional library routines.
(line 1479)
* __satfracttiuhq: Fixed-point fractional library routines.
(line 1475)
* __satfracttiuqq: Fixed-point fractional library routines.
(line 1474)
* __satfracttiusa: Fixed-point fractional library routines.
(line 1480)
* __satfracttiusq: Fixed-point fractional library routines.
(line 1476)
* __satfracttiuta: Fixed-point fractional library routines.
(line 1483)
* __satfractudada: Fixed-point fractional library routines.
(line 1351)
* __satfractudadq: Fixed-point fractional library routines.
(line 1347)
* __satfractudaha: Fixed-point fractional library routines.
(line 1349)
* __satfractudahq: Fixed-point fractional library routines.
(line 1344)
* __satfractudaqq: Fixed-point fractional library routines.
(line 1343)
* __satfractudasa: Fixed-point fractional library routines.
(line 1350)
* __satfractudasq: Fixed-point fractional library routines.
(line 1345)
* __satfractudata: Fixed-point fractional library routines.
(line 1353)
* __satfractudaudq: Fixed-point fractional library routines.
(line 1361)
* __satfractudauha2: Fixed-point fractional library routines.
(line 1363)
* __satfractudauhq: Fixed-point fractional library routines.
(line 1357)
* __satfractudauqq: Fixed-point fractional library routines.
(line 1355)
* __satfractudausa2: Fixed-point fractional library routines.
(line 1365)
* __satfractudausq: Fixed-point fractional library routines.
(line 1359)
* __satfractudauta2: Fixed-point fractional library routines.
(line 1367)
* __satfractudqda: Fixed-point fractional library routines.
(line 1276)
* __satfractudqdq: Fixed-point fractional library routines.
(line 1271)
* __satfractudqha: Fixed-point fractional library routines.
(line 1273)
* __satfractudqhq: Fixed-point fractional library routines.
(line 1267)
* __satfractudqqq: Fixed-point fractional library routines.
(line 1266)
* __satfractudqsa: Fixed-point fractional library routines.
(line 1274)
* __satfractudqsq: Fixed-point fractional library routines.
(line 1269)
* __satfractudqta: Fixed-point fractional library routines.
(line 1278)
* __satfractudquda: Fixed-point fractional library routines.
(line 1290)
* __satfractudquha: Fixed-point fractional library routines.
(line 1286)
* __satfractudquhq2: Fixed-point fractional library routines.
(line 1282)
* __satfractudquqq2: Fixed-point fractional library routines.
(line 1280)
* __satfractudqusa: Fixed-point fractional library routines.
(line 1288)
* __satfractudqusq2: Fixed-point fractional library routines.
(line 1284)
* __satfractudquta: Fixed-point fractional library routines.
(line 1292)
* __satfractuhada: Fixed-point fractional library routines.
(line 1304)
* __satfractuhadq: Fixed-point fractional library routines.
(line 1299)
* __satfractuhaha: Fixed-point fractional library routines.
(line 1301)
* __satfractuhahq: Fixed-point fractional library routines.
(line 1295)
* __satfractuhaqq: Fixed-point fractional library routines.
(line 1294)
* __satfractuhasa: Fixed-point fractional library routines.
(line 1302)
* __satfractuhasq: Fixed-point fractional library routines.
(line 1297)
* __satfractuhata: Fixed-point fractional library routines.
(line 1306)
* __satfractuhauda2: Fixed-point fractional library routines.
(line 1318)
* __satfractuhaudq: Fixed-point fractional library routines.
(line 1314)
* __satfractuhauhq: Fixed-point fractional library routines.
(line 1310)
* __satfractuhauqq: Fixed-point fractional library routines.
(line 1308)
* __satfractuhausa2: Fixed-point fractional library routines.
(line 1316)
* __satfractuhausq: Fixed-point fractional library routines.
(line 1312)
* __satfractuhauta2: Fixed-point fractional library routines.
(line 1320)
* __satfractuhqda: Fixed-point fractional library routines.
(line 1224)
* __satfractuhqdq: Fixed-point fractional library routines.
(line 1221)
* __satfractuhqha: Fixed-point fractional library routines.
(line 1222)
* __satfractuhqhq: Fixed-point fractional library routines.
(line 1219)
* __satfractuhqqq: Fixed-point fractional library routines.
(line 1218)
* __satfractuhqsa: Fixed-point fractional library routines.
(line 1223)
* __satfractuhqsq: Fixed-point fractional library routines.
(line 1220)
* __satfractuhqta: Fixed-point fractional library routines.
(line 1225)
* __satfractuhquda: Fixed-point fractional library routines.
(line 1236)
* __satfractuhqudq2: Fixed-point fractional library routines.
(line 1231)
* __satfractuhquha: Fixed-point fractional library routines.
(line 1233)
* __satfractuhquqq2: Fixed-point fractional library routines.
(line 1227)
* __satfractuhqusa: Fixed-point fractional library routines.
(line 1234)
* __satfractuhqusq2: Fixed-point fractional library routines.
(line 1229)
* __satfractuhquta: Fixed-point fractional library routines.
(line 1238)
* __satfractunsdida: Fixed-point fractional library routines.
(line 1834)
* __satfractunsdidq: Fixed-point fractional library routines.
(line 1831)
* __satfractunsdiha: Fixed-point fractional library routines.
(line 1832)
* __satfractunsdihq: Fixed-point fractional library routines.
(line 1828)
* __satfractunsdiqq: Fixed-point fractional library routines.
(line 1827)
* __satfractunsdisa: Fixed-point fractional library routines.
(line 1833)
* __satfractunsdisq: Fixed-point fractional library routines.
(line 1829)
* __satfractunsdita: Fixed-point fractional library routines.
(line 1836)
* __satfractunsdiuda: Fixed-point fractional library routines.
(line 1850)
* __satfractunsdiudq: Fixed-point fractional library routines.
(line 1844)
* __satfractunsdiuha: Fixed-point fractional library routines.
(line 1846)
* __satfractunsdiuhq: Fixed-point fractional library routines.
(line 1840)
* __satfractunsdiuqq: Fixed-point fractional library routines.
(line 1838)
* __satfractunsdiusa: Fixed-point fractional library routines.
(line 1848)
* __satfractunsdiusq: Fixed-point fractional library routines.
(line 1842)
* __satfractunsdiuta: Fixed-point fractional library routines.
(line 1852)
* __satfractunshida: Fixed-point fractional library routines.
(line 1786)
* __satfractunshidq: Fixed-point fractional library routines.
(line 1783)
* __satfractunshiha: Fixed-point fractional library routines.
(line 1784)
* __satfractunshihq: Fixed-point fractional library routines.
(line 1780)
* __satfractunshiqq: Fixed-point fractional library routines.
(line 1779)
* __satfractunshisa: Fixed-point fractional library routines.
(line 1785)
* __satfractunshisq: Fixed-point fractional library routines.
(line 1781)
* __satfractunshita: Fixed-point fractional library routines.
(line 1788)
* __satfractunshiuda: Fixed-point fractional library routines.
(line 1802)
* __satfractunshiudq: Fixed-point fractional library routines.
(line 1796)
* __satfractunshiuha: Fixed-point fractional library routines.
(line 1798)
* __satfractunshiuhq: Fixed-point fractional library routines.
(line 1792)
* __satfractunshiuqq: Fixed-point fractional library routines.
(line 1790)
* __satfractunshiusa: Fixed-point fractional library routines.
(line 1800)
* __satfractunshiusq: Fixed-point fractional library routines.
(line 1794)
* __satfractunshiuta: Fixed-point fractional library routines.
(line 1804)
* __satfractunsqida: Fixed-point fractional library routines.
(line 1760)
* __satfractunsqidq: Fixed-point fractional library routines.
(line 1757)
* __satfractunsqiha: Fixed-point fractional library routines.
(line 1758)
* __satfractunsqihq: Fixed-point fractional library routines.
(line 1754)
* __satfractunsqiqq: Fixed-point fractional library routines.
(line 1753)
* __satfractunsqisa: Fixed-point fractional library routines.
(line 1759)
* __satfractunsqisq: Fixed-point fractional library routines.
(line 1755)
* __satfractunsqita: Fixed-point fractional library routines.
(line 1762)
* __satfractunsqiuda: Fixed-point fractional library routines.
(line 1776)
* __satfractunsqiudq: Fixed-point fractional library routines.
(line 1770)
* __satfractunsqiuha: Fixed-point fractional library routines.
(line 1772)
* __satfractunsqiuhq: Fixed-point fractional library routines.
(line 1766)
* __satfractunsqiuqq: Fixed-point fractional library routines.
(line 1764)
* __satfractunsqiusa: Fixed-point fractional library routines.
(line 1774)
* __satfractunsqiusq: Fixed-point fractional library routines.
(line 1768)
* __satfractunsqiuta: Fixed-point fractional library routines.
(line 1778)
* __satfractunssida: Fixed-point fractional library routines.
(line 1811)
* __satfractunssidq: Fixed-point fractional library routines.
(line 1808)
* __satfractunssiha: Fixed-point fractional library routines.
(line 1809)
* __satfractunssihq: Fixed-point fractional library routines.
(line 1806)
* __satfractunssiqq: Fixed-point fractional library routines.
(line 1805)
* __satfractunssisa: Fixed-point fractional library routines.
(line 1810)
* __satfractunssisq: Fixed-point fractional library routines.
(line 1807)
* __satfractunssita: Fixed-point fractional library routines.
(line 1812)
* __satfractunssiuda: Fixed-point fractional library routines.
(line 1824)
* __satfractunssiudq: Fixed-point fractional library routines.
(line 1819)
* __satfractunssiuha: Fixed-point fractional library routines.
(line 1821)
* __satfractunssiuhq: Fixed-point fractional library routines.
(line 1815)
* __satfractunssiuqq: Fixed-point fractional library routines.
(line 1814)
* __satfractunssiusa: Fixed-point fractional library routines.
(line 1822)
* __satfractunssiusq: Fixed-point fractional library routines.
(line 1817)
* __satfractunssiuta: Fixed-point fractional library routines.
(line 1826)
* __satfractunstida: Fixed-point fractional library routines.
(line 1864)
* __satfractunstidq: Fixed-point fractional library routines.
(line 1859)
* __satfractunstiha: Fixed-point fractional library routines.
(line 1861)
* __satfractunstihq: Fixed-point fractional library routines.
(line 1855)
* __satfractunstiqq: Fixed-point fractional library routines.
(line 1854)
* __satfractunstisa: Fixed-point fractional library routines.
(line 1862)
* __satfractunstisq: Fixed-point fractional library routines.
(line 1857)
* __satfractunstita: Fixed-point fractional library routines.
(line 1866)
* __satfractunstiuda: Fixed-point fractional library routines.
(line 1880)
* __satfractunstiudq: Fixed-point fractional library routines.
(line 1874)
* __satfractunstiuha: Fixed-point fractional library routines.
(line 1876)
* __satfractunstiuhq: Fixed-point fractional library routines.
(line 1870)
* __satfractunstiuqq: Fixed-point fractional library routines.
(line 1868)
* __satfractunstiusa: Fixed-point fractional library routines.
(line 1878)
* __satfractunstiusq: Fixed-point fractional library routines.
(line 1872)
* __satfractunstiuta: Fixed-point fractional library routines.
(line 1882)
* __satfractuqqda: Fixed-point fractional library routines.
(line 1201)
* __satfractuqqdq: Fixed-point fractional library routines.
(line 1196)
* __satfractuqqha: Fixed-point fractional library routines.
(line 1198)
* __satfractuqqhq: Fixed-point fractional library routines.
(line 1192)
* __satfractuqqqq: Fixed-point fractional library routines.
(line 1191)
* __satfractuqqsa: Fixed-point fractional library routines.
(line 1199)
* __satfractuqqsq: Fixed-point fractional library routines.
(line 1194)
* __satfractuqqta: Fixed-point fractional library routines.
(line 1203)
* __satfractuqquda: Fixed-point fractional library routines.
(line 1215)
* __satfractuqqudq2: Fixed-point fractional library routines.
(line 1209)
* __satfractuqquha: Fixed-point fractional library routines.
(line 1211)
* __satfractuqquhq2: Fixed-point fractional library routines.
(line 1205)
* __satfractuqqusa: Fixed-point fractional library routines.
(line 1213)
* __satfractuqqusq2: Fixed-point fractional library routines.
(line 1207)
* __satfractuqquta: Fixed-point fractional library routines.
(line 1217)
* __satfractusada: Fixed-point fractional library routines.
(line 1327)
* __satfractusadq: Fixed-point fractional library routines.
(line 1324)
* __satfractusaha: Fixed-point fractional library routines.
(line 1325)
* __satfractusahq: Fixed-point fractional library routines.
(line 1322)
* __satfractusaqq: Fixed-point fractional library routines.
(line 1321)
* __satfractusasa: Fixed-point fractional library routines.
(line 1326)
* __satfractusasq: Fixed-point fractional library routines.
(line 1323)
* __satfractusata: Fixed-point fractional library routines.
(line 1328)
* __satfractusauda2: Fixed-point fractional library routines.
(line 1339)
* __satfractusaudq: Fixed-point fractional library routines.
(line 1335)
* __satfractusauha2: Fixed-point fractional library routines.
(line 1337)
* __satfractusauhq: Fixed-point fractional library routines.
(line 1331)
* __satfractusauqq: Fixed-point fractional library routines.
(line 1330)
* __satfractusausq: Fixed-point fractional library routines.
(line 1333)
* __satfractusauta2: Fixed-point fractional library routines.
(line 1341)
* __satfractusqda: Fixed-point fractional library routines.
(line 1248)
* __satfractusqdq: Fixed-point fractional library routines.
(line 1244)
* __satfractusqha: Fixed-point fractional library routines.
(line 1246)
* __satfractusqhq: Fixed-point fractional library routines.
(line 1241)
* __satfractusqqq: Fixed-point fractional library routines.
(line 1240)
* __satfractusqsa: Fixed-point fractional library routines.
(line 1247)
* __satfractusqsq: Fixed-point fractional library routines.
(line 1242)
* __satfractusqta: Fixed-point fractional library routines.
(line 1250)
* __satfractusquda: Fixed-point fractional library routines.
(line 1262)
* __satfractusqudq2: Fixed-point fractional library routines.
(line 1256)
* __satfractusquha: Fixed-point fractional library routines.
(line 1258)
* __satfractusquhq2: Fixed-point fractional library routines.
(line 1254)
* __satfractusquqq2: Fixed-point fractional library routines.
(line 1252)
* __satfractusqusa: Fixed-point fractional library routines.
(line 1260)
* __satfractusquta: Fixed-point fractional library routines.
(line 1264)
* __satfractutada: Fixed-point fractional library routines.
(line 1379)
* __satfractutadq: Fixed-point fractional library routines.
(line 1374)
* __satfractutaha: Fixed-point fractional library routines.
(line 1376)
* __satfractutahq: Fixed-point fractional library routines.
(line 1370)
* __satfractutaqq: Fixed-point fractional library routines.
(line 1369)
* __satfractutasa: Fixed-point fractional library routines.
(line 1377)
* __satfractutasq: Fixed-point fractional library routines.
(line 1372)
* __satfractutata: Fixed-point fractional library routines.
(line 1381)
* __satfractutauda2: Fixed-point fractional library routines.
(line 1395)
* __satfractutaudq: Fixed-point fractional library routines.
(line 1389)
* __satfractutauha2: Fixed-point fractional library routines.
(line 1391)
* __satfractutauhq: Fixed-point fractional library routines.
(line 1385)
* __satfractutauqq: Fixed-point fractional library routines.
(line 1383)
* __satfractutausa2: Fixed-point fractional library routines.
(line 1393)
* __satfractutausq: Fixed-point fractional library routines.
(line 1387)
* __splitstack_find: Miscellaneous routines.
(line 18)
* __ssaddda3: Fixed-point fractional library routines.
(line 67)
* __ssadddq3: Fixed-point fractional library routines.
(line 63)
* __ssaddha3: Fixed-point fractional library routines.
(line 65)
* __ssaddhq3: Fixed-point fractional library routines.
(line 60)
* __ssaddqq3: Fixed-point fractional library routines.
(line 59)
* __ssaddsa3: Fixed-point fractional library routines.
(line 66)
* __ssaddsq3: Fixed-point fractional library routines.
(line 61)
* __ssaddta3: Fixed-point fractional library routines.
(line 69)
* __ssashlda3: Fixed-point fractional library routines.
(line 402)
* __ssashldq3: Fixed-point fractional library routines.
(line 399)
* __ssashlha3: Fixed-point fractional library routines.
(line 400)
* __ssashlhq3: Fixed-point fractional library routines.
(line 396)
* __ssashlsa3: Fixed-point fractional library routines.
(line 401)
* __ssashlsq3: Fixed-point fractional library routines.
(line 397)
* __ssashlta3: Fixed-point fractional library routines.
(line 404)
* __ssdivda3: Fixed-point fractional library routines.
(line 261)
* __ssdivdq3: Fixed-point fractional library routines.
(line 257)
* __ssdivha3: Fixed-point fractional library routines.
(line 259)
* __ssdivhq3: Fixed-point fractional library routines.
(line 254)
* __ssdivqq3: Fixed-point fractional library routines.
(line 253)
* __ssdivsa3: Fixed-point fractional library routines.
(line 260)
* __ssdivsq3: Fixed-point fractional library routines.
(line 255)
* __ssdivta3: Fixed-point fractional library routines.
(line 263)
* __ssmulda3: Fixed-point fractional library routines.
(line 193)
* __ssmuldq3: Fixed-point fractional library routines.
(line 189)
* __ssmulha3: Fixed-point fractional library routines.
(line 191)
* __ssmulhq3: Fixed-point fractional library routines.
(line 186)
* __ssmulqq3: Fixed-point fractional library routines.
(line 185)
* __ssmulsa3: Fixed-point fractional library routines.
(line 192)
* __ssmulsq3: Fixed-point fractional library routines.
(line 187)
* __ssmulta3: Fixed-point fractional library routines.
(line 195)
* __ssnegda2: Fixed-point fractional library routines.
(line 316)
* __ssnegdq2: Fixed-point fractional library routines.
(line 313)
* __ssnegha2: Fixed-point fractional library routines.
(line 314)
* __ssneghq2: Fixed-point fractional library routines.
(line 311)
* __ssnegqq2: Fixed-point fractional library routines.
(line 310)
* __ssnegsa2: Fixed-point fractional library routines.
(line 315)
* __ssnegsq2: Fixed-point fractional library routines.
(line 312)
* __ssnegta2: Fixed-point fractional library routines.
(line 317)
* __sssubda3: Fixed-point fractional library routines.
(line 129)
* __sssubdq3: Fixed-point fractional library routines.
(line 125)
* __sssubha3: Fixed-point fractional library routines.
(line 127)
* __sssubhq3: Fixed-point fractional library routines.
(line 122)
* __sssubqq3: Fixed-point fractional library routines.
(line 121)
* __sssubsa3: Fixed-point fractional library routines.
(line 128)
* __sssubsq3: Fixed-point fractional library routines.
(line 123)
* __sssubta3: Fixed-point fractional library routines.
(line 131)
* __subda3: Fixed-point fractional library routines.
(line 107)
* __subdf3: Soft float library routines.
(line 31)
* __subdq3: Fixed-point fractional library routines.
(line 95)
* __subha3: Fixed-point fractional library routines.
(line 105)
* __subhq3: Fixed-point fractional library routines.
(line 92)
* __subqq3: Fixed-point fractional library routines.
(line 91)
* __subsa3: Fixed-point fractional library routines.
(line 106)
* __subsf3: Soft float library routines.
(line 30)
* __subsq3: Fixed-point fractional library routines.
(line 93)
* __subta3: Fixed-point fractional library routines.
(line 109)
* __subtf3: Soft float library routines.
(line 33)
* __subuda3: Fixed-point fractional library routines.
(line 115)
* __subudq3: Fixed-point fractional library routines.
(line 103)
* __subuha3: Fixed-point fractional library routines.
(line 111)
* __subuhq3: Fixed-point fractional library routines.
(line 99)
* __subuqq3: Fixed-point fractional library routines.
(line 97)
* __subusa3: Fixed-point fractional library routines.
(line 113)
* __subusq3: Fixed-point fractional library routines.
(line 101)
* __subuta3: Fixed-point fractional library routines.
(line 117)
* __subvdi3: Integer library routines.
(line 123)
* __subvsi3: Integer library routines.
(line 122)
* __subxf3: Soft float library routines.
(line 35)
* __truncdfsf2: Soft float library routines.
(line 76)
* __trunctfdf2: Soft float library routines.
(line 73)
* __trunctfsf2: Soft float library routines.
(line 75)
* __truncxfdf2: Soft float library routines.
(line 72)
* __truncxfsf2: Soft float library routines.
(line 74)
* __ucmpdi2: Integer library routines.
(line 93)
* __ucmpti2: Integer library routines.
(line 95)
* __udivdi3: Integer library routines.
(line 54)
* __udivmoddi3: Integer library routines.
(line 61)
* __udivsi3: Integer library routines.
(line 52)
* __udivti3: Integer library routines.
(line 56)
* __udivuda3: Fixed-point fractional library routines.
(line 246)
* __udivudq3: Fixed-point fractional library routines.
(line 240)
* __udivuha3: Fixed-point fractional library routines.
(line 242)
* __udivuhq3: Fixed-point fractional library routines.
(line 236)
* __udivuqq3: Fixed-point fractional library routines.
(line 234)
* __udivusa3: Fixed-point fractional library routines.
(line 244)
* __udivusq3: Fixed-point fractional library routines.
(line 238)
* __udivuta3: Fixed-point fractional library routines.
(line 248)
* __umoddi3: Integer library routines.
(line 71)
* __umodsi3: Integer library routines.
(line 69)
* __umodti3: Integer library routines.
(line 73)
* __unorddf2: Soft float library routines.
(line 173)
* __unordsf2: Soft float library routines.
(line 172)
* __unordtf2: Soft float library routines.
(line 174)
* __usadduda3: Fixed-point fractional library routines.
(line 85)
* __usaddudq3: Fixed-point fractional library routines.
(line 79)
* __usadduha3: Fixed-point fractional library routines.
(line 81)
* __usadduhq3: Fixed-point fractional library routines.
(line 75)
* __usadduqq3: Fixed-point fractional library routines.
(line 73)
* __usaddusa3: Fixed-point fractional library routines.
(line 83)
* __usaddusq3: Fixed-point fractional library routines.
(line 77)
* __usadduta3: Fixed-point fractional library routines.
(line 87)
* __usashluda3: Fixed-point fractional library routines.
(line 421)
* __usashludq3: Fixed-point fractional library routines.
(line 415)
* __usashluha3: Fixed-point fractional library routines.
(line 417)
* __usashluhq3: Fixed-point fractional library routines.
(line 411)
* __usashluqq3: Fixed-point fractional library routines.
(line 409)
* __usashlusa3: Fixed-point fractional library routines.
(line 419)
* __usashlusq3: Fixed-point fractional library routines.
(line 413)
* __usashluta3: Fixed-point fractional library routines.
(line 423)
* __usdivuda3: Fixed-point fractional library routines.
(line 280)
* __usdivudq3: Fixed-point fractional library routines.
(line 274)
* __usdivuha3: Fixed-point fractional library routines.
(line 276)
* __usdivuhq3: Fixed-point fractional library routines.
(line 270)
* __usdivuqq3: Fixed-point fractional library routines.
(line 268)
* __usdivusa3: Fixed-point fractional library routines.
(line 278)
* __usdivusq3: Fixed-point fractional library routines.
(line 272)
* __usdivuta3: Fixed-point fractional library routines.
(line 282)
* __usmuluda3: Fixed-point fractional library routines.
(line 212)
* __usmuludq3: Fixed-point fractional library routines.
(line 206)
* __usmuluha3: Fixed-point fractional library routines.
(line 208)
* __usmuluhq3: Fixed-point fractional library routines.
(line 202)
* __usmuluqq3: Fixed-point fractional library routines.
(line 200)
* __usmulusa3: Fixed-point fractional library routines.
(line 210)
* __usmulusq3: Fixed-point fractional library routines.
(line 204)
* __usmuluta3: Fixed-point fractional library routines.
(line 214)
* __usneguda2: Fixed-point fractional library routines.
(line 331)
* __usnegudq2: Fixed-point fractional library routines.
(line 326)
* __usneguha2: Fixed-point fractional library routines.
(line 328)
* __usneguhq2: Fixed-point fractional library routines.
(line 322)
* __usneguqq2: Fixed-point fractional library routines.
(line 321)
* __usnegusa2: Fixed-point fractional library routines.
(line 329)
* __usnegusq2: Fixed-point fractional library routines.
(line 324)
* __usneguta2: Fixed-point fractional library routines.
(line 333)
* __ussubuda3: Fixed-point fractional library routines.
(line 148)
* __ussubudq3: Fixed-point fractional library routines.
(line 142)
* __ussubuha3: Fixed-point fractional library routines.
(line 144)
* __ussubuhq3: Fixed-point fractional library routines.
(line 138)
* __ussubuqq3: Fixed-point fractional library routines.
(line 136)
* __ussubusa3: Fixed-point fractional library routines.
(line 146)
* __ussubusq3: Fixed-point fractional library routines.
(line 140)
* __ussubuta3: Fixed-point fractional library routines.
(line 150)
* abort: Portability. (line 21)
* abs: Arithmetic. (line 200)
* abs and attributes: Expressions. (line 64)
* ABS_EXPR: Unary and Binary Expressions.
(line 6)
* absence_set: Processor pipeline description.
(line 220)
* absM2 instruction pattern: Standard Names. (line 479)
* absolute value: Arithmetic. (line 200)
* access to operands: Accessors. (line 6)
* access to special operands: Special Accessors. (line 6)
* accessors: Accessors. (line 6)
* ACCUM_TYPE_SIZE: Type Layout. (line 88)
* ACCUMULATE_OUTGOING_ARGS: Stack Arguments. (line 49)
* ACCUMULATE_OUTGOING_ARGS and stack frames: Function Entry. (line 135)
* ADA_LONG_TYPE_SIZE: Type Layout. (line 26)
* Adding a new GIMPLE statement code: Adding a new GIMPLE statement code.
(line 6)
* ADDITIONAL_REGISTER_NAMES: Instruction Output. (line 15)
* addM3 instruction pattern: Standard Names. (line 216)
* addMODEcc instruction pattern: Standard Names. (line 917)
* addr_diff_vec: Side Effects. (line 302)
* addr_diff_vec, length of: Insn Lengths. (line 26)
* ADDR_EXPR: Storage References. (line 6)
* addr_vec: Side Effects. (line 297)
* addr_vec, length of: Insn Lengths. (line 26)
* address constraints: Simple Constraints. (line 164)
* address_operand <1>: Simple Constraints. (line 168)
* address_operand: Machine-Independent Predicates.
(line 63)
* addressing modes: Addressing Modes. (line 6)
* ADJUST_FIELD_ALIGN: Storage Layout. (line 189)
* ADJUST_INSN_LENGTH: Insn Lengths. (line 35)
* ADJUST_REG_ALLOC_ORDER: Allocation Order. (line 23)
* aggregates as return values: Aggregate Return. (line 6)
* alias: Alias analysis. (line 6)
* ALL_COP_ADDITIONAL_REGISTER_NAMES: MIPS Coprocessors. (line 32)
* ALL_REGS: Register Classes. (line 17)
* allocate_stack instruction pattern: Standard Names. (line 1227)
* alternate entry points: Insns. (line 140)
* anchored addresses: Anchored Addresses. (line 6)
* and: Arithmetic. (line 158)
* and and attributes: Expressions. (line 50)
* and, canonicalization of: Insn Canonicalizations.
(line 52)
* andM3 instruction pattern: Standard Names. (line 222)
* annotations: Annotations. (line 6)
* APPLY_RESULT_SIZE: Scalar Return. (line 112)
* ARG_POINTER_CFA_OFFSET: Frame Layout. (line 194)
* ARG_POINTER_REGNUM: Frame Registers. (line 41)
* ARG_POINTER_REGNUM and virtual registers: Regs and Memory. (line 65)
* arg_pointer_rtx: Frame Registers. (line 104)
* ARGS_GROW_DOWNWARD: Frame Layout. (line 35)
* argument passing: Interface. (line 36)
* arguments in registers: Register Arguments. (line 6)
* arguments on stack: Stack Arguments. (line 6)
* arithmetic library: Soft float library routines.
(line 6)
* arithmetic shift: Arithmetic. (line 173)
* arithmetic shift with signed saturation: Arithmetic. (line 173)
* arithmetic shift with unsigned saturation: Arithmetic. (line 173)
* arithmetic, in RTL: Arithmetic. (line 6)
* ARITHMETIC_TYPE_P: Types for C++. (line 61)
* array: Types. (line 6)
* ARRAY_RANGE_REF: Storage References. (line 6)
* ARRAY_REF: Storage References. (line 6)
* ARRAY_TYPE: Types. (line 6)
* AS_NEEDS_DASH_FOR_PIPED_INPUT: Driver. (line 89)
* ashift: Arithmetic. (line 173)
* ashift and attributes: Expressions. (line 64)
* ashiftrt: Arithmetic. (line 190)
* ashiftrt and attributes: Expressions. (line 64)
* ashlM3 instruction pattern: Standard Names. (line 458)
* ashrM3 instruction pattern: Standard Names. (line 468)
* ASM_APP_OFF: File Framework. (line 78)
* ASM_APP_ON: File Framework. (line 71)
* ASM_COMMENT_START: File Framework. (line 66)
* ASM_DECLARE_CLASS_REFERENCE: Label Output. (line 465)
* ASM_DECLARE_FUNCTION_NAME: Label Output. (line 99)
* ASM_DECLARE_FUNCTION_SIZE: Label Output. (line 114)
* ASM_DECLARE_OBJECT_NAME: Label Output. (line 127)
* ASM_DECLARE_REGISTER_GLOBAL: Label Output. (line 156)
* ASM_DECLARE_UNRESOLVED_REFERENCE: Label Output. (line 471)
* ASM_FINAL_SPEC: Driver. (line 82)
* ASM_FINISH_DECLARE_OBJECT: Label Output. (line 164)
* ASM_FORMAT_PRIVATE_NAME: Label Output. (line 383)
* asm_fprintf: Instruction Output. (line 151)
* ASM_FPRINTF_EXTENSIONS: Instruction Output. (line 162)
* ASM_GENERATE_INTERNAL_LABEL: Label Output. (line 367)
* asm_input: Side Effects. (line 284)
* asm_input and /v: Flags. (line 94)
* ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX: Exception Handling. (line 82)
* ASM_NO_SKIP_IN_TEXT: Alignment Output. (line 79)
* asm_noperands: Insns. (line 307)
* asm_operands and /v: Flags. (line 94)
* asm_operands, RTL sharing: Sharing. (line 45)
* asm_operands, usage: Assembler. (line 6)
* ASM_OUTPUT_ADDR_DIFF_ELT: Dispatch Tables. (line 9)
* ASM_OUTPUT_ADDR_VEC_ELT: Dispatch Tables. (line 26)
* ASM_OUTPUT_ALIGN: Alignment Output. (line 86)
* ASM_OUTPUT_ALIGN_WITH_NOP: Alignment Output. (line 91)
* ASM_OUTPUT_ALIGNED_BSS: Uninitialized Data. (line 71)
* ASM_OUTPUT_ALIGNED_COMMON: Uninitialized Data. (line 30)
* ASM_OUTPUT_ALIGNED_DECL_COMMON: Uninitialized Data. (line 38)
* ASM_OUTPUT_ALIGNED_DECL_LOCAL: Uninitialized Data. (line 102)
* ASM_OUTPUT_ALIGNED_LOCAL: Uninitialized Data. (line 94)
* ASM_OUTPUT_ASCII: Data Output. (line 62)
* ASM_OUTPUT_BSS: Uninitialized Data. (line 46)
* ASM_OUTPUT_CASE_END: Dispatch Tables. (line 51)
* ASM_OUTPUT_CASE_LABEL: Dispatch Tables. (line 38)
* ASM_OUTPUT_COMMON: Uninitialized Data. (line 10)
* ASM_OUTPUT_DEBUG_LABEL: Label Output. (line 355)
* ASM_OUTPUT_DEF: Label Output. (line 404)
* ASM_OUTPUT_DEF_FROM_DECLS: Label Output. (line 412)
* ASM_OUTPUT_DWARF_DELTA: SDB and DWARF. (line 69)
* ASM_OUTPUT_DWARF_OFFSET: SDB and DWARF. (line 78)
* ASM_OUTPUT_DWARF_PCREL: SDB and DWARF. (line 84)
* ASM_OUTPUT_DWARF_TABLE_REF: SDB and DWARF. (line 89)
* ASM_OUTPUT_DWARF_VMS_DELTA: SDB and DWARF. (line 73)
* ASM_OUTPUT_EXTERNAL: Label Output. (line 284)
* ASM_OUTPUT_FDESC: Data Output. (line 71)
* ASM_OUTPUT_FUNCTION_LABEL: Label Output. (line 17)
* ASM_OUTPUT_IDENT: File Framework. (line 109)
* ASM_OUTPUT_INTERNAL_LABEL: Label Output. (line 29)
* ASM_OUTPUT_LABEL: Label Output. (line 9)
* ASM_OUTPUT_LABEL_REF: Label Output. (line 328)
* ASM_OUTPUT_LABELREF: Label Output. (line 306)
* ASM_OUTPUT_LOCAL: Uninitialized Data. (line 81)
* ASM_OUTPUT_MAX_SKIP_ALIGN: Alignment Output. (line 95)
* ASM_OUTPUT_MEASURED_SIZE: Label Output. (line 53)
* ASM_OUTPUT_OPCODE: Instruction Output. (line 36)
* ASM_OUTPUT_POOL_EPILOGUE: Data Output. (line 121)
* ASM_OUTPUT_POOL_PROLOGUE: Data Output. (line 84)
* ASM_OUTPUT_REG_POP: Instruction Output. (line 206)
* ASM_OUTPUT_REG_PUSH: Instruction Output. (line 201)
* ASM_OUTPUT_SIZE_DIRECTIVE: Label Output. (line 47)
* ASM_OUTPUT_SKIP: Alignment Output. (line 73)
* ASM_OUTPUT_SOURCE_FILENAME: File Framework. (line 85)
* ASM_OUTPUT_SPECIAL_POOL_ENTRY: Data Output. (line 96)
* ASM_OUTPUT_SYMBOL_REF: Label Output. (line 321)
* ASM_OUTPUT_TYPE_DIRECTIVE: Label Output. (line 89)
* ASM_OUTPUT_WEAK_ALIAS: Label Output. (line 430)
* ASM_OUTPUT_WEAKREF: Label Output. (line 216)
* ASM_PREFERRED_EH_DATA_FORMAT: Exception Handling. (line 67)
* ASM_SPEC: Driver. (line 74)
* ASM_STABD_OP: DBX Options. (line 36)
* ASM_STABN_OP: DBX Options. (line 43)
* ASM_STABS_OP: DBX Options. (line 29)
* ASM_WEAKEN_DECL: Label Output. (line 208)
* ASM_WEAKEN_LABEL: Label Output. (line 195)
* assemble_name: Label Output. (line 8)
* assemble_name_raw: Label Output. (line 28)
* assembler format: File Framework. (line 6)
* assembler instructions in RTL: Assembler. (line 6)
* ASSEMBLER_DIALECT: Instruction Output. (line 174)
* assigning attribute values to insns: Tagging Insns. (line 6)
* asterisk in template: Output Statement. (line 29)
* atan2M3 instruction pattern: Standard Names. (line 549)
* attr <1>: Tagging Insns. (line 54)
* attr: Expressions. (line 154)
* attr_flag: Expressions. (line 119)
* attribute expressions: Expressions. (line 6)
* attribute specifications: Attr Example. (line 6)
* attribute specifications example: Attr Example. (line 6)
* ATTRIBUTE_ALIGNED_VALUE: Storage Layout. (line 171)
* attributes: Attributes. (line 6)
* attributes, defining: Defining Attributes.
(line 6)
* attributes, target-specific: Target Attributes. (line 6)
* autoincrement addressing, availability: Portability. (line 21)
* autoincrement/decrement addressing: Simple Constraints. (line 30)
* automata_option: Processor pipeline description.
(line 301)
* automaton based pipeline description: Processor pipeline description.
(line 6)
* automaton based scheduler: Processor pipeline description.
(line 6)
* AVOID_CCMODE_COPIES: Values in Registers.
(line 153)
* backslash: Output Template. (line 46)
* barrier: Insns. (line 160)
* barrier and /f: Flags. (line 125)
* barrier and /v: Flags. (line 44)
* BASE_REG_CLASS: Register Classes. (line 109)
* basic block: Basic Blocks. (line 6)
* Basic Statements: Basic Statements. (line 6)
* basic-block.h: Control Flow. (line 6)
* BASIC_BLOCK: Basic Blocks. (line 19)
* basic_block: Basic Blocks. (line 6)
* BB_HEAD, BB_END: Maintaining the CFG.
(line 88)
* bb_seq: GIMPLE sequences. (line 73)
* BIGGEST_ALIGNMENT: Storage Layout. (line 161)
* BIGGEST_FIELD_ALIGNMENT: Storage Layout. (line 182)
* BImode: Machine Modes. (line 22)
* BIND_EXPR: Unary and Binary Expressions.
(line 6)
* BINFO_TYPE: Classes. (line 6)
* bit-fields: Bit-Fields. (line 6)
* BIT_AND_EXPR: Unary and Binary Expressions.
(line 6)
* BIT_IOR_EXPR: Unary and Binary Expressions.
(line 6)
* BIT_NOT_EXPR: Unary and Binary Expressions.
(line 6)
* BIT_XOR_EXPR: Unary and Binary Expressions.
(line 6)
* BITFIELD_NBYTES_LIMITED: Storage Layout. (line 386)
* BITS_BIG_ENDIAN: Storage Layout. (line 12)
* BITS_BIG_ENDIAN, effect on sign_extract: Bit-Fields. (line 8)
* BITS_PER_UNIT: Storage Layout. (line 45)
* BITS_PER_WORD: Storage Layout. (line 50)
* bitwise complement: Arithmetic. (line 154)
* bitwise exclusive-or: Arithmetic. (line 168)
* bitwise inclusive-or: Arithmetic. (line 163)
* bitwise logical-and: Arithmetic. (line 158)
* BLKmode: Machine Modes. (line 183)
* BLKmode, and function return values: Calls. (line 23)
* block statement iterators <1>: Maintaining the CFG.
(line 45)
* block statement iterators: Basic Blocks. (line 68)
* BLOCK_FOR_INSN, bb_for_stmt: Maintaining the CFG.
(line 40)
* BLOCK_REG_PADDING: Register Arguments. (line 228)
* blockage instruction pattern: Standard Names. (line 1417)
* Blocks: Blocks. (line 6)
* bool: Misc. (line 844)
* BOOL_TYPE_SIZE: Type Layout. (line 44)
* BOOLEAN_TYPE: Types. (line 6)
* branch prediction: Profile information.
(line 24)
* BRANCH_COST: Costs. (line 105)
* break_out_memory_refs: Addressing Modes. (line 135)
* BREAK_STMT: Statements for C++. (line 6)
* bsi_commit_edge_inserts: Maintaining the CFG.
(line 118)
* bsi_end_p: Maintaining the CFG.
(line 60)
* bsi_insert_after: Maintaining the CFG.
(line 72)
* bsi_insert_before: Maintaining the CFG.
(line 78)
* bsi_insert_on_edge: Maintaining the CFG.
(line 118)
* bsi_last: Maintaining the CFG.
(line 56)
* bsi_next: Maintaining the CFG.
(line 64)
* bsi_prev: Maintaining the CFG.
(line 68)
* bsi_remove: Maintaining the CFG.
(line 84)
* bsi_start: Maintaining the CFG.
(line 52)
* BSS_SECTION_ASM_OP: Sections. (line 68)
* bswap: Arithmetic. (line 241)
* btruncM2 instruction pattern: Standard Names. (line 567)
* build0: Macros and Functions.
(line 16)
* build1: Macros and Functions.
(line 17)
* build2: Macros and Functions.
(line 18)
* build3: Macros and Functions.
(line 19)
* build4: Macros and Functions.
(line 20)
* build5: Macros and Functions.
(line 21)
* build6: Macros and Functions.
(line 22)
* builtin_longjmp instruction pattern: Standard Names. (line 1320)
* builtin_setjmp_receiver instruction pattern: Standard Names.
(line 1310)
* builtin_setjmp_setup instruction pattern: Standard Names. (line 1299)
* byte_mode: Machine Modes. (line 336)
* BYTES_BIG_ENDIAN: Storage Layout. (line 24)
* BYTES_BIG_ENDIAN, effect on subreg: Regs and Memory. (line 221)
* C statements for assembler output: Output Statement. (line 6)
* C99 math functions, implicit usage: Library Calls. (line 62)
* C_COMMON_OVERRIDE_OPTIONS: Run-time Target. (line 142)
* c_register_pragma: Misc. (line 404)
* c_register_pragma_with_expansion: Misc. (line 406)
* call <1>: Side Effects. (line 86)
* call: Flags. (line 239)
* call instruction pattern: Standard Names. (line 974)
* call usage: Calls. (line 10)
* call, in call_insn: Flags. (line 33)
* call, in mem: Flags. (line 99)
* call-clobbered register: Register Basics. (line 35)
* call-saved register: Register Basics. (line 35)
* call-used register: Register Basics. (line 35)
* CALL_EXPR: Unary and Binary Expressions.
(line 6)
* call_insn: Insns. (line 95)
* call_insn and /c: Flags. (line 33)
* call_insn and /f: Flags. (line 125)
* call_insn and /i: Flags. (line 24)
* call_insn and /j: Flags. (line 179)
* call_insn and /s: Flags. (line 49)
* call_insn and /u: Flags. (line 19)
* call_insn and /u or /i: Flags. (line 29)
* call_insn and /v: Flags. (line 44)
* CALL_INSN_FUNCTION_USAGE: Insns. (line 101)
* call_pop instruction pattern: Standard Names. (line 1002)
* CALL_POPS_ARGS: Stack Arguments. (line 133)
* CALL_REALLY_USED_REGISTERS: Register Basics. (line 46)
* CALL_USED_REGISTERS: Register Basics. (line 35)
* call_used_regs: Register Basics. (line 59)
* call_value instruction pattern: Standard Names. (line 994)
* call_value_pop instruction pattern: Standard Names. (line 1002)
* CALLER_SAVE_PROFITABLE: Caller Saves. (line 11)
* calling conventions: Stack and Calling. (line 6)
* calling functions in RTL: Calls. (line 6)
* can_create_pseudo_p: Standard Names. (line 75)
* can_fallthru: Basic Blocks. (line 57)
* canadian: Configure Terms. (line 6)
* CANNOT_CHANGE_MODE_CLASS: Register Classes. (line 522)
* CANNOT_CHANGE_MODE_CLASS and subreg semantics: Regs and Memory.
(line 280)
* canonicalization of instructions: Insn Canonicalizations.
(line 6)
* CANONICALIZE_COMPARISON: MODE_CC Condition Codes.
(line 55)
* canonicalize_funcptr_for_compare instruction pattern: Standard Names.
(line 1158)
* CASE_USE_BIT_TESTS: Misc. (line 54)
* CASE_VECTOR_MODE: Misc. (line 27)
* CASE_VECTOR_PC_RELATIVE: Misc. (line 40)
* CASE_VECTOR_SHORTEN_MODE: Misc. (line 31)
* casesi instruction pattern: Standard Names. (line 1082)
* cbranchMODE4 instruction pattern: Standard Names. (line 963)
* cc0 <1>: CC0 Condition Codes.
(line 6)
* cc0: Regs and Memory. (line 307)
* cc0, RTL sharing: Sharing. (line 27)
* cc0_rtx: Regs and Memory. (line 333)
* CC1_SPEC: Driver. (line 56)
* CC1PLUS_SPEC: Driver. (line 64)
* cc_status: CC0 Condition Codes.
(line 6)
* CC_STATUS_MDEP: CC0 Condition Codes.
(line 17)
* CC_STATUS_MDEP_INIT: CC0 Condition Codes.
(line 23)
* CCmode <1>: MODE_CC Condition Codes.
(line 6)
* CCmode: Machine Modes. (line 176)
* CDImode: Machine Modes. (line 202)
* CEIL_DIV_EXPR: Unary and Binary Expressions.
(line 6)
* CEIL_MOD_EXPR: Unary and Binary Expressions.
(line 6)
* ceilM2 instruction pattern: Standard Names. (line 583)
* CFA_FRAME_BASE_OFFSET: Frame Layout. (line 226)
* CFG, Control Flow Graph: Control Flow. (line 6)
* cfghooks.h: Maintaining the CFG.
(line 6)
* cgraph_finalize_function: Parsing pass. (line 52)
* chain_circular: GTY Options. (line 191)
* chain_next: GTY Options. (line 191)
* chain_prev: GTY Options. (line 191)
* change_address: Standard Names. (line 47)
* CHAR_TYPE_SIZE: Type Layout. (line 39)
* check_stack instruction pattern: Standard Names. (line 1245)
* CHImode: Machine Modes. (line 202)
* class definitions, register: Register Classes. (line 6)
* class preference constraints: Class Preferences. (line 6)
* class, scope: Classes. (line 6)
* CLASS_MAX_NREGS: Register Classes. (line 510)
* CLASS_TYPE_P: Types for C++. (line 65)
* classes of RTX codes: RTL Classes. (line 6)
* CLASSTYPE_DECLARED_CLASS: Classes. (line 6)
* CLASSTYPE_HAS_MUTABLE: Classes. (line 85)
* CLASSTYPE_NON_POD_P: Classes. (line 90)
* CLEANUP_DECL: Statements for C++. (line 6)
* CLEANUP_EXPR: Statements for C++. (line 6)
* CLEANUP_POINT_EXPR: Unary and Binary Expressions.
(line 6)
* CLEANUP_STMT: Statements for C++. (line 6)
* Cleanups: Cleanups. (line 6)
* CLEAR_BY_PIECES_P: Costs. (line 188)
* clear_cache instruction pattern: Standard Names. (line 1561)
* CLEAR_INSN_CACHE: Trampolines. (line 99)
* CLEAR_RATIO: Costs. (line 176)
* clobber: Side Effects. (line 100)
* clz: Arithmetic. (line 217)
* CLZ_DEFINED_VALUE_AT_ZERO: Misc. (line 319)
* clzM2 instruction pattern: Standard Names. (line 648)
* cmpmemM instruction pattern: Standard Names. (line 781)
* cmpstrM instruction pattern: Standard Names. (line 760)
* cmpstrnM instruction pattern: Standard Names. (line 747)
* code generation RTL sequences: Expander Definitions.
(line 6)
* code iterators in .md files: Code Iterators. (line 6)
* code_label: Insns. (line 119)
* code_label and /i: Flags. (line 59)
* code_label and /v: Flags. (line 44)
* CODE_LABEL_NUMBER: Insns. (line 119)
* codes, RTL expression: RTL Objects. (line 47)
* COImode: Machine Modes. (line 202)
* COLLECT2_HOST_INITIALIZATION: Host Misc. (line 32)
* COLLECT_EXPORT_LIST: Misc. (line 743)
* COLLECT_SHARED_FINI_FUNC: Macros for Initialization.
(line 44)
* COLLECT_SHARED_INIT_FUNC: Macros for Initialization.
(line 33)
* commit_edge_insertions: Maintaining the CFG.
(line 118)
* compare: Arithmetic. (line 43)
* compare, canonicalization of: Insn Canonicalizations.
(line 37)
* comparison_operator: Machine-Independent Predicates.
(line 111)
* compiler passes and files: Passes. (line 6)
* complement, bitwise: Arithmetic. (line 154)
* COMPLEX_CST: Constant expressions.
(line 6)
* COMPLEX_EXPR: Unary and Binary Expressions.
(line 6)
* COMPLEX_TYPE: Types. (line 6)
* COMPONENT_REF: Storage References. (line 6)
* Compound Expressions: Compound Expressions.
(line 6)
* Compound Lvalues: Compound Lvalues. (line 6)
* COMPOUND_EXPR: Unary and Binary Expressions.
(line 6)
* COMPOUND_LITERAL_EXPR: Unary and Binary Expressions.
(line 6)
* COMPOUND_LITERAL_EXPR_DECL: Unary and Binary Expressions.
(line 367)
* COMPOUND_LITERAL_EXPR_DECL_EXPR: Unary and Binary Expressions.
(line 367)
* computed jump: Edges. (line 128)
* computing the length of an insn: Insn Lengths. (line 6)
* concat: Regs and Memory. (line 385)
* concatn: Regs and Memory. (line 391)
* cond: Comparisons. (line 90)
* cond and attributes: Expressions. (line 37)
* cond_exec: Side Effects. (line 248)
* COND_EXPR: Unary and Binary Expressions.
(line 6)
* condition code register: Regs and Memory. (line 307)
* condition code status: Condition Code. (line 6)
* condition codes: Comparisons. (line 20)
* conditional execution <1>: Cond Exec Macros. (line 6)
* conditional execution: Conditional Execution.
(line 6)
* Conditional Expressions: Conditional Expressions.
(line 6)
* conditions, in patterns: Patterns. (line 43)
* configuration file <1>: Host Misc. (line 6)
* configuration file: Filesystem. (line 6)
* configure terms: Configure Terms. (line 6)
* CONJ_EXPR: Unary and Binary Expressions.
(line 6)
* const: Constants. (line 99)
* CONST0_RTX: Constants. (line 119)
* const0_rtx: Constants. (line 16)
* CONST1_RTX: Constants. (line 119)
* const1_rtx: Constants. (line 16)
* CONST2_RTX: Constants. (line 119)
* const2_rtx: Constants. (line 16)
* CONST_DECL: Declarations. (line 6)
* const_double: Constants. (line 32)
* const_double, RTL sharing: Sharing. (line 29)
* CONST_DOUBLE_LOW: Constants. (line 39)
* CONST_DOUBLE_OK_FOR_CONSTRAINT_P: Old Constraints. (line 69)
* CONST_DOUBLE_OK_FOR_LETTER_P: Old Constraints. (line 54)
* const_double_operand: Machine-Independent Predicates.
(line 21)
* const_fixed: Constants. (line 52)
* const_int: Constants. (line 8)
* const_int and attribute tests: Expressions. (line 47)
* const_int and attributes: Expressions. (line 10)
* const_int, RTL sharing: Sharing. (line 23)
* const_int_operand: Machine-Independent Predicates.
(line 16)
* CONST_OK_FOR_CONSTRAINT_P: Old Constraints. (line 49)
* CONST_OK_FOR_LETTER_P: Old Constraints. (line 40)
* const_string: Constants. (line 71)
* const_string and attributes: Expressions. (line 20)
* const_true_rtx: Constants. (line 26)
* const_vector: Constants. (line 59)
* const_vector, RTL sharing: Sharing. (line 32)
* constant attributes: Constant Attributes.
(line 6)
* constant definitions: Constant Definitions.
(line 6)
* CONSTANT_ADDRESS_P: Addressing Modes. (line 29)
* CONSTANT_ALIGNMENT: Storage Layout. (line 229)
* CONSTANT_P: Addressing Modes. (line 36)
* CONSTANT_POOL_ADDRESS_P: Flags. (line 10)
* CONSTANT_POOL_BEFORE_FUNCTION: Data Output. (line 76)
* constants in constraints: Simple Constraints. (line 70)
* constm1_rtx: Constants. (line 16)
* constraint modifier characters: Modifiers. (line 6)
* constraint, matching: Simple Constraints. (line 142)
* CONSTRAINT_LEN: Old Constraints. (line 12)
* constraint_num: C Constraint Interface.
(line 38)
* constraint_satisfied_p: C Constraint Interface.
(line 54)
* constraints: Constraints. (line 6)
* constraints, defining: Define Constraints. (line 6)
* constraints, defining, obsolete method: Old Constraints. (line 6)
* constraints, machine specific: Machine Constraints.
(line 6)
* constraints, testing: C Constraint Interface.
(line 6)
* CONSTRUCTOR: Unary and Binary Expressions.
(line 6)
* constructors, automatic calls: Collect2. (line 15)
* constructors, output of: Initialization. (line 6)
* container: Containers. (line 6)
* CONTINUE_STMT: Statements for C++. (line 6)
* contributors: Contributors. (line 6)
* controlling register usage: Register Basics. (line 73)
* controlling the compilation driver: Driver. (line 6)
* conventions, run-time: Interface. (line 6)
* conversions: Conversions. (line 6)
* CONVERT_EXPR: Unary and Binary Expressions.
(line 6)
* copy_rtx: Addressing Modes. (line 188)
* copy_rtx_if_shared: Sharing. (line 64)
* copysignM3 instruction pattern: Standard Names. (line 629)
* cosM2 instruction pattern: Standard Names. (line 508)
* costs of instructions: Costs. (line 6)
* CP_INTEGRAL_TYPE: Types for C++. (line 57)
* cp_namespace_decls: Namespaces. (line 49)
* CP_TYPE_CONST_NON_VOLATILE_P: Types for C++. (line 33)
* CP_TYPE_CONST_P: Types for C++. (line 24)
* CP_TYPE_QUALS: Types for C++. (line 6)
* CP_TYPE_RESTRICT_P: Types for C++. (line 30)
* CP_TYPE_VOLATILE_P: Types for C++. (line 27)
* CPLUSPLUS_CPP_SPEC: Driver. (line 51)
* CPP_SPEC: Driver. (line 44)
* CQImode: Machine Modes. (line 202)
* cross compilation and floating point: Floating Point. (line 6)
* CRT_CALL_STATIC_FUNCTION: Sections. (line 122)
* CRTSTUFF_T_CFLAGS: Target Fragment. (line 35)
* CRTSTUFF_T_CFLAGS_S: Target Fragment. (line 39)
* CSImode: Machine Modes. (line 202)
* cstoreMODE4 instruction pattern: Standard Names. (line 924)
* CTImode: Machine Modes. (line 202)
* ctrapMM4 instruction pattern: Standard Names. (line 1386)
* ctz: Arithmetic. (line 225)
* CTZ_DEFINED_VALUE_AT_ZERO: Misc. (line 320)
* ctzM2 instruction pattern: Standard Names. (line 657)
* CUMULATIVE_ARGS: Register Arguments. (line 127)
* current_function_epilogue_delay_list: Function Entry. (line 181)
* current_function_is_leaf: Leaf Functions. (line 51)
* current_function_outgoing_args_size: Stack Arguments. (line 48)
* current_function_pops_args: Function Entry. (line 106)
* current_function_pretend_args_size: Function Entry. (line 112)
* current_function_uses_only_leaf_regs: Leaf Functions. (line 51)
* current_insn_predicate: Conditional Execution.
(line 26)
* DAmode: Machine Modes. (line 152)
* data bypass: Processor pipeline description.
(line 106)
* data dependence delays: Processor pipeline description.
(line 6)
* Data Dependency Analysis: Dependency analysis.
(line 6)
* data structures: Per-Function Data. (line 6)
* DATA_ALIGNMENT: Storage Layout. (line 216)
* DATA_SECTION_ASM_OP: Sections. (line 53)
* DBR_OUTPUT_SEQEND: Instruction Output. (line 135)
* dbr_sequence_length: Instruction Output. (line 134)
* DBX_BLOCKS_FUNCTION_RELATIVE: DBX Options. (line 103)
* DBX_CONTIN_CHAR: DBX Options. (line 66)
* DBX_CONTIN_LENGTH: DBX Options. (line 56)
* DBX_DEBUGGING_INFO: DBX Options. (line 9)
* DBX_FUNCTION_FIRST: DBX Options. (line 97)
* DBX_LINES_FUNCTION_RELATIVE: DBX Options. (line 109)
* DBX_NO_XREFS: DBX Options. (line 50)
* DBX_OUTPUT_LBRAC: DBX Hooks. (line 9)
* DBX_OUTPUT_MAIN_SOURCE_FILE_END: File Names and DBX. (line 34)
* DBX_OUTPUT_MAIN_SOURCE_FILENAME: File Names and DBX. (line 9)
* DBX_OUTPUT_NFUN: DBX Hooks. (line 18)
* DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END: File Names and DBX.
(line 42)
* DBX_OUTPUT_RBRAC: DBX Hooks. (line 15)
* DBX_OUTPUT_SOURCE_LINE: DBX Hooks. (line 22)
* DBX_REGISTER_NUMBER: All Debuggers. (line 9)
* DBX_REGPARM_STABS_CODE: DBX Options. (line 87)
* DBX_REGPARM_STABS_LETTER: DBX Options. (line 92)
* DBX_STATIC_CONST_VAR_CODE: DBX Options. (line 82)
* DBX_STATIC_STAB_DATA_SECTION: DBX Options. (line 73)
* DBX_TYPE_DECL_STABS_CODE: DBX Options. (line 78)
* DBX_USE_BINCL: DBX Options. (line 115)
* DCmode: Machine Modes. (line 197)
* DDmode: Machine Modes. (line 90)
* De Morgan's law: Insn Canonicalizations.
(line 52)
* dead_or_set_p: define_peephole. (line 65)
* debug_expr: Debug Information. (line 22)
* DEBUG_EXPR_DECL: Declarations. (line 6)
* debug_insn: Insns. (line 239)
* DEBUG_SYMS_TEXT: DBX Options. (line 25)
* DEBUGGER_ARG_OFFSET: All Debuggers. (line 37)
* DEBUGGER_AUTO_OFFSET: All Debuggers. (line 28)
* decimal float library: Decimal float library routines.
(line 6)
* DECL_ALIGN: Declarations. (line 6)
* DECL_ANTICIPATED: Functions for C++. (line 42)
* DECL_ARGUMENTS: Function Basics. (line 36)
* DECL_ARRAY_DELETE_OPERATOR_P: Functions for C++. (line 158)
* DECL_ARTIFICIAL <1>: Function Properties.
(line 47)
* DECL_ARTIFICIAL <2>: Function Basics. (line 6)
* DECL_ARTIFICIAL: Working with declarations.
(line 24)
* DECL_ASSEMBLER_NAME: Function Basics. (line 6)
* DECL_ATTRIBUTES: Attributes. (line 22)
* DECL_BASE_CONSTRUCTOR_P: Functions for C++. (line 88)
* DECL_COMPLETE_CONSTRUCTOR_P: Functions for C++. (line 84)
* DECL_COMPLETE_DESTRUCTOR_P: Functions for C++. (line 98)
* DECL_CONST_MEMFUNC_P: Functions for C++. (line 71)
* DECL_CONSTRUCTOR_P: Functions for C++. (line 77)
* DECL_CONTEXT: Namespaces. (line 31)
* DECL_CONV_FN_P: Functions for C++. (line 105)
* DECL_COPY_CONSTRUCTOR_P: Functions for C++. (line 92)
* DECL_DESTRUCTOR_P: Functions for C++. (line 95)
* DECL_EXTERN_C_FUNCTION_P: Functions for C++. (line 46)
* DECL_EXTERNAL <1>: Function Properties.
(line 25)
* DECL_EXTERNAL: Declarations. (line 6)
* DECL_FUNCTION_MEMBER_P: Functions for C++. (line 61)
* DECL_FUNCTION_SPECIFIC_OPTIMIZATION <1>: Function Properties.
(line 61)
* DECL_FUNCTION_SPECIFIC_OPTIMIZATION: Function Basics. (line 6)
* DECL_FUNCTION_SPECIFIC_TARGET <1>: Function Properties.
(line 55)
* DECL_FUNCTION_SPECIFIC_TARGET: Function Basics. (line 6)
* DECL_GLOBAL_CTOR_P: Functions for C++. (line 108)
* DECL_GLOBAL_DTOR_P: Functions for C++. (line 112)
* DECL_INITIAL <1>: Function Basics. (line 51)
* DECL_INITIAL: Declarations. (line 6)
* DECL_LINKONCE_P: Functions for C++. (line 50)
* DECL_LOCAL_FUNCTION_P: Functions for C++. (line 38)
* DECL_MAIN_P: Functions for C++. (line 34)
* DECL_NAME <1>: Namespaces. (line 20)
* DECL_NAME <2>: Function Basics. (line 6)
* DECL_NAME: Working with declarations.
(line 7)
* DECL_NAMESPACE_ALIAS: Namespaces. (line 35)
* DECL_NAMESPACE_STD_P: Namespaces. (line 45)
* DECL_NON_THUNK_FUNCTION_P: Functions for C++. (line 138)
* DECL_NONCONVERTING_P: Functions for C++. (line 80)
* DECL_NONSTATIC_MEMBER_FUNCTION_P: Functions for C++. (line 68)
* DECL_OVERLOADED_OPERATOR_P: Functions for C++. (line 102)
* DECL_PURE_P: Function Properties.
(line 40)
* DECL_RESULT: Function Basics. (line 41)
* DECL_SAVED_TREE: Function Basics. (line 44)
* DECL_SIZE: Declarations. (line 6)
* DECL_STATIC_FUNCTION_P: Functions for C++. (line 65)
* DECL_STMT: Statements for C++. (line 6)
* DECL_STMT_DECL: Statements for C++. (line 6)
* DECL_THUNK_P: Functions for C++. (line 116)
* DECL_VIRTUAL_P: Function Properties.
(line 44)
* DECL_VOLATILE_MEMFUNC_P: Functions for C++. (line 74)
* declaration: Declarations. (line 6)
* declarations, RTL: RTL Declarations. (line 6)
* DECLARE_LIBRARY_RENAMES: Library Calls. (line 9)
* decrement_and_branch_until_zero instruction pattern: Standard Names.
(line 1120)
* default: GTY Options. (line 77)
* default_file_start: File Framework. (line 8)
* DEFAULT_GDB_EXTENSIONS: DBX Options. (line 18)
* DEFAULT_PCC_STRUCT_RETURN: Aggregate Return. (line 35)
* DEFAULT_SIGNED_CHAR: Type Layout. (line 153)
* define_address_constraint: Define Constraints. (line 107)
* define_asm_attributes: Tagging Insns. (line 73)
* define_attr: Defining Attributes.
(line 6)
* define_automaton: Processor pipeline description.
(line 53)
* define_bypass: Processor pipeline description.
(line 197)
* define_c_enum: Constant Definitions.
(line 49)
* define_code_attr: Code Iterators. (line 6)
* define_code_iterator: Code Iterators. (line 6)
* define_cond_exec: Conditional Execution.
(line 13)
* define_constants: Constant Definitions.
(line 6)
* define_constraint: Define Constraints. (line 48)
* define_cpu_unit: Processor pipeline description.
(line 68)
* define_delay: Delay Slots. (line 25)
* define_enum: Constant Definitions.
(line 118)
* define_enum_attr <1>: Constant Definitions.
(line 136)
* define_enum_attr: Defining Attributes.
(line 64)
* define_expand: Expander Definitions.
(line 11)
* define_insn: Patterns. (line 6)
* define_insn example: Example. (line 6)
* define_insn_and_split: Insn Splitting. (line 170)
* define_insn_reservation: Processor pipeline description.
(line 106)
* define_memory_constraint: Define Constraints. (line 88)
* define_mode_attr: Substitutions. (line 6)
* define_mode_iterator: Defining Mode Iterators.
(line 6)
* define_peephole: define_peephole. (line 6)
* define_peephole2: define_peephole2. (line 6)
* define_predicate: Defining Predicates.
(line 6)
* define_query_cpu_unit: Processor pipeline description.
(line 90)
* define_register_constraint: Define Constraints. (line 28)
* define_reservation: Processor pipeline description.
(line 186)
* define_special_predicate: Defining Predicates.
(line 6)
* define_split: Insn Splitting. (line 32)
* defining attributes and their values: Defining Attributes.
(line 6)
* defining constraints: Define Constraints. (line 6)
* defining constraints, obsolete method: Old Constraints. (line 6)
* defining jump instruction patterns: Jump Patterns. (line 6)
* defining looping instruction patterns: Looping Patterns. (line 6)
* defining peephole optimizers: Peephole Definitions.
(line 6)
* defining predicates: Defining Predicates.
(line 6)
* defining RTL sequences for code generation: Expander Definitions.
(line 6)
* delay slots, defining: Delay Slots. (line 6)
* DELAY_SLOTS_FOR_EPILOGUE: Function Entry. (line 163)
* deletable: GTY Options. (line 145)
* DELETE_IF_ORDINARY: Filesystem. (line 79)
* Dependent Patterns: Dependent Patterns. (line 6)
* desc: GTY Options. (line 77)
* destructors, output of: Initialization. (line 6)
* deterministic finite state automaton: Processor pipeline description.
(line 6)
* DF_SIZE: Type Layout. (line 129)
* DFmode: Machine Modes. (line 73)
* digits in constraint: Simple Constraints. (line 130)
* DImode: Machine Modes. (line 45)
* DIR_SEPARATOR: Filesystem. (line 18)
* DIR_SEPARATOR_2: Filesystem. (line 19)
* directory options .md: Including Patterns. (line 44)
* disabling certain registers: Register Basics. (line 73)
* dispatch table: Dispatch Tables. (line 8)
* div: Arithmetic. (line 116)
* div and attributes: Expressions. (line 64)
* division: Arithmetic. (line 116)
* divM3 instruction pattern: Standard Names. (line 222)
* divmodM4 instruction pattern: Standard Names. (line 438)
* DO_BODY: Statements for C++. (line 6)
* DO_COND: Statements for C++. (line 6)
* DO_STMT: Statements for C++. (line 6)
* DOLLARS_IN_IDENTIFIERS: Misc. (line 451)
* doloop_begin instruction pattern: Standard Names. (line 1151)
* doloop_end instruction pattern: Standard Names. (line 1130)
* DONE: Expander Definitions.
(line 74)
* DONT_USE_BUILTIN_SETJMP: Exception Region Output.
(line 79)
* DOUBLE_TYPE_SIZE: Type Layout. (line 53)
* DQmode: Machine Modes. (line 115)
* driver: Driver. (line 6)
* DRIVER_SELF_SPECS: Driver. (line 9)
* DUMPFILE_FORMAT: Filesystem. (line 67)
* DWARF2_ASM_LINE_DEBUG_INFO: SDB and DWARF. (line 50)
* DWARF2_DEBUGGING_INFO: SDB and DWARF. (line 13)
* DWARF2_FRAME_INFO: SDB and DWARF. (line 30)
* DWARF2_FRAME_REG_OUT: Frame Registers. (line 150)
* DWARF2_UNWIND_INFO: Exception Region Output.
(line 40)
* DWARF_ALT_FRAME_RETURN_COLUMN: Frame Layout. (line 152)
* DWARF_CIE_DATA_ALIGNMENT: Exception Region Output.
(line 84)
* DWARF_FRAME_REGISTERS: Frame Registers. (line 110)
* DWARF_FRAME_REGNUM: Frame Registers. (line 142)
* DWARF_REG_TO_UNWIND_COLUMN: Frame Registers. (line 134)
* DWARF_ZERO_REG: Frame Layout. (line 163)
* DYNAMIC_CHAIN_ADDRESS: Frame Layout. (line 92)
* E in constraint: Simple Constraints. (line 89)
* earlyclobber operand: Modifiers. (line 25)
* edge: Edges. (line 6)
* edge in the flow graph: Edges. (line 6)
* edge iterators: Edges. (line 15)
* edge splitting: Maintaining the CFG.
(line 118)
* EDGE_ABNORMAL: Edges. (line 128)
* EDGE_ABNORMAL, EDGE_ABNORMAL_CALL: Edges. (line 171)
* EDGE_ABNORMAL, EDGE_EH: Edges. (line 96)
* EDGE_ABNORMAL, EDGE_SIBCALL: Edges. (line 122)
* EDGE_FALLTHRU, force_nonfallthru: Edges. (line 86)
* EDOM, implicit usage: Library Calls. (line 44)
* EH_FRAME_IN_DATA_SECTION: Exception Region Output.
(line 20)
* EH_FRAME_SECTION_NAME: Exception Region Output.
(line 10)
* eh_return instruction pattern: Standard Names. (line 1326)
* EH_RETURN_DATA_REGNO: Exception Handling. (line 7)
* EH_RETURN_HANDLER_RTX: Exception Handling. (line 39)
* EH_RETURN_STACKADJ_RTX: Exception Handling. (line 22)
* EH_TABLES_CAN_BE_READ_ONLY: Exception Region Output.
(line 29)
* EH_USES: Function Entry. (line 158)
* ei_edge: Edges. (line 43)
* ei_end_p: Edges. (line 27)
* ei_last: Edges. (line 23)
* ei_next: Edges. (line 35)
* ei_one_before_end_p: Edges. (line 31)
* ei_prev: Edges. (line 39)
* ei_safe_safe: Edges. (line 47)
* ei_start: Edges. (line 19)
* ELIGIBLE_FOR_EPILOGUE_DELAY: Function Entry. (line 169)
* ELIMINABLE_REGS: Elimination. (line 47)
* ELSE_CLAUSE: Statements for C++. (line 6)
* Embedded C: Fixed-point fractional library routines.
(line 6)
* EMIT_MODE_SET: Mode Switching. (line 74)
* Empty Statements: Empty Statements. (line 6)
* EMPTY_CLASS_EXPR: Statements for C++. (line 6)
* EMPTY_FIELD_BOUNDARY: Storage Layout. (line 299)
* Emulated TLS: Emulated TLS. (line 6)
* ENABLE_EXECUTE_STACK: Trampolines. (line 109)
* enabled: Disable Insn Alternatives.
(line 6)
* ENDFILE_SPEC: Driver. (line 156)
* endianness: Portability. (line 21)
* ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR: Basic Blocks. (line 28)
* enum machine_mode: Machine Modes. (line 6)
* enum reg_class: Register Classes. (line 67)
* ENUMERAL_TYPE: Types. (line 6)
* enumerations: Constant Definitions.
(line 49)
* epilogue: Function Entry. (line 6)
* epilogue instruction pattern: Standard Names. (line 1358)
* EPILOGUE_USES: Function Entry. (line 152)
* eq: Comparisons. (line 52)
* eq and attributes: Expressions. (line 64)
* eq_attr: Expressions. (line 85)
* EQ_EXPR: Unary and Binary Expressions.
(line 6)
* equal: Comparisons. (line 52)
* errno, implicit usage: Library Calls. (line 56)
* EXACT_DIV_EXPR: Unary and Binary Expressions.
(line 6)
* examining SSA_NAMEs: SSA. (line 218)
* exception handling <1>: Exception Handling. (line 6)
* exception handling: Edges. (line 96)
* exception_receiver instruction pattern: Standard Names. (line 1290)
* exclamation point: Multi-Alternative. (line 47)
* exclusion_set: Processor pipeline description.
(line 220)
* exclusive-or, bitwise: Arithmetic. (line 168)
* EXIT_EXPR: Unary and Binary Expressions.
(line 6)
* EXIT_IGNORE_STACK: Function Entry. (line 140)
* expander definitions: Expander Definitions.
(line 6)
* expM2 instruction pattern: Standard Names. (line 524)
* EXPR_FILENAME: Working with declarations.
(line 14)
* EXPR_LINENO: Working with declarations.
(line 20)
* expr_list: Insns. (line 545)
* EXPR_STMT: Statements for C++. (line 6)
* EXPR_STMT_EXPR: Statements for C++. (line 6)
* expression: Expression trees. (line 6)
* expression codes: RTL Objects. (line 47)
* extendMN2 instruction pattern: Standard Names. (line 839)
* extensible constraints: Simple Constraints. (line 173)
* EXTRA_ADDRESS_CONSTRAINT: Old Constraints. (line 123)
* EXTRA_CONSTRAINT: Old Constraints. (line 74)
* EXTRA_CONSTRAINT_STR: Old Constraints. (line 95)
* EXTRA_MEMORY_CONSTRAINT: Old Constraints. (line 100)
* EXTRA_SPECS: Driver. (line 183)
* extv instruction pattern: Standard Names. (line 875)
* extzv instruction pattern: Standard Names. (line 890)
* F in constraint: Simple Constraints. (line 94)
* FAIL: Expander Definitions.
(line 80)
* fall-thru: Edges. (line 69)
* FATAL_EXIT_CODE: Host Misc. (line 6)
* FDL, GNU Free Documentation License: GNU Free Documentation License.
(line 6)
* features, optional, in system conventions: Run-time Target.
(line 59)
* ffs: Arithmetic. (line 211)
* ffsM2 instruction pattern: Standard Names. (line 638)
* FIELD_DECL: Declarations. (line 6)
* file_end_indicate_exec_stack: File Framework. (line 41)
* files and passes of the compiler: Passes. (line 6)
* files, generated: Files. (line 6)
* final_absence_set: Processor pipeline description.
(line 220)
* FINAL_PRESCAN_INSN: Instruction Output. (line 61)
* final_presence_set: Processor pipeline description.
(line 220)
* final_scan_insn: Function Entry. (line 181)
* final_sequence: Instruction Output. (line 145)
* FIND_BASE_TERM: Addressing Modes. (line 119)
* FINI_ARRAY_SECTION_ASM_OP: Sections. (line 115)
* FINI_SECTION_ASM_OP: Sections. (line 100)
* finite state automaton minimization: Processor pipeline description.
(line 301)
* FIRST_PARM_OFFSET: Frame Layout. (line 67)
* FIRST_PARM_OFFSET and virtual registers: Regs and Memory. (line 65)
* FIRST_PSEUDO_REGISTER: Register Basics. (line 9)
* FIRST_STACK_REG: Stack Registers. (line 27)
* FIRST_VIRTUAL_REGISTER: Regs and Memory. (line 51)
* fix: Conversions. (line 66)
* FIX_TRUNC_EXPR: Unary and Binary Expressions.
(line 6)
* fix_truncMN2 instruction pattern: Standard Names. (line 826)
* fixed register: Register Basics. (line 15)
* fixed-point fractional library: Fixed-point fractional library routines.
(line 6)
* FIXED_CONVERT_EXPR: Unary and Binary Expressions.
(line 6)
* FIXED_CST: Constant expressions.
(line 6)
* FIXED_POINT_TYPE: Types. (line 6)
* FIXED_REGISTERS: Register Basics. (line 15)
* fixed_regs: Register Basics. (line 59)
* fixMN2 instruction pattern: Standard Names. (line 806)
* FIXUNS_TRUNC_LIKE_FIX_TRUNC: Misc. (line 100)
* fixuns_truncMN2 instruction pattern: Standard Names. (line 830)
* fixunsMN2 instruction pattern: Standard Names. (line 815)
* flags in RTL expression: Flags. (line 6)
* float: Conversions. (line 58)
* FLOAT_EXPR: Unary and Binary Expressions.
(line 6)
* float_extend: Conversions. (line 33)
* FLOAT_LIB_COMPARE_RETURNS_BOOL: Library Calls. (line 25)
* FLOAT_STORE_FLAG_VALUE: Misc. (line 301)
* float_truncate: Conversions. (line 53)
* FLOAT_TYPE_SIZE: Type Layout. (line 49)
* FLOAT_WORDS_BIG_ENDIAN: Storage Layout. (line 36)
* FLOAT_WORDS_BIG_ENDIAN, (lack of) effect on subreg: Regs and Memory.
(line 226)
* floating point and cross compilation: Floating Point. (line 6)
* Floating Point Emulation: Target Fragment. (line 15)
* floatMN2 instruction pattern: Standard Names. (line 798)
* floatunsMN2 instruction pattern: Standard Names. (line 802)
* FLOOR_DIV_EXPR: Unary and Binary Expressions.
(line 6)
* FLOOR_MOD_EXPR: Unary and Binary Expressions.
(line 6)
* floorM2 instruction pattern: Standard Names. (line 559)
* flow-insensitive alias analysis: Alias analysis. (line 6)
* flow-sensitive alias analysis: Alias analysis. (line 6)
* fma: Arithmetic. (line 111)
* fmaM4 instruction pattern: Standard Names. (line 234)
* fmodM3 instruction pattern: Standard Names. (line 490)
* fmsM4 instruction pattern: Standard Names. (line 243)
* fnmaM4 instruction pattern: Standard Names. (line 249)
* fnmsM4 instruction pattern: Standard Names. (line 255)
* FOR_BODY: Statements for C++. (line 6)
* FOR_COND: Statements for C++. (line 6)
* FOR_EXPR: Statements for C++. (line 6)
* FOR_INIT_STMT: Statements for C++. (line 6)
* FOR_STMT: Statements for C++. (line 6)
* FORCE_CODE_SECTION_ALIGN: Sections. (line 146)
* force_reg: Standard Names. (line 36)
* fract_convert: Conversions. (line 82)
* FRACT_TYPE_SIZE: Type Layout. (line 68)
* fractional types: Fixed-point fractional library routines.
(line 6)
* fractMN2 instruction pattern: Standard Names. (line 848)
* fractunsMN2 instruction pattern: Standard Names. (line 863)
* frame layout: Frame Layout. (line 6)
* FRAME_ADDR_RTX: Frame Layout. (line 116)
* FRAME_GROWS_DOWNWARD: Frame Layout. (line 31)
* FRAME_GROWS_DOWNWARD and virtual registers: Regs and Memory.
(line 69)
* FRAME_POINTER_CFA_OFFSET: Frame Layout. (line 212)
* frame_pointer_needed: Function Entry. (line 34)
* FRAME_POINTER_REGNUM: Frame Registers. (line 14)
* FRAME_POINTER_REGNUM and virtual registers: Regs and Memory.
(line 74)
* frame_pointer_rtx: Frame Registers. (line 104)
* frame_related: Flags. (line 247)
* frame_related, in insn, call_insn, jump_insn, barrier, and set: Flags.
(line 125)
* frame_related, in mem: Flags. (line 103)
* frame_related, in reg: Flags. (line 112)
* frame_related, in symbol_ref: Flags. (line 183)
* frequency, count, BB_FREQ_BASE: Profile information.
(line 30)
* ftruncM2 instruction pattern: Standard Names. (line 821)
* function <1>: Functions for C++. (line 6)
* function: Functions. (line 6)
* function call conventions: Interface. (line 6)
* function entry and exit: Function Entry. (line 6)
* function entry point, alternate function entry point: Edges.
(line 180)
* function properties: Function Properties.
(line 6)
* function-call insns: Calls. (line 6)
* FUNCTION_ARG: Register Arguments. (line 11)
* FUNCTION_ARG_ADVANCE: Register Arguments. (line 185)
* FUNCTION_ARG_OFFSET: Register Arguments. (line 196)
* FUNCTION_ARG_PADDING: Register Arguments. (line 203)
* FUNCTION_ARG_REGNO_P: Register Arguments. (line 244)
* FUNCTION_BOUNDARY: Storage Layout. (line 158)
* FUNCTION_DECL <1>: Functions for C++. (line 6)
* FUNCTION_DECL: Functions. (line 6)
* FUNCTION_INCOMING_ARG: Register Arguments. (line 68)
* FUNCTION_MODE: Misc. (line 356)
* FUNCTION_PROFILER: Profiling. (line 9)
* FUNCTION_TYPE: Types. (line 6)
* FUNCTION_VALUE: Scalar Return. (line 52)
* FUNCTION_VALUE_REGNO_P: Scalar Return. (line 78)
* functions, leaf: Leaf Functions. (line 6)
* fundamental type: Types. (line 6)
* g in constraint: Simple Constraints. (line 120)
* G in constraint: Simple Constraints. (line 98)
* garbage collector, invocation: Invoking the garbage collector.
(line 6)
* garbage collector, troubleshooting: Troubleshooting. (line 6)
* GCC and portability: Portability. (line 6)
* GCC_DRIVER_HOST_INITIALIZATION: Host Misc. (line 36)
* gcov_type: Profile information.
(line 41)
* ge: Comparisons. (line 72)
* ge and attributes: Expressions. (line 64)
* GE_EXPR: Unary and Binary Expressions.
(line 6)
* GEN_ERRNO_RTX: Library Calls. (line 57)
* gencodes: RTL passes. (line 18)
* general_operand: Machine-Independent Predicates.
(line 105)
* GENERAL_REGS: Register Classes. (line 23)
* generated files: Files. (line 6)
* generating assembler output: Output Statement. (line 6)
* generating insns: RTL Template. (line 6)
* GENERIC <1>: GENERIC. (line 6)
* GENERIC: Parsing pass. (line 6)
* generic predicates: Machine-Independent Predicates.
(line 6)
* genflags: RTL passes. (line 18)
* get_attr: Expressions. (line 80)
* get_attr_length: Insn Lengths. (line 46)
* GET_CLASS_NARROWEST_MODE: Machine Modes. (line 333)
* GET_CODE: RTL Objects. (line 47)
* get_frame_size: Elimination. (line 34)
* get_insns: Insns. (line 34)
* get_last_insn: Insns. (line 34)
* GET_MODE: Machine Modes. (line 280)
* GET_MODE_ALIGNMENT: Machine Modes. (line 320)
* GET_MODE_BITSIZE: Machine Modes. (line 304)
* GET_MODE_CLASS: Machine Modes. (line 294)
* GET_MODE_FBIT: Machine Modes. (line 311)
* GET_MODE_IBIT: Machine Modes. (line 307)
* GET_MODE_MASK: Machine Modes. (line 315)
* GET_MODE_NAME: Machine Modes. (line 291)
* GET_MODE_NUNITS: Machine Modes. (line 329)
* GET_MODE_SIZE: Machine Modes. (line 301)
* GET_MODE_UNIT_SIZE: Machine Modes. (line 323)
* GET_MODE_WIDER_MODE: Machine Modes. (line 297)
* GET_RTX_CLASS: RTL Classes. (line 6)
* GET_RTX_FORMAT: RTL Classes. (line 131)
* GET_RTX_LENGTH: RTL Classes. (line 128)
* geu: Comparisons. (line 72)
* geu and attributes: Expressions. (line 64)
* GGC: Type Information. (line 6)
* ggc_collect: Invoking the garbage collector.
(line 6)
* GIMPLE <1>: GIMPLE. (line 6)
* GIMPLE <2>: Gimplification pass.
(line 6)
* GIMPLE: Parsing pass. (line 14)
* GIMPLE Exception Handling: GIMPLE Exception Handling.
(line 6)
* GIMPLE instruction set: GIMPLE instruction set.
(line 6)
* GIMPLE sequences: GIMPLE sequences. (line 6)
* gimple_addresses_taken: Manipulating GIMPLE statements.
(line 90)
* GIMPLE_ASM: GIMPLE_ASM. (line 6)
* gimple_asm_clear_volatile: GIMPLE_ASM. (line 63)
* gimple_asm_clobber_op: GIMPLE_ASM. (line 46)
* gimple_asm_input_op: GIMPLE_ASM. (line 30)
* gimple_asm_nclobbers: GIMPLE_ASM. (line 27)
* gimple_asm_ninputs: GIMPLE_ASM. (line 21)
* gimple_asm_noutputs: GIMPLE_ASM. (line 24)
* gimple_asm_output_op: GIMPLE_ASM. (line 38)
* gimple_asm_set_clobber_op: GIMPLE_ASM. (line 50)
* gimple_asm_set_input_op: GIMPLE_ASM. (line 34)
* gimple_asm_set_output_op: GIMPLE_ASM. (line 42)
* gimple_asm_set_volatile: GIMPLE_ASM. (line 60)
* gimple_asm_string: GIMPLE_ASM. (line 53)
* gimple_asm_volatile_p: GIMPLE_ASM. (line 57)
* GIMPLE_ASSIGN: GIMPLE_ASSIGN. (line 6)
* gimple_assign_cast_p <1>: GIMPLE_ASSIGN. (line 93)
* gimple_assign_cast_p: Logical Operators. (line 160)
* gimple_assign_lhs: GIMPLE_ASSIGN. (line 51)
* gimple_assign_lhs_ptr: GIMPLE_ASSIGN. (line 54)
* gimple_assign_rhs1: GIMPLE_ASSIGN. (line 57)
* gimple_assign_rhs1_ptr: GIMPLE_ASSIGN. (line 60)
* gimple_assign_rhs2: GIMPLE_ASSIGN. (line 64)
* gimple_assign_rhs2_ptr: GIMPLE_ASSIGN. (line 67)
* gimple_assign_rhs3: GIMPLE_ASSIGN. (line 71)
* gimple_assign_rhs3_ptr: GIMPLE_ASSIGN. (line 74)
* gimple_assign_rhs_class: GIMPLE_ASSIGN. (line 46)
* gimple_assign_rhs_code: GIMPLE_ASSIGN. (line 41)
* gimple_assign_set_lhs: GIMPLE_ASSIGN. (line 78)
* gimple_assign_set_rhs1: GIMPLE_ASSIGN. (line 81)
* gimple_assign_set_rhs2: GIMPLE_ASSIGN. (line 85)
* gimple_assign_set_rhs3: GIMPLE_ASSIGN. (line 89)
* gimple_bb: Manipulating GIMPLE statements.
(line 18)
* GIMPLE_BIND: GIMPLE_BIND. (line 6)
* gimple_bind_add_seq: GIMPLE_BIND. (line 36)
* gimple_bind_add_stmt: GIMPLE_BIND. (line 32)
* gimple_bind_append_vars: GIMPLE_BIND. (line 19)
* gimple_bind_block: GIMPLE_BIND. (line 40)
* gimple_bind_body: GIMPLE_BIND. (line 23)
* gimple_bind_set_block: GIMPLE_BIND. (line 45)
* gimple_bind_set_body: GIMPLE_BIND. (line 28)
* gimple_bind_set_vars: GIMPLE_BIND. (line 15)
* gimple_bind_vars: GIMPLE_BIND. (line 12)
* gimple_block: Manipulating GIMPLE statements.
(line 21)
* gimple_build_asm: GIMPLE_ASM. (line 8)
* gimple_build_asm_vec: GIMPLE_ASM. (line 17)
* gimple_build_assign: GIMPLE_ASSIGN. (line 7)
* gimple_build_assign_with_ops: GIMPLE_ASSIGN. (line 30)
* gimple_build_bind: GIMPLE_BIND. (line 8)
* gimple_build_call: GIMPLE_CALL. (line 8)
* gimple_build_call_from_tree: GIMPLE_CALL. (line 16)
* gimple_build_call_vec: GIMPLE_CALL. (line 25)
* gimple_build_catch: GIMPLE_CATCH. (line 8)
* gimple_build_cond: GIMPLE_COND. (line 8)
* gimple_build_cond_from_tree: GIMPLE_COND. (line 16)
* gimple_build_debug_bind: GIMPLE_DEBUG. (line 8)
* gimple_build_eh_filter: GIMPLE_EH_FILTER. (line 8)
* gimple_build_goto: GIMPLE_LABEL. (line 18)
* gimple_build_label: GIMPLE_LABEL. (line 7)
* gimple_build_nop: GIMPLE_NOP. (line 7)
* gimple_build_omp_atomic_load: GIMPLE_OMP_ATOMIC_LOAD.
(line 8)
* gimple_build_omp_atomic_store: GIMPLE_OMP_ATOMIC_STORE.
(line 7)
* gimple_build_omp_continue: GIMPLE_OMP_CONTINUE.
(line 8)
* gimple_build_omp_critical: GIMPLE_OMP_CRITICAL.
(line 8)
* gimple_build_omp_for: GIMPLE_OMP_FOR. (line 9)
* gimple_build_omp_master: GIMPLE_OMP_MASTER. (line 7)
* gimple_build_omp_ordered: GIMPLE_OMP_ORDERED. (line 7)
* gimple_build_omp_parallel: GIMPLE_OMP_PARALLEL.
(line 8)
* gimple_build_omp_return: GIMPLE_OMP_RETURN. (line 7)
* gimple_build_omp_section: GIMPLE_OMP_SECTION. (line 7)
* gimple_build_omp_sections: GIMPLE_OMP_SECTIONS.
(line 8)
* gimple_build_omp_sections_switch: GIMPLE_OMP_SECTIONS.
(line 14)
* gimple_build_omp_single: GIMPLE_OMP_SINGLE. (line 8)
* gimple_build_resx: GIMPLE_RESX. (line 7)
* gimple_build_return: GIMPLE_RETURN. (line 7)
* gimple_build_switch: GIMPLE_SWITCH. (line 8)
* gimple_build_switch_vec: GIMPLE_SWITCH. (line 16)
* gimple_build_try: GIMPLE_TRY. (line 8)
* gimple_build_wce: GIMPLE_WITH_CLEANUP_EXPR.
(line 7)
* GIMPLE_CALL: GIMPLE_CALL. (line 6)
* gimple_call_arg: GIMPLE_CALL. (line 66)
* gimple_call_arg_ptr: GIMPLE_CALL. (line 71)
* gimple_call_cannot_inline_p: GIMPLE_CALL. (line 91)
* gimple_call_chain: GIMPLE_CALL. (line 57)
* gimple_call_copy_skip_args: GIMPLE_CALL. (line 98)
* gimple_call_fn: GIMPLE_CALL. (line 38)
* gimple_call_fndecl: GIMPLE_CALL. (line 46)
* gimple_call_lhs: GIMPLE_CALL. (line 29)
* gimple_call_lhs_ptr: GIMPLE_CALL. (line 32)
* gimple_call_mark_uninlinable: GIMPLE_CALL. (line 88)
* gimple_call_noreturn_p: GIMPLE_CALL. (line 94)
* gimple_call_num_args: GIMPLE_CALL. (line 63)
* gimple_call_return_type: GIMPLE_CALL. (line 54)
* gimple_call_set_arg: GIMPLE_CALL. (line 76)
* gimple_call_set_chain: GIMPLE_CALL. (line 60)
* gimple_call_set_fn: GIMPLE_CALL. (line 42)
* gimple_call_set_fndecl: GIMPLE_CALL. (line 51)
* gimple_call_set_lhs: GIMPLE_CALL. (line 35)
* gimple_call_set_tail: GIMPLE_CALL. (line 80)
* gimple_call_tail_p: GIMPLE_CALL. (line 85)
* GIMPLE_CATCH: GIMPLE_CATCH. (line 6)
* gimple_catch_handler: GIMPLE_CATCH. (line 20)
* gimple_catch_set_handler: GIMPLE_CATCH. (line 28)
* gimple_catch_set_types: GIMPLE_CATCH. (line 24)
* gimple_catch_types: GIMPLE_CATCH. (line 13)
* gimple_catch_types_ptr: GIMPLE_CATCH. (line 16)
* gimple_code: Manipulating GIMPLE statements.
(line 15)
* GIMPLE_COND: GIMPLE_COND. (line 6)
* gimple_cond_code: GIMPLE_COND. (line 21)
* gimple_cond_false_label: GIMPLE_COND. (line 60)
* gimple_cond_lhs: GIMPLE_COND. (line 30)
* gimple_cond_make_false: GIMPLE_COND. (line 64)
* gimple_cond_make_true: GIMPLE_COND. (line 67)
* gimple_cond_rhs: GIMPLE_COND. (line 38)
* gimple_cond_set_code: GIMPLE_COND. (line 26)
* gimple_cond_set_false_label: GIMPLE_COND. (line 56)
* gimple_cond_set_lhs: GIMPLE_COND. (line 34)
* gimple_cond_set_rhs: GIMPLE_COND. (line 42)
* gimple_cond_set_true_label: GIMPLE_COND. (line 51)
* gimple_cond_true_label: GIMPLE_COND. (line 46)
* gimple_copy: Manipulating GIMPLE statements.
(line 147)
* GIMPLE_DEBUG: GIMPLE_DEBUG. (line 6)
* GIMPLE_DEBUG_BIND: GIMPLE_DEBUG. (line 6)
* gimple_debug_bind_get_value: GIMPLE_DEBUG. (line 48)
* gimple_debug_bind_get_value_ptr: GIMPLE_DEBUG. (line 53)
* gimple_debug_bind_get_var: GIMPLE_DEBUG. (line 45)
* gimple_debug_bind_has_value_p: GIMPLE_DEBUG. (line 70)
* gimple_debug_bind_p: Logical Operators. (line 164)
* gimple_debug_bind_reset_value: GIMPLE_DEBUG. (line 66)
* gimple_debug_bind_set_value: GIMPLE_DEBUG. (line 62)
* gimple_debug_bind_set_var: GIMPLE_DEBUG. (line 58)
* gimple_def_ops: Manipulating GIMPLE statements.
(line 94)
* GIMPLE_EH_FILTER: GIMPLE_EH_FILTER. (line 6)
* gimple_eh_filter_failure: GIMPLE_EH_FILTER. (line 19)
* gimple_eh_filter_must_not_throw: GIMPLE_EH_FILTER. (line 33)
* gimple_eh_filter_set_failure: GIMPLE_EH_FILTER. (line 29)
* gimple_eh_filter_set_must_not_throw: GIMPLE_EH_FILTER. (line 37)
* gimple_eh_filter_set_types: GIMPLE_EH_FILTER. (line 24)
* gimple_eh_filter_types: GIMPLE_EH_FILTER. (line 12)
* gimple_eh_filter_types_ptr: GIMPLE_EH_FILTER. (line 15)
* gimple_expr_code: Manipulating GIMPLE statements.
(line 31)
* gimple_expr_type: Manipulating GIMPLE statements.
(line 24)
* gimple_goto_dest: GIMPLE_LABEL. (line 21)
* gimple_goto_set_dest: GIMPLE_LABEL. (line 24)
* gimple_has_mem_ops: Manipulating GIMPLE statements.
(line 72)
* gimple_has_ops: Manipulating GIMPLE statements.
(line 69)
* gimple_has_volatile_ops: Manipulating GIMPLE statements.
(line 134)
* GIMPLE_LABEL: GIMPLE_LABEL. (line 6)
* gimple_label_label: GIMPLE_LABEL. (line 11)
* gimple_label_set_label: GIMPLE_LABEL. (line 14)
* gimple_loaded_syms: Manipulating GIMPLE statements.
(line 122)
* gimple_locus: Manipulating GIMPLE statements.
(line 42)
* gimple_locus_empty_p: Manipulating GIMPLE statements.
(line 48)
* gimple_modified_p: Manipulating GIMPLE statements.
(line 130)
* gimple_no_warning_p: Manipulating GIMPLE statements.
(line 51)
* GIMPLE_NOP: GIMPLE_NOP. (line 6)
* gimple_nop_p: GIMPLE_NOP. (line 10)
* gimple_num_ops <1>: Manipulating GIMPLE statements.
(line 75)
* gimple_num_ops: Logical Operators. (line 78)
* GIMPLE_OMP_ATOMIC_LOAD: GIMPLE_OMP_ATOMIC_LOAD.
(line 6)
* gimple_omp_atomic_load_lhs: GIMPLE_OMP_ATOMIC_LOAD.
(line 17)
* gimple_omp_atomic_load_rhs: GIMPLE_OMP_ATOMIC_LOAD.
(line 24)
* gimple_omp_atomic_load_set_lhs: GIMPLE_OMP_ATOMIC_LOAD.
(line 14)
* gimple_omp_atomic_load_set_rhs: GIMPLE_OMP_ATOMIC_LOAD.
(line 21)
* GIMPLE_OMP_ATOMIC_STORE: GIMPLE_OMP_ATOMIC_STORE.
(line 6)
* gimple_omp_atomic_store_set_val: GIMPLE_OMP_ATOMIC_STORE.
(line 12)
* gimple_omp_atomic_store_val: GIMPLE_OMP_ATOMIC_STORE.
(line 15)
* gimple_omp_body: GIMPLE_OMP_PARALLEL.
(line 24)
* GIMPLE_OMP_CONTINUE: GIMPLE_OMP_CONTINUE.
(line 6)
* gimple_omp_continue_control_def: GIMPLE_OMP_CONTINUE.
(line 13)
* gimple_omp_continue_control_def_ptr: GIMPLE_OMP_CONTINUE.
(line 17)
* gimple_omp_continue_control_use: GIMPLE_OMP_CONTINUE.
(line 24)
* gimple_omp_continue_control_use_ptr: GIMPLE_OMP_CONTINUE.
(line 28)
* gimple_omp_continue_set_control_def: GIMPLE_OMP_CONTINUE.
(line 20)
* gimple_omp_continue_set_control_use: GIMPLE_OMP_CONTINUE.
(line 31)
* GIMPLE_OMP_CRITICAL: GIMPLE_OMP_CRITICAL.
(line 6)
* gimple_omp_critical_name: GIMPLE_OMP_CRITICAL.
(line 13)
* gimple_omp_critical_name_ptr: GIMPLE_OMP_CRITICAL.
(line 16)
* gimple_omp_critical_set_name: GIMPLE_OMP_CRITICAL.
(line 21)
* GIMPLE_OMP_FOR: GIMPLE_OMP_FOR. (line 6)
* gimple_omp_for_clauses: GIMPLE_OMP_FOR. (line 20)
* gimple_omp_for_clauses_ptr: GIMPLE_OMP_FOR. (line 23)
* gimple_omp_for_cond: GIMPLE_OMP_FOR. (line 83)
* gimple_omp_for_final: GIMPLE_OMP_FOR. (line 51)
* gimple_omp_for_final_ptr: GIMPLE_OMP_FOR. (line 54)
* gimple_omp_for_incr: GIMPLE_OMP_FOR. (line 61)
* gimple_omp_for_incr_ptr: GIMPLE_OMP_FOR. (line 64)
* gimple_omp_for_index: GIMPLE_OMP_FOR. (line 31)
* gimple_omp_for_index_ptr: GIMPLE_OMP_FOR. (line 34)
* gimple_omp_for_initial: GIMPLE_OMP_FOR. (line 41)
* gimple_omp_for_initial_ptr: GIMPLE_OMP_FOR. (line 44)
* gimple_omp_for_pre_body: GIMPLE_OMP_FOR. (line 70)
* gimple_omp_for_set_clauses: GIMPLE_OMP_FOR. (line 27)
* gimple_omp_for_set_cond: GIMPLE_OMP_FOR. (line 80)
* gimple_omp_for_set_final: GIMPLE_OMP_FOR. (line 58)
* gimple_omp_for_set_incr: GIMPLE_OMP_FOR. (line 67)
* gimple_omp_for_set_index: GIMPLE_OMP_FOR. (line 38)
* gimple_omp_for_set_initial: GIMPLE_OMP_FOR. (line 48)
* gimple_omp_for_set_pre_body: GIMPLE_OMP_FOR. (line 75)
* GIMPLE_OMP_MASTER: GIMPLE_OMP_MASTER. (line 6)
* GIMPLE_OMP_ORDERED: GIMPLE_OMP_ORDERED. (line 6)
* GIMPLE_OMP_PARALLEL: GIMPLE_OMP_PARALLEL.
(line 6)
* gimple_omp_parallel_child_fn: GIMPLE_OMP_PARALLEL.
(line 42)
* gimple_omp_parallel_child_fn_ptr: GIMPLE_OMP_PARALLEL.
(line 46)
* gimple_omp_parallel_clauses: GIMPLE_OMP_PARALLEL.
(line 31)
* gimple_omp_parallel_clauses_ptr: GIMPLE_OMP_PARALLEL.
(line 34)
* gimple_omp_parallel_combined_p: GIMPLE_OMP_PARALLEL.
(line 16)
* gimple_omp_parallel_data_arg: GIMPLE_OMP_PARALLEL.
(line 54)
* gimple_omp_parallel_data_arg_ptr: GIMPLE_OMP_PARALLEL.
(line 58)
* gimple_omp_parallel_set_child_fn: GIMPLE_OMP_PARALLEL.
(line 51)
* gimple_omp_parallel_set_clauses: GIMPLE_OMP_PARALLEL.
(line 38)
* gimple_omp_parallel_set_combined_p: GIMPLE_OMP_PARALLEL.
(line 20)
* gimple_omp_parallel_set_data_arg: GIMPLE_OMP_PARALLEL.
(line 62)
* GIMPLE_OMP_RETURN: GIMPLE_OMP_RETURN. (line 6)
* gimple_omp_return_nowait_p: GIMPLE_OMP_RETURN. (line 14)
* gimple_omp_return_set_nowait: GIMPLE_OMP_RETURN. (line 11)
* GIMPLE_OMP_SECTION: GIMPLE_OMP_SECTION. (line 6)
* gimple_omp_section_last_p: GIMPLE_OMP_SECTION. (line 12)
* gimple_omp_section_set_last: GIMPLE_OMP_SECTION. (line 16)
* GIMPLE_OMP_SECTIONS: GIMPLE_OMP_SECTIONS.
(line 6)
* gimple_omp_sections_clauses: GIMPLE_OMP_SECTIONS.
(line 30)
* gimple_omp_sections_clauses_ptr: GIMPLE_OMP_SECTIONS.
(line 33)
* gimple_omp_sections_control: GIMPLE_OMP_SECTIONS.
(line 17)
* gimple_omp_sections_control_ptr: GIMPLE_OMP_SECTIONS.
(line 21)
* gimple_omp_sections_set_clauses: GIMPLE_OMP_SECTIONS.
(line 37)
* gimple_omp_sections_set_control: GIMPLE_OMP_SECTIONS.
(line 26)
* gimple_omp_set_body: GIMPLE_OMP_PARALLEL.
(line 28)
* GIMPLE_OMP_SINGLE: GIMPLE_OMP_SINGLE. (line 6)
* gimple_omp_single_clauses: GIMPLE_OMP_SINGLE. (line 14)
* gimple_omp_single_clauses_ptr: GIMPLE_OMP_SINGLE. (line 17)
* gimple_omp_single_set_clauses: GIMPLE_OMP_SINGLE. (line 21)
* gimple_op <1>: Manipulating GIMPLE statements.
(line 81)
* gimple_op: Logical Operators. (line 81)
* gimple_op_ptr: Manipulating GIMPLE statements.
(line 84)
* gimple_ops <1>: Manipulating GIMPLE statements.
(line 78)
* gimple_ops: Logical Operators. (line 84)
* GIMPLE_PHI: GIMPLE_PHI. (line 6)
* gimple_phi_arg: GIMPLE_PHI. (line 28)
* gimple_phi_capacity: GIMPLE_PHI. (line 10)
* gimple_phi_num_args: GIMPLE_PHI. (line 14)
* gimple_phi_result: GIMPLE_PHI. (line 19)
* gimple_phi_result_ptr: GIMPLE_PHI. (line 22)
* gimple_phi_set_arg: GIMPLE_PHI. (line 33)
* gimple_phi_set_result: GIMPLE_PHI. (line 25)
* gimple_plf: Manipulating GIMPLE statements.
(line 66)
* GIMPLE_RESX: GIMPLE_RESX. (line 6)
* gimple_resx_region: GIMPLE_RESX. (line 13)
* gimple_resx_set_region: GIMPLE_RESX. (line 16)
* GIMPLE_RETURN: GIMPLE_RETURN. (line 6)
* gimple_return_retval: GIMPLE_RETURN. (line 10)
* gimple_return_set_retval: GIMPLE_RETURN. (line 14)
* gimple_seq_add_seq: GIMPLE sequences. (line 32)
* gimple_seq_add_stmt: GIMPLE sequences. (line 26)
* gimple_seq_alloc: GIMPLE sequences. (line 62)
* gimple_seq_copy: GIMPLE sequences. (line 67)
* gimple_seq_deep_copy: GIMPLE sequences. (line 37)
* gimple_seq_empty_p: GIMPLE sequences. (line 70)
* gimple_seq_first: GIMPLE sequences. (line 44)
* gimple_seq_init: GIMPLE sequences. (line 59)
* gimple_seq_last: GIMPLE sequences. (line 47)
* gimple_seq_reverse: GIMPLE sequences. (line 40)
* gimple_seq_set_first: GIMPLE sequences. (line 55)
* gimple_seq_set_last: GIMPLE sequences. (line 51)
* gimple_seq_singleton_p: GIMPLE sequences. (line 79)
* gimple_set_block: Manipulating GIMPLE statements.
(line 39)
* gimple_set_def_ops: Manipulating GIMPLE statements.
(line 98)
* gimple_set_has_volatile_ops: Manipulating GIMPLE statements.
(line 138)
* gimple_set_locus: Manipulating GIMPLE statements.
(line 45)
* gimple_set_op: Manipulating GIMPLE statements.
(line 87)
* gimple_set_plf: Manipulating GIMPLE statements.
(line 62)
* gimple_set_use_ops: Manipulating GIMPLE statements.
(line 105)
* gimple_set_vdef_ops: Manipulating GIMPLE statements.
(line 119)
* gimple_set_visited: Manipulating GIMPLE statements.
(line 55)
* gimple_set_vuse_ops: Manipulating GIMPLE statements.
(line 112)
* gimple_statement_base: Tuple representation.
(line 14)
* gimple_statement_with_ops: Tuple representation.
(line 96)
* gimple_stored_syms: Manipulating GIMPLE statements.
(line 126)
* GIMPLE_SWITCH: GIMPLE_SWITCH. (line 6)
* gimple_switch_default_label: GIMPLE_SWITCH. (line 46)
* gimple_switch_index: GIMPLE_SWITCH. (line 31)
* gimple_switch_label: GIMPLE_SWITCH. (line 37)
* gimple_switch_num_labels: GIMPLE_SWITCH. (line 22)
* gimple_switch_set_default_label: GIMPLE_SWITCH. (line 50)
* gimple_switch_set_index: GIMPLE_SWITCH. (line 34)
* gimple_switch_set_label: GIMPLE_SWITCH. (line 42)
* gimple_switch_set_num_labels: GIMPLE_SWITCH. (line 27)
* GIMPLE_TRY: GIMPLE_TRY. (line 6)
* gimple_try_catch_is_cleanup: GIMPLE_TRY. (line 20)
* gimple_try_cleanup: GIMPLE_TRY. (line 27)
* gimple_try_eval: GIMPLE_TRY. (line 23)
* gimple_try_kind: GIMPLE_TRY. (line 16)
* gimple_try_set_catch_is_cleanup: GIMPLE_TRY. (line 32)
* gimple_try_set_cleanup: GIMPLE_TRY. (line 41)
* gimple_try_set_eval: GIMPLE_TRY. (line 36)
* gimple_use_ops: Manipulating GIMPLE statements.
(line 101)
* gimple_vdef_ops: Manipulating GIMPLE statements.
(line 115)
* gimple_visited_p: Manipulating GIMPLE statements.
(line 58)
* gimple_vuse_ops: Manipulating GIMPLE statements.
(line 108)
* gimple_wce_cleanup: GIMPLE_WITH_CLEANUP_EXPR.
(line 11)
* gimple_wce_cleanup_eh_only: GIMPLE_WITH_CLEANUP_EXPR.
(line 18)
* gimple_wce_set_cleanup: GIMPLE_WITH_CLEANUP_EXPR.
(line 15)
* gimple_wce_set_cleanup_eh_only: GIMPLE_WITH_CLEANUP_EXPR.
(line 22)
* GIMPLE_WITH_CLEANUP_EXPR: GIMPLE_WITH_CLEANUP_EXPR.
(line 6)
* gimplification <1>: Gimplification pass.
(line 6)
* gimplification: Parsing pass. (line 14)
* gimplifier: Parsing pass. (line 14)
* gimplify_assign: GIMPLE_ASSIGN. (line 19)
* gimplify_expr: Gimplification pass.
(line 18)
* gimplify_function_tree: Gimplification pass.
(line 18)
* GLOBAL_INIT_PRIORITY: Functions for C++. (line 141)
* global_regs: Register Basics. (line 59)
* GO_IF_LEGITIMATE_ADDRESS: Addressing Modes. (line 91)
* GO_IF_MODE_DEPENDENT_ADDRESS: Addressing Modes. (line 212)
* greater than: Comparisons. (line 60)
* gsi_after_labels: Sequence iterators. (line 76)
* gsi_bb: Sequence iterators. (line 83)
* gsi_commit_edge_inserts: Sequence iterators. (line 194)
* gsi_commit_one_edge_insert: Sequence iterators. (line 190)
* gsi_end_p: Sequence iterators. (line 60)
* gsi_for_stmt: Sequence iterators. (line 157)
* gsi_insert_after: Sequence iterators. (line 147)
* gsi_insert_before: Sequence iterators. (line 136)
* gsi_insert_on_edge: Sequence iterators. (line 174)
* gsi_insert_on_edge_immediate: Sequence iterators. (line 185)
* gsi_insert_seq_after: Sequence iterators. (line 154)
* gsi_insert_seq_before: Sequence iterators. (line 143)
* gsi_insert_seq_on_edge: Sequence iterators. (line 179)
* gsi_last: Sequence iterators. (line 50)
* gsi_last_bb: Sequence iterators. (line 56)
* gsi_link_after: Sequence iterators. (line 115)
* gsi_link_before: Sequence iterators. (line 105)
* gsi_link_seq_after: Sequence iterators. (line 110)
* gsi_link_seq_before: Sequence iterators. (line 99)
* gsi_move_after: Sequence iterators. (line 161)
* gsi_move_before: Sequence iterators. (line 166)
* gsi_move_to_bb_end: Sequence iterators. (line 171)
* gsi_next: Sequence iterators. (line 66)
* gsi_one_before_end_p: Sequence iterators. (line 63)
* gsi_prev: Sequence iterators. (line 69)
* gsi_remove: Sequence iterators. (line 90)
* gsi_replace: Sequence iterators. (line 130)
* gsi_seq: Sequence iterators. (line 86)
* gsi_split_seq_after: Sequence iterators. (line 120)
* gsi_split_seq_before: Sequence iterators. (line 125)
* gsi_start: Sequence iterators. (line 40)
* gsi_start_bb: Sequence iterators. (line 46)
* gsi_stmt: Sequence iterators. (line 72)
* gsi_stmt_ptr: Sequence iterators. (line 80)
* gt: Comparisons. (line 60)
* gt and attributes: Expressions. (line 64)
* GT_EXPR: Unary and Binary Expressions.
(line 6)
* gtu: Comparisons. (line 64)
* gtu and attributes: Expressions. (line 64)
* GTY: Type Information. (line 6)
* H in constraint: Simple Constraints. (line 98)
* HAmode: Machine Modes. (line 144)
* HANDLE_PRAGMA_PACK_WITH_EXPANSION: Misc. (line 438)
* HANDLER: Statements for C++. (line 6)
* HANDLER_BODY: Statements for C++. (line 6)
* HANDLER_PARMS: Statements for C++. (line 6)
* hard registers: Regs and Memory. (line 9)
* HARD_FRAME_POINTER_IS_ARG_POINTER: Frame Registers. (line 58)
* HARD_FRAME_POINTER_IS_FRAME_POINTER: Frame Registers. (line 51)
* HARD_FRAME_POINTER_REGNUM: Frame Registers. (line 20)
* HARD_REGNO_CALL_PART_CLOBBERED: Register Basics. (line 53)
* HARD_REGNO_CALLER_SAVE_MODE: Caller Saves. (line 20)
* HARD_REGNO_MODE_OK: Values in Registers.
(line 58)
* HARD_REGNO_NREGS: Values in Registers.
(line 11)
* HARD_REGNO_NREGS_HAS_PADDING: Values in Registers.
(line 25)
* HARD_REGNO_NREGS_WITH_PADDING: Values in Registers.
(line 43)
* HARD_REGNO_RENAME_OK: Values in Registers.
(line 119)
* HAS_INIT_SECTION: Macros for Initialization.
(line 19)
* HAS_LONG_COND_BRANCH: Misc. (line 9)
* HAS_LONG_UNCOND_BRANCH: Misc. (line 18)
* HAVE_DOS_BASED_FILE_SYSTEM: Filesystem. (line 11)
* HAVE_POST_DECREMENT: Addressing Modes. (line 12)
* HAVE_POST_INCREMENT: Addressing Modes. (line 11)
* HAVE_POST_MODIFY_DISP: Addressing Modes. (line 18)
* HAVE_POST_MODIFY_REG: Addressing Modes. (line 24)
* HAVE_PRE_DECREMENT: Addressing Modes. (line 10)
* HAVE_PRE_INCREMENT: Addressing Modes. (line 9)
* HAVE_PRE_MODIFY_DISP: Addressing Modes. (line 17)
* HAVE_PRE_MODIFY_REG: Addressing Modes. (line 23)
* HCmode: Machine Modes. (line 197)
* HFmode: Machine Modes. (line 58)
* high: Constants. (line 109)
* HImode: Machine Modes. (line 29)
* HImode, in insn: Insns. (line 272)
* HONOR_REG_ALLOC_ORDER: Allocation Order. (line 37)
* host configuration: Host Config. (line 6)
* host functions: Host Common. (line 6)
* host hooks: Host Common. (line 6)
* host makefile fragment: Host Fragment. (line 6)
* HOST_BIT_BUCKET: Filesystem. (line 51)
* HOST_EXECUTABLE_SUFFIX: Filesystem. (line 45)
* HOST_HOOKS_EXTRA_SIGNALS: Host Common. (line 12)
* HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY: Host Common. (line 45)
* HOST_HOOKS_GT_PCH_GET_ADDRESS: Host Common. (line 17)
* HOST_HOOKS_GT_PCH_USE_ADDRESS: Host Common. (line 26)
* HOST_LACKS_INODE_NUMBERS: Filesystem. (line 89)
* HOST_LONG_FORMAT: Host Misc. (line 45)
* HOST_LONG_LONG_FORMAT: Host Misc. (line 41)
* HOST_OBJECT_SUFFIX: Filesystem. (line 40)
* HOST_PTR_PRINTF: Host Misc. (line 49)
* HOT_TEXT_SECTION_NAME: Sections. (line 43)
* HQmode: Machine Modes. (line 107)
* I in constraint: Simple Constraints. (line 81)
* i in constraint: Simple Constraints. (line 70)
* identifier: Identifiers. (line 6)
* IDENTIFIER_LENGTH: Identifiers. (line 22)
* IDENTIFIER_NODE: Identifiers. (line 6)
* IDENTIFIER_OPNAME_P: Identifiers. (line 27)
* IDENTIFIER_POINTER: Identifiers. (line 17)
* IDENTIFIER_TYPENAME_P: Identifiers. (line 33)
* IEEE 754-2008: Decimal float library routines.
(line 6)
* IF_COND: Statements for C++. (line 6)
* if_marked: GTY Options. (line 151)
* IF_STMT: Statements for C++. (line 6)
* if_then_else: Comparisons. (line 80)
* if_then_else and attributes: Expressions. (line 32)
* if_then_else usage: Side Effects. (line 56)
* IFCVT_EXTRA_FIELDS: Misc. (line 582)
* IFCVT_INIT_EXTRA_FIELDS: Misc. (line 577)
* IFCVT_MODIFY_CANCEL: Misc. (line 571)
* IFCVT_MODIFY_FINAL: Misc. (line 565)
* IFCVT_MODIFY_INSN: Misc. (line 559)
* IFCVT_MODIFY_MULTIPLE_TESTS: Misc. (line 552)
* IFCVT_MODIFY_TESTS: Misc. (line 541)
* IMAGPART_EXPR: Unary and Binary Expressions.
(line 6)
* Immediate Uses: SSA Operands. (line 274)
* immediate_operand: Machine-Independent Predicates.
(line 11)
* IMMEDIATE_PREFIX: Instruction Output. (line 155)
* in_struct: Flags. (line 263)
* in_struct, in code_label and note: Flags. (line 59)
* in_struct, in insn and jump_insn and call_insn: Flags. (line 49)
* in_struct, in insn, jump_insn and call_insn: Flags. (line 166)
* in_struct, in mem: Flags. (line 70)
* in_struct, in subreg: Flags. (line 205)
* include: Including Patterns. (line 6)
* INCLUDE_DEFAULTS: Driver. (line 344)
* inclusive-or, bitwise: Arithmetic. (line 163)
* INCOMING_FRAME_SP_OFFSET: Frame Layout. (line 183)
* INCOMING_REGNO: Register Basics. (line 88)
* INCOMING_RETURN_ADDR_RTX: Frame Layout. (line 139)
* INCOMING_STACK_BOUNDARY: Storage Layout. (line 153)
* INDEX_REG_CLASS: Register Classes. (line 136)
* indirect_jump instruction pattern: Standard Names. (line 1078)
* indirect_operand: Machine-Independent Predicates.
(line 71)
* INDIRECT_REF: Storage References. (line 6)
* INIT_ARRAY_SECTION_ASM_OP: Sections. (line 108)
* INIT_CUMULATIVE_ARGS: Register Arguments. (line 149)
* INIT_CUMULATIVE_INCOMING_ARGS: Register Arguments. (line 176)
* INIT_CUMULATIVE_LIBCALL_ARGS: Register Arguments. (line 170)
* INIT_ENVIRONMENT: Driver. (line 306)
* INIT_EXPANDERS: Per-Function Data. (line 39)
* INIT_EXPR: Unary and Binary Expressions.
(line 6)
* init_machine_status: Per-Function Data. (line 45)
* init_one_libfunc: Library Calls. (line 15)
* INIT_SECTION_ASM_OP <1>: Macros for Initialization.
(line 10)
* INIT_SECTION_ASM_OP: Sections. (line 92)
* INITIAL_ELIMINATION_OFFSET: Elimination. (line 85)
* INITIAL_FRAME_ADDRESS_RTX: Frame Layout. (line 83)
* INITIAL_FRAME_POINTER_OFFSET: Elimination. (line 35)
* initialization routines: Initialization. (line 6)
* inlining: Target Attributes. (line 95)
* insert_insn_on_edge: Maintaining the CFG.
(line 118)
* insn: Insns. (line 63)
* insn and /f: Flags. (line 125)
* insn and /j: Flags. (line 175)
* insn and /s: Flags. (line 49)
* insn and /u: Flags. (line 39)
* insn and /v: Flags. (line 44)
* insn attributes: Insn Attributes. (line 6)
* insn canonicalization: Insn Canonicalizations.
(line 6)
* insn includes: Including Patterns. (line 6)
* insn lengths, computing: Insn Lengths. (line 6)
* insn splitting: Insn Splitting. (line 6)
* insn-attr.h: Defining Attributes.
(line 24)
* INSN_ANNULLED_BRANCH_P: Flags. (line 39)
* INSN_CODE: Insns. (line 298)
* INSN_DELETED_P: Flags. (line 44)
* INSN_FROM_TARGET_P: Flags. (line 49)
* insn_list: Insns. (line 545)
* INSN_REFERENCES_ARE_DELAYED: Misc. (line 480)
* INSN_SETS_ARE_DELAYED: Misc. (line 469)
* INSN_UID: Insns. (line 23)
* INSN_VAR_LOCATION: Insns. (line 239)
* insns: Insns. (line 6)
* insns, generating: RTL Template. (line 6)
* insns, recognizing: RTL Template. (line 6)
* instruction attributes: Insn Attributes. (line 6)
* instruction latency time: Processor pipeline description.
(line 6)
* instruction patterns: Patterns. (line 6)
* instruction splitting: Insn Splitting. (line 6)
* insv instruction pattern: Standard Names. (line 893)
* INT16_TYPE: Type Layout. (line 236)
* INT32_TYPE: Type Layout. (line 237)
* INT64_TYPE: Type Layout. (line 238)
* INT8_TYPE: Type Layout. (line 235)
* INT_FAST16_TYPE: Type Layout. (line 252)
* INT_FAST32_TYPE: Type Layout. (line 253)
* INT_FAST64_TYPE: Type Layout. (line 254)
* INT_FAST8_TYPE: Type Layout. (line 251)
* INT_LEAST16_TYPE: Type Layout. (line 244)
* INT_LEAST32_TYPE: Type Layout. (line 245)
* INT_LEAST64_TYPE: Type Layout. (line 246)
* INT_LEAST8_TYPE: Type Layout. (line 243)
* INT_TYPE_SIZE: Type Layout. (line 12)
* INTEGER_CST: Constant expressions.
(line 6)
* INTEGER_TYPE: Types. (line 6)
* Interdependence of Patterns: Dependent Patterns. (line 6)
* interfacing to GCC output: Interface. (line 6)
* interlock delays: Processor pipeline description.
(line 6)
* intermediate representation lowering: Parsing pass. (line 14)
* INTMAX_TYPE: Type Layout. (line 212)
* INTPTR_TYPE: Type Layout. (line 259)
* introduction: Top. (line 6)
* INVOKE__main: Macros for Initialization.
(line 51)
* ior: Arithmetic. (line 163)
* ior and attributes: Expressions. (line 50)
* ior, canonicalization of: Insn Canonicalizations.
(line 52)
* iorM3 instruction pattern: Standard Names. (line 222)
* IRA_COVER_CLASSES: Register Classes. (line 564)
* IRA_HARD_REGNO_ADD_COST_MULTIPLIER: Allocation Order. (line 45)
* IS_ASM_LOGICAL_LINE_SEPARATOR: Data Output. (line 132)
* is_gimple_addressable: Logical Operators. (line 115)
* is_gimple_asm_val: Logical Operators. (line 119)
* is_gimple_assign: Logical Operators. (line 151)
* is_gimple_call: Logical Operators. (line 154)
* is_gimple_call_addr: Logical Operators. (line 122)
* is_gimple_constant: Logical Operators. (line 130)
* is_gimple_debug: Logical Operators. (line 157)
* is_gimple_ip_invariant: Logical Operators. (line 139)
* is_gimple_ip_invariant_address: Logical Operators. (line 144)
* is_gimple_mem_ref_addr: Logical Operators. (line 126)
* is_gimple_min_invariant: Logical Operators. (line 133)
* is_gimple_omp: GIMPLE_OMP_PARALLEL.
(line 65)
* is_gimple_val: Logical Operators. (line 109)
* iterators in .md files: Iterators. (line 6)
* IV analysis on GIMPLE: Scalar evolutions. (line 6)
* IV analysis on RTL: loop-iv. (line 6)
* jump: Flags. (line 314)
* jump instruction pattern: Standard Names. (line 969)
* jump instruction patterns: Jump Patterns. (line 6)
* jump instructions and set: Side Effects. (line 56)
* jump, in call_insn: Flags. (line 179)
* jump, in insn: Flags. (line 175)
* jump, in mem: Flags. (line 79)
* JUMP_ALIGN: Alignment Output. (line 9)
* jump_insn: Insns. (line 73)
* jump_insn and /f: Flags. (line 125)
* jump_insn and /s: Flags. (line 49)
* jump_insn and /u: Flags. (line 39)
* jump_insn and /v: Flags. (line 44)
* JUMP_LABEL: Insns. (line 80)
* JUMP_TABLES_IN_TEXT_SECTION: Sections. (line 152)
* Jumps: Jumps. (line 6)
* LABEL_ALIGN: Alignment Output. (line 58)
* LABEL_ALIGN_AFTER_BARRIER: Alignment Output. (line 27)
* LABEL_ALT_ENTRY_P: Insns. (line 140)
* LABEL_ALTERNATE_NAME: Edges. (line 180)
* LABEL_DECL: Declarations. (line 6)
* LABEL_KIND: Insns. (line 140)
* LABEL_NUSES: Insns. (line 136)
* LABEL_PRESERVE_P: Flags. (line 59)
* label_ref: Constants. (line 86)
* label_ref and /v: Flags. (line 65)
* label_ref, RTL sharing: Sharing. (line 35)
* LABEL_REF_NONLOCAL_P: Flags. (line 65)
* lang_hooks.gimplify_expr: Gimplification pass.
(line 18)
* lang_hooks.parse_file: Parsing pass. (line 6)
* language-dependent trees: Language-dependent trees.
(line 6)
* language-independent intermediate representation: Parsing pass.
(line 14)
* large return values: Aggregate Return. (line 6)
* LARGEST_EXPONENT_IS_NORMAL: Storage Layout. (line 477)
* LAST_STACK_REG: Stack Registers. (line 31)
* LAST_VIRTUAL_REGISTER: Regs and Memory. (line 51)
* lceilMN2: Standard Names. (line 624)
* LCSSA: LCSSA. (line 6)
* LD_FINI_SWITCH: Macros for Initialization.
(line 29)
* LD_INIT_SWITCH: Macros for Initialization.
(line 25)
* LDD_SUFFIX: Macros for Initialization.
(line 122)
* le: Comparisons. (line 76)
* le and attributes: Expressions. (line 64)
* LE_EXPR: Unary and Binary Expressions.
(line 6)
* leaf functions: Leaf Functions. (line 6)
* leaf_function_p: Standard Names. (line 1040)
* LEAF_REG_REMAP: Leaf Functions. (line 39)
* LEAF_REGISTERS: Leaf Functions. (line 25)
* left rotate: Arithmetic. (line 195)
* left shift: Arithmetic. (line 173)
* LEGITIMATE_CONSTANT_P: Addressing Modes. (line 230)
* LEGITIMATE_PIC_OPERAND_P: PIC. (line 32)
* LEGITIMIZE_RELOAD_ADDRESS: Addressing Modes. (line 151)
* length: GTY Options. (line 50)
* less than: Comparisons. (line 68)
* less than or equal: Comparisons. (line 76)
* leu: Comparisons. (line 76)
* leu and attributes: Expressions. (line 64)
* lfloorMN2: Standard Names. (line 619)
* LIB2FUNCS_EXTRA: Target Fragment. (line 11)
* LIB_SPEC: Driver. (line 108)
* LIBCALL_VALUE: Scalar Return. (line 56)
* libgcc.a: Library Calls. (line 6)
* LIBGCC2_CFLAGS: Target Fragment. (line 8)
* LIBGCC2_HAS_DF_MODE: Type Layout. (line 109)
* LIBGCC2_HAS_TF_MODE: Type Layout. (line 122)
* LIBGCC2_HAS_XF_MODE: Type Layout. (line 116)
* LIBGCC2_LONG_DOUBLE_TYPE_SIZE: Type Layout. (line 103)
* LIBGCC2_UNWIND_ATTRIBUTE: Misc. (line 950)
* LIBGCC_SPEC: Driver. (line 116)
* library subroutine names: Library Calls. (line 6)
* LIBRARY_PATH_ENV: Misc. (line 520)
* LIMIT_RELOAD_CLASS: Register Classes. (line 298)
* Linear loop transformations framework: Lambda. (line 6)
* LINK_COMMAND_SPEC: Driver. (line 237)
* LINK_EH_SPEC: Driver. (line 143)
* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES: Driver. (line 247)
* LINK_GCC_C_SEQUENCE_SPEC: Driver. (line 233)
* LINK_LIBGCC_SPECIAL_1: Driver. (line 228)
* LINK_SPEC: Driver. (line 101)
* list: Containers. (line 6)
* Liveness representation: Liveness information.
(line 6)
* lo_sum: Arithmetic. (line 24)
* load address instruction: Simple Constraints. (line 164)
* LOAD_EXTEND_OP: Misc. (line 69)
* load_multiple instruction pattern: Standard Names. (line 137)
* LOCAL_ALIGNMENT: Storage Layout. (line 242)
* LOCAL_CLASS_P: Classes. (line 73)
* LOCAL_DECL_ALIGNMENT: Storage Layout. (line 279)
* LOCAL_INCLUDE_DIR: Driver. (line 313)
* LOCAL_LABEL_PREFIX: Instruction Output. (line 153)
* LOCAL_REGNO: Register Basics. (line 102)
* LOG_LINKS: Insns. (line 317)
* Logical Operators: Logical Operators. (line 6)
* logical-and, bitwise: Arithmetic. (line 158)
* logM2 instruction pattern: Standard Names. (line 532)
* LONG_ACCUM_TYPE_SIZE: Type Layout. (line 93)
* LONG_DOUBLE_TYPE_SIZE: Type Layout. (line 58)
* LONG_FRACT_TYPE_SIZE: Type Layout. (line 73)
* LONG_LONG_ACCUM_TYPE_SIZE: Type Layout. (line 98)
* LONG_LONG_FRACT_TYPE_SIZE: Type Layout. (line 78)
* LONG_LONG_TYPE_SIZE: Type Layout. (line 33)
* LONG_TYPE_SIZE: Type Layout. (line 22)
* longjmp and automatic variables: Interface. (line 52)
* Loop analysis: Loop representation.
(line 6)
* Loop manipulation: Loop manipulation. (line 6)
* Loop querying: Loop querying. (line 6)
* Loop representation: Loop representation.
(line 6)
* Loop-closed SSA form: LCSSA. (line 6)
* LOOP_ALIGN: Alignment Output. (line 41)
* LOOP_EXPR: Unary and Binary Expressions.
(line 6)
* looping instruction patterns: Looping Patterns. (line 6)
* lowering, language-dependent intermediate representation: Parsing pass.
(line 14)
* lrintMN2: Standard Names. (line 609)
* lroundMN2: Standard Names. (line 614)
* LSHIFT_EXPR: Unary and Binary Expressions.
(line 6)
* lshiftrt: Arithmetic. (line 190)
* lshiftrt and attributes: Expressions. (line 64)
* lshrM3 instruction pattern: Standard Names. (line 468)
* lt: Comparisons. (line 68)
* lt and attributes: Expressions. (line 64)
* LT_EXPR: Unary and Binary Expressions.
(line 6)
* LTGT_EXPR: Unary and Binary Expressions.
(line 6)
* lto: LTO. (line 6)
* ltrans: LTO. (line 6)
* ltu: Comparisons. (line 68)
* m in constraint: Simple Constraints. (line 17)
* machine attributes: Target Attributes. (line 6)
* machine description macros: Target Macros. (line 6)
* machine descriptions: Machine Desc. (line 6)
* machine mode conversions: Conversions. (line 6)
* machine modes: Machine Modes. (line 6)
* machine specific constraints: Machine Constraints.
(line 6)
* machine-independent predicates: Machine-Independent Predicates.
(line 6)
* macros, target description: Target Macros. (line 6)
* maddMN4 instruction pattern: Standard Names. (line 391)
* MAKE_DECL_ONE_ONLY: Label Output. (line 238)
* make_phi_node: GIMPLE_PHI. (line 7)
* make_safe_from: Expander Definitions.
(line 148)
* makefile fragment: Fragments. (line 6)
* makefile targets: Makefile. (line 6)
* MALLOC_ABI_ALIGNMENT: Storage Layout. (line 167)
* Manipulating GIMPLE statements: Manipulating GIMPLE statements.
(line 6)
* mark_hook: GTY Options. (line 166)
* marking roots: GGC Roots. (line 6)
* MASK_RETURN_ADDR: Exception Region Output.
(line 35)
* match_dup <1>: define_peephole2. (line 28)
* match_dup: RTL Template. (line 73)
* match_dup and attributes: Insn Lengths. (line 16)
* match_op_dup: RTL Template. (line 163)
* match_operand: RTL Template. (line 16)
* match_operand and attributes: Expressions. (line 55)
* match_operator: RTL Template. (line 95)
* match_par_dup: RTL Template. (line 219)
* match_parallel: RTL Template. (line 172)
* match_scratch <1>: define_peephole2. (line 28)
* match_scratch: RTL Template. (line 58)
* matching constraint: Simple Constraints. (line 142)
* matching operands: Output Template. (line 49)
* math library: Soft float library routines.
(line 6)
* math, in RTL: Arithmetic. (line 6)
* MATH_LIBRARY: Misc. (line 513)
* matherr: Library Calls. (line 44)
* MAX_BITS_PER_WORD: Storage Layout. (line 54)
* MAX_CONDITIONAL_EXECUTE: Misc. (line 535)
* MAX_FIXED_MODE_SIZE: Storage Layout. (line 424)
* MAX_MOVE_MAX: Misc. (line 120)
* MAX_OFILE_ALIGNMENT: Storage Layout. (line 204)
* MAX_REGS_PER_ADDRESS: Addressing Modes. (line 43)
* MAX_STACK_ALIGNMENT: Storage Layout. (line 197)
* maxM3 instruction pattern: Standard Names. (line 261)
* may_trap_p, tree_could_trap_p: Edges. (line 115)
* maybe_undef: GTY Options. (line 174)
* mcount: Profiling. (line 12)
* MD_CAN_REDIRECT_BRANCH: Misc. (line 672)
* MD_EXEC_PREFIX: Driver. (line 268)
* MD_FALLBACK_FRAME_STATE_FOR: Exception Handling. (line 98)
* MD_HANDLE_UNWABI: Exception Handling. (line 118)
* MD_STARTFILE_PREFIX: Driver. (line 296)
* MD_STARTFILE_PREFIX_1: Driver. (line 301)
* MD_UNWIND_SUPPORT: Exception Handling. (line 94)
* mem: Regs and Memory. (line 374)
* mem and /c: Flags. (line 99)
* mem and /f: Flags. (line 103)
* mem and /i: Flags. (line 85)
* mem and /j: Flags. (line 79)
* mem and /s: Flags. (line 70)
* mem and /u: Flags. (line 152)
* mem and /v: Flags. (line 94)
* mem, RTL sharing: Sharing. (line 40)
* MEM_ADDR_SPACE: Special Accessors. (line 39)
* MEM_ALIAS_SET: Special Accessors. (line 9)
* MEM_ALIGN: Special Accessors. (line 36)
* MEM_EXPR: Special Accessors. (line 20)
* MEM_IN_STRUCT_P: Flags. (line 70)
* MEM_KEEP_ALIAS_SET_P: Flags. (line 79)
* MEM_NOTRAP_P: Flags. (line 99)
* MEM_OFFSET: Special Accessors. (line 28)
* MEM_POINTER: Flags. (line 103)
* MEM_READONLY_P: Flags. (line 152)
* MEM_REF: Storage References. (line 6)
* MEM_SCALAR_P: Flags. (line 85)
* MEM_SIZE: Special Accessors. (line 31)
* MEM_VOLATILE_P: Flags. (line 94)
* MEMBER_TYPE_FORCES_BLK: Storage Layout. (line 404)
* memory model: Memory model. (line 6)
* memory reference, nonoffsettable: Simple Constraints. (line 256)
* memory references in constraints: Simple Constraints. (line 17)
* memory_barrier instruction pattern: Standard Names. (line 1422)
* MEMORY_MOVE_COST: Costs. (line 54)
* memory_operand: Machine-Independent Predicates.
(line 58)
* METHOD_TYPE: Types. (line 6)
* MIN_UNITS_PER_WORD: Storage Layout. (line 64)
* MINIMUM_ALIGNMENT: Storage Layout. (line 292)
* MINIMUM_ATOMIC_ALIGNMENT: Storage Layout. (line 175)
* minM3 instruction pattern: Standard Names. (line 261)
* minus: Arithmetic. (line 36)
* minus and attributes: Expressions. (line 64)
* minus, canonicalization of: Insn Canonicalizations.
(line 27)
* MINUS_EXPR: Unary and Binary Expressions.
(line 6)
* MIPS coprocessor-definition macros: MIPS Coprocessors. (line 6)
* mod: Arithmetic. (line 136)
* mod and attributes: Expressions. (line 64)
* mode classes: Machine Modes. (line 219)
* mode iterators in .md files: Mode Iterators. (line 6)
* mode switching: Mode Switching. (line 6)
* MODE_ACCUM: Machine Modes. (line 249)
* MODE_AFTER: Mode Switching. (line 49)
* MODE_BASE_REG_CLASS: Register Classes. (line 114)
* MODE_BASE_REG_REG_CLASS: Register Classes. (line 120)
* MODE_CC <1>: MODE_CC Condition Codes.
(line 6)
* MODE_CC: Machine Modes. (line 268)
* MODE_CODE_BASE_REG_CLASS: Register Classes. (line 127)
* MODE_COMPLEX_FLOAT: Machine Modes. (line 260)
* MODE_COMPLEX_INT: Machine Modes. (line 257)
* MODE_DECIMAL_FLOAT: Machine Modes. (line 237)
* MODE_ENTRY: Mode Switching. (line 54)
* MODE_EXIT: Mode Switching. (line 60)
* MODE_FLOAT: Machine Modes. (line 233)
* MODE_FRACT: Machine Modes. (line 241)
* MODE_FUNCTION: Machine Modes. (line 264)
* MODE_INT: Machine Modes. (line 225)
* MODE_NEEDED: Mode Switching. (line 42)
* MODE_PARTIAL_INT: Machine Modes. (line 229)
* MODE_PRIORITY_TO_MODE: Mode Switching. (line 66)
* MODE_RANDOM: Machine Modes. (line 273)
* MODE_UACCUM: Machine Modes. (line 253)
* MODE_UFRACT: Machine Modes. (line 245)
* MODES_TIEABLE_P: Values in Registers.
(line 129)
* modifiers in constraints: Modifiers. (line 6)
* MODIFY_EXPR: Unary and Binary Expressions.
(line 6)
* MODIFY_JNI_METHOD_CALL: Misc. (line 750)
* modM3 instruction pattern: Standard Names. (line 222)
* modulo scheduling: RTL passes. (line 131)
* MOVE_BY_PIECES_P: Costs. (line 165)
* MOVE_MAX: Misc. (line 115)
* MOVE_MAX_PIECES: Costs. (line 171)
* MOVE_RATIO: Costs. (line 149)
* movM instruction pattern: Standard Names. (line 11)
* movmemM instruction pattern: Standard Names. (line 681)
* movmisalignM instruction pattern: Standard Names. (line 126)
* movMODEcc instruction pattern: Standard Names. (line 904)
* movstr instruction pattern: Standard Names. (line 716)
* movstrictM instruction pattern: Standard Names. (line 120)
* msubMN4 instruction pattern: Standard Names. (line 414)
* mulhisi3 instruction pattern: Standard Names. (line 367)
* mulM3 instruction pattern: Standard Names. (line 222)
* mulqihi3 instruction pattern: Standard Names. (line 371)
* mulsidi3 instruction pattern: Standard Names. (line 371)
* mult: Arithmetic. (line 92)
* mult and attributes: Expressions. (line 64)
* mult, canonicalization of: Insn Canonicalizations.
(line 27)
* MULT_EXPR: Unary and Binary Expressions.
(line 6)
* MULTIARCH_DIRNAME: Target Fragment. (line 145)
* MULTILIB_DEFAULTS: Driver. (line 253)
* MULTILIB_DIRNAMES: Target Fragment. (line 64)
* MULTILIB_EXCEPTIONS: Target Fragment. (line 90)
* MULTILIB_EXTRA_OPTS: Target Fragment. (line 102)
* MULTILIB_MATCHES: Target Fragment. (line 83)
* MULTILIB_OPTIONS: Target Fragment. (line 44)
* MULTILIB_OSDIRNAMES: Target Fragment. (line 114)
* multiple alternative constraints: Multi-Alternative. (line 6)
* MULTIPLE_SYMBOL_SPACES: Misc. (line 493)
* multiplication: Arithmetic. (line 92)
* multiplication with signed saturation: Arithmetic. (line 92)
* multiplication with unsigned saturation: Arithmetic. (line 92)
* n in constraint: Simple Constraints. (line 75)
* N_REG_CLASSES: Register Classes. (line 78)
* name: Identifiers. (line 6)
* named address spaces: Named Address Spaces.
(line 6)
* named patterns and conditions: Patterns. (line 47)
* names, pattern: Standard Names. (line 6)
* namespace, scope: Namespaces. (line 6)
* NAMESPACE_DECL <1>: Namespaces. (line 6)
* NAMESPACE_DECL: Declarations. (line 6)
* NATIVE_SYSTEM_HEADER_DIR: Target Fragment. (line 109)
* ne: Comparisons. (line 56)
* ne and attributes: Expressions. (line 64)
* NE_EXPR: Unary and Binary Expressions.
(line 6)
* nearbyintM2 instruction pattern: Standard Names. (line 591)
* neg: Arithmetic. (line 81)
* neg and attributes: Expressions. (line 64)
* neg, canonicalization of: Insn Canonicalizations.
(line 27)
* NEGATE_EXPR: Unary and Binary Expressions.
(line 6)
* negation: Arithmetic. (line 81)
* negation with signed saturation: Arithmetic. (line 81)
* negation with unsigned saturation: Arithmetic. (line 81)
* negM2 instruction pattern: Standard Names. (line 476)
* nested functions, trampolines for: Trampolines. (line 6)
* nested_ptr: GTY Options. (line 181)
* next_bb, prev_bb, FOR_EACH_BB: Basic Blocks. (line 10)
* NEXT_INSN: Insns. (line 30)
* NEXT_OBJC_RUNTIME: Library Calls. (line 80)
* nil: RTL Objects. (line 73)
* NM_FLAGS: Macros for Initialization.
(line 111)
* NO_DBX_BNSYM_ENSYM: DBX Hooks. (line 39)
* NO_DBX_FUNCTION_END: DBX Hooks. (line 33)
* NO_DBX_GCC_MARKER: File Names and DBX. (line 28)
* NO_DBX_MAIN_SOURCE_DIRECTORY: File Names and DBX. (line 23)
* NO_DOLLAR_IN_LABEL: Misc. (line 457)
* NO_DOT_IN_LABEL: Misc. (line 463)
* NO_FUNCTION_CSE: Costs. (line 261)
* NO_IMPLICIT_EXTERN_C: Misc. (line 376)
* NO_PROFILE_COUNTERS: Profiling. (line 28)
* NO_REGS: Register Classes. (line 17)
* NON_LVALUE_EXPR: Unary and Binary Expressions.
(line 6)
* nondeterministic finite state automaton: Processor pipeline description.
(line 301)
* nonimmediate_operand: Machine-Independent Predicates.
(line 101)
* nonlocal goto handler: Edges. (line 171)
* nonlocal_goto instruction pattern: Standard Names. (line 1262)
* nonlocal_goto_receiver instruction pattern: Standard Names.
(line 1279)
* nonmemory_operand: Machine-Independent Predicates.
(line 97)
* nonoffsettable memory reference: Simple Constraints. (line 256)
* nop instruction pattern: Standard Names. (line 1073)
* NOP_EXPR: Unary and Binary Expressions.
(line 6)
* normal predicates: Predicates. (line 31)
* not: Arithmetic. (line 154)
* not and attributes: Expressions. (line 50)
* not equal: Comparisons. (line 56)
* not, canonicalization of: Insn Canonicalizations.
(line 27)
* note: Insns. (line 168)
* note and /i: Flags. (line 59)
* note and /v: Flags. (line 44)
* NOTE_INSN_BASIC_BLOCK, CODE_LABEL, notes: Basic Blocks. (line 41)
* NOTE_INSN_BLOCK_BEG: Insns. (line 193)
* NOTE_INSN_BLOCK_END: Insns. (line 193)
* NOTE_INSN_DELETED: Insns. (line 183)
* NOTE_INSN_DELETED_LABEL: Insns. (line 188)
* NOTE_INSN_EH_REGION_BEG: Insns. (line 199)
* NOTE_INSN_EH_REGION_END: Insns. (line 199)
* NOTE_INSN_FUNCTION_BEG: Insns. (line 223)
* NOTE_INSN_LOOP_BEG: Insns. (line 207)
* NOTE_INSN_LOOP_CONT: Insns. (line 213)
* NOTE_INSN_LOOP_END: Insns. (line 207)
* NOTE_INSN_LOOP_VTOP: Insns. (line 217)
* NOTE_INSN_VAR_LOCATION: Insns. (line 227)
* NOTE_LINE_NUMBER: Insns. (line 168)
* NOTE_SOURCE_FILE: Insns. (line 168)
* NOTE_VAR_LOCATION: Insns. (line 227)
* NOTICE_UPDATE_CC: CC0 Condition Codes.
(line 31)
* NUM_MACHINE_MODES: Machine Modes. (line 286)
* NUM_MODES_FOR_MODE_SWITCHING: Mode Switching. (line 30)
* Number of iterations analysis: Number of iterations.
(line 6)
* o in constraint: Simple Constraints. (line 23)
* OBJC_GEN_METHOD_LABEL: Label Output. (line 440)
* OBJC_JBLEN: Misc. (line 945)
* OBJECT_FORMAT_COFF: Macros for Initialization.
(line 97)
* OFFSET_TYPE: Types. (line 6)
* offsettable address: Simple Constraints. (line 23)
* OImode: Machine Modes. (line 51)
* Omega a solver for linear programming problems: Omega. (line 6)
* OMP_ATOMIC: OpenMP. (line 6)
* OMP_CLAUSE: OpenMP. (line 6)
* OMP_CONTINUE: OpenMP. (line 6)
* OMP_CRITICAL: OpenMP. (line 6)
* OMP_FOR: OpenMP. (line 6)
* OMP_MASTER: OpenMP. (line 6)
* OMP_ORDERED: OpenMP. (line 6)
* OMP_PARALLEL: OpenMP. (line 6)
* OMP_RETURN: OpenMP. (line 6)
* OMP_SECTION: OpenMP. (line 6)
* OMP_SECTIONS: OpenMP. (line 6)
* OMP_SINGLE: OpenMP. (line 6)
* one_cmplM2 instruction pattern: Standard Names. (line 678)
* operand access: Accessors. (line 6)
* Operand Access Routines: SSA Operands. (line 119)
* operand constraints: Constraints. (line 6)
* Operand Iterators: SSA Operands. (line 119)
* operand predicates: Predicates. (line 6)
* operand substitution: Output Template. (line 6)
* operands <1>: Patterns. (line 53)
* operands: SSA Operands. (line 6)
* Operands: Operands. (line 6)
* operator predicates: Predicates. (line 6)
* optc-gen.awk: Options. (line 6)
* Optimization infrastructure for GIMPLE: Tree SSA. (line 6)
* OPTIMIZE_MODE_SWITCHING: Mode Switching. (line 9)
* option specification files: Options. (line 6)
* OPTION_DEFAULT_SPECS: Driver. (line 26)
* optional hardware or system features: Run-time Target. (line 59)
* options, directory search: Including Patterns. (line 44)
* order of register allocation: Allocation Order. (line 6)
* ordered_comparison_operator: Machine-Independent Predicates.
(line 116)
* ORDERED_EXPR: Unary and Binary Expressions.
(line 6)
* Ordering of Patterns: Pattern Ordering. (line 6)
* ORIGINAL_REGNO: Special Accessors. (line 44)
* other register constraints: Simple Constraints. (line 173)
* OUTGOING_REG_PARM_STACK_SPACE: Stack Arguments. (line 74)
* OUTGOING_REGNO: Register Basics. (line 95)
* output of assembler code: File Framework. (line 6)
* output statements: Output Statement. (line 6)
* output templates: Output Template. (line 6)
* OUTPUT_ADDR_CONST_EXTRA: Data Output. (line 51)
* output_asm_insn: Output Statement. (line 53)
* OUTPUT_QUOTED_STRING: File Framework. (line 102)
* OVERLAPPING_REGISTER_NAMES: Instruction Output. (line 21)
* OVERLOAD: Functions for C++. (line 6)
* OVERRIDE_ABI_FORMAT: Register Arguments. (line 140)
* OVL_CURRENT: Functions for C++. (line 6)
* OVL_NEXT: Functions for C++. (line 6)
* p in constraint: Simple Constraints. (line 164)
* PAD_VARARGS_DOWN: Register Arguments. (line 220)
* parallel: Side Effects. (line 204)
* param_is: GTY Options. (line 109)
* parameters, c++ abi: C++ ABI. (line 6)
* parameters, miscellaneous: Misc. (line 6)
* parameters, precompiled headers: PCH Target. (line 6)
* paramN_is: GTY Options. (line 127)
* parity: Arithmetic. (line 237)
* parityM2 instruction pattern: Standard Names. (line 672)
* PARM_BOUNDARY: Storage Layout. (line 132)
* PARM_DECL: Declarations. (line 6)
* PARSE_LDD_OUTPUT: Macros for Initialization.
(line 127)
* passes and files of the compiler: Passes. (line 6)
* passing arguments: Interface. (line 36)
* PATH_SEPARATOR: Filesystem. (line 31)
* PATTERN: Insns. (line 288)
* pattern conditions: Patterns. (line 43)
* pattern names: Standard Names. (line 6)
* Pattern Ordering: Pattern Ordering. (line 6)
* patterns: Patterns. (line 6)
* pc: Regs and Memory. (line 361)
* pc and attributes: Insn Lengths. (line 20)
* pc, RTL sharing: Sharing. (line 25)
* PC_REGNUM: Register Basics. (line 109)
* pc_rtx: Regs and Memory. (line 366)
* PCC_BITFIELD_TYPE_MATTERS: Storage Layout. (line 318)
* PCC_STATIC_STRUCT_RETURN: Aggregate Return. (line 65)
* PDImode: Machine Modes. (line 40)
* peephole optimization, RTL representation: Side Effects. (line 238)
* peephole optimizer definitions: Peephole Definitions.
(line 6)
* per-function data: Per-Function Data. (line 6)
* percent sign: Output Template. (line 6)
* PHI nodes: SSA. (line 31)
* PHI_ARG_DEF: SSA. (line 71)
* PHI_ARG_EDGE: SSA. (line 68)
* PHI_ARG_ELT: SSA. (line 63)
* PHI_NUM_ARGS: SSA. (line 59)
* PHI_RESULT: SSA. (line 56)
* PIC: PIC. (line 6)
* PIC_OFFSET_TABLE_REG_CALL_CLOBBERED: PIC. (line 26)
* PIC_OFFSET_TABLE_REGNUM: PIC. (line 16)
* pipeline hazard recognizer: Processor pipeline description.
(line 6)
* Plugins: Plugins. (line 6)
* plus: Arithmetic. (line 14)
* plus and attributes: Expressions. (line 64)
* plus, canonicalization of: Insn Canonicalizations.
(line 27)
* PLUS_EXPR: Unary and Binary Expressions.
(line 6)
* Pmode: Misc. (line 344)
* pmode_register_operand: Machine-Independent Predicates.
(line 35)
* pointer: Types. (line 6)
* POINTER_PLUS_EXPR: Unary and Binary Expressions.
(line 6)
* POINTER_SIZE: Storage Layout. (line 70)
* POINTER_TYPE: Types. (line 6)
* POINTERS_EXTEND_UNSIGNED: Storage Layout. (line 76)
* pop_operand: Machine-Independent Predicates.
(line 88)
* popcount: Arithmetic. (line 233)
* popcountM2 instruction pattern: Standard Names. (line 666)
* portability: Portability. (line 6)
* position independent code: PIC. (line 6)
* post_dec: Incdec. (line 25)
* post_inc: Incdec. (line 30)
* post_modify: Incdec. (line 33)
* POSTDECREMENT_EXPR: Unary and Binary Expressions.
(line 6)
* POSTINCREMENT_EXPR: Unary and Binary Expressions.
(line 6)
* POWI_MAX_MULTS: Misc. (line 813)
* powM3 instruction pattern: Standard Names. (line 540)
* pragma: Misc. (line 381)
* pre_dec: Incdec. (line 8)
* PRE_GCC3_DWARF_FRAME_REGISTERS: Frame Registers. (line 127)
* pre_inc: Incdec. (line 22)
* pre_modify: Incdec. (line 51)
* PREDECREMENT_EXPR: Unary and Binary Expressions.
(line 6)
* predefined macros: Run-time Target. (line 6)
* predicates: Predicates. (line 6)
* predicates and machine modes: Predicates. (line 31)
* predication <1>: Cond Exec Macros. (line 6)
* predication: Conditional Execution.
(line 6)
* predict.def: Profile information.
(line 24)
* PREFERRED_DEBUGGING_TYPE: All Debuggers. (line 42)
* PREFERRED_OUTPUT_RELOAD_CLASS: Register Classes. (line 278)
* PREFERRED_RELOAD_CLASS: Register Classes. (line 243)
* PREFERRED_STACK_BOUNDARY: Storage Layout. (line 146)
* prefetch: Side Effects. (line 312)
* prefetch and /v: Flags. (line 232)
* prefetch instruction pattern: Standard Names. (line 1401)
* PREFETCH_SCHEDULE_BARRIER_P: Flags. (line 232)
* PREINCREMENT_EXPR: Unary and Binary Expressions.
(line 6)
* presence_set: Processor pipeline description.
(line 220)
* preserving SSA form: SSA. (line 76)
* preserving virtual SSA form: SSA. (line 186)
* prev_active_insn: define_peephole. (line 60)
* PREV_INSN: Insns. (line 26)
* PRINT_OPERAND: Instruction Output. (line 96)
* PRINT_OPERAND_ADDRESS: Instruction Output. (line 124)
* PRINT_OPERAND_PUNCT_VALID_P: Instruction Output. (line 117)
* probe_stack instruction pattern: Standard Names. (line 1254)
* processor functional units: Processor pipeline description.
(line 6)
* processor pipeline description: Processor pipeline description.
(line 6)
* product: Arithmetic. (line 92)
* profile feedback: Profile information.
(line 14)
* profile representation: Profile information.
(line 6)
* PROFILE_BEFORE_PROLOGUE: Profiling. (line 35)
* PROFILE_HOOK: Profiling. (line 23)
* profiling, code generation: Profiling. (line 6)
* program counter: Regs and Memory. (line 362)
* prologue: Function Entry. (line 6)
* prologue instruction pattern: Standard Names. (line 1345)
* PROMOTE_MODE: Storage Layout. (line 87)
* pseudo registers: Regs and Memory. (line 9)
* PSImode: Machine Modes. (line 32)
* PTRDIFF_TYPE: Type Layout. (line 183)
* purge_dead_edges <1>: Maintaining the CFG.
(line 93)
* purge_dead_edges: Edges. (line 104)
* push address instruction: Simple Constraints. (line 164)
* PUSH_ARGS: Stack Arguments. (line 18)
* PUSH_ARGS_REVERSED: Stack Arguments. (line 26)
* push_operand: Machine-Independent Predicates.
(line 81)
* push_reload: Addressing Modes. (line 175)
* PUSH_ROUNDING: Stack Arguments. (line 32)
* pushM1 instruction pattern: Standard Names. (line 209)
* PUT_CODE: RTL Objects. (line 47)
* PUT_MODE: Machine Modes. (line 283)
* PUT_REG_NOTE_KIND: Insns. (line 350)
* PUT_SDB_: SDB and DWARF. (line 101)
* QCmode: Machine Modes. (line 197)
* QFmode: Machine Modes. (line 54)
* QImode: Machine Modes. (line 25)
* QImode, in insn: Insns. (line 272)
* QQmode: Machine Modes. (line 103)
* qualified type <1>: Types for C++. (line 6)
* qualified type: Types. (line 6)
* querying function unit reservations: Processor pipeline description.
(line 90)
* question mark: Multi-Alternative. (line 41)
* quotient: Arithmetic. (line 116)
* r in constraint: Simple Constraints. (line 66)
* RANGE_TEST_NON_SHORT_CIRCUIT: Costs. (line 265)
* RDIV_EXPR: Unary and Binary Expressions.
(line 6)
* READONLY_DATA_SECTION_ASM_OP: Sections. (line 63)
* real operands: SSA Operands. (line 6)
* REAL_ARITHMETIC: Floating Point. (line 66)
* REAL_CST: Constant expressions.
(line 6)
* REAL_LIBGCC_SPEC: Driver. (line 125)
* REAL_NM_FILE_NAME: Macros for Initialization.
(line 106)
* REAL_TYPE: Types. (line 6)
* REAL_VALUE_ABS: Floating Point. (line 82)
* REAL_VALUE_ATOF: Floating Point. (line 50)
* REAL_VALUE_FIX: Floating Point. (line 41)
* REAL_VALUE_FROM_INT: Floating Point. (line 99)
* REAL_VALUE_ISINF: Floating Point. (line 59)
* REAL_VALUE_ISNAN: Floating Point. (line 62)
* REAL_VALUE_NEGATE: Floating Point. (line 79)
* REAL_VALUE_NEGATIVE: Floating Point. (line 56)
* REAL_VALUE_TO_INT: Floating Point. (line 93)
* REAL_VALUE_TO_TARGET_DECIMAL128: Data Output. (line 156)
* REAL_VALUE_TO_TARGET_DECIMAL32: Data Output. (line 154)
* REAL_VALUE_TO_TARGET_DECIMAL64: Data Output. (line 155)
* REAL_VALUE_TO_TARGET_DOUBLE: Data Output. (line 152)
* REAL_VALUE_TO_TARGET_LONG_DOUBLE: Data Output. (line 153)
* REAL_VALUE_TO_TARGET_SINGLE: Data Output. (line 151)
* REAL_VALUE_TRUNCATE: Floating Point. (line 86)
* REAL_VALUE_TYPE: Floating Point. (line 26)
* REAL_VALUE_UNSIGNED_FIX: Floating Point. (line 45)
* REAL_VALUES_EQUAL: Floating Point. (line 32)
* REAL_VALUES_LESS: Floating Point. (line 38)
* REALPART_EXPR: Unary and Binary Expressions.
(line 6)
* recog_data.operand: Instruction Output. (line 54)
* recognizing insns: RTL Template. (line 6)
* RECORD_TYPE <1>: Classes. (line 6)
* RECORD_TYPE: Types. (line 6)
* redirect_edge_and_branch: Profile information.
(line 71)
* redirect_edge_and_branch, redirect_jump: Maintaining the CFG.
(line 103)
* reduc_smax_M instruction pattern: Standard Names. (line 267)
* reduc_smin_M instruction pattern: Standard Names. (line 267)
* reduc_splus_M instruction pattern: Standard Names. (line 279)
* reduc_umax_M instruction pattern: Standard Names. (line 273)
* reduc_umin_M instruction pattern: Standard Names. (line 273)
* reduc_uplus_M instruction pattern: Standard Names. (line 285)
* reference: Types. (line 6)
* REFERENCE_TYPE: Types. (line 6)
* reg: Regs and Memory. (line 9)
* reg and /f: Flags. (line 112)
* reg and /i: Flags. (line 107)
* reg and /v: Flags. (line 116)
* reg, RTL sharing: Sharing. (line 17)
* REG_ALLOC_ORDER: Allocation Order. (line 9)
* REG_BR_PRED: Insns. (line 531)
* REG_BR_PROB: Insns. (line 525)
* REG_BR_PROB_BASE, BB_FREQ_BASE, count: Profile information.
(line 82)
* REG_BR_PROB_BASE, EDGE_FREQUENCY: Profile information.
(line 52)
* REG_CC_SETTER: Insns. (line 496)
* REG_CC_USER: Insns. (line 496)
* REG_CLASS_CONTENTS: Register Classes. (line 88)
* reg_class_contents: Register Basics. (line 59)
* REG_CLASS_FROM_CONSTRAINT: Old Constraints. (line 35)
* REG_CLASS_FROM_LETTER: Old Constraints. (line 27)
* REG_CLASS_NAMES: Register Classes. (line 83)
* REG_CROSSING_JUMP: Insns. (line 409)
* REG_DEAD: Insns. (line 361)
* REG_DEAD, REG_UNUSED: Liveness information.
(line 32)
* REG_DEP_ANTI: Insns. (line 518)
* REG_DEP_OUTPUT: Insns. (line 514)
* REG_DEP_TRUE: Insns. (line 511)
* REG_EH_REGION, EDGE_ABNORMAL_CALL: Edges. (line 110)
* REG_EQUAL: Insns. (line 424)
* REG_EQUIV: Insns. (line 424)
* REG_EXPR: Special Accessors. (line 50)
* REG_FRAME_RELATED_EXPR: Insns. (line 537)
* REG_FUNCTION_VALUE_P: Flags. (line 107)
* REG_INC: Insns. (line 377)
* reg_label and /v: Flags. (line 65)
* REG_LABEL_OPERAND: Insns. (line 391)
* REG_LABEL_TARGET: Insns. (line 400)
* reg_names <1>: Instruction Output. (line 108)
* reg_names: Register Basics. (line 59)
* REG_NONNEG: Insns. (line 383)
* REG_NOTE_KIND: Insns. (line 350)
* REG_NOTES: Insns. (line 324)
* REG_OFFSET: Special Accessors. (line 54)
* REG_OK_STRICT: Addressing Modes. (line 100)
* REG_PARM_STACK_SPACE: Stack Arguments. (line 59)
* REG_PARM_STACK_SPACE, and FUNCTION_ARG: Register Arguments.
(line 52)
* REG_POINTER: Flags. (line 112)
* REG_SETJMP: Insns. (line 418)
* REG_UNUSED: Insns. (line 370)
* REG_USERVAR_P: Flags. (line 116)
* regclass_for_constraint: C Constraint Interface.
(line 60)
* register allocation order: Allocation Order. (line 6)
* register class definitions: Register Classes. (line 6)
* register class preference constraints: Class Preferences. (line 6)
* register pairs: Values in Registers.
(line 69)
* Register Transfer Language (RTL): RTL. (line 6)
* register usage: Registers. (line 6)
* REGISTER_MOVE_COST: Costs. (line 10)
* REGISTER_NAMES: Instruction Output. (line 9)
* register_operand: Machine-Independent Predicates.
(line 30)
* REGISTER_PREFIX: Instruction Output. (line 152)
* REGISTER_TARGET_PRAGMAS: Misc. (line 382)
* registers arguments: Register Arguments. (line 6)
* registers in constraints: Simple Constraints. (line 66)
* REGMODE_NATURAL_SIZE: Values in Registers.
(line 50)
* REGNO_MODE_CODE_OK_FOR_BASE_P: Register Classes. (line 169)
* REGNO_MODE_OK_FOR_BASE_P: Register Classes. (line 146)
* REGNO_MODE_OK_FOR_REG_BASE_P: Register Classes. (line 156)
* REGNO_OK_FOR_BASE_P: Register Classes. (line 142)
* REGNO_OK_FOR_INDEX_P: Register Classes. (line 180)
* REGNO_REG_CLASS: Register Classes. (line 103)
* regs_ever_live: Function Entry. (line 21)
* regular expressions: Processor pipeline description.
(line 6)
* relative costs: Costs. (line 6)
* RELATIVE_PREFIX_NOT_LINKDIR: Driver. (line 263)
* reload_completed: Standard Names. (line 1040)
* reload_in instruction pattern: Standard Names. (line 99)
* reload_in_progress: Standard Names. (line 57)
* reload_out instruction pattern: Standard Names. (line 99)
* reloading: RTL passes. (line 182)
* remainder: Arithmetic. (line 136)
* remainderM3 instruction pattern: Standard Names. (line 499)
* reorder: GTY Options. (line 205)
* representation of RTL: RTL. (line 6)
* reservation delays: Processor pipeline description.
(line 6)
* rest_of_decl_compilation: Parsing pass. (line 52)
* rest_of_type_compilation: Parsing pass. (line 52)
* restore_stack_block instruction pattern: Standard Names. (line 1174)
* restore_stack_function instruction pattern: Standard Names.
(line 1174)
* restore_stack_nonlocal instruction pattern: Standard Names.
(line 1174)
* RESULT_DECL: Declarations. (line 6)
* return: Side Effects. (line 72)
* return instruction pattern: Standard Names. (line 1027)
* return values in registers: Scalar Return. (line 6)
* RETURN_ADDR_IN_PREVIOUS_FRAME: Frame Layout. (line 135)
* RETURN_ADDR_OFFSET: Exception Handling. (line 60)
* RETURN_ADDR_RTX: Frame Layout. (line 124)
* RETURN_ADDRESS_POINTER_REGNUM: Frame Registers. (line 65)
* RETURN_EXPR: Statements for C++. (line 6)
* RETURN_STMT: Statements for C++. (line 6)
* return_val: Flags. (line 299)
* return_val, in call_insn: Flags. (line 24)
* return_val, in mem: Flags. (line 85)
* return_val, in reg: Flags. (line 107)
* return_val, in symbol_ref: Flags. (line 220)
* returning aggregate values: Aggregate Return. (line 6)
* returning structures and unions: Interface. (line 10)
* reverse probability: Profile information.
(line 66)
* REVERSE_CONDEXEC_PREDICATES_P: Cond Exec Macros. (line 11)
* REVERSE_CONDITION: MODE_CC Condition Codes.
(line 87)
* REVERSIBLE_CC_MODE: MODE_CC Condition Codes.
(line 73)
* right rotate: Arithmetic. (line 195)
* right shift: Arithmetic. (line 190)
* rintM2 instruction pattern: Standard Names. (line 599)
* RISC: Processor pipeline description.
(line 6)
* roots, marking: GGC Roots. (line 6)
* rotate: Arithmetic. (line 195)
* rotatert: Arithmetic. (line 195)
* rotlM3 instruction pattern: Standard Names. (line 468)
* rotrM3 instruction pattern: Standard Names. (line 468)
* ROUND_DIV_EXPR: Unary and Binary Expressions.
(line 6)
* ROUND_MOD_EXPR: Unary and Binary Expressions.
(line 6)
* ROUND_TOWARDS_ZERO: Storage Layout. (line 468)
* ROUND_TYPE_ALIGN: Storage Layout. (line 415)
* roundM2 instruction pattern: Standard Names. (line 575)
* RSHIFT_EXPR: Unary and Binary Expressions.
(line 6)
* RTL addition: Arithmetic. (line 14)
* RTL addition with signed saturation: Arithmetic. (line 14)
* RTL addition with unsigned saturation: Arithmetic. (line 14)
* RTL classes: RTL Classes. (line 6)
* RTL comparison: Arithmetic. (line 43)
* RTL comparison operations: Comparisons. (line 6)
* RTL constant expression types: Constants. (line 6)
* RTL constants: Constants. (line 6)
* RTL declarations: RTL Declarations. (line 6)
* RTL difference: Arithmetic. (line 36)
* RTL expression: RTL Objects. (line 6)
* RTL expressions for arithmetic: Arithmetic. (line 6)
* RTL format: RTL Classes. (line 72)
* RTL format characters: RTL Classes. (line 77)
* RTL function-call insns: Calls. (line 6)
* RTL insn template: RTL Template. (line 6)
* RTL integers: RTL Objects. (line 6)
* RTL memory expressions: Regs and Memory. (line 6)
* RTL object types: RTL Objects. (line 6)
* RTL postdecrement: Incdec. (line 6)
* RTL postincrement: Incdec. (line 6)
* RTL predecrement: Incdec. (line 6)
* RTL preincrement: Incdec. (line 6)
* RTL register expressions: Regs and Memory. (line 6)
* RTL representation: RTL. (line 6)
* RTL side effect expressions: Side Effects. (line 6)
* RTL strings: RTL Objects. (line 6)
* RTL structure sharing assumptions: Sharing. (line 6)
* RTL subtraction: Arithmetic. (line 36)
* RTL subtraction with signed saturation: Arithmetic. (line 36)
* RTL subtraction with unsigned saturation: Arithmetic. (line 36)
* RTL sum: Arithmetic. (line 14)
* RTL vectors: RTL Objects. (line 6)
* RTL_CONST_CALL_P: Flags. (line 19)
* RTL_CONST_OR_PURE_CALL_P: Flags. (line 29)
* RTL_LOOPING_CONST_OR_PURE_CALL_P: Flags. (line 33)
* RTL_PURE_CALL_P: Flags. (line 24)
* RTX (See RTL): RTL Objects. (line 6)
* RTX codes, classes of: RTL Classes. (line 6)
* RTX_FRAME_RELATED_P: Flags. (line 125)
* run-time conventions: Interface. (line 6)
* run-time target specification: Run-time Target. (line 6)
* s in constraint: Simple Constraints. (line 102)
* same_type_p: Types. (line 88)
* SAmode: Machine Modes. (line 148)
* sat_fract: Conversions. (line 90)
* satfractMN2 instruction pattern: Standard Names. (line 856)
* satfractunsMN2 instruction pattern: Standard Names. (line 869)
* satisfies_constraint_: C Constraint Interface.
(line 47)
* SAVE_EXPR: Unary and Binary Expressions.
(line 6)
* save_stack_block instruction pattern: Standard Names. (line 1174)
* save_stack_function instruction pattern: Standard Names. (line 1174)
* save_stack_nonlocal instruction pattern: Standard Names. (line 1174)
* SBSS_SECTION_ASM_OP: Sections. (line 77)
* Scalar evolutions: Scalar evolutions. (line 6)
* scalars, returned as values: Scalar Return. (line 6)
* SCHED_GROUP_P: Flags. (line 166)
* SCmode: Machine Modes. (line 197)
* scratch: Regs and Memory. (line 298)
* scratch operands: Regs and Memory. (line 298)
* scratch, RTL sharing: Sharing. (line 35)
* scratch_operand: Machine-Independent Predicates.
(line 50)
* SDATA_SECTION_ASM_OP: Sections. (line 58)
* SDB_ALLOW_FORWARD_REFERENCES: SDB and DWARF. (line 119)
* SDB_ALLOW_UNKNOWN_REFERENCES: SDB and DWARF. (line 114)
* SDB_DEBUGGING_INFO: SDB and DWARF. (line 9)
* SDB_DELIM: SDB and DWARF. (line 107)
* SDB_OUTPUT_SOURCE_LINE: SDB and DWARF. (line 124)
* SDmode: Machine Modes. (line 85)
* sdot_prodM instruction pattern: Standard Names. (line 291)
* search options: Including Patterns. (line 44)
* SECONDARY_INPUT_RELOAD_CLASS: Register Classes. (line 394)
* SECONDARY_MEMORY_NEEDED: Register Classes. (line 450)
* SECONDARY_MEMORY_NEEDED_MODE: Register Classes. (line 469)
* SECONDARY_MEMORY_NEEDED_RTX: Register Classes. (line 460)
* SECONDARY_OUTPUT_RELOAD_CLASS: Register Classes. (line 395)
* SECONDARY_RELOAD_CLASS: Register Classes. (line 393)
* SELECT_CC_MODE: MODE_CC Condition Codes.
(line 7)
* sequence: Side Effects. (line 254)
* Sequence iterators: Sequence iterators. (line 6)
* set: Side Effects. (line 15)
* set and /f: Flags. (line 125)
* SET_ASM_OP: Label Output. (line 407)
* set_attr: Tagging Insns. (line 31)
* set_attr_alternative: Tagging Insns. (line 49)
* set_bb_seq: GIMPLE sequences. (line 76)
* SET_BY_PIECES_P: Costs. (line 206)
* SET_DEST: Side Effects. (line 69)
* SET_IS_RETURN_P: Flags. (line 175)
* SET_LABEL_KIND: Insns. (line 140)
* set_optab_libfunc: Library Calls. (line 15)
* SET_RATIO: Costs. (line 194)
* SET_SRC: Side Effects. (line 69)
* SET_TYPE_STRUCTURAL_EQUALITY: Types. (line 6)
* setmemM instruction pattern: Standard Names. (line 724)
* SETUP_FRAME_ADDRESSES: Frame Layout. (line 102)
* SF_SIZE: Type Layout. (line 128)
* SFmode: Machine Modes. (line 66)
* sharing of RTL components: Sharing. (line 6)
* shift: Arithmetic. (line 173)
* SHIFT_COUNT_TRUNCATED: Misc. (line 127)
* SHLIB_SUFFIX: Macros for Initialization.
(line 135)
* SHORT_ACCUM_TYPE_SIZE: Type Layout. (line 83)
* SHORT_FRACT_TYPE_SIZE: Type Layout. (line 63)
* SHORT_IMMEDIATES_SIGN_EXTEND: Misc. (line 96)
* SHORT_TYPE_SIZE: Type Layout. (line 16)
* sibcall_epilogue instruction pattern: Standard Names. (line 1371)
* sibling call: Edges. (line 122)
* SIBLING_CALL_P: Flags. (line 179)
* SIG_ATOMIC_TYPE: Type Layout. (line 234)
* sign_extend: Conversions. (line 23)
* sign_extract: Bit-Fields. (line 8)
* sign_extract, canonicalization of: Insn Canonicalizations.
(line 88)
* signed division: Arithmetic. (line 116)
* signed division with signed saturation: Arithmetic. (line 116)
* signed maximum: Arithmetic. (line 141)
* signed minimum: Arithmetic. (line 141)
* SImode: Machine Modes. (line 37)
* simple constraints: Simple Constraints. (line 6)
* sincos math function, implicit usage: Library Calls. (line 70)
* sinM2 instruction pattern: Standard Names. (line 516)
* SIZE_ASM_OP: Label Output. (line 35)
* SIZE_TYPE: Type Layout. (line 167)
* skip: GTY Options. (line 72)
* SLOW_BYTE_ACCESS: Costs. (line 118)
* SLOW_UNALIGNED_ACCESS: Costs. (line 133)
* smax: Arithmetic. (line 141)
* smin: Arithmetic. (line 141)
* sms, swing, software pipelining: RTL passes. (line 131)
* smulM3_highpart instruction pattern: Standard Names. (line 383)
* soft float library: Soft float library routines.
(line 6)
* special: GTY Options. (line 249)
* special predicates: Predicates. (line 31)
* SPECS: Target Fragment. (line 166)
* speed of instructions: Costs. (line 6)
* split_block: Maintaining the CFG.
(line 110)
* splitting instructions: Insn Splitting. (line 6)
* SQmode: Machine Modes. (line 111)
* sqrt: Arithmetic. (line 207)
* sqrtM2 instruction pattern: Standard Names. (line 482)
* square root: Arithmetic. (line 207)
* ss_abs: Arithmetic. (line 200)
* ss_ashift: Arithmetic. (line 173)
* ss_div: Arithmetic. (line 116)
* ss_minus: Arithmetic. (line 36)
* ss_mult: Arithmetic. (line 92)
* ss_neg: Arithmetic. (line 81)
* ss_plus: Arithmetic. (line 14)
* ss_truncate: Conversions. (line 43)
* SSA: SSA. (line 6)
* SSA_NAME_DEF_STMT: SSA. (line 221)
* SSA_NAME_VERSION: SSA. (line 226)
* ssaddM3 instruction pattern: Standard Names. (line 222)
* ssashlM3 instruction pattern: Standard Names. (line 458)
* ssdivM3 instruction pattern: Standard Names. (line 222)
* ssmaddMN4 instruction pattern: Standard Names. (line 406)
* ssmsubMN4 instruction pattern: Standard Names. (line 430)
* ssmulM3 instruction pattern: Standard Names. (line 222)
* ssnegM2 instruction pattern: Standard Names. (line 476)
* sssubM3 instruction pattern: Standard Names. (line 222)
* ssum_widenM3 instruction pattern: Standard Names. (line 301)
* stack arguments: Stack Arguments. (line 6)
* stack frame layout: Frame Layout. (line 6)
* stack smashing protection: Stack Smashing Protection.
(line 6)
* STACK_ALIGNMENT_NEEDED: Frame Layout. (line 48)
* STACK_BOUNDARY: Storage Layout. (line 138)
* STACK_CHECK_BUILTIN: Stack Checking. (line 32)
* STACK_CHECK_FIXED_FRAME_SIZE: Stack Checking. (line 83)
* STACK_CHECK_MAX_FRAME_SIZE: Stack Checking. (line 74)
* STACK_CHECK_MAX_VAR_SIZE: Stack Checking. (line 90)
* STACK_CHECK_MOVING_SP: Stack Checking. (line 54)
* STACK_CHECK_PROBE_INTERVAL_EXP: Stack Checking. (line 46)
* STACK_CHECK_PROTECT: Stack Checking. (line 63)
* STACK_CHECK_STATIC_BUILTIN: Stack Checking. (line 39)
* STACK_DYNAMIC_OFFSET: Frame Layout. (line 75)
* STACK_DYNAMIC_OFFSET and virtual registers: Regs and Memory.
(line 83)
* STACK_GROWS_DOWNWARD: Frame Layout. (line 9)
* STACK_PARMS_IN_REG_PARM_AREA: Stack Arguments. (line 84)
* STACK_POINTER_OFFSET: Frame Layout. (line 58)
* STACK_POINTER_OFFSET and virtual registers: Regs and Memory.
(line 93)
* STACK_POINTER_REGNUM: Frame Registers. (line 9)
* STACK_POINTER_REGNUM and virtual registers: Regs and Memory.
(line 83)
* stack_pointer_rtx: Frame Registers. (line 104)
* stack_protect_set instruction pattern: Standard Names. (line 1542)
* stack_protect_test instruction pattern: Standard Names. (line 1552)
* STACK_PUSH_CODE: Frame Layout. (line 17)
* STACK_REG_COVER_CLASS: Stack Registers. (line 23)
* STACK_REGS: Stack Registers. (line 20)
* STACK_SAVEAREA_MODE: Storage Layout. (line 431)
* STACK_SIZE_MODE: Storage Layout. (line 443)
* STACK_SLOT_ALIGNMENT: Storage Layout. (line 263)
* standard pattern names: Standard Names. (line 6)
* STANDARD_INCLUDE_COMPONENT: Driver. (line 339)
* STANDARD_INCLUDE_DIR: Driver. (line 331)
* STANDARD_STARTFILE_PREFIX: Driver. (line 275)
* STANDARD_STARTFILE_PREFIX_1: Driver. (line 282)
* STANDARD_STARTFILE_PREFIX_2: Driver. (line 289)
* STARTFILE_SPEC: Driver. (line 148)
* STARTING_FRAME_OFFSET: Frame Layout. (line 39)
* STARTING_FRAME_OFFSET and virtual registers: Regs and Memory.
(line 74)
* Statement and operand traversals: Statement and operand traversals.
(line 6)
* Statement Sequences: Statement Sequences.
(line 6)
* statements <1>: Statements for C++. (line 6)
* statements: Function Properties.
(line 6)
* Statements: Statements. (line 6)
* Static profile estimation: Profile information.
(line 24)
* static single assignment: SSA. (line 6)
* STATIC_CHAIN_INCOMING_REGNUM: Frame Registers. (line 78)
* STATIC_CHAIN_REGNUM: Frame Registers. (line 77)
* stdarg.h and register arguments: Register Arguments. (line 47)
* STDC_0_IN_SYSTEM_HEADERS: Misc. (line 365)
* STMT_EXPR: Unary and Binary Expressions.
(line 6)
* STMT_IS_FULL_EXPR_P: Statements for C++. (line 22)
* storage layout: Storage Layout. (line 6)
* STORE_BY_PIECES_P: Costs. (line 213)
* STORE_FLAG_VALUE: Misc. (line 216)
* store_multiple instruction pattern: Standard Names. (line 160)
* strcpy: Storage Layout. (line 223)
* STRICT_ALIGNMENT: Storage Layout. (line 313)
* strict_low_part: RTL Declarations. (line 9)
* strict_memory_address_p: Addressing Modes. (line 185)
* STRING_CST: Constant expressions.
(line 6)
* STRING_POOL_ADDRESS_P: Flags. (line 183)
* strlenM instruction pattern: Standard Names. (line 791)
* structure value address: Aggregate Return. (line 6)
* STRUCTURE_SIZE_BOUNDARY: Storage Layout. (line 305)
* structures, returning: Interface. (line 10)
* subM3 instruction pattern: Standard Names. (line 222)
* SUBOBJECT: Statements for C++. (line 6)
* SUBOBJECT_CLEANUP: Statements for C++. (line 6)
* subreg: Regs and Memory. (line 97)
* subreg and /s: Flags. (line 205)
* subreg and /u: Flags. (line 198)
* subreg and /u and /v: Flags. (line 188)
* subreg, in strict_low_part: RTL Declarations. (line 9)
* SUBREG_BYTE: Regs and Memory. (line 289)
* SUBREG_PROMOTED_UNSIGNED_P: Flags. (line 188)
* SUBREG_PROMOTED_UNSIGNED_SET: Flags. (line 198)
* SUBREG_PROMOTED_VAR_P: Flags. (line 205)
* SUBREG_REG: Regs and Memory. (line 289)
* SUCCESS_EXIT_CODE: Host Misc. (line 12)
* SUPPORTS_INIT_PRIORITY: Macros for Initialization.
(line 58)
* SUPPORTS_ONE_ONLY: Label Output. (line 247)
* SUPPORTS_WEAK: Label Output. (line 221)
* SWITCH_BODY: Statements for C++. (line 6)
* SWITCH_COND: Statements for C++. (line 6)
* SWITCH_STMT: Statements for C++. (line 6)
* SWITCHABLE_TARGET: Run-time Target. (line 176)
* SYMBOL_FLAG_ANCHOR: Special Accessors. (line 110)
* SYMBOL_FLAG_EXTERNAL: Special Accessors. (line 92)
* SYMBOL_FLAG_FUNCTION: Special Accessors. (line 85)
* SYMBOL_FLAG_HAS_BLOCK_INFO: Special Accessors. (line 106)
* SYMBOL_FLAG_LOCAL: Special Accessors. (line 88)
* SYMBOL_FLAG_SMALL: Special Accessors. (line 97)
* SYMBOL_FLAG_TLS_SHIFT: Special Accessors. (line 101)
* symbol_ref: Constants. (line 76)
* symbol_ref and /f: Flags. (line 183)
* symbol_ref and /i: Flags. (line 220)
* symbol_ref and /u: Flags. (line 10)
* symbol_ref and /v: Flags. (line 224)
* symbol_ref, RTL sharing: Sharing. (line 20)
* SYMBOL_REF_ANCHOR_P: Special Accessors. (line 110)
* SYMBOL_REF_BLOCK: Special Accessors. (line 123)
* SYMBOL_REF_BLOCK_OFFSET: Special Accessors. (line 128)
* SYMBOL_REF_CONSTANT: Special Accessors. (line 71)
* SYMBOL_REF_DATA: Special Accessors. (line 75)
* SYMBOL_REF_DECL: Special Accessors. (line 59)
* SYMBOL_REF_EXTERNAL_P: Special Accessors. (line 92)
* SYMBOL_REF_FLAG: Flags. (line 224)
* SYMBOL_REF_FLAG, in TARGET_ENCODE_SECTION_INFO: Sections. (line 269)
* SYMBOL_REF_FLAGS: Special Accessors. (line 79)
* SYMBOL_REF_FUNCTION_P: Special Accessors. (line 85)
* SYMBOL_REF_HAS_BLOCK_INFO_P: Special Accessors. (line 106)
* SYMBOL_REF_LOCAL_P: Special Accessors. (line 88)
* SYMBOL_REF_SMALL_P: Special Accessors. (line 97)
* SYMBOL_REF_TLS_MODEL: Special Accessors. (line 101)
* SYMBOL_REF_USED: Flags. (line 215)
* SYMBOL_REF_WEAK: Flags. (line 220)
* symbolic label: Sharing. (line 20)
* sync_addMODE instruction pattern: Standard Names. (line 1458)
* sync_andMODE instruction pattern: Standard Names. (line 1458)
* sync_compare_and_swapMODE instruction pattern: Standard Names.
(line 1428)
* sync_iorMODE instruction pattern: Standard Names. (line 1458)
* sync_lock_releaseMODE instruction pattern: Standard Names. (line 1523)
* sync_lock_test_and_setMODE instruction pattern: Standard Names.
(line 1497)
* sync_nandMODE instruction pattern: Standard Names. (line 1458)
* sync_new_addMODE instruction pattern: Standard Names. (line 1490)
* sync_new_andMODE instruction pattern: Standard Names. (line 1490)
* sync_new_iorMODE instruction pattern: Standard Names. (line 1490)
* sync_new_nandMODE instruction pattern: Standard Names. (line 1490)
* sync_new_subMODE instruction pattern: Standard Names. (line 1490)
* sync_new_xorMODE instruction pattern: Standard Names. (line 1490)
* sync_old_addMODE instruction pattern: Standard Names. (line 1473)
* sync_old_andMODE instruction pattern: Standard Names. (line 1473)
* sync_old_iorMODE instruction pattern: Standard Names. (line 1473)
* sync_old_nandMODE instruction pattern: Standard Names. (line 1473)
* sync_old_subMODE instruction pattern: Standard Names. (line 1473)
* sync_old_xorMODE instruction pattern: Standard Names. (line 1473)
* sync_subMODE instruction pattern: Standard Names. (line 1458)
* sync_xorMODE instruction pattern: Standard Names. (line 1458)
* SYSROOT_HEADERS_SUFFIX_SPEC: Driver. (line 177)
* SYSROOT_SUFFIX_SPEC: Driver. (line 172)
* SYSTEM_INCLUDE_DIR: Driver. (line 322)
* t-TARGET: Target Fragment. (line 6)
* table jump: Basic Blocks. (line 57)
* tablejump instruction pattern: Standard Names. (line 1102)
* tag: GTY Options. (line 77)
* tagging insns: Tagging Insns. (line 6)
* tail calls: Tail Calls. (line 6)
* TAmode: Machine Modes. (line 156)
* target attributes: Target Attributes. (line 6)
* target description macros: Target Macros. (line 6)
* target functions: Target Structure. (line 6)
* target hooks: Target Structure. (line 6)
* target makefile fragment: Target Fragment. (line 6)
* target specifications: Run-time Target. (line 6)
* TARGET_ADDR_SPACE_ADDRESS_MODE: Named Address Spaces.
(line 45)
* TARGET_ADDR_SPACE_CONVERT: Named Address Spaces.
(line 88)
* TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P: Named Address Spaces.
(line 63)
* TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS: Named Address Spaces.
(line 72)
* TARGET_ADDR_SPACE_POINTER_MODE: Named Address Spaces.
(line 38)
* TARGET_ADDR_SPACE_SUBSET_P: Named Address Spaces.
(line 79)
* TARGET_ADDR_SPACE_VALID_POINTER_MODE: Named Address Spaces.
(line 52)
* TARGET_ADDRESS_COST: Costs. (line 297)
* TARGET_ALIGN_ANON_BITFIELD: Storage Layout. (line 390)
* TARGET_ALLOCATE_INITIAL_VALUE: Misc. (line 687)
* TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS: Misc. (line 967)
* TARGET_ARG_PARTIAL_BYTES: Register Arguments. (line 83)
* TARGET_ARM_EABI_UNWINDER: Exception Region Output.
(line 122)
* TARGET_ASM_ALIGNED_DI_OP: Data Output. (line 10)
* TARGET_ASM_ALIGNED_HI_OP: Data Output. (line 8)
* TARGET_ASM_ALIGNED_SI_OP: Data Output. (line 9)
* TARGET_ASM_ALIGNED_TI_OP: Data Output. (line 11)
* TARGET_ASM_ASSEMBLE_VISIBILITY: Label Output. (line 259)
* TARGET_ASM_BYTE_OP: Data Output. (line 7)
* TARGET_ASM_CAN_OUTPUT_MI_THUNK: Function Entry. (line 237)
* TARGET_ASM_CLOSE_PAREN: Data Output. (line 142)
* TARGET_ASM_CODE_END: File Framework. (line 59)
* TARGET_ASM_CONSTRUCTOR: Macros for Initialization.
(line 69)
* TARGET_ASM_DECLARE_CONSTANT_NAME: Label Output. (line 142)
* TARGET_ASM_DESTRUCTOR: Macros for Initialization.
(line 83)
* TARGET_ASM_EMIT_EXCEPT_PERSONALITY: Dispatch Tables. (line 82)
* TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL: Dispatch Tables. (line 74)
* TARGET_ASM_EMIT_UNWIND_LABEL: Dispatch Tables. (line 63)
* TARGET_ASM_EXTERNAL_LIBCALL: Label Output. (line 294)
* TARGET_ASM_FILE_END: File Framework. (line 37)
* TARGET_ASM_FILE_START: File Framework. (line 9)
* TARGET_ASM_FILE_START_APP_OFF: File Framework. (line 17)
* TARGET_ASM_FILE_START_FILE_DIRECTIVE: File Framework. (line 31)
* TARGET_ASM_FINAL_POSTSCAN_INSN: Instruction Output. (line 84)
* TARGET_ASM_FUNCTION_BEGIN_EPILOGUE: Function Entry. (line 61)
* TARGET_ASM_FUNCTION_END_PROLOGUE: Function Entry. (line 55)
* TARGET_ASM_FUNCTION_EPILOGUE: Function Entry. (line 68)
* TARGET_ASM_FUNCTION_PROLOGUE: Function Entry. (line 11)
* TARGET_ASM_FUNCTION_RODATA_SECTION: Sections. (line 216)
* TARGET_ASM_FUNCTION_SECTION: File Framework. (line 123)
* TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS: File Framework.
(line 133)
* TARGET_ASM_GLOBALIZE_DECL_NAME: Label Output. (line 187)
* TARGET_ASM_GLOBALIZE_LABEL: Label Output. (line 178)
* TARGET_ASM_INIT_SECTIONS: Sections. (line 161)
* TARGET_ASM_INTEGER: Data Output. (line 27)
* TARGET_ASM_INTERNAL_LABEL: Label Output. (line 338)
* TARGET_ASM_JUMP_ALIGN_MAX_SKIP: Alignment Output. (line 22)
* TARGET_ASM_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP: Alignment Output.
(line 36)
* TARGET_ASM_LABEL_ALIGN_MAX_SKIP: Alignment Output. (line 69)
* TARGET_ASM_LOOP_ALIGN_MAX_SKIP: Alignment Output. (line 54)
* TARGET_ASM_LTO_END: File Framework. (line 54)
* TARGET_ASM_LTO_START: File Framework. (line 49)
* TARGET_ASM_MARK_DECL_PRESERVED: Label Output. (line 301)
* TARGET_ASM_NAMED_SECTION: File Framework. (line 115)
* TARGET_ASM_OPEN_PAREN: Data Output. (line 141)
* TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA: Data Output. (line 40)
* TARGET_ASM_OUTPUT_ANCHOR: Anchored Addresses. (line 44)
* TARGET_ASM_OUTPUT_DWARF_DTPREL: SDB and DWARF. (line 96)
* TARGET_ASM_OUTPUT_MI_THUNK: Function Entry. (line 195)
* TARGET_ASM_OUTPUT_SOURCE_FILENAME: File Framework. (line 94)
* TARGET_ASM_RECORD_GCC_SWITCHES: File Framework. (line 164)
* TARGET_ASM_RECORD_GCC_SWITCHES_SECTION: File Framework. (line 208)
* TARGET_ASM_RELOC_RW_MASK: Sections. (line 170)
* TARGET_ASM_SELECT_RTX_SECTION: Sections. (line 224)
* TARGET_ASM_SELECT_SECTION: Sections. (line 182)
* TARGET_ASM_TRAMPOLINE_TEMPLATE: Trampolines. (line 29)
* TARGET_ASM_TTYPE: Exception Region Output.
(line 116)
* TARGET_ASM_UNALIGNED_DI_OP: Data Output. (line 14)
* TARGET_ASM_UNALIGNED_HI_OP: Data Output. (line 12)
* TARGET_ASM_UNALIGNED_SI_OP: Data Output. (line 13)
* TARGET_ASM_UNALIGNED_TI_OP: Data Output. (line 15)
* TARGET_ASM_UNIQUE_SECTION: Sections. (line 203)
* TARGET_ASM_UNWIND_EMIT: Dispatch Tables. (line 88)
* TARGET_ASM_UNWIND_EMIT_BEFORE_INSN: Dispatch Tables. (line 93)
* TARGET_ATTRIBUTE_TABLE: Target Attributes. (line 11)
* TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P: Target Attributes. (line 19)
* TARGET_BINDS_LOCAL_P: Sections. (line 301)
* TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED: Misc. (line 784)
* TARGET_BRANCH_TARGET_REGISTER_CLASS: Misc. (line 776)
* TARGET_BUILD_BUILTIN_VA_LIST: Register Arguments. (line 264)
* TARGET_BUILTIN_DECL: Misc. (line 620)
* TARGET_BUILTIN_RECIPROCAL: Addressing Modes. (line 265)
* TARGET_BUILTIN_SETJMP_FRAME_VALUE: Frame Layout. (line 109)
* TARGET_C99_FUNCTIONS: Library Calls. (line 63)
* TARGET_CALLEE_COPIES: Register Arguments. (line 115)
* TARGET_CAN_ELIMINATE: Elimination. (line 75)
* TARGET_CAN_INLINE_P: Target Attributes. (line 150)
* TARGET_CANNOT_FORCE_CONST_MEM: Addressing Modes. (line 246)
* TARGET_CANNOT_MODIFY_JUMPS_P: Misc. (line 763)
* TARGET_CANONICAL_VA_LIST_TYPE: Register Arguments. (line 285)
* TARGET_CASE_VALUES_THRESHOLD: Misc. (line 47)
* TARGET_CC_MODES_COMPATIBLE: MODE_CC Condition Codes.
(line 116)
* TARGET_CHECK_PCH_TARGET_FLAGS: PCH Target. (line 28)
* TARGET_CHECK_STRING_OBJECT_FORMAT_ARG: Run-time Target. (line 113)
* TARGET_CLASS_LIKELY_SPILLED_P: Register Classes. (line 492)
* TARGET_COMMUTATIVE_P: Misc. (line 680)
* TARGET_COMP_TYPE_ATTRIBUTES: Target Attributes. (line 27)
* TARGET_CONDITIONAL_REGISTER_USAGE: Register Basics. (line 60)
* TARGET_CONST_ANCHOR: Misc. (line 978)
* TARGET_CONVERT_TO_TYPE: Misc. (line 931)
* TARGET_CPU_CPP_BUILTINS: Run-time Target. (line 9)
* TARGET_CXX_ADJUST_CLASS_AT_DEFINITION: C++ ABI. (line 87)
* TARGET_CXX_CDTOR_RETURNS_THIS: C++ ABI. (line 38)
* TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT: C++ ABI. (line 62)
* TARGET_CXX_COOKIE_HAS_SIZE: C++ ABI. (line 25)
* TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY: C++ ABI. (line 54)
* TARGET_CXX_GET_COOKIE_SIZE: C++ ABI. (line 18)
* TARGET_CXX_GUARD_MASK_BIT: C++ ABI. (line 12)
* TARGET_CXX_GUARD_TYPE: C++ ABI. (line 7)
* TARGET_CXX_IMPORT_EXPORT_CLASS: C++ ABI. (line 30)
* TARGET_CXX_KEY_METHOD_MAY_BE_INLINE: C++ ABI. (line 43)
* TARGET_CXX_LIBRARY_RTTI_COMDAT: C++ ABI. (line 69)
* TARGET_CXX_USE_AEABI_ATEXIT: C++ ABI. (line 74)
* TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT: C++ ABI. (line 80)
* TARGET_DEBUG_UNWIND_INFO: SDB and DWARF. (line 37)
* TARGET_DECIMAL_FLOAT_SUPPORTED_P: Storage Layout. (line 515)
* TARGET_DECLSPEC: Target Attributes. (line 73)
* TARGET_DEFAULT_PACK_STRUCT: Misc. (line 445)
* TARGET_DEFAULT_SHORT_ENUMS: Type Layout. (line 159)
* TARGET_DEFAULT_TARGET_FLAGS: Run-time Target. (line 56)
* TARGET_DEFERRED_OUTPUT_DEFS: Label Output. (line 422)
* TARGET_DELAY_SCHED2: SDB and DWARF. (line 61)
* TARGET_DELAY_VARTRACK: SDB and DWARF. (line 65)
* TARGET_DELEGITIMIZE_ADDRESS: Addressing Modes. (line 237)
* TARGET_DLLIMPORT_DECL_ATTRIBUTES: Target Attributes. (line 55)
* TARGET_DWARF_CALLING_CONVENTION: SDB and DWARF. (line 18)
* TARGET_DWARF_HANDLE_FRAME_UNSPEC: Frame Layout. (line 172)
* TARGET_DWARF_REGISTER_SPAN: Exception Region Output.
(line 99)
* TARGET_EDOM: Library Calls. (line 45)
* TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS: Emulated TLS. (line 68)
* TARGET_EMUTLS_GET_ADDRESS: Emulated TLS. (line 19)
* TARGET_EMUTLS_REGISTER_COMMON: Emulated TLS. (line 24)
* TARGET_EMUTLS_TMPL_PREFIX: Emulated TLS. (line 45)
* TARGET_EMUTLS_TMPL_SECTION: Emulated TLS. (line 36)
* TARGET_EMUTLS_VAR_ALIGN_FIXED: Emulated TLS. (line 63)
* TARGET_EMUTLS_VAR_FIELDS: Emulated TLS. (line 49)
* TARGET_EMUTLS_VAR_INIT: Emulated TLS. (line 57)
* TARGET_EMUTLS_VAR_PREFIX: Emulated TLS. (line 41)
* TARGET_EMUTLS_VAR_SECTION: Emulated TLS. (line 31)
* TARGET_ENCODE_SECTION_INFO: Sections. (line 245)
* TARGET_ENCODE_SECTION_INFO and address validation: Addressing Modes.
(line 83)
* TARGET_ENCODE_SECTION_INFO usage: Instruction Output. (line 128)
* TARGET_ENUM_VA_LIST_P: Register Arguments. (line 269)
* TARGET_EXCEPT_UNWIND_INFO: Exception Region Output.
(line 48)
* TARGET_EXECUTABLE_SUFFIX: Misc. (line 737)
* TARGET_EXPAND_BUILTIN: Misc. (line 630)
* TARGET_EXPAND_BUILTIN_SAVEREGS: Varargs. (line 67)
* TARGET_EXPAND_TO_RTL_HOOK: Storage Layout. (line 521)
* TARGET_EXPR: Unary and Binary Expressions.
(line 6)
* TARGET_EXTRA_INCLUDES: Misc. (line 824)
* TARGET_EXTRA_LIVE_ON_ENTRY: Tail Calls. (line 21)
* TARGET_EXTRA_PRE_INCLUDES: Misc. (line 831)
* TARGET_FIXED_CONDITION_CODE_REGS: MODE_CC Condition Codes.
(line 101)
* TARGET_FIXED_POINT_SUPPORTED_P: Storage Layout. (line 518)
* target_flags: Run-time Target. (line 52)
* TARGET_FLAGS_REGNUM: Register Arguments. (line 361)
* TARGET_FLT_EVAL_METHOD: Type Layout. (line 140)
* TARGET_FN_ABI_VA_LIST: Register Arguments. (line 280)
* TARGET_FOLD_BUILTIN: Misc. (line 651)
* TARGET_FORMAT_TYPES: Misc. (line 851)
* TARGET_FRAME_POINTER_REQUIRED: Elimination. (line 9)
* TARGET_FUNCTION_ARG_BOUNDARY: Register Arguments. (line 239)
* TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P: Target Attributes. (line 95)
* TARGET_FUNCTION_OK_FOR_SIBCALL: Tail Calls. (line 8)
* TARGET_FUNCTION_VALUE: Scalar Return. (line 11)
* TARGET_FUNCTION_VALUE_REGNO_P: Scalar Return. (line 97)
* TARGET_GET_DRAP_RTX: Misc. (line 961)
* TARGET_GET_PCH_VALIDITY: PCH Target. (line 7)
* TARGET_GET_RAW_ARG_MODE: Aggregate Return. (line 83)
* TARGET_GET_RAW_RESULT_MODE: Aggregate Return. (line 78)
* TARGET_GIMPLIFY_VA_ARG_EXPR: Register Arguments. (line 291)
* TARGET_HANDLE_C_OPTION: Run-time Target. (line 78)
* TARGET_HANDLE_OPTION: Run-time Target. (line 61)
* TARGET_HANDLE_PRAGMA_EXTERN_PREFIX: Misc. (line 442)
* TARGET_HARD_REGNO_SCRATCH_OK: Values in Registers.
(line 144)
* TARGET_HAS_SINCOS: Library Calls. (line 71)
* TARGET_HAVE_CONDITIONAL_EXECUTION: Misc. (line 798)
* TARGET_HAVE_CTORS_DTORS: Macros for Initialization.
(line 64)
* TARGET_HAVE_NAMED_SECTIONS: File Framework. (line 140)
* TARGET_HAVE_SRODATA_SECTION: Sections. (line 290)
* TARGET_HAVE_SWITCHABLE_BSS_SECTIONS: File Framework. (line 145)
* TARGET_HAVE_TLS: Sections. (line 310)
* TARGET_HELP: Run-time Target. (line 170)
* TARGET_IN_SMALL_DATA_P: Sections. (line 286)
* TARGET_INIT_BUILTINS: Misc. (line 602)
* TARGET_INIT_DWARF_REG_SIZES_EXTRA: Exception Region Output.
(line 108)
* TARGET_INIT_LIBFUNCS: Library Calls. (line 16)
* TARGET_INSERT_ATTRIBUTES: Target Attributes. (line 82)
* TARGET_INSTANTIATE_DECLS: Storage Layout. (line 529)
* TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN: Misc. (line 885)
* TARGET_INVALID_BINARY_OP: Misc. (line 904)
* TARGET_INVALID_CONVERSION: Misc. (line 891)
* TARGET_INVALID_PARAMETER_TYPE: Misc. (line 910)
* TARGET_INVALID_RETURN_TYPE: Misc. (line 917)
* TARGET_INVALID_UNARY_OP: Misc. (line 897)
* TARGET_INVALID_WITHIN_DOLOOP: Misc. (line 660)
* TARGET_IRA_COVER_CLASSES: Register Classes. (line 537)
* TARGET_LEGITIMATE_ADDRESS_P: Addressing Modes. (line 50)
* TARGET_LEGITIMIZE_ADDRESS: Addressing Modes. (line 132)
* TARGET_LIB_INT_CMP_BIASED: Library Calls. (line 35)
* TARGET_LIBCALL_VALUE: Scalar Return. (line 66)
* TARGET_LIBGCC_CMP_RETURN_MODE: Storage Layout. (line 452)
* TARGET_LIBGCC_SDATA_SECTION: Sections. (line 133)
* TARGET_LIBGCC_SHIFT_COUNT_MODE: Storage Layout. (line 458)
* TARGET_LOOP_UNROLL_ADJUST: Misc. (line 805)
* TARGET_MACHINE_DEPENDENT_REORG: Misc. (line 587)
* TARGET_MANGLE_ASSEMBLER_NAME: Label Output. (line 313)
* TARGET_MANGLE_DECL_ASSEMBLER_NAME: Sections. (line 235)
* TARGET_MANGLE_TYPE: Storage Layout. (line 533)
* TARGET_MAX_ANCHOR_OFFSET: Anchored Addresses. (line 39)
* TARGET_MD_ASM_CLOBBERS: Misc. (line 503)
* TARGET_MEM_CONSTRAINT: Addressing Modes. (line 109)
* TARGET_MEM_REF: Storage References. (line 6)
* TARGET_MEMORY_MOVE_COST: Costs. (line 81)
* TARGET_MERGE_DECL_ATTRIBUTES: Target Attributes. (line 47)
* TARGET_MERGE_TYPE_ATTRIBUTES: Target Attributes. (line 39)
* TARGET_MIN_ANCHOR_OFFSET: Anchored Addresses. (line 33)
* TARGET_MIN_DIVISIONS_FOR_RECIP_MUL: Misc. (line 106)
* TARGET_MODE_DEPENDENT_ADDRESS_P: Addressing Modes. (line 196)
* TARGET_MODE_REP_EXTENDED: Misc. (line 191)
* TARGET_MS_BITFIELD_LAYOUT_P: Storage Layout. (line 488)
* TARGET_MUST_PASS_IN_STACK: Register Arguments. (line 62)
* TARGET_MUST_PASS_IN_STACK, and FUNCTION_ARG: Register Arguments.
(line 52)
* TARGET_N_FORMAT_TYPES: Misc. (line 856)
* TARGET_NARROW_VOLATILE_BITFIELD: Storage Layout. (line 396)
* TARGET_OBJC_CONSTRUCT_STRING_OBJECT: Run-time Target. (line 92)
* TARGET_OBJECT_SUFFIX: Misc. (line 732)
* TARGET_OBJFMT_CPP_BUILTINS: Run-time Target. (line 46)
* TARGET_OPTF: Misc. (line 838)
* TARGET_OPTION_DEFAULT_PARAMS: Run-time Target. (line 166)
* TARGET_OPTION_INIT_STRUCT: Run-time Target. (line 163)
* TARGET_OPTION_OPTIMIZATION_TABLE: Run-time Target. (line 149)
* TARGET_OPTION_OVERRIDE: Target Attributes. (line 137)
* TARGET_OPTION_PRAGMA_PARSE: Target Attributes. (line 131)
* TARGET_OPTION_PRINT: Target Attributes. (line 125)
* TARGET_OPTION_RESTORE: Target Attributes. (line 119)
* TARGET_OPTION_SAVE: Target Attributes. (line 113)
* TARGET_OPTION_VALID_ATTRIBUTE_P: Target Attributes. (line 102)
* TARGET_OS_CPP_BUILTINS: Run-time Target. (line 42)
* TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE: Run-time Target. (line 132)
* TARGET_OVERRIDES_FORMAT_ATTRIBUTES: Misc. (line 860)
* TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT: Misc. (line 866)
* TARGET_OVERRIDES_FORMAT_INIT: Misc. (line 870)
* TARGET_PASS_BY_REFERENCE: Register Arguments. (line 103)
* TARGET_PCH_VALID_P: PCH Target. (line 13)
* TARGET_POSIX_IO: Misc. (line 527)
* TARGET_PREFERRED_OUTPUT_RELOAD_CLASS: Register Classes. (line 287)
* TARGET_PREFERRED_RELOAD_CLASS: Register Classes. (line 208)
* TARGET_PREFERRED_RENAME_CLASS: Register Classes. (line 196)
* TARGET_PRETEND_OUTGOING_VARARGS_NAMED: Varargs. (line 128)
* TARGET_PROFILE_BEFORE_PROLOGUE: Sections. (line 294)
* TARGET_PROMOTE_FUNCTION_MODE: Storage Layout. (line 112)
* TARGET_PROMOTE_PROTOTYPES: Stack Arguments. (line 11)
* TARGET_PROMOTED_TYPE: Misc. (line 923)
* TARGET_PTRMEMFUNC_VBIT_LOCATION: Type Layout. (line 277)
* TARGET_REF_MAY_ALIAS_ERRNO: Register Arguments. (line 302)
* TARGET_REGISTER_MOVE_COST: Costs. (line 33)
* TARGET_RELAXED_ORDERING: Misc. (line 875)
* TARGET_RESOLVE_OVERLOADED_BUILTIN: Misc. (line 640)
* TARGET_RETURN_IN_MEMORY: Aggregate Return. (line 17)
* TARGET_RETURN_IN_MSB: Scalar Return. (line 117)
* TARGET_RETURN_POPS_ARGS: Stack Arguments. (line 94)
* TARGET_RTX_COSTS: Costs. (line 271)
* TARGET_SCALAR_MODE_SUPPORTED_P: Register Arguments. (line 310)
* TARGET_SCHED_ADJUST_COST: Scheduling. (line 37)
* TARGET_SCHED_ADJUST_PRIORITY: Scheduling. (line 52)
* TARGET_SCHED_ALLOC_SCHED_CONTEXT: Scheduling. (line 274)
* TARGET_SCHED_CLEAR_SCHED_CONTEXT: Scheduling. (line 289)
* TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK: Scheduling. (line 89)
* TARGET_SCHED_DFA_NEW_CYCLE: Scheduling. (line 235)
* TARGET_SCHED_DFA_POST_ADVANCE_CYCLE: Scheduling. (line 160)
* TARGET_SCHED_DFA_POST_CYCLE_INSN: Scheduling. (line 144)
* TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE: Scheduling. (line 153)
* TARGET_SCHED_DFA_PRE_CYCLE_INSN: Scheduling. (line 132)
* TARGET_SCHED_DISPATCH: Scheduling. (line 355)
* TARGET_SCHED_DISPATCH_DO: Scheduling. (line 360)
* TARGET_SCHED_FINISH: Scheduling. (line 109)
* TARGET_SCHED_FINISH_GLOBAL: Scheduling. (line 126)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BACKTRACK: Scheduling. (line 215)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BEGIN: Scheduling. (line 204)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD: Scheduling.
(line 168)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD: Scheduling.
(line 196)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC: Scheduling.
(line 328)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_END: Scheduling. (line 220)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_FINI: Scheduling. (line 230)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_INIT: Scheduling. (line 225)
* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_ISSUE: Scheduling. (line 210)
* TARGET_SCHED_FREE_SCHED_CONTEXT: Scheduling. (line 293)
* TARGET_SCHED_GEN_SPEC_CHECK: Scheduling. (line 315)
* TARGET_SCHED_H_I_D_EXTENDED: Scheduling. (line 269)
* TARGET_SCHED_INIT: Scheduling. (line 99)
* TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN: Scheduling. (line 149)
* TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN: Scheduling. (line 141)
* TARGET_SCHED_INIT_GLOBAL: Scheduling. (line 118)
* TARGET_SCHED_INIT_SCHED_CONTEXT: Scheduling. (line 279)
* TARGET_SCHED_IS_COSTLY_DEPENDENCE: Scheduling. (line 246)
* TARGET_SCHED_ISSUE_RATE: Scheduling. (line 12)
* TARGET_SCHED_NEEDS_BLOCK_P: Scheduling. (line 308)
* TARGET_SCHED_REORDER: Scheduling. (line 60)
* TARGET_SCHED_REORDER2: Scheduling. (line 77)
* TARGET_SCHED_SET_SCHED_CONTEXT: Scheduling. (line 285)
* TARGET_SCHED_SET_SCHED_FLAGS: Scheduling. (line 340)
* TARGET_SCHED_SMS_RES_MII: Scheduling. (line 346)
* TARGET_SCHED_SPECULATE_INSN: Scheduling. (line 297)
* TARGET_SCHED_VARIABLE_ISSUE: Scheduling. (line 24)
* TARGET_SECONDARY_RELOAD: Register Classes. (line 316)
* TARGET_SECTION_TYPE_FLAGS: File Framework. (line 151)
* TARGET_SET_CURRENT_FUNCTION: Misc. (line 714)
* TARGET_SET_DEFAULT_TYPE_ATTRIBUTES: Target Attributes. (line 34)
* TARGET_SETUP_INCOMING_VARARGS: Varargs. (line 76)
* TARGET_SHIFT_TRUNCATION_MASK: Misc. (line 154)
* TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P: Register Arguments.
(line 328)
* TARGET_SPLIT_COMPLEX_ARG: Register Arguments. (line 252)
* TARGET_STACK_PROTECT_FAIL: Stack Smashing Protection.
(line 17)
* TARGET_STACK_PROTECT_GUARD: Stack Smashing Protection.
(line 7)
* TARGET_STATIC_CHAIN: Frame Registers. (line 92)
* TARGET_STRICT_ARGUMENT_NAMING: Varargs. (line 112)
* TARGET_STRING_OBJECT_REF_TYPE_P: Run-time Target. (line 108)
* TARGET_STRIP_NAME_ENCODING: Sections. (line 282)
* TARGET_STRUCT_VALUE_RTX: Aggregate Return. (line 45)
* TARGET_SUPPORTS_SPLIT_STACK: Stack Smashing Protection.
(line 27)
* TARGET_SUPPORTS_WEAK: Label Output. (line 229)
* TARGET_TERMINATE_DW2_EH_FRAME_INFO: Exception Region Output.
(line 93)
* TARGET_TRAMPOLINE_ADJUST_ADDRESS: Trampolines. (line 75)
* TARGET_TRAMPOLINE_INIT: Trampolines. (line 56)
* TARGET_UNSPEC_MAY_TRAP_P: Misc. (line 706)
* TARGET_UNWIND_TABLES_DEFAULT: Exception Region Output.
(line 74)
* TARGET_UNWIND_WORD_MODE: Storage Layout. (line 464)
* TARGET_UPDATE_STACK_BOUNDARY: Misc. (line 957)
* TARGET_USE_ANCHORS_FOR_SYMBOL_P: Anchored Addresses. (line 55)
* TARGET_USE_BLOCKS_FOR_CONSTANT_P: Addressing Modes. (line 258)
* TARGET_USE_JCR_SECTION: Misc. (line 939)
* TARGET_USES_WEAK_UNWIND_INFO: Exception Handling. (line 129)
* TARGET_VALID_DLLIMPORT_ATTRIBUTE_P: Target Attributes. (line 68)
* TARGET_VALID_POINTER_MODE: Register Arguments. (line 297)
* TARGET_VECTOR_ALIGNMENT: Storage Layout. (line 256)
* TARGET_VECTOR_MODE_SUPPORTED_P: Register Arguments. (line 322)
* TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES: Addressing Modes.
(line 382)
* TARGET_VECTORIZE_BUILTIN_CONVERSION: Addressing Modes. (line 344)
* TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD: Addressing Modes. (line 274)
* TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN: Addressing Modes. (line 300)
* TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD: Addressing Modes. (line 312)
* TARGET_VECTORIZE_BUILTIN_VEC_PERM: Addressing Modes. (line 336)
* TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK: Addressing Modes. (line 340)
* TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST: Addressing Modes.
(line 325)
* TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION: Addressing Modes.
(line 356)
* TARGET_VECTORIZE_PREFERRED_SIMD_MODE: Addressing Modes. (line 375)
* TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT: Addressing Modes.
(line 366)
* TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE: Addressing Modes.
(line 331)
* TARGET_VERSION: Run-time Target. (line 119)
* TARGET_VTABLE_DATA_ENTRY_DISTANCE: Type Layout. (line 330)
* TARGET_VTABLE_ENTRY_ALIGN: Type Layout. (line 324)
* TARGET_VTABLE_USES_DESCRIPTORS: Type Layout. (line 313)
* TARGET_WANT_DEBUG_PUB_SECTIONS: SDB and DWARF. (line 56)
* TARGET_WEAK_NOT_IN_ARCHIVE_TOC: Label Output. (line 265)
* targetm: Target Structure. (line 7)
* targets, makefile: Makefile. (line 6)
* TCmode: Machine Modes. (line 197)
* TDmode: Machine Modes. (line 94)
* TEMPLATE_DECL: Declarations. (line 6)
* Temporaries: Temporaries. (line 6)
* termination routines: Initialization. (line 6)
* testing constraints: C Constraint Interface.
(line 6)
* TEXT_SECTION_ASM_OP: Sections. (line 38)
* TF_SIZE: Type Layout. (line 131)
* TFmode: Machine Modes. (line 98)
* THEN_CLAUSE: Statements for C++. (line 6)
* THREAD_MODEL_SPEC: Driver. (line 163)
* THROW_EXPR: Unary and Binary Expressions.
(line 6)
* THUNK_DECL: Declarations. (line 6)
* THUNK_DELTA: Declarations. (line 6)
* TImode: Machine Modes. (line 48)
* TImode, in insn: Insns. (line 272)
* TLS_COMMON_ASM_OP: Sections. (line 82)
* TLS_SECTION_ASM_FLAG: Sections. (line 87)
* tm.h macros: Target Macros. (line 6)
* TQFmode: Machine Modes. (line 62)
* TQmode: Machine Modes. (line 119)
* TRAMPOLINE_ALIGNMENT: Trampolines. (line 49)
* TRAMPOLINE_SECTION: Trampolines. (line 40)
* TRAMPOLINE_SIZE: Trampolines. (line 45)
* trampolines for nested functions: Trampolines. (line 6)
* TRANSFER_FROM_TRAMPOLINE: Trampolines. (line 123)
* trap instruction pattern: Standard Names. (line 1381)
* tree <1>: Macros and Functions.
(line 6)
* tree: Tree overview. (line 6)
* Tree SSA: Tree SSA. (line 6)
* TREE_CHAIN: Macros and Functions.
(line 6)
* TREE_CODE: Tree overview. (line 6)
* tree_int_cst_equal: Constant expressions.
(line 6)
* TREE_INT_CST_HIGH: Constant expressions.
(line 6)
* TREE_INT_CST_LOW: Constant expressions.
(line 6)
* tree_int_cst_lt: Constant expressions.
(line 6)
* TREE_LIST: Containers. (line 6)
* TREE_OPERAND: Expression trees. (line 6)
* TREE_PUBLIC <1>: Function Properties.
(line 28)
* TREE_PUBLIC: Function Basics. (line 6)
* TREE_PURPOSE: Containers. (line 6)
* TREE_READONLY: Function Properties.
(line 37)
* tree_size: Macros and Functions.
(line 13)
* TREE_STATIC: Function Properties.
(line 31)
* TREE_STRING_LENGTH: Constant expressions.
(line 6)
* TREE_STRING_POINTER: Constant expressions.
(line 6)
* TREE_THIS_VOLATILE: Function Properties.
(line 34)
* TREE_TYPE <1>: Types for C++. (line 6)
* TREE_TYPE <2>: Function Basics. (line 47)
* TREE_TYPE <3>: Expression trees. (line 6)
* TREE_TYPE <4>: Working with declarations.
(line 11)
* TREE_TYPE <5>: Types. (line 6)
* TREE_TYPE: Macros and Functions.
(line 6)
* TREE_VALUE: Containers. (line 6)
* TREE_VEC: Containers. (line 6)
* TREE_VEC_ELT: Containers. (line 6)
* TREE_VEC_LENGTH: Containers. (line 6)
* TRULY_NOOP_TRUNCATION: Misc. (line 177)
* TRUNC_DIV_EXPR: Unary and Binary Expressions.
(line 6)
* TRUNC_MOD_EXPR: Unary and Binary Expressions.
(line 6)
* truncate: Conversions. (line 38)
* truncMN2 instruction pattern: Standard Names. (line 834)
* TRUTH_AND_EXPR: Unary and Binary Expressions.
(line 6)
* TRUTH_ANDIF_EXPR: Unary and Binary Expressions.
(line 6)
* TRUTH_NOT_EXPR: Unary and Binary Expressions.
(line 6)
* TRUTH_OR_EXPR: Unary and Binary Expressions.
(line 6)
* TRUTH_ORIF_EXPR: Unary and Binary Expressions.
(line 6)
* TRUTH_XOR_EXPR: Unary and Binary Expressions.
(line 6)
* TRY_BLOCK: Statements for C++. (line 6)
* TRY_HANDLERS: Statements for C++. (line 6)
* TRY_STMTS: Statements for C++. (line 6)
* Tuple specific accessors: Tuple specific accessors.
(line 6)
* tuples: Tuple representation.
(line 6)
* type: Types. (line 6)
* type declaration: Declarations. (line 6)
* TYPE_ALIGN <1>: Types for C++. (line 6)
* TYPE_ALIGN: Types. (line 6)
* TYPE_ARG_TYPES <1>: Types for C++. (line 6)
* TYPE_ARG_TYPES: Types. (line 6)
* TYPE_ASM_OP: Label Output. (line 67)
* TYPE_ATTRIBUTES: Attributes. (line 25)
* TYPE_BINFO: Classes. (line 6)
* TYPE_BUILT_IN: Types for C++. (line 68)
* TYPE_CANONICAL: Types. (line 6)
* TYPE_CONTEXT <1>: Types for C++. (line 6)
* TYPE_CONTEXT: Types. (line 6)
* TYPE_DECL: Declarations. (line 6)
* TYPE_FIELDS <1>: Classes. (line 6)
* TYPE_FIELDS <2>: Types for C++. (line 6)
* TYPE_FIELDS: Types. (line 6)
* TYPE_HAS_ARRAY_NEW_OPERATOR: Classes. (line 96)
* TYPE_HAS_DEFAULT_CONSTRUCTOR: Classes. (line 81)
* TYPE_HAS_MUTABLE_P: Classes. (line 86)
* TYPE_HAS_NEW_OPERATOR: Classes. (line 93)
* TYPE_MAIN_VARIANT <1>: Types for C++. (line 6)
* TYPE_MAIN_VARIANT: Types. (line 6)
* TYPE_MAX_VALUE: Types. (line 6)
* TYPE_METHOD_BASETYPE <1>: Types for C++. (line 6)
* TYPE_METHOD_BASETYPE: Types. (line 6)
* TYPE_METHODS: Classes. (line 6)
* TYPE_MIN_VALUE: Types. (line 6)
* TYPE_NAME <1>: Types for C++. (line 6)
* TYPE_NAME: Types. (line 6)
* TYPE_NOTHROW_P: Functions for C++. (line 154)
* TYPE_OFFSET_BASETYPE <1>: Types for C++. (line 6)
* TYPE_OFFSET_BASETYPE: Types. (line 6)
* TYPE_OPERAND_FMT: Label Output. (line 78)
* TYPE_OVERLOADS_ARRAY_REF: Classes. (line 104)
* TYPE_OVERLOADS_ARROW: Classes. (line 107)
* TYPE_OVERLOADS_CALL_EXPR: Classes. (line 100)
* TYPE_POLYMORPHIC_P: Classes. (line 77)
* TYPE_PRECISION <1>: Types for C++. (line 6)
* TYPE_PRECISION: Types. (line 6)
* TYPE_PTR_P: Types for C++. (line 74)
* TYPE_PTRFN_P: Types for C++. (line 78)
* TYPE_PTRMEM_P: Types for C++. (line 6)
* TYPE_PTROB_P: Types for C++. (line 81)
* TYPE_PTROBV_P: Types for C++. (line 6)
* TYPE_QUAL_CONST <1>: Types for C++. (line 6)
* TYPE_QUAL_CONST: Types. (line 6)
* TYPE_QUAL_RESTRICT <1>: Types for C++. (line 6)
* TYPE_QUAL_RESTRICT: Types. (line 6)
* TYPE_QUAL_VOLATILE <1>: Types for C++. (line 6)
* TYPE_QUAL_VOLATILE: Types. (line 6)
* TYPE_RAISES_EXCEPTIONS: Functions for C++. (line 149)
* TYPE_SIZE <1>: Types for C++. (line 6)
* TYPE_SIZE: Types. (line 6)
* TYPE_STRUCTURAL_EQUALITY_P: Types. (line 6)
* TYPE_UNQUALIFIED <1>: Types for C++. (line 6)
* TYPE_UNQUALIFIED: Types. (line 6)
* TYPE_VFIELD: Classes. (line 6)
* TYPENAME_TYPE: Types for C++. (line 6)
* TYPENAME_TYPE_FULLNAME <1>: Types for C++. (line 6)
* TYPENAME_TYPE_FULLNAME: Types. (line 6)
* TYPEOF_TYPE: Types for C++. (line 6)
* UDAmode: Machine Modes. (line 168)
* udiv: Arithmetic. (line 130)
* udivM3 instruction pattern: Standard Names. (line 222)
* udivmodM4 instruction pattern: Standard Names. (line 455)
* udot_prodM instruction pattern: Standard Names. (line 292)
* UDQmode: Machine Modes. (line 136)
* UHAmode: Machine Modes. (line 160)
* UHQmode: Machine Modes. (line 128)
* UINT16_TYPE: Type Layout. (line 240)
* UINT32_TYPE: Type Layout. (line 241)
* UINT64_TYPE: Type Layout. (line 242)
* UINT8_TYPE: Type Layout. (line 239)
* UINT_FAST16_TYPE: Type Layout. (line 256)
* UINT_FAST32_TYPE: Type Layout. (line 257)
* UINT_FAST64_TYPE: Type Layout. (line 258)
* UINT_FAST8_TYPE: Type Layout. (line 255)
* UINT_LEAST16_TYPE: Type Layout. (line 248)
* UINT_LEAST32_TYPE: Type Layout. (line 249)
* UINT_LEAST64_TYPE: Type Layout. (line 250)
* UINT_LEAST8_TYPE: Type Layout. (line 247)
* UINTMAX_TYPE: Type Layout. (line 223)
* UINTPTR_TYPE: Type Layout. (line 260)
* umaddMN4 instruction pattern: Standard Names. (line 402)
* umax: Arithmetic. (line 149)
* umaxM3 instruction pattern: Standard Names. (line 222)
* umin: Arithmetic. (line 149)
* uminM3 instruction pattern: Standard Names. (line 222)
* umod: Arithmetic. (line 136)
* umodM3 instruction pattern: Standard Names. (line 222)
* umsubMN4 instruction pattern: Standard Names. (line 426)
* umulhisi3 instruction pattern: Standard Names. (line 374)
* umulM3_highpart instruction pattern: Standard Names. (line 388)
* umulqihi3 instruction pattern: Standard Names. (line 374)
* umulsidi3 instruction pattern: Standard Names. (line 374)
* unchanging: Flags. (line 324)
* unchanging, in call_insn: Flags. (line 19)
* unchanging, in jump_insn, call_insn and insn: Flags. (line 39)
* unchanging, in mem: Flags. (line 152)
* unchanging, in subreg: Flags. (line 188)
* unchanging, in symbol_ref: Flags. (line 10)
* UNEQ_EXPR: Unary and Binary Expressions.
(line 6)
* UNGE_EXPR: Unary and Binary Expressions.
(line 6)
* UNGT_EXPR: Unary and Binary Expressions.
(line 6)
* UNION_TYPE <1>: Classes. (line 6)
* UNION_TYPE: Types. (line 6)
* unions, returning: Interface. (line 10)
* UNITS_PER_WORD: Storage Layout. (line 60)
* UNKNOWN_TYPE <1>: Types for C++. (line 6)
* UNKNOWN_TYPE: Types. (line 6)
* UNLE_EXPR: Unary and Binary Expressions.
(line 6)
* UNLIKELY_EXECUTED_TEXT_SECTION_NAME: Sections. (line 49)
* UNLT_EXPR: Unary and Binary Expressions.
(line 6)
* UNORDERED_EXPR: Unary and Binary Expressions.
(line 6)
* unshare_all_rtl: Sharing. (line 58)
* unsigned division: Arithmetic. (line 130)
* unsigned division with unsigned saturation: Arithmetic. (line 130)
* unsigned greater than: Comparisons. (line 64)
* unsigned less than: Comparisons. (line 68)
* unsigned minimum and maximum: Arithmetic. (line 149)
* unsigned_fix: Conversions. (line 77)
* unsigned_float: Conversions. (line 62)
* unsigned_fract_convert: Conversions. (line 97)
* unsigned_sat_fract: Conversions. (line 103)
* unspec <1>: Constant Definitions.
(line 111)
* unspec: Side Effects. (line 287)
* unspec_volatile <1>: Constant Definitions.
(line 99)
* unspec_volatile: Side Effects. (line 287)
* untyped_call instruction pattern: Standard Names. (line 1012)
* untyped_return instruction pattern: Standard Names. (line 1062)
* UPDATE_PATH_HOST_CANONICALIZE (PATH): Filesystem. (line 59)
* update_ssa: SSA. (line 76)
* update_stmt <1>: SSA Operands. (line 6)
* update_stmt: Manipulating GIMPLE statements.
(line 141)
* update_stmt_if_modified: Manipulating GIMPLE statements.
(line 144)
* UQQmode: Machine Modes. (line 123)
* us_ashift: Arithmetic. (line 173)
* us_minus: Arithmetic. (line 36)
* us_mult: Arithmetic. (line 92)
* us_neg: Arithmetic. (line 81)
* us_plus: Arithmetic. (line 14)
* us_truncate: Conversions. (line 48)
* usaddM3 instruction pattern: Standard Names. (line 222)
* USAmode: Machine Modes. (line 164)
* usashlM3 instruction pattern: Standard Names. (line 458)
* usdivM3 instruction pattern: Standard Names. (line 222)
* use: Side Effects. (line 162)
* USE_C_ALLOCA: Host Misc. (line 19)
* USE_LD_AS_NEEDED: Driver. (line 136)
* USE_LOAD_POST_DECREMENT: Costs. (line 226)
* USE_LOAD_POST_INCREMENT: Costs. (line 221)
* USE_LOAD_PRE_DECREMENT: Costs. (line 236)
* USE_LOAD_PRE_INCREMENT: Costs. (line 231)
* use_param: GTY Options. (line 109)
* use_paramN: GTY Options. (line 127)
* use_params: GTY Options. (line 135)
* USE_SELECT_SECTION_FOR_FUNCTIONS: Sections. (line 195)
* USE_STORE_POST_DECREMENT: Costs. (line 246)
* USE_STORE_POST_INCREMENT: Costs. (line 241)
* USE_STORE_PRE_DECREMENT: Costs. (line 256)
* USE_STORE_PRE_INCREMENT: Costs. (line 251)
* used: Flags. (line 342)
* used, in symbol_ref: Flags. (line 215)
* USER_LABEL_PREFIX: Instruction Output. (line 154)
* USING_STMT: Statements for C++. (line 6)
* usmaddMN4 instruction pattern: Standard Names. (line 410)
* usmsubMN4 instruction pattern: Standard Names. (line 434)
* usmulhisi3 instruction pattern: Standard Names. (line 378)
* usmulM3 instruction pattern: Standard Names. (line 222)
* usmulqihi3 instruction pattern: Standard Names. (line 378)
* usmulsidi3 instruction pattern: Standard Names. (line 378)
* usnegM2 instruction pattern: Standard Names. (line 476)
* USQmode: Machine Modes. (line 132)
* ussubM3 instruction pattern: Standard Names. (line 222)
* usum_widenM3 instruction pattern: Standard Names. (line 302)
* UTAmode: Machine Modes. (line 172)
* UTQmode: Machine Modes. (line 140)
* V in constraint: Simple Constraints. (line 43)
* VA_ARG_EXPR: Unary and Binary Expressions.
(line 6)
* values, returned by functions: Scalar Return. (line 6)
* VAR_DECL: Declarations. (line 6)
* var_location: Debug Information. (line 14)
* varargs implementation: Varargs. (line 6)
* variable: Declarations. (line 6)
* Variable Location Debug Information in RTL: Debug Information.
(line 6)
* variable_size: GTY Options. (line 225)
* vashlM3 instruction pattern: Standard Names. (line 472)
* vashrM3 instruction pattern: Standard Names. (line 472)
* vec_concat: Vector Operations. (line 28)
* vec_duplicate: Vector Operations. (line 33)
* VEC_EXTRACT_EVEN_EXPR: Vectors. (line 6)
* vec_extract_evenM instruction pattern: Standard Names. (line 176)
* VEC_EXTRACT_ODD_EXPR: Vectors. (line 6)
* vec_extract_oddM instruction pattern: Standard Names. (line 183)
* vec_extractM instruction pattern: Standard Names. (line 171)
* vec_initM instruction pattern: Standard Names. (line 204)
* VEC_INTERLEAVE_HIGH_EXPR: Vectors. (line 6)
* vec_interleave_highM instruction pattern: Standard Names. (line 190)
* VEC_INTERLEAVE_LOW_EXPR: Vectors. (line 6)
* vec_interleave_lowM instruction pattern: Standard Names. (line 197)
* VEC_LSHIFT_EXPR: Vectors. (line 6)
* vec_merge: Vector Operations. (line 11)
* VEC_PACK_FIX_TRUNC_EXPR: Vectors. (line 6)
* VEC_PACK_SAT_EXPR: Vectors. (line 6)
* vec_pack_sfix_trunc_M instruction pattern: Standard Names. (line 329)
* vec_pack_ssat_M instruction pattern: Standard Names. (line 322)
* VEC_PACK_TRUNC_EXPR: Vectors. (line 6)
* vec_pack_trunc_M instruction pattern: Standard Names. (line 315)
* vec_pack_ufix_trunc_M instruction pattern: Standard Names. (line 329)
* vec_pack_usat_M instruction pattern: Standard Names. (line 322)
* VEC_RSHIFT_EXPR: Vectors. (line 6)
* vec_select: Vector Operations. (line 19)
* vec_setM instruction pattern: Standard Names. (line 166)
* vec_shl_M instruction pattern: Standard Names. (line 309)
* vec_shr_M instruction pattern: Standard Names. (line 309)
* VEC_UNPACK_FLOAT_HI_EXPR: Vectors. (line 6)
* VEC_UNPACK_FLOAT_LO_EXPR: Vectors. (line 6)
* VEC_UNPACK_HI_EXPR: Vectors. (line 6)
* VEC_UNPACK_LO_EXPR: Vectors. (line 6)
* vec_unpacks_float_hi_M instruction pattern: Standard Names.
(line 351)
* vec_unpacks_float_lo_M instruction pattern: Standard Names.
(line 351)
* vec_unpacks_hi_M instruction pattern: Standard Names. (line 336)
* vec_unpacks_lo_M instruction pattern: Standard Names. (line 336)
* vec_unpacku_float_hi_M instruction pattern: Standard Names.
(line 351)
* vec_unpacku_float_lo_M instruction pattern: Standard Names.
(line 351)
* vec_unpacku_hi_M instruction pattern: Standard Names. (line 344)
* vec_unpacku_lo_M instruction pattern: Standard Names. (line 344)
* VEC_WIDEN_MULT_HI_EXPR: Vectors. (line 6)
* VEC_WIDEN_MULT_LO_EXPR: Vectors. (line 6)
* vec_widen_smult_hi_M instruction pattern: Standard Names. (line 360)
* vec_widen_smult_lo_M instruction pattern: Standard Names. (line 360)
* vec_widen_umult_hi_M instruction pattern: Standard Names. (line 360)
* vec_widen_umult_lo__M instruction pattern: Standard Names. (line 360)
* vector: Containers. (line 6)
* vector operations: Vector Operations. (line 6)
* VECTOR_CST: Constant expressions.
(line 6)
* VECTOR_STORE_FLAG_VALUE: Misc. (line 308)
* virtual operands: SSA Operands. (line 6)
* VIRTUAL_INCOMING_ARGS_REGNUM: Regs and Memory. (line 59)
* VIRTUAL_OUTGOING_ARGS_REGNUM: Regs and Memory. (line 87)
* VIRTUAL_STACK_DYNAMIC_REGNUM: Regs and Memory. (line 78)
* VIRTUAL_STACK_VARS_REGNUM: Regs and Memory. (line 69)
* VLIW: Processor pipeline description.
(line 6)
* vlshrM3 instruction pattern: Standard Names. (line 472)
* VMS: Filesystem. (line 37)
* VMS_DEBUGGING_INFO: VMS Debug. (line 9)
* VOID_TYPE: Types. (line 6)
* VOIDmode: Machine Modes. (line 190)
* volatil: Flags. (line 356)
* volatil, in insn, call_insn, jump_insn, code_label, barrier, and note: Flags.
(line 44)
* volatil, in label_ref and reg_label: Flags. (line 65)
* volatil, in mem, asm_operands, and asm_input: Flags. (line 94)
* volatil, in reg: Flags. (line 116)
* volatil, in subreg: Flags. (line 188)
* volatil, in symbol_ref: Flags. (line 224)
* volatile memory references: Flags. (line 357)
* volatile, in prefetch: Flags. (line 232)
* voting between constraint alternatives: Class Preferences. (line 6)
* vrotlM3 instruction pattern: Standard Names. (line 472)
* vrotrM3 instruction pattern: Standard Names. (line 472)
* walk_dominator_tree: SSA. (line 256)
* walk_gimple_op: Statement and operand traversals.
(line 32)
* walk_gimple_seq: Statement and operand traversals.
(line 50)
* walk_gimple_stmt: Statement and operand traversals.
(line 13)
* walk_use_def_chains: SSA. (line 232)
* WCHAR_TYPE: Type Layout. (line 191)
* WCHAR_TYPE_SIZE: Type Layout. (line 199)
* which_alternative: Output Statement. (line 59)
* WHILE_BODY: Statements for C++. (line 6)
* WHILE_COND: Statements for C++. (line 6)
* WHILE_STMT: Statements for C++. (line 6)
* whopr: LTO. (line 6)
* WIDEST_HARDWARE_FP_SIZE: Type Layout. (line 146)
* WINT_TYPE: Type Layout. (line 204)
* word_mode: Machine Modes. (line 336)
* WORD_REGISTER_OPERATIONS: Misc. (line 63)
* WORDS_BIG_ENDIAN: Storage Layout. (line 29)
* WORDS_BIG_ENDIAN, effect on subreg: Regs and Memory. (line 217)
* wpa: LTO. (line 6)
* X in constraint: Simple Constraints. (line 124)
* x-HOST: Host Fragment. (line 6)
* XCmode: Machine Modes. (line 197)
* XCOFF_DEBUGGING_INFO: DBX Options. (line 13)
* XEXP: Accessors. (line 6)
* XF_SIZE: Type Layout. (line 130)
* XFmode: Machine Modes. (line 79)
* XINT: Accessors. (line 6)
* xm-MACHINE.h <1>: Host Misc. (line 6)
* xm-MACHINE.h: Filesystem. (line 6)
* xor: Arithmetic. (line 168)
* xor, canonicalization of: Insn Canonicalizations.
(line 79)
* xorM3 instruction pattern: Standard Names. (line 222)
* XSTR: Accessors. (line 6)
* XVEC: Accessors. (line 41)
* XVECEXP: Accessors. (line 48)
* XVECLEN: Accessors. (line 44)
* XWINT: Accessors. (line 6)
* zero_extend: Conversions. (line 28)
* zero_extendMN2 instruction pattern: Standard Names. (line 844)
* zero_extract: Bit-Fields. (line 30)
* zero_extract, canonicalization of: Insn Canonicalizations.
(line 88)
Tag Table:
Node: Top2055
Node: Contributing5143
Node: Portability5884
Node: Interface7672
Node: Libgcc10712
Node: Integer library routines12553
Node: Soft float library routines19392
Node: Decimal float library routines31329
Node: Fixed-point fractional library routines47086
Node: Exception handling routines147484
Node: Miscellaneous routines148591
Node: Languages150711
Node: Source Tree152260
Node: Configure Terms152842
Node: Top Level155800
Node: gcc Directory159112
Node: Subdirectories160062
Node: Configuration161934
Node: Config Fragments162654
Node: System Config163883
Node: Configuration Files164819
Node: Build167176
Node: Makefile167588
Ref: Makefile-Footnote-1174391
Ref: Makefile-Footnote-2174536
Node: Library Files174608
Node: Headers175170
Node: Documentation177253
Node: Texinfo Manuals178112
Node: Man Page Generation180456
Node: Miscellaneous Docs182371
Node: Front End183760
Node: Front End Directory187453
Node: Front End Config188773
Node: Front End Makefile191715
Node: Back End195497
Node: Testsuites199176
Node: Test Idioms200107
Node: Test Directives203504
Node: Directives204031
Node: Selectors214099
Node: Effective-Target Keywords215241
Ref: arm_neon_ok222474
Ref: arm_neon_fp16_ok222635
Node: Add Options231831
Node: Require Support233028
Node: Final Actions235535
Node: Ada Tests239598
Node: C Tests240940
Node: libgcj Tests245363
Node: LTO Testing246490
Node: gcov Testing248137
Node: profopt Testing251124
Node: compat Testing252839
Node: Torture Tests257079
Node: Options258696
Node: Option file format259136
Node: Option properties266107
Node: Passes277661
Node: Parsing pass278405
Node: Gimplification pass281935
Node: Pass manager283768
Node: Tree SSA passes285562
Node: RTL passes308034
Node: RTL320377
Node: RTL Objects322565
Node: RTL Classes326439
Node: Accessors331437
Node: Special Accessors333831
Node: Flags339197
Node: Machine Modes355372
Node: Constants367684
Node: Regs and Memory373713
Node: Arithmetic391614
Node: Comparisons401441
Node: Bit-Fields405733
Node: Vector Operations407285
Node: Conversions409120
Node: RTL Declarations413618
Node: Side Effects414439
Node: Incdec430761
Node: Assembler434096
Node: Debug Information435641
Node: Insns436839
Node: Calls463039
Node: Sharing465632
Node: Reading RTL468742
Node: GENERIC469734
Node: Deficiencies471607
Node: Tree overview471848
Node: Macros and Functions475975
Node: Identifiers476800
Node: Containers478411
Node: Types479568
Node: Declarations491664
Node: Working with declarations492159
Node: Internal structure497765
Node: Current structure hierarchy498149
Node: Adding new DECL node types500243
Node: Attributes504316
Node: Expression trees505561
Node: Constant expressions507314
Node: Storage References511533
Node: Unary and Binary Expressions515052
Node: Vectors534470
Node: Statements539399
Node: Basic Statements539919
Node: Blocks544426
Node: Statement Sequences545830
Node: Empty Statements546163
Node: Jumps546737
Node: Cleanups547390
Node: OpenMP549158
Node: Functions554905
Node: Function Basics555376
Node: Function Properties559061
Node: Language-dependent trees561843
Node: C and C++ Trees562729
Node: Types for C++565633
Node: Namespaces570599
Node: Classes573706
Node: Functions for C++578784
Node: Statements for C++585037
Node: C++ Expressions593085
Node: Java Trees594586
Node: GIMPLE594699
Node: Tuple representation598320
Node: GIMPLE instruction set606596
Node: GIMPLE Exception Handling608264
Node: Temporaries610178
Ref: Temporaries-Footnote-1611493
Node: Operands611556
Node: Compound Expressions612318
Node: Compound Lvalues612552
Node: Conditional Expressions613314
Node: Logical Operators613972
Node: Manipulating GIMPLE statements620729
Node: Tuple specific accessors626663
Node: `GIMPLE_ASM'627482
Node: `GIMPLE_ASSIGN'630115
Node: `GIMPLE_BIND'634221
Node: `GIMPLE_CALL'636028
Node: `GIMPLE_CATCH'640298
Node: `GIMPLE_COND'641442
Node: `GIMPLE_DEBUG'644230
Node: `GIMPLE_EH_FILTER'647613
Node: `GIMPLE_LABEL'649101
Node: `GIMPLE_NOP'650076
Node: `GIMPLE_OMP_ATOMIC_LOAD'650445
Node: `GIMPLE_OMP_ATOMIC_STORE'651355
Node: `GIMPLE_OMP_CONTINUE'651994
Node: `GIMPLE_OMP_CRITICAL'653344
Node: `GIMPLE_OMP_FOR'654281
Node: `GIMPLE_OMP_MASTER'657796
Node: `GIMPLE_OMP_ORDERED'658179
Node: `GIMPLE_OMP_PARALLEL'658579
Node: `GIMPLE_OMP_RETURN'661351
Node: `GIMPLE_OMP_SECTION'662001
Node: `GIMPLE_OMP_SECTIONS'662667
Node: `GIMPLE_OMP_SINGLE'664273
Node: `GIMPLE_PHI'665210
Node: `GIMPLE_RESX'666625
Node: `GIMPLE_RETURN'667344
Node: `GIMPLE_SWITCH'667912
Node: `GIMPLE_TRY'670050
Node: `GIMPLE_WITH_CLEANUP_EXPR'671840
Node: GIMPLE sequences672723
Node: Sequence iterators675929
Node: Adding a new GIMPLE statement code684385
Node: Statement and operand traversals685661
Node: Tree SSA688261
Node: Annotations690047
Node: SSA Operands690573
Node: SSA705104
Node: Alias analysis717395
Node: Memory model721175
Node: Loop Analysis and Representation722538
Node: Loop representation723719
Node: Loop querying730639
Node: Loop manipulation733472
Node: LCSSA735840
Node: Scalar evolutions737912
Node: loop-iv741156
Node: Number of iterations743082
Node: Dependency analysis745891
Node: Lambda752259
Node: Omega753930
Node: Control Flow755495
Node: Basic Blocks756490
Node: Edges761058
Node: Profile information769620
Node: Maintaining the CFG774306
Node: Liveness information781183
Node: Machine Desc783309
Node: Overview785777
Node: Patterns787818
Node: Example791256
Node: RTL Template792691
Node: Output Template803346
Node: Output Statement807311
Node: Predicates811273
Node: Machine-Independent Predicates814191
Node: Defining Predicates819136
Node: Constraints825101
Node: Simple Constraints826583
Node: Multi-Alternative839439
Node: Class Preferences842280
Node: Modifiers843172
Node: Machine Constraints847304
Node: Disable Insn Alternatives886458
Node: Define Constraints889351
Node: C Constraint Interface896132
Node: Standard Names899773
Ref: shift patterns919714
Ref: prologue instruction pattern960348
Ref: epilogue instruction pattern960841
Node: Pattern Ordering970563
Node: Dependent Patterns971799
Node: Jump Patterns973419
Ref: Jump Patterns-Footnote-1975563
Node: Looping Patterns975609
Node: Insn Canonicalizations980337
Node: Expander Definitions984288
Node: Insn Splitting992406
Node: Including Patterns1002008
Node: Peephole Definitions1003788
Node: define_peephole1005041
Node: define_peephole21011372
Node: Insn Attributes1014439
Node: Defining Attributes1015545
Ref: define_enum_attr1018064
Node: Expressions1019099
Node: Tagging Insns1025701
Node: Attr Example1030054
Node: Insn Lengths1032428
Node: Constant Attributes1035487
Node: Delay Slots1036656
Node: Processor pipeline description1039880
Ref: Processor pipeline description-Footnote-11057498
Node: Conditional Execution1057820
Node: Constant Definitions1060673
Ref: define_enum1064464
Node: Iterators1064952
Node: Mode Iterators1065399
Node: Defining Mode Iterators1066377
Node: Substitutions1067871
Node: Examples1070112
Node: Code Iterators1071560
Node: Target Macros1073817
Node: Target Structure1076905
Node: Driver1078174
Node: Run-time Target1097560
Node: Per-Function Data1107197
Node: Storage Layout1109962
Node: Type Layout1135593
Node: Registers1150064
Node: Register Basics1151038
Node: Allocation Order1156543
Node: Values in Registers1158989
Node: Leaf Functions1166478
Node: Stack Registers1169336
Node: Register Classes1170608
Node: Old Constraints1199755
Node: Stack and Calling1206907
Node: Frame Layout1207441
Node: Exception Handling1218321
Node: Stack Checking1224699
Node: Frame Registers1229512
Node: Elimination1237178
Node: Stack Arguments1241407
Node: Register Arguments1248304
Node: Scalar Return1267084
Node: Aggregate Return1273163
Node: Caller Saves1277373
Node: Function Entry1278551
Node: Profiling1291179
Node: Tail Calls1292878
Node: Stack Smashing Protection1294244
Node: Varargs1295869
Node: Trampolines1302555
Node: Library Calls1309202
Node: Addressing Modes1313403
Node: Anchored Addresses1332419
Node: Condition Code1335068
Node: CC0 Condition Codes1337197
Node: MODE_CC Condition Codes1340443
Node: Cond Exec Macros1346670
Node: Costs1347647
Node: Scheduling1363858
Node: Sections1382779
Node: PIC1398080
Node: Assembler Format1400140
Node: File Framework1401278
Ref: TARGET_HAVE_SWITCHABLE_BSS_SECTIONS1408167
Node: Data Output1411432
Node: Uninitialized Data1419781
Node: Label Output1425345
Node: Initialization1448417
Node: Macros for Initialization1454379
Node: Instruction Output1461102
Node: Dispatch Tables1471604
Node: Exception Region Output1475982
Node: Alignment Output1482326
Node: Debugging Info1486871
Node: All Debuggers1487541
Node: DBX Options1490396
Node: DBX Hooks1495845
Node: File Names and DBX1497771
Node: SDB and DWARF1499883
Node: VMS Debug1505730
Node: Floating Point1506317
Node: Mode Switching1511140
Node: Target Attributes1515066
Node: Emulated TLS1522978
Node: MIPS Coprocessors1526368
Node: PCH Target1527937
Node: C++ ABI1529479
Node: Named Address Spaces1534128
Node: Misc1539067
Ref: TARGET_SHIFT_TRUNCATION_MASK1546495
Node: Host Config1589463
Node: Host Common1590531
Node: Filesystem1592910
Node: Host Misc1597025
Node: Fragments1599474
Node: Target Fragment1600669
Node: Host Fragment1609622
Node: Collect21609862
Node: Header Dirs1612498
Node: Type Information1613921
Node: GTY Options1616278
Node: GGC Roots1627968
Node: Files1628688
Node: Invoking the garbage collector1631434
Node: Troubleshooting1632937
Node: Plugins1634013
Node: LTO1650384
Node: Funding1675430
Node: GNU Project1677913
Node: Copying1678562
Node: GNU Free Documentation License1716093
Node: Contributors1741233
Node: Option Index1778105
Node: Concept Index1778909
End Tag Table
|