mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-20 18:52:28 +00:00
[qfcc] Support the extended extend instruction
That... feels odd :)
This commit is contained in:
parent
7338f86c77
commit
53d9fee586
4 changed files with 6 additions and 3 deletions
|
@ -277,6 +277,7 @@ typedef struct {
|
|||
typedef struct {
|
||||
struct expr_s *src; ///< source expression
|
||||
int extend; ///< extend mode 0: 0, 1: 1, 2: copy/0 3:-1
|
||||
bool reverse; ///< reverse resultant vector
|
||||
struct type_s *type; ///< result type;
|
||||
} ex_extend_t;
|
||||
|
||||
|
@ -515,7 +516,7 @@ expr_t *new_horizontal_expr (int op, expr_t *vec, struct type_s *type);
|
|||
|
||||
expr_t *new_swizzle_expr (expr_t *src, const char *swizzle);
|
||||
|
||||
expr_t *new_extend_expr (expr_t *src, struct type_s *type, int ext);
|
||||
expr_t *new_extend_expr (expr_t *src, struct type_s *type, int ext, bool rev);
|
||||
|
||||
/** Create a new def reference (non-temporary variable) expression node.
|
||||
|
||||
|
|
|
@ -709,12 +709,13 @@ new_swizzle_expr (expr_t *src, const char *swizzle)
|
|||
}
|
||||
|
||||
expr_t *
|
||||
new_extend_expr (expr_t *src, type_t *type, int ext)
|
||||
new_extend_expr (expr_t *src, type_t *type, int ext, bool rev)
|
||||
{
|
||||
expr_t *expr = new_expr ();
|
||||
expr->type = ex_extend;
|
||||
expr->e.extend.src = src;
|
||||
expr->e.extend.extend = ext;
|
||||
expr->e.extend.reverse = rev;
|
||||
expr->e.extend.type = type;
|
||||
return expr;
|
||||
}
|
||||
|
|
|
@ -722,7 +722,7 @@ convert_scalar (expr_t *scalar, int op, expr_t *vec)
|
|||
return new_vector_list (scalar);
|
||||
}
|
||||
|
||||
return new_extend_expr (scalar, vec_type, 2);//2 = copy
|
||||
return new_extend_expr (scalar, vec_type, 2, false);//2 = copy
|
||||
}
|
||||
|
||||
static expr_t *
|
||||
|
|
|
@ -1845,6 +1845,7 @@ expr_extend (sblock_t *sblock, expr_t *e, operand_t **op)
|
|||
int ext = mode[src_width - 1][res_width - 1];
|
||||
ext |= (e->e.extend.extend & 3) << 3;
|
||||
ext |= (pr_type_size[res_base->type] - 1) << 5;
|
||||
ext |= e->e.extend.reverse << 6;
|
||||
if (ext < 0 || res_base != src_base) {
|
||||
internal_error (e, "invalid type combination for extend %d %d %d",
|
||||
ext, src_width, res_width);
|
||||
|
|
Loading…
Reference in a new issue