Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
prefetch.ml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84type temporal_locality = | None | Low | Moderate | High type operation = | Read | Write (* The compiler needs to know statically the operation and the temporal locality hints, because they correspond to different instructions on amd64 target and different GCC builtins in the C stubs. We have one "external" declaration for each pair of operation, locality, and pointer type. Naming convention: caml_prefetch_<operation>_<temporal_locality>_<pointer_type> *) module Expert = Prefetch_expert let value p ~operation ~temporal_locality = match operation, temporal_locality with | Write, High -> Expert.prefetch_write_high p | Write, Moderate -> Expert.prefetch_write_moderate p | Write, Low -> Expert.prefetch_write_low p | Write, None -> Expert.prefetch_write_none p | Read, None -> Expert.prefetch_read_none p | Read, Low -> Expert.prefetch_read_low p | Read, Moderate -> Expert.prefetch_read_moderate p | Read, High -> Expert.prefetch_read_high p ;; let value_byte_offset p ~byte_offset ~operation ~temporal_locality = match operation, temporal_locality with | Write, High -> Expert.prefetch_write_high_val_offset p ~byte_offset | Write, Moderate -> Expert.prefetch_write_moderate_val_offset p ~byte_offset | Write, Low -> Expert.prefetch_write_low_val_offset p ~byte_offset | Write, None -> Expert.prefetch_write_none_val_offset p ~byte_offset | Read, None -> Expert.prefetch_read_none_val_offset p ~byte_offset | Read, Low -> Expert.prefetch_read_low_val_offset p ~byte_offset | Read, Moderate -> Expert.prefetch_read_moderate_val_offset p ~byte_offset | Read, High -> Expert.prefetch_read_high_val_offset p ~byte_offset ;; let value_pos p ~pos ~operation ~temporal_locality = let byte_offset = Sys.word_size / 8 * pos in value_byte_offset p ~byte_offset ~operation ~temporal_locality ;; let native_pointer p ~operation ~temporal_locality = match operation, temporal_locality with | Write, High -> Expert.prefetch_write_high_native_pointer p | Write, Moderate -> Expert.prefetch_write_moderate_native_pointer p | Write, Low -> Expert.prefetch_write_low_native_pointer p | Write, None -> Expert.prefetch_write_none_native_pointer p | Read, None -> Expert.prefetch_read_none_native_pointer p | Read, Low -> Expert.prefetch_read_low_native_pointer p | Read, Moderate -> Expert.prefetch_read_moderate_native_pointer p | Read, High -> Expert.prefetch_read_high_native_pointer p ;; let ext_pointer p ~operation ~temporal_locality = match operation, temporal_locality with | Write, High -> Expert.prefetch_write_high_ext_pointer p | Write, Moderate -> Expert.prefetch_write_moderate_ext_pointer p | Write, Low -> Expert.prefetch_write_low_ext_pointer p | Write, None -> Expert.prefetch_write_none_ext_pointer p | Read, None -> Expert.prefetch_read_none_ext_pointer p | Read, Low -> Expert.prefetch_read_low_ext_pointer p | Read, Moderate -> Expert.prefetch_read_moderate_ext_pointer p | Read, High -> Expert.prefetch_read_high_ext_pointer p ;; let bigstring bigstring ~pos ~operation ~temporal_locality = match operation, temporal_locality with | Write, High -> Expert.prefetch_write_high_bigstring bigstring pos | Write, Moderate -> Expert.prefetch_write_moderate_bigstring bigstring pos | Write, Low -> Expert.prefetch_write_low_bigstring bigstring pos | Write, None -> Expert.prefetch_write_none_bigstring bigstring pos | Read, None -> Expert.prefetch_read_none_bigstring bigstring pos | Read, Low -> Expert.prefetch_read_low_bigstring bigstring pos | Read, Moderate -> Expert.prefetch_read_moderate_bigstring bigstring pos | Read, High -> Expert.prefetch_read_high_bigstring bigstring pos ;; external pause : unit -> unit = "caml_pause_hint" [@@noalloc] [@@builtin]