[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / rts / StgMiscClosures.hc
1 /* -----------------------------------------------------------------------------
2  * $Id: StgMiscClosures.hc,v 1.2 1998/12/02 13:28:52 simonm Exp $
3  *
4  * Entry code for various built-in closure types.
5  *
6  * ---------------------------------------------------------------------------*/
7
8 #include "Rts.h"
9 #include "RtsUtils.h"
10 #include "StgMiscClosures.h"
11 #include "HeapStackCheck.h"   /* for stg_gen_yield */
12
13 #ifdef HAVE_STDIO_H
14 #include <stdio.h>
15 #endif
16
17 /* -----------------------------------------------------------------------------
18    Entry code for an indirection.
19
20    This code assumes R1 is in a register for now.
21    -------------------------------------------------------------------------- */
22
23 INFO_TABLE(IND_info,IND_entry,1,0,IND,const,EF_,0,0);
24 STGFUN(IND_entry)
25 {
26     FB_
27     TICK_ENT_IND(Node); /* tick */
28
29     R1.p = (P_) ((StgInd*)R1.p)->indirectee;
30     TICK_ENT_VIA_NODE();
31     JMP_(*R1.p);
32     FE_
33 }
34
35 INFO_TABLE(IND_STATIC_info,IND_STATIC_entry,1,0,IND_STATIC,const,EF_,0,0);
36 STGFUN(IND_STATIC_entry)
37 {
38     FB_
39     TICK_ENT_IND(Node); /* tick */
40   
41     R1.p = (P_) ((StgIndStatic*)R1.p)->indirectee;
42     TICK_ENT_VIA_NODE();
43     JMP_(*R1.p);
44     FE_
45 }
46
47 INFO_TABLE(IND_PERM_info,IND_PERM_entry,1,0,IND_PERM,const,EF_,0,0);
48 STGFUN(IND_PERM_entry)
49 {
50     FB_
51     /* Don't add INDs to granularity cost */
52
53     /* Dont: ENT_IND(Node); for ticky-ticky; this ind is here only to help profi
54 ling */
55
56     /* Enter PAP cost centre -- lexical scoping only */
57     ENTER_CCS_PAP_CL(R1.cl);
58
59     R1.p = (P_) ((StgInd*)R1.p)->indirectee;
60
61     /* Dont: TICK_ENT_VIA_NODE(); for ticky-ticky; as above */
62
63     JMP_(*R1.p);
64     FE_
65 }  
66
67 INFO_TABLE(IND_OLDGEN_info,IND_OLDGEN_entry,1,0,IND_OLDGEN,const,EF_,0,0);
68 STGFUN(IND_OLDGEN_entry)
69 {
70     FB_
71     TICK_ENT_IND(Node); /* tick */
72   
73     R1.p = (P_) ((StgInd*)R1.p)->indirectee;
74     TICK_ENT_VIA_NODE();
75     JMP_(*R1.p);
76     FE_
77 }
78
79 INFO_TABLE(IND_OLDGEN_PERM_info,IND_OLDGEN_PERM_entry,1,0,IND_OLDGEN_PERM,const,EF_,0,0);
80 STGFUN(IND_OLDGEN_PERM_entry)
81 {
82     FB_
83     TICK_ENT_IND(Node); /* tick */
84   
85     R1.p = (P_) ((StgInd*)R1.p)->indirectee;
86     TICK_ENT_VIA_NODE();
87     JMP_(*R1.p);
88     FE_
89 }
90
91 /* -----------------------------------------------------------------------------
92    Entry code for CAFs
93
94    This code assumes R1 is in a register for now.
95    -------------------------------------------------------------------------- */
96
97 INFO_TABLE(CAF_UNENTERED_info,CAF_UNENTERED_entry,1,2,CAF_UNENTERED,const,EF_,0,0);
98 STGFUN(CAF_UNENTERED_entry)
99 {
100     FB_
101     /* ToDo: implement directly in GHC */
102     Sp -= 1;
103     Sp[0] = R1.w;
104     JMP_(stg_yield_to_Hugs);
105     FE_
106 }
107
108 INFO_TABLE(CAF_ENTERED_info,CAF_ENTERED_entry,2,1,CAF_ENTERED,const,EF_,0,0);
109 STGFUN(CAF_ENTERED_entry)
110 {
111     FB_
112     TICK_ENT_CAF_ENTERED(Node); /* tick */
113
114     R1.p = (P_) ((StgCAF*)R1.p)->value; /* just a fancy indirection */
115     TICK_ENT_VIA_NODE();
116     JMP_(GET_ENTRY(R1.cl));
117     FE_
118 }
119
120 /* -----------------------------------------------------------------------------
121    Entry code for a black hole.
122
123    Entering a black hole normally causes a cyclic data dependency, but
124    in the concurrent world, black holes are synchronization points,
125    and they are turned into blocking queues when there are threads
126    waiting for the evaluation of the closure to finish.
127    -------------------------------------------------------------------------- */
128
129 /* Note: a black hole must be big enough to be overwritten with an
130  * indirection/evacuee/catch.  Thus we claim it has 2 non-pointer words of
131  * payload, which should be big enough for an old-generation
132  * indirection.  
133  */
134
135 INFO_TABLE(BLACKHOLE_info, BLACKHOLE_entry,0,2,BLACKHOLE,const,EF_,0,0);
136 STGFUN(BLACKHOLE_entry)
137 {
138   FB_
139     /* Put ourselves on the blocking queue for this black hole */
140     CurrentTSO->link = ((StgBlackHole *)R1.p)->blocking_queue;
141     ((StgBlackHole *)R1.p)->blocking_queue = CurrentTSO;
142
143     /* stg_gen_block is too heavyweight, use a specialised one */
144     BLOCK_NP(1);
145   FE_
146 }
147
148 /* identical to BLACKHOLEs except for the infotag */
149 INFO_TABLE(CAF_BLACKHOLE_info, CAF_BLACKHOLE_entry,0,2,CAF_BLACKHOLE,const,EF_,0,0);
150 STGFUN(CAF_BLACKHOLE_entry)
151 {
152   FB_
153     /* Put ourselves on the blocking queue for this black hole */
154     CurrentTSO->link = ((StgBlackHole *)R1.p)->blocking_queue;
155     ((StgBlackHole *)R1.p)->blocking_queue = CurrentTSO;
156
157     /* stg_gen_block is too heavyweight, use a specialised one */
158     BLOCK_NP(1);
159   FE_
160 }
161
162 /* -----------------------------------------------------------------------------
163    The code for a BCO returns to the scheduler
164    -------------------------------------------------------------------------- */
165 INFO_TABLE(BCO_info,BCO_entry,0,0,BCO,const,EF_,0,0);
166 EF_(BCO_entry) {                                
167   FB_   
168     Sp -= 1;
169     Sp[0] = R1.w;
170     JMP_(stg_yield_to_Hugs);
171   FE_                                                           
172 }
173
174 /* -----------------------------------------------------------------------------
175    Some static info tables for things that don't get entered, and
176    therefore don't need entry code (i.e. boxed but unpointed objects)
177    -------------------------------------------------------------------------- */
178
179 #define NON_ENTERABLE_ENTRY_CODE(type)                                  \
180 STGFUN(type##_entry)                                                    \
181 {                                                                       \
182   FB_                                                                   \
183     STGCALL1(fflush,stdout);                                            \
184     STGCALL2(fprintf,stderr,#type " object entered!\n");                \
185     STGCALL1(raiseError, errorHandler);                                 \
186     stg_exit(EXIT_FAILURE); /* not executed */                          \
187   FE_                                                                   \
188 }
189
190 INFO_TABLE(TSO_info, TSO_entry, 0,0,TSO,const,EF_,0,0);
191 NON_ENTERABLE_ENTRY_CODE(TSO);
192
193 /* -----------------------------------------------------------------------------
194    Evacuees are left behind by the garbage collector.  Any attempt to enter
195    one is a real bug.
196    -------------------------------------------------------------------------- */
197
198 INFO_TABLE(EVACUATED_info,EVACUATED_entry,1,0,EVACUATED,const,EF_,0,0);
199 NON_ENTERABLE_ENTRY_CODE(EVACUATED);
200
201 /* -----------------------------------------------------------------------------
202    Weak pointers
203
204    Live weak pointers have a special closure type.  Dead ones are just
205    nullary constructors (although they live on the heap - we overwrite
206    live weak pointers with dead ones).
207    -------------------------------------------------------------------------- */
208
209 INFO_TABLE(WEAK_info,WEAK_entry,0,4,WEAK,const,EF_,0,0);
210 NON_ENTERABLE_ENTRY_CODE(WEAK);
211
212 INFO_TABLE_CONSTR(DEAD_WEAK_info,DEAD_WEAK_entry,0,1,0,CONSTR,const,EF_,0,0);
213 NON_ENTERABLE_ENTRY_CODE(DEAD_WEAK);
214
215 /* -----------------------------------------------------------------------------
216    Foreign Objects are unlifted and therefore never entered.
217    -------------------------------------------------------------------------- */
218
219 INFO_TABLE(FOREIGN_info,FOREIGN_entry,0,1,FOREIGN,const,EF_,0,0);
220 NON_ENTERABLE_ENTRY_CODE(FOREIGN);
221
222 /* -----------------------------------------------------------------------------
223    MVars
224
225    There are two kinds of these: full and empty.  We need an info table
226    and entry code for each type.
227    -------------------------------------------------------------------------- */
228
229 INFO_TABLE(FULL_MVAR_info,FULL_MVAR_entry,3,0,MVAR,const,EF_,0,0);
230 NON_ENTERABLE_ENTRY_CODE(FULL_MVAR);
231
232 INFO_TABLE(EMPTY_MVAR_info,EMPTY_MVAR_entry,3,0,MVAR,const,EF_,0,0);
233 NON_ENTERABLE_ENTRY_CODE(EMPTY_MVAR);
234
235 /* -----------------------------------------------------------------------------
236    END_TSO_QUEUE
237
238    This is a static nullary constructor (like []) that we use to mark the
239    end of a linked TSO queue.
240    -------------------------------------------------------------------------- */
241
242 INFO_TABLE_CONSTR(END_TSO_QUEUE_info,END_TSO_QUEUE_entry,0,0,0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
243 NON_ENTERABLE_ENTRY_CODE(END_TSO_QUEUE);
244
245 SET_STATIC_HDR(END_TSO_QUEUE_closure,END_TSO_QUEUE_info,0/*CC*/,const,EI_)
246 };
247
248 /* -----------------------------------------------------------------------------
249    Arrays
250
251    These come in two basic flavours: arrays of data (StgArrWords) and arrays of
252    pointers (StgArrPtrs).  They all have a similar layout:
253
254         ___________________________
255         | Info | No. of | data....
256         |  Ptr | Words  |
257         ---------------------------
258
259    These are *unpointed* objects: i.e. they cannot be entered.
260
261    -------------------------------------------------------------------------- */
262
263 #define ArrayInfo(type)                                                 \
264 INFO_TABLE(type##_info, type##_entry, 0, 0, type, const, EF_,0,0);      \
265 NON_ENTERABLE_ENTRY_CODE(type);
266
267 ArrayInfo(ARR_WORDS);
268 ArrayInfo(MUT_ARR_WORDS);
269 ArrayInfo(ARR_PTRS);
270 ArrayInfo(MUT_ARR_PTRS);
271 ArrayInfo(MUT_ARR_PTRS_FROZEN);
272
273 #undef ArrayInfo
274
275 /* -----------------------------------------------------------------------------
276    Mutable Variables
277    -------------------------------------------------------------------------- */
278
279 INFO_TABLE(MUT_VAR_info, MUT_VAR_entry, 1, 0, MUT_VAR, const, EF_, 0, 0);
280 NON_ENTERABLE_ENTRY_CODE(MUT_VAR);
281
282 /* -----------------------------------------------------------------------------
283    Standard Error Entry.
284
285    This is used for filling in vector-table entries that can never happen,
286    for instance.
287    -------------------------------------------------------------------------- */
288
289 STGFUN(stg_error_entry)                                                 \
290 {                                                                       \
291   FB_                                                                   \
292     STGCALL1(fflush,stdout);                                            \
293     STGCALL2(fprintf,stderr,"fatal: stg_error_entry");                  \
294     STGCALL1(raiseError, errorHandler);                                 \
295     exit(EXIT_FAILURE); /* not executed */                              \
296   FE_                                                                   \
297 }
298
299 /* -----------------------------------------------------------------------------
300    Dummy return closure
301  
302    Entering this closure will just return to the address on the top of the
303    stack.  Useful for getting a thread in a canonical form where we can
304    just enter the top stack word to start the thread.  (see deleteThread)
305  * -------------------------------------------------------------------------- */
306
307 INFO_TABLE(dummy_ret_info, dummy_ret_entry, 0, 0, CONSTR_NOCAF_STATIC, const, EF_, 0, 0);
308 FN_(dummy_ret_entry)
309 {
310   W_ ret_addr;
311   FB_
312   ret_addr = Sp[0];
313   Sp++;
314   JMP_(ENTRY_CODE(ret_addr));
315 }
316 SET_STATIC_HDR(dummy_ret_closure,dummy_ret_info,CCS_DONTZuCARE,const,EI_)
317 };
318
319 /* -----------------------------------------------------------------------------
320    Standard Infotables (for use in interpreter)
321    -------------------------------------------------------------------------- */
322
323 #ifdef INTERPRETER
324
325 STGFUN(Hugs_CONSTR_entry)
326 {
327     Sp -= 1;
328     ((StgPtr*)Sp)[0] = R1.p;
329     /* vectored: JMP_(RET_VEC(((StgPtr*)Sp)[1],constrTag(?))); */
330     JMP_(ENTRY_CODE(((StgPtr*)Sp)[1]));
331 }
332
333 #define RET_BCO_ENTRY_TEMPLATE(label)   \
334    IFN_(label)                          \
335    {                                    \
336       FB_                               \
337       Sp -= 1;                          \
338       ((StgPtr*)Sp)[0] = R1.p;          \
339       JMP_(stg_yield_to_Hugs);          \
340       FE_                               \
341    }
342
343 RET_BCO_ENTRY_TEMPLATE(ret_bco_entry  );
344 RET_BCO_ENTRY_TEMPLATE(ret_bco_0_entry);
345 RET_BCO_ENTRY_TEMPLATE(ret_bco_1_entry);
346 RET_BCO_ENTRY_TEMPLATE(ret_bco_2_entry);
347 RET_BCO_ENTRY_TEMPLATE(ret_bco_3_entry);
348 RET_BCO_ENTRY_TEMPLATE(ret_bco_4_entry);
349 RET_BCO_ENTRY_TEMPLATE(ret_bco_5_entry);
350 RET_BCO_ENTRY_TEMPLATE(ret_bco_6_entry);
351 RET_BCO_ENTRY_TEMPLATE(ret_bco_7_entry);
352
353 VEC_POLY_INFO_TABLE(ret_bco,0, NULL/*srt*/, 0/*srt_off*/, 0/*srt_len*/, RET_BCO);
354
355 #endif /* INTERPRETER */
356
357 #ifndef COMPILER
358
359 INFO_TABLE_CONSTR(CZh_con_info,Hugs_CONSTR_entry,0,sizeofW(StgChar),0,CONSTR,const,EF_,0,0);
360 INFO_TABLE_CONSTR(IZh_con_info,Hugs_CONSTR_entry,0,sizeofW(StgInt),0,CONSTR,const,EF_,0,0);
361 INFO_TABLE_CONSTR(I64Zh_con_info,Hugs_CONSTR_entry,0,sizeofW(StgInt64),0,CONSTR,const,EF_,0,0);
362 INFO_TABLE_CONSTR(FZh_con_info,Hugs_CONSTR_entry,0,sizeofW(StgFloat),0,CONSTR,const,EF_,0,0);
363 INFO_TABLE_CONSTR(DZh_con_info,Hugs_CONSTR_entry,0,sizeofW(StgDouble),0,CONSTR,const,EF_,0,0);
364 INFO_TABLE_CONSTR(AZh_con_info,Hugs_CONSTR_entry,0,sizeofW(StgAddr),0,CONSTR,const,EF_,0,0);
365 INFO_TABLE_CONSTR(WZh_con_info,Hugs_CONSTR_entry,0,sizeofW(StgWord),0,CONSTR,const,EF_,0,0);
366 INFO_TABLE_CONSTR(StablePtr_con_info,Hugs_CONSTR_entry,0,sizeofW(StgStablePtr),0,CONSTR,const,EF_,0,0);
367
368 /* These might seem redundant but {I,C}Zh_static_info are used in
369  * {INT,CHAR}LIKE and the rest are used in RtsAPI.c
370  */
371 INFO_TABLE_CONSTR(CZh_static_info,Hugs_CONSTR_entry,0,sizeofW(StgChar),0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
372 INFO_TABLE_CONSTR(IZh_static_info,Hugs_CONSTR_entry,0,sizeofW(StgInt),0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
373 INFO_TABLE_CONSTR(I64Zh_static_info,Hugs_CONSTR_entry,0,sizeofW(StgInt64),0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
374 INFO_TABLE_CONSTR(FZh_static_info,Hugs_CONSTR_entry,0,sizeofW(StgFloat),0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
375 INFO_TABLE_CONSTR(DZh_static_info,Hugs_CONSTR_entry,0,sizeofW(StgDouble),0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
376 INFO_TABLE_CONSTR(AZh_static_info,Hugs_CONSTR_entry,0,sizeofW(StgAddr),0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
377 INFO_TABLE_CONSTR(WZh_static_info,Hugs_CONSTR_entry,0,sizeofW(StgWord),0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
378 INFO_TABLE_CONSTR(StablePtr_static_info,Hugs_CONSTR_entry,0,sizeofW(StgStablePtr),0,CONSTR_NOCAF_STATIC,const,EF_,0,0);
379
380 #endif /* !defined(COMPILER) */
381
382 /* -----------------------------------------------------------------------------
383    CHARLIKE and INTLIKE closures.  
384
385    These are static representations of Chars and small Ints, so that
386    we can remove dynamic Chars and Ints during garbage collection and
387    replace them with references to the static objects.
388    -------------------------------------------------------------------------- */
389
390 #define CHARLIKE_HDR(n)                                         \
391         {                                                       \
392           STATIC_HDR(CZh_static_info, /* C# */                  \
393                          CCS_DONTZuCARE),                       \
394           data : n                                              \
395         }
396                                              
397 #define INTLIKE_HDR(n)                                          \
398         {                                                       \
399           STATIC_HDR(IZh_static_info,  /* I# */                 \
400                          CCS_DONTZuCARE),                       \
401           data : n                                              \
402         }
403
404 /* put these in the *data* section, since the garbage collector relies
405  * on the fact that static closures live in the data section.
406  */
407
408 /* end the name with _closure, to convince the mangler this is a closure */
409
410 StgIntCharlikeClosure CHARLIKE_closure[] = {
411     CHARLIKE_HDR(0),
412     CHARLIKE_HDR(1),
413     CHARLIKE_HDR(2),
414     CHARLIKE_HDR(3),
415     CHARLIKE_HDR(4),
416     CHARLIKE_HDR(5),
417     CHARLIKE_HDR(6),
418     CHARLIKE_HDR(7),
419     CHARLIKE_HDR(8),
420     CHARLIKE_HDR(9),
421     CHARLIKE_HDR(10),
422     CHARLIKE_HDR(11),
423     CHARLIKE_HDR(12),
424     CHARLIKE_HDR(13),
425     CHARLIKE_HDR(14),
426     CHARLIKE_HDR(15),
427     CHARLIKE_HDR(16),
428     CHARLIKE_HDR(17),
429     CHARLIKE_HDR(18),
430     CHARLIKE_HDR(19),
431     CHARLIKE_HDR(20),
432     CHARLIKE_HDR(21),
433     CHARLIKE_HDR(22),
434     CHARLIKE_HDR(23),
435     CHARLIKE_HDR(24),
436     CHARLIKE_HDR(25),
437     CHARLIKE_HDR(26),
438     CHARLIKE_HDR(27),
439     CHARLIKE_HDR(28),
440     CHARLIKE_HDR(29),
441     CHARLIKE_HDR(30),
442     CHARLIKE_HDR(31),
443     CHARLIKE_HDR(32),
444     CHARLIKE_HDR(33),
445     CHARLIKE_HDR(34),
446     CHARLIKE_HDR(35),
447     CHARLIKE_HDR(36),
448     CHARLIKE_HDR(37),
449     CHARLIKE_HDR(38),
450     CHARLIKE_HDR(39),
451     CHARLIKE_HDR(40),
452     CHARLIKE_HDR(41),
453     CHARLIKE_HDR(42),
454     CHARLIKE_HDR(43),
455     CHARLIKE_HDR(44),
456     CHARLIKE_HDR(45),
457     CHARLIKE_HDR(46),
458     CHARLIKE_HDR(47),
459     CHARLIKE_HDR(48),
460     CHARLIKE_HDR(49),
461     CHARLIKE_HDR(50),
462     CHARLIKE_HDR(51),
463     CHARLIKE_HDR(52),
464     CHARLIKE_HDR(53),
465     CHARLIKE_HDR(54),
466     CHARLIKE_HDR(55),
467     CHARLIKE_HDR(56),
468     CHARLIKE_HDR(57),
469     CHARLIKE_HDR(58),
470     CHARLIKE_HDR(59),
471     CHARLIKE_HDR(60),
472     CHARLIKE_HDR(61),
473     CHARLIKE_HDR(62),
474     CHARLIKE_HDR(63),
475     CHARLIKE_HDR(64),
476     CHARLIKE_HDR(65),
477     CHARLIKE_HDR(66),
478     CHARLIKE_HDR(67),
479     CHARLIKE_HDR(68),
480     CHARLIKE_HDR(69),
481     CHARLIKE_HDR(70),
482     CHARLIKE_HDR(71),
483     CHARLIKE_HDR(72),
484     CHARLIKE_HDR(73),
485     CHARLIKE_HDR(74),
486     CHARLIKE_HDR(75),
487     CHARLIKE_HDR(76),
488     CHARLIKE_HDR(77),
489     CHARLIKE_HDR(78),
490     CHARLIKE_HDR(79),
491     CHARLIKE_HDR(80),
492     CHARLIKE_HDR(81),
493     CHARLIKE_HDR(82),
494     CHARLIKE_HDR(83),
495     CHARLIKE_HDR(84),
496     CHARLIKE_HDR(85),
497     CHARLIKE_HDR(86),
498     CHARLIKE_HDR(87),
499     CHARLIKE_HDR(88),
500     CHARLIKE_HDR(89),
501     CHARLIKE_HDR(90),
502     CHARLIKE_HDR(91),
503     CHARLIKE_HDR(92),
504     CHARLIKE_HDR(93),
505     CHARLIKE_HDR(94),
506     CHARLIKE_HDR(95),
507     CHARLIKE_HDR(96),
508     CHARLIKE_HDR(97),
509     CHARLIKE_HDR(98),
510     CHARLIKE_HDR(99),
511     CHARLIKE_HDR(100),
512     CHARLIKE_HDR(101),
513     CHARLIKE_HDR(102),
514     CHARLIKE_HDR(103),
515     CHARLIKE_HDR(104),
516     CHARLIKE_HDR(105),
517     CHARLIKE_HDR(106),
518     CHARLIKE_HDR(107),
519     CHARLIKE_HDR(108),
520     CHARLIKE_HDR(109),
521     CHARLIKE_HDR(110),
522     CHARLIKE_HDR(111),
523     CHARLIKE_HDR(112),
524     CHARLIKE_HDR(113),
525     CHARLIKE_HDR(114),
526     CHARLIKE_HDR(115),
527     CHARLIKE_HDR(116),
528     CHARLIKE_HDR(117),
529     CHARLIKE_HDR(118),
530     CHARLIKE_HDR(119),
531     CHARLIKE_HDR(120),
532     CHARLIKE_HDR(121),
533     CHARLIKE_HDR(122),
534     CHARLIKE_HDR(123),
535     CHARLIKE_HDR(124),
536     CHARLIKE_HDR(125),
537     CHARLIKE_HDR(126),
538     CHARLIKE_HDR(127),
539     CHARLIKE_HDR(128),
540     CHARLIKE_HDR(129),
541     CHARLIKE_HDR(130),
542     CHARLIKE_HDR(131),
543     CHARLIKE_HDR(132),
544     CHARLIKE_HDR(133),
545     CHARLIKE_HDR(134),
546     CHARLIKE_HDR(135),
547     CHARLIKE_HDR(136),
548     CHARLIKE_HDR(137),
549     CHARLIKE_HDR(138),
550     CHARLIKE_HDR(139),
551     CHARLIKE_HDR(140),
552     CHARLIKE_HDR(141),
553     CHARLIKE_HDR(142),
554     CHARLIKE_HDR(143),
555     CHARLIKE_HDR(144),
556     CHARLIKE_HDR(145),
557     CHARLIKE_HDR(146),
558     CHARLIKE_HDR(147),
559     CHARLIKE_HDR(148),
560     CHARLIKE_HDR(149),
561     CHARLIKE_HDR(150),
562     CHARLIKE_HDR(151),
563     CHARLIKE_HDR(152),
564     CHARLIKE_HDR(153),
565     CHARLIKE_HDR(154),
566     CHARLIKE_HDR(155),
567     CHARLIKE_HDR(156),
568     CHARLIKE_HDR(157),
569     CHARLIKE_HDR(158),
570     CHARLIKE_HDR(159),
571     CHARLIKE_HDR(160),
572     CHARLIKE_HDR(161),
573     CHARLIKE_HDR(162),
574     CHARLIKE_HDR(163),
575     CHARLIKE_HDR(164),
576     CHARLIKE_HDR(165),
577     CHARLIKE_HDR(166),
578     CHARLIKE_HDR(167),
579     CHARLIKE_HDR(168),
580     CHARLIKE_HDR(169),
581     CHARLIKE_HDR(170),
582     CHARLIKE_HDR(171),
583     CHARLIKE_HDR(172),
584     CHARLIKE_HDR(173),
585     CHARLIKE_HDR(174),
586     CHARLIKE_HDR(175),
587     CHARLIKE_HDR(176),
588     CHARLIKE_HDR(177),
589     CHARLIKE_HDR(178),
590     CHARLIKE_HDR(179),
591     CHARLIKE_HDR(180),
592     CHARLIKE_HDR(181),
593     CHARLIKE_HDR(182),
594     CHARLIKE_HDR(183),
595     CHARLIKE_HDR(184),
596     CHARLIKE_HDR(185),
597     CHARLIKE_HDR(186),
598     CHARLIKE_HDR(187),
599     CHARLIKE_HDR(188),
600     CHARLIKE_HDR(189),
601     CHARLIKE_HDR(190),
602     CHARLIKE_HDR(191),
603     CHARLIKE_HDR(192),
604     CHARLIKE_HDR(193),
605     CHARLIKE_HDR(194),
606     CHARLIKE_HDR(195),
607     CHARLIKE_HDR(196),
608     CHARLIKE_HDR(197),
609     CHARLIKE_HDR(198),
610     CHARLIKE_HDR(199),
611     CHARLIKE_HDR(200),
612     CHARLIKE_HDR(201),
613     CHARLIKE_HDR(202),
614     CHARLIKE_HDR(203),
615     CHARLIKE_HDR(204),
616     CHARLIKE_HDR(205),
617     CHARLIKE_HDR(206),
618     CHARLIKE_HDR(207),
619     CHARLIKE_HDR(208),
620     CHARLIKE_HDR(209),
621     CHARLIKE_HDR(210),
622     CHARLIKE_HDR(211),
623     CHARLIKE_HDR(212),
624     CHARLIKE_HDR(213),
625     CHARLIKE_HDR(214),
626     CHARLIKE_HDR(215),
627     CHARLIKE_HDR(216),
628     CHARLIKE_HDR(217),
629     CHARLIKE_HDR(218),
630     CHARLIKE_HDR(219),
631     CHARLIKE_HDR(220),
632     CHARLIKE_HDR(221),
633     CHARLIKE_HDR(222),
634     CHARLIKE_HDR(223),
635     CHARLIKE_HDR(224),
636     CHARLIKE_HDR(225),
637     CHARLIKE_HDR(226),
638     CHARLIKE_HDR(227),
639     CHARLIKE_HDR(228),
640     CHARLIKE_HDR(229),
641     CHARLIKE_HDR(230),
642     CHARLIKE_HDR(231),
643     CHARLIKE_HDR(232),
644     CHARLIKE_HDR(233),
645     CHARLIKE_HDR(234),
646     CHARLIKE_HDR(235),
647     CHARLIKE_HDR(236),
648     CHARLIKE_HDR(237),
649     CHARLIKE_HDR(238),
650     CHARLIKE_HDR(239),
651     CHARLIKE_HDR(240),
652     CHARLIKE_HDR(241),
653     CHARLIKE_HDR(242),
654     CHARLIKE_HDR(243),
655     CHARLIKE_HDR(244),
656     CHARLIKE_HDR(245),
657     CHARLIKE_HDR(246),
658     CHARLIKE_HDR(247),
659     CHARLIKE_HDR(248),
660     CHARLIKE_HDR(249),
661     CHARLIKE_HDR(250),
662     CHARLIKE_HDR(251),
663     CHARLIKE_HDR(252),
664     CHARLIKE_HDR(253),
665     CHARLIKE_HDR(254),
666     CHARLIKE_HDR(255)
667 };
668
669 StgIntCharlikeClosure INTLIKE_closure[] = {
670     INTLIKE_HDR(-16),   /* MIN_INTLIKE == -16 */
671     INTLIKE_HDR(-15),
672     INTLIKE_HDR(-14),
673     INTLIKE_HDR(-13),
674     INTLIKE_HDR(-12),
675     INTLIKE_HDR(-11),
676     INTLIKE_HDR(-10),
677     INTLIKE_HDR(-9),
678     INTLIKE_HDR(-8),
679     INTLIKE_HDR(-7),
680     INTLIKE_HDR(-6),
681     INTLIKE_HDR(-5),
682     INTLIKE_HDR(-4),
683     INTLIKE_HDR(-3),
684     INTLIKE_HDR(-2),
685     INTLIKE_HDR(-1),
686     INTLIKE_HDR(0),
687     INTLIKE_HDR(1),
688     INTLIKE_HDR(2),
689     INTLIKE_HDR(3),
690     INTLIKE_HDR(4),
691     INTLIKE_HDR(5),
692     INTLIKE_HDR(6),
693     INTLIKE_HDR(7),
694     INTLIKE_HDR(8),
695     INTLIKE_HDR(9),
696     INTLIKE_HDR(10),
697     INTLIKE_HDR(11),
698     INTLIKE_HDR(12),
699     INTLIKE_HDR(13),
700     INTLIKE_HDR(14),
701     INTLIKE_HDR(15),
702     INTLIKE_HDR(16)     /* MAX_INTLIKE == 16 */
703 };