153 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			153 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.simd;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import kha.FastFloat;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if cpp
							 | 
						||
| 
								 | 
							
								@:unreflective
							 | 
						||
| 
								 | 
							
								@:structAccess
							 | 
						||
| 
								 | 
							
								@:include("khalib/float32x4.h")
							 | 
						||
| 
								 | 
							
								@:native("kinc_float32x4_t")
							 | 
						||
| 
								 | 
							
								extern class Float32x4 {
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_t")
							 | 
						||
| 
								 | 
							
									public static function create(): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_load_all")
							 | 
						||
| 
								 | 
							
									public static function loadAllFast(t: FastFloat): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_load")
							 | 
						||
| 
								 | 
							
									public static function load(a: Float, b: Float, c: Float, d: Float): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_load")
							 | 
						||
| 
								 | 
							
									public static function loadFast(a: FastFloat, b: FastFloat, c: FastFloat, d: FastFloat): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_get")
							 | 
						||
| 
								 | 
							
									public static function get(t: Float32x4, index: Int): Float;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_get")
							 | 
						||
| 
								 | 
							
									public static function getFast(t: Float32x4, index: Int): FastFloat;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_abs")
							 | 
						||
| 
								 | 
							
									public static function abs(t: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_add")
							 | 
						||
| 
								 | 
							
									public static function add(a: Float32x4, b: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_div")
							 | 
						||
| 
								 | 
							
									public static function div(a: Float32x4, b: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_mul")
							 | 
						||
| 
								 | 
							
									public static function mul(a: Float32x4, b: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_neg")
							 | 
						||
| 
								 | 
							
									public static function neg(t: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_reciprocal_approximation")
							 | 
						||
| 
								 | 
							
									public static function reciprocalApproximation(t: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_reciprocal_sqrt_approximation")
							 | 
						||
| 
								 | 
							
									public static function reciprocalSqrtApproximation(t: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_sub")
							 | 
						||
| 
								 | 
							
									public static function sub(a: Float32x4, b: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:native("kinc_float32x4_sqrt")
							 | 
						||
| 
								 | 
							
									public static function sqrt(t: Float32x4): Float32x4;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								class Float32x4 {
							 | 
						||
| 
								 | 
							
									var _0: FastFloat;
							 | 
						||
| 
								 | 
							
									var _1: FastFloat;
							 | 
						||
| 
								 | 
							
									var _2: FastFloat;
							 | 
						||
| 
								 | 
							
									var _3: FastFloat;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									inline function new(_0: FastFloat, _1: FastFloat, _2: FastFloat, _3: FastFloat) {
							 | 
						||
| 
								 | 
							
										this._0 = _0;
							 | 
						||
| 
								 | 
							
										this._1 = _1;
							 | 
						||
| 
								 | 
							
										this._2 = _2;
							 | 
						||
| 
								 | 
							
										this._3 = _3;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function create(): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function loadAllFast(t: FastFloat): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(t, t, t, t);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function load(a: Float, b: Float, c: Float, d: Float): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(a, b, c, d);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function loadFast(a: FastFloat, b: FastFloat, c: FastFloat, d: FastFloat): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(a, b, c, d);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function get(t: Float32x4, index: Int): Float {
							 | 
						||
| 
								 | 
							
										var value: Float = 0;
							 | 
						||
| 
								 | 
							
										switch (index) {
							 | 
						||
| 
								 | 
							
											case 0:
							 | 
						||
| 
								 | 
							
												value = t._0;
							 | 
						||
| 
								 | 
							
											case 1:
							 | 
						||
| 
								 | 
							
												value = t._1;
							 | 
						||
| 
								 | 
							
											case 2:
							 | 
						||
| 
								 | 
							
												value = t._2;
							 | 
						||
| 
								 | 
							
											case 3:
							 | 
						||
| 
								 | 
							
												value = t._3;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function getFast(t: Float32x4, index: Int): FastFloat {
							 | 
						||
| 
								 | 
							
										var value: FastFloat = 0;
							 | 
						||
| 
								 | 
							
										switch (index) {
							 | 
						||
| 
								 | 
							
											case 0:
							 | 
						||
| 
								 | 
							
												value = t._0;
							 | 
						||
| 
								 | 
							
											case 1:
							 | 
						||
| 
								 | 
							
												value = t._1;
							 | 
						||
| 
								 | 
							
											case 2:
							 | 
						||
| 
								 | 
							
												value = t._2;
							 | 
						||
| 
								 | 
							
											case 3:
							 | 
						||
| 
								 | 
							
												value = t._3;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function abs(t: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(Math.abs(t._0), Math.abs(t._1), Math.abs(t._2), Math.abs(t._3));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function add(a: Float32x4, b: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(a._0 + b._0, a._1 + b._1, a._2 + b._2, a._3 + b._3);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function div(a: Float32x4, b: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(a._0 / b._0, a._1 / b._1, a._2 / b._2, a._3 / b._3);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function mul(a: Float32x4, b: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(a._0 * b._0, a._1 * b._1, a._2 * b._2, a._3 * b._3);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function neg(t: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(-t._0, -t._1, -t._2, -t._3);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function reciprocalApproximation(t: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function reciprocalSqrtApproximation(t: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function sub(a: Float32x4, b: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(a._0 - b._0, a._1 - b._1, a._2 - b._2, a._3 - b._3);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static inline function sqrt(t: Float32x4): Float32x4 {
							 | 
						||
| 
								 | 
							
										return new Float32x4(Math.sqrt(t._0), Math.sqrt(t._1), Math.sqrt(t._2), Math.sqrt(t._3));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#end
							 |