Explorar o código

added support for %, optimize readOffset to remove unnecessary madd

Nicolas Cannasse %!s(int64=11) %!d(string=hai) anos
pai
achega
cc46f1927a
Modificáronse 3 ficheiros con 23 adicións e 4 borrados
  1. 18 0
      hxsl/AgalOut.hx
  2. 1 1
      hxsl/Checker.hx
  3. 4 3
      hxsl/Flatten.hx

+ 18 - 0
hxsl/AgalOut.hx

@@ -255,6 +255,14 @@ class AgalOut {
 			case OpAdd: return std(OAdd);
 			case OpSub: return std(OSub);
 			case OpDiv: return std(ODiv);
+			case OpMod:
+				var tmp = allocReg(e.t);
+				op(OMov(tmp, expr(e2)));
+				var r = allocReg(e.t);
+				op(ODiv(r, expr(e1), tmp));
+				op(OFrc(r, r));
+				op(OMul(r, r, tmp));
+				return r;
 			case OpAssign:
 				var r = expr(e1);
 				mov(r, expr(e2), e1.t);
@@ -332,6 +340,10 @@ class AgalOut {
 				case TBinop(OpAdd, { e : TBinop(OpMult,{ e : TCall({ e : TGlobal(ToInt) },[epos]) },stride) } , { e : TConst(CInt(d)) } ):
 					delta = d;
 					index = { e : TBinop(OpMult, epos, stride), t : TFloat, p : index.p };
+				case TBinop(OpMult,{ e : TCall({ e : TGlobal(ToInt) },[epos]) },stride):
+					index = { e : TBinop(OpMult, epos, stride), t : TFloat, p : index.p };
+				case TCall({ e : TGlobal(ToInt) },[epos]):
+					index = epos;
 				default:
 				}
 				var i = expr(index);
@@ -398,6 +410,12 @@ class AgalOut {
 			return unop(OCos);
 		case [Fract, _]:
 			return unop(OFrc);
+		case [ToInt, [a]]:
+			var r = expr(a);
+			var tmp = allocReg(a.t);
+			op(OFrc(tmp, r));
+			op(OSub(r, r, tmp));
+			return r;
 		case [Clamp, [a, min, max]]:
 			var r = allocReg(ret);
 			op(OMax(r, expr(a), expr(min)));

+ 1 - 1
hxsl/Checker.hx

@@ -844,7 +844,7 @@ class Checker {
 	function typeBinop(op, e1:TExpr, e2:TExpr, pos : Position) {
 		return switch( op ) {
 		case OpAssign, OpAssignOp(_): throw "assert";
-		case OpMult, OpAdd, OpSub, OpDiv:
+		case OpMult, OpAdd, OpSub, OpDiv, OpMod:
 			switch( [op, e1.t, e2.t] ) {
 			case [OpMult,TVec(4,VFloat), TMat4], [OpMult,TMat4, TVec(4,VFloat)]:
 				vec4;

+ 4 - 3
hxsl/Flatten.hx

@@ -107,11 +107,11 @@ class Flatten {
 				switch( v.type ) {
 				case TArray(t, _):
 					var stride = varSize(t, a.t);
-					if( stride == 0 || stride & 3 != 0 ) throw "assert " + t;
+					if( stride == 0 || stride & 3 != 0 ) throw new Error("Dynamic access to an Array which size is not 4 components-aligned is not allowed", e.p);
 					stride >>= 2;
 					eindex = mapExpr(eindex);
 					var toInt = { e : TCall( { e : TGlobal(ToInt), t : TFun([]), p : vp }, [eindex]), t : TInt, p : vp };
-					access(a, t, vp, readOffset.bind(a,stride,{ e : TBinop(OpMult,toInt,mkInt(stride,vp)), t : TInt, p : vp }));
+					access(a, t, vp, readOffset.bind(a,stride, stride == 1 ? toInt : { e : TBinop(OpMult,toInt,mkInt(stride,vp)), t : TInt, p : vp }));
 				default:
 					throw "assert";
 				}
@@ -220,7 +220,8 @@ class Flatten {
 	}
 
 	function readOffset( a : Alloc, stride : Int, delta : TExpr, index : Int, pos ) : TExpr {
-		var offset : TExpr = { e : TBinop(OpAdd, delta, mkInt((a.pos >> 2) + index, pos)), t : TInt, p : pos };
+		var index = (a.pos >> 2) + index;
+		var offset : TExpr = index == 0 ? delta : { e : TBinop(OpAdd, delta, mkInt(index, pos)), t : TInt, p : pos };
 		return { e : TArray({ e : TVar(a.g), t : a.g.type, p : pos }, offset), t : TVec(4,a.t), p:pos };
 	}