├── .gitignore ├── LICENSE.md ├── Makefile ├── correctness ├── correctness.ml └── dune ├── dune-project ├── faster-map.opam ├── functions ├── contrib.ml ├── dune ├── existing.ml └── naive.ml ├── generator ├── dune └── generator.ml ├── memory ├── base │ ├── dune │ └── test.ml ├── batteries │ ├── dune │ └── test.ml ├── containers │ ├── dune │ └── test.ml ├── dune ├── functions.ml ├── jbuild.common ├── naive │ ├── dune │ └── test.ml ├── proposed │ ├── dune │ └── test.ml ├── stdlib │ ├── dune │ └── test.ml └── unrolled │ ├── dune │ └── test.ml ├── reporter ├── dune ├── graph.gnuplot └── reporter.ml ├── results ├── core_bench.txt ├── faster_map.ml ├── faster_map.s └── memory.txt └── tester ├── dune └── tester.ml /.gitignore: -------------------------------------------------------------------------------- 1 | _build/ 2 | _report/ 3 | .merlin 4 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017-2021 Anton Bachin 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY : run 2 | run : 3 | dune build tester/tester.exe reporter/reporter.exe 4 | mkdir -p _report 5 | _build/default/tester/tester.exe -ascii -quota 10 > _report/core_bench.txt 6 | _build/default/reporter/reporter.exe \ 7 | < _report/core_bench.txt > _report/results.txt 8 | gnuplot reporter/graph.gnuplot 9 | 10 | .PHONY : test-correctness 11 | test-correctness : 12 | dune build correctness/correctness.exe 13 | _build/default/correctness/correctness.exe 14 | 15 | MEMORY_TESTS := $(shell ls memory/*/test.ml) 16 | MEMORY_TESTS := $(MEMORY_TESTS:.ml=.exe) 17 | 18 | .PHONY : compare-memory-usage 19 | compare-memory-usage : 20 | dune build $(MEMORY_TESTS) 21 | @echo "map stack heap total" 22 | @for TEST in $(MEMORY_TESTS) ; \ 23 | do \ 24 | _build/default/$$TEST || exit 1 ; \ 25 | done 26 | 27 | .PHONY : depend 28 | depend : 29 | opam pin add -yn faster-map . 30 | opam install -y --deps-only faster-map 31 | which gnuplot || (echo "Please install gnuplot"; false) 32 | 33 | .PHONY : clean 34 | clean : 35 | dune clean 36 | rm -rf _report 37 | -------------------------------------------------------------------------------- /correctness/correctness.ml: -------------------------------------------------------------------------------- 1 | let () = 2 | let test_at_sizes = 3 | [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12] 4 | @ [13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25] 5 | @ [500] 6 | @ [1000; 1001; 1002; 1003; 1004; 1005; 1006; 1007; 1008; 1009; 7 | 1010; 1011; 1012; 1013; 1014; 1015; 1016; 1017; 1018; 1019; 8 | 1020; 1021; 1022; 1023; 1024; 1025] 9 | @ [5000; 5001; 5002; 5003; 5004; 5005; 5006; 5007; 5008; 5009; 10 | 5010; 5011; 5012; 5013; 5014; 5015; 5016; 5017; 5018; 5019; 11 | 5020; 5021; 5022; 5023; 5024; 5025] 12 | @ [10000] 13 | @ [1000000] 14 | @ [100000000] 15 | in 16 | 17 | let make_list n = 18 | let rec loop n list_acc = 19 | if n <= 0 then 20 | list_acc 21 | else 22 | loop (n - 1) (n::list_acc) 23 | in 24 | loop n [] 25 | in 26 | 27 | let f = (+) 1 in 28 | 29 | let safe_map f l = List.rev_map f l |> List.rev in 30 | 31 | let faster_map = 32 | Functions.Generated.plain_unrolled_prefix_5 33 | Functions.Generated.chunked_tail_recursive_map_12 1000 34 | in 35 | 36 | let test size = 37 | Printf.printf "Testing at size %i\n%!" size; 38 | let argument = make_list size in 39 | assert (safe_map f argument = faster_map f argument) 40 | in 41 | 42 | List.iter test test_at_sizes 43 | -------------------------------------------------------------------------------- /correctness/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name correctness) 3 | (flags :standard -w +A) 4 | (libraries faster-map.functions)) 5 | -------------------------------------------------------------------------------- /dune-project: -------------------------------------------------------------------------------- 1 | (lang dune 1.0) 2 | (name faster-map) 3 | -------------------------------------------------------------------------------- /faster-map.opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | synopsis: "A tail-recursive list map with good performance for all list sizes. Not actually written in assembly" 3 | authors: "Anton Bachin " 4 | maintainer: "Anton Bachin " 5 | homepage: "https://github.com/aantron/faster-map" 6 | bug-reports: "https://github.com/aantron/faster-map/issues" 7 | 8 | depends: [ 9 | "base" 10 | "batteries" 11 | "containers" 12 | "core_bench" 13 | "dune" 14 | ] 15 | -------------------------------------------------------------------------------- /functions/contrib.ml: -------------------------------------------------------------------------------- 1 | let tupled_map f xs = 2 | 3 | let rec rise ys = function 4 | | [] -> 5 | ys 6 | | (y0, y1, y2, y3, y4, y5, y6, y7) :: bs -> 7 | rise (y0 :: y1 :: y2 :: y3 :: y4 :: y5 :: y6 :: y7 :: ys) bs in 8 | 9 | let rec dive bs = function 10 | | x0 :: x1 :: x2 :: x3 :: x4 :: x5 :: x6 :: x7 :: xs -> 11 | let y0 = f x0 in 12 | let y1 = f x1 in 13 | let y2 = f x2 in 14 | let y3 = f x3 in 15 | let y4 = f x4 in 16 | let y5 = f x5 in 17 | let y6 = f x6 in 18 | let y7 = f x7 in 19 | dive ((y0, y1, y2, y3, y4, y5, y6, y7) :: bs) xs 20 | | xs -> 21 | rise (List.map f xs) bs in 22 | 23 | dive [] xs 24 | -------------------------------------------------------------------------------- /functions/dune: -------------------------------------------------------------------------------- 1 | ; Example output of the generator can be found in results/faster_map.ml. That is 2 | ; basically a dumped and commented generated.ml. 3 | 4 | (rule 5 | (targets generated.ml) 6 | (deps 7 | (:< %{workspace_root}/generator/generator.exe)) 8 | (action 9 | (with-stdout-to 10 | %{targets} 11 | (run %{<})))) 12 | 13 | (library 14 | (name functions) 15 | (public_name faster-map.functions) 16 | (flags :standard -w +A) 17 | (ocamlopt_flags :standard -O3) 18 | (libraries base batteries containers)) 19 | -------------------------------------------------------------------------------- /functions/existing.ml: -------------------------------------------------------------------------------- 1 | let base_map f l = 2 | Base.List.map l ~f 3 | 4 | let batteries_map = 5 | BatList.map 6 | 7 | let containers_map = 8 | CCList.map 9 | -------------------------------------------------------------------------------- /functions/naive.ml: -------------------------------------------------------------------------------- 1 | let stdlib_map = 2 | List.map 3 | 4 | let tail_recursive_map f l = 5 | List.rev (List.rev_map f l) 6 | -------------------------------------------------------------------------------- /generator/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name generator) 3 | (flags :standard -w +A)) 4 | -------------------------------------------------------------------------------- /generator/generator.ml: -------------------------------------------------------------------------------- 1 | (* [range n] evaluates to [[1; 2; ...; n-1; n]]. *) 2 | let range n = 3 | let rec range acc n = 4 | match n with 5 | | 0 -> 6 | acc 7 | | n -> 8 | range (n::acc) (n - 1) 9 | in 10 | range [] n 11 | 12 | (* Useful abbreviations. *) 13 | let p = Printf.printf 14 | let fmt = Printf.sprintf 15 | 16 | 17 | 18 | (* [plain_unrolled unrolling_factor] generates the source code of an unrolled 19 | variant of the non-tail-recursive [List.map], with unrolling factor 20 | [unrolling_factor], and writes it to STDOUT. 21 | 22 | Example output: 23 | 24 | {[ 25 | let rec plain_unrolled_map_5 f l = 26 | match l with 27 | | [] -> 28 | [] 29 | | [x1] -> 30 | let y1 = f x1 in 31 | [y1] 32 | | [x1; x2] -> 33 | let y1 = f x1 in 34 | let y2 = f x2 in 35 | [y1; y2] 36 | | [x1; x2; x3] -> 37 | let y1 = f x1 in 38 | let y2 = f x2 in 39 | let y3 = f x3 in 40 | [y1; y2; y3] 41 | | [x1; x2; x3; x4] -> 42 | let y1 = f x1 in 43 | let y2 = f x2 in 44 | let y3 = f x3 in 45 | let y4 = f x4 in 46 | [y1; y2; y3; y4] 47 | | x1::x2::x3::x4::x5::tail -> 48 | let y1 = f x1 in 49 | let y2 = f x2 in 50 | let y3 = f x3 in 51 | let y4 = f x4 in 52 | let y5 = f x5 in 53 | y1::y2::y3::y4::y5::(plain_unrolled_map_5 f tail) 54 | ]} *) 55 | let plain_unrolled unrolling_factor = 56 | p "let rec plain_unrolled_map_%i f l =\n" unrolling_factor; 57 | p " match l with\n"; 58 | 59 | for i = 0 to unrolling_factor - 1 do 60 | range i 61 | |> List.map (fmt "x%i") 62 | |> String.concat "; " 63 | |> p " | [%s] ->\n"; 64 | 65 | range i 66 | |> List.map (fun i -> fmt "let y%i = f x%i in" i i) 67 | |> List.iter (p " %s\n"); 68 | 69 | range i 70 | |> List.map (fmt "y%i") 71 | |> String.concat "; " 72 | |> p " [%s]\n"; 73 | done; 74 | 75 | range unrolling_factor 76 | |> List.map (fmt "x%i") 77 | |> String.concat "::" 78 | |> p " | %s::tail ->\n"; 79 | 80 | range unrolling_factor 81 | |> List.map (fun i -> fmt "let y%i = f x%i in" i i) 82 | |> List.iter (p " %s\n"); 83 | 84 | range unrolling_factor 85 | |> List.map (fmt "y%i") 86 | |> String.concat "::" 87 | |> fun s -> p " %s::(plain_unrolled_map_%i f tail)\n" s unrolling_factor; 88 | 89 | p "\n"; 90 | 91 | () 92 | 93 | 94 | 95 | (* Largely the same as plain_unrolled, but the generated function takes two 96 | additional argments: the maximum number of iterations to perform, and another 97 | function to call for mapping the list tail when that number of iterations is 98 | reached. 99 | 100 | It also applies [f] in reverse order, because the new fast tail-recursive map 101 | applies [f] in reverse order to the suffix. 102 | 103 | Example output: 104 | 105 | {[ 106 | let rec plain_unrolled_prefix_5 map_suffix count f l = 107 | match l with 108 | | [] -> 109 | [] 110 | | [x1] -> 111 | let y1 = f x1 in 112 | [y1] 113 | | [x1; x2] -> 114 | let y2 = f x2 in 115 | let y1 = f x1 in 116 | [y1; y2] 117 | | [x1; x2; x3] -> 118 | let y3 = f x3 in 119 | let y2 = f x2 in 120 | let y1 = f x1 in 121 | [y1; y2; y3] 122 | | [x1; x2; x3; x4] -> 123 | let y4 = f x4 in 124 | let y3 = f x3 in 125 | let y2 = f x2 in 126 | let y1 = f x1 in 127 | [y1; y2; y3; y4] 128 | | x1::x2::x3::x4::x5::tail -> 129 | let tail = 130 | if count <= 0 then 131 | map_suffix f tail 132 | else 133 | plain_unrolled_prefix_5 map_suffix (count - 1) f tail 134 | in 135 | let y5 = f x5 in 136 | let y4 = f x4 in 137 | let y3 = f x3 in 138 | let y2 = f x2 in 139 | let y1 = f x1 in 140 | y1::y2::y3::y4::y5::tail 141 | ]} *) 142 | let plain_unrolled_prefix unrolling_factor = 143 | p "let rec plain_unrolled_prefix_%i map_suffix count f l =\n" 144 | unrolling_factor; 145 | p " match l with\n"; 146 | 147 | for i = 0 to unrolling_factor - 1 do 148 | range i 149 | |> List.map (fmt "x%i") 150 | |> String.concat "; " 151 | |> p " | [%s] ->\n"; 152 | 153 | range i 154 | |> List.rev 155 | |> List.map (fun i -> fmt "let y%i = f x%i in" i i) 156 | |> List.iter (p " %s\n"); 157 | 158 | range i 159 | |> List.map (fmt "y%i") 160 | |> String.concat "; " 161 | |> p " [%s]\n"; 162 | done; 163 | 164 | range unrolling_factor 165 | |> List.map (fmt "x%i") 166 | |> String.concat "::" 167 | |> p " | %s::tail ->\n"; 168 | 169 | p " let tail =\n"; 170 | p " if count <= 0 then\n"; 171 | p " map_suffix f tail\n"; 172 | p " else\n"; 173 | p " plain_unrolled_prefix_%i map_suffix (count - 1) f tail\n" 174 | unrolling_factor; 175 | p " in\n"; 176 | 177 | range unrolling_factor 178 | |> List.rev 179 | |> List.map (fun i -> fmt "let y%i = f x%i in" i i) 180 | |> List.iter (p " %s\n"); 181 | 182 | range unrolling_factor 183 | |> List.map (fmt "y%i") 184 | |> String.concat "::" 185 | |> p " %s::tail\n"; 186 | 187 | p "\n"; 188 | 189 | () 190 | 191 | 192 | 193 | (* Generates a fast tail-recursive chunked map. 194 | 195 | Example output: 196 | 197 | {[ 198 | let chunked_tail_recursive_map_12 f l = 199 | let rec split chunks l = 200 | match l with 201 | | _::_::_::_::_::_::_::_::_::_::_::_::tail -> 202 | ((split [@ocaml.tailcall]) (l::chunks) tail) 203 | | _ -> 204 | l::chunks 205 | in 206 | 207 | let map_head_chunk chunk = 208 | begin match chunk with 209 | | [] -> 210 | [] 211 | | [x1] -> 212 | let y1 = f x1 in 213 | [y1] 214 | | [x1; x2] -> 215 | let y2 = f x2 in 216 | let y1 = f x1 in 217 | [y1; y2] 218 | | [x1; x2; x3] -> 219 | let y3 = f x3 in 220 | let y2 = f x2 in 221 | let y1 = f x1 in 222 | [y1; y2; y3] 223 | | [x1; x2; x3; x4] -> 224 | let y4 = f x4 in 225 | let y3 = f x3 in 226 | let y2 = f x2 in 227 | let y1 = f x1 in 228 | [y1; y2; y3; y4] 229 | | [x1; x2; x3; x4; x5] -> 230 | let y5 = f x5 in 231 | let y4 = f x4 in 232 | let y3 = f x3 in 233 | let y2 = f x2 in 234 | let y1 = f x1 in 235 | [y1; y2; y3; y4; y5] 236 | | [x1; x2; x3; x4; x5; x6] -> 237 | let y6 = f x6 in 238 | let y5 = f x5 in 239 | let y4 = f x4 in 240 | let y3 = f x3 in 241 | let y2 = f x2 in 242 | let y1 = f x1 in 243 | [y1; y2; y3; y4; y5; y6] 244 | | [x1; x2; x3; x4; x5; x6; x7] -> 245 | let y7 = f x7 in 246 | let y6 = f x6 in 247 | let y5 = f x5 in 248 | let y4 = f x4 in 249 | let y3 = f x3 in 250 | let y2 = f x2 in 251 | let y1 = f x1 in 252 | [y1; y2; y3; y4; y5; y6; y7] 253 | | [x1; x2; x3; x4; x5; x6; x7; x8] -> 254 | let y8 = f x8 in 255 | let y7 = f x7 in 256 | let y6 = f x6 in 257 | let y5 = f x5 in 258 | let y4 = f x4 in 259 | let y3 = f x3 in 260 | let y2 = f x2 in 261 | let y1 = f x1 in 262 | [y1; y2; y3; y4; y5; y6; y7; y8] 263 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9] -> 264 | let y9 = f x9 in 265 | let y8 = f x8 in 266 | let y7 = f x7 in 267 | let y6 = f x6 in 268 | let y5 = f x5 in 269 | let y4 = f x4 in 270 | let y3 = f x3 in 271 | let y2 = f x2 in 272 | let y1 = f x1 in 273 | [y1; y2; y3; y4; y5; y6; y7; y8; y9] 274 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10] -> 275 | let y10 = f x10 in 276 | let y9 = f x9 in 277 | let y8 = f x8 in 278 | let y7 = f x7 in 279 | let y6 = f x6 in 280 | let y5 = f x5 in 281 | let y4 = f x4 in 282 | let y3 = f x3 in 283 | let y2 = f x2 in 284 | let y1 = f x1 in 285 | [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10] 286 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10; x11] -> 287 | let y11 = f x11 in 288 | let y10 = f x10 in 289 | let y9 = f x9 in 290 | let y8 = f x8 in 291 | let y7 = f x7 in 292 | let y6 = f x6 in 293 | let y5 = f x5 in 294 | let y4 = f x4 in 295 | let y3 = f x3 in 296 | let y2 = f x2 in 297 | let y1 = f x1 in 298 | [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10; y11] 299 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10; x11; x12] -> 300 | let y12 = f x12 in 301 | let y11 = f x11 in 302 | let y10 = f x10 in 303 | let y9 = f x9 in 304 | let y8 = f x8 in 305 | let y7 = f x7 in 306 | let y6 = f x6 in 307 | let y5 = f x5 in 308 | let y4 = f x4 in 309 | let y3 = f x3 in 310 | let y2 = f x2 in 311 | let y1 = f x1 in 312 | [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10; y11; y12] 313 | end [@ocaml.warning "-8"] 314 | in 315 | 316 | let map_tail_chunk suffix chunk = 317 | begin match chunk with 318 | | x1::x2::x3::x4::x5::x6::x7::x8::x9::x10::x11::x12::_ -> 319 | let y12 = f x12 in 320 | let y11 = f x11 in 321 | let y10 = f x10 in 322 | let y9 = f x9 in 323 | let y8 = f x8 in 324 | let y7 = f x7 in 325 | let y6 = f x6 in 326 | let y5 = f x5 in 327 | let y4 = f x4 in 328 | let y3 = f x3 in 329 | let y2 = f x2 in 330 | let y1 = f x1 in 331 | (y1)::(y2)::(y3)::(y4)::(y5)::(y6)::(y7)::(y8)::(y9)::(y10)::(y11)::(y12)::suffix 332 | end [@ocaml.warning "-8"] 333 | in 334 | 335 | let rec map_all_tail_chunks suffix chunks = 336 | match chunks with 337 | | [] -> 338 | suffix 339 | | chunk::more -> 340 | ((map_all_tail_chunks [@ocaml.tailcall]) 341 | (map_tail_chunk suffix chunk) more) 342 | in 343 | 344 | let chunks = split [] l in 345 | 346 | match chunks with 347 | | [] -> 348 | [] 349 | | first::rest -> 350 | map_all_tail_chunks (map_head_chunk first) rest 351 | ]} *) 352 | let chunked_tail_recursive chunk_size = 353 | p "let chunked_tail_recursive_map_%i f l =\n" chunk_size; 354 | 355 | p " let rec split chunks l =\n"; 356 | p " match l with\n"; 357 | range chunk_size 358 | |> List.map (fun _ -> "_") 359 | |> String.concat "::" 360 | |> p " | %s::tail ->\n"; 361 | p " ((split [@ocaml.tailcall]) (l::chunks) tail)\n"; 362 | p " | _ ->\n"; 363 | p " l::chunks\n"; 364 | p " in\n\n"; 365 | 366 | p " let map_head_chunk chunk =\n"; 367 | p " begin match chunk with\n"; 368 | for i = 0 to chunk_size do 369 | range i 370 | |> List.map (fmt "x%i") 371 | |> String.concat "; " 372 | |> p " | [%s] ->\n"; 373 | 374 | range i 375 | |> List.rev 376 | |> List.map (fun i -> fmt "let y%i = f x%i in" i i) 377 | |> List.iter (p " %s\n"); 378 | 379 | range i 380 | |> List.map (fmt "y%i") 381 | |> String.concat "; " 382 | |> p " [%s]\n"; 383 | done; 384 | p " end [@ocaml.warning \"-8\"]\n"; 385 | p " in\n\n"; 386 | 387 | p " let map_tail_chunk suffix chunk =\n"; 388 | p " begin match chunk with\n"; 389 | range chunk_size 390 | |> List.map (fmt "x%i") 391 | |> String.concat "::" 392 | |> p " | %s::_ ->\n"; 393 | range chunk_size 394 | |> List.rev 395 | |> List.map (fun i -> fmt "let y%i = f x%i in" i i) 396 | |> List.iter (p " %s\n"); 397 | range chunk_size 398 | |> List.map (fmt "(y%i)") 399 | |> String.concat "::" 400 | |> p " %s::suffix\n"; 401 | p " end [@ocaml.warning \"-8\"]\n"; 402 | p " in\n\n"; 403 | 404 | p " let rec map_all_tail_chunks suffix chunks =\n"; 405 | p " match chunks with\n"; 406 | p " | [] ->\n"; 407 | p " suffix\n"; 408 | p " | chunk::more ->\n"; 409 | p " ((map_all_tail_chunks [@ocaml.tailcall])\n"; 410 | p " (map_tail_chunk suffix chunk) more)\n"; 411 | p " in\n\n"; 412 | 413 | p " let chunks = split [] l in\n\n"; 414 | 415 | p " match chunks with\n"; 416 | p " | [] ->\n"; 417 | p " []\n"; 418 | p " | first::rest ->\n"; 419 | p " map_all_tail_chunks (map_head_chunk first) rest\n"; 420 | 421 | p "\n"; 422 | 423 | () 424 | 425 | 426 | 427 | (* Generates unrolled and chunked map functions for all unrolling factors from 2 428 | to 64. This is used for choosing the fastest one by some kind of binary 429 | search. *) 430 | let generate_all () = 431 | let two_to_64 = range 64 |> List.tl in 432 | 433 | two_to_64 |> List.iter plain_unrolled; 434 | two_to_64 |> List.iter plain_unrolled_prefix; 435 | two_to_64 |> List.iter chunked_tail_recursive; 436 | 437 | () 438 | 439 | (* Generates the unrolled and chunked map functions determined to be fastest, by 440 | the search mentioned above. *) 441 | let generate_chosen () = 442 | plain_unrolled 5; 443 | plain_unrolled_prefix 5; 444 | chunked_tail_recursive 12; 445 | 446 | () 447 | 448 | let () = 449 | generate_chosen () 450 | -------------------------------------------------------------------------------- /memory/base/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name test) 3 | (flags :standard -w +A) 4 | (ocamlopt_flags :standard -O3) 5 | (libraries faster-map.instrumented)) 6 | -------------------------------------------------------------------------------- /memory/base/test.ml: -------------------------------------------------------------------------------- 1 | let () = 2 | Instrumented.Functions.measure 3 | "base" Instrumented.Functions.Base.map 4 | -------------------------------------------------------------------------------- /memory/batteries/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name test) 3 | (flags :standard -w +A) 4 | (ocamlopt_flags :standard -O3) 5 | (libraries faster-map.instrumented)) 6 | -------------------------------------------------------------------------------- /memory/batteries/test.ml: -------------------------------------------------------------------------------- 1 | let () = 2 | Instrumented.Functions.measure 3 | "batteries" Instrumented.Functions.Batteries.map 4 | -------------------------------------------------------------------------------- /memory/containers/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name test) 3 | (flags :standard -w +A) 4 | (ocamlopt_flags :standard -O3) 5 | (libraries faster-map.instrumented)) 6 | -------------------------------------------------------------------------------- /memory/containers/test.ml: -------------------------------------------------------------------------------- 1 | let () = 2 | Instrumented.Functions.measure 3 | "containers" Instrumented.Functions.Containers.map 4 | -------------------------------------------------------------------------------- /memory/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name instrumented) 3 | (public_name faster-map.instrumented) 4 | (flags :standard -w +A) 5 | (ocamlopt_flags :standard -O3)) 6 | -------------------------------------------------------------------------------- /memory/functions.ml: -------------------------------------------------------------------------------- 1 | let stack_words = ref 0 2 | 3 | let check_stack_size () = 4 | let current_size = Gc.((quick_stat ()).stack_size) in 5 | if current_size > !stack_words then 6 | stack_words := current_size 7 | 8 | 9 | (* Based on: 10 | https://github.com/ocaml/ocaml/blob/ebcebb9379b79138de2f4eeaa29e209c9eb497e4/stdlib/list.ml#L52-L55 11 | https://github.com/ocaml/ocaml/blob/ebcebb9379b79138de2f4eeaa29e209c9eb497e4/stdlib/list.ml#L90-L95 *) 12 | let rec rev_append l1 l2 = 13 | match l1 with 14 | [] -> check_stack_size (); l2 15 | | a :: l -> rev_append l (a :: l2) 16 | 17 | let rev_map f l = 18 | let rec rmap_f accu = function 19 | | [] -> check_stack_size (); accu 20 | | a::l -> rmap_f (f a :: accu) l 21 | in 22 | rmap_f [] l 23 | 24 | (* Based on https://github.com/ocaml/ocaml/blob/ebcebb9379b79138de2f4eeaa29e209c9eb497e4/stdlib/list.ml#L80-L82. *) 25 | module Stdlib = 26 | struct 27 | let rec map f = function 28 | [] -> check_stack_size (); [] 29 | | a::l -> let r = f a in r :: map f l 30 | end 31 | 32 | module Naive = 33 | struct 34 | let map f l = rev_append (rev_map f l) [] 35 | end 36 | 37 | (* Based on https://github.com/janestreet/base/blob/75d0bfe8721aa8d9ffeabe13adb9081675da6139/src/list.ml#L312-L346. *) 38 | module Base = 39 | struct 40 | let rev = function 41 | | [] | [_] as res -> res 42 | | x :: y :: rest -> rev_append rest [y; x] 43 | 44 | let map_slow l ~f = rev (List.rev_map f l) 45 | 46 | let rec count_map ~f l ctr = 47 | match l with 48 | | [] -> check_stack_size (); [] 49 | | [x1] -> 50 | let f1 = f x1 in 51 | check_stack_size (); [f1] 52 | | [x1; x2] -> 53 | let f1 = f x1 in 54 | let f2 = f x2 in 55 | check_stack_size (); [f1; f2] 56 | | [x1; x2; x3] -> 57 | let f1 = f x1 in 58 | let f2 = f x2 in 59 | let f3 = f x3 in 60 | check_stack_size (); [f1; f2; f3] 61 | | [x1; x2; x3; x4] -> 62 | let f1 = f x1 in 63 | let f2 = f x2 in 64 | let f3 = f x3 in 65 | let f4 = f x4 in 66 | check_stack_size (); [f1; f2; f3; f4] 67 | | x1 :: x2 :: x3 :: x4 :: x5 :: tl -> 68 | let f1 = f x1 in 69 | let f2 = f x2 in 70 | let f3 = f x3 in 71 | let f4 = f x4 in 72 | let f5 = f x5 in 73 | f1 :: f2 :: f3 :: f4 :: f5 :: 74 | (if ctr > 1000 75 | then map_slow ~f tl 76 | else count_map ~f tl (ctr + 1)) 77 | 78 | let map l ~f = count_map ~f l 0 79 | 80 | let map f l = map l ~f 81 | end 82 | 83 | (* Based on https://github.com/c-cube/ocaml-containers/blob/c792d70ac7cccfcc0faf466ff23943b3808f4d6c/src/core/CCList.ml#L23-L37. *) 84 | module Containers = 85 | struct 86 | let direct_depth_default_ = 1000 87 | 88 | let map f l = 89 | let rec direct f i l = match l with 90 | | [] -> check_stack_size (); [] 91 | | [x] -> check_stack_size (); [f x] 92 | | [x1;x2] -> let y1 = f x1 in check_stack_size (); [y1; f x2] 93 | | [x1;x2;x3] -> 94 | let y1 = f x1 in let y2 = f x2 in check_stack_size (); [y1; y2; f x3] 95 | | _ when i=0 -> rev_append (rev_map f l) [] 96 | | x1::x2::x3::x4::l' -> 97 | let y1 = f x1 in 98 | let y2 = f x2 in 99 | let y3 = f x3 in 100 | let y4 = f x4 in 101 | y1 :: y2 :: y3 :: y4 :: direct f (i-1) l' 102 | in 103 | direct f direct_depth_default_ l 104 | end 105 | 106 | (* Based on https://github.com/ocaml-batteries-team/batteries-included/blob/d682509f15fcfa098646d9b5691329f277f9afb6/src/batList.mlv#L223-L233. *) 107 | module Batteries = 108 | struct 109 | type 'a mut_list = { 110 | hd: 'a; 111 | mutable tl: 'a list 112 | } 113 | 114 | external inj : 'a mut_list -> 'a list = "%identity" 115 | 116 | module Acc = struct 117 | let dummy () = 118 | { hd = Obj.magic (); tl = [] } 119 | let create x = 120 | { hd = x; tl = [] } 121 | let accum acc x = 122 | let cell = create x in 123 | acc.tl <- inj cell; 124 | cell 125 | end 126 | 127 | let map f = function 128 | | [] -> [] 129 | | h :: t -> 130 | let rec loop dst = function 131 | | [] -> check_stack_size (); () 132 | | h :: t -> 133 | loop (Acc.accum dst (f h)) t 134 | in 135 | let r = Acc.create (f h) in 136 | loop r t; 137 | inj r 138 | end 139 | 140 | module Proposed = 141 | struct 142 | let rec plain_unrolled_prefix_5 map_suffix count f l = 143 | match l with 144 | | [] -> 145 | check_stack_size (); [] 146 | | [x1] -> 147 | let y1 = f x1 in 148 | check_stack_size (); [y1] 149 | | [x1; x2] -> 150 | let y1 = f x1 in 151 | let y2 = f x2 in 152 | check_stack_size (); [y1; y2] 153 | | [x1; x2; x3] -> 154 | let y1 = f x1 in 155 | let y2 = f x2 in 156 | let y3 = f x3 in 157 | check_stack_size (); [y1; y2; y3] 158 | | [x1; x2; x3; x4] -> 159 | let y1 = f x1 in 160 | let y2 = f x2 in 161 | let y3 = f x3 in 162 | let y4 = f x4 in 163 | check_stack_size (); [y1; y2; y3; y4] 164 | | x1::x2::x3::x4::x5::tail -> 165 | let y1 = f x1 in 166 | let y2 = f x2 in 167 | let y3 = f x3 in 168 | let y4 = f x4 in 169 | let y5 = f x5 in 170 | let tail = 171 | if count <= 0 then 172 | map_suffix f tail 173 | else 174 | plain_unrolled_prefix_5 map_suffix (count - 1) f tail 175 | in 176 | y1::y2::y3::y4::y5::tail 177 | 178 | let chunked_tail_recursive_map_12 f l = 179 | let rec split chunks l = 180 | match l with 181 | | _::_::_::_::_::_::_::_::_::_::_::_::tail -> 182 | ((split [@ocaml.tailcall]) (l::chunks) tail) 183 | | _ -> 184 | check_stack_size (); l::chunks 185 | in 186 | 187 | let map_head_chunk chunk = 188 | begin match chunk with 189 | | [] -> 190 | check_stack_size (); [] 191 | | [x1] -> 192 | let y1 = f x1 in 193 | check_stack_size (); [y1] 194 | | [x1; x2] -> 195 | let y1 = f x1 in 196 | let y2 = f x2 in 197 | check_stack_size (); [y1; y2] 198 | | [x1; x2; x3] -> 199 | let y1 = f x1 in 200 | let y2 = f x2 in 201 | let y3 = f x3 in 202 | check_stack_size (); [y1; y2; y3] 203 | | [x1; x2; x3; x4] -> 204 | let y1 = f x1 in 205 | let y2 = f x2 in 206 | let y3 = f x3 in 207 | let y4 = f x4 in 208 | check_stack_size (); [y1; y2; y3; y4] 209 | | [x1; x2; x3; x4; x5] -> 210 | let y1 = f x1 in 211 | let y2 = f x2 in 212 | let y3 = f x3 in 213 | let y4 = f x4 in 214 | let y5 = f x5 in 215 | check_stack_size (); [y1; y2; y3; y4; y5] 216 | | [x1; x2; x3; x4; x5; x6] -> 217 | let y1 = f x1 in 218 | let y2 = f x2 in 219 | let y3 = f x3 in 220 | let y4 = f x4 in 221 | let y5 = f x5 in 222 | let y6 = f x6 in 223 | check_stack_size (); [y1; y2; y3; y4; y5; y6] 224 | | [x1; x2; x3; x4; x5; x6; x7] -> 225 | let y1 = f x1 in 226 | let y2 = f x2 in 227 | let y3 = f x3 in 228 | let y4 = f x4 in 229 | let y5 = f x5 in 230 | let y6 = f x6 in 231 | let y7 = f x7 in 232 | check_stack_size (); [y1; y2; y3; y4; y5; y6; y7] 233 | | [x1; x2; x3; x4; x5; x6; x7; x8] -> 234 | let y1 = f x1 in 235 | let y2 = f x2 in 236 | let y3 = f x3 in 237 | let y4 = f x4 in 238 | let y5 = f x5 in 239 | let y6 = f x6 in 240 | let y7 = f x7 in 241 | let y8 = f x8 in 242 | check_stack_size (); [y1; y2; y3; y4; y5; y6; y7; y8] 243 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9] -> 244 | let y1 = f x1 in 245 | let y2 = f x2 in 246 | let y3 = f x3 in 247 | let y4 = f x4 in 248 | let y5 = f x5 in 249 | let y6 = f x6 in 250 | let y7 = f x7 in 251 | let y8 = f x8 in 252 | let y9 = f x9 in 253 | check_stack_size (); [y1; y2; y3; y4; y5; y6; y7; y8; y9] 254 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10] -> 255 | let y1 = f x1 in 256 | let y2 = f x2 in 257 | let y3 = f x3 in 258 | let y4 = f x4 in 259 | let y5 = f x5 in 260 | let y6 = f x6 in 261 | let y7 = f x7 in 262 | let y8 = f x8 in 263 | let y9 = f x9 in 264 | let y10 = f x10 in 265 | check_stack_size (); [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10] 266 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10; x11] -> 267 | let y1 = f x1 in 268 | let y2 = f x2 in 269 | let y3 = f x3 in 270 | let y4 = f x4 in 271 | let y5 = f x5 in 272 | let y6 = f x6 in 273 | let y7 = f x7 in 274 | let y8 = f x8 in 275 | let y9 = f x9 in 276 | let y10 = f x10 in 277 | let y11 = f x11 in 278 | check_stack_size (); [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10; y11] 279 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10; x11; x12] -> 280 | let y1 = f x1 in 281 | let y2 = f x2 in 282 | let y3 = f x3 in 283 | let y4 = f x4 in 284 | let y5 = f x5 in 285 | let y6 = f x6 in 286 | let y7 = f x7 in 287 | let y8 = f x8 in 288 | let y9 = f x9 in 289 | let y10 = f x10 in 290 | let y11 = f x11 in 291 | let y12 = f x12 in 292 | check_stack_size (); [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10; y11; y12] 293 | end [@ocaml.warning "-8"] 294 | in 295 | 296 | let map_tail_chunk suffix chunk = 297 | begin match chunk with 298 | | x1::x2::x3::x4::x5::x6::x7::x8::x9::x10::x11::x12::_ -> 299 | let y1 = f x1 in 300 | let y2 = f x2 in 301 | let y3 = f x3 in 302 | let y4 = f x4 in 303 | let y5 = f x5 in 304 | let y6 = f x6 in 305 | let y7 = f x7 in 306 | let y8 = f x8 in 307 | let y9 = f x9 in 308 | let y10 = f x10 in 309 | let y11 = f x11 in 310 | let y12 = f x12 in 311 | (y1)::(y2)::(y3)::(y4)::(y5)::(y6)::(y7)::(y8)::(y9)::(y10)::(y11)::(y12)::suffix 312 | end [@ocaml.warning "-8"] 313 | in 314 | 315 | let rec map_all_tail_chunks suffix chunks = 316 | match chunks with 317 | | [] -> 318 | check_stack_size (); suffix 319 | | chunk::more -> 320 | ((map_all_tail_chunks [@ocaml.tailcall]) 321 | (map_tail_chunk suffix chunk) more) 322 | in 323 | 324 | let chunks = split [] l in 325 | 326 | match chunks with 327 | | [] -> 328 | check_stack_size (); [] 329 | | first::rest -> 330 | map_all_tail_chunks (map_head_chunk first) rest 331 | 332 | let map f l = 333 | plain_unrolled_prefix_5 chunked_tail_recursive_map_12 1000 f l 334 | end 335 | 336 | module Unrolled = 337 | struct 338 | let rec map f l = 339 | match l with 340 | | [] -> 341 | check_stack_size (); [] 342 | | [x1] -> 343 | let y1 = f x1 in 344 | check_stack_size (); [y1] 345 | | [x1; x2] -> 346 | let y1 = f x1 in 347 | let y2 = f x2 in 348 | check_stack_size (); [y1; y2] 349 | | [x1; x2; x3] -> 350 | let y1 = f x1 in 351 | let y2 = f x2 in 352 | let y3 = f x3 in 353 | check_stack_size (); [y1; y2; y3] 354 | | [x1; x2; x3; x4] -> 355 | let y1 = f x1 in 356 | let y2 = f x2 in 357 | let y3 = f x3 in 358 | let y4 = f x4 in 359 | check_stack_size (); [y1; y2; y3; y4] 360 | | x1::x2::x3::x4::x5::tail -> 361 | let y1 = f x1 in 362 | let y2 = f x2 in 363 | let y3 = f x3 in 364 | let y4 = f x4 in 365 | let y5 = f x5 in 366 | let tail = map f tail in 367 | y1::y2::y3::y4::y5::tail 368 | end 369 | 370 | 371 | 372 | let measure label map_function = 373 | let heap_overhead = Gc.((quick_stat ()).top_heap_words) in 374 | 375 | let rec make_list n list_acc = 376 | if n <= 0 then list_acc 377 | else make_list (n - 1) (0::list_acc) 378 | in 379 | 380 | let list_length = 1000000 in 381 | let argument = make_list list_length [] in 382 | let f = (+) 1 in 383 | 384 | let initial_stack_words, initial_heap_words = 385 | let stats = Gc.quick_stat () in 386 | Gc.(stats.stack_size, stats.top_heap_words) 387 | in 388 | 389 | let result = map_function f argument in 390 | 391 | let final_heap_words = Gc.((quick_stat ()).top_heap_words) in 392 | 393 | (* A small effort to suppress any intermediate GC. *) 394 | assert (List.length argument = list_length); 395 | assert (List.length result = list_length); 396 | 397 | assert (!stack_words > initial_stack_words); 398 | assert (final_heap_words > initial_heap_words); 399 | 400 | let word_size = 8 in 401 | let stack_usage_megabytes = 402 | (!stack_words - initial_stack_words) * word_size / 1024 / 1024 in 403 | let heap_usage_megabytes = 404 | (final_heap_words - heap_overhead) * word_size / 1024 / 1024 in 405 | 406 | Printf.printf 407 | "%-10s\t%i\t%i\t%i\n" 408 | label 409 | stack_usage_megabytes 410 | heap_usage_megabytes 411 | (stack_usage_megabytes + heap_usage_megabytes) 412 | -------------------------------------------------------------------------------- /memory/jbuild.common: -------------------------------------------------------------------------------- 1 | (jbuild_version 1) 2 | 3 | (executable 4 | ((name test) 5 | (flags (:standard -w +A)) 6 | (ocamlopt_flags (:standard -O3)) 7 | (libraries (faster-map.instrumented)))) 8 | -------------------------------------------------------------------------------- /memory/naive/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name test) 3 | (flags :standard -w +A) 4 | (ocamlopt_flags :standard -O3) 5 | (libraries faster-map.instrumented)) 6 | -------------------------------------------------------------------------------- /memory/naive/test.ml: -------------------------------------------------------------------------------- 1 | let () = 2 | Instrumented.Functions.measure 3 | "naive" Instrumented.Functions.Naive.map 4 | -------------------------------------------------------------------------------- /memory/proposed/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name test) 3 | (flags :standard -w +A) 4 | (ocamlopt_flags :standard -O3) 5 | (libraries faster-map.instrumented)) 6 | -------------------------------------------------------------------------------- /memory/proposed/test.ml: -------------------------------------------------------------------------------- 1 | let () = 2 | Instrumented.Functions.measure 3 | "proposed" Instrumented.Functions.Proposed.map 4 | -------------------------------------------------------------------------------- /memory/stdlib/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name test) 3 | (flags :standard -w +A) 4 | (ocamlopt_flags :standard -O3) 5 | (libraries faster-map.instrumented)) 6 | -------------------------------------------------------------------------------- /memory/stdlib/test.ml: -------------------------------------------------------------------------------- 1 | let () = 2 | Instrumented.Functions.measure 3 | "stdlib" Instrumented.Functions.Stdlib.map 4 | -------------------------------------------------------------------------------- /memory/unrolled/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name test) 3 | (flags :standard -w +A) 4 | (ocamlopt_flags :standard -O3) 5 | (libraries faster-map.instrumented)) 6 | -------------------------------------------------------------------------------- /memory/unrolled/test.ml: -------------------------------------------------------------------------------- 1 | let () = 2 | Instrumented.Functions.measure 3 | "unrolled" Instrumented.Functions.Unrolled.map 4 | -------------------------------------------------------------------------------- /reporter/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name reporter) 3 | (flags :standard -w +A)) 4 | -------------------------------------------------------------------------------- /reporter/graph.gnuplot: -------------------------------------------------------------------------------- 1 | set terminal svg size 600,500 font "Helvetica,14" 2 | 3 | set output "_report/map.svg" 4 | source="_report/results.txt" 5 | set title "Time elapsed (relative) – lower is better" 6 | 7 | set logscale x 10 8 | set xlabel "List size (no. of elements)" 9 | set xrange [1000:1000000] 10 | 11 | set yrange [0:110] 12 | set ylabel "Time relative to naive tail-recursive version (%)" 13 | 14 | unset border 15 | set tics scale 0 16 | 17 | set key bottom horizontal 18 | set key font ",13" 19 | 20 | set style line 1 lc 0 lw 3 dt 3 pi 2 21 | set style line 2 lc 9 lw 3 22 | set style line 3 lc 10 lw 3 23 | set style line 4 lc 6 lw 6 24 | set style line 5 lc 5 lw 3 25 | set style line 6 lc 7 lw 3 26 | 27 | plot source using 1:3 with lines ls 1 title "naive tail-rec.", \ 28 | source using 1:10 with linespoints ls 1 pt 4 title "stdlib", \ 29 | source using 1:11 with linespoints ls 1 pt 10 title "unrolled 5×", \ 30 | source using 1:5 with lines ls 3 title "batteries", \ 31 | source using 1:4 with lines ls 2 title "base", \ 32 | source using 1:6 with lines ls 5 title "containers", \ 33 | source using 1:8 with lines ls 4 title "new", \ 34 | source using 1:9 with lines ls 6 title "tupled" 35 | -------------------------------------------------------------------------------- /reporter/reporter.ml: -------------------------------------------------------------------------------- 1 | let starts_with prefix s = 2 | try 3 | String.sub s 0 (String.length prefix) = prefix 4 | with Invalid_argument _ -> 5 | false 6 | 7 | let rec scan_to_table_start () : int = 8 | let header = "With lists of size " in 9 | let line = read_line () in 10 | if not @@ starts_with header line then 11 | scan_to_table_start () 12 | else begin 13 | let list_size = 14 | String.sub 15 | line 16 | (String.length header) 17 | (String.length line - String.length header) 18 | |> int_of_string 19 | in 20 | read_line () |> ignore; 21 | read_line () |> ignore; 22 | read_line () |> ignore; 23 | read_line () |> ignore; 24 | list_size 25 | end 26 | 27 | let read_table_row list_size : (string * float) option = 28 | let line = read_line () |> String.trim in 29 | if line = "" then 30 | None 31 | else begin 32 | Scanf.sscanf line "%s %s" (fun label time -> 33 | let unit_index = String.length time - 2 in 34 | let unit = String.sub time unit_index 2 in 35 | let multiple = 36 | match unit with 37 | | "us" -> 1e3 38 | | "ms" -> 1e6 39 | | _ -> assert false 40 | in 41 | let nanoseconds_per_element = 42 | String.sub time 0 unit_index 43 | |> float_of_string 44 | |> fun t -> t *. multiple /. (float_of_int list_size) 45 | in 46 | Some (label, nanoseconds_per_element)) 47 | end 48 | 49 | let rec read_tables () : unit = 50 | let list_size = scan_to_table_start () in 51 | Printf.printf "%i" list_size; 52 | 53 | let rec read_rows rows_acc = 54 | match read_table_row list_size with 55 | | None -> 56 | List.rev rows_acc; 57 | | Some (_, time) -> 58 | read_rows (time::rows_acc); 59 | in 60 | let times = read_rows [] in 61 | 62 | let naive_tailrec_time = List.nth times 1 in 63 | let normalized = 64 | List.map (fun time -> time /. naive_tailrec_time *. 100.) times in 65 | 66 | List.iter (fun normalized -> Printf.printf "\t%.02f" normalized) normalized; 67 | print_newline (); 68 | 69 | read_tables () 70 | 71 | let () = 72 | try 73 | read_tables () 74 | with End_of_file -> 75 | () 76 | -------------------------------------------------------------------------------- /results/core_bench.txt: -------------------------------------------------------------------------------- 1 | With lists of size 1000 2 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 3 | 4 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 5 | ------------------------------ ---------- --------- ---------- ---------- ------------ 6 | warmup 8.88us 6.01kw 51.58w 51.58w 100.00% 7 | naive-tail-recursive 8.58us 6.01kw 51.56w 51.56w 96.57% 8 | base 4.76us 3.00kw 16.99w 16.99w 53.55% 9 | batteries 8.51us 3.01kw 34.34w 34.34w 95.78% 10 | containers 4.86us 3.00kw 17.11w 17.11w 54.78% 11 | chunked-tail-recursive-12 5.33us 3.27kw 18.15w 18.15w 60.07% 12 | unrolled-5-chunked-12-hybrid 4.92us 3.00kw 17.01w 17.01w 55.45% 13 | stdlib 6.68us 3.00kw 17.16w 17.16w 75.26% 14 | unrolled-5 4.64us 3.00kw 17.08w 17.08w 52.24% 15 | 16 | With lists of size 1778 17 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 18 | 19 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 20 | ------------------------------ ---------- --------- ---------- ---------- ------------ 21 | warmup 16.77us 10.67kw 162.52w 162.52w 83.98% 22 | naive-tail-recursive 16.75us 10.67kw 162.59w 162.59w 83.85% 23 | base 10.86us 5.33kw 54.29w 54.29w 54.37% 24 | batteries 16.97us 5.34kw 108.65w 108.65w 100.00% 25 | containers 9.91us 5.33kw 54.27w 54.27w 49.63% 26 | chunked-tail-recursive-12 9.87us 5.80kw 58.97w 58.97w 49.42% 27 | unrolled-5-chunked-12-hybrid 9.36us 5.33kw 54.22w 54.22w 46.84% 28 | stdlib 13.26us 5.33kw 54.20w 54.20w 66.41% 29 | unrolled-5 9.29us 5.33kw 54.17w 54.17w 46.52% 30 | 31 | With lists of size 3162 32 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 33 | 34 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 35 | ------------------------------ ---------- --------- ---------- ---------- ------------ 36 | warmup 35.40us 18.98kw 515.52w 515.52w 98.57% 37 | naive-tail-recursive 35.92us 18.98kw 515.65w 515.65w 100.00% 38 | base 18.72us 9.49kw 171.50w 171.50w 52.11% 39 | batteries 32.31us 9.49kw 343.70w 343.70w 89.95% 40 | containers 19.32us 9.49kw 171.62w 171.62w 53.80% 41 | chunked-tail-recursive-12 20.16us 10.29kw 185.64w 185.64w 56.13% 42 | unrolled-5-chunked-12-hybrid 18.56us 9.49kw 171.60w 171.60w 51.68% 43 | stdlib 24.82us 9.49kw 171.68w 171.68w 69.10% 44 | unrolled-5 18.34us 9.49kw 171.56w 171.56w 51.07% 45 | 46 | With lists of size 5623 47 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 48 | 49 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 50 | ------------------------------ ---------- --------- ----------- ----------- ------------ 51 | warmup 80.94us 33.74kw 1_632.35w 1_632.35w 99.49% 52 | naive-tail-recursive 81.35us 33.74kw 1_631.49w 1_631.49w 100.00% 53 | base 42.80us 18.71kw 570.59w 570.59w 52.61% 54 | batteries 69.22us 16.87kw 1_086.92w 1_086.92w 85.08% 55 | containers 48.21us 21.74kw 636.07w 636.07w 59.26% 56 | chunked-tail-recursive-12 42.69us 18.29kw 593.09w 593.09w 52.48% 57 | unrolled-5-chunked-12-hybrid 40.86us 17.04kw 543.84w 543.84w 50.23% 58 | stdlib 51.63us 16.87kw 542.87w 542.87w 63.47% 59 | unrolled-5 39.30us 16.87kw 543.27w 543.27w 48.30% 60 | 61 | With lists of size 10000 62 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 63 | 64 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 65 | ------------------------------ ---------- --------- ---------- ---------- ------------ 66 | warmup 200.65us 60.01kw 5.17kw 5.17kw 100.00% 67 | naive-tail-recursive 199.15us 60.01kw 5.16kw 5.16kw 99.25% 68 | base 127.08us 44.98kw 2.57kw 2.57kw 63.33% 69 | batteries 157.77us 30.01kw 3.45kw 3.45kw 78.63% 70 | containers 139.67us 48.01kw 2.96kw 2.96kw 69.61% 71 | chunked-tail-recursive-12 96.08us 32.52kw 1.88kw 1.88kw 47.88% 72 | unrolled-5-chunked-12-hybrid 94.10us 31.27kw 1.76kw 1.76kw 46.90% 73 | stdlib 115.30us 30.00kw 1.72kw 1.72kw 57.46% 74 | unrolled-5 90.75us 30.00kw 1.72kw 1.72kw 45.23% 75 | 76 | With lists of size 17782 77 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 78 | 79 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 80 | ------------------------------ ---------- ---------- ---------- ---------- ------------ 81 | warmup 531.47us 106.70kw 16.37kw 16.37kw 100.00% 82 | naive-tail-recursive 531.40us 106.70kw 16.37kw 16.37kw 99.99% 83 | base 394.62us 91.67kw 11.08kw 11.08kw 74.25% 84 | batteries 393.83us 53.35kw 10.93kw 10.93kw 74.10% 85 | containers 419.67us 94.70kw 12.04kw 12.04kw 78.96% 86 | chunked-tail-recursive-12 237.27us 57.82kw 5.97kw 5.97kw 44.64% 87 | unrolled-5-chunked-12-hybrid 233.32us 56.57kw 5.71kw 5.71kw 43.90% 88 | stdlib 274.91us 53.35kw 5.46kw 5.46kw 51.73% 89 | unrolled-5 223.90us 53.35kw 5.45kw 5.45kw 42.13% 90 | 91 | With lists of size 31622 92 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 93 | 94 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 95 | ------------------------------ ------------ ---------- ---------- ---------- ------------ 96 | warmup 1_506.24us 189.74kw 51.86kw 51.86kw 99.89% 97 | naive-tail-recursive 1_507.94us 189.74kw 51.85kw 51.85kw 100.00% 98 | base 1_230.42us 174.71kw 41.05kw 41.05kw 81.60% 99 | batteries 1_063.35us 94.87kw 34.73kw 34.73kw 70.52% 100 | containers 1_299.97us 177.74kw 43.52kw 43.52kw 86.21% 101 | chunked-tail-recursive-12 615.53us 102.81kw 18.82kw 18.82kw 40.82% 102 | unrolled-5-chunked-12-hybrid 614.71us 101.56kw 18.40kw 18.40kw 40.77% 103 | stdlib 710.72us 94.87kw 17.31kw 17.31kw 47.13% 104 | unrolled-5 592.91us 94.88kw 17.20kw 17.20kw 39.32% 105 | 106 | With lists of size 56234 107 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 108 | 109 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 110 | ------------------------------ ---------- ---------- ---------- ---------- ------------ 111 | warmup 4.13ms 337.42kw 158.76kw 158.76kw 100.00% 112 | naive-tail-recursive 4.12ms 337.42kw 159.64kw 159.64kw 99.69% 113 | base 3.72ms 322.39kw 143.09kw 143.09kw 90.02% 114 | batteries 2.94ms 168.71kw 110.54kw 110.54kw 71.21% 115 | containers 3.87ms 325.42kw 148.06kw 148.06kw 93.68% 116 | chunked-tail-recursive-12 1.68ms 182.82kw 59.67kw 59.67kw 40.78% 117 | unrolled-5-chunked-12-hybrid 1.69ms 181.57kw 58.70kw 58.70kw 41.03% 118 | stdlib 1.93ms 168.71kw 55.07kw 55.07kw 46.66% 119 | unrolled-5 1.64ms 168.72kw 55.06kw 55.06kw 39.83% 120 | 121 | With lists of size 100000 122 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 123 | 124 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 125 | ------------------------------ ---------- ---------- ---------- ---------- ------------ 126 | warmup 10.11ms 600.02kw 409.92kw 409.92kw 99.95% 127 | naive-tail-recursive 10.11ms 600.02kw 410.31kw 410.31kw 100.00% 128 | base 9.75ms 584.99kw 394.22kw 394.22kw 96.41% 129 | batteries 7.24ms 300.01kw 300.53kw 300.53kw 71.64% 130 | containers 9.86ms 588.02kw 396.95kw 396.95kw 97.55% 131 | chunked-tail-recursive-12 4.83ms 325.10kw 187.91kw 187.91kw 47.79% 132 | unrolled-5-chunked-12-hybrid 4.81ms 323.85kw 187.39kw 187.39kw 47.59% 133 | stdlib 5.44ms 300.01kw 169.18kw 169.18kw 53.81% 134 | unrolled-5 4.58ms 300.03kw 168.54kw 168.54kw 45.30% 135 | 136 | With lists of size 177827 137 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 138 | 139 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 140 | ------------------------------ ---------- ------------ ---------- ---------- ------------ 141 | warmup 20.28ms 1_066.99kw 862.08kw 862.08kw 98.36% 142 | naive-tail-recursive 20.39ms 1_066.99kw 860.39kw 860.39kw 98.90% 143 | base 20.61ms 1_051.96kw 852.87kw 852.87kw 100.00% 144 | batteries 12.80ms 533.50kw 533.89kw 533.89kw 62.09% 145 | containers 20.59ms 1_054.99kw 855.80kw 855.80kw 99.88% 146 | chunked-tail-recursive-12 10.85ms 578.10kw 436.76kw 436.76kw 52.63% 147 | unrolled-5-chunked-12-hybrid 10.95ms 576.85kw 436.40kw 436.40kw 53.11% 148 | stdlib 12.02ms 533.49kw 352.43kw 352.43kw 58.33% 149 | unrolled-5 9.69ms 533.54kw 348.90kw 348.90kw 47.00% 150 | 151 | With lists of size 316227 152 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 153 | 154 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 155 | ------------------------------ ---------- ------------ ------------ ------------ ------------ 156 | warmup 39.69ms 1_897.41kw 1_711.40kw 1_711.40kw 98.75% 157 | naive-tail-recursive 40.19ms 1_897.41kw 1_708.44kw 1_708.44kw 100.00% 158 | base 39.83ms 1_882.38kw 1_692.98kw 1_692.98kw 99.10% 159 | batteries 22.69ms 948.71kw 949.94kw 949.94kw 56.44% 160 | containers 39.75ms 1_885.41kw 1_690.34kw 1_690.34kw 98.91% 161 | chunked-tail-recursive-12 21.01ms 1_028.02kw 852.65kw 852.65kw 52.28% 162 | unrolled-5-chunked-12-hybrid 21.29ms 1_026.77kw 865.12kw 865.12kw 52.98% 163 | stdlib 27.43ms 948.70kw 816.56kw 816.56kw 68.24% 164 | unrolled-5 21.73ms 948.79kw 814.05kw 814.05kw 54.08% 165 | 166 | With lists of size 562341 167 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 168 | 169 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 170 | ------------------------------ ---------- --------- ---------- ---------- ------------ 171 | warmup 75.24ms 3.37Mw 3.20Mw 3.20Mw 100.00% 172 | naive-tail-recursive 74.58ms 3.37Mw 3.20Mw 3.20Mw 99.13% 173 | base 74.52ms 3.36Mw 3.17Mw 3.17Mw 99.06% 174 | batteries 40.95ms 1.69Mw 1.69Mw 1.69Mw 54.43% 175 | containers 74.32ms 3.36Mw 3.16Mw 3.16Mw 98.79% 176 | chunked-tail-recursive-12 41.32ms 1.83Mw 1.69Mw 1.69Mw 54.92% 177 | unrolled-5-chunked-12-hybrid 40.87ms 1.83Mw 1.68Mw 1.68Mw 54.32% 178 | stdlib 59.74ms 1.69Mw 1.56Mw 1.56Mw 79.41% 179 | unrolled-5 44.40ms 1.69Mw 1.56Mw 1.56Mw 59.01% 180 | 181 | With lists of size 1000000 182 | Estimated testing time 1.5m (9 benchmarks x 10s). Change using -quota SECS. 183 | 184 | Name Time/Run mWd/Run mjWd/Run Prom/Run Percentage 185 | ------------------------------ ---------- --------- ---------- ---------- ------------ 186 | warmup 148.21ms 6.00Mw 5.81Mw 5.81Mw 99.50% 187 | naive-tail-recursive 148.94ms 6.00Mw 5.82Mw 5.82Mw 100.00% 188 | base 144.06ms 5.99Mw 5.84Mw 5.84Mw 96.72% 189 | batteries 80.38ms 3.00Mw 3.00Mw 3.00Mw 53.97% 190 | containers 140.06ms 5.99Mw 5.80Mw 5.80Mw 94.04% 191 | chunked-tail-recursive-12 79.42ms 3.25Mw 3.11Mw 3.11Mw 53.33% 192 | unrolled-5-chunked-12-hybrid 77.30ms 3.25Mw 3.12Mw 3.12Mw 51.90% 193 | stdlib 135.12ms 3.00Mw 2.88Mw 2.88Mw 90.72% 194 | unrolled-5 92.66ms 3.00Mw 2.88Mw 2.88Mw 62.21% 195 | 196 | Benchmarks that take 1ns to 100ms can be estimated precisely. For more reliable 197 | estimates, redesign your benchmark to have a shorter execution time. 198 | -------------------------------------------------------------------------------- /results/faster_map.ml: -------------------------------------------------------------------------------- 1 | (* For reference in the article. *) 2 | let rec plain_unrolled_map_5 f l = 3 | match l with 4 | | [] -> 5 | [] 6 | | [x1] -> 7 | let y1 = f x1 in 8 | [y1] 9 | | [x1; x2] -> 10 | let y1 = f x1 in 11 | let y2 = f x2 in 12 | [y1; y2] 13 | | [x1; x2; x3] -> 14 | let y1 = f x1 in 15 | let y2 = f x2 in 16 | let y3 = f x3 in 17 | [y1; y2; y3] 18 | | [x1; x2; x3; x4] -> 19 | let y1 = f x1 in 20 | let y2 = f x2 in 21 | let y3 = f x3 in 22 | let y4 = f x4 in 23 | [y1; y2; y3; y4] 24 | | x1::x2::x3::x4::x5::tail -> 25 | let y1 = f x1 in 26 | let y2 = f x2 in 27 | let y3 = f x3 in 28 | let y4 = f x4 in 29 | let y5 = f x5 in 30 | y1::y2::y3::y4::y5::(plain_unrolled_map_5 f tail) 31 | 32 | 33 | 34 | (* Non-tail-recursive prefix for the new fast map implementation. This is not 35 | really necessary, as it is possible to use the tail-recursive suffix 36 | function, and get almost the same performance. However, there *is* a slight 37 | improvement, and this makes it fully competitive with Containers and 38 | Base :) *) 39 | let rec plain_unrolled_prefix_5 map_suffix count f l = 40 | match l with 41 | | [] -> 42 | [] 43 | | [x1] -> 44 | let y1 = f x1 in 45 | [y1] 46 | | [x1; x2] -> 47 | let y2 = f x2 in 48 | let y1 = f x1 in 49 | [y1; y2] 50 | | [x1; x2; x3] -> 51 | let y3 = f x3 in 52 | let y2 = f x2 in 53 | let y1 = f x1 in 54 | [y1; y2; y3] 55 | | [x1; x2; x3; x4] -> 56 | let y4 = f x4 in 57 | let y3 = f x3 in 58 | let y2 = f x2 in 59 | let y1 = f x1 in 60 | [y1; y2; y3; y4] 61 | | x1::x2::x3::x4::x5::tail -> 62 | let tail = 63 | if count <= 0 then 64 | map_suffix f tail 65 | else 66 | plain_unrolled_prefix_5 map_suffix (count - 1) f tail 67 | in 68 | let y5 = f x5 in 69 | let y4 = f x4 in 70 | let y3 = f x3 in 71 | let y2 = f x2 in 72 | let y1 = f x1 in 73 | y1::y2::y3::y4::y5::tail 74 | 75 | 76 | 77 | (* Fast tail-recursive map for the list suffix. *) 78 | let chunked_tail_recursive_map_12 f l = 79 | let rec split chunks l = 80 | match l with 81 | | _::_::_::_::_::_::_::_::_::_::_::_::tail -> 82 | ((split [@ocaml.tailcall]) (l::chunks) tail) 83 | | _ -> 84 | l::chunks 85 | in 86 | 87 | let map_head_chunk chunk = 88 | begin match chunk with 89 | | [] -> 90 | [] 91 | | [x1] -> 92 | let y1 = f x1 in 93 | [y1] 94 | | [x1; x2] -> 95 | let y2 = f x2 in 96 | let y1 = f x1 in 97 | [y1; y2] 98 | | [x1; x2; x3] -> 99 | let y3 = f x3 in 100 | let y2 = f x2 in 101 | let y1 = f x1 in 102 | [y1; y2; y3] 103 | | [x1; x2; x3; x4] -> 104 | let y4 = f x4 in 105 | let y3 = f x3 in 106 | let y2 = f x2 in 107 | let y1 = f x1 in 108 | [y1; y2; y3; y4] 109 | | [x1; x2; x3; x4; x5] -> 110 | let y5 = f x5 in 111 | let y4 = f x4 in 112 | let y3 = f x3 in 113 | let y2 = f x2 in 114 | let y1 = f x1 in 115 | [y1; y2; y3; y4; y5] 116 | | [x1; x2; x3; x4; x5; x6] -> 117 | let y6 = f x6 in 118 | let y5 = f x5 in 119 | let y4 = f x4 in 120 | let y3 = f x3 in 121 | let y2 = f x2 in 122 | let y1 = f x1 in 123 | [y1; y2; y3; y4; y5; y6] 124 | | [x1; x2; x3; x4; x5; x6; x7] -> 125 | let y7 = f x7 in 126 | let y6 = f x6 in 127 | let y5 = f x5 in 128 | let y4 = f x4 in 129 | let y3 = f x3 in 130 | let y2 = f x2 in 131 | let y1 = f x1 in 132 | [y1; y2; y3; y4; y5; y6; y7] 133 | | [x1; x2; x3; x4; x5; x6; x7; x8] -> 134 | let y8 = f x8 in 135 | let y7 = f x7 in 136 | let y6 = f x6 in 137 | let y5 = f x5 in 138 | let y4 = f x4 in 139 | let y3 = f x3 in 140 | let y2 = f x2 in 141 | let y1 = f x1 in 142 | [y1; y2; y3; y4; y5; y6; y7; y8] 143 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9] -> 144 | let y9 = f x9 in 145 | let y8 = f x8 in 146 | let y7 = f x7 in 147 | let y6 = f x6 in 148 | let y5 = f x5 in 149 | let y4 = f x4 in 150 | let y3 = f x3 in 151 | let y2 = f x2 in 152 | let y1 = f x1 in 153 | [y1; y2; y3; y4; y5; y6; y7; y8; y9] 154 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10] -> 155 | let y10 = f x10 in 156 | let y9 = f x9 in 157 | let y8 = f x8 in 158 | let y7 = f x7 in 159 | let y6 = f x6 in 160 | let y5 = f x5 in 161 | let y4 = f x4 in 162 | let y3 = f x3 in 163 | let y2 = f x2 in 164 | let y1 = f x1 in 165 | [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10] 166 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10; x11] -> 167 | let y11 = f x11 in 168 | let y10 = f x10 in 169 | let y9 = f x9 in 170 | let y8 = f x8 in 171 | let y7 = f x7 in 172 | let y6 = f x6 in 173 | let y5 = f x5 in 174 | let y4 = f x4 in 175 | let y3 = f x3 in 176 | let y2 = f x2 in 177 | let y1 = f x1 in 178 | [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10; y11] 179 | | [x1; x2; x3; x4; x5; x6; x7; x8; x9; x10; x11; x12] -> 180 | let y12 = f x12 in 181 | let y11 = f x11 in 182 | let y10 = f x10 in 183 | let y9 = f x9 in 184 | let y8 = f x8 in 185 | let y7 = f x7 in 186 | let y6 = f x6 in 187 | let y5 = f x5 in 188 | let y4 = f x4 in 189 | let y3 = f x3 in 190 | let y2 = f x2 in 191 | let y1 = f x1 in 192 | [y1; y2; y3; y4; y5; y6; y7; y8; y9; y10; y11; y12] 193 | end [@ocaml.warning "-8"] 194 | in 195 | 196 | let map_tail_chunk suffix chunk = 197 | begin match chunk with 198 | | x1::x2::x3::x4::x5::x6::x7::x8::x9::x10::x11::x12::_ -> 199 | let y12 = f x12 in 200 | let y11 = f x11 in 201 | let y10 = f x10 in 202 | let y9 = f x9 in 203 | let y8 = f x8 in 204 | let y7 = f x7 in 205 | let y6 = f x6 in 206 | let y5 = f x5 in 207 | let y4 = f x4 in 208 | let y3 = f x3 in 209 | let y2 = f x2 in 210 | let y1 = f x1 in 211 | (y1)::(y2)::(y3)::(y4)::(y5)::(y6)::(y7)::(y8)::(y9)::(y10)::(y11)::(y12)::suffix 212 | end [@ocaml.warning "-8"] 213 | in 214 | 215 | let rec map_all_tail_chunks suffix chunks = 216 | match chunks with 217 | | [] -> 218 | suffix 219 | | chunk::more -> 220 | ((map_all_tail_chunks [@ocaml.tailcall]) 221 | (map_tail_chunk suffix chunk) more) 222 | in 223 | 224 | let chunks = split [] l in 225 | 226 | match chunks with 227 | | [] -> 228 | [] 229 | | first::rest -> 230 | map_all_tail_chunks (map_head_chunk first) rest 231 | 232 | 233 | 234 | (* Combines the 5x unrolled non-tail-recursive map for a prefix of 5000 235 | elements, followed by the tail-recursive new fast map for the remainder. *) 236 | let faster_map f l = 237 | plain_unrolled_prefix_5 chunked_tail_recursive_map_12 1000 f l 238 | -------------------------------------------------------------------------------- /results/faster_map.s: -------------------------------------------------------------------------------- 1 | .file "" 2 | .section __TEXT,__literal16,16byte_literals 3 | .align 4 4 | _caml_negf_mask: 5 | .quad 0x8000000000000000 6 | .quad 0 7 | .align 4 8 | _caml_absf_mask: 9 | .quad 0x7fffffffffffffff 10 | .quad -1 11 | .data 12 | .globl _camlFaster_map__data_begin 13 | _camlFaster_map__data_begin: 14 | .text 15 | .globl _camlFaster_map__code_begin 16 | _camlFaster_map__code_begin: 17 | nop 18 | .data 19 | .globl _camlFaster_map__gc_roots 20 | _camlFaster_map__gc_roots: 21 | .quad 0 22 | .text 23 | .align 4 24 | .globl _camlFaster_map__plain_unrolled_map_5_13 25 | _camlFaster_map__plain_unrolled_map_5_13: 26 | .cfi_startproc 27 | subq $72, %rsp 28 | .cfi_adjust_cfa_offset 72 29 | L121: 30 | movq %rax, %rdi 31 | cmpq $1, %rbx 32 | je L116 33 | movq 8(%rbx), %rsi 34 | movq (%rbx), %rax 35 | cmpq $1, %rsi 36 | je L117 37 | movq %rdi, 48(%rsp) 38 | movq 8(%rsi), %rbx 39 | movq (%rsi), %rsi 40 | movq %rsi, 24(%rsp) 41 | cmpq $1, %rbx 42 | je L118 43 | movq 8(%rbx), %rsi 44 | movq (%rbx), %rbx 45 | movq %rbx, 32(%rsp) 46 | cmpq $1, %rsi 47 | je L119 48 | movq 8(%rsi), %rbx 49 | movq (%rsi), %rsi 50 | movq %rsi, 40(%rsp) 51 | cmpq $1, %rbx 52 | je L120 53 | movq %rbx, (%rsp) 54 | movq (%rdi), %rsi 55 | movq %rdi, %rbx 56 | call *%rsi 57 | L110: 58 | movq %rax, 64(%rsp) 59 | movq 48(%rsp), %rbx 60 | movq (%rbx), %rdi 61 | movq 24(%rsp), %rax 62 | call *%rdi 63 | L111: 64 | movq %rax, 56(%rsp) 65 | movq 48(%rsp), %rbx 66 | movq (%rbx), %rdi 67 | movq 32(%rsp), %rax 68 | call *%rdi 69 | L112: 70 | movq %rax, 24(%rsp) 71 | movq 48(%rsp), %rbx 72 | movq (%rbx), %rdi 73 | movq 40(%rsp), %rax 74 | call *%rdi 75 | L113: 76 | movq %rax, 16(%rsp) 77 | movq (%rsp), %rax 78 | movq (%rax), %rax 79 | movq 48(%rsp), %rbx 80 | movq (%rbx), %rdi 81 | call *%rdi 82 | L114: 83 | movq %rax, 8(%rsp) 84 | movq (%rsp), %rax 85 | movq 8(%rax), %rbx 86 | movq 48(%rsp), %rax 87 | call _camlFaster_map__plain_unrolled_map_5_13 88 | L115: 89 | movq %rax, %rbx 90 | L122: 91 | subq $120, %r15 92 | movq _caml_young_limit@GOTPCREL(%rip), %rax 93 | cmpq (%rax), %r15 94 | jb L123 95 | leaq 8(%r15), %rax 96 | movq $2048, -8(%rax) 97 | movq 8(%rsp), %rdi 98 | movq %rdi, (%rax) 99 | movq %rbx, 8(%rax) 100 | leaq 24(%rax), %rbx 101 | movq $2048, -8(%rbx) 102 | movq 16(%rsp), %rdi 103 | movq %rdi, (%rbx) 104 | movq %rax, 8(%rbx) 105 | leaq 48(%rax), %rdi 106 | movq $2048, -8(%rdi) 107 | movq 24(%rsp), %rsi 108 | movq %rsi, (%rdi) 109 | movq %rbx, 8(%rdi) 110 | leaq 72(%rax), %rbx 111 | movq $2048, -8(%rbx) 112 | movq 56(%rsp), %rsi 113 | movq %rsi, (%rbx) 114 | movq %rdi, 8(%rbx) 115 | addq $96, %rax 116 | movq $2048, -8(%rax) 117 | movq 64(%rsp), %rdi 118 | movq %rdi, (%rax) 119 | movq %rbx, 8(%rax) 120 | addq $72, %rsp 121 | .cfi_adjust_cfa_offset -72 122 | ret 123 | .cfi_adjust_cfa_offset 72 124 | .align 2 125 | L120: 126 | movq (%rdi), %rsi 127 | movq %rdi, %rbx 128 | call *%rsi 129 | L106: 130 | movq %rax, 16(%rsp) 131 | movq 48(%rsp), %rbx 132 | movq (%rbx), %rdi 133 | movq 24(%rsp), %rax 134 | call *%rdi 135 | L107: 136 | movq %rax, 8(%rsp) 137 | movq 48(%rsp), %rbx 138 | movq (%rbx), %rdi 139 | movq 32(%rsp), %rax 140 | call *%rdi 141 | L108: 142 | movq %rax, (%rsp) 143 | movq 48(%rsp), %rbx 144 | movq (%rbx), %rdi 145 | movq 40(%rsp), %rax 146 | call *%rdi 147 | L109: 148 | movq %rax, %rbx 149 | L125: 150 | subq $96, %r15 151 | movq _caml_young_limit@GOTPCREL(%rip), %rax 152 | cmpq (%rax), %r15 153 | jb L126 154 | leaq 8(%r15), %rax 155 | movq $2048, -8(%rax) 156 | movq %rbx, (%rax) 157 | movq $1, 8(%rax) 158 | leaq 24(%rax), %rbx 159 | movq $2048, -8(%rbx) 160 | movq (%rsp), %rdi 161 | movq %rdi, (%rbx) 162 | movq %rax, 8(%rbx) 163 | leaq 48(%rax), %rdi 164 | movq $2048, -8(%rdi) 165 | movq 8(%rsp), %rsi 166 | movq %rsi, (%rdi) 167 | movq %rbx, 8(%rdi) 168 | addq $72, %rax 169 | movq $2048, -8(%rax) 170 | movq 16(%rsp), %rbx 171 | movq %rbx, (%rax) 172 | movq %rdi, 8(%rax) 173 | addq $72, %rsp 174 | .cfi_adjust_cfa_offset -72 175 | ret 176 | .cfi_adjust_cfa_offset 72 177 | .align 2 178 | L119: 179 | movq (%rdi), %rsi 180 | movq %rdi, %rbx 181 | call *%rsi 182 | L103: 183 | movq %rax, 8(%rsp) 184 | movq 48(%rsp), %rbx 185 | movq (%rbx), %rdi 186 | movq 24(%rsp), %rax 187 | call *%rdi 188 | L104: 189 | movq %rax, (%rsp) 190 | movq 48(%rsp), %rbx 191 | movq (%rbx), %rdi 192 | movq 32(%rsp), %rax 193 | call *%rdi 194 | L105: 195 | movq %rax, %rbx 196 | L128: 197 | subq $72, %r15 198 | movq _caml_young_limit@GOTPCREL(%rip), %rax 199 | cmpq (%rax), %r15 200 | jb L129 201 | leaq 8(%r15), %rax 202 | movq $2048, -8(%rax) 203 | movq %rbx, (%rax) 204 | movq $1, 8(%rax) 205 | leaq 24(%rax), %rbx 206 | movq $2048, -8(%rbx) 207 | movq (%rsp), %rdi 208 | movq %rdi, (%rbx) 209 | movq %rax, 8(%rbx) 210 | addq $48, %rax 211 | movq $2048, -8(%rax) 212 | movq 8(%rsp), %rdi 213 | movq %rdi, (%rax) 214 | movq %rbx, 8(%rax) 215 | addq $72, %rsp 216 | .cfi_adjust_cfa_offset -72 217 | ret 218 | .cfi_adjust_cfa_offset 72 219 | .align 2 220 | L118: 221 | movq (%rdi), %rsi 222 | movq %rdi, %rbx 223 | call *%rsi 224 | L101: 225 | movq %rax, (%rsp) 226 | movq 48(%rsp), %rbx 227 | movq (%rbx), %rdi 228 | movq 24(%rsp), %rax 229 | call *%rdi 230 | L102: 231 | movq %rax, %rbx 232 | L131: 233 | subq $48, %r15 234 | movq _caml_young_limit@GOTPCREL(%rip), %rax 235 | cmpq (%rax), %r15 236 | jb L132 237 | leaq 8(%r15), %rax 238 | movq $2048, -8(%rax) 239 | movq %rbx, (%rax) 240 | movq $1, 8(%rax) 241 | leaq 24(%rax), %rbx 242 | movq $2048, -8(%rbx) 243 | movq (%rsp), %rdi 244 | movq %rdi, (%rbx) 245 | movq %rax, 8(%rbx) 246 | movq %rbx, %rax 247 | addq $72, %rsp 248 | .cfi_adjust_cfa_offset -72 249 | ret 250 | .cfi_adjust_cfa_offset 72 251 | .align 2 252 | L117: 253 | movq (%rdi), %rsi 254 | movq %rdi, %rbx 255 | call *%rsi 256 | L100: 257 | movq %rax, %rbx 258 | L134: 259 | subq $24, %r15 260 | movq _caml_young_limit@GOTPCREL(%rip), %rax 261 | cmpq (%rax), %r15 262 | jb L135 263 | leaq 8(%r15), %rax 264 | movq $2048, -8(%rax) 265 | movq %rbx, (%rax) 266 | movq $1, 8(%rax) 267 | addq $72, %rsp 268 | .cfi_adjust_cfa_offset -72 269 | ret 270 | .cfi_adjust_cfa_offset 72 271 | .align 2 272 | L116: 273 | movq $1, %rax 274 | addq $72, %rsp 275 | .cfi_adjust_cfa_offset -72 276 | ret 277 | .cfi_adjust_cfa_offset 72 278 | L135: 279 | call _caml_call_gc 280 | L136: 281 | jmp L134 282 | L132: 283 | call _caml_call_gc 284 | L133: 285 | jmp L131 286 | L129: 287 | call _caml_call_gc 288 | L130: 289 | jmp L128 290 | L126: 291 | call _caml_call_gc 292 | L127: 293 | jmp L125 294 | L123: 295 | call _caml_call_gc 296 | L124: 297 | jmp L122 298 | .cfi_adjust_cfa_offset -72 299 | .cfi_endproc 300 | .text 301 | .align 4 302 | .globl _camlFaster_map__plain_unrolled_prefix_5_109 303 | _camlFaster_map__plain_unrolled_prefix_5_109: 304 | .cfi_startproc 305 | subq $56, %rsp 306 | .cfi_adjust_cfa_offset 56 307 | L161: 308 | movq %rax, %rdx 309 | cmpq $1, %rsi 310 | je L154 311 | movq 8(%rsi), %rcx 312 | movq (%rsi), %rax 313 | cmpq $1, %rcx 314 | je L155 315 | movq %rax, 40(%rsp) 316 | movq %rdi, 32(%rsp) 317 | movq 8(%rcx), %rax 318 | movq (%rcx), %rsi 319 | cmpq $1, %rax 320 | je L156 321 | movq %rsi, 24(%rsp) 322 | movq 8(%rax), %rsi 323 | movq (%rax), %rax 324 | cmpq $1, %rsi 325 | je L157 326 | movq %rax, 16(%rsp) 327 | movq 8(%rsi), %rax 328 | movq (%rsi), %rsi 329 | cmpq $1, %rax 330 | je L158 331 | movq %rsi, 8(%rsp) 332 | movq %rax, (%rsp) 333 | movq 8(%rax), %rsi 334 | cmpq $1, %rbx 335 | jg L160 336 | movq %rdi, %rax 337 | movq %rsi, %rbx 338 | movq %rdx, %rdi 339 | call _caml_apply2 340 | L147: 341 | movq %rax, 48(%rsp) 342 | jmp L159 343 | .align 2 344 | L160: 345 | addq $-2, %rbx 346 | movq %rdx, %rax 347 | call _camlFaster_map__plain_unrolled_prefix_5_109 348 | L148: 349 | movq %rax, 48(%rsp) 350 | L159: 351 | movq (%rsp), %rax 352 | movq (%rax), %rax 353 | movq 32(%rsp), %rbx 354 | movq (%rbx), %rdi 355 | call *%rdi 356 | L149: 357 | movq %rax, (%rsp) 358 | movq 32(%rsp), %rbx 359 | movq (%rbx), %rdi 360 | movq 8(%rsp), %rax 361 | call *%rdi 362 | L150: 363 | movq %rax, 8(%rsp) 364 | movq 32(%rsp), %rbx 365 | movq (%rbx), %rdi 366 | movq 16(%rsp), %rax 367 | call *%rdi 368 | L151: 369 | movq %rax, 16(%rsp) 370 | movq 32(%rsp), %rbx 371 | movq (%rbx), %rdi 372 | movq 24(%rsp), %rax 373 | call *%rdi 374 | L152: 375 | movq %rax, 24(%rsp) 376 | movq 32(%rsp), %rbx 377 | movq (%rbx), %rdi 378 | movq 40(%rsp), %rax 379 | call *%rdi 380 | L153: 381 | movq %rax, %rbx 382 | L162: 383 | subq $120, %r15 384 | movq _caml_young_limit@GOTPCREL(%rip), %rax 385 | cmpq (%rax), %r15 386 | jb L163 387 | leaq 8(%r15), %rax 388 | movq $2048, -8(%rax) 389 | movq (%rsp), %rdi 390 | movq %rdi, (%rax) 391 | movq 48(%rsp), %rdi 392 | movq %rdi, 8(%rax) 393 | leaq 24(%rax), %rdi 394 | movq $2048, -8(%rdi) 395 | movq 8(%rsp), %rsi 396 | movq %rsi, (%rdi) 397 | movq %rax, 8(%rdi) 398 | leaq 48(%rax), %rsi 399 | movq $2048, -8(%rsi) 400 | movq 16(%rsp), %rdx 401 | movq %rdx, (%rsi) 402 | movq %rdi, 8(%rsi) 403 | leaq 72(%rax), %rdi 404 | movq $2048, -8(%rdi) 405 | movq 24(%rsp), %rdx 406 | movq %rdx, (%rdi) 407 | movq %rsi, 8(%rdi) 408 | addq $96, %rax 409 | movq $2048, -8(%rax) 410 | movq %rbx, (%rax) 411 | movq %rdi, 8(%rax) 412 | addq $56, %rsp 413 | .cfi_adjust_cfa_offset -56 414 | ret 415 | .cfi_adjust_cfa_offset 56 416 | .align 2 417 | L158: 418 | movq (%rdi), %rdx 419 | movq %rsi, %rax 420 | movq %rdi, %rbx 421 | call *%rdx 422 | L143: 423 | movq %rax, (%rsp) 424 | movq 32(%rsp), %rbx 425 | movq (%rbx), %rdi 426 | movq 16(%rsp), %rax 427 | call *%rdi 428 | L144: 429 | movq %rax, 8(%rsp) 430 | movq 32(%rsp), %rbx 431 | movq (%rbx), %rdi 432 | movq 24(%rsp), %rax 433 | call *%rdi 434 | L145: 435 | movq %rax, 16(%rsp) 436 | movq 32(%rsp), %rbx 437 | movq (%rbx), %rdi 438 | movq 40(%rsp), %rax 439 | call *%rdi 440 | L146: 441 | movq %rax, %rbx 442 | L165: 443 | subq $96, %r15 444 | movq _caml_young_limit@GOTPCREL(%rip), %rax 445 | cmpq (%rax), %r15 446 | jb L166 447 | leaq 8(%r15), %rax 448 | movq $2048, -8(%rax) 449 | movq (%rsp), %rdi 450 | movq %rdi, (%rax) 451 | movq $1, 8(%rax) 452 | leaq 24(%rax), %rdi 453 | movq $2048, -8(%rdi) 454 | movq 8(%rsp), %rsi 455 | movq %rsi, (%rdi) 456 | movq %rax, 8(%rdi) 457 | leaq 48(%rax), %rsi 458 | movq $2048, -8(%rsi) 459 | movq 16(%rsp), %rdx 460 | movq %rdx, (%rsi) 461 | movq %rdi, 8(%rsi) 462 | addq $72, %rax 463 | movq $2048, -8(%rax) 464 | movq %rbx, (%rax) 465 | movq %rsi, 8(%rax) 466 | addq $56, %rsp 467 | .cfi_adjust_cfa_offset -56 468 | ret 469 | .cfi_adjust_cfa_offset 56 470 | .align 2 471 | L157: 472 | movq (%rdi), %rsi 473 | movq %rdi, %rbx 474 | call *%rsi 475 | L140: 476 | movq %rax, (%rsp) 477 | movq 32(%rsp), %rbx 478 | movq (%rbx), %rdi 479 | movq 24(%rsp), %rax 480 | call *%rdi 481 | L141: 482 | movq %rax, 8(%rsp) 483 | movq 32(%rsp), %rbx 484 | movq (%rbx), %rdi 485 | movq 40(%rsp), %rax 486 | call *%rdi 487 | L142: 488 | movq %rax, %rbx 489 | L168: 490 | subq $72, %r15 491 | movq _caml_young_limit@GOTPCREL(%rip), %rax 492 | cmpq (%rax), %r15 493 | jb L169 494 | leaq 8(%r15), %rax 495 | movq $2048, -8(%rax) 496 | movq (%rsp), %rdi 497 | movq %rdi, (%rax) 498 | movq $1, 8(%rax) 499 | leaq 24(%rax), %rdi 500 | movq $2048, -8(%rdi) 501 | movq 8(%rsp), %rsi 502 | movq %rsi, (%rdi) 503 | movq %rax, 8(%rdi) 504 | addq $48, %rax 505 | movq $2048, -8(%rax) 506 | movq %rbx, (%rax) 507 | movq %rdi, 8(%rax) 508 | addq $56, %rsp 509 | .cfi_adjust_cfa_offset -56 510 | ret 511 | .cfi_adjust_cfa_offset 56 512 | .align 2 513 | L156: 514 | movq (%rdi), %rdx 515 | movq %rsi, %rax 516 | movq %rdi, %rbx 517 | call *%rdx 518 | L138: 519 | movq %rax, (%rsp) 520 | movq 32(%rsp), %rbx 521 | movq (%rbx), %rdi 522 | movq 40(%rsp), %rax 523 | call *%rdi 524 | L139: 525 | movq %rax, %rbx 526 | L171: 527 | subq $48, %r15 528 | movq _caml_young_limit@GOTPCREL(%rip), %rax 529 | cmpq (%rax), %r15 530 | jb L172 531 | leaq 8(%r15), %rax 532 | movq $2048, -8(%rax) 533 | movq (%rsp), %rdi 534 | movq %rdi, (%rax) 535 | movq $1, 8(%rax) 536 | leaq 24(%rax), %rdi 537 | movq $2048, -8(%rdi) 538 | movq %rbx, (%rdi) 539 | movq %rax, 8(%rdi) 540 | movq %rdi, %rax 541 | addq $56, %rsp 542 | .cfi_adjust_cfa_offset -56 543 | ret 544 | .cfi_adjust_cfa_offset 56 545 | .align 2 546 | L155: 547 | movq (%rdi), %rsi 548 | movq %rdi, %rbx 549 | call *%rsi 550 | L137: 551 | movq %rax, %rbx 552 | L174: 553 | subq $24, %r15 554 | movq _caml_young_limit@GOTPCREL(%rip), %rax 555 | cmpq (%rax), %r15 556 | jb L175 557 | leaq 8(%r15), %rax 558 | movq $2048, -8(%rax) 559 | movq %rbx, (%rax) 560 | movq $1, 8(%rax) 561 | addq $56, %rsp 562 | .cfi_adjust_cfa_offset -56 563 | ret 564 | .cfi_adjust_cfa_offset 56 565 | .align 2 566 | L154: 567 | movq $1, %rax 568 | addq $56, %rsp 569 | .cfi_adjust_cfa_offset -56 570 | ret 571 | .cfi_adjust_cfa_offset 56 572 | L175: 573 | call _caml_call_gc 574 | L176: 575 | jmp L174 576 | L172: 577 | call _caml_call_gc 578 | L173: 579 | jmp L171 580 | L169: 581 | call _caml_call_gc 582 | L170: 583 | jmp L168 584 | L166: 585 | call _caml_call_gc 586 | L167: 587 | jmp L165 588 | L163: 589 | call _caml_call_gc 590 | L164: 591 | jmp L162 592 | .cfi_adjust_cfa_offset -56 593 | .cfi_endproc 594 | .text 595 | .align 4 596 | .globl _camlFaster_map__chunked_tail_recursive_map_12_216 597 | _camlFaster_map__chunked_tail_recursive_map_12_216: 598 | .cfi_startproc 599 | subq $24, %rsp 600 | .cfi_adjust_cfa_offset 24 601 | L181: 602 | movq %rax, %rdi 603 | L182: 604 | subq $112, %r15 605 | movq _caml_young_limit@GOTPCREL(%rip), %rax 606 | cmpq (%rax), %r15 607 | jb L183 608 | leaq 8(%r15), %rax 609 | movq %rax, (%rsp) 610 | movq $3319, -8(%rax) 611 | movq _camlFaster_map__map_head_chunk_266@GOTPCREL(%rip), %rsi 612 | movq %rsi, (%rax) 613 | movq $3, 8(%rax) 614 | movq %rdi, 16(%rax) 615 | leaq 32(%rax), %rsi 616 | movq $4343, -8(%rsi) 617 | movq _caml_curry2@GOTPCREL(%rip), %rdx 618 | movq %rdx, (%rsi) 619 | movq $5, 8(%rsi) 620 | movq _camlFaster_map__map_tail_chunk_666@GOTPCREL(%rip), %rcx 621 | movq %rcx, 16(%rsi) 622 | movq %rdi, 24(%rsi) 623 | addq $72, %rax 624 | movq %rax, 16(%rsp) 625 | movq $4343, -8(%rax) 626 | movq %rdx, (%rax) 627 | movq $5, 8(%rax) 628 | movq _camlFaster_map__map_all_tail_chunks_787@GOTPCREL(%rip), %rdi 629 | movq %rdi, 16(%rax) 630 | movq %rsi, 24(%rax) 631 | movq $1, %rax 632 | call _camlFaster_map__split_221 633 | L177: 634 | cmpq $1, %rax 635 | je L180 636 | movq 8(%rax), %rbx 637 | movq %rbx, 8(%rsp) 638 | movq (%rax), %rax 639 | movq (%rsp), %rbx 640 | call _camlFaster_map__map_head_chunk_266 641 | L178: 642 | movq 8(%rsp), %rbx 643 | movq 16(%rsp), %rdi 644 | addq $24, %rsp 645 | .cfi_adjust_cfa_offset -24 646 | jmp _camlFaster_map__map_all_tail_chunks_787 647 | .cfi_adjust_cfa_offset 24 648 | .align 2 649 | L180: 650 | movq $1, %rax 651 | addq $24, %rsp 652 | .cfi_adjust_cfa_offset -24 653 | ret 654 | .cfi_adjust_cfa_offset 24 655 | L183: 656 | call _caml_call_gc 657 | L184: 658 | jmp L182 659 | .cfi_adjust_cfa_offset -24 660 | .cfi_endproc 661 | .text 662 | .align 4 663 | .globl _camlFaster_map__split_221 664 | _camlFaster_map__split_221: 665 | .cfi_startproc 666 | subq $8, %rsp 667 | .cfi_adjust_cfa_offset 8 668 | L187: 669 | movq %rax, %rdi 670 | cmpq $1, %rbx 671 | je L186 672 | movq 8(%rbx), %rax 673 | cmpq $1, %rax 674 | je L186 675 | movq 8(%rax), %rax 676 | cmpq $1, %rax 677 | je L186 678 | movq 8(%rax), %rax 679 | cmpq $1, %rax 680 | je L186 681 | movq 8(%rax), %rax 682 | cmpq $1, %rax 683 | je L186 684 | movq 8(%rax), %rax 685 | cmpq $1, %rax 686 | je L186 687 | movq 8(%rax), %rax 688 | cmpq $1, %rax 689 | je L186 690 | movq 8(%rax), %rax 691 | cmpq $1, %rax 692 | je L186 693 | movq 8(%rax), %rax 694 | cmpq $1, %rax 695 | je L186 696 | movq 8(%rax), %rax 697 | cmpq $1, %rax 698 | je L186 699 | movq 8(%rax), %rax 700 | cmpq $1, %rax 701 | je L186 702 | movq 8(%rax), %rax 703 | cmpq $1, %rax 704 | je L186 705 | movq 8(%rax), %rsi 706 | L188: 707 | subq $24, %r15 708 | movq _caml_young_limit@GOTPCREL(%rip), %rax 709 | cmpq (%rax), %r15 710 | jb L189 711 | leaq 8(%r15), %rax 712 | movq $2048, -8(%rax) 713 | movq %rbx, (%rax) 714 | movq %rdi, 8(%rax) 715 | movq %rsi, %rbx 716 | jmp L187 717 | .align 2 718 | L186: 719 | L191: 720 | subq $24, %r15 721 | movq _caml_young_limit@GOTPCREL(%rip), %rax 722 | cmpq (%rax), %r15 723 | jb L192 724 | leaq 8(%r15), %rax 725 | movq $2048, -8(%rax) 726 | movq %rbx, (%rax) 727 | movq %rdi, 8(%rax) 728 | addq $8, %rsp 729 | .cfi_adjust_cfa_offset -8 730 | ret 731 | .cfi_adjust_cfa_offset 8 732 | L192: 733 | call _caml_call_gc 734 | L193: 735 | jmp L191 736 | L189: 737 | call _caml_call_gc 738 | L190: 739 | jmp L188 740 | .cfi_adjust_cfa_offset -8 741 | .cfi_endproc 742 | .text 743 | .align 4 744 | .globl _camlFaster_map__map_head_chunk_266 745 | _camlFaster_map__map_head_chunk_266: 746 | .cfi_startproc 747 | subq $104, %rsp 748 | .cfi_adjust_cfa_offset 104 749 | L285: 750 | cmpq $1, %rax 751 | je L272 752 | movq 8(%rax), %rdi 753 | movq (%rax), %rax 754 | cmpq $1, %rdi 755 | je L273 756 | movq %rbx, 88(%rsp) 757 | movq 8(%rdi), %rsi 758 | movq (%rdi), %rdi 759 | cmpq $1, %rsi 760 | je L274 761 | movq 8(%rsi), %rdx 762 | movq (%rsi), %rsi 763 | cmpq $1, %rdx 764 | je L275 765 | movq 8(%rdx), %rcx 766 | movq (%rdx), %rbp 767 | cmpq $1, %rcx 768 | je L276 769 | movq 8(%rcx), %rdx 770 | movq (%rcx), %r11 771 | cmpq $1, %rdx 772 | je L277 773 | movq 8(%rdx), %rcx 774 | movq (%rdx), %r10 775 | cmpq $1, %rcx 776 | je L278 777 | movq 8(%rcx), %rdx 778 | movq (%rcx), %r13 779 | cmpq $1, %rdx 780 | je L279 781 | movq 8(%rdx), %rcx 782 | movq (%rdx), %r12 783 | cmpq $1, %rcx 784 | je L280 785 | movq 8(%rcx), %r8 786 | movq (%rcx), %r9 787 | cmpq $1, %r8 788 | je L281 789 | movq 8(%r8), %rdx 790 | movq (%r8), %rcx 791 | cmpq $1, %rdx 792 | je L282 793 | movq 8(%rdx), %r8 794 | movq (%rdx), %rdx 795 | cmpq $1, %r8 796 | je L283 797 | movq 8(%r8), %rbx 798 | cmpq $1, %rbx 799 | je L284 800 | movq _camlFaster_map__Pmakeblock_830@GOTPCREL(%rip), %rax 801 | movq %r14, %rsp 802 | popq %r14 803 | ret 804 | .align 2 805 | L284: 806 | movq %rdx, (%rsp) 807 | movq %rcx, 16(%rsp) 808 | movq %r9, 24(%rsp) 809 | movq %r12, 32(%rsp) 810 | movq %r13, 40(%rsp) 811 | movq %r10, 48(%rsp) 812 | movq %r11, 56(%rsp) 813 | movq %rbp, 64(%rsp) 814 | movq %rsi, 72(%rsp) 815 | movq %rdi, 80(%rsp) 816 | movq %rax, 96(%rsp) 817 | movq 88(%rsp), %rax 818 | movq 16(%rax), %rbx 819 | movq (%r8), %rax 820 | movq (%rbx), %rdi 821 | call *%rdi 822 | L260: 823 | movq %rax, 8(%rsp) 824 | movq 88(%rsp), %rax 825 | movq 16(%rax), %rbx 826 | movq (%rbx), %rdi 827 | movq (%rsp), %rax 828 | call *%rdi 829 | L261: 830 | movq %rax, (%rsp) 831 | movq 88(%rsp), %rax 832 | movq 16(%rax), %rbx 833 | movq (%rbx), %rdi 834 | movq 16(%rsp), %rax 835 | call *%rdi 836 | L262: 837 | movq %rax, 16(%rsp) 838 | movq 88(%rsp), %rax 839 | movq 16(%rax), %rbx 840 | movq (%rbx), %rdi 841 | movq 24(%rsp), %rax 842 | call *%rdi 843 | L263: 844 | movq %rax, 24(%rsp) 845 | movq 88(%rsp), %rax 846 | movq 16(%rax), %rbx 847 | movq (%rbx), %rdi 848 | movq 32(%rsp), %rax 849 | call *%rdi 850 | L264: 851 | movq %rax, 32(%rsp) 852 | movq 88(%rsp), %rax 853 | movq 16(%rax), %rbx 854 | movq (%rbx), %rdi 855 | movq 40(%rsp), %rax 856 | call *%rdi 857 | L265: 858 | movq %rax, 40(%rsp) 859 | movq 88(%rsp), %rax 860 | movq 16(%rax), %rbx 861 | movq (%rbx), %rdi 862 | movq 48(%rsp), %rax 863 | call *%rdi 864 | L266: 865 | movq %rax, 48(%rsp) 866 | movq 88(%rsp), %rax 867 | movq 16(%rax), %rbx 868 | movq (%rbx), %rdi 869 | movq 56(%rsp), %rax 870 | call *%rdi 871 | L267: 872 | movq %rax, 56(%rsp) 873 | movq 88(%rsp), %rax 874 | movq 16(%rax), %rbx 875 | movq (%rbx), %rdi 876 | movq 64(%rsp), %rax 877 | call *%rdi 878 | L268: 879 | movq %rax, 64(%rsp) 880 | movq 88(%rsp), %rax 881 | movq 16(%rax), %rbx 882 | movq (%rbx), %rdi 883 | movq 72(%rsp), %rax 884 | call *%rdi 885 | L269: 886 | movq %rax, 72(%rsp) 887 | movq 88(%rsp), %rax 888 | movq 16(%rax), %rbx 889 | movq (%rbx), %rdi 890 | movq 80(%rsp), %rax 891 | call *%rdi 892 | L270: 893 | movq %rax, 80(%rsp) 894 | movq 88(%rsp), %rax 895 | movq 16(%rax), %rbx 896 | movq (%rbx), %rdi 897 | movq 96(%rsp), %rax 898 | call *%rdi 899 | L271: 900 | movq %rax, %rbx 901 | L286: 902 | subq $288, %r15 903 | movq _caml_young_limit@GOTPCREL(%rip), %rax 904 | cmpq (%rax), %r15 905 | jb L287 906 | leaq 8(%r15), %rax 907 | movq $2048, -8(%rax) 908 | movq 8(%rsp), %rdi 909 | movq %rdi, (%rax) 910 | movq $1, 8(%rax) 911 | leaq 24(%rax), %rdi 912 | movq $2048, -8(%rdi) 913 | movq (%rsp), %rsi 914 | movq %rsi, (%rdi) 915 | movq %rax, 8(%rdi) 916 | leaq 48(%rax), %rsi 917 | movq $2048, -8(%rsi) 918 | movq 16(%rsp), %rdx 919 | movq %rdx, (%rsi) 920 | movq %rdi, 8(%rsi) 921 | leaq 72(%rax), %rdi 922 | movq $2048, -8(%rdi) 923 | movq 24(%rsp), %rdx 924 | movq %rdx, (%rdi) 925 | movq %rsi, 8(%rdi) 926 | leaq 96(%rax), %rsi 927 | movq $2048, -8(%rsi) 928 | movq 32(%rsp), %rdx 929 | movq %rdx, (%rsi) 930 | movq %rdi, 8(%rsi) 931 | leaq 120(%rax), %rdi 932 | movq $2048, -8(%rdi) 933 | movq 40(%rsp), %rdx 934 | movq %rdx, (%rdi) 935 | movq %rsi, 8(%rdi) 936 | leaq 144(%rax), %rsi 937 | movq $2048, -8(%rsi) 938 | movq 48(%rsp), %rdx 939 | movq %rdx, (%rsi) 940 | movq %rdi, 8(%rsi) 941 | leaq 168(%rax), %rdi 942 | movq $2048, -8(%rdi) 943 | movq 56(%rsp), %rdx 944 | movq %rdx, (%rdi) 945 | movq %rsi, 8(%rdi) 946 | leaq 192(%rax), %rsi 947 | movq $2048, -8(%rsi) 948 | movq 64(%rsp), %rdx 949 | movq %rdx, (%rsi) 950 | movq %rdi, 8(%rsi) 951 | leaq 216(%rax), %rdi 952 | movq $2048, -8(%rdi) 953 | movq 72(%rsp), %rdx 954 | movq %rdx, (%rdi) 955 | movq %rsi, 8(%rdi) 956 | leaq 240(%rax), %rsi 957 | movq $2048, -8(%rsi) 958 | movq 80(%rsp), %rdx 959 | movq %rdx, (%rsi) 960 | movq %rdi, 8(%rsi) 961 | addq $264, %rax 962 | movq $2048, -8(%rax) 963 | movq %rbx, (%rax) 964 | movq %rsi, 8(%rax) 965 | addq $104, %rsp 966 | .cfi_adjust_cfa_offset -104 967 | ret 968 | .cfi_adjust_cfa_offset 104 969 | .align 2 970 | L283: 971 | movq %rcx, 16(%rsp) 972 | movq %r9, 24(%rsp) 973 | movq %r12, 32(%rsp) 974 | movq %r13, 40(%rsp) 975 | movq %r10, 48(%rsp) 976 | movq %r11, 56(%rsp) 977 | movq %rbp, 64(%rsp) 978 | movq %rsi, 72(%rsp) 979 | movq %rdi, 80(%rsp) 980 | movq %rax, 96(%rsp) 981 | movq 16(%rbx), %rax 982 | movq %rax, (%rsp) 983 | movq (%rsp), %rax 984 | movq (%rax), %rax 985 | movq %rax, 8(%rsp) 986 | movq %rdx, %rax 987 | movq (%rsp), %rbx 988 | movq 8(%rsp), %rdi 989 | call *%rdi 990 | L249: 991 | movq %rax, (%rsp) 992 | movq 88(%rsp), %rax 993 | movq 16(%rax), %rbx 994 | movq (%rbx), %rdi 995 | movq 16(%rsp), %rax 996 | call *%rdi 997 | L250: 998 | movq %rax, 8(%rsp) 999 | movq 88(%rsp), %rax 1000 | movq 16(%rax), %rbx 1001 | movq (%rbx), %rdi 1002 | movq 24(%rsp), %rax 1003 | call *%rdi 1004 | L251: 1005 | movq %rax, 16(%rsp) 1006 | movq 88(%rsp), %rax 1007 | movq 16(%rax), %rbx 1008 | movq (%rbx), %rdi 1009 | movq 32(%rsp), %rax 1010 | call *%rdi 1011 | L252: 1012 | movq %rax, 24(%rsp) 1013 | movq 88(%rsp), %rax 1014 | movq 16(%rax), %rbx 1015 | movq (%rbx), %rdi 1016 | movq 40(%rsp), %rax 1017 | call *%rdi 1018 | L253: 1019 | movq %rax, 32(%rsp) 1020 | movq 88(%rsp), %rax 1021 | movq 16(%rax), %rbx 1022 | movq (%rbx), %rdi 1023 | movq 48(%rsp), %rax 1024 | call *%rdi 1025 | L254: 1026 | movq %rax, 40(%rsp) 1027 | movq 88(%rsp), %rax 1028 | movq 16(%rax), %rbx 1029 | movq (%rbx), %rdi 1030 | movq 56(%rsp), %rax 1031 | call *%rdi 1032 | L255: 1033 | movq %rax, 48(%rsp) 1034 | movq 88(%rsp), %rax 1035 | movq 16(%rax), %rbx 1036 | movq (%rbx), %rdi 1037 | movq 64(%rsp), %rax 1038 | call *%rdi 1039 | L256: 1040 | movq %rax, 56(%rsp) 1041 | movq 88(%rsp), %rax 1042 | movq 16(%rax), %rbx 1043 | movq (%rbx), %rdi 1044 | movq 72(%rsp), %rax 1045 | call *%rdi 1046 | L257: 1047 | movq %rax, 64(%rsp) 1048 | movq 88(%rsp), %rax 1049 | movq 16(%rax), %rbx 1050 | movq (%rbx), %rdi 1051 | movq 80(%rsp), %rax 1052 | call *%rdi 1053 | L258: 1054 | movq %rax, 72(%rsp) 1055 | movq 88(%rsp), %rax 1056 | movq 16(%rax), %rbx 1057 | movq (%rbx), %rdi 1058 | movq 96(%rsp), %rax 1059 | call *%rdi 1060 | L259: 1061 | movq %rax, %rbx 1062 | L289: 1063 | subq $264, %r15 1064 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1065 | cmpq (%rax), %r15 1066 | jb L290 1067 | leaq 8(%r15), %rax 1068 | movq $2048, -8(%rax) 1069 | movq (%rsp), %rdi 1070 | movq %rdi, (%rax) 1071 | movq $1, 8(%rax) 1072 | leaq 24(%rax), %rdi 1073 | movq $2048, -8(%rdi) 1074 | movq 8(%rsp), %rsi 1075 | movq %rsi, (%rdi) 1076 | movq %rax, 8(%rdi) 1077 | leaq 48(%rax), %rsi 1078 | movq $2048, -8(%rsi) 1079 | movq 16(%rsp), %rdx 1080 | movq %rdx, (%rsi) 1081 | movq %rdi, 8(%rsi) 1082 | leaq 72(%rax), %rdi 1083 | movq $2048, -8(%rdi) 1084 | movq 24(%rsp), %rdx 1085 | movq %rdx, (%rdi) 1086 | movq %rsi, 8(%rdi) 1087 | leaq 96(%rax), %rsi 1088 | movq $2048, -8(%rsi) 1089 | movq 32(%rsp), %rdx 1090 | movq %rdx, (%rsi) 1091 | movq %rdi, 8(%rsi) 1092 | leaq 120(%rax), %rdi 1093 | movq $2048, -8(%rdi) 1094 | movq 40(%rsp), %rdx 1095 | movq %rdx, (%rdi) 1096 | movq %rsi, 8(%rdi) 1097 | leaq 144(%rax), %rsi 1098 | movq $2048, -8(%rsi) 1099 | movq 48(%rsp), %rdx 1100 | movq %rdx, (%rsi) 1101 | movq %rdi, 8(%rsi) 1102 | leaq 168(%rax), %rdi 1103 | movq $2048, -8(%rdi) 1104 | movq 56(%rsp), %rdx 1105 | movq %rdx, (%rdi) 1106 | movq %rsi, 8(%rdi) 1107 | leaq 192(%rax), %rsi 1108 | movq $2048, -8(%rsi) 1109 | movq 64(%rsp), %rdx 1110 | movq %rdx, (%rsi) 1111 | movq %rdi, 8(%rsi) 1112 | leaq 216(%rax), %rdi 1113 | movq $2048, -8(%rdi) 1114 | movq 72(%rsp), %rdx 1115 | movq %rdx, (%rdi) 1116 | movq %rsi, 8(%rdi) 1117 | addq $240, %rax 1118 | movq $2048, -8(%rax) 1119 | movq %rbx, (%rax) 1120 | movq %rdi, 8(%rax) 1121 | addq $104, %rsp 1122 | .cfi_adjust_cfa_offset -104 1123 | ret 1124 | .cfi_adjust_cfa_offset 104 1125 | .align 2 1126 | L282: 1127 | movq %r9, 24(%rsp) 1128 | movq %r12, 32(%rsp) 1129 | movq %r13, 40(%rsp) 1130 | movq %r10, 48(%rsp) 1131 | movq %r11, 56(%rsp) 1132 | movq %rbp, 64(%rsp) 1133 | movq %rsi, 72(%rsp) 1134 | movq %rdi, 80(%rsp) 1135 | movq %rax, 96(%rsp) 1136 | movq 16(%rbx), %rbx 1137 | movq (%rbx), %rdi 1138 | movq %rcx, %rax 1139 | call *%rdi 1140 | L239: 1141 | movq %rax, (%rsp) 1142 | movq 88(%rsp), %rax 1143 | movq 16(%rax), %rbx 1144 | movq (%rbx), %rdi 1145 | movq 24(%rsp), %rax 1146 | call *%rdi 1147 | L240: 1148 | movq %rax, 8(%rsp) 1149 | movq 88(%rsp), %rax 1150 | movq 16(%rax), %rbx 1151 | movq (%rbx), %rdi 1152 | movq 32(%rsp), %rax 1153 | call *%rdi 1154 | L241: 1155 | movq %rax, 16(%rsp) 1156 | movq 88(%rsp), %rax 1157 | movq 16(%rax), %rbx 1158 | movq (%rbx), %rdi 1159 | movq 40(%rsp), %rax 1160 | call *%rdi 1161 | L242: 1162 | movq %rax, 24(%rsp) 1163 | movq 88(%rsp), %rax 1164 | movq 16(%rax), %rbx 1165 | movq (%rbx), %rdi 1166 | movq 48(%rsp), %rax 1167 | call *%rdi 1168 | L243: 1169 | movq %rax, 32(%rsp) 1170 | movq 88(%rsp), %rax 1171 | movq 16(%rax), %rbx 1172 | movq (%rbx), %rdi 1173 | movq 56(%rsp), %rax 1174 | call *%rdi 1175 | L244: 1176 | movq %rax, 40(%rsp) 1177 | movq 88(%rsp), %rax 1178 | movq 16(%rax), %rbx 1179 | movq (%rbx), %rdi 1180 | movq 64(%rsp), %rax 1181 | call *%rdi 1182 | L245: 1183 | movq %rax, 48(%rsp) 1184 | movq 88(%rsp), %rax 1185 | movq 16(%rax), %rbx 1186 | movq (%rbx), %rdi 1187 | movq 72(%rsp), %rax 1188 | call *%rdi 1189 | L246: 1190 | movq %rax, 56(%rsp) 1191 | movq 88(%rsp), %rax 1192 | movq 16(%rax), %rbx 1193 | movq (%rbx), %rdi 1194 | movq 80(%rsp), %rax 1195 | call *%rdi 1196 | L247: 1197 | movq %rax, 64(%rsp) 1198 | movq 88(%rsp), %rax 1199 | movq 16(%rax), %rbx 1200 | movq (%rbx), %rdi 1201 | movq 96(%rsp), %rax 1202 | call *%rdi 1203 | L248: 1204 | movq %rax, %rbx 1205 | L292: 1206 | subq $240, %r15 1207 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1208 | cmpq (%rax), %r15 1209 | jb L293 1210 | leaq 8(%r15), %rax 1211 | movq $2048, -8(%rax) 1212 | movq (%rsp), %rdi 1213 | movq %rdi, (%rax) 1214 | movq $1, 8(%rax) 1215 | leaq 24(%rax), %rdi 1216 | movq $2048, -8(%rdi) 1217 | movq 8(%rsp), %rsi 1218 | movq %rsi, (%rdi) 1219 | movq %rax, 8(%rdi) 1220 | leaq 48(%rax), %rsi 1221 | movq $2048, -8(%rsi) 1222 | movq 16(%rsp), %rdx 1223 | movq %rdx, (%rsi) 1224 | movq %rdi, 8(%rsi) 1225 | leaq 72(%rax), %rdi 1226 | movq $2048, -8(%rdi) 1227 | movq 24(%rsp), %rdx 1228 | movq %rdx, (%rdi) 1229 | movq %rsi, 8(%rdi) 1230 | leaq 96(%rax), %rsi 1231 | movq $2048, -8(%rsi) 1232 | movq 32(%rsp), %rdx 1233 | movq %rdx, (%rsi) 1234 | movq %rdi, 8(%rsi) 1235 | leaq 120(%rax), %rdi 1236 | movq $2048, -8(%rdi) 1237 | movq 40(%rsp), %rdx 1238 | movq %rdx, (%rdi) 1239 | movq %rsi, 8(%rdi) 1240 | leaq 144(%rax), %rsi 1241 | movq $2048, -8(%rsi) 1242 | movq 48(%rsp), %rdx 1243 | movq %rdx, (%rsi) 1244 | movq %rdi, 8(%rsi) 1245 | leaq 168(%rax), %rdi 1246 | movq $2048, -8(%rdi) 1247 | movq 56(%rsp), %rdx 1248 | movq %rdx, (%rdi) 1249 | movq %rsi, 8(%rdi) 1250 | leaq 192(%rax), %rsi 1251 | movq $2048, -8(%rsi) 1252 | movq 64(%rsp), %rdx 1253 | movq %rdx, (%rsi) 1254 | movq %rdi, 8(%rsi) 1255 | addq $216, %rax 1256 | movq $2048, -8(%rax) 1257 | movq %rbx, (%rax) 1258 | movq %rsi, 8(%rax) 1259 | addq $104, %rsp 1260 | .cfi_adjust_cfa_offset -104 1261 | ret 1262 | .cfi_adjust_cfa_offset 104 1263 | .align 2 1264 | L281: 1265 | movq %r12, 32(%rsp) 1266 | movq %r13, 40(%rsp) 1267 | movq %r10, 48(%rsp) 1268 | movq %r11, 56(%rsp) 1269 | movq %rbp, 64(%rsp) 1270 | movq %rsi, 72(%rsp) 1271 | movq %rdi, 80(%rsp) 1272 | movq %rax, 96(%rsp) 1273 | movq 16(%rbx), %rbx 1274 | movq (%rbx), %rdi 1275 | movq %r9, %rax 1276 | call *%rdi 1277 | L230: 1278 | movq %rax, (%rsp) 1279 | movq 88(%rsp), %rax 1280 | movq 16(%rax), %rbx 1281 | movq (%rbx), %rdi 1282 | movq 32(%rsp), %rax 1283 | call *%rdi 1284 | L231: 1285 | movq %rax, 8(%rsp) 1286 | movq 88(%rsp), %rax 1287 | movq 16(%rax), %rbx 1288 | movq (%rbx), %rdi 1289 | movq 40(%rsp), %rax 1290 | call *%rdi 1291 | L232: 1292 | movq %rax, 16(%rsp) 1293 | movq 88(%rsp), %rax 1294 | movq 16(%rax), %rbx 1295 | movq (%rbx), %rdi 1296 | movq 48(%rsp), %rax 1297 | call *%rdi 1298 | L233: 1299 | movq %rax, 24(%rsp) 1300 | movq 88(%rsp), %rax 1301 | movq 16(%rax), %rbx 1302 | movq (%rbx), %rdi 1303 | movq 56(%rsp), %rax 1304 | call *%rdi 1305 | L234: 1306 | movq %rax, 32(%rsp) 1307 | movq 88(%rsp), %rax 1308 | movq 16(%rax), %rbx 1309 | movq (%rbx), %rdi 1310 | movq 64(%rsp), %rax 1311 | call *%rdi 1312 | L235: 1313 | movq %rax, 40(%rsp) 1314 | movq 88(%rsp), %rax 1315 | movq 16(%rax), %rbx 1316 | movq (%rbx), %rdi 1317 | movq 72(%rsp), %rax 1318 | call *%rdi 1319 | L236: 1320 | movq %rax, 48(%rsp) 1321 | movq 88(%rsp), %rax 1322 | movq 16(%rax), %rbx 1323 | movq (%rbx), %rdi 1324 | movq 80(%rsp), %rax 1325 | call *%rdi 1326 | L237: 1327 | movq %rax, 56(%rsp) 1328 | movq 88(%rsp), %rax 1329 | movq 16(%rax), %rbx 1330 | movq (%rbx), %rdi 1331 | movq 96(%rsp), %rax 1332 | call *%rdi 1333 | L238: 1334 | movq %rax, %rbx 1335 | L295: 1336 | subq $216, %r15 1337 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1338 | cmpq (%rax), %r15 1339 | jb L296 1340 | leaq 8(%r15), %rax 1341 | movq $2048, -8(%rax) 1342 | movq (%rsp), %rdi 1343 | movq %rdi, (%rax) 1344 | movq $1, 8(%rax) 1345 | leaq 24(%rax), %rdi 1346 | movq $2048, -8(%rdi) 1347 | movq 8(%rsp), %rsi 1348 | movq %rsi, (%rdi) 1349 | movq %rax, 8(%rdi) 1350 | leaq 48(%rax), %rsi 1351 | movq $2048, -8(%rsi) 1352 | movq 16(%rsp), %rdx 1353 | movq %rdx, (%rsi) 1354 | movq %rdi, 8(%rsi) 1355 | leaq 72(%rax), %rdi 1356 | movq $2048, -8(%rdi) 1357 | movq 24(%rsp), %rdx 1358 | movq %rdx, (%rdi) 1359 | movq %rsi, 8(%rdi) 1360 | leaq 96(%rax), %rsi 1361 | movq $2048, -8(%rsi) 1362 | movq 32(%rsp), %rdx 1363 | movq %rdx, (%rsi) 1364 | movq %rdi, 8(%rsi) 1365 | leaq 120(%rax), %rdi 1366 | movq $2048, -8(%rdi) 1367 | movq 40(%rsp), %rdx 1368 | movq %rdx, (%rdi) 1369 | movq %rsi, 8(%rdi) 1370 | leaq 144(%rax), %rsi 1371 | movq $2048, -8(%rsi) 1372 | movq 48(%rsp), %rdx 1373 | movq %rdx, (%rsi) 1374 | movq %rdi, 8(%rsi) 1375 | leaq 168(%rax), %rdi 1376 | movq $2048, -8(%rdi) 1377 | movq 56(%rsp), %rdx 1378 | movq %rdx, (%rdi) 1379 | movq %rsi, 8(%rdi) 1380 | addq $192, %rax 1381 | movq $2048, -8(%rax) 1382 | movq %rbx, (%rax) 1383 | movq %rdi, 8(%rax) 1384 | addq $104, %rsp 1385 | .cfi_adjust_cfa_offset -104 1386 | ret 1387 | .cfi_adjust_cfa_offset 104 1388 | .align 2 1389 | L280: 1390 | movq %r13, 40(%rsp) 1391 | movq %r10, 48(%rsp) 1392 | movq %r11, 56(%rsp) 1393 | movq %rbp, 64(%rsp) 1394 | movq %rsi, 72(%rsp) 1395 | movq %rdi, 80(%rsp) 1396 | movq %rax, 96(%rsp) 1397 | movq 16(%rbx), %rbx 1398 | movq (%rbx), %rdi 1399 | movq %r12, %rax 1400 | call *%rdi 1401 | L222: 1402 | movq %rax, (%rsp) 1403 | movq 88(%rsp), %rax 1404 | movq 16(%rax), %rbx 1405 | movq (%rbx), %rdi 1406 | movq 40(%rsp), %rax 1407 | call *%rdi 1408 | L223: 1409 | movq %rax, 8(%rsp) 1410 | movq 88(%rsp), %rax 1411 | movq 16(%rax), %rbx 1412 | movq (%rbx), %rdi 1413 | movq 48(%rsp), %rax 1414 | call *%rdi 1415 | L224: 1416 | movq %rax, 16(%rsp) 1417 | movq 88(%rsp), %rax 1418 | movq 16(%rax), %rbx 1419 | movq (%rbx), %rdi 1420 | movq 56(%rsp), %rax 1421 | call *%rdi 1422 | L225: 1423 | movq %rax, 24(%rsp) 1424 | movq 88(%rsp), %rax 1425 | movq 16(%rax), %rbx 1426 | movq (%rbx), %rdi 1427 | movq 64(%rsp), %rax 1428 | call *%rdi 1429 | L226: 1430 | movq %rax, 32(%rsp) 1431 | movq 88(%rsp), %rax 1432 | movq 16(%rax), %rbx 1433 | movq (%rbx), %rdi 1434 | movq 72(%rsp), %rax 1435 | call *%rdi 1436 | L227: 1437 | movq %rax, 40(%rsp) 1438 | movq 88(%rsp), %rax 1439 | movq 16(%rax), %rbx 1440 | movq (%rbx), %rdi 1441 | movq 80(%rsp), %rax 1442 | call *%rdi 1443 | L228: 1444 | movq %rax, 48(%rsp) 1445 | movq 88(%rsp), %rax 1446 | movq 16(%rax), %rbx 1447 | movq (%rbx), %rdi 1448 | movq 96(%rsp), %rax 1449 | call *%rdi 1450 | L229: 1451 | movq %rax, %rbx 1452 | L298: 1453 | subq $192, %r15 1454 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1455 | cmpq (%rax), %r15 1456 | jb L299 1457 | leaq 8(%r15), %rax 1458 | movq $2048, -8(%rax) 1459 | movq (%rsp), %rdi 1460 | movq %rdi, (%rax) 1461 | movq $1, 8(%rax) 1462 | leaq 24(%rax), %rdi 1463 | movq $2048, -8(%rdi) 1464 | movq 8(%rsp), %rsi 1465 | movq %rsi, (%rdi) 1466 | movq %rax, 8(%rdi) 1467 | leaq 48(%rax), %rsi 1468 | movq $2048, -8(%rsi) 1469 | movq 16(%rsp), %rdx 1470 | movq %rdx, (%rsi) 1471 | movq %rdi, 8(%rsi) 1472 | leaq 72(%rax), %rdi 1473 | movq $2048, -8(%rdi) 1474 | movq 24(%rsp), %rdx 1475 | movq %rdx, (%rdi) 1476 | movq %rsi, 8(%rdi) 1477 | leaq 96(%rax), %rsi 1478 | movq $2048, -8(%rsi) 1479 | movq 32(%rsp), %rdx 1480 | movq %rdx, (%rsi) 1481 | movq %rdi, 8(%rsi) 1482 | leaq 120(%rax), %rdi 1483 | movq $2048, -8(%rdi) 1484 | movq 40(%rsp), %rdx 1485 | movq %rdx, (%rdi) 1486 | movq %rsi, 8(%rdi) 1487 | leaq 144(%rax), %rsi 1488 | movq $2048, -8(%rsi) 1489 | movq 48(%rsp), %rdx 1490 | movq %rdx, (%rsi) 1491 | movq %rdi, 8(%rsi) 1492 | addq $168, %rax 1493 | movq $2048, -8(%rax) 1494 | movq %rbx, (%rax) 1495 | movq %rsi, 8(%rax) 1496 | addq $104, %rsp 1497 | .cfi_adjust_cfa_offset -104 1498 | ret 1499 | .cfi_adjust_cfa_offset 104 1500 | .align 2 1501 | L279: 1502 | movq %r10, 48(%rsp) 1503 | movq %r11, 56(%rsp) 1504 | movq %rbp, 64(%rsp) 1505 | movq %rsi, 72(%rsp) 1506 | movq %rdi, 80(%rsp) 1507 | movq %rax, 96(%rsp) 1508 | movq 16(%rbx), %rbx 1509 | movq (%rbx), %rdi 1510 | movq %r13, %rax 1511 | call *%rdi 1512 | L215: 1513 | movq %rax, (%rsp) 1514 | movq 88(%rsp), %rax 1515 | movq 16(%rax), %rbx 1516 | movq (%rbx), %rdi 1517 | movq 48(%rsp), %rax 1518 | call *%rdi 1519 | L216: 1520 | movq %rax, 8(%rsp) 1521 | movq 88(%rsp), %rax 1522 | movq 16(%rax), %rbx 1523 | movq (%rbx), %rdi 1524 | movq 56(%rsp), %rax 1525 | call *%rdi 1526 | L217: 1527 | movq %rax, 16(%rsp) 1528 | movq 88(%rsp), %rax 1529 | movq 16(%rax), %rbx 1530 | movq (%rbx), %rdi 1531 | movq 64(%rsp), %rax 1532 | call *%rdi 1533 | L218: 1534 | movq %rax, 24(%rsp) 1535 | movq 88(%rsp), %rax 1536 | movq 16(%rax), %rbx 1537 | movq (%rbx), %rdi 1538 | movq 72(%rsp), %rax 1539 | call *%rdi 1540 | L219: 1541 | movq %rax, 32(%rsp) 1542 | movq 88(%rsp), %rax 1543 | movq 16(%rax), %rbx 1544 | movq (%rbx), %rdi 1545 | movq 80(%rsp), %rax 1546 | call *%rdi 1547 | L220: 1548 | movq %rax, 40(%rsp) 1549 | movq 88(%rsp), %rax 1550 | movq 16(%rax), %rbx 1551 | movq (%rbx), %rdi 1552 | movq 96(%rsp), %rax 1553 | call *%rdi 1554 | L221: 1555 | movq %rax, %rbx 1556 | L301: 1557 | subq $168, %r15 1558 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1559 | cmpq (%rax), %r15 1560 | jb L302 1561 | leaq 8(%r15), %rax 1562 | movq $2048, -8(%rax) 1563 | movq (%rsp), %rdi 1564 | movq %rdi, (%rax) 1565 | movq $1, 8(%rax) 1566 | leaq 24(%rax), %rdi 1567 | movq $2048, -8(%rdi) 1568 | movq 8(%rsp), %rsi 1569 | movq %rsi, (%rdi) 1570 | movq %rax, 8(%rdi) 1571 | leaq 48(%rax), %rsi 1572 | movq $2048, -8(%rsi) 1573 | movq 16(%rsp), %rdx 1574 | movq %rdx, (%rsi) 1575 | movq %rdi, 8(%rsi) 1576 | leaq 72(%rax), %rdi 1577 | movq $2048, -8(%rdi) 1578 | movq 24(%rsp), %rdx 1579 | movq %rdx, (%rdi) 1580 | movq %rsi, 8(%rdi) 1581 | leaq 96(%rax), %rsi 1582 | movq $2048, -8(%rsi) 1583 | movq 32(%rsp), %rdx 1584 | movq %rdx, (%rsi) 1585 | movq %rdi, 8(%rsi) 1586 | leaq 120(%rax), %rdi 1587 | movq $2048, -8(%rdi) 1588 | movq 40(%rsp), %rdx 1589 | movq %rdx, (%rdi) 1590 | movq %rsi, 8(%rdi) 1591 | addq $144, %rax 1592 | movq $2048, -8(%rax) 1593 | movq %rbx, (%rax) 1594 | movq %rdi, 8(%rax) 1595 | addq $104, %rsp 1596 | .cfi_adjust_cfa_offset -104 1597 | ret 1598 | .cfi_adjust_cfa_offset 104 1599 | .align 2 1600 | L278: 1601 | movq %r11, 56(%rsp) 1602 | movq %rbp, 64(%rsp) 1603 | movq %rsi, 72(%rsp) 1604 | movq %rdi, 80(%rsp) 1605 | movq %rax, 96(%rsp) 1606 | movq 16(%rbx), %rbx 1607 | movq (%rbx), %rdi 1608 | movq %r10, %rax 1609 | call *%rdi 1610 | L209: 1611 | movq %rax, (%rsp) 1612 | movq 88(%rsp), %rax 1613 | movq 16(%rax), %rbx 1614 | movq (%rbx), %rdi 1615 | movq 56(%rsp), %rax 1616 | call *%rdi 1617 | L210: 1618 | movq %rax, 8(%rsp) 1619 | movq 88(%rsp), %rax 1620 | movq 16(%rax), %rbx 1621 | movq (%rbx), %rdi 1622 | movq 64(%rsp), %rax 1623 | call *%rdi 1624 | L211: 1625 | movq %rax, 16(%rsp) 1626 | movq 88(%rsp), %rax 1627 | movq 16(%rax), %rbx 1628 | movq (%rbx), %rdi 1629 | movq 72(%rsp), %rax 1630 | call *%rdi 1631 | L212: 1632 | movq %rax, 24(%rsp) 1633 | movq 88(%rsp), %rax 1634 | movq 16(%rax), %rbx 1635 | movq (%rbx), %rdi 1636 | movq 80(%rsp), %rax 1637 | call *%rdi 1638 | L213: 1639 | movq %rax, 32(%rsp) 1640 | movq 88(%rsp), %rax 1641 | movq 16(%rax), %rbx 1642 | movq (%rbx), %rdi 1643 | movq 96(%rsp), %rax 1644 | call *%rdi 1645 | L214: 1646 | movq %rax, %rbx 1647 | L304: 1648 | subq $144, %r15 1649 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1650 | cmpq (%rax), %r15 1651 | jb L305 1652 | leaq 8(%r15), %rax 1653 | movq $2048, -8(%rax) 1654 | movq (%rsp), %rdi 1655 | movq %rdi, (%rax) 1656 | movq $1, 8(%rax) 1657 | leaq 24(%rax), %rdi 1658 | movq $2048, -8(%rdi) 1659 | movq 8(%rsp), %rsi 1660 | movq %rsi, (%rdi) 1661 | movq %rax, 8(%rdi) 1662 | leaq 48(%rax), %rsi 1663 | movq $2048, -8(%rsi) 1664 | movq 16(%rsp), %rdx 1665 | movq %rdx, (%rsi) 1666 | movq %rdi, 8(%rsi) 1667 | leaq 72(%rax), %rdi 1668 | movq $2048, -8(%rdi) 1669 | movq 24(%rsp), %rdx 1670 | movq %rdx, (%rdi) 1671 | movq %rsi, 8(%rdi) 1672 | leaq 96(%rax), %rsi 1673 | movq $2048, -8(%rsi) 1674 | movq 32(%rsp), %rdx 1675 | movq %rdx, (%rsi) 1676 | movq %rdi, 8(%rsi) 1677 | addq $120, %rax 1678 | movq $2048, -8(%rax) 1679 | movq %rbx, (%rax) 1680 | movq %rsi, 8(%rax) 1681 | addq $104, %rsp 1682 | .cfi_adjust_cfa_offset -104 1683 | ret 1684 | .cfi_adjust_cfa_offset 104 1685 | .align 2 1686 | L277: 1687 | movq %rbp, 64(%rsp) 1688 | movq %rsi, 72(%rsp) 1689 | movq %rdi, 80(%rsp) 1690 | movq %rax, 96(%rsp) 1691 | movq 16(%rbx), %rbx 1692 | movq (%rbx), %rdi 1693 | movq %r11, %rax 1694 | call *%rdi 1695 | L204: 1696 | movq %rax, (%rsp) 1697 | movq 88(%rsp), %rax 1698 | movq 16(%rax), %rbx 1699 | movq (%rbx), %rdi 1700 | movq 64(%rsp), %rax 1701 | call *%rdi 1702 | L205: 1703 | movq %rax, 8(%rsp) 1704 | movq 88(%rsp), %rax 1705 | movq 16(%rax), %rbx 1706 | movq (%rbx), %rdi 1707 | movq 72(%rsp), %rax 1708 | call *%rdi 1709 | L206: 1710 | movq %rax, 16(%rsp) 1711 | movq 88(%rsp), %rax 1712 | movq 16(%rax), %rbx 1713 | movq (%rbx), %rdi 1714 | movq 80(%rsp), %rax 1715 | call *%rdi 1716 | L207: 1717 | movq %rax, 24(%rsp) 1718 | movq 88(%rsp), %rax 1719 | movq 16(%rax), %rbx 1720 | movq (%rbx), %rdi 1721 | movq 96(%rsp), %rax 1722 | call *%rdi 1723 | L208: 1724 | movq %rax, %rbx 1725 | L307: 1726 | subq $120, %r15 1727 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1728 | cmpq (%rax), %r15 1729 | jb L308 1730 | leaq 8(%r15), %rax 1731 | movq $2048, -8(%rax) 1732 | movq (%rsp), %rdi 1733 | movq %rdi, (%rax) 1734 | movq $1, 8(%rax) 1735 | leaq 24(%rax), %rdi 1736 | movq $2048, -8(%rdi) 1737 | movq 8(%rsp), %rsi 1738 | movq %rsi, (%rdi) 1739 | movq %rax, 8(%rdi) 1740 | leaq 48(%rax), %rsi 1741 | movq $2048, -8(%rsi) 1742 | movq 16(%rsp), %rdx 1743 | movq %rdx, (%rsi) 1744 | movq %rdi, 8(%rsi) 1745 | leaq 72(%rax), %rdi 1746 | movq $2048, -8(%rdi) 1747 | movq 24(%rsp), %rdx 1748 | movq %rdx, (%rdi) 1749 | movq %rsi, 8(%rdi) 1750 | addq $96, %rax 1751 | movq $2048, -8(%rax) 1752 | movq %rbx, (%rax) 1753 | movq %rdi, 8(%rax) 1754 | addq $104, %rsp 1755 | .cfi_adjust_cfa_offset -104 1756 | ret 1757 | .cfi_adjust_cfa_offset 104 1758 | .align 2 1759 | L276: 1760 | movq %rsi, 72(%rsp) 1761 | movq %rdi, 80(%rsp) 1762 | movq %rax, 96(%rsp) 1763 | movq 16(%rbx), %rbx 1764 | movq (%rbx), %rdi 1765 | movq %rbp, %rax 1766 | call *%rdi 1767 | L200: 1768 | movq %rax, (%rsp) 1769 | movq 88(%rsp), %rax 1770 | movq 16(%rax), %rbx 1771 | movq (%rbx), %rdi 1772 | movq 72(%rsp), %rax 1773 | call *%rdi 1774 | L201: 1775 | movq %rax, 8(%rsp) 1776 | movq 88(%rsp), %rax 1777 | movq 16(%rax), %rbx 1778 | movq (%rbx), %rdi 1779 | movq 80(%rsp), %rax 1780 | call *%rdi 1781 | L202: 1782 | movq %rax, 16(%rsp) 1783 | movq 88(%rsp), %rax 1784 | movq 16(%rax), %rbx 1785 | movq (%rbx), %rdi 1786 | movq 96(%rsp), %rax 1787 | call *%rdi 1788 | L203: 1789 | movq %rax, %rbx 1790 | L310: 1791 | subq $96, %r15 1792 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1793 | cmpq (%rax), %r15 1794 | jb L311 1795 | leaq 8(%r15), %rax 1796 | movq $2048, -8(%rax) 1797 | movq (%rsp), %rdi 1798 | movq %rdi, (%rax) 1799 | movq $1, 8(%rax) 1800 | leaq 24(%rax), %rdi 1801 | movq $2048, -8(%rdi) 1802 | movq 8(%rsp), %rsi 1803 | movq %rsi, (%rdi) 1804 | movq %rax, 8(%rdi) 1805 | leaq 48(%rax), %rsi 1806 | movq $2048, -8(%rsi) 1807 | movq 16(%rsp), %rdx 1808 | movq %rdx, (%rsi) 1809 | movq %rdi, 8(%rsi) 1810 | addq $72, %rax 1811 | movq $2048, -8(%rax) 1812 | movq %rbx, (%rax) 1813 | movq %rsi, 8(%rax) 1814 | addq $104, %rsp 1815 | .cfi_adjust_cfa_offset -104 1816 | ret 1817 | .cfi_adjust_cfa_offset 104 1818 | .align 2 1819 | L275: 1820 | movq %rdi, 80(%rsp) 1821 | movq %rax, 96(%rsp) 1822 | movq 16(%rbx), %rbx 1823 | movq (%rbx), %rdi 1824 | movq %rsi, %rax 1825 | call *%rdi 1826 | L197: 1827 | movq %rax, (%rsp) 1828 | movq 88(%rsp), %rax 1829 | movq 16(%rax), %rbx 1830 | movq (%rbx), %rdi 1831 | movq 80(%rsp), %rax 1832 | call *%rdi 1833 | L198: 1834 | movq %rax, 8(%rsp) 1835 | movq 88(%rsp), %rax 1836 | movq 16(%rax), %rbx 1837 | movq (%rbx), %rdi 1838 | movq 96(%rsp), %rax 1839 | call *%rdi 1840 | L199: 1841 | movq %rax, %rbx 1842 | L313: 1843 | subq $72, %r15 1844 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1845 | cmpq (%rax), %r15 1846 | jb L314 1847 | leaq 8(%r15), %rax 1848 | movq $2048, -8(%rax) 1849 | movq (%rsp), %rdi 1850 | movq %rdi, (%rax) 1851 | movq $1, 8(%rax) 1852 | leaq 24(%rax), %rdi 1853 | movq $2048, -8(%rdi) 1854 | movq 8(%rsp), %rsi 1855 | movq %rsi, (%rdi) 1856 | movq %rax, 8(%rdi) 1857 | addq $48, %rax 1858 | movq $2048, -8(%rax) 1859 | movq %rbx, (%rax) 1860 | movq %rdi, 8(%rax) 1861 | addq $104, %rsp 1862 | .cfi_adjust_cfa_offset -104 1863 | ret 1864 | .cfi_adjust_cfa_offset 104 1865 | .align 2 1866 | L274: 1867 | movq %rax, 96(%rsp) 1868 | movq 16(%rbx), %rbx 1869 | movq (%rbx), %rsi 1870 | movq %rdi, %rax 1871 | call *%rsi 1872 | L195: 1873 | movq %rax, (%rsp) 1874 | movq 88(%rsp), %rax 1875 | movq 16(%rax), %rbx 1876 | movq (%rbx), %rdi 1877 | movq 96(%rsp), %rax 1878 | call *%rdi 1879 | L196: 1880 | movq %rax, %rbx 1881 | L316: 1882 | subq $48, %r15 1883 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1884 | cmpq (%rax), %r15 1885 | jb L317 1886 | leaq 8(%r15), %rax 1887 | movq $2048, -8(%rax) 1888 | movq (%rsp), %rdi 1889 | movq %rdi, (%rax) 1890 | movq $1, 8(%rax) 1891 | leaq 24(%rax), %rdi 1892 | movq $2048, -8(%rdi) 1893 | movq %rbx, (%rdi) 1894 | movq %rax, 8(%rdi) 1895 | movq %rdi, %rax 1896 | addq $104, %rsp 1897 | .cfi_adjust_cfa_offset -104 1898 | ret 1899 | .cfi_adjust_cfa_offset 104 1900 | .align 2 1901 | L273: 1902 | movq 16(%rbx), %rbx 1903 | movq (%rbx), %rdi 1904 | call *%rdi 1905 | L194: 1906 | movq %rax, %rbx 1907 | L319: 1908 | subq $24, %r15 1909 | movq _caml_young_limit@GOTPCREL(%rip), %rax 1910 | cmpq (%rax), %r15 1911 | jb L320 1912 | leaq 8(%r15), %rax 1913 | movq $2048, -8(%rax) 1914 | movq %rbx, (%rax) 1915 | movq $1, 8(%rax) 1916 | addq $104, %rsp 1917 | .cfi_adjust_cfa_offset -104 1918 | ret 1919 | .cfi_adjust_cfa_offset 104 1920 | .align 2 1921 | L272: 1922 | movq $1, %rax 1923 | addq $104, %rsp 1924 | .cfi_adjust_cfa_offset -104 1925 | ret 1926 | .cfi_adjust_cfa_offset 104 1927 | L320: 1928 | call _caml_call_gc 1929 | L321: 1930 | jmp L319 1931 | L317: 1932 | call _caml_call_gc 1933 | L318: 1934 | jmp L316 1935 | L314: 1936 | call _caml_call_gc 1937 | L315: 1938 | jmp L313 1939 | L311: 1940 | call _caml_call_gc 1941 | L312: 1942 | jmp L310 1943 | L308: 1944 | call _caml_call_gc 1945 | L309: 1946 | jmp L307 1947 | L305: 1948 | call _caml_call_gc 1949 | L306: 1950 | jmp L304 1951 | L302: 1952 | call _caml_call_gc 1953 | L303: 1954 | jmp L301 1955 | L299: 1956 | call _caml_call_gc 1957 | L300: 1958 | jmp L298 1959 | L296: 1960 | call _caml_call_gc 1961 | L297: 1962 | jmp L295 1963 | L293: 1964 | call _caml_call_gc 1965 | L294: 1966 | jmp L292 1967 | L290: 1968 | call _caml_call_gc 1969 | L291: 1970 | jmp L289 1971 | L287: 1972 | call _caml_call_gc 1973 | L288: 1974 | jmp L286 1975 | .cfi_adjust_cfa_offset -104 1976 | .cfi_endproc 1977 | .text 1978 | .align 4 1979 | .globl _camlFaster_map__map_tail_chunk_666 1980 | _camlFaster_map__map_tail_chunk_666: 1981 | .cfi_startproc 1982 | subq $120, %rsp 1983 | .cfi_adjust_cfa_offset 120 1984 | L335: 1985 | cmpq $1, %rbx 1986 | je L334 1987 | movq 8(%rbx), %rsi 1988 | cmpq $1, %rsi 1989 | je L334 1990 | movq 8(%rsi), %rdx 1991 | cmpq $1, %rdx 1992 | je L334 1993 | movq 8(%rdx), %rcx 1994 | cmpq $1, %rcx 1995 | je L334 1996 | movq 8(%rcx), %r8 1997 | cmpq $1, %r8 1998 | je L334 1999 | movq 8(%r8), %r9 2000 | cmpq $1, %r9 2001 | je L334 2002 | movq 8(%r9), %r12 2003 | cmpq $1, %r12 2004 | je L334 2005 | movq 8(%r12), %r13 2006 | cmpq $1, %r13 2007 | je L334 2008 | movq 8(%r13), %r10 2009 | cmpq $1, %r10 2010 | je L334 2011 | movq 8(%r10), %r11 2012 | cmpq $1, %r11 2013 | je L334 2014 | movq 8(%r11), %rbp 2015 | cmpq $1, %rbp 2016 | je L334 2017 | movq %rax, 104(%rsp) 2018 | movq 8(%rbp), %rax 2019 | cmpq $1, %rax 2020 | je L334 2021 | movq %rbp, (%rsp) 2022 | movq %r11, 8(%rsp) 2023 | movq %r10, 16(%rsp) 2024 | movq %r13, 24(%rsp) 2025 | movq %r12, 32(%rsp) 2026 | movq %r9, 40(%rsp) 2027 | movq %r8, 48(%rsp) 2028 | movq %rcx, 56(%rsp) 2029 | movq %rdx, 64(%rsp) 2030 | movq %rsi, 72(%rsp) 2031 | movq %rdi, 80(%rsp) 2032 | movq %rbx, 88(%rsp) 2033 | movq 24(%rdi), %rbx 2034 | movq (%rax), %rax 2035 | movq (%rbx), %rdi 2036 | call *%rdi 2037 | L322: 2038 | movq %rax, 96(%rsp) 2039 | movq 80(%rsp), %rax 2040 | movq 24(%rax), %rbx 2041 | movq (%rsp), %rax 2042 | movq (%rax), %rax 2043 | movq (%rbx), %rdi 2044 | call *%rdi 2045 | L323: 2046 | movq %rax, (%rsp) 2047 | movq 80(%rsp), %rax 2048 | movq 24(%rax), %rbx 2049 | movq 8(%rsp), %rax 2050 | movq (%rax), %rax 2051 | movq (%rbx), %rdi 2052 | call *%rdi 2053 | L324: 2054 | movq %rax, 8(%rsp) 2055 | movq 80(%rsp), %rax 2056 | movq 24(%rax), %rbx 2057 | movq 16(%rsp), %rax 2058 | movq (%rax), %rax 2059 | movq (%rbx), %rdi 2060 | call *%rdi 2061 | L325: 2062 | movq %rax, 16(%rsp) 2063 | movq 80(%rsp), %rax 2064 | movq 24(%rax), %rbx 2065 | movq 24(%rsp), %rax 2066 | movq (%rax), %rax 2067 | movq (%rbx), %rdi 2068 | call *%rdi 2069 | L326: 2070 | movq %rax, 24(%rsp) 2071 | movq 80(%rsp), %rax 2072 | movq 24(%rax), %rbx 2073 | movq 32(%rsp), %rax 2074 | movq (%rax), %rax 2075 | movq (%rbx), %rdi 2076 | call *%rdi 2077 | L327: 2078 | movq %rax, 32(%rsp) 2079 | movq 80(%rsp), %rax 2080 | movq 24(%rax), %rbx 2081 | movq 40(%rsp), %rax 2082 | movq (%rax), %rax 2083 | movq (%rbx), %rdi 2084 | call *%rdi 2085 | L328: 2086 | movq %rax, 40(%rsp) 2087 | movq 80(%rsp), %rax 2088 | movq 24(%rax), %rbx 2089 | movq 48(%rsp), %rax 2090 | movq (%rax), %rax 2091 | movq (%rbx), %rdi 2092 | call *%rdi 2093 | L329: 2094 | movq %rax, 48(%rsp) 2095 | movq 80(%rsp), %rax 2096 | movq 24(%rax), %rbx 2097 | movq 56(%rsp), %rax 2098 | movq (%rax), %rax 2099 | movq (%rbx), %rdi 2100 | call *%rdi 2101 | L330: 2102 | movq %rax, 56(%rsp) 2103 | movq 80(%rsp), %rax 2104 | movq 24(%rax), %rbx 2105 | movq 64(%rsp), %rax 2106 | movq (%rax), %rax 2107 | movq (%rbx), %rdi 2108 | call *%rdi 2109 | L331: 2110 | movq %rax, 64(%rsp) 2111 | movq 80(%rsp), %rax 2112 | movq 24(%rax), %rbx 2113 | movq 72(%rsp), %rax 2114 | movq (%rax), %rax 2115 | movq (%rbx), %rdi 2116 | call *%rdi 2117 | L332: 2118 | movq %rax, 72(%rsp) 2119 | movq 80(%rsp), %rax 2120 | movq 24(%rax), %rbx 2121 | movq 88(%rsp), %rax 2122 | movq (%rax), %rax 2123 | movq (%rbx), %rdi 2124 | call *%rdi 2125 | L333: 2126 | movq %rax, %rbx 2127 | L336: 2128 | subq $288, %r15 2129 | movq _caml_young_limit@GOTPCREL(%rip), %rax 2130 | cmpq (%rax), %r15 2131 | jb L337 2132 | leaq 8(%r15), %rax 2133 | movq $2048, -8(%rax) 2134 | movq 96(%rsp), %rdi 2135 | movq %rdi, (%rax) 2136 | movq 104(%rsp), %rdi 2137 | movq %rdi, 8(%rax) 2138 | leaq 24(%rax), %rdi 2139 | movq $2048, -8(%rdi) 2140 | movq (%rsp), %rsi 2141 | movq %rsi, (%rdi) 2142 | movq %rax, 8(%rdi) 2143 | leaq 48(%rax), %rsi 2144 | movq $2048, -8(%rsi) 2145 | movq 8(%rsp), %rdx 2146 | movq %rdx, (%rsi) 2147 | movq %rdi, 8(%rsi) 2148 | leaq 72(%rax), %rdi 2149 | movq $2048, -8(%rdi) 2150 | movq 16(%rsp), %rdx 2151 | movq %rdx, (%rdi) 2152 | movq %rsi, 8(%rdi) 2153 | leaq 96(%rax), %rsi 2154 | movq $2048, -8(%rsi) 2155 | movq 24(%rsp), %rdx 2156 | movq %rdx, (%rsi) 2157 | movq %rdi, 8(%rsi) 2158 | leaq 120(%rax), %rdi 2159 | movq $2048, -8(%rdi) 2160 | movq 32(%rsp), %rdx 2161 | movq %rdx, (%rdi) 2162 | movq %rsi, 8(%rdi) 2163 | leaq 144(%rax), %rsi 2164 | movq $2048, -8(%rsi) 2165 | movq 40(%rsp), %rdx 2166 | movq %rdx, (%rsi) 2167 | movq %rdi, 8(%rsi) 2168 | leaq 168(%rax), %rdi 2169 | movq $2048, -8(%rdi) 2170 | movq 48(%rsp), %rdx 2171 | movq %rdx, (%rdi) 2172 | movq %rsi, 8(%rdi) 2173 | leaq 192(%rax), %rsi 2174 | movq $2048, -8(%rsi) 2175 | movq 56(%rsp), %rdx 2176 | movq %rdx, (%rsi) 2177 | movq %rdi, 8(%rsi) 2178 | leaq 216(%rax), %rdi 2179 | movq $2048, -8(%rdi) 2180 | movq 64(%rsp), %rdx 2181 | movq %rdx, (%rdi) 2182 | movq %rsi, 8(%rdi) 2183 | leaq 240(%rax), %rsi 2184 | movq $2048, -8(%rsi) 2185 | movq 72(%rsp), %rdx 2186 | movq %rdx, (%rsi) 2187 | movq %rdi, 8(%rsi) 2188 | addq $264, %rax 2189 | movq $2048, -8(%rax) 2190 | movq %rbx, (%rax) 2191 | movq %rsi, 8(%rax) 2192 | addq $120, %rsp 2193 | .cfi_adjust_cfa_offset -120 2194 | ret 2195 | .cfi_adjust_cfa_offset 120 2196 | .align 2 2197 | L334: 2198 | movq _camlFaster_map__Pmakeblock_831@GOTPCREL(%rip), %rax 2199 | movq %r14, %rsp 2200 | popq %r14 2201 | ret 2202 | L337: 2203 | call _caml_call_gc 2204 | L338: 2205 | jmp L336 2206 | .cfi_adjust_cfa_offset -120 2207 | .cfi_endproc 2208 | .text 2209 | .align 4 2210 | .globl _camlFaster_map__map_all_tail_chunks_787 2211 | _camlFaster_map__map_all_tail_chunks_787: 2212 | .cfi_startproc 2213 | subq $24, %rsp 2214 | .cfi_adjust_cfa_offset 24 2215 | L342: 2216 | cmpq $1, %rbx 2217 | je L341 2218 | movq %rdi, 8(%rsp) 2219 | movq 8(%rbx), %rsi 2220 | movq %rsi, (%rsp) 2221 | movq (%rbx), %rbx 2222 | movq 24(%rdi), %rdi 2223 | call _camlFaster_map__map_tail_chunk_666 2224 | L339: 2225 | movq (%rsp), %rbx 2226 | movq 8(%rsp), %rdi 2227 | jmp L342 2228 | .align 2 2229 | L341: 2230 | addq $24, %rsp 2231 | .cfi_adjust_cfa_offset -24 2232 | ret 2233 | .cfi_adjust_cfa_offset 24 2234 | .cfi_adjust_cfa_offset -24 2235 | .cfi_endproc 2236 | .text 2237 | .align 4 2238 | .globl _camlFaster_map__faster_map_815 2239 | _camlFaster_map__faster_map_815: 2240 | .cfi_startproc 2241 | L344: 2242 | movq %rax, %rdi 2243 | movq %rbx, %rsi 2244 | movq $2001, %rbx 2245 | movq _camlFaster_map__chunked_tail_recursive_map_12_216_closure@GOTPCREL(%rip), %rax 2246 | jmp _camlFaster_map__plain_unrolled_prefix_5_109 2247 | .cfi_endproc 2248 | .data 2249 | .quad 4087 2250 | .globl _camlFaster_map__split_1278_829 2251 | _camlFaster_map__split_1278_829: 2252 | .globl _camlFaster_map__split_221_closure 2253 | _camlFaster_map__split_221_closure: 2254 | .quad _caml_curry2 2255 | .quad 5 2256 | .quad _camlFaster_map__split_221 2257 | .data 2258 | .quad 4087 2259 | .globl _camlFaster_map__plain_unrolled_prefix_5_1238_827 2260 | _camlFaster_map__plain_unrolled_prefix_5_1238_827: 2261 | .globl _camlFaster_map__plain_unrolled_prefix_5_109_closure 2262 | _camlFaster_map__plain_unrolled_prefix_5_109_closure: 2263 | .quad _caml_curry4 2264 | .quad 9 2265 | .quad _camlFaster_map__plain_unrolled_prefix_5_109 2266 | .data 2267 | .quad 4087 2268 | .globl _camlFaster_map__faster_map_set_of_closures_832 2269 | _camlFaster_map__faster_map_set_of_closures_832: 2270 | .globl _camlFaster_map__faster_map_815_closure 2271 | _camlFaster_map__faster_map_815_closure: 2272 | .quad _caml_curry2 2273 | .quad 5 2274 | .quad _camlFaster_map__faster_map_815 2275 | .data 2276 | .quad 4087 2277 | .globl _camlFaster_map__chunked_tail_recursive_map_12_set_of_closures_828 2278 | _camlFaster_map__chunked_tail_recursive_map_12_set_of_closures_828: 2279 | .globl _camlFaster_map__chunked_tail_recursive_map_12_216_closure 2280 | _camlFaster_map__chunked_tail_recursive_map_12_216_closure: 2281 | .quad _caml_curry2 2282 | .quad 5 2283 | .quad _camlFaster_map__chunked_tail_recursive_map_12_216 2284 | .data 2285 | .quad 4087 2286 | .globl _camlFaster_map__plain_unrolled_map_5_1204_826 2287 | _camlFaster_map__plain_unrolled_map_5_1204_826: 2288 | .globl _camlFaster_map__plain_unrolled_map_5_13_closure 2289 | _camlFaster_map__plain_unrolled_map_5_13_closure: 2290 | .quad _caml_curry2 2291 | .quad 5 2292 | .quad _camlFaster_map__plain_unrolled_map_5_13 2293 | .data 2294 | .quad 3068 2295 | .globl _camlFaster_map__string_658 2296 | _camlFaster_map__string_658: 2297 | .ascii "faster_map.ml" 2298 | .space 2 2299 | .byte 2 2300 | .data 2301 | .quad 3840 2302 | .globl _camlFaster_map__const_block_659 2303 | _camlFaster_map__const_block_659: 2304 | .quad _camlFaster_map__string_658 2305 | .quad 177 2306 | .quad 9 2307 | .data 2308 | .quad 3840 2309 | .globl _camlFaster_map__const_block_675 2310 | _camlFaster_map__const_block_675: 2311 | .quad _camlFaster_map__string_674 2312 | .quad 395 2313 | .quad 9 2314 | .data 2315 | .data 2316 | .data 2317 | .quad 2816 2318 | .globl _camlFaster_map__Pmakeblock_830 2319 | _camlFaster_map__Pmakeblock_830: 2320 | .quad _caml_exn_Match_failure 2321 | .quad _camlFaster_map__const_block_659 2322 | .data 2323 | .data 2324 | .data 2325 | .data 2326 | .quad 3068 2327 | .globl _camlFaster_map__string_674 2328 | _camlFaster_map__string_674: 2329 | .ascii "faster_map.ml" 2330 | .space 2 2331 | .byte 2 2332 | .data 2333 | .quad 4864 2334 | .globl _camlFaster_map 2335 | _camlFaster_map: 2336 | .quad _camlFaster_map__plain_unrolled_map_5_13_closure 2337 | .quad _camlFaster_map__plain_unrolled_prefix_5_109_closure 2338 | .quad _camlFaster_map__chunked_tail_recursive_map_12_216_closure 2339 | .quad _camlFaster_map__faster_map_815_closure 2340 | .data 2341 | .quad 2816 2342 | .globl _camlFaster_map__Pmakeblock_831 2343 | _camlFaster_map__Pmakeblock_831: 2344 | .quad _caml_exn_Match_failure 2345 | .quad _camlFaster_map__const_block_675 2346 | .text 2347 | .align 4 2348 | .globl _camlFaster_map__entry 2349 | _camlFaster_map__entry: 2350 | .cfi_startproc 2351 | L345: 2352 | movq $1, %rax 2353 | ret 2354 | .cfi_endproc 2355 | .data 2356 | .text 2357 | nop 2358 | .globl _camlFaster_map__code_end 2359 | _camlFaster_map__code_end: 2360 | .data 2361 | /* relocation table start */ 2362 | .align 3 2363 | /* relocation table end */ 2364 | .data 2365 | .globl _camlFaster_map__data_end 2366 | _camlFaster_map__data_end: 2367 | .long 0 2368 | .globl _camlFaster_map__frametable 2369 | _camlFaster_map__frametable: 2370 | .quad 152 2371 | .quad L339 2372 | .word 33 2373 | .word 2 2374 | .word 0 2375 | .word 8 2376 | .align 3 2377 | .quad L346 2378 | .quad L338 2379 | .word 128 2380 | .word 13 2381 | .word 0 2382 | .word 3 2383 | .word 8 2384 | .word 16 2385 | .word 24 2386 | .word 32 2387 | .word 40 2388 | .word 48 2389 | .word 56 2390 | .word 64 2391 | .word 72 2392 | .word 96 2393 | .word 104 2394 | .align 3 2395 | .quad L333 2396 | .word 129 2397 | .word 12 2398 | .word 0 2399 | .word 8 2400 | .word 16 2401 | .word 24 2402 | .word 32 2403 | .word 40 2404 | .word 48 2405 | .word 56 2406 | .word 64 2407 | .word 72 2408 | .word 96 2409 | .word 104 2410 | .align 3 2411 | .quad L347 2412 | .quad L332 2413 | .word 129 2414 | .word 13 2415 | .word 0 2416 | .word 8 2417 | .word 16 2418 | .word 24 2419 | .word 32 2420 | .word 40 2421 | .word 48 2422 | .word 56 2423 | .word 64 2424 | .word 80 2425 | .word 88 2426 | .word 96 2427 | .word 104 2428 | .align 3 2429 | .quad L348 2430 | .quad L331 2431 | .word 129 2432 | .word 13 2433 | .word 0 2434 | .word 8 2435 | .word 16 2436 | .word 24 2437 | .word 32 2438 | .word 40 2439 | .word 48 2440 | .word 56 2441 | .word 72 2442 | .word 80 2443 | .word 88 2444 | .word 96 2445 | .word 104 2446 | .align 3 2447 | .quad L349 2448 | .quad L330 2449 | .word 129 2450 | .word 13 2451 | .word 0 2452 | .word 8 2453 | .word 16 2454 | .word 24 2455 | .word 32 2456 | .word 40 2457 | .word 48 2458 | .word 64 2459 | .word 72 2460 | .word 80 2461 | .word 88 2462 | .word 96 2463 | .word 104 2464 | .align 3 2465 | .quad L350 2466 | .quad L329 2467 | .word 129 2468 | .word 13 2469 | .word 0 2470 | .word 8 2471 | .word 16 2472 | .word 24 2473 | .word 32 2474 | .word 40 2475 | .word 56 2476 | .word 64 2477 | .word 72 2478 | .word 80 2479 | .word 88 2480 | .word 96 2481 | .word 104 2482 | .align 3 2483 | .quad L351 2484 | .quad L328 2485 | .word 129 2486 | .word 13 2487 | .word 0 2488 | .word 8 2489 | .word 16 2490 | .word 24 2491 | .word 32 2492 | .word 48 2493 | .word 56 2494 | .word 64 2495 | .word 72 2496 | .word 80 2497 | .word 88 2498 | .word 96 2499 | .word 104 2500 | .align 3 2501 | .quad L352 2502 | .quad L327 2503 | .word 129 2504 | .word 13 2505 | .word 0 2506 | .word 8 2507 | .word 16 2508 | .word 24 2509 | .word 40 2510 | .word 48 2511 | .word 56 2512 | .word 64 2513 | .word 72 2514 | .word 80 2515 | .word 88 2516 | .word 96 2517 | .word 104 2518 | .align 3 2519 | .quad L353 2520 | .quad L326 2521 | .word 129 2522 | .word 13 2523 | .word 0 2524 | .word 8 2525 | .word 16 2526 | .word 32 2527 | .word 40 2528 | .word 48 2529 | .word 56 2530 | .word 64 2531 | .word 72 2532 | .word 80 2533 | .word 88 2534 | .word 96 2535 | .word 104 2536 | .align 3 2537 | .quad L354 2538 | .quad L325 2539 | .word 129 2540 | .word 13 2541 | .word 0 2542 | .word 8 2543 | .word 24 2544 | .word 32 2545 | .word 40 2546 | .word 48 2547 | .word 56 2548 | .word 64 2549 | .word 72 2550 | .word 80 2551 | .word 88 2552 | .word 96 2553 | .word 104 2554 | .align 3 2555 | .quad L355 2556 | .quad L324 2557 | .word 129 2558 | .word 13 2559 | .word 0 2560 | .word 16 2561 | .word 24 2562 | .word 32 2563 | .word 40 2564 | .word 48 2565 | .word 56 2566 | .word 64 2567 | .word 72 2568 | .word 80 2569 | .word 88 2570 | .word 96 2571 | .word 104 2572 | .align 3 2573 | .quad L356 2574 | .quad L323 2575 | .word 129 2576 | .word 13 2577 | .word 8 2578 | .word 16 2579 | .word 24 2580 | .word 32 2581 | .word 40 2582 | .word 48 2583 | .word 56 2584 | .word 64 2585 | .word 72 2586 | .word 80 2587 | .word 88 2588 | .word 96 2589 | .word 104 2590 | .align 3 2591 | .quad L357 2592 | .quad L322 2593 | .word 129 2594 | .word 13 2595 | .word 0 2596 | .word 8 2597 | .word 16 2598 | .word 24 2599 | .word 32 2600 | .word 40 2601 | .word 48 2602 | .word 56 2603 | .word 64 2604 | .word 72 2605 | .word 80 2606 | .word 88 2607 | .word 104 2608 | .align 3 2609 | .quad L358 2610 | .quad L321 2611 | .word 112 2612 | .word 1 2613 | .word 3 2614 | .align 3 2615 | .quad L194 2616 | .word 113 2617 | .word 0 2618 | .align 3 2619 | .quad L359 2620 | .quad L318 2621 | .word 112 2622 | .word 2 2623 | .word 0 2624 | .word 3 2625 | .align 3 2626 | .quad L196 2627 | .word 113 2628 | .word 1 2629 | .word 0 2630 | .align 3 2631 | .quad L360 2632 | .quad L195 2633 | .word 113 2634 | .word 2 2635 | .word 88 2636 | .word 96 2637 | .align 3 2638 | .quad L361 2639 | .quad L315 2640 | .word 112 2641 | .word 3 2642 | .word 0 2643 | .word 3 2644 | .word 8 2645 | .align 3 2646 | .quad L199 2647 | .word 113 2648 | .word 2 2649 | .word 0 2650 | .word 8 2651 | .align 3 2652 | .quad L362 2653 | .quad L198 2654 | .word 113 2655 | .word 3 2656 | .word 0 2657 | .word 88 2658 | .word 96 2659 | .align 3 2660 | .quad L363 2661 | .quad L197 2662 | .word 113 2663 | .word 3 2664 | .word 80 2665 | .word 88 2666 | .word 96 2667 | .align 3 2668 | .quad L364 2669 | .quad L312 2670 | .word 112 2671 | .word 4 2672 | .word 0 2673 | .word 3 2674 | .word 8 2675 | .word 16 2676 | .align 3 2677 | .quad L203 2678 | .word 113 2679 | .word 3 2680 | .word 0 2681 | .word 8 2682 | .word 16 2683 | .align 3 2684 | .quad L365 2685 | .quad L202 2686 | .word 113 2687 | .word 4 2688 | .word 0 2689 | .word 8 2690 | .word 88 2691 | .word 96 2692 | .align 3 2693 | .quad L366 2694 | .quad L201 2695 | .word 113 2696 | .word 4 2697 | .word 0 2698 | .word 80 2699 | .word 88 2700 | .word 96 2701 | .align 3 2702 | .quad L367 2703 | .quad L200 2704 | .word 113 2705 | .word 4 2706 | .word 72 2707 | .word 80 2708 | .word 88 2709 | .word 96 2710 | .align 3 2711 | .quad L368 2712 | .quad L309 2713 | .word 112 2714 | .word 5 2715 | .word 0 2716 | .word 3 2717 | .word 8 2718 | .word 16 2719 | .word 24 2720 | .align 3 2721 | .quad L208 2722 | .word 113 2723 | .word 4 2724 | .word 0 2725 | .word 8 2726 | .word 16 2727 | .word 24 2728 | .align 3 2729 | .quad L369 2730 | .quad L207 2731 | .word 113 2732 | .word 5 2733 | .word 0 2734 | .word 8 2735 | .word 16 2736 | .word 88 2737 | .word 96 2738 | .align 3 2739 | .quad L370 2740 | .quad L206 2741 | .word 113 2742 | .word 5 2743 | .word 0 2744 | .word 8 2745 | .word 80 2746 | .word 88 2747 | .word 96 2748 | .align 3 2749 | .quad L371 2750 | .quad L205 2751 | .word 113 2752 | .word 5 2753 | .word 0 2754 | .word 72 2755 | .word 80 2756 | .word 88 2757 | .word 96 2758 | .align 3 2759 | .quad L372 2760 | .quad L204 2761 | .word 113 2762 | .word 5 2763 | .word 64 2764 | .word 72 2765 | .word 80 2766 | .word 88 2767 | .word 96 2768 | .align 3 2769 | .quad L373 2770 | .quad L306 2771 | .word 112 2772 | .word 6 2773 | .word 0 2774 | .word 3 2775 | .word 8 2776 | .word 16 2777 | .word 24 2778 | .word 32 2779 | .align 3 2780 | .quad L214 2781 | .word 113 2782 | .word 5 2783 | .word 0 2784 | .word 8 2785 | .word 16 2786 | .word 24 2787 | .word 32 2788 | .align 3 2789 | .quad L374 2790 | .quad L213 2791 | .word 113 2792 | .word 6 2793 | .word 0 2794 | .word 8 2795 | .word 16 2796 | .word 24 2797 | .word 88 2798 | .word 96 2799 | .align 3 2800 | .quad L375 2801 | .quad L212 2802 | .word 113 2803 | .word 6 2804 | .word 0 2805 | .word 8 2806 | .word 16 2807 | .word 80 2808 | .word 88 2809 | .word 96 2810 | .align 3 2811 | .quad L376 2812 | .quad L211 2813 | .word 113 2814 | .word 6 2815 | .word 0 2816 | .word 8 2817 | .word 72 2818 | .word 80 2819 | .word 88 2820 | .word 96 2821 | .align 3 2822 | .quad L377 2823 | .quad L210 2824 | .word 113 2825 | .word 6 2826 | .word 0 2827 | .word 64 2828 | .word 72 2829 | .word 80 2830 | .word 88 2831 | .word 96 2832 | .align 3 2833 | .quad L378 2834 | .quad L209 2835 | .word 113 2836 | .word 6 2837 | .word 56 2838 | .word 64 2839 | .word 72 2840 | .word 80 2841 | .word 88 2842 | .word 96 2843 | .align 3 2844 | .quad L379 2845 | .quad L303 2846 | .word 112 2847 | .word 7 2848 | .word 0 2849 | .word 3 2850 | .word 8 2851 | .word 16 2852 | .word 24 2853 | .word 32 2854 | .word 40 2855 | .align 3 2856 | .quad L221 2857 | .word 113 2858 | .word 6 2859 | .word 0 2860 | .word 8 2861 | .word 16 2862 | .word 24 2863 | .word 32 2864 | .word 40 2865 | .align 3 2866 | .quad L380 2867 | .quad L220 2868 | .word 113 2869 | .word 7 2870 | .word 0 2871 | .word 8 2872 | .word 16 2873 | .word 24 2874 | .word 32 2875 | .word 88 2876 | .word 96 2877 | .align 3 2878 | .quad L381 2879 | .quad L219 2880 | .word 113 2881 | .word 7 2882 | .word 0 2883 | .word 8 2884 | .word 16 2885 | .word 24 2886 | .word 80 2887 | .word 88 2888 | .word 96 2889 | .align 3 2890 | .quad L382 2891 | .quad L218 2892 | .word 113 2893 | .word 7 2894 | .word 0 2895 | .word 8 2896 | .word 16 2897 | .word 72 2898 | .word 80 2899 | .word 88 2900 | .word 96 2901 | .align 3 2902 | .quad L383 2903 | .quad L217 2904 | .word 113 2905 | .word 7 2906 | .word 0 2907 | .word 8 2908 | .word 64 2909 | .word 72 2910 | .word 80 2911 | .word 88 2912 | .word 96 2913 | .align 3 2914 | .quad L384 2915 | .quad L216 2916 | .word 113 2917 | .word 7 2918 | .word 0 2919 | .word 56 2920 | .word 64 2921 | .word 72 2922 | .word 80 2923 | .word 88 2924 | .word 96 2925 | .align 3 2926 | .quad L385 2927 | .quad L215 2928 | .word 113 2929 | .word 7 2930 | .word 48 2931 | .word 56 2932 | .word 64 2933 | .word 72 2934 | .word 80 2935 | .word 88 2936 | .word 96 2937 | .align 3 2938 | .quad L386 2939 | .quad L300 2940 | .word 112 2941 | .word 8 2942 | .word 0 2943 | .word 3 2944 | .word 8 2945 | .word 16 2946 | .word 24 2947 | .word 32 2948 | .word 40 2949 | .word 48 2950 | .align 3 2951 | .quad L229 2952 | .word 113 2953 | .word 7 2954 | .word 0 2955 | .word 8 2956 | .word 16 2957 | .word 24 2958 | .word 32 2959 | .word 40 2960 | .word 48 2961 | .align 3 2962 | .quad L387 2963 | .quad L228 2964 | .word 113 2965 | .word 8 2966 | .word 0 2967 | .word 8 2968 | .word 16 2969 | .word 24 2970 | .word 32 2971 | .word 40 2972 | .word 88 2973 | .word 96 2974 | .align 3 2975 | .quad L388 2976 | .quad L227 2977 | .word 113 2978 | .word 8 2979 | .word 0 2980 | .word 8 2981 | .word 16 2982 | .word 24 2983 | .word 32 2984 | .word 80 2985 | .word 88 2986 | .word 96 2987 | .align 3 2988 | .quad L389 2989 | .quad L226 2990 | .word 113 2991 | .word 8 2992 | .word 0 2993 | .word 8 2994 | .word 16 2995 | .word 24 2996 | .word 72 2997 | .word 80 2998 | .word 88 2999 | .word 96 3000 | .align 3 3001 | .quad L390 3002 | .quad L225 3003 | .word 113 3004 | .word 8 3005 | .word 0 3006 | .word 8 3007 | .word 16 3008 | .word 64 3009 | .word 72 3010 | .word 80 3011 | .word 88 3012 | .word 96 3013 | .align 3 3014 | .quad L391 3015 | .quad L224 3016 | .word 113 3017 | .word 8 3018 | .word 0 3019 | .word 8 3020 | .word 56 3021 | .word 64 3022 | .word 72 3023 | .word 80 3024 | .word 88 3025 | .word 96 3026 | .align 3 3027 | .quad L392 3028 | .quad L223 3029 | .word 113 3030 | .word 8 3031 | .word 0 3032 | .word 48 3033 | .word 56 3034 | .word 64 3035 | .word 72 3036 | .word 80 3037 | .word 88 3038 | .word 96 3039 | .align 3 3040 | .quad L393 3041 | .quad L222 3042 | .word 113 3043 | .word 8 3044 | .word 40 3045 | .word 48 3046 | .word 56 3047 | .word 64 3048 | .word 72 3049 | .word 80 3050 | .word 88 3051 | .word 96 3052 | .align 3 3053 | .quad L394 3054 | .quad L297 3055 | .word 112 3056 | .word 9 3057 | .word 0 3058 | .word 3 3059 | .word 8 3060 | .word 16 3061 | .word 24 3062 | .word 32 3063 | .word 40 3064 | .word 48 3065 | .word 56 3066 | .align 3 3067 | .quad L238 3068 | .word 113 3069 | .word 8 3070 | .word 0 3071 | .word 8 3072 | .word 16 3073 | .word 24 3074 | .word 32 3075 | .word 40 3076 | .word 48 3077 | .word 56 3078 | .align 3 3079 | .quad L395 3080 | .quad L237 3081 | .word 113 3082 | .word 9 3083 | .word 0 3084 | .word 8 3085 | .word 16 3086 | .word 24 3087 | .word 32 3088 | .word 40 3089 | .word 48 3090 | .word 88 3091 | .word 96 3092 | .align 3 3093 | .quad L396 3094 | .quad L236 3095 | .word 113 3096 | .word 9 3097 | .word 0 3098 | .word 8 3099 | .word 16 3100 | .word 24 3101 | .word 32 3102 | .word 40 3103 | .word 80 3104 | .word 88 3105 | .word 96 3106 | .align 3 3107 | .quad L397 3108 | .quad L235 3109 | .word 113 3110 | .word 9 3111 | .word 0 3112 | .word 8 3113 | .word 16 3114 | .word 24 3115 | .word 32 3116 | .word 72 3117 | .word 80 3118 | .word 88 3119 | .word 96 3120 | .align 3 3121 | .quad L398 3122 | .quad L234 3123 | .word 113 3124 | .word 9 3125 | .word 0 3126 | .word 8 3127 | .word 16 3128 | .word 24 3129 | .word 64 3130 | .word 72 3131 | .word 80 3132 | .word 88 3133 | .word 96 3134 | .align 3 3135 | .quad L399 3136 | .quad L233 3137 | .word 113 3138 | .word 9 3139 | .word 0 3140 | .word 8 3141 | .word 16 3142 | .word 56 3143 | .word 64 3144 | .word 72 3145 | .word 80 3146 | .word 88 3147 | .word 96 3148 | .align 3 3149 | .quad L400 3150 | .quad L232 3151 | .word 113 3152 | .word 9 3153 | .word 0 3154 | .word 8 3155 | .word 48 3156 | .word 56 3157 | .word 64 3158 | .word 72 3159 | .word 80 3160 | .word 88 3161 | .word 96 3162 | .align 3 3163 | .quad L401 3164 | .quad L231 3165 | .word 113 3166 | .word 9 3167 | .word 0 3168 | .word 40 3169 | .word 48 3170 | .word 56 3171 | .word 64 3172 | .word 72 3173 | .word 80 3174 | .word 88 3175 | .word 96 3176 | .align 3 3177 | .quad L402 3178 | .quad L230 3179 | .word 113 3180 | .word 9 3181 | .word 32 3182 | .word 40 3183 | .word 48 3184 | .word 56 3185 | .word 64 3186 | .word 72 3187 | .word 80 3188 | .word 88 3189 | .word 96 3190 | .align 3 3191 | .quad L403 3192 | .quad L294 3193 | .word 112 3194 | .word 10 3195 | .word 0 3196 | .word 3 3197 | .word 8 3198 | .word 16 3199 | .word 24 3200 | .word 32 3201 | .word 40 3202 | .word 48 3203 | .word 56 3204 | .word 64 3205 | .align 3 3206 | .quad L248 3207 | .word 113 3208 | .word 9 3209 | .word 0 3210 | .word 8 3211 | .word 16 3212 | .word 24 3213 | .word 32 3214 | .word 40 3215 | .word 48 3216 | .word 56 3217 | .word 64 3218 | .align 3 3219 | .quad L404 3220 | .quad L247 3221 | .word 113 3222 | .word 10 3223 | .word 0 3224 | .word 8 3225 | .word 16 3226 | .word 24 3227 | .word 32 3228 | .word 40 3229 | .word 48 3230 | .word 56 3231 | .word 88 3232 | .word 96 3233 | .align 3 3234 | .quad L405 3235 | .quad L246 3236 | .word 113 3237 | .word 10 3238 | .word 0 3239 | .word 8 3240 | .word 16 3241 | .word 24 3242 | .word 32 3243 | .word 40 3244 | .word 48 3245 | .word 80 3246 | .word 88 3247 | .word 96 3248 | .align 3 3249 | .quad L406 3250 | .quad L245 3251 | .word 113 3252 | .word 10 3253 | .word 0 3254 | .word 8 3255 | .word 16 3256 | .word 24 3257 | .word 32 3258 | .word 40 3259 | .word 72 3260 | .word 80 3261 | .word 88 3262 | .word 96 3263 | .align 3 3264 | .quad L407 3265 | .quad L244 3266 | .word 113 3267 | .word 10 3268 | .word 0 3269 | .word 8 3270 | .word 16 3271 | .word 24 3272 | .word 32 3273 | .word 64 3274 | .word 72 3275 | .word 80 3276 | .word 88 3277 | .word 96 3278 | .align 3 3279 | .quad L408 3280 | .quad L243 3281 | .word 113 3282 | .word 10 3283 | .word 0 3284 | .word 8 3285 | .word 16 3286 | .word 24 3287 | .word 56 3288 | .word 64 3289 | .word 72 3290 | .word 80 3291 | .word 88 3292 | .word 96 3293 | .align 3 3294 | .quad L409 3295 | .quad L242 3296 | .word 113 3297 | .word 10 3298 | .word 0 3299 | .word 8 3300 | .word 16 3301 | .word 48 3302 | .word 56 3303 | .word 64 3304 | .word 72 3305 | .word 80 3306 | .word 88 3307 | .word 96 3308 | .align 3 3309 | .quad L410 3310 | .quad L241 3311 | .word 113 3312 | .word 10 3313 | .word 0 3314 | .word 8 3315 | .word 40 3316 | .word 48 3317 | .word 56 3318 | .word 64 3319 | .word 72 3320 | .word 80 3321 | .word 88 3322 | .word 96 3323 | .align 3 3324 | .quad L411 3325 | .quad L240 3326 | .word 113 3327 | .word 10 3328 | .word 0 3329 | .word 32 3330 | .word 40 3331 | .word 48 3332 | .word 56 3333 | .word 64 3334 | .word 72 3335 | .word 80 3336 | .word 88 3337 | .word 96 3338 | .align 3 3339 | .quad L412 3340 | .quad L239 3341 | .word 113 3342 | .word 10 3343 | .word 24 3344 | .word 32 3345 | .word 40 3346 | .word 48 3347 | .word 56 3348 | .word 64 3349 | .word 72 3350 | .word 80 3351 | .word 88 3352 | .word 96 3353 | .align 3 3354 | .quad L413 3355 | .quad L291 3356 | .word 112 3357 | .word 11 3358 | .word 0 3359 | .word 3 3360 | .word 8 3361 | .word 16 3362 | .word 24 3363 | .word 32 3364 | .word 40 3365 | .word 48 3366 | .word 56 3367 | .word 64 3368 | .word 72 3369 | .align 3 3370 | .quad L259 3371 | .word 113 3372 | .word 10 3373 | .word 0 3374 | .word 8 3375 | .word 16 3376 | .word 24 3377 | .word 32 3378 | .word 40 3379 | .word 48 3380 | .word 56 3381 | .word 64 3382 | .word 72 3383 | .align 3 3384 | .quad L414 3385 | .quad L258 3386 | .word 113 3387 | .word 11 3388 | .word 0 3389 | .word 8 3390 | .word 16 3391 | .word 24 3392 | .word 32 3393 | .word 40 3394 | .word 48 3395 | .word 56 3396 | .word 64 3397 | .word 88 3398 | .word 96 3399 | .align 3 3400 | .quad L415 3401 | .quad L257 3402 | .word 113 3403 | .word 11 3404 | .word 0 3405 | .word 8 3406 | .word 16 3407 | .word 24 3408 | .word 32 3409 | .word 40 3410 | .word 48 3411 | .word 56 3412 | .word 80 3413 | .word 88 3414 | .word 96 3415 | .align 3 3416 | .quad L416 3417 | .quad L256 3418 | .word 113 3419 | .word 11 3420 | .word 0 3421 | .word 8 3422 | .word 16 3423 | .word 24 3424 | .word 32 3425 | .word 40 3426 | .word 48 3427 | .word 72 3428 | .word 80 3429 | .word 88 3430 | .word 96 3431 | .align 3 3432 | .quad L417 3433 | .quad L255 3434 | .word 113 3435 | .word 11 3436 | .word 0 3437 | .word 8 3438 | .word 16 3439 | .word 24 3440 | .word 32 3441 | .word 40 3442 | .word 64 3443 | .word 72 3444 | .word 80 3445 | .word 88 3446 | .word 96 3447 | .align 3 3448 | .quad L418 3449 | .quad L254 3450 | .word 113 3451 | .word 11 3452 | .word 0 3453 | .word 8 3454 | .word 16 3455 | .word 24 3456 | .word 32 3457 | .word 56 3458 | .word 64 3459 | .word 72 3460 | .word 80 3461 | .word 88 3462 | .word 96 3463 | .align 3 3464 | .quad L419 3465 | .quad L253 3466 | .word 113 3467 | .word 11 3468 | .word 0 3469 | .word 8 3470 | .word 16 3471 | .word 24 3472 | .word 48 3473 | .word 56 3474 | .word 64 3475 | .word 72 3476 | .word 80 3477 | .word 88 3478 | .word 96 3479 | .align 3 3480 | .quad L420 3481 | .quad L252 3482 | .word 113 3483 | .word 11 3484 | .word 0 3485 | .word 8 3486 | .word 16 3487 | .word 40 3488 | .word 48 3489 | .word 56 3490 | .word 64 3491 | .word 72 3492 | .word 80 3493 | .word 88 3494 | .word 96 3495 | .align 3 3496 | .quad L421 3497 | .quad L251 3498 | .word 113 3499 | .word 11 3500 | .word 0 3501 | .word 8 3502 | .word 32 3503 | .word 40 3504 | .word 48 3505 | .word 56 3506 | .word 64 3507 | .word 72 3508 | .word 80 3509 | .word 88 3510 | .word 96 3511 | .align 3 3512 | .quad L422 3513 | .quad L250 3514 | .word 113 3515 | .word 11 3516 | .word 0 3517 | .word 24 3518 | .word 32 3519 | .word 40 3520 | .word 48 3521 | .word 56 3522 | .word 64 3523 | .word 72 3524 | .word 80 3525 | .word 88 3526 | .word 96 3527 | .align 3 3528 | .quad L423 3529 | .quad L249 3530 | .word 113 3531 | .word 11 3532 | .word 16 3533 | .word 24 3534 | .word 32 3535 | .word 40 3536 | .word 48 3537 | .word 56 3538 | .word 64 3539 | .word 72 3540 | .word 80 3541 | .word 88 3542 | .word 96 3543 | .align 3 3544 | .quad L424 3545 | .quad L288 3546 | .word 112 3547 | .word 12 3548 | .word 0 3549 | .word 3 3550 | .word 8 3551 | .word 16 3552 | .word 24 3553 | .word 32 3554 | .word 40 3555 | .word 48 3556 | .word 56 3557 | .word 64 3558 | .word 72 3559 | .word 80 3560 | .align 3 3561 | .quad L271 3562 | .word 113 3563 | .word 11 3564 | .word 0 3565 | .word 8 3566 | .word 16 3567 | .word 24 3568 | .word 32 3569 | .word 40 3570 | .word 48 3571 | .word 56 3572 | .word 64 3573 | .word 72 3574 | .word 80 3575 | .align 3 3576 | .quad L425 3577 | .quad L270 3578 | .word 113 3579 | .word 12 3580 | .word 0 3581 | .word 8 3582 | .word 16 3583 | .word 24 3584 | .word 32 3585 | .word 40 3586 | .word 48 3587 | .word 56 3588 | .word 64 3589 | .word 72 3590 | .word 88 3591 | .word 96 3592 | .align 3 3593 | .quad L426 3594 | .quad L269 3595 | .word 113 3596 | .word 12 3597 | .word 0 3598 | .word 8 3599 | .word 16 3600 | .word 24 3601 | .word 32 3602 | .word 40 3603 | .word 48 3604 | .word 56 3605 | .word 64 3606 | .word 80 3607 | .word 88 3608 | .word 96 3609 | .align 3 3610 | .quad L427 3611 | .quad L268 3612 | .word 113 3613 | .word 12 3614 | .word 0 3615 | .word 8 3616 | .word 16 3617 | .word 24 3618 | .word 32 3619 | .word 40 3620 | .word 48 3621 | .word 56 3622 | .word 72 3623 | .word 80 3624 | .word 88 3625 | .word 96 3626 | .align 3 3627 | .quad L428 3628 | .quad L267 3629 | .word 113 3630 | .word 12 3631 | .word 0 3632 | .word 8 3633 | .word 16 3634 | .word 24 3635 | .word 32 3636 | .word 40 3637 | .word 48 3638 | .word 64 3639 | .word 72 3640 | .word 80 3641 | .word 88 3642 | .word 96 3643 | .align 3 3644 | .quad L429 3645 | .quad L266 3646 | .word 113 3647 | .word 12 3648 | .word 0 3649 | .word 8 3650 | .word 16 3651 | .word 24 3652 | .word 32 3653 | .word 40 3654 | .word 56 3655 | .word 64 3656 | .word 72 3657 | .word 80 3658 | .word 88 3659 | .word 96 3660 | .align 3 3661 | .quad L430 3662 | .quad L265 3663 | .word 113 3664 | .word 12 3665 | .word 0 3666 | .word 8 3667 | .word 16 3668 | .word 24 3669 | .word 32 3670 | .word 48 3671 | .word 56 3672 | .word 64 3673 | .word 72 3674 | .word 80 3675 | .word 88 3676 | .word 96 3677 | .align 3 3678 | .quad L431 3679 | .quad L264 3680 | .word 113 3681 | .word 12 3682 | .word 0 3683 | .word 8 3684 | .word 16 3685 | .word 24 3686 | .word 40 3687 | .word 48 3688 | .word 56 3689 | .word 64 3690 | .word 72 3691 | .word 80 3692 | .word 88 3693 | .word 96 3694 | .align 3 3695 | .quad L432 3696 | .quad L263 3697 | .word 113 3698 | .word 12 3699 | .word 0 3700 | .word 8 3701 | .word 16 3702 | .word 32 3703 | .word 40 3704 | .word 48 3705 | .word 56 3706 | .word 64 3707 | .word 72 3708 | .word 80 3709 | .word 88 3710 | .word 96 3711 | .align 3 3712 | .quad L433 3713 | .quad L262 3714 | .word 113 3715 | .word 12 3716 | .word 0 3717 | .word 8 3718 | .word 24 3719 | .word 32 3720 | .word 40 3721 | .word 48 3722 | .word 56 3723 | .word 64 3724 | .word 72 3725 | .word 80 3726 | .word 88 3727 | .word 96 3728 | .align 3 3729 | .quad L434 3730 | .quad L261 3731 | .word 113 3732 | .word 12 3733 | .word 8 3734 | .word 16 3735 | .word 24 3736 | .word 32 3737 | .word 40 3738 | .word 48 3739 | .word 56 3740 | .word 64 3741 | .word 72 3742 | .word 80 3743 | .word 88 3744 | .word 96 3745 | .align 3 3746 | .quad L435 3747 | .quad L260 3748 | .word 113 3749 | .word 12 3750 | .word 0 3751 | .word 16 3752 | .word 24 3753 | .word 32 3754 | .word 40 3755 | .word 48 3756 | .word 56 3757 | .word 64 3758 | .word 72 3759 | .word 80 3760 | .word 88 3761 | .word 96 3762 | .align 3 3763 | .quad L436 3764 | .quad L193 3765 | .word 16 3766 | .word 2 3767 | .word 3 3768 | .word 5 3769 | .align 3 3770 | .quad L190 3771 | .word 16 3772 | .word 3 3773 | .word 3 3774 | .word 5 3775 | .word 7 3776 | .align 3 3777 | .quad L178 3778 | .word 33 3779 | .word 2 3780 | .word 8 3781 | .word 16 3782 | .align 3 3783 | .quad L437 3784 | .quad L177 3785 | .word 33 3786 | .word 2 3787 | .word 0 3788 | .word 16 3789 | .align 3 3790 | .quad L438 3791 | .quad L184 3792 | .word 32 3793 | .word 2 3794 | .word 3 3795 | .word 5 3796 | .align 3 3797 | .quad L176 3798 | .word 64 3799 | .word 1 3800 | .word 3 3801 | .align 3 3802 | .quad L137 3803 | .word 65 3804 | .word 0 3805 | .align 3 3806 | .quad L439 3807 | .quad L173 3808 | .word 64 3809 | .word 2 3810 | .word 0 3811 | .word 3 3812 | .align 3 3813 | .quad L139 3814 | .word 65 3815 | .word 1 3816 | .word 0 3817 | .align 3 3818 | .quad L440 3819 | .quad L138 3820 | .word 65 3821 | .word 2 3822 | .word 32 3823 | .word 40 3824 | .align 3 3825 | .quad L441 3826 | .quad L170 3827 | .word 64 3828 | .word 3 3829 | .word 0 3830 | .word 3 3831 | .word 8 3832 | .align 3 3833 | .quad L142 3834 | .word 65 3835 | .word 2 3836 | .word 0 3837 | .word 8 3838 | .align 3 3839 | .quad L442 3840 | .quad L141 3841 | .word 65 3842 | .word 3 3843 | .word 0 3844 | .word 32 3845 | .word 40 3846 | .align 3 3847 | .quad L443 3848 | .quad L140 3849 | .word 65 3850 | .word 3 3851 | .word 24 3852 | .word 32 3853 | .word 40 3854 | .align 3 3855 | .quad L444 3856 | .quad L167 3857 | .word 64 3858 | .word 4 3859 | .word 0 3860 | .word 3 3861 | .word 8 3862 | .word 16 3863 | .align 3 3864 | .quad L146 3865 | .word 65 3866 | .word 3 3867 | .word 0 3868 | .word 8 3869 | .word 16 3870 | .align 3 3871 | .quad L445 3872 | .quad L145 3873 | .word 65 3874 | .word 4 3875 | .word 0 3876 | .word 8 3877 | .word 32 3878 | .word 40 3879 | .align 3 3880 | .quad L446 3881 | .quad L144 3882 | .word 65 3883 | .word 4 3884 | .word 0 3885 | .word 24 3886 | .word 32 3887 | .word 40 3888 | .align 3 3889 | .quad L447 3890 | .quad L143 3891 | .word 65 3892 | .word 4 3893 | .word 16 3894 | .word 24 3895 | .word 32 3896 | .word 40 3897 | .align 3 3898 | .quad L448 3899 | .quad L164 3900 | .word 64 3901 | .word 6 3902 | .word 0 3903 | .word 3 3904 | .word 8 3905 | .word 16 3906 | .word 24 3907 | .word 48 3908 | .align 3 3909 | .quad L153 3910 | .word 65 3911 | .word 5 3912 | .word 0 3913 | .word 8 3914 | .word 16 3915 | .word 24 3916 | .word 48 3917 | .align 3 3918 | .quad L449 3919 | .quad L152 3920 | .word 65 3921 | .word 6 3922 | .word 0 3923 | .word 8 3924 | .word 16 3925 | .word 32 3926 | .word 40 3927 | .word 48 3928 | .align 3 3929 | .quad L450 3930 | .quad L151 3931 | .word 65 3932 | .word 6 3933 | .word 0 3934 | .word 8 3935 | .word 24 3936 | .word 32 3937 | .word 40 3938 | .word 48 3939 | .align 3 3940 | .quad L451 3941 | .quad L150 3942 | .word 65 3943 | .word 6 3944 | .word 0 3945 | .word 16 3946 | .word 24 3947 | .word 32 3948 | .word 40 3949 | .word 48 3950 | .align 3 3951 | .quad L452 3952 | .quad L149 3953 | .word 65 3954 | .word 6 3955 | .word 8 3956 | .word 16 3957 | .word 24 3958 | .word 32 3959 | .word 40 3960 | .word 48 3961 | .align 3 3962 | .quad L453 3963 | .quad L148 3964 | .word 65 3965 | .word 6 3966 | .word 0 3967 | .word 8 3968 | .word 16 3969 | .word 24 3970 | .word 32 3971 | .word 40 3972 | .align 3 3973 | .quad L454 3974 | .quad L147 3975 | .word 65 3976 | .word 6 3977 | .word 0 3978 | .word 8 3979 | .word 16 3980 | .word 24 3981 | .word 32 3982 | .word 40 3983 | .align 3 3984 | .quad L455 3985 | .quad L136 3986 | .word 80 3987 | .word 1 3988 | .word 3 3989 | .align 3 3990 | .quad L100 3991 | .word 81 3992 | .word 0 3993 | .align 3 3994 | .quad L456 3995 | .quad L133 3996 | .word 80 3997 | .word 2 3998 | .word 0 3999 | .word 3 4000 | .align 3 4001 | .quad L102 4002 | .word 81 4003 | .word 1 4004 | .word 0 4005 | .align 3 4006 | .quad L457 4007 | .quad L101 4008 | .word 81 4009 | .word 2 4010 | .word 24 4011 | .word 48 4012 | .align 3 4013 | .quad L458 4014 | .quad L130 4015 | .word 80 4016 | .word 3 4017 | .word 0 4018 | .word 3 4019 | .word 8 4020 | .align 3 4021 | .quad L105 4022 | .word 81 4023 | .word 2 4024 | .word 0 4025 | .word 8 4026 | .align 3 4027 | .quad L459 4028 | .quad L104 4029 | .word 81 4030 | .word 3 4031 | .word 8 4032 | .word 32 4033 | .word 48 4034 | .align 3 4035 | .quad L460 4036 | .quad L103 4037 | .word 81 4038 | .word 3 4039 | .word 24 4040 | .word 32 4041 | .word 48 4042 | .align 3 4043 | .quad L461 4044 | .quad L127 4045 | .word 80 4046 | .word 4 4047 | .word 0 4048 | .word 3 4049 | .word 8 4050 | .word 16 4051 | .align 3 4052 | .quad L109 4053 | .word 81 4054 | .word 3 4055 | .word 0 4056 | .word 8 4057 | .word 16 4058 | .align 3 4059 | .quad L462 4060 | .quad L108 4061 | .word 81 4062 | .word 4 4063 | .word 8 4064 | .word 16 4065 | .word 40 4066 | .word 48 4067 | .align 3 4068 | .quad L463 4069 | .quad L107 4070 | .word 81 4071 | .word 4 4072 | .word 16 4073 | .word 32 4074 | .word 40 4075 | .word 48 4076 | .align 3 4077 | .quad L464 4078 | .quad L106 4079 | .word 81 4080 | .word 4 4081 | .word 24 4082 | .word 32 4083 | .word 40 4084 | .word 48 4085 | .align 3 4086 | .quad L465 4087 | .quad L124 4088 | .word 80 4089 | .word 6 4090 | .word 3 4091 | .word 8 4092 | .word 16 4093 | .word 24 4094 | .word 56 4095 | .word 64 4096 | .align 3 4097 | .quad L115 4098 | .word 81 4099 | .word 5 4100 | .word 8 4101 | .word 16 4102 | .word 24 4103 | .word 56 4104 | .word 64 4105 | .align 3 4106 | .quad L466 4107 | .quad L114 4108 | .word 81 4109 | .word 6 4110 | .word 0 4111 | .word 16 4112 | .word 24 4113 | .word 48 4114 | .word 56 4115 | .word 64 4116 | .align 3 4117 | .quad L467 4118 | .quad L113 4119 | .word 81 4120 | .word 5 4121 | .word 0 4122 | .word 24 4123 | .word 48 4124 | .word 56 4125 | .word 64 4126 | .align 3 4127 | .quad L468 4128 | .quad L112 4129 | .word 81 4130 | .word 5 4131 | .word 0 4132 | .word 40 4133 | .word 48 4134 | .word 56 4135 | .word 64 4136 | .align 3 4137 | .quad L469 4138 | .quad L111 4139 | .word 81 4140 | .word 5 4141 | .word 0 4142 | .word 32 4143 | .word 40 4144 | .word 48 4145 | .word 64 4146 | .align 3 4147 | .quad L470 4148 | .quad L110 4149 | .word 81 4150 | .word 5 4151 | .word 0 4152 | .word 24 4153 | .word 32 4154 | .word 40 4155 | .word 48 4156 | .align 3 4157 | .quad L471 4158 | .align 3 4159 | L369: 4160 | .set L$set$1, (L472 - .) + 1275068416 4161 | .long L$set$1 4162 | .long 467184 4163 | .quad 0 4164 | .align 3 4165 | L455: 4166 | .set L$set$2, (L472 - .) + 1677721600 4167 | .long L$set$2 4168 | .long 262272 4169 | .quad 0 4170 | .align 3 4171 | L454: 4172 | .set L$set$3, (L472 - .) + -201326592 4173 | .long L$set$3 4174 | .long 270464 4175 | .quad 0 4176 | .align 3 4177 | L358: 4178 | .set L$set$4, (L472 - .) + 1409286144 4179 | .long L$set$4 4180 | .long 815360 4181 | .quad 0 4182 | .align 3 4183 | L425: 4184 | .set L$set$5, (L472 - .) + 1275068416 4185 | .long L$set$5 4186 | .long 782576 4187 | .quad 0 4188 | .align 3 4189 | L421: 4190 | .set L$set$6, (L472 - .) + 1275068416 4191 | .long L$set$6 4192 | .long 696560 4193 | .quad 0 4194 | .align 3 4195 | L362: 4196 | .set L$set$7, (L472 - .) + 1275068416 4197 | .long L$set$7 4198 | .long 413936 4199 | .quad 0 4200 | .align 3 4201 | L366: 4202 | .set L$set$8, (L472 - .) + 1275068416 4203 | .long L$set$8 4204 | .long 434416 4205 | .quad 0 4206 | .align 3 4207 | L356: 4208 | .set L$set$9, (L472 - .) + 1409286144 4209 | .long L$set$9 4210 | .long 823552 4211 | .quad 0 4212 | .align 3 4213 | L375: 4214 | .set L$set$10, (L472 - .) + 1275068416 4215 | .long L$set$10 4216 | .long 495856 4217 | .quad 0 4218 | .align 3 4219 | L374: 4220 | .set L$set$11, (L472 - .) + 1275068416 4221 | .long L$set$11 4222 | .long 499952 4223 | .quad 0 4224 | .align 3 4225 | L372: 4226 | .set L$set$12, (L472 - .) + 1275068416 4227 | .long L$set$12 4228 | .long 454896 4229 | .quad 0 4230 | .align 3 4231 | L427: 4232 | .set L$set$13, (L472 - .) + 1275068416 4233 | .long L$set$13 4234 | .long 774384 4235 | .quad 0 4236 | .align 3 4237 | L402: 4238 | .set L$set$14, (L472 - .) + 1275068416 4239 | .long L$set$14 4240 | .long 594160 4241 | .quad 0 4242 | .align 3 4243 | L432: 4244 | .set L$set$15, (L472 - .) + 1275068416 4245 | .long L$set$15 4246 | .long 753904 4247 | .quad 0 4248 | .align 3 4249 | L415: 4250 | .set L$set$16, (L472 - .) + 1275068416 4251 | .long L$set$16 4252 | .long 721136 4253 | .quad 0 4254 | .align 3 4255 | L400: 4256 | .set L$set$17, (L472 - .) + 1275068416 4257 | .long L$set$17 4258 | .long 602352 4259 | .quad 0 4260 | .align 3 4261 | L396: 4262 | .set L$set$18, (L472 - .) + 1275068416 4263 | .long L$set$18 4264 | .long 618736 4265 | .quad 0 4266 | .align 3 4267 | L393: 4268 | .set L$set$19, (L472 - .) + 1275068416 4269 | .long L$set$19 4270 | .long 553200 4271 | .quad 0 4272 | .align 3 4273 | L447: 4274 | .set L$set$20, (L472 - .) + 1140850688 4275 | .long L$set$20 4276 | .long 233680 4277 | .quad 0 4278 | .align 3 4279 | L446: 4280 | .set L$set$21, (L472 - .) + 1140850688 4281 | .long L$set$21 4282 | .long 237776 4283 | .quad 0 4284 | .align 3 4285 | L434: 4286 | .set L$set$22, (L472 - .) + 1409286144 4287 | .long L$set$22 4288 | .long 745728 4289 | .quad 0 4290 | .align 3 4291 | L406: 4292 | .set L$set$23, (L472 - .) + 1275068416 4293 | .long L$set$23 4294 | .long 663792 4295 | .quad 0 4296 | .align 3 4297 | L408: 4298 | .set L$set$24, (L472 - .) + 1275068416 4299 | .long L$set$24 4300 | .long 655600 4301 | .quad 0 4302 | .align 3 4303 | L462: 4304 | .set L$set$25, (L472 - .) + 1140850688 4305 | .long L$set$25 4306 | .long 90320 4307 | .quad 0 4308 | .align 3 4309 | L449: 4310 | .set L$set$26, (L472 - .) + 1140850688 4311 | .long L$set$26 4312 | .long 295120 4313 | .quad 0 4314 | .align 3 4315 | L390: 4316 | .set L$set$27, (L472 - .) + 1275068416 4317 | .long L$set$27 4318 | .long 565488 4319 | .quad 0 4320 | .align 3 4321 | L422: 4322 | .set L$set$28, (L472 - .) + 1275068416 4323 | .long L$set$28 4324 | .long 692464 4325 | .quad 0 4326 | .align 3 4327 | L418: 4328 | .set L$set$29, (L472 - .) + 1275068416 4329 | .long L$set$29 4330 | .long 708848 4331 | .quad 0 4332 | .align 3 4333 | L395: 4334 | .set L$set$30, (L472 - .) + 1275068416 4335 | .long L$set$30 4336 | .long 622832 4337 | .quad 0 4338 | .align 3 4339 | L380: 4340 | .set L$set$31, (L472 - .) + 1275068416 4341 | .long L$set$31 4342 | .long 536816 4343 | .quad 0 4344 | .align 3 4345 | L363: 4346 | .set L$set$32, (L472 - .) + 1275068416 4347 | .long L$set$32 4348 | .long 409840 4349 | .quad 0 4350 | .align 3 4351 | L459: 4352 | .set L$set$33, (L472 - .) + 1140850688 4353 | .long L$set$33 4354 | .long 65744 4355 | .quad 0 4356 | .align 3 4357 | L387: 4358 | .set L$set$34, (L472 - .) + 1275068416 4359 | .long L$set$34 4360 | .long 577776 4361 | .quad 0 4362 | .align 3 4363 | L376: 4364 | .set L$set$35, (L472 - .) + 1275068416 4365 | .long L$set$35 4366 | .long 491760 4367 | .quad 0 4368 | .align 3 4369 | L370: 4370 | .set L$set$36, (L472 - .) + 1275068416 4371 | .long L$set$36 4372 | .long 463088 4373 | .quad 0 4374 | .align 3 4375 | L467: 4376 | .set L$set$37, (L472 - .) + 1140850688 4377 | .long L$set$37 4378 | .long 118992 4379 | .quad 0 4380 | .align 3 4381 | L452: 4382 | .set L$set$38, (L472 - .) + 1140850688 4383 | .long L$set$38 4384 | .long 282832 4385 | .quad 0 4386 | .align 3 4387 | L410: 4388 | .set L$set$39, (L472 - .) + 1275068416 4389 | .long L$set$39 4390 | .long 647408 4391 | .quad 0 4392 | .align 3 4393 | L357: 4394 | .set L$set$40, (L472 - .) + 1409286144 4395 | .long L$set$40 4396 | .long 819456 4397 | .quad 0 4398 | .align 3 4399 | L450: 4400 | .set L$set$41, (L472 - .) + 1140850688 4401 | .long L$set$41 4402 | .long 291024 4403 | .quad 0 4404 | .align 3 4405 | L439: 4406 | .set L$set$42, (L472 - .) + 1140850688 4407 | .long L$set$42 4408 | .long 180432 4409 | .quad 0 4410 | .align 3 4411 | L378: 4412 | .set L$set$43, (L472 - .) + 1275068416 4413 | .long L$set$43 4414 | .long 483568 4415 | .quad 0 4416 | .align 3 4417 | L448: 4418 | .set L$set$44, (L472 - .) + 1140850688 4419 | .long L$set$44 4420 | .long 229584 4421 | .quad 0 4422 | .align 3 4423 | L424: 4424 | .set L$set$45, (L472 - .) + 1409286144 4425 | .long L$set$45 4426 | .long 684288 4427 | .quad 0 4428 | .align 3 4429 | L420: 4430 | .set L$set$46, (L472 - .) + 1275068416 4431 | .long L$set$46 4432 | .long 700656 4433 | .quad 0 4434 | .align 3 4435 | L367: 4436 | .set L$set$47, (L472 - .) + 1275068416 4437 | .long L$set$47 4438 | .long 430320 4439 | .quad 0 4440 | .align 3 4441 | L348: 4442 | .set L$set$48, (L472 - .) + 1275068416 4443 | .long L$set$48 4444 | .long 856304 4445 | .quad 0 4446 | .align 3 4447 | L469: 4448 | .set L$set$49, (L472 - .) + 1140850688 4449 | .long L$set$49 4450 | .long 110800 4451 | .quad 0 4452 | .align 3 4453 | L430: 4454 | .set L$set$50, (L472 - .) + 1275068416 4455 | .long L$set$50 4456 | .long 762096 4457 | .quad 0 4458 | .align 3 4459 | L401: 4460 | .set L$set$51, (L472 - .) + 1275068416 4461 | .long L$set$51 4462 | .long 598256 4463 | .quad 0 4464 | .align 3 4465 | L397: 4466 | .set L$set$52, (L472 - .) + 1275068416 4467 | .long L$set$52 4468 | .long 614640 4469 | .quad 0 4470 | .align 3 4471 | L468: 4472 | .set L$set$53, (L472 - .) + 1140850688 4473 | .long L$set$53 4474 | .long 114896 4475 | .quad 0 4476 | .align 3 4477 | L407: 4478 | .set L$set$54, (L472 - .) + 1275068416 4479 | .long L$set$54 4480 | .long 659696 4481 | .quad 0 4482 | .align 3 4483 | L386: 4484 | .set L$set$55, (L472 - .) + 1275068416 4485 | .long L$set$55 4486 | .long 512240 4487 | .quad 0 4488 | .align 3 4489 | L384: 4490 | .set L$set$56, (L472 - .) + 1275068416 4491 | .long L$set$56 4492 | .long 520432 4493 | .quad 0 4494 | .align 3 4495 | L431: 4496 | .set L$set$57, (L472 - .) + 1275068416 4497 | .long L$set$57 4498 | .long 758000 4499 | .quad 0 4500 | .align 3 4501 | L413: 4502 | .set L$set$58, (L472 - .) + 1409286144 4503 | .long L$set$58 4504 | .long 635136 4505 | .quad 0 4506 | .align 3 4507 | L398: 4508 | .set L$set$59, (L472 - .) + 1275068416 4509 | .long L$set$59 4510 | .long 610544 4511 | .quad 0 4512 | .align 3 4513 | L463: 4514 | .set L$set$60, (L472 - .) + 1140850688 4515 | .long L$set$60 4516 | .long 86224 4517 | .quad 0 4518 | .align 3 4519 | L426: 4520 | .set L$set$61, (L472 - .) + 1275068416 4521 | .long L$set$61 4522 | .long 778480 4523 | .quad 0 4524 | .align 3 4525 | L414: 4526 | .set L$set$62, (L472 - .) + 1275068416 4527 | .long L$set$62 4528 | .long 725232 4529 | .quad 0 4530 | .align 3 4531 | L377: 4532 | .set L$set$63, (L472 - .) + 1275068416 4533 | .long L$set$63 4534 | .long 487664 4535 | .quad 0 4536 | .align 3 4537 | L349: 4538 | .set L$set$64, (L472 - .) + 1275068416 4539 | .long L$set$64 4540 | .long 852208 4541 | .quad 0 4542 | .align 3 4543 | L353: 4544 | .set L$set$65, (L472 - .) + 1275068416 4545 | .long L$set$65 4546 | .long 835824 4547 | .quad 0 4548 | .align 3 4549 | L441: 4550 | .set L$set$66, (L472 - .) + 1140850688 4551 | .long L$set$66 4552 | .long 192720 4553 | .quad 0 4554 | .align 3 4555 | L365: 4556 | .set L$set$67, (L472 - .) + 1275068416 4557 | .long L$set$67 4558 | .long 438512 4559 | .quad 0 4560 | .align 3 4561 | L360: 4562 | .set L$set$68, (L472 - .) + 1275068416 4563 | .long L$set$68 4564 | .long 393456 4565 | .quad 0 4566 | .align 3 4567 | L436: 4568 | .set L$set$69, (L472 - .) + 1409286144 4569 | .long L$set$69 4570 | .long 737536 4571 | .quad 0 4572 | .align 3 4573 | L443: 4574 | .set L$set$70, (L472 - .) + 1140850688 4575 | .long L$set$70 4576 | .long 213200 4577 | .quad 0 4578 | .align 3 4579 | L440: 4580 | .set L$set$71, (L472 - .) + 1140850688 4581 | .long L$set$71 4582 | .long 196816 4583 | .quad 0 4584 | .align 3 4585 | L437: 4586 | .set L$set$72, (L472 - .) + -1207959552 4587 | .long L$set$72 4588 | .long 942464 4589 | .quad 0 4590 | .align 3 4591 | L383: 4592 | .set L$set$73, (L472 - .) + 1275068416 4593 | .long L$set$73 4594 | .long 524528 4595 | .quad 0 4596 | .align 3 4597 | L460: 4598 | .set L$set$74, (L472 - .) + 1140850688 4599 | .long L$set$74 4600 | .long 61648 4601 | .quad 0 4602 | .align 3 4603 | L438: 4604 | .set L$set$75, (L472 - .) + 1677721600 4605 | .long L$set$75 4606 | .long 917744 4607 | .quad 0 4608 | .align 3 4609 | L368: 4610 | .set L$set$76, (L472 - .) + 1275068416 4611 | .long L$set$76 4612 | .long 426224 4613 | .quad 0 4614 | .align 3 4615 | L346: 4616 | .set L$set$77, (L472 - .) + -1811939328 4617 | .long L$set$77 4618 | .long 905344 4619 | .quad 0 4620 | .align 3 4621 | L451: 4622 | .set L$set$78, (L472 - .) + 1140850688 4623 | .long L$set$78 4624 | .long 286928 4625 | .quad 0 4626 | .align 3 4627 | L382: 4628 | .set L$set$79, (L472 - .) + 1275068416 4629 | .long L$set$79 4630 | .long 528624 4631 | .quad 0 4632 | .align 3 4633 | L379: 4634 | .set L$set$80, (L472 - .) + 1275068416 4635 | .long L$set$80 4636 | .long 479472 4637 | .quad 0 4638 | .align 3 4639 | L352: 4640 | .set L$set$81, (L472 - .) + 1275068416 4641 | .long L$set$81 4642 | .long 839920 4643 | .quad 0 4644 | .align 3 4645 | L456: 4646 | .set L$set$82, (L472 - .) + 1140850688 4647 | .long L$set$82 4648 | .long 28880 4649 | .quad 0 4650 | .align 3 4651 | L403: 4652 | .set L$set$83, (L472 - .) + 1275068416 4653 | .long L$set$83 4654 | .long 590064 4655 | .quad 0 4656 | .align 3 4657 | L470: 4658 | .set L$set$84, (L472 - .) + 1140850688 4659 | .long L$set$84 4660 | .long 106704 4661 | .quad 0 4662 | .align 3 4663 | L458: 4664 | .set L$set$85, (L472 - .) + 1140850688 4665 | .long L$set$85 4666 | .long 41168 4667 | .quad 0 4668 | .align 3 4669 | L411: 4670 | .set L$set$86, (L472 - .) + 1275068416 4671 | .long L$set$86 4672 | .long 643312 4673 | .quad 0 4674 | .align 3 4675 | L389: 4676 | .set L$set$87, (L472 - .) + 1275068416 4677 | .long L$set$87 4678 | .long 569584 4679 | .quad 0 4680 | .align 3 4681 | L457: 4682 | .set L$set$88, (L472 - .) + 1140850688 4683 | .long L$set$88 4684 | .long 45264 4685 | .quad 0 4686 | .align 3 4687 | L416: 4688 | .set L$set$89, (L472 - .) + 1275068416 4689 | .long L$set$89 4690 | .long 717040 4691 | .quad 0 4692 | .align 3 4693 | L428: 4694 | .set L$set$90, (L472 - .) + 1275068416 4695 | .long L$set$90 4696 | .long 770288 4697 | .quad 0 4698 | .align 3 4699 | L354: 4700 | .set L$set$91, (L472 - .) + 1275068416 4701 | .long L$set$91 4702 | .long 831728 4703 | .quad 0 4704 | .align 3 4705 | L347: 4706 | .set L$set$92, (L472 - .) + 1275068416 4707 | .long L$set$92 4708 | .long 860400 4709 | .quad 0 4710 | .align 3 4711 | L453: 4712 | .set L$set$93, (L472 - .) + 1140850688 4713 | .long L$set$93 4714 | .long 278736 4715 | .quad 0 4716 | .align 3 4717 | L394: 4718 | .set L$set$94, (L472 - .) + 1275068416 4719 | .long L$set$94 4720 | .long 549104 4721 | .quad 0 4722 | .align 3 4723 | L388: 4724 | .set L$set$95, (L472 - .) + 1275068416 4725 | .long L$set$95 4726 | .long 573680 4727 | .quad 0 4728 | .align 3 4729 | L471: 4730 | .set L$set$96, (L472 - .) + 1140850688 4731 | .long L$set$96 4732 | .long 102608 4733 | .quad 0 4734 | .align 3 4735 | L461: 4736 | .set L$set$97, (L472 - .) + 1140850688 4737 | .long L$set$97 4738 | .long 57552 4739 | .quad 0 4740 | .align 3 4741 | L417: 4742 | .set L$set$98, (L472 - .) + 1275068416 4743 | .long L$set$98 4744 | .long 712944 4745 | .quad 0 4746 | .align 3 4747 | L466: 4748 | .set L$set$99, (L472 - .) + -738197504 4749 | .long L$set$99 4750 | .long 123264 4751 | .quad 0 4752 | .align 3 4753 | L423: 4754 | .set L$set$100, (L472 - .) + 1409286144 4755 | .long L$set$100 4756 | .long 688384 4757 | .quad 0 4758 | .align 3 4759 | L364: 4760 | .set L$set$101, (L472 - .) + 1275068416 4761 | .long L$set$101 4762 | .long 405744 4763 | .quad 0 4764 | .align 3 4765 | L444: 4766 | .set L$set$102, (L472 - .) + 1140850688 4767 | .long L$set$102 4768 | .long 209104 4769 | .quad 0 4770 | .align 3 4771 | L361: 4772 | .set L$set$103, (L472 - .) + 1275068416 4773 | .long L$set$103 4774 | .long 389360 4775 | .quad 0 4776 | .align 3 4777 | L351: 4778 | .set L$set$104, (L472 - .) + 1275068416 4779 | .long L$set$104 4780 | .long 844016 4781 | .quad 0 4782 | .align 3 4783 | L465: 4784 | .set L$set$105, (L472 - .) + 1140850688 4785 | .long L$set$105 4786 | .long 78032 4787 | .quad 0 4788 | .align 3 4789 | L419: 4790 | .set L$set$106, (L472 - .) + 1275068416 4791 | .long L$set$106 4792 | .long 704752 4793 | .quad 0 4794 | .align 3 4795 | L429: 4796 | .set L$set$107, (L472 - .) + 1275068416 4797 | .long L$set$107 4798 | .long 766192 4799 | .quad 0 4800 | .align 3 4801 | L464: 4802 | .set L$set$108, (L472 - .) + 1140850688 4803 | .long L$set$108 4804 | .long 82128 4805 | .quad 0 4806 | .align 3 4807 | L371: 4808 | .set L$set$109, (L472 - .) + 1275068416 4809 | .long L$set$109 4810 | .long 458992 4811 | .quad 0 4812 | .align 3 4813 | L391: 4814 | .set L$set$110, (L472 - .) + 1275068416 4815 | .long L$set$110 4816 | .long 561392 4817 | .quad 0 4818 | .align 3 4819 | L355: 4820 | .set L$set$111, (L472 - .) + 1275068416 4821 | .long L$set$111 4822 | .long 827632 4823 | .quad 0 4824 | .align 3 4825 | L409: 4826 | .set L$set$112, (L472 - .) + 1275068416 4827 | .long L$set$112 4828 | .long 651504 4829 | .quad 0 4830 | .align 3 4831 | L392: 4832 | .set L$set$113, (L472 - .) + 1275068416 4833 | .long L$set$113 4834 | .long 557296 4835 | .quad 0 4836 | .align 3 4837 | L381: 4838 | .set L$set$114, (L472 - .) + 1275068416 4839 | .long L$set$114 4840 | .long 532720 4841 | .quad 0 4842 | .align 3 4843 | L350: 4844 | .set L$set$115, (L472 - .) + 1275068416 4845 | .long L$set$115 4846 | .long 848112 4847 | .quad 0 4848 | .align 3 4849 | L435: 4850 | .set L$set$116, (L472 - .) + 1409286144 4851 | .long L$set$116 4852 | .long 741632 4853 | .quad 0 4854 | .align 3 4855 | L405: 4856 | .set L$set$117, (L472 - .) + 1275068416 4857 | .long L$set$117 4858 | .long 667888 4859 | .quad 0 4860 | .align 3 4861 | L404: 4862 | .set L$set$118, (L472 - .) + 1275068416 4863 | .long L$set$118 4864 | .long 671984 4865 | .quad 0 4866 | .align 3 4867 | L385: 4868 | .set L$set$119, (L472 - .) + 1275068416 4869 | .long L$set$119 4870 | .long 516336 4871 | .quad 0 4872 | .align 3 4873 | L412: 4874 | .set L$set$120, (L472 - .) + 1275068416 4875 | .long L$set$120 4876 | .long 639216 4877 | .quad 0 4878 | .align 3 4879 | L359: 4880 | .set L$set$121, (L472 - .) + 1275068416 4881 | .long L$set$121 4882 | .long 377072 4883 | .quad 0 4884 | .align 3 4885 | L442: 4886 | .set L$set$122, (L472 - .) + 1140850688 4887 | .long L$set$122 4888 | .long 217296 4889 | .quad 0 4890 | .align 3 4891 | L445: 4892 | .set L$set$123, (L472 - .) + 1140850688 4893 | .long L$set$123 4894 | .long 241872 4895 | .quad 0 4896 | .align 3 4897 | L433: 4898 | .set L$set$124, (L472 - .) + 1275068416 4899 | .long L$set$124 4900 | .long 749808 4901 | .quad 0 4902 | .align 3 4903 | L373: 4904 | .set L$set$125, (L472 - .) + 1275068416 4905 | .long L$set$125 4906 | .long 450800 4907 | .quad 0 4908 | .align 3 4909 | L399: 4910 | .set L$set$126, (L472 - .) + 1275068416 4911 | .long L$set$126 4912 | .long 606448 4913 | .quad 0 4914 | L472: 4915 | .ascii "faster_map.ml\0" 4916 | .align 3 4917 | -------------------------------------------------------------------------------- /results/memory.txt: -------------------------------------------------------------------------------- 1 | Memory usage, megabytes. 2 | 3 | map stack heap total 4 | base 0 67 67 5 | batteries 0 42 42 6 | containers 0 67 67 7 | naive 0 67 67 8 | proposed 0 49 49 9 | stdlib 30 42 72 10 | unrolled 15 42 57 11 | -------------------------------------------------------------------------------- /tester/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name tester) 3 | (flags :standard -w +A) 4 | (ocamlopt_flags :standard -O3) 5 | (libraries core_bench faster-map.functions)) 6 | -------------------------------------------------------------------------------- /tester/tester.ml: -------------------------------------------------------------------------------- 1 | let stack_safe_map_functions = [ 2 | "warmup", 3 | Functions.Naive.tail_recursive_map; 4 | 5 | "naive-tail-recursive", 6 | Functions.Naive.tail_recursive_map; 7 | 8 | "base", 9 | Functions.Existing.base_map; 10 | 11 | "batteries", 12 | Functions.Existing.batteries_map; 13 | 14 | "containers", 15 | Functions.Existing.containers_map; 16 | 17 | "chunked-tail-recursive-12", 18 | Functions.Generated.chunked_tail_recursive_map_12; 19 | 20 | "unrolled-5-chunked-12-hybrid", 21 | Functions.Generated.plain_unrolled_prefix_5 22 | Functions.Generated.chunked_tail_recursive_map_12 1000; 23 | 24 | "tupled", 25 | Functions.Contrib.tupled_map; 26 | ] 27 | 28 | let stack_unsafe_map_functions = [ 29 | "stdlib", 30 | Functions.Naive.stdlib_map; 31 | 32 | "unrolled-5", 33 | Functions.Generated.plain_unrolled_map_5; 34 | ] 35 | 36 | let all_map_functions = 37 | stack_safe_map_functions @ stack_unsafe_map_functions 38 | 39 | 40 | 41 | let list_sizes = 42 | let lower_exponent = 3. in 43 | let upper_exponent = 6. in 44 | let exponent_step = 0.25 in 45 | 46 | let rec generate exponent sizes_acc = 47 | if exponent > upper_exponent then 48 | List.rev sizes_acc 49 | else 50 | let size = int_of_float (10. ** exponent) in 51 | generate (exponent +. exponent_step) (size::sizes_acc) 52 | in 53 | generate lower_exponent [] 54 | 55 | 56 | 57 | let make_map_test name map_function argument : Core_bench.Bench.Test.t = 58 | Core_bench.Bench.Test.create 59 | ~name 60 | (fun () -> 61 | map_function ((+) 1) argument 62 | |> ignore) 63 | 64 | let make_argument_list number_of_elements = 65 | let rec make_list_loop l = function 66 | | n when n <= 0 -> l 67 | | n -> make_list_loop (n::l) (n - 1) 68 | in 69 | make_list_loop [] number_of_elements 70 | 71 | let make_tests map_functions list_sizes : (int * Core.Command.t) list = 72 | list_sizes 73 | |> List.map (fun list_size -> 74 | let argument_list = make_argument_list list_size in 75 | map_functions 76 | |> List.map (fun (name, map_function) -> 77 | make_map_test name map_function argument_list) 78 | |> Core_bench.Bench.make_command 79 | |> fun command -> (list_size, command)) 80 | 81 | 82 | 83 | let () = 84 | make_tests all_map_functions list_sizes 85 | |> List.iter (fun (list_size, test) -> 86 | Printf.printf "With lists of size %i\n%!" list_size; 87 | Core.Command.run test) 88 | --------------------------------------------------------------------------------