示例#1
0
文件: compile.c 项目: Hmaal/slash
NODE(sl_node_lambda_t, lambda)
{
    sl_compile_state_t sub_cs;
    size_t i;
    init_compile_state(&sub_cs, cs->vm, cs, node->arg_count + 1);
    for(i = 0; i < node->arg_count; i++) {
        sl_st_insert(sub_cs.vars, (sl_st_data_t)node->args[i], (sl_st_data_t)(i + 1));
    }
    sub_cs.section->req_registers = node->arg_count;
    sub_cs.section->arg_registers = node->arg_count;
    sub_cs.section->name = sl_intern(cs->vm, "<lambda>");
    compile_node(&sub_cs, node->body, 0);
    op_return(&sub_cs, 0);
    op_lambda(cs, sub_cs.section, dest);
}
示例#2
0
文件: compile.c 项目: Hmaal/slash
NODE(sl_node_def_t, def)
{
    sl_compile_state_t sub_cs;
    size_t i, on_reg;
    size_t init_regs = 1 + node->req_arg_count + node->opt_arg_count;
    if(node->rest_arg) {
        init_regs++;
    }
    init_compile_state(&sub_cs, cs->vm, cs, init_regs);
    for(i = 0; i < node->req_arg_count; i++) {
        sl_st_insert(sub_cs.vars, (sl_st_data_t)node->req_args[i], (sl_st_data_t)(i + 1));
    }
    for(i = 0; i < node->opt_arg_count; i++) {
        sl_st_insert(sub_cs.vars, (sl_st_data_t)node->opt_args[i].name, (sl_st_data_t)(node->req_arg_count + i + 1));
    }
    if(node->rest_arg) {
        sl_st_insert(sub_cs.vars, (sl_st_data_t)node->rest_arg, (sl_st_data_t)(node->req_arg_count + node->opt_arg_count + 1));
        sub_cs.section->has_extra_rest_arg = 1;
    }
    sub_cs.section->name = node->name;
    sub_cs.section->req_registers = node->req_arg_count;
    sub_cs.section->arg_registers = node->req_arg_count + node->opt_arg_count;
    sub_cs.section->opt_skip = sl_alloc(cs->vm->arena, sizeof(size_t) * (node->opt_arg_count + 1));

    for(i = 0; i < node->opt_arg_count; i++) {
        sub_cs.section->opt_skip[i] = sub_cs.section->insns_count;
        compile_node(&sub_cs, node->opt_args[i].default_value, node->req_arg_count + i + 1);
    }
    sub_cs.section->opt_skip[node->opt_arg_count] = sub_cs.section->insns_count;

    compile_node(&sub_cs, node->body, 0);
    op_return(&sub_cs, 0);

    if(node->on) {
        on_reg = reg_alloc(cs);
        compile_node(cs, node->on, on_reg);
        op_define_on(cs, on_reg, node->name, node->doc, sub_cs.section, dest);
        reg_free(cs, on_reg);
    } else {
        op_define(cs, node->name, node->doc, sub_cs.section, dest);
    }
}
示例#3
0
void opcode_jump (void)
{
	error = E_UNKNOWN_OPCODE;
	//fda group
	if (strcmp( (char *)token,"addwf")==0)		error = op_addwf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"addwfc")==0)		error = op_addwfc((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"andwf")==0)		error = op_andwf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"comf")==0)		error = op_comf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"decf")==0)		error = op_decf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"decfsz")==0)		error = op_decfsz((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"dcfsnz")==0)		error = op_dcfsnz((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"incf")==0)		error = op_incf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"incfsz")==0)		error = op_incfsz((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"infsnz")==0)		error = op_infsnz((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"iorwf")==0)		error = op_iorwf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"movf")==0)		error = op_movf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"rlcf")==0)		error = op_rlcf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"rlncf")==0)		error = op_rlncf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"rrcf")==0)		error = op_rrcf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"rrncf")==0)		error = op_rrncf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"subfwb")==0)		error = op_subfwb((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"subwf")==0)		error = op_subwf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"subwfb")==0)		error = op_subwfb((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"swapf")==0)		error = op_swapf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"xorwf")==0)		error = op_xorwf((unsigned char *) file_line,token_len);
	//fa group
	if (strcmp( (char *)token,"clrf")==0)		error = op_clrf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"cpfseq")==0)		error = op_cpfseq((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"cpfsgt")==0)		error = op_cpfsgt((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"cpfslt")==0)		error = op_cpfslt((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"movwf")==0)		error = op_movwf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"mulwf")==0)		error = op_mulwf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"negf")==0)		error = op_negf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"setf")==0)		error = op_setf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tstfsz")==0)		error = op_tstfsz((unsigned char *) file_line,token_len);
	//movff
	if (strcmp( (char *)token,"movff")==0)		error = op_movff((unsigned char *) file_line,token_len);
	//fba group
	if (strcmp( (char *)token,"bcf")==0)		error = op_bcf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"bsf")==0)		error = op_bsf((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"btfsc")==0)		error = op_btfsc((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"btfss")==0)		error = op_btfss((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"btg")==0)		error = op_btg((unsigned char *) file_line,token_len);
	//one byte (literal, control) group - decide if relative / absolute
	if (strcmp( (char *)token,"bc")==0)			error = op_bc((unsigned char *) file_line,token_len,addr,replaced);
	if (strcmp( (char *)token,"bn")==0)			error = op_bn((unsigned char *) file_line,token_len,addr,replaced);
	if (strcmp( (char *)token,"bnc")==0)		error = op_bnc((unsigned char *) file_line,token_len,addr,replaced);
	if (strcmp( (char *)token,"bnn")==0)		error = op_bnn((unsigned char *) file_line,token_len,addr,replaced);
	if (strcmp( (char *)token,"bnov")==0)		error = op_bnov((unsigned char *) file_line,token_len,addr,replaced);
	if (strcmp( (char *)token,"bnz")==0)		error = op_bnz((unsigned char *) file_line,token_len,addr,replaced);
	if (strcmp( (char *)token,"bov")==0)		error = op_bov((unsigned char *) file_line,token_len,addr,replaced);
	if (strcmp( (char *)token,"bz")==0)			error = op_bz((unsigned char *) file_line,token_len,addr,replaced);

	if (strcmp( (char *)token,"rcall")==0)		error = op_rcall((unsigned char *) file_line,token_len,addr,replaced);
	if (strcmp( (char *)token,"bra")==0)		error = op_bra((unsigned char *) file_line,token_len,addr,replaced);
	//no decision
	if (strcmp( (char *)token,"retlw")==0)		error = op_retlw((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"addlw")==0)		error = op_addlw((unsigned char *) file_line,token_len);	
	if (strcmp( (char *)token,"andlw")==0)		error = op_andlw((unsigned char *) file_line,token_len);	
	if (strcmp( (char *)token,"iorlw")==0)		error = op_iorlw((unsigned char *) file_line,token_len);	
	if (strcmp( (char *)token,"movlb")==0)		error = op_movlb((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"movlw")==0)		error = op_movlw((unsigned char *) file_line,token_len);	
	if (strcmp( (char *)token,"mullw")==0)		error = op_mullw((unsigned char *) file_line,token_len);	
	if (strcmp( (char *)token,"sublw")==0)		error = op_sublw((unsigned char *) file_line,token_len);	
	if (strcmp( (char *)token,"xorlw")==0)		error = op_xorlw((unsigned char *) file_line,token_len);	
	//goto/call - 2 byte with 16 bit variable
	if (strcmp( (char *)token,"call")==0)		error = op_call((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"goto")==0)		error = op_goto((unsigned char *) file_line,token_len);
	//lfsr
	if (strcmp( (char *)token,"lfsr")==0)		error = op_lfsr((unsigned char *) file_line,token_len);
	//no suffix after opcode
	if (strcmp( (char *)token,"clrwdt")==0)		error = op_clrwdt((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"daw")==0)		error = op_daw((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"nop")==0)		error = op_nop((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"pop")==0)		error = op_pop((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"push")==0)		error = op_push((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"reset")==0)		error = op_reset((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"retfie")==0)		error = op_retfie((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"return")==0)		error = op_return((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"sleep")==0)		error = op_sleep((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tblrd*")==0)		error = op_tblrd((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tblrd*+")==0)	error = op_tblrdpi((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tblrd*-")==0)	error = op_tblrdpd((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tblrd+*")==0)	error = op_tblrdip((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tblwt*")==0)		error = op_tblwt((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tblwt*+")==0)	error = op_tblwtpi((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tblwt*-")==0)	error = op_tblwtpd((unsigned char *) file_line,token_len);
	if (strcmp( (char *)token,"tblwt+*")==0)	error = op_tblwtip((unsigned char *) file_line,token_len);

}