Commit 19e96622184fea70b0b2ed238affdb869b1e21da
1 parent
56ee3cb4
-
Showing
1 changed file
with
57 additions
and
58 deletions
Show diff stats
anubis_dev/library/a2a/generic/preformater.anubis
| ... | ... | @@ -78,11 +78,10 @@ type GeoParms: |
| 78 | 78 | |
| 79 | 79 | Default values for 32 and 64 bits machines: |
| 80 | 80 | |
| 81 | -define GeoParms default_32_geoparms = geoparms(8,32,32,4,30,128). | |
| 82 | -define GeoParms default_64_geoparms = geoparms(8,64,64,8,48,256). | |
| 81 | +define GeoParms default_32_geoparms = geoparms((Int)8,(Int)32,(Int)32,(Int)4,(Int)1,(Int)30,(Int)128). | |
| 82 | +define GeoParms default_64_geoparms = geoparms((Int)8,(Int)64,(Int)64,(Int)8,(Int)1,(Int)48,(Int)256). | |
| 83 | 83 | |
| 84 | 84 | |
| 85 | - | |
| 86 | 85 | *** [] General principles |
| 87 | 86 | |
| 88 | 87 | Data are represented either 'directly' or 'indirectly'. 'Directly' |
| ... | ... | @@ -258,7 +257,7 @@ define Int |
| 258 | 257 | AnubisType type |
| 259 | 258 | ) = |
| 260 | 259 | if tb is tbox(allt,alld,parms) then |
| 261 | - if parms is geoparms(samu,wrdw,ptrw,algu,aptrw,ithh) then | |
| 260 | + if parms is geoparms(samu,wrdw,ptrw,halu,salu,aptw,ithh) then | |
| 262 | 261 | if type is |
| 263 | 262 | { |
| 264 | 263 | parameter(name) then should_not_happen(0), |
| ... | ... | @@ -323,65 +322,65 @@ type Implementation: |
| 323 | 322 | |
| 324 | 323 | *** [] High level instructions |
| 325 | 324 | |
| 326 | -public type HLInstr: | |
| 327 | - | |
| 328 | - /* allocate a segment of a given size (in bits) and push the pointer on top of stack */ | |
| 329 | - alloc_push (Int width), | |
| 330 | - | |
| 331 | - /* push a constant on top of stack */ | |
| 332 | - push_cst (Int width, // width of datum (the width of stack slot will be computed from it) | |
| 333 | - Int value), // value to be pushed | |
| 334 | - | |
| 335 | - /* pop a value from top of stack and glue it into the glue register */ | |
| 336 | - pop_glue (Int width, // width of value | |
| 337 | - Int disp), // displacement in glue register | |
| 338 | - | |
| 339 | - /* push the content of the glue register on top of stack */ | |
| 340 | - push_glue (Int width), // width of datum to be pushed | |
| 341 | - | |
| 342 | - mov (Int src_address, | |
| 343 | - Int dst_address, | |
| 344 | - Int width). | |
| 345 | 325 | |
| 326 | +public type StackPos: | |
| 327 | + /* Type and position of a datum in the stack */ | |
| 328 | + stk (AnubisType type, | |
| 329 | + Int depth), // datum directly in the stack at depth 'depth' | |
| 330 | + mctxt (AnubisType type, | |
| 331 | + Int stack_depth, // datum in a micro-context at depth 'stack_depth' in the stack | |
| 332 | + Int offset). // and at offset 'offset' in the micro-context | |
| 346 | 333 | |
| 347 | - *** [] Generating constructors | |
| 334 | + | |
| 335 | + | |
| 336 | +public type HLInstr: | |
| 337 | + /* label (pseudo-instruction) */ | |
| 338 | + label (Int name), | |
| 348 | 339 | |
| 340 | + /* make a virtual copy */ | |
| 341 | + copy (StackPos pos), | |
| 349 | 342 | |
| 350 | -define List(HLInstr) | |
| 351 | - make_small_glue | |
| 352 | - ( | |
| 353 | - Int iw, | |
| 354 | - List(CompImplem) comps | |
| 355 | - ) = | |
| 356 | - if comps is | |
| 357 | - { | |
| 358 | - [ ] then [ ], | |
| 359 | - [c1 . others] then if c1 is comp(off,cw,impl) then | |
| 360 | - [ glue() | |
| 361 | - | |
| 362 | - ] | |
| 363 | - }. | |
| 343 | + /* make a virtual deletion */ | |
| 344 | + delete (StackPos pos), | |
| 364 | 345 | |
| 346 | + /* move a datum (no copy; if a copy is needed, it must be performed before the move) */ | |
| 347 | + move (StackPos source, | |
| 348 | + StackPos destination), | |
| 365 | 349 | |
| 366 | -define List(HLInstr) | |
| 367 | - constructor | |
| 368 | - ( | |
| 369 | - TypeImplem implem, | |
| 370 | - Int index | |
| 371 | - ) = | |
| 372 | - if implem is sum(tw,alts) | |
| 373 | - if alt is | |
| 374 | - { | |
| 375 | - small(iw,i,n,comps) then | |
| 376 | - [ | |
| 377 | - push_cst(tw,i) | |
| 378 | - . make_small_glue(iw,comps) | |
| 379 | - ], | |
| 380 | - | |
| 381 | - mixed(iw,i,n,comps) then [], | |
| 382 | - large(iw,i,n,comps) then [] | |
| 383 | - }. | |
| 384 | - | |
| 385 | - | |
| 350 | + /* get the alternative index of the datum on top of stack (and put it in the index register) */ | |
| 351 | + index (AnubisType type), | |
| 352 | + | |
| 353 | + /* switch (jmp to the label whose rank is in the index register) */ | |
| 354 | + switch (List(Int) labels), | |
| 386 | 355 | |
| 356 | + /* compact (compact data on the stack (via the glue register)) */ | |
| 357 | + compact (AnubisAlternative alt), | |
| 358 | + | |
| 359 | + /* extract (extract a datum from a compacted representation and push it on the stack) */ | |
| 360 | + extract (AnubisAlternative alt, | |
| 361 | + Int component_rank), | |
| 362 | + | |
| 363 | + /* address (push a label on the stack; this may be a return address) */ | |
| 364 | + address (Int label_name), | |
| 365 | + | |
| 366 | + /* closure (construct a multiclosure and push it on the stack) */ | |
| 367 | + closure (List(Int) code_labels, // codes of functions | |
| 368 | + Int gc_label, // deletion code of closure | |
| 369 | + List(StackPos) micro_data), // data to be put into the micro-context (no copy; | |
| 370 | + // virtual copies must have been performed before | |
| 371 | + // this instruction is executed) | |
| 372 | + | |
| 373 | + /* apply a function to its argument (everything is on the stack) */ | |
| 374 | + apply (AnubisType arg_type), // type of argument | |
| 375 | + | |
| 376 | + /* return from a call */ | |
| 377 | + ret, | |
| 378 | + | |
| 379 | + /* unreachable (control should never reach this point) */ | |
| 380 | + unreachable. | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + *** [] Generating constructors | |
| 387 | 386 | ... | ... |