// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// VMOptions=--optimization-counter-threshold=10 --no-background-compilation

// @dart = 2.9

// Library tag to be able to run in html test framework.
library float32x4_transpose_test;

import 'dart:typed_data';
import 'package:expect/expect.dart';

void transpose(Float32x4List m) {
  Expect.equals(4, m.length);
  var m0 = m[0];
  var m1 = m[1];
  var m2 = m[2];
  var m3 = m[3];

  var t0 = m0.shuffleMix(m1, Float32x4.xyxy);
  var t1 = m2.shuffleMix(m3, Float32x4.xyxy);
  m[0] = t0.shuffleMix(t1, Float32x4.xzxz);
  m[1] = t0.shuffleMix(t1, Float32x4.ywyw);

  var t2 = m0.shuffleMix(m1, Float32x4.zwzw);
  var t3 = m2.shuffleMix(m3, Float32x4.zwzw);
  m[2] = t2.shuffleMix(t3, Float32x4.xzxz);
  m[3] = t2.shuffleMix(t3, Float32x4.ywyw);
}

void testTranspose(Float32x4List m, Float32x4List r) {
  transpose(m); // In place transpose.
  for (int i = 0; i < 4; i++) {
    var a = m[i];
    var b = r[i];
    Expect.equals(b.x, a.x);
    Expect.equals(b.y, a.y);
    Expect.equals(b.z, a.z);
    Expect.equals(b.w, a.w);
  }
}

main() {
  var A = new Float32x4List(4);
  A[0] = new Float32x4(1.0, 2.0, 3.0, 4.0);
  A[1] = new Float32x4(5.0, 6.0, 7.0, 8.0);
  A[2] = new Float32x4(9.0, 10.0, 11.0, 12.0);
  A[3] = new Float32x4(13.0, 14.0, 15.0, 16.0);
  var B = new Float32x4List(4);
  B[0] = new Float32x4(1.0, 5.0, 9.0, 13.0);
  B[1] = new Float32x4(2.0, 6.0, 10.0, 14.0);
  B[2] = new Float32x4(3.0, 7.0, 11.0, 15.0);
  B[3] = new Float32x4(4.0, 8.0, 12.0, 16.0);
  var I = new Float32x4List(4);
  I[0] = new Float32x4(1.0, 0.0, 0.0, 0.0);
  I[1] = new Float32x4(0.0, 1.0, 0.0, 0.0);
  I[2] = new Float32x4(0.0, 0.0, 1.0, 0.0);
  I[3] = new Float32x4(0.0, 0.0, 0.0, 1.0);
  for (int i = 0; i < 20; i++) {
    var m = new Float32x4List.fromList(I);
    testTranspose(m, I);
    m = new Float32x4List.fromList(A);
    testTranspose(m, B);
  }
}
