Add base.utility.cpu_arch_is_32_bit()
diff --git a/internal/cgen/builtin.go b/internal/cgen/builtin.go
index 61ebff4..91d7729 100644
--- a/internal/cgen/builtin.go
+++ b/internal/cgen/builtin.go
@@ -132,6 +132,9 @@
return g.writeBuiltinTokenWriter(b, recv, method.Ident(), n.Args(), depth)
case t.IDUtility:
switch method.Ident() {
+ case t.IDCPUArchIs32Bit:
+ b.writes("(sizeof(void*) == 4)")
+ return nil
case t.IDEmptyIOReader, t.IDEmptyIOWriter:
if !g.currFunk.usesEmptyIOBuffer {
g.currFunk.usesEmptyIOBuffer = true
diff --git a/lang/builtin/builtin.go b/lang/builtin/builtin.go
index e41754c..1ee51b3 100644
--- a/lang/builtin/builtin.go
+++ b/lang/builtin/builtin.go
@@ -271,6 +271,7 @@
// ---- utility
+ "utility.cpu_arch_is_32_bit() bool",
"utility.empty_io_reader() io_reader",
"utility.empty_io_writer() io_writer",
"utility.empty_range_ii_u32() range_ii_u32",
diff --git a/lang/token/list.go b/lang/token/list.go
index e7b7be5..1422fcc 100644
--- a/lang/token/list.go
+++ b/lang/token/list.go
@@ -624,14 +624,15 @@
// -------- 0x200 block.
- IDAdvance = ID(0x200)
- IDCPUArch = ID(0x201)
- IDInitialize = ID(0x202)
- IDLength = ID(0x203)
- IDReset = ID(0x204)
- IDSet = ID(0x205)
- IDUnroll = ID(0x206)
- IDUpdate = ID(0x207)
+ IDAdvance = ID(0x200)
+ IDCPUArch = ID(0x201)
+ IDCPUArchIs32Bit = ID(0x202)
+ IDInitialize = ID(0x203)
+ IDLength = ID(0x204)
+ IDReset = ID(0x205)
+ IDSet = ID(0x206)
+ IDUnroll = ID(0x207)
+ IDUpdate = ID(0x208)
// TODO: range/rect methods like intersection and contains?
@@ -1045,14 +1046,15 @@
// -------- 0x200 block.
- IDAdvance: "advance",
- IDCPUArch: "cpu_arch",
- IDInitialize: "initialize",
- IDLength: "length",
- IDReset: "reset",
- IDSet: "set",
- IDUnroll: "unroll",
- IDUpdate: "update",
+ IDAdvance: "advance",
+ IDCPUArch: "cpu_arch",
+ IDCPUArchIs32Bit: "cpu_arch_is_32_bit",
+ IDInitialize: "initialize",
+ IDLength: "length",
+ IDReset: "reset",
+ IDSet: "set",
+ IDUnroll: "unroll",
+ IDUpdate: "update",
IDHighBits: "high_bits",
IDLowBits: "low_bits",
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index f6edbd7..c08442c 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -22325,12 +22325,22 @@
}
self->private_impl.f_end_of_block = false;
while (true) {
- if (a_src) {
- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
- }
- v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src);
- if (a_src) {
- iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ if (sizeof(void*) == 4) {
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src);
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
+ } else {
+ if (a_src) {
+ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+ }
+ v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src);
+ if (a_src) {
+ iop_a_src = a_src->data.ptr + a_src->meta.ri;
+ }
}
if (wuffs_base__status__is_error(&v_status)) {
status = v_status;
diff --git a/std/deflate/decode_deflate.wuffs b/std/deflate/decode_deflate.wuffs
index 5186f09..c4e51c6 100644
--- a/std/deflate/decode_deflate.wuffs
+++ b/std/deflate/decode_deflate.wuffs
@@ -258,7 +258,11 @@
this.end_of_block = false
while true {
- status = this.decode_huffman_fast64!(dst: args.dst, src: args.src)
+ if this.util.cpu_arch_is_32_bit() {
+ status = this.decode_huffman_fast64!(dst: args.dst, src: args.src)
+ } else {
+ status = this.decode_huffman_fast64!(dst: args.dst, src: args.src)
+ }
if status.is_error() {
return status
}