@@ -23,9 +23,9 @@ export enum BinaryOpType {
23
23
DIV ,
24
24
ELU_DER ,
25
25
EQUAL ,
26
+ FLOOR_DIV ,
26
27
GREATER ,
27
28
GREATER_EQUAL ,
28
- INT_DIV ,
29
29
LESS ,
30
30
LESS_EQUAL ,
31
31
LOGICAL_AND ,
@@ -56,6 +56,13 @@ const EQUAL = `
56
56
let one = sign(b) * 0 + 1;
57
57
let resultTemp = select(zero, one, a == b);
58
58
` ;
59
+ const FLOOR_DIV = `
60
+ let remainder =
61
+ select(a % b, round(a % b), (round(a) == a) & (round(b) == b));
62
+ let quotient = (a - remainder) / b;
63
+ let resultTemp =
64
+ round(select(quotient, quotient - 1, sign(remainder) == -sign(b)));
65
+ ` ;
59
66
const GREATER = `
60
67
let zero = sign(a) * 0 + 0;
61
68
let one = sign(b) * 0 + 1;
@@ -66,36 +73,6 @@ const GREATER_EQUAL = `
66
73
let one = sign(b) * 0 + 1;
67
74
let resultTemp = select(zero, one, a >= b);
68
75
` ;
69
-
70
- const INT_DIV = `
71
- let s = sign(a) * sign(b);
72
- let ia = i32(round(a));
73
- let ib = i32(round(b));
74
- return f32(idiv(ia, ib, s));
75
- ` ;
76
- const INT_DIV_VEC4 = `
77
- let ia = vec4<i32>(round(a));
78
- let ib = vec4<i32>(round(b));
79
- let cond = ib != vec4<i32>(0);
80
- var resultTemp = vec4<i32>(0);
81
- let s = sign(a) * sign(b);
82
-
83
- // Windows (D3D) wants guaranteed non-zero int division at compile-time.
84
- if (cond[0]) {
85
- resultTemp[0] = idiv(ia[0], ib[0], s[0]);
86
- }
87
- if (cond[1]) {
88
- resultTemp[1] = idiv(ia[1], ib[1], s[1]);
89
- }
90
- if (cond[2]) {
91
- resultTemp[2] = idiv(ia[2], ib[2], s[2]);
92
- }
93
- if (cond[3]) {
94
- resultTemp[3] = idiv(ia[3], ib[3], s[3]);
95
- }
96
- return vec4<f32>(resultTemp);
97
- ` ;
98
-
99
76
const LESS = `
100
77
let zero = sign(a) * 0 + 0;
101
78
let one = sign(b) * 0 + 1;
@@ -265,14 +242,15 @@ export function getBinaryOpString(
265
242
case BinaryOpType . EQUAL :
266
243
doOpSnippet = EQUAL ;
267
244
break ;
245
+ case BinaryOpType . FLOOR_DIV :
246
+ doOpSnippet = FLOOR_DIV ;
247
+ break ;
268
248
case BinaryOpType . GREATER :
269
249
doOpSnippet = GREATER ;
270
250
break ;
271
251
case BinaryOpType . GREATER_EQUAL :
272
252
doOpSnippet = GREATER_EQUAL ;
273
253
break ;
274
- case BinaryOpType . INT_DIV :
275
- return useVec4 ? INT_DIV_VEC4 : INT_DIV ;
276
254
case BinaryOpType . LESS :
277
255
doOpSnippet = LESS ;
278
256
break ;
0 commit comments