static BOOL check_reg_type(const struct shader_reg *reg, const struct allowed_reg_type *allowed) { unsigned int i = 0; while(allowed[i].type != ~0U) { if(reg->type == allowed[i].type) { if(reg->rel_reg) return TRUE; /* The relative addressing register can have a negative value, we can't check the register index */ if(reg->regnum < allowed[i].count) return TRUE; else return FALSE; } i++; } return FALSE; } /* Native compiler doesn't make separate checks for src and dst registers */ struct allowed_reg_type vs_1_reg_allowed[] = { { BWRITERSPR_TEMP, 12 }, { BWRITERSPR_INPUT, 16 }, { BWRITERSPR_CONST, ~0U }, { BWRITERSPR_ADDR, 1 }, { BWRITERSPR_RASTOUT, 3 }, /* oPos, oFog and oPts */ { BWRITERSPR_ATTROUT, 2 }, { BWRITERSPR_TEXCRDOUT, 8 }, { ~0U, 0 } /* End tag */ }; static void asmparser_srcreg_vs_1(struct asm_parser *This, struct instruction *instr, int num, const struct shader_reg *src) { struct shader_reg reg; if(!check_reg_type(src, vs_1_reg_allowed)) { asmparser_message(This, "Line %u: Source register %s not supported in VS 1\n", This->line_no, debug_print_srcreg(src, ST_VERTEX)); set_parse_status(This, PARSE_ERR); } check_legacy_srcmod(This, src->srcmod); check_abs_srcmod(This, src->srcmod); reg = map_oldvs_register(src); memcpy(&instr->src[num], ®, sizeof(reg)); }