aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index bb76638ec..f0353e25b 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -3313,6 +3313,48 @@ ExactValue get_constant_field(CheckerContext *c, Operand const *operand, Selecti
if (success_) *success_ = true;
return value;
+ } else if (value.kind == ExactValue_Quaternion) {
+ // @QuaternionLayout
+ Quaternion256 q = value.value_quaternion;
+ GB_ASSERT(sel.index.count == 1);
+
+ switch (sel.index[0]) {
+ case 3: // w
+ if (success_) *success_ = true;
+ return exact_value_float(q.real);
+
+ case 0: // x
+ if (success_) *success_ = true;
+ return exact_value_float(q.imag);
+
+ case 1: // y
+ if (success_) *success_ = true;
+ return exact_value_float(q.jmag);
+
+ case 2: // z
+ if (success_) *success_ = true;
+ return exact_value_float(q.kmag);
+ }
+
+ if (success_) *success_ = false;
+ return empty_exact_value;
+ } else if (value.kind == ExactValue_Complex) {
+ // @QuaternionLayout
+ Complex128 c = value.value_complex;
+ GB_ASSERT(sel.index.count == 1);
+
+ switch (sel.index[0]) {
+ case 0: // real
+ if (success_) *success_ = true;
+ return exact_value_float(c.real);
+
+ case 1: // imag
+ if (success_) *success_ = true;
+ return exact_value_float(c.imag);
+ }
+
+ if (success_) *success_ = false;
+ return empty_exact_value;
}
if (success_) *success_ = true;