parrotcode: Some utility functions | |
Contents | C |
src/utils.c - Some utility functions
Prototypes are in src/misc.h.
Opcode helper functions that don't really fit elsewhere.
INTVAL intval_mod
x mod y = x - y * floor(x / y)For more information on this definition of mod, see section 3.4 of [2], pages 81-85.References:[1] Donald E. Knuth, *MMIXware: A RISC Computer for the Third Millennium* Springer, 1999.[2] Ronald L. Graham, Donald E. Knuth and Oren Patashnik, *Concrete Mathematics*, Second Edition. Addison-Wesley, 1994.
FLOATVAL floatval_mod
n2 mod n3
.Includes a workaround for buggy code generation in the lcc
compiler.Based on the rand48()
family of functions.
static void next_rand
X
.
static FLOATVAL _erand48
double
in the interval [0.0, 1.0)
.
static FLOATVAL _drand48
double
in the interval [0.0, 1.0)
.
static long _jrand48
long
in the interval [-2^31, 2^31)
.
static long _nrand48
long
in the interval [0, 2^31)
.
static long _lrand48
long
in the interval [0, 2^31)
.
static long _mrand48
long
in the interval [-2^31, 2^31)
.
static void _srand48
seed
. The low order 16 bits are set to the arbitrary value 0x330e.
FLOATVAL Parrot_float_rand
FLOATVAL
in the interval [0.0, 1.0)
.how_random
is ignored.
INTVAL Parrot_uint_rand
INTVAL
in the interval [0, 2^31)
.how_random
is ignored.
INTVAL Parrot_int_rand
INTVAL
in the interval [-2^31, 2^31)
.how_random
is ignored.
INTVAL Parrot_range_rand
INTVAL
in the range [from, to]
.how_random
is ignored.
void Parrot_srand
seed
.
PMC *tm_to_array
INTVAL Parrot_byte_index
INTVAL Parrot_byte_rindex
static void rec_climb_back_and_mark
node_index ... the index of a destination (i.e. with a pred.) register c ... the graph and all the needed params : the context
static void process_cycle_without_exit
node_index ... the index of a destination (i.e. with a pred.) register c ... the graph and all the needed params : the context
void Parrot_register_move
n_regs
from the given register list src_regs
to dest_regs
.
n_regs ... amount of registers to move dest_regs ... list of register numbers 0..255 src_regs ... list of register numbers 0..255 temp_reg ... a register number not in one of these lists mov ... a register move function to be called to move one register mov_alt ... a register move function to be called to move one register which triese fetching from an alternate src (or NULLfunc): (void) (mov)(interp, dest, src, info); moved = (mov_alt)(interp, dest, src, info);Some
dest_regs
might be the same as src_regs
, which makes this a bit non-trivial, because if the destination is already clobbered, using it later as source doesn"t work. E.g.
0 <- 1 1 <- 0 # register 0 already clobberedor
2 <- 0 0 <- 1 3 <- 2 # register 2 already clobbered - reorder movesTo handle such cases, we do:
a) rearrange the order of moves (not possible in the first case) and/or if that failed: b) if an alternate move function is available, it may fetch the source from a different (non-clobbered) location - call it. if the function returns 0 also use c) c) if no alternate move function is available, use the temp regThe amount of register moves should of course be minimal.TODO The current implementation will not work for following casesTalked to Leo and he said those cases are not likely (Vishal Soni). 1. I0->I1 I1->I0 I0->I3 2. I1->I2 I3->I2TODO: Add tests for the above conditions.
Initial version by leo 2003.09.09.
|