|
@@ -388,7 +388,18 @@ class AgalOut {
|
|
op(ODp4(swiz(r,[X]), r1, r2));
|
|
op(ODp4(swiz(r,[X]), r1, r2));
|
|
op(ODp4(swiz(r,[Y]), r1, offset(r2,1)));
|
|
op(ODp4(swiz(r,[Y]), r1, offset(r2,1)));
|
|
op(ODp4(swiz(r,[Z]), r1, offset(r2,2)));
|
|
op(ODp4(swiz(r,[Z]), r1, offset(r2,2)));
|
|
- op(ODp4(swiz(r,[W]), r1, offset(r2,3)));
|
|
|
|
|
|
+ op(ODp4(swiz(r, [W]), r1, offset(r2, 3)));
|
|
|
|
+ case [TMat4, TMat4]:
|
|
|
|
+ var tmp = allocReg(TMat4);
|
|
|
|
+ colsToRows(r1, tmp, TMat4);
|
|
|
|
+ for( i in 0...4 ) {
|
|
|
|
+ var b = offset(r2, i);
|
|
|
|
+ var o = offset(r, i);
|
|
|
|
+ op(ODp4(swiz(o, [X]), tmp, b));
|
|
|
|
+ op(ODp4(swiz(o, [Y]), offset(tmp, 1), b));
|
|
|
|
+ op(ODp4(swiz(o, [Z]), offset(tmp, 2), b));
|
|
|
|
+ op(ODp4(swiz(o, [W]), offset(tmp, 3), b));
|
|
|
|
+ }
|
|
default:
|
|
default:
|
|
throw "assert " + [e1.t, e2.t];
|
|
throw "assert " + [e1.t, e2.t];
|
|
}
|
|
}
|
|
@@ -411,6 +422,20 @@ class AgalOut {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ function colsToRows( src : Reg, dst : Reg, t : Type ) {
|
|
|
|
+ switch( t ) {
|
|
|
|
+ case TMat4:
|
|
|
|
+ for( i in 0...4 ) {
|
|
|
|
+ var ldst = offset(dst, i);
|
|
|
|
+ for( j in 0...4 )
|
|
|
|
+ op(OMov(swiz(ldst, [COMPS[j]]), swiz(offset(src, j), [COMPS[i]])));
|
|
|
|
+ }
|
|
|
|
+ default:
|
|
|
|
+ throw "Can't transpose " + t;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
function global( g : TGlobal, args : Array<TExpr>, ret : Type ) : Reg {
|
|
function global( g : TGlobal, args : Array<TExpr>, ret : Type ) : Reg {
|
|
inline function binop(bop) {
|
|
inline function binop(bop) {
|
|
if( args.length != 2 ) throw "assert";
|
|
if( args.length != 2 ) throw "assert";
|