Alien-LibJIT
view release on metacpan or search on metacpan
libjit/dpas/dpas-parser.y view on Meta::CPAN
{
dpas_out_of_memory();
}
if(!jit_insn_store(dpas_current_function(),
value, const_value))
{
dpas_out_of_memory();
}
if(!jit_insn_label(dpas_current_function(), &label2))
{
dpas_out_of_memory();
}
dpas_sem_set_rvalue($$, dpas_type_boolean, value);
}
else
{
handle_integer_binary("and", jit_insn_and, $1, $3);
}
}
| Term K_XOR Power {
handle_integer_binary("xor", jit_insn_xor, $1, $3);
}
| Term K_SHL Power {
handle_integer_binary("shl", jit_insn_shl, $1, $3);
}
| Term K_SHR Power {
handle_integer_binary("shr", jit_insn_shr, $1, $3);
}
;
Power
: Factor { $$ = $1; }
| Power K_POW Factor {
handle_binary("pow", jit_insn_pow, $1, $3);
}
;
Factor
: Variable { $$ = $1; }
| BasicConstant {
jit_value_t value = jit_value_create_constant
(dpas_current_function(), &($1));
dpas_sem_set_rvalue($$, $1.type, value);
}
| '[' ExpressionList ']' {
/* TODO */
dpas_error("set expressions not yet implemented");
dpas_sem_set_error($$);
}
| '[' ']' {
/* TODO */
dpas_error("set expressions not yet implemented");
dpas_sem_set_error($$);
}
| K_NOT Factor {
jit_value_t value;
$2 = dpas_lvalue_to_rvalue($2);
if(dpas_sem_is_rvalue($2) &&
dpas_type_is_boolean(dpas_sem_get_type($2)))
{
value = jit_insn_to_not_bool
(dpas_current_function(), dpas_sem_get_value($2));
dpas_sem_set_rvalue($$, dpas_type_boolean, value);
}
else if(dpas_sem_is_rvalue($2) &&
dpas_type_is_integer(dpas_sem_get_type($2)))
{
value = jit_insn_not
(dpas_current_function(), dpas_sem_get_value($2));
dpas_sem_set_rvalue($$, jit_value_get_type(value), value);
}
else
{
if(!dpas_sem_is_error($2))
{
dpas_error("invalid operand to unary `not'");
}
dpas_sem_set_error($$);
}
}
| '&' Factor {
jit_type_t type;
if(dpas_sem_is_lvalue($2))
{
jit_value_t value;
value = jit_insn_address_of
(dpas_current_function(), dpas_sem_get_value($2));
type = jit_type_create_pointer(dpas_sem_get_type($2), 1);
if(!type)
{
dpas_out_of_memory();
}
dpas_sem_set_rvalue($$, type, value);
}
else if(dpas_sem_is_lvalue_ea($2))
{
/* Turn the effective address into an r-value */
type = jit_type_create_pointer(dpas_sem_get_type($2), 1);
if(!type)
{
dpas_out_of_memory();
}
dpas_sem_set_rvalue($$, type, dpas_sem_get_value($2));
}
else
{
if(!dpas_sem_is_error($2))
{
dpas_error("l-value required for address-of operator");
}
dpas_sem_set_error($$);
}
}
| '@' Factor {
jit_type_t type;
if(dpas_sem_is_lvalue($2))
{
jit_value_t value;
value = jit_insn_address_of
(dpas_current_function(), dpas_sem_get_value($2));
type = jit_type_create_pointer(dpas_sem_get_type($2), 1);
( run in 1.316 second using v1.01-cache-2.11-cpan-63c85eba8c4 )