oneDNN
oneDNN copied to clipboard
Handle code paths that are assuming Linux just because __GNUC__ is defined
Description
Handle code paths that are assuming Linux just because __GNUC__
is defined.
Fixes #1803
Checklist
General
-
[x] Do all unit and benchdnn tests (
make test
andmake test_benchdnn_*
) pass locally for each commit? -
[x] Have you formatted the code using clang-format?
-
[x] Have you included information on how to reproduce the issue (either in a github issue or in this PR)?
Unit tests output:
Hernan@ARM64-VM CLANGARM64 /c/Dev/Github/oneDNN/build
$ ninja test
[0/1] Running tests...Test project C:/Dev/Github/oneDNN/build
Start 1: cpu-bnorm-u8-via-binary-postops-cpp
1/161 Test #1: cpu-bnorm-u8-via-binary-postops-cpp ..................... Passed 0.05 sec
Start 2: cpu-cnn-inference-f32-c
2/161 Test #2: cpu-cnn-inference-f32-c ................................. Passed 0.09 sec
Start 3: cpu-cnn-inference-f32-cpp
3/161 Test #3: cpu-cnn-inference-f32-cpp ............................... Passed 5.53 sec
Start 4: cpu-cnn-inference-int8-cpp
4/161 Test #4: cpu-cnn-inference-int8-cpp .............................. Passed 0.17 sec
Start 5: cpu-cnn-training-bf16-cpp
5/161 Test #5: cpu-cnn-training-bf16-cpp ............................... Passed 0.09 sec
Start 6: cpu-cnn-training-f32-cpp
6/161 Test #6: cpu-cnn-training-f32-cpp ................................ Passed 0.54 sec
Start 7: cpu-cnn-training-f32-c
7/161 Test #7: cpu-cnn-training-f32-c .................................. Passed 1.06 sec
Start 8: cpu-rnn-inference-f32-cpp
8/161 Test #8: cpu-rnn-inference-f32-cpp ............................... Passed 0.12 sec
Start 9: cpu-rnn-inference-int8-cpp
9/161 Test #9: cpu-rnn-inference-int8-cpp .............................. Passed 0.05 sec
Start 10: cpu-getting-started-cpp
10/161 Test #10: cpu-getting-started-cpp ................................. Passed 0.03 sec
Start 11: cpu-graph-getting-started-cpp
11/161 Test #11: cpu-graph-getting-started-cpp ........................... Passed 0.06 sec
Start 12: cpu-graph-inference-int8-cpp
12/161 Test #12: cpu-graph-inference-int8-cpp ............................ Passed 0.10 sec
Start 13: cpu-graph-single-op-partition-cpp
13/161 Test #13: cpu-graph-single-op-partition-cpp ....................... Passed 0.05 sec
Start 14: cpu-matmul-perf-cpp
14/161 Test #14: cpu-matmul-perf-cpp ..................................... Passed 15.64 sec
Start 15: cpu-memory-format-propagation-cpp
15/161 Test #15: cpu-memory-format-propagation-cpp ....................... Passed 0.05 sec
Start 16: cpu-performance-profiling-cpp
16/161 Test #16: cpu-performance-profiling-cpp ........................... Passed 1.09 sec
Start 17: cpu-primitives-augru-cpp
17/161 Test #17: cpu-primitives-augru-cpp ................................ Passed 0.03 sec
Start 18: cpu-primitives-batch-normalization-cpp
18/161 Test #18: cpu-primitives-batch-normalization-cpp .................. Passed 0.05 sec
Start 19: cpu-primitives-binary-cpp
19/161 Test #19: cpu-primitives-binary-cpp ............................... Passed 0.04 sec
Start 20: cpu-primitives-concat-cpp
20/161 Test #20: cpu-primitives-concat-cpp ............................... Passed 0.04 sec
Start 21: cpu-primitives-convolution-cpp
21/161 Test #21: cpu-primitives-convolution-cpp .......................... Passed 0.04 sec
Start 22: cpu-primitives-eltwise-cpp
22/161 Test #22: cpu-primitives-eltwise-cpp .............................. Passed 0.04 sec
Start 23: cpu-primitives-group-normalization-cpp
23/161 Test #23: cpu-primitives-group-normalization-cpp .................. Passed 0.34 sec
Start 24: cpu-primitives-inner-product-cpp
24/161 Test #24: cpu-primitives-inner-product-cpp ........................ Passed 0.24 sec
Start 25: cpu-primitives-layer-normalization-cpp
25/161 Test #25: cpu-primitives-layer-normalization-cpp .................. Passed 0.04 sec
Start 26: cpu-primitives-lrn-cpp
26/161 Test #26: cpu-primitives-lrn-cpp .................................. Passed 0.04 sec
Start 27: cpu-primitives-lstm-cpp
27/161 Test #27: cpu-primitives-lstm-cpp ................................. Passed 0.03 sec
Start 28: cpu-primitives-matmul-cpp
28/161 Test #28: cpu-primitives-matmul-cpp ............................... Passed 0.04 sec
Start 29: cpu-primitives-pooling-cpp
29/161 Test #29: cpu-primitives-pooling-cpp .............................. Passed 0.03 sec
Start 30: cpu-primitives-prelu-cpp
30/161 Test #30: cpu-primitives-prelu-cpp ................................ Passed 0.05 sec
Start 31: cpu-primitives-reduction-cpp
31/161 Test #31: cpu-primitives-reduction-cpp ............................ Passed 0.04 sec
Start 32: cpu-primitives-reorder-cpp
32/161 Test #32: cpu-primitives-reorder-cpp .............................. Passed 0.04 sec
Start 33: cpu-primitives-resampling-cpp
33/161 Test #33: cpu-primitives-resampling-cpp ........................... Passed 0.04 sec
Start 34: cpu-primitives-shuffle-cpp
34/161 Test #34: cpu-primitives-shuffle-cpp .............................. Passed 0.19 sec
Start 35: cpu-primitives-softmax-cpp
35/161 Test #35: cpu-primitives-softmax-cpp .............................. Passed 0.03 sec
Start 36: cpu-primitives-sum-cpp
36/161 Test #36: cpu-primitives-sum-cpp .................................. Passed 0.04 sec
Start 37: cpu-rnn-training-f32-cpp
37/161 Test #37: cpu-rnn-training-f32-cpp ................................ Passed 0.89 sec
Start 38: cpu-tutorials-matmul-matmul-quantization-cpp
38/161 Test #38: cpu-tutorials-matmul-matmul-quantization-cpp ............ Passed 0.04 sec
Start 39: cpu-tutorials-matmul-sgemm-and-matmul-cpp
39/161 Test #39: cpu-tutorials-matmul-sgemm-and-matmul-cpp ............... Passed 0.04 sec
Start 40: cpu-tutorials-matmul-inference-int8-matmul-cpp
40/161 Test #40: cpu-tutorials-matmul-inference-int8-matmul-cpp .......... Passed 0.04 sec
Start 41: cpu-tutorials-matmul-weights-decompression-matmul-cpp
41/161 Test #41: cpu-tutorials-matmul-weights-decompression-matmul-cpp ... Passed 0.08 sec
Start 42: api-c
42/161 Test #42: api-c ................................................... Passed 0.55 sec
Start 43: test_batch_normalization
43/161 Test #43: test_batch_normalization ................................ Passed 0.78 sec
Start 44: test_binary
44/161 Test #44: test_binary ............................................. Passed 0.88 sec
Start 45: test_concat
45/161 Test #45: test_concat ............................................. Passed 0.74 sec
Start 46: test_concurrency
46/161 Test #46: test_concurrency ........................................ Passed 0.83 sec
Start 47: test_convolution_backward_data_f32
47/161 Test #47: test_convolution_backward_data_f32 ...................... Passed 8.87 sec
Start 48: test_convolution_backward_weights_f32
48/161 Test #48: test_convolution_backward_weights_f32 ................... Passed 8.85 sec
Start 49: test_convolution_eltwise_forward_f32
49/161 Test #49: test_convolution_eltwise_forward_f32 .................... Passed 10.63 sec
Start 50: test_convolution_eltwise_forward_x8s8f32s32
50/161 Test #50: test_convolution_eltwise_forward_x8s8f32s32 ............. Passed 3.95 sec
Start 51: test_convolution_forward_f32
51/161 Test #51: test_convolution_forward_f32 ............................ Passed 8.13 sec
Start 52: test_convolution_forward_u8s8fp
52/161 Test #52: test_convolution_forward_u8s8fp ......................... Passed 0.87 sec
Start 53: test_convolution_forward_u8s8s32
53/161 Test #53: test_convolution_forward_u8s8s32 ........................ Passed 0.88 sec
Start 54: test_cross_engine_reorder
54/161 Test #54: test_cross_engine_reorder ............................... Passed 0.72 sec
Start 55: test_deconvolution
55/161 Test #55: test_deconvolution ...................................... Passed 1.08 sec
Start 56: test_eltwise
56/161 Test #56: test_eltwise ............................................ Passed 0.92 sec
Start 57: test_group_normalization
57/161 Test #57: test_group_normalization ................................ Passed 0.77 sec
Start 58: test_iface_attr
58/161 Test #58: test_iface_attr ......................................... Passed 0.76 sec
Start 59: test_iface_attr_quantization
59/161 Test #59: test_iface_attr_quantization ............................ Passed 0.74 sec
Start 60: test_iface_binary_bcast
60/161 Test #60: test_iface_binary_bcast ................................. Passed 0.73 sec
Start 61: test_iface_handle
61/161 Test #61: test_iface_handle ....................................... Passed 0.72 sec
Start 62: test_iface_pd
62/161 Test #62: test_iface_pd ........................................... Passed 0.72 sec
Start 63: test_iface_pd_iter
63/161 Test #63: test_iface_pd_iter ...................................... Passed 0.73 sec
Start 64: test_iface_primitive_cache
64/161 Test #64: test_iface_primitive_cache .............................. Passed 0.73 sec
Start 65: test_iface_runtime_dims
65/161 Test #65: test_iface_runtime_dims ................................. Passed 0.72 sec
Start 66: test_iface_weights_format
66/161 Test #66: test_iface_weights_format ............................... Passed 0.70 sec
Start 67: test_iface_wino_convolution
67/161 Test #67: test_iface_wino_convolution ............................. Passed 0.71 sec
Start 68: test_inner_product_backward_data
68/161 Test #68: test_inner_product_backward_data ........................ Passed 0.79 sec
Start 69: test_inner_product_backward_weights
69/161 Test #69: test_inner_product_backward_weights ..................... Passed 1.18 sec
Start 70: test_inner_product_forward
70/161 Test #70: test_inner_product_forward .............................. Passed 0.80 sec
Start 71: test_layer_normalization
71/161 Test #71: test_layer_normalization ................................ Passed 0.77 sec
Start 72: test_lrn
72/161 Test #72: test_lrn ................................................ Passed 3.10 sec
Start 73: test_matmul
73/161 Test #73: test_matmul ............................................. Passed 0.75 sec
Start 74: test_persistent_cache_api
74/161 Test #74: test_persistent_cache_api ............................... Passed 0.71 sec
Start 75: test_pooling_backward
75/161 Test #75: test_pooling_backward ................................... Passed 9.72 sec
Start 76: test_pooling_forward
76/161 Test #76: test_pooling_forward .................................... Passed 16.56 sec
Start 77: test_prelu
77/161 Test #77: test_prelu .............................................. Passed 0.75 sec
Start 78: test_primitive_cache_mt
78/161 Test #78: test_primitive_cache_mt ................................. Passed 0.72 sec
Start 79: test_reduction
79/161 Test #79: test_reduction .......................................... Passed 0.73 sec
Start 80: test_reorder
80/161 Test #80: test_reorder ............................................ Passed 1.39 sec
Start 81: test_resampling
81/161 Test #81: test_resampling ......................................... Passed 0.76 sec
Start 82: test_rnn_forward
82/161 Test #82: test_rnn_forward ........................................ Passed 0.72 sec
Start 83: test_shuffle
83/161 Test #83: test_shuffle ............................................ Passed 0.73 sec
Start 84: test_softmax
84/161 Test #84: test_softmax ............................................ Passed 0.85 sec
Start 85: test_sum
85/161 Test #85: test_sum ................................................ Passed 3.68 sec
Start 86: test_convolution_format_any
86/161 Test #86: test_convolution_format_any ............................. Passed 0.71 sec
Start 87: test_gemm_bf16bf16bf16
87/161 Test #87: test_gemm_bf16bf16bf16 .................................. Passed 0.71 sec
Start 88: test_gemm_bf16bf16f32
88/161 Test #88: test_gemm_bf16bf16f32 ................................... Passed 0.71 sec
Start 89: test_gemm_f16
89/161 Test #89: test_gemm_f16 ........................................... Passed 0.70 sec
Start 90: test_gemm_f16f16f32
90/161 Test #90: test_gemm_f16f16f32 ..................................... Passed 0.70 sec
Start 91: test_gemm_f32
91/161 Test #91: test_gemm_f32 ........................................... Passed 3.64 sec
Start 92: test_gemm_s8s8s32
92/161 Test #92: test_gemm_s8s8s32 ....................................... Passed 7.85 sec
Start 93: test_gemm_s8u8s32
93/161 Test #93: test_gemm_s8u8s32 ....................................... Passed 0.72 sec
Start 94: test_gemm_u8s8s32
94/161 Test #94: test_gemm_u8s8s32 ....................................... Passed 8.02 sec
Start 95: test_gemm_u8u8s32
95/161 Test #95: test_gemm_u8u8s32 ....................................... Passed 0.72 sec
Start 96: test_global_scratchpad
96/161 Test #96: test_global_scratchpad .................................. Passed 0.70 sec
Start 97: test_api
97/161 Test #97: test_api ................................................ Passed 0.75 sec
Start 98: test_internals_env_vars_dnnl
98/161 Test #98: test_internals_env_vars_dnnl ............................ Passed 0.71 sec
Start 99: test_internals_env_vars_onednn
99/161 Test #99: test_internals_env_vars_onednn .......................... Passed 0.70 sec
Start 100: test_internals
100/161 Test #100: test_internals .......................................... Passed 0.71 sec
Start 101: test_regression
101/161 Test #101: test_regression ......................................... Passed 0.71 sec
Start 102: test_graph_c_api_add_op
102/161 Test #102: test_graph_c_api_add_op ................................. Passed 0.03 sec
Start 103: test_graph_c_api_constant_cache
103/161 Test #103: test_graph_c_api_constant_cache ......................... Passed 0.04 sec
Start 104: test_graph_c_api_filter
104/161 Test #104: test_graph_c_api_filter ................................. Passed 0.04 sec
Start 105: test_graph_c_api_graph
105/161 Test #105: test_graph_c_api_graph .................................. Passed 0.03 sec
Start 106: test_graph_c_api_logical_tensor
106/161 Test #106: test_graph_c_api_logical_tensor ......................... Passed 0.03 sec
Start 107: test_graph_c_api_op
107/161 Test #107: test_graph_c_api_op ..................................... Passed 0.03 sec
Start 108: test_graph_cpp_api_constant_cache
108/161 Test #108: test_graph_cpp_api_constant_cache ....................... Passed 0.03 sec
Start 109: test_graph_cpp_api_engine
109/161 Test #109: test_graph_cpp_api_engine ............................... Passed 0.03 sec
Start 110: test_graph_cpp_api_graph
110/161 Test #110: test_graph_cpp_api_graph ................................ Passed 0.03 sec
Start 111: test_graph_cpp_api_logical_tensor
111/161 Test #111: test_graph_cpp_api_logical_tensor ....................... Passed 0.04 sec
Start 112: test_graph_cpp_api_op
112/161 Test #112: test_graph_cpp_api_op ................................... Passed 0.04 sec
Start 113: test_graph_cpp_api_tensor
113/161 Test #113: test_graph_cpp_api_tensor ............................... Passed 0.03 sec
Start 114: test_graph_c_api_compile_usm_cpu
114/161 Test #114: test_graph_c_api_compile_usm_cpu ........................ Passed 0.05 sec
Start 115: test_graph_c_api_compile_parametrized_usm_cpu
115/161 Test #115: test_graph_c_api_compile_parametrized_usm_cpu ........... Passed 0.04 sec
Start 116: test_graph_cpp_api_compile_usm_cpu
116/161 Test #116: test_graph_cpp_api_compile_usm_cpu ...................... Passed 0.05 sec
Start 117: test_graph_cpp_api_partition_usm_cpu
117/161 Test #117: test_graph_cpp_api_partition_usm_cpu .................... Passed 0.04 sec
Start 118: test_graph_unit_interface
118/161 Test #118: test_graph_unit_interface ............................... Passed 0.05 sec
Start 119: test_graph_unit_fake
119/161 Test #119: test_graph_unit_fake .................................... Passed 0.04 sec
Start 120: test_graph_unit_dnnl_common
120/161 Test #120: test_graph_unit_dnnl_common ............................. Passed 0.04 sec
Start 121: test_graph_unit_dnnl_constant_cache
121/161 Test #121: test_graph_unit_dnnl_constant_cache ..................... Passed 0.03 sec
Start 122: test_graph_unit_dnnl_dnnl_infer_shape
122/161 Test #122: test_graph_unit_dnnl_dnnl_infer_shape ................... Passed 0.04 sec
Start 123: test_graph_unit_dnnl_dnnl_partition_impl
123/161 Test #123: test_graph_unit_dnnl_dnnl_partition_impl ................ Passed 0.04 sec
Start 124: test_graph_unit_dnnl_fusion_info
124/161 Test #124: test_graph_unit_dnnl_fusion_info ........................ Passed 0.04 sec
Start 125: test_graph_unit_dnnl_graph
125/161 Test #125: test_graph_unit_dnnl_graph .............................. Passed 0.04 sec
Start 126: test_graph_unit_dnnl_insert_ops
126/161 Test #126: test_graph_unit_dnnl_insert_ops ......................... Passed 0.04 sec
Start 127: test_graph_unit_dnnl_internal_attrs
127/161 Test #127: test_graph_unit_dnnl_internal_attrs ..................... Passed 0.03 sec
Start 128: test_graph_unit_dnnl_layout_id
128/161 Test #128: test_graph_unit_dnnl_layout_id .......................... Passed 0.03 sec
Start 129: test_graph_unit_dnnl_layout_propagator
129/161 Test #129: test_graph_unit_dnnl_layout_propagator .................. Passed 0.04 sec
Start 130: test_graph_unit_dnnl_logical_tensor
130/161 Test #130: test_graph_unit_dnnl_logical_tensor ..................... Passed 0.05 sec
Start 131: test_graph_unit_dnnl_memory_planning
131/161 Test #131: test_graph_unit_dnnl_memory_planning .................... Passed 0.04 sec
Start 132: test_graph_unit_dnnl_op_executable
132/161 Test #132: test_graph_unit_dnnl_op_executable ...................... Passed 0.04 sec
Start 133: test_graph_unit_dnnl_op_schema
133/161 Test #133: test_graph_unit_dnnl_op_schema .......................... Passed 0.04 sec
Start 134: test_graph_unit_dnnl_partition
134/161 Test #134: test_graph_unit_dnnl_partition .......................... Passed 0.04 sec
Start 135: test_graph_unit_dnnl_pass
135/161 Test #135: test_graph_unit_dnnl_pass ............................... Passed 0.15 sec
Start 136: test_graph_unit_dnnl_scratchpad
136/161 Test #136: test_graph_unit_dnnl_scratchpad ......................... Passed 0.04 sec
Start 137: test_graph_unit_dnnl_subgraph_pass
137/161 Test #137: test_graph_unit_dnnl_subgraph_pass ...................... Passed 0.05 sec
Start 138: test_graph_unit_dnnl_thread_local_cache
138/161 Test #138: test_graph_unit_dnnl_thread_local_cache ................. Passed 0.04 sec
Start 139: test_graph_unit_dnnl_batch_norm_usm_cpu
139/161 Test #139: test_graph_unit_dnnl_batch_norm_usm_cpu ................. Passed 0.06 sec
Start 140: test_graph_unit_dnnl_binary_op_usm_cpu
140/161 Test #140: test_graph_unit_dnnl_binary_op_usm_cpu .................. Passed 0.12 sec
Start 141: test_graph_unit_dnnl_bmm_usm_cpu
141/161 Test #141: test_graph_unit_dnnl_bmm_usm_cpu ........................ Passed 0.07 sec
Start 142: test_graph_unit_dnnl_compiled_partition_usm_cpu
142/161 Test #142: test_graph_unit_dnnl_compiled_partition_usm_cpu ......... Passed 0.04 sec
Start 143: test_graph_unit_dnnl_concat_usm_cpu
143/161 Test #143: test_graph_unit_dnnl_concat_usm_cpu ..................... Passed 0.05 sec
Start 144: test_graph_unit_dnnl_conv_usm_cpu
144/161 Test #144: test_graph_unit_dnnl_conv_usm_cpu ....................... Passed 1.47 sec
Start 145: test_graph_unit_dnnl_convtranspose_usm_cpu
145/161 Test #145: test_graph_unit_dnnl_convtranspose_usm_cpu .............. Passed 0.28 sec
Start 146: test_graph_unit_dnnl_dequantize_usm_cpu
146/161 Test #146: test_graph_unit_dnnl_dequantize_usm_cpu ................. Passed 0.04 sec
Start 147: test_graph_unit_dnnl_eltwise_usm_cpu
147/161 Test #147: test_graph_unit_dnnl_eltwise_usm_cpu .................... Passed 0.06 sec
Start 148: test_graph_unit_dnnl_interpolate_usm_cpu
148/161 Test #148: test_graph_unit_dnnl_interpolate_usm_cpu ................ Passed 0.05 sec
Start 149: test_graph_unit_dnnl_large_partition_usm_cpu
149/161 Test #149: test_graph_unit_dnnl_large_partition_usm_cpu ............ Passed 0.38 sec
Start 150: test_graph_unit_dnnl_layer_norm_usm_cpu
150/161 Test #150: test_graph_unit_dnnl_layer_norm_usm_cpu ................. Passed 0.05 sec
Start 151: test_graph_unit_dnnl_matmul_usm_cpu
151/161 Test #151: test_graph_unit_dnnl_matmul_usm_cpu ..................... Passed 1.56 sec
Start 152: test_graph_unit_dnnl_pool_usm_cpu
152/161 Test #152: test_graph_unit_dnnl_pool_usm_cpu ....................... Passed 0.16 sec
Start 153: test_graph_unit_dnnl_prelu_usm_cpu
153/161 Test #153: test_graph_unit_dnnl_prelu_usm_cpu ...................... Passed 0.05 sec
Start 154: test_graph_unit_dnnl_quantize_usm_cpu
154/161 Test #154: test_graph_unit_dnnl_quantize_usm_cpu ................... Passed 0.04 sec
Start 155: test_graph_unit_dnnl_reduce_usm_cpu
155/161 Test #155: test_graph_unit_dnnl_reduce_usm_cpu ..................... Passed 0.10 sec
Start 156: test_graph_unit_dnnl_reorder_usm_cpu
156/161 Test #156: test_graph_unit_dnnl_reorder_usm_cpu .................... Passed 0.04 sec
Start 157: test_graph_unit_dnnl_sdp_decomp_usm_cpu
157/161 Test #157: test_graph_unit_dnnl_sdp_decomp_usm_cpu ................. Passed 9.56 sec
Start 158: test_graph_unit_dnnl_softmax_usm_cpu
158/161 Test #158: test_graph_unit_dnnl_softmax_usm_cpu .................... Passed 0.05 sec
Start 159: test_graph_unit_dnnl_typecast_usm_cpu
159/161 Test #159: test_graph_unit_dnnl_typecast_usm_cpu ................... Passed 0.05 sec
Start 160: test_graph_unit_utils
160/161 Test #160: test_graph_unit_utils ................................... Passed 0.05 sec
Start 161: noexcept-cpp
161/161 Test #161: noexcept-cpp ............................................ Passed 0.01 sec
100% tests passed, 0 tests failed out of 161
Total Test time (real) = 173.57 sec
+@jondea
@jondea the root of the issue here is that there's a bunch of #ifdefs that just assume the OS is Linux if GNUC is defined. We can't do that with MinGW. This is mostly affecting the xbyak_aarch64 files because it seems that this code was never tested with a compiler that defines GNUC on Windows on ARM. Visual Studio is already taken care of by the absence of GNUC.
And there's one unit test that is failing to build with MinGW, in all architectures.
What I mean to say is that if the root of the issue is an OS difference, then fixing the root of the issue is to use OS ifdefs
, not to add another, more specific compiler ifdef
.
I simplified the ifdefs with _WIN32 instead. All working. The code builds, for Windows on ARM with both MSVC and Clang. The unit tests are 100% passing in both builds. \o/
LGTM. Adding xbyak_arch64 maintainer @kawakami-k as this needs upstreaming there.
@hmartinez82 Thank you for the PR. I'll feedback this PR into the original https://github.com/fujitsu/xbyak_aarch64