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