From 53d9fee586034b8b99cd71feb9e69173afeb331a Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 25 Aug 2023 17:20:28 +0900 Subject: [PATCH] [qfcc] Support the extended extend instruction That... feels odd :) --- tools/qfcc/include/expr.h | 3 ++- tools/qfcc/source/expr.c | 3 ++- tools/qfcc/source/expr_binary.c | 2 +- tools/qfcc/source/statements.c | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index 78d6822d5..e079de644 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -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. diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 19ee5c0a3..44fe3253c 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -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; } diff --git a/tools/qfcc/source/expr_binary.c b/tools/qfcc/source/expr_binary.c index 04cc56a27..4e6434036 100644 --- a/tools/qfcc/source/expr_binary.c +++ b/tools/qfcc/source/expr_binary.c @@ -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 * diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index 0d40f7265..fa7649e56 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -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);