[qfcc] Support the extended extend instruction

That... feels odd :)
This commit is contained in:
Bill Currie 2023-08-25 17:20:28 +09:00
parent 7338f86c77
commit 53d9fee586
4 changed files with 6 additions and 3 deletions

View file

@ -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.

View file

@ -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;
}

View file

@ -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 *

View file

@ -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);