Tint/transform: Fix insertBits polyfill for HLSL

This CL fix insertBits polyfill to handle with the left-shifting
behavior in HLSL, i.e. `(1u << 32u) == (1u << 0u) == 1u` where we want
the result to be `0u`.

Fixed: tint:1743
Change-Id: Ibb82abe4ab2f76dbb0fa06057fb19f15f961d969
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/108166
Commit-Queue: Zhaoming Jiang <zhaoming.jiang@intel.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/test/tint/builtins/gen/var/insertBits/3c7ba5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/insertBits/3c7ba5.wgsl.expected.dxc.hlsl
index e84e9b8..1e92e80 100644
--- a/test/tint/builtins/gen/var/insertBits/3c7ba5.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/3c7ba5.wgsl.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 uint2 tint_insert_bits(uint2 v, uint2 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint2((s).xx)) & uint2((mask).xx)) | (v & uint2((~(mask)).xx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint2((offset).xx)) : (0u).xx) & uint2((mask).xx)) | (v & uint2((~(mask)).xx)));
 }
 
 void insertBits_3c7ba5() {
diff --git a/test/tint/builtins/gen/var/insertBits/3c7ba5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/insertBits/3c7ba5.wgsl.expected.fxc.hlsl
index e84e9b8..1e92e80 100644
--- a/test/tint/builtins/gen/var/insertBits/3c7ba5.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/3c7ba5.wgsl.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 uint2 tint_insert_bits(uint2 v, uint2 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint2((s).xx)) & uint2((mask).xx)) | (v & uint2((~(mask)).xx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint2((offset).xx)) : (0u).xx) & uint2((mask).xx)) | (v & uint2((~(mask)).xx)));
 }
 
 void insertBits_3c7ba5() {
diff --git a/test/tint/builtins/gen/var/insertBits/428b0b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/insertBits/428b0b.wgsl.expected.dxc.hlsl
index 2991280..f863d24 100644
--- a/test/tint/builtins/gen/var/insertBits/428b0b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/428b0b.wgsl.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 int3 tint_insert_bits(int3 v, int3 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint3((s).xxx)) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint3((offset).xxx)) : (0).xxx) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
 }
 
 void insertBits_428b0b() {
diff --git a/test/tint/builtins/gen/var/insertBits/428b0b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/insertBits/428b0b.wgsl.expected.fxc.hlsl
index 2991280..f863d24 100644
--- a/test/tint/builtins/gen/var/insertBits/428b0b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/428b0b.wgsl.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 int3 tint_insert_bits(int3 v, int3 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint3((s).xxx)) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint3((offset).xxx)) : (0).xxx) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
 }
 
 void insertBits_428b0b() {
diff --git a/test/tint/builtins/gen/var/insertBits/51ede1.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/insertBits/51ede1.wgsl.expected.dxc.hlsl
index 46f552a..e0f4cf3 100644
--- a/test/tint/builtins/gen/var/insertBits/51ede1.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/51ede1.wgsl.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 uint4 tint_insert_bits(uint4 v, uint4 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint4((s).xxxx)) & uint4((mask).xxxx)) | (v & uint4((~(mask)).xxxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint4((offset).xxxx)) : (0u).xxxx) & uint4((mask).xxxx)) | (v & uint4((~(mask)).xxxx)));
 }
 
 void insertBits_51ede1() {
diff --git a/test/tint/builtins/gen/var/insertBits/51ede1.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/insertBits/51ede1.wgsl.expected.fxc.hlsl
index 46f552a..e0f4cf3 100644
--- a/test/tint/builtins/gen/var/insertBits/51ede1.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/51ede1.wgsl.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 uint4 tint_insert_bits(uint4 v, uint4 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint4((s).xxxx)) & uint4((mask).xxxx)) | (v & uint4((~(mask)).xxxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint4((offset).xxxx)) : (0u).xxxx) & uint4((mask).xxxx)) | (v & uint4((~(mask)).xxxx)));
 }
 
 void insertBits_51ede1() {
diff --git a/test/tint/builtins/gen/var/insertBits/65468b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/insertBits/65468b.wgsl.expected.dxc.hlsl
index f87cc19..49ac66a 100644
--- a/test/tint/builtins/gen/var/insertBits/65468b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/65468b.wgsl.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 int tint_insert_bits(int v, int n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << s) & int(mask)) | (v & int(~(mask))));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << offset) : 0) & int(mask)) | (v & int(~(mask))));
 }
 
 void insertBits_65468b() {
diff --git a/test/tint/builtins/gen/var/insertBits/65468b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/insertBits/65468b.wgsl.expected.fxc.hlsl
index f87cc19..49ac66a 100644
--- a/test/tint/builtins/gen/var/insertBits/65468b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/65468b.wgsl.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 int tint_insert_bits(int v, int n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << s) & int(mask)) | (v & int(~(mask))));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << offset) : 0) & int(mask)) | (v & int(~(mask))));
 }
 
 void insertBits_65468b() {
diff --git a/test/tint/builtins/gen/var/insertBits/87826b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/insertBits/87826b.wgsl.expected.dxc.hlsl
index a820be8..9b1ac83 100644
--- a/test/tint/builtins/gen/var/insertBits/87826b.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/87826b.wgsl.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 uint3 tint_insert_bits(uint3 v, uint3 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint3((s).xxx)) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint3((offset).xxx)) : (0u).xxx) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
 }
 
 void insertBits_87826b() {
diff --git a/test/tint/builtins/gen/var/insertBits/87826b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/insertBits/87826b.wgsl.expected.fxc.hlsl
index a820be8..9b1ac83 100644
--- a/test/tint/builtins/gen/var/insertBits/87826b.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/87826b.wgsl.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 uint3 tint_insert_bits(uint3 v, uint3 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint3((s).xxx)) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint3((offset).xxx)) : (0u).xxx) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
 }
 
 void insertBits_87826b() {
diff --git a/test/tint/builtins/gen/var/insertBits/d86978.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/insertBits/d86978.wgsl.expected.dxc.hlsl
index fdf1dd3..da39ac7 100644
--- a/test/tint/builtins/gen/var/insertBits/d86978.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/d86978.wgsl.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 int4 tint_insert_bits(int4 v, int4 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint4((s).xxxx)) & int4((int(mask)).xxxx)) | (v & int4((int(~(mask))).xxxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint4((offset).xxxx)) : (0).xxxx) & int4((int(mask)).xxxx)) | (v & int4((int(~(mask))).xxxx)));
 }
 
 void insertBits_d86978() {
diff --git a/test/tint/builtins/gen/var/insertBits/d86978.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/insertBits/d86978.wgsl.expected.fxc.hlsl
index fdf1dd3..da39ac7 100644
--- a/test/tint/builtins/gen/var/insertBits/d86978.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/d86978.wgsl.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 int4 tint_insert_bits(int4 v, int4 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint4((s).xxxx)) & int4((int(mask)).xxxx)) | (v & int4((int(~(mask))).xxxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint4((offset).xxxx)) : (0).xxxx) & int4((int(mask)).xxxx)) | (v & int4((int(~(mask))).xxxx)));
 }
 
 void insertBits_d86978() {
diff --git a/test/tint/builtins/gen/var/insertBits/e3e3a2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/insertBits/e3e3a2.wgsl.expected.dxc.hlsl
index cfbbeee..ea68815 100644
--- a/test/tint/builtins/gen/var/insertBits/e3e3a2.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/e3e3a2.wgsl.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << s) & mask) | (v & ~(mask)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << offset) : 0u) & mask) | (v & ~(mask)));
 }
 
 void insertBits_e3e3a2() {
diff --git a/test/tint/builtins/gen/var/insertBits/e3e3a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/insertBits/e3e3a2.wgsl.expected.fxc.hlsl
index cfbbeee..ea68815 100644
--- a/test/tint/builtins/gen/var/insertBits/e3e3a2.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/e3e3a2.wgsl.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << s) & mask) | (v & ~(mask)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << offset) : 0u) & mask) | (v & ~(mask)));
 }
 
 void insertBits_e3e3a2() {
diff --git a/test/tint/builtins/gen/var/insertBits/fe6ba6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/insertBits/fe6ba6.wgsl.expected.dxc.hlsl
index d2a3073..e94b11d 100644
--- a/test/tint/builtins/gen/var/insertBits/fe6ba6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/fe6ba6.wgsl.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 int2 tint_insert_bits(int2 v, int2 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint2((s).xx)) & int2((int(mask)).xx)) | (v & int2((int(~(mask))).xx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint2((offset).xx)) : (0).xx) & int2((int(mask)).xx)) | (v & int2((int(~(mask))).xx)));
 }
 
 void insertBits_fe6ba6() {
diff --git a/test/tint/builtins/gen/var/insertBits/fe6ba6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/insertBits/fe6ba6.wgsl.expected.fxc.hlsl
index d2a3073..e94b11d 100644
--- a/test/tint/builtins/gen/var/insertBits/fe6ba6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/insertBits/fe6ba6.wgsl.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 int2 tint_insert_bits(int2 v, int2 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint2((s).xx)) & int2((int(mask)).xx)) | (v & int2((int(~(mask))).xx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint2((offset).xx)) : (0).xx) & int2((int(mask)).xx)) | (v & int2((int(~(mask))).xx)));
 }
 
 void insertBits_fe6ba6() {
diff --git a/test/tint/builtins/insertBits/scalar/i32.spvasm.expected.dxc.hlsl b/test/tint/builtins/insertBits/scalar/i32.spvasm.expected.dxc.hlsl
index 7c8f828..0b042e2 100644
--- a/test/tint/builtins/insertBits/scalar/i32.spvasm.expected.dxc.hlsl
+++ b/test/tint/builtins/insertBits/scalar/i32.spvasm.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 int tint_insert_bits(int v, int n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << s) & int(mask)) | (v & int(~(mask))));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << offset) : 0) & int(mask)) | (v & int(~(mask))));
 }
 
 void f_1() {
diff --git a/test/tint/builtins/insertBits/scalar/i32.spvasm.expected.fxc.hlsl b/test/tint/builtins/insertBits/scalar/i32.spvasm.expected.fxc.hlsl
index 7c8f828..0b042e2 100644
--- a/test/tint/builtins/insertBits/scalar/i32.spvasm.expected.fxc.hlsl
+++ b/test/tint/builtins/insertBits/scalar/i32.spvasm.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 int tint_insert_bits(int v, int n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << s) & int(mask)) | (v & int(~(mask))));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << offset) : 0) & int(mask)) | (v & int(~(mask))));
 }
 
 void f_1() {
diff --git a/test/tint/builtins/insertBits/scalar/u32.spvasm.expected.dxc.hlsl b/test/tint/builtins/insertBits/scalar/u32.spvasm.expected.dxc.hlsl
index d416185..e061c8b 100644
--- a/test/tint/builtins/insertBits/scalar/u32.spvasm.expected.dxc.hlsl
+++ b/test/tint/builtins/insertBits/scalar/u32.spvasm.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << s) & mask) | (v & ~(mask)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << offset) : 0u) & mask) | (v & ~(mask)));
 }
 
 void f_1() {
diff --git a/test/tint/builtins/insertBits/scalar/u32.spvasm.expected.fxc.hlsl b/test/tint/builtins/insertBits/scalar/u32.spvasm.expected.fxc.hlsl
index d416185..e061c8b 100644
--- a/test/tint/builtins/insertBits/scalar/u32.spvasm.expected.fxc.hlsl
+++ b/test/tint/builtins/insertBits/scalar/u32.spvasm.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 uint tint_insert_bits(uint v, uint n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << s) & mask) | (v & ~(mask)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << offset) : 0u) & mask) | (v & ~(mask)));
 }
 
 void f_1() {
diff --git a/test/tint/builtins/insertBits/vec3/i32.spvasm.expected.dxc.hlsl b/test/tint/builtins/insertBits/vec3/i32.spvasm.expected.dxc.hlsl
index d7f1951..4f3340b 100644
--- a/test/tint/builtins/insertBits/vec3/i32.spvasm.expected.dxc.hlsl
+++ b/test/tint/builtins/insertBits/vec3/i32.spvasm.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 int3 tint_insert_bits(int3 v, int3 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint3((s).xxx)) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint3((offset).xxx)) : (0).xxx) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
 }
 
 void f_1() {
diff --git a/test/tint/builtins/insertBits/vec3/i32.spvasm.expected.fxc.hlsl b/test/tint/builtins/insertBits/vec3/i32.spvasm.expected.fxc.hlsl
index d7f1951..4f3340b 100644
--- a/test/tint/builtins/insertBits/vec3/i32.spvasm.expected.fxc.hlsl
+++ b/test/tint/builtins/insertBits/vec3/i32.spvasm.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 int3 tint_insert_bits(int3 v, int3 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint3((s).xxx)) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint3((offset).xxx)) : (0).xxx) & int3((int(mask)).xxx)) | (v & int3((int(~(mask))).xxx)));
 }
 
 void f_1() {
diff --git a/test/tint/builtins/insertBits/vec3/u32.spvasm.expected.dxc.hlsl b/test/tint/builtins/insertBits/vec3/u32.spvasm.expected.dxc.hlsl
index ebd4fb3..a778070 100644
--- a/test/tint/builtins/insertBits/vec3/u32.spvasm.expected.dxc.hlsl
+++ b/test/tint/builtins/insertBits/vec3/u32.spvasm.expected.dxc.hlsl
@@ -1,8 +1,7 @@
 uint3 tint_insert_bits(uint3 v, uint3 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint3((s).xxx)) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint3((offset).xxx)) : (0u).xxx) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
 }
 
 void f_1() {
diff --git a/test/tint/builtins/insertBits/vec3/u32.spvasm.expected.fxc.hlsl b/test/tint/builtins/insertBits/vec3/u32.spvasm.expected.fxc.hlsl
index ebd4fb3..a778070 100644
--- a/test/tint/builtins/insertBits/vec3/u32.spvasm.expected.fxc.hlsl
+++ b/test/tint/builtins/insertBits/vec3/u32.spvasm.expected.fxc.hlsl
@@ -1,8 +1,7 @@
 uint3 tint_insert_bits(uint3 v, uint3 n, uint offset, uint count) {
-  const uint s = min(offset, 32u);
-  const uint e = min(32u, (s + count));
-  const uint mask = (((1u << s) - 1u) ^ ((1u << e) - 1u));
-  return (((n << uint3((s).xxx)) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
+  const uint e = (offset + count);
+  const uint mask = ((((offset < 32u) ? (1u << offset) : 0u) - 1u) ^ (((e < 32u) ? (1u << e) : 0u) - 1u));
+  return ((((offset < 32u) ? (n << uint3((offset).xxx)) : (0u).xxx) & uint3((mask).xxx)) | (v & uint3((~(mask)).xxx)));
 }
 
 void f_1() {