From 9d16a0a8fcabc90ea52b848fef547a072903dca9 Mon Sep 17 00:00:00 2001
From: foreman
Date: Mon, 30 Apr 2018 20:38:32 -0400
Subject: [PATCH] P4 to Git Change 1548086 by gandryey@gera-w8 on 2018/04/30
17:47:08
SWDEV-151981 - Removal of CPU support on Windows
- Part 2. Remove files for CPU support: library\x86, library\arm and runtime\device\cpu
Affected files ...
... //depot/stg/opencl/drivers/opencl/library/arm/Makefile#2 delete
... //depot/stg/opencl/drivers/opencl/library/arm/common/Makefile#2 delete
... //depot/stg/opencl/drivers/opencl/library/arm/common/build/Makefile#2 delete
... //depot/stg/opencl/drivers/opencl/library/arm/common/build/Makefile.common#3 delete
... //depot/stg/opencl/drivers/opencl/library/arm/gen/Makefile#2 delete
... //depot/stg/opencl/drivers/opencl/library/arm/gen/build/Makefile#2 delete
... //depot/stg/opencl/drivers/opencl/library/arm/gen/build/Makefile.gen#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/Makefile#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/Makefile#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/build/Makefile#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/build/Makefile.avx#21 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/abs_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/abs_diff_base.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/hadd_base.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/ibuiltins.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/mad_sat_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/max_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/min_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/mul24_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/mul_hi_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/popcnt_base.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/int/rhadd_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/argred32.h#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/argredsmallFv4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/argredsmallFv8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/ceilF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/copysignF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/cosFv4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/cosFv8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/fabsF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/floorF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/madFv8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/math32.h#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/rintF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/rsqrtF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/sinFv4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/sinFv8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/sincosFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/sincosFv8.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/sincosred2Fv4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/sincosred2Fv8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/sqrtF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/tanFv4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/tanFv8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/tanredFv4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/tanredFv8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/trigred32.h#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math32/truncF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/ceilD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/fabsD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/floorD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/madD.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/math64.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/rintD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/rsqrtD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/sqrtD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/math64/truncD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/misc/anyall.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/misc/minmax.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/misc/select.cl#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/avx/src/misc/shuffle.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/Makefile#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/build/Makefile#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/build/Makefile.common#38 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/amdrt/Makefile#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/amdrt/build/Makefile#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/amdrt/build/Makefile.amdrt#25 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/amdrt/cvtL.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/amdrt/divmodL.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/c11_atomics/atomic_fence.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/cdhe.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/cdhn.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/cdhp.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/cdhz.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/cfhe.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/cfhn.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/cfhp.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/cfhz.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/chalf.h#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/chalf/chf.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/clamp.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/cross.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/degrees.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/distance.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/dot.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/fast_distance.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/fast_length.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/fast_normalize.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/length.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/mix.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/normalize.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/sign.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/geom/step.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode1daf.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode1dai.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode1df.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode1di.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode2dadf.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode2dadi.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode2daf.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode2dai.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode2ddf.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode2ddi.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode2df.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode2di.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode3df.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/amode3di.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/dfetch.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/fetchf.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/fetchi.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/fetchui.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/get.cl#13 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/image.h#13 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/imager.h#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/imagew.h#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/lfetch1d.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/lfetch1da.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/lfetch2d.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/lfetch2da.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/lfetch2dad.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/lfetch2dd.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/lfetch3d.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/read.cl#34 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/write.cl#20 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/writef.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/writei.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/image/writeui.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abs_diffs1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abs_diffs2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abs_diffs4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abs_diffs8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abs_diffu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abs_diffu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abs_diffu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abs_diffu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abss1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abss2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abss4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/abss8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/absu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/absu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/absu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/absu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/add_sats1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/add_sats2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/add_sats4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/add_sats8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/add_satu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/add_satu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/add_satu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/add_satu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/clzu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/clzu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/clzu2v8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/clzu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/clzu4v4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/clzu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/clzu8v2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/ctzu1.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/ctzu2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/ctzu2v8.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/ctzu4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/ctzu4v4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/ctzu8.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/ctzu8v2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/hadds1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/hadds2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/hadds4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/hadds8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/haddu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/haddu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/haddu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/haddu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/ibuiltins.h#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad24s4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad24u4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_his1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_his2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_his4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_his8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_hiu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_hiu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_hiu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_hiu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_sats1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_sats2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_sats4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_sats8.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_satu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_satu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_satu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mad_satu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/maxs1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/maxs2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/maxs4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/maxs8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/maxu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/maxu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/maxu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/maxu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mins1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mins2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mins4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mins8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/minu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/minu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/minu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/minu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul24s4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul24u4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul_his1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul_his2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul_his4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul_his8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul_hiu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul_hiu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul_hiu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/mul_hiu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/popcountu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/popcountu2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/popcountu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/popcountu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rhadds1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rhadds2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rhadds4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rhadds8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rhaddu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rhaddu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rhaddu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rhaddu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rotateu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rotateu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rotateu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/rotateu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/sub_sats1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/sub_sats2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/sub_sats4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/sub_sats8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/sub_satu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/sub_satu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/sub_satu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/sub_satu8.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/upsampleu1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/upsampleu2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/int/upsampleu4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/acosF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/acosFv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/acoshF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/acoshFv4.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/acospiF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/acospiFv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/all_half32.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/all_native32.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/argred32.h#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/argredF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/argredsmallF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/argredsmallFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/asinF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/asinFv4.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/asinhF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/asinhFv4.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/asinpiF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/asinpiFv4.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atan2F.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atan2Fv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atan2piF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atan2piFv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atanF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atanFv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atanhF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atanhFv4.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atanpiF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/atanpiFv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/cbrtF.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/cbrtFv4.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/ceilF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/copysignF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/cosF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/cosFv4.cl#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/coshF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/coshFv4.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/cospiF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/cospiFv4.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/cosredF.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/erfF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/exp10F.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/exp10Fv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/exp2F.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/exp2Fv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/expF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/expF_base.h#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/expF_basev4.h#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/expFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/expm1F.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/expm1Fv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fabsF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fdimF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fdimFv4.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/floorF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fmaF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fmaxF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fmaxFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fminF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fminFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fmodF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fractF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fractFv3.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/fractFv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/frexpF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/hypotF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/ilogbF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/ldexpF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/lgammaF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/lgamma_rF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/log10F.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/log10Fv4.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/log1pF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/log1pFv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/log2F.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/log2Fv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/logF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/logF_base.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/logF_basev4.h#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/logFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/logbF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/logbFv4.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/madF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/math32.h#10 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/maxmagF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/maxmagFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/minmagF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/minmagFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/modfF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/nanF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/nextafterF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/powF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/powF_base.h#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/powF_basev4.h#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/powFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/pownF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/pownFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/powrF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/powrFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/remainderF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/remainderF.h#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/remquoF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/rintF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/rootnF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/rootnFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/roundF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/roundFv4.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/rsqrtF.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sinF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sinFv4.cl#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sincosF.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sincosFv4.cl#10 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sincosred2Fv4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sincosredFv4.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sinhF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sinhFv4.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sinpiF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sinpiFv4.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sinredF.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/sqrtF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tanF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tanFv4.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tanhF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tanhFv4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tanpiF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tanpiFv4.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tanredF.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tanredFv4.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/tgammaF.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/trigred32.h#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/truncF.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/vexpandF.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math32/xvexpandF.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/acosD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/acosDv2.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/acoshD.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/acospiD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/acospiDv2.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/all_native64.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/argred64.h#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/argredlargeD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/argredmediumD.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/argredmediumDv2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/asinD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/asinDv2.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/asinhD.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/asinpiD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/asinpiDv2.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/atan2D.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/atan2piD.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/atanD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/atanDv2.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/atanhD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/atanpiD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/atanpiDv2.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/cbrtD.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/ceilD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/copysignD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/cosD.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/cosDv2.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/coshD.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/cospiD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/cospiDv2.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/cosred2D.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/cosred2Dv2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/ep_logD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/ep_logD.h#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/erfD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/erfcD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/exp10D.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/exp10Dv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/exp2D.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/exp2Dv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/expD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/expD_base.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/expD_basev2.h#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/expDv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/expm1D.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/expm1Dv2.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fabsD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fdimD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fdimDv2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/floorD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fmaD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fmaDv2.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fmaxD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fmaxDv2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fminD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fminDv2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fmodD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/fractD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/frexpD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/hypotD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/ilogbD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/ldexpD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/lgammaD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/lgamma_rD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/log10D.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/log10Dv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/log1pD.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/log1pDv2.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/log2D.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/log2Dv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/logD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/logD_base.h#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/logD_basev2.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/logDv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/logbD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/madD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/math64.h#12 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/maxmagD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/minmagD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/modfD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/nanD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/nextafterD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/pibits64.h#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/powD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/powD_base.h#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/powD_basev2.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/powDv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/pownD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/pownDv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/powrD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/powrDv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/remainderD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/remainderD.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/remquoD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/rintD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/rootnD.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/rootnDv2.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/roundD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/rsqrtD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/scale64.h#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sinD.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sinDv2.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sincosD.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sincosDv2.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sinhD.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sinpiD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sinpiDv2.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sinred2D.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sinred2Dv2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/sqrtD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/tanD.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/tanDv2.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/tanhD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/tanpiD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/tanpiDv2.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/tanred2D.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/tanred2Dv2.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/tgammaD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/trigred64.h#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/truncD.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/vexpandD.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/math64/xvexpandD.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/bfe.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/bfm.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/bitalign.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/bytealign.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/lerp.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/max3f.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/max3s.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/max3u.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/med3f.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/med3s.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/med3u.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/media.h#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/min3f.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/min3s.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/min3u.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/mqsad.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/msad.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/pack.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/qsad.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/sad.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/sad4.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/sadd.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/sadhi.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/sadw.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/unpack0.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/unpack1.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/unpack2.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/media/unpack3.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/misc/anyall.cl#10 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/misc/awgcpy.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/misc/minmax.cl#10 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/misc/prefetch.cl#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/misc/workitem.cl#25 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/pipes/commitp.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/pipes/getp.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/pipes/memcpyia.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/pipes/pipes.h#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/pipes/readp.cl#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/pipes/reservep.cl#7 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/pipes/validp.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/pipes/writep.cl#9 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/subgroup/subany.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/subgroup/subbar.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/subgroup/subbcast.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/subgroup/subget.cl#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/subgroup/subreduce.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/subgroup/subscan.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/tables/table_data.h.no#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/tables/table_dump.c.no#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/tables/tables.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/vldst/vldst_gen.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/vldst/vldst_half.cl#8 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/workgroup/wganyall.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/workgroup/wgbarrier.cl#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/workgroup/wgbcast.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/workgroup/wgreduce.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/common/src/workgroup/wgscan.cl#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/Makefile#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/build/Makefile#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/build/Makefile.fma4#14 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/int/ibuiltins.h#5 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/int/mad_sat_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/int/mul24_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/int/rotate_base.cl#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/math32/fmaF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/math32/madF.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/math32/math32.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/math64/fmaD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/math64/madD.cl#4 delete
... //depot/stg/opencl/drivers/opencl/library/x86/fma4/src/math64/math64.h#6 delete
... //depot/stg/opencl/drivers/opencl/library/x86/gen/Makefile#2 delete
... //depot/stg/opencl/drivers/opencl/library/x86/gen/build/Makefile#3 delete
... //depot/stg/opencl/drivers/opencl/library/x86/gen/build/Makefile.gen#22 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/Makefile#3 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/build/Makefile#6 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/build/Makefile.cpu#15 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubinary.cpp#13 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubinary.hpp#6 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubuiltins.cpp#14 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubuiltins.hpp#5 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpucommand.cpp#67 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpucommand.hpp#41 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpudevice.cpp#284 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpudevice.hpp#97 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpufeat.hpp#4 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpukernel.S#4 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpukernel.asm#3 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpukernel.hpp#9 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpumapping.cpp#7 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpumapping.hpp#5 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuprogram.cpp#73 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuprogram.hpp#15 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpusettings.cpp#34 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpusettings.hpp#3 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cputables.hpp#6 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuvirtual.cpp#28 delete
... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuvirtual.hpp#15 delete
---
rocclr/runtime/device/cpu/cpubinary.cpp | 211 ----
rocclr/runtime/device/cpu/cpubinary.hpp | 75 --
rocclr/runtime/device/cpu/cpubuiltins.cpp | 52 -
rocclr/runtime/device/cpu/cpubuiltins.hpp | 19 -
rocclr/runtime/device/cpu/cpucommand.cpp | 609 ----------
rocclr/runtime/device/cpu/cpucommand.hpp | 377 ------
rocclr/runtime/device/cpu/cpudevice.cpp | 1049 -----------------
rocclr/runtime/device/cpu/cpudevice.hpp | 208 ----
rocclr/runtime/device/cpu/cpufeat.hpp | 27 -
rocclr/runtime/device/cpu/cpukernel.S | 87 --
rocclr/runtime/device/cpu/cpukernel.asm | 84 --
rocclr/runtime/device/cpu/cpukernel.hpp | 93 --
rocclr/runtime/device/cpu/cpumapping.cpp | 427 -------
rocclr/runtime/device/cpu/cpumapping.hpp | 45 -
rocclr/runtime/device/cpu/cpuprogram.cpp | 1276 ---------------------
rocclr/runtime/device/cpu/cpuprogram.hpp | 107 --
rocclr/runtime/device/cpu/cpusettings.cpp | 98 --
rocclr/runtime/device/cpu/cpusettings.hpp | 43 -
rocclr/runtime/device/cpu/cputables.hpp | 1010 ----------------
rocclr/runtime/device/cpu/cpuvirtual.cpp | 534 ---------
rocclr/runtime/device/cpu/cpuvirtual.hpp | 69 --
21 files changed, 6500 deletions(-)
delete mode 100644 rocclr/runtime/device/cpu/cpubinary.cpp
delete mode 100644 rocclr/runtime/device/cpu/cpubinary.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpubuiltins.cpp
delete mode 100644 rocclr/runtime/device/cpu/cpubuiltins.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpucommand.cpp
delete mode 100644 rocclr/runtime/device/cpu/cpucommand.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpudevice.cpp
delete mode 100644 rocclr/runtime/device/cpu/cpudevice.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpufeat.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpukernel.S
delete mode 100644 rocclr/runtime/device/cpu/cpukernel.asm
delete mode 100644 rocclr/runtime/device/cpu/cpukernel.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpumapping.cpp
delete mode 100644 rocclr/runtime/device/cpu/cpumapping.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpuprogram.cpp
delete mode 100644 rocclr/runtime/device/cpu/cpuprogram.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpusettings.cpp
delete mode 100644 rocclr/runtime/device/cpu/cpusettings.hpp
delete mode 100644 rocclr/runtime/device/cpu/cputables.hpp
delete mode 100644 rocclr/runtime/device/cpu/cpuvirtual.cpp
delete mode 100644 rocclr/runtime/device/cpu/cpuvirtual.hpp
diff --git a/rocclr/runtime/device/cpu/cpubinary.cpp b/rocclr/runtime/device/cpu/cpubinary.cpp
deleted file mode 100644
index 7e56ed7353..0000000000
--- a/rocclr/runtime/device/cpu/cpubinary.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-//
-// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#include "device/cpu/cpubinary.hpp"
-#include "device/cpu/cpudevice.hpp"
-#include "device/cpu/cpuprogram.hpp"
-#include "utils/versions.hpp"
-#include "os/os.hpp"
-
-#include
-#include
-#include
-#include
-#include
-
-namespace cpu {
-
-ClBinary::FeatureCheckResult ClBinary::checkFeatures() {
- /* Validate that all cpu features of loaded binary target (i.e. elf_target) exists in current
- * target.
- * If some of elf_target features doesn't exist in current target we fail the build since we
- * assume that elf LLVM-IR and binary are
- * target specific and can't be recompiled to current target*/
- uint16_t target = (uint16_t)dev().settings().cpuFeatures_;
- uint16_t elf_target;
- amd::OclElf::oclElfPlatform platform;
- if (!elfIn()->getTarget(elf_target, platform)) {
- LogError("Loading OCL CPU binary: incorrect format");
- return fcERROR;
- }
- uint64_t chip_options = 0x0;
- if (platform == amd::OclElf::COMPLIB_PLATFORM) {
- // BIF 3.0
- uint32_t flag;
- if (!elfIn()->getFlags(flag)) {
- LogError("Loading OCL CPU binary: incorrect format");
- return fcERROR;
- }
- aclTargetInfo tgtInfo = aclGetTargetInfoFromChipID(LP64_SWITCH("x86", "x86-64"), flag, NULL);
- chip_options = aclGetChipOptions(tgtInfo);
- if (((target & chip_options) != chip_options) ||
- ((elf_target == EM_386) && (strcmp(LP64_SWITCH("x86", "x86-64"), "x86") != 0)) ||
- ((elf_target == EM_X86_64) && (strcmp(LP64_SWITCH("x86", "x86-64"), "x86-64") != 0))) {
- LogError("Loading OCL CPU binary: different target");
- return fcERROR;
- }
- } else {
- // BIF 2.0
- if ((platform != amd::OclElf::CPU_PLATFORM) || ((target & elf_target) != elf_target)) {
- LogError("Loading OCL CPU binary: different target");
- return fcERROR;
- }
- }
- char* section;
- size_t sz;
-
- /* If current target has more cpu features than the one for which the binary was (notice it must
- * have all features as in elf_target
- * due to previous check), we can benefit from recompiling the LLVM-IR if exists in binary (if
- * there are errors, ignore them !).*/
- if (((platform == amd::OclElf::CPU_PLATFORM) && ((target ^ elf_target) != 0)) ||
- ((platform == amd::OclElf::COMPLIB_PLATFORM) && ((target ^ chip_options) != 0))) {
- if (elfIn_->getSection(amd::OclElf::LLVMIR, §ion, &sz)) {
- if ((section != NULL) && (sz > 0)) {
- // hasDLL being false to force recompiling
- fcRECOMPILE;
- }
- }
- }
- return fcOK;
-}
-
-bool ClBinary::loadX86(Program& program, std::string& dllName, bool& hasDLL) {
- hasDLL = false;
-
- std::string tempName = amd::Os::getTempFileName();
-
- dllName = tempName + "." WINDOWS_SWITCH("dll", MACOS_SWITCH("dyld", "so"));
-
- switch (checkFeatures()) {
- case fcERROR:
- return false;
- case fcRECOMPILE:
- return true;
- case fcOK:
- // Fallthrough
- break;
- }
-
- char* section;
- size_t sz;
-
- if (!elfIn_->getSection(amd::OclElf::DLL, §ion, &sz)) {
- LogError("Loading OCL CPU binary: error occured!");
- return false;
- }
-
- if ((section == NULL) || (sz == 0)) {
- // hasDLL being false to force recompiling
- return true;
- }
-
- std::fstream f;
- f.open(dllName.c_str(), (std::fstream::out | std::fstream::binary));
-
- if (!f.is_open()) {
-#ifdef _WIN32
- amd::Os::unlink(tempName.c_str());
-#endif // _WIN32
- LogError("Loading OCL CPU binary: cannot open a file!");
- return false;
- }
- f.write(section, sz);
- f.close();
-
- hasDLL = true;
- return true;
-}
-
-bool ClBinary::storeX86(Program& program, std::string& dllName) {
- std::fstream f;
- f.open(dllName.c_str(), (std::fstream::in | std::fstream::binary));
- if (!f.is_open()) {
- return false;
- }
-
- f.seekg(0, std::fstream::end);
- size_t x86CodeSize = f.tellg();
- f.seekg(0, std::fstream::beg);
-
- if (saveISA()) {
- char* x86Code = new char[x86CodeSize];
- f.read(x86Code, x86CodeSize);
- elfOut_->addSection(amd::OclElf::DLL, x86Code, x86CodeSize);
- delete[] x86Code;
- }
- f.close();
- return true;
-}
-
-bool ClBinary::loadX86JIT(Program& program, bool& hasJITBinary) {
- hasJITBinary = false;
-
- switch (checkFeatures()) {
- case fcERROR:
- return false;
- case fcRECOMPILE:
- return true;
- case fcOK:
- // Fallthrough
- break;
- }
-
- char* section;
- size_t sz;
-
- if (!elfIn_->getSection(amd::OclElf::JITBINARY, §ion, &sz)) {
- LogError("Loading OCL CPU JIT binary: error occured!");
- return false;
- }
-
- if ((section == NULL) || (sz == 0)) {
- // force recompiling
- return true;
- }
- acl_error err = ACL_SUCCESS;
- program.setJITBinary(aclJITObjectImageCopy(program.compiler(), section, sz, &err));
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageCopy failed");
- return false;
- }
- hasJITBinary = true;
- return true;
-}
-
-void checkDifference(const char* buf1, const char* buf2, size_t size) {
- for (size_t i = 0; i < size; ++i) {
- if (buf1[i] != buf2[i]) {
- printf("Index %d different", (int)i);
- return;
- }
- }
-}
-bool ClBinary::storeX86JIT(Program& program) {
- if (saveISA()) {
- acl_error err = ACL_SUCCESS;
- aclJITObjectImage objectImage = program.getJITBinary();
- size_t x86CodeSize = aclJITObjectImageSize(program.compiler(), objectImage, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageSize failed");
- return false;
- }
- const char* x86CodePtr = aclJITObjectImageData(program.compiler(), objectImage, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageData failed");
- return false;
- }
- elfOut_->addSection(amd::OclElf::JITBINARY, x86CodePtr, x86CodeSize);
- }
- return true;
-}
-
-bool ClBinary::storeX86Asm(const char* buffer, size_t size) {
- if (saveAS()) {
- elfOut_->addSection(amd::OclElf::ASTEXT, buffer, size);
- }
- return true;
-}
-
-} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpubinary.hpp b/rocclr/runtime/device/cpu/cpubinary.hpp
deleted file mode 100644
index 96bb4eb88b..0000000000
--- a/rocclr/runtime/device/cpu/cpubinary.hpp
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef CPUBINARY_HPP_
-#define CPUBINARY_HPP_
-
-#include "top.hpp"
-#include "device/device.hpp"
-#include "device/cpu/cpudevice.hpp"
-#include "elf/elf.hpp"
-
-//! \namespace cpu CPU Device Implementation
-namespace cpu {
-
-class Device;
-class Program;
-
-//! \class CPU binary
-class ClBinary : public device::ClBinary {
- public:
- //! Constructor
- ClBinary(const Device& dev) : device::ClBinary(dev) {}
-
- //! Destructor
- ~ClBinary() {}
-
- //! Loads x86 executable code
- bool loadX86(Program& prorgam, //!< CPU Program object
- std::string& dllName, //!< Dll name of the CPU binary
- bool& hasDLL //!< indicate if the OCL binary has DLL
- );
-
- //! Stores x86 executable code
- bool storeX86(Program& program, //!< CPU Program object
- std::string& dllName //!< Dll name for the binary
- );
-
- //! Loads x86 executable in-memory code
- bool loadX86JIT(Program& prorgam, //!< CPU Program object
- bool& hasJITBin //!< indicate if the OCL binary has JIT binary
- );
-
- //! Stores x86 executable in-memory code
- bool storeX86JIT(Program& program //!< CPU Program object
- );
-
- //! Set elf header information for CPU target
- bool setElfTarget() {
- uint32_t target = dev().settings().cpuFeatures_;
- assert(((0xFFFF8000 & target) == 0) && "ASIC target ID >= 2^15");
- uint16_t elf_target = (uint16_t)(0x7FFF & target);
- return elfOut()->setTarget(elf_target, amd::OclElf::CPU_PLATFORM);
- }
-
- bool storeX86Asm(const char* buffer, size_t size);
-
- private:
- enum FeatureCheckResult { fcERROR, fcRECOMPILE, fcOK };
-
- FeatureCheckResult checkFeatures();
-
- //! Disable default copy constructor
- ClBinary(const ClBinary&);
-
- //! Disable default operator=
- ClBinary& operator=(const ClBinary&);
-
- //! Returns the GPU device for this object
- const Device& dev() { return static_cast(dev_); }
-};
-
-} // namespace cpu
-
-#endif // CPUBINARY_HPP_
diff --git a/rocclr/runtime/device/cpu/cpubuiltins.cpp b/rocclr/runtime/device/cpu/cpubuiltins.cpp
deleted file mode 100644
index b366134ad9..0000000000
--- a/rocclr/runtime/device/cpu/cpubuiltins.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#include "device/cpu/cpubuiltins.hpp"
-#include "device/cpu/cpucommand.hpp"
-
-#include
-#include // for printf
-#include
-
-#define BUF_SIZE_PRINTF 4095
-// In the current implementation of printf in gcc 4.5.2 runtime libraries,inf/infinity and nan are
-// not supported
-// The [-]infinity value is printed as [-]1.#INF00
-// The [-]nan value is printed as [-]1.#INF00
-// bufOutUpdate converts the all printed instanced of [-]1.#INF00 to inf,and
-// all printed instanced of [-]1.#IND00 to nan
-void bufOutUpdate(std::string& sBufOut, const char* strToReplace, const char* strReplace) {
- size_t foundIdx = 0;
- while ((foundIdx = sBufOut.find(strToReplace, foundIdx)) != std::string::npos) {
- sBufOut.replace(foundIdx, strlen(strToReplace), strReplace, strlen(strReplace));
- foundIdx += 3;
- }
-}
-int cpuprintf(const char* format, ...) {
- char cBufOut[BUF_SIZE_PRINTF];
- std::string sBufOut;
- va_list args;
- va_start(args, format);
- // write to the buffer
- vsprintf(cBufOut, format, args);
- sBufOut = cBufOut;
-
- // convert to correct infinity/nan representation
- bufOutUpdate(sBufOut, "1.#INF00", "inf");
- bufOutUpdate(sBufOut, "1.#IND00", "nan");
- bufOutUpdate(sBufOut, "1.#QNAN0", "nan");
- int ret = amd::Os::printf("%s", sBufOut.c_str());
- fflush(stdout);
- va_end(args);
- return ret;
-}
-namespace cpu {
-
-const clk_builtins_t Builtins::dispatchTable_ = {
- /* Synchronization functions */
- &WorkItem::barrier,
- /* AMD Only builtins: FIXME_lmoriche: remove or add an extension */
- NULL, cpuprintf};
-
-} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpubuiltins.hpp b/rocclr/runtime/device/cpu/cpubuiltins.hpp
deleted file mode 100644
index f50854e7b1..0000000000
--- a/rocclr/runtime/device/cpu/cpubuiltins.hpp
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef BUILTINS_HPP_
-#define BUILTINS_HPP_
-
-#include "top.hpp"
-#include "amdocl/cl_kernel.h"
-
-namespace cpu {
-
-struct Builtins : public amd::AllStatic {
- static const clk_builtins_t dispatchTable_;
-};
-
-} // namespace cpu
-
-#endif /*BUILTINS_HPP_*/
diff --git a/rocclr/runtime/device/cpu/cpucommand.cpp b/rocclr/runtime/device/cpu/cpucommand.cpp
deleted file mode 100644
index 95ca23fa70..0000000000
--- a/rocclr/runtime/device/cpu/cpucommand.cpp
+++ /dev/null
@@ -1,609 +0,0 @@
-//
-// Copyright 2010 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#include "device/cpu/cpucommand.hpp"
-#include "device/cpu/cpubuiltins.hpp"
-#include "device/cpu/cpudevice.hpp"
-#include "device/cpu/cputables.hpp"
-#include "platform/command.hpp"
-#include "platform/commandqueue.hpp"
-#include "platform/program.hpp"
-#include "platform/kernel.hpp"
-#include "platform/sampler.hpp"
-#include "thread/thread.hpp"
-#include "os/os.hpp"
-#include "utils/util.hpp"
-#include "utils/options.hpp"
-
-#include
-#include
-
-namespace cpu {
-
-#define CPU_WORKER_THREAD_TOTAL_STACK_SIZE \
- (CPU_WORKER_THREAD_STACK_SIZE + CLK_PRIVATE_MEMORY_SIZE * (CPU_MAX_WORKGROUP_SIZE + 1))
-
-WorkerThread::WorkerThread(const cpu::Device& device)
- : Thread("CPU Worker Thread", CPU_WORKER_THREAD_TOTAL_STACK_SIZE),
- queueLock_("WorkerThread::queueLock"),
- waitingOp_(0),
- terminated_(false) {
- localDataSize_ = (size_t)device.info().localMemSize_;
- localDataStorage_ =
- (address)amd::AlignedMemory::allocate(localDataSize_ + __CPU_SCRATCH_SIZE, sizeof(cl_long16));
-
-#if defined(__linux__) && defined(NUMA_SUPPORT)
- const nodemask_t* numaMask = device.getNumaMask();
- if (numaMask != NULL) {
- numa_bind(numaMask);
- }
-#endif
-}
-
-WorkerThread::~WorkerThread() {
- guarantee(Thread::current() != this && "thread suicide!");
- amd::AlignedMemory::deallocate(localDataStorage_);
-}
-
-bool WorkerThread::terminate() {
- terminated_ = true;
-
- if (Thread::current() != this) {
- // FIXME_lmoriche: fix termination handshake
- while (state() < Thread::FINISHED) {
- flush();
- amd::Os::yield();
- }
- }
-
- return true;
-}
-
-void WorkerThread::enqueue(Operation& op) {
- while (waitingOp_ != 0) {
- amd::Os::yield();
- }
- op.clone(operation());
- ++waitingOp_;
-}
-
-void WorkerThread::loop() {
- baseWorkItemsStack_ =
- amd::alignDown(stackBase() - CPU_WORKER_THREAD_STACK_SIZE, CLK_PRIVATE_MEMORY_SIZE);
-#if defined(WIN32)
- amd::Os::touchStackPages(baseWorkItemsStack_, amd::Os::currentStackPtr());
-#endif // WINDOWS
- Operation* op = operation();
-
- queueLock_.lock();
- while (true) {
- while (waitingOp_ == 0) {
- if (terminated_) {
- break;
- }
- queueLock_.wait();
- }
- if (terminated_) {
- break;
- }
- op->command().setStatus(CL_RUNNING);
- op->execute();
- op->cleanup();
- --waitingOp_;
- }
- queueLock_.unlock();
-}
-
-void NativeFn::execute() {
- cl_int status = static_cast(command()).invoke();
- command().setStatus(status);
-}
-
-static void nop() { /*Do nothing*/
-}
-
-
-template
-class NDRangeKernelBatchMode : public NDRangeKernelBatch {
- private:
- void executeWorkGroup(WorkGroup& wg) {
- if (NATURE == NATURE_WG_LEVEL_EXEC) {
- wg.executeWorkItem();
- } else if ((NATURE == NATURE_1_WORK_ITEM) || (wg.getNumWorkItems() == 1)) {
- wg.executeWorkItem();
- } else {
- wg.getBaseWorkItem()->setNext(&wg.getWorkerThread().mainFiber());
- if (NATURE == NATURE_WITHOUT_BARRIER) {
- wg.executeWithoutBarrier();
- } else { // NATURE == NATURE_WITH_BARRIER
- wg.executeWithBarrier();
- }
- }
- // Yield at the end of each workgroup to avoid starving GPU device
- amd::Os::yield();
- }
-
- public:
- void executeMode(WorkGroup& wg) {
- const amd::NDRange& offset = static_cast(command_).sizes().offset();
- WorkItem* workItem0 = wg.getBaseWorkItem();
- clk_builtins_t tableTask;
- size_t prevOpId = 0, opId = (size_t)-1;
-
- if (NATURE == NATURE_1_WORK_ITEM) {
- tableTask = Builtins::dispatchTable_;
-
- // If local size == 1 then barrier() becomes a nop.
- tableTask.barrier_ptr = (void (*)(cl_mem_fence_flags))nop;
- workItem0->infoBlock().builtins = &tableTask;
- workItem0->setNext(&wg.getWorkerThread().mainFiber());
- }
-
- while (getNextOperationId(opId)) {
- workItem0->incrementGroupId(groupIds_, offset, opId - prevOpId);
- uint workDims = workItem0->infoBlock().work_dim;
- size_t numWorkItems = workItem0->infoBlock().local_size[0] *
- (workDims >= 2 ? workItem0->infoBlock().local_size[1] : 1) *
- (workDims >= 3 ? workItem0->infoBlock().local_size[2] : 1);
- wg.setNumWorkItems(numWorkItems);
- if (numWorkItems == 1) {
- tableTask = Builtins::dispatchTable_;
- tableTask.barrier_ptr = (void (*)(cl_mem_fence_flags))nop;
- workItem0->infoBlock().builtins = &tableTask;
- workItem0->setNext(&wg.getWorkerThread().mainFiber());
- executeWorkGroup(wg);
- tableTask.barrier_ptr = &WorkItem::barrier;
- } else {
- executeWorkGroup(wg);
- }
- prevOpId = opId;
- }
-
-//#define DISABLE_TASK_STEALING
-#if !defined(DISABLE_TASK_STEALING) && 0
- size_t maxId = numCores_;
- size_t stolenId = coreId_ + 1;
- NDRangeKernelBatch* workingBatch = this;
- size_t numStolenIds = 1;
- const size_t maxStealingSize = 3;
- const size_t minAdaptiveStealingDiff = numCores_ * maxStealingSize;
-
- while (true) {
- for (; stolenId < maxId; ++stolenId) {
- WorkerThread* worker = virtualDevice_.getWorkerThread(stolenId);
-
- // In case were we have less operations than Worker Threads
- if (worker->isOperationValid()) {
- workingBatch = static_cast(worker->operation());
-
- numStolenIds = workingBatch->getNextOperationIds(opId, numStolenIds);
- if (numStolenIds > 0) {
- do {
- for (size_t i = 0; i < numStolenIds; ++i) {
- workItem0->setGroupId(groupIds_, offset, opId);
- executeWorkGroup(wg);
- opId += numCores_;
- }
-
- // adaptive stealing
- if (numWorkGroups_ - opId > minAdaptiveStealingDiff) {
- numStolenIds = maxStealingSize;
- } else {
- while (workingBatch->getNextOperationId(opId)) {
- workItem0->setGroupId(groupIds_, offset, opId);
- executeWorkGroup(wg);
- }
- break;
- }
- numStolenIds = workingBatch->getNextOperationIds(opId, numStolenIds);
- } while (numStolenIds > 0);
- }
- numStolenIds = 1;
- }
- } // for (stolenId..maxId)
-
- if (stolenId == coreId_) {
- break;
- }
-
- stolenId = 0;
- maxId = coreId_;
- } // while (true)
-#endif
- }
-};
-
-
-inline bool NDRangeKernelBatch::getNextOperationId(size_t& opId) {
- if (currentOpId_ >= numWorkGroups_) {
- return false;
- }
- opId = amd::AtomicOperation::add(numCores_, ¤tOpId_);
- return opId < numWorkGroups_;
-}
-
-
-inline size_t NDRangeKernelBatch::getNextOperationIds(size_t& opId, size_t count) {
- size_t topId = numCores_ * count;
- if (currentOpId_ >= numWorkGroups_) {
- return 0;
- }
-
- opId = amd::AtomicOperation::add(topId, ¤tOpId_);
- const size_t numWorkGroups = numWorkGroups_;
- if (opId >= numWorkGroups) {
- return 0;
- }
-
- topId += opId;
- if (topId >= (numWorkGroups + numCores_)) {
- count -= (topId - numWorkGroups) / numCores_;
- }
-
- return count;
-}
-
-// Process the parameters, allocate LDS.
-bool NDRangeKernelBatch::patchParameters(const cpu::Kernel& cpuKernel, address params,
- address& localMemPtr, const address localMemLimit,
- size_t localMemSize) const {
- amd::NDRangeKernelCommand& command = static_cast(command_);
-
- const amd::Device& device = command.queue()->device();
-
- const amd::Kernel& kernel = command.kernel();
- const amd::KernelSignature& signature = kernel.signature();
- const amd::KernelParameters& kernelParam = kernel.parameters();
-
- const_address cmdParams = command.parameters();
-
- unsigned effectiveOffset = 0;
-
- // DD -- on CPU device, real effective offset is NATIVELY aligned
- // Here all source arguments are in place, so we're safe just iterating
- for (size_t i = 0; i < signature.numParameters(); ++i) {
- const amd::KernelParameterDescriptor& desc = signature.at(i);
- const void* cmdParam = cmdParams + desc.offset_;
- void* param;
- size_t prmSize = cpuKernel.getArgSize(i);
-
- // Align i'th parameter on multiple of its size. Parameter size is power of 2.
- size_t alignment = cpuKernel.getArgAlignment(i);
- effectiveOffset = amd::alignUp(effectiveOffset, std::min(alignment, size_t(16)));
- param = params + effectiveOffset;
- if (desc.size_ == 0) {
- // __local memory parameter
- localMemPtr = amd::alignUp(localMemPtr, sizeof(cl_long16));
-
- size_t length = *static_cast(cmdParam);
- *static_cast(param) = localMemPtr;
- localMemPtr += length;
-
- if (localMemPtr > localMemLimit) {
- command.setException(CL_MEM_OBJECT_ALLOCATION_FAILURE);
- return false;
- }
- } else if (desc.type_ == T_POINTER) {
- // __global memory parameter
- cl_mem_object_type pointer_type = CL_MEM_OBJECT_BUFFER;
- if (kernelParam.boundToSvmPointer(device, cmdParams, i)) {
- *reinterpret_cast(param) = *reinterpret_cast(cmdParam);
- } else {
- void* hostMemPtr = NULL;
- amd::Memory* memArg = *reinterpret_cast(cmdParam);
- if (memArg != NULL) {
- hostMemPtr = memArg->getHostMem();
- if (hostMemPtr == NULL) {
- command.setException(CL_MEM_OBJECT_ALLOCATION_FAILURE);
- return false;
- }
- pointer_type = memArg->getType();
- }
- // For images on CPU devices, pass "struct {int4 p0; int4 p1}".
- // That allows an obvious implementation for
- // __amdil_get_image[23]d_params[01].
- // That makes the rest of the .bc implementation for
- // images relatively straight forward.
- if (pointer_type == CL_MEM_OBJECT_IMAGE1D || pointer_type == CL_MEM_OBJECT_IMAGE2D ||
- pointer_type == CL_MEM_OBJECT_IMAGE3D || pointer_type == CL_MEM_OBJECT_IMAGE1D_ARRAY ||
- pointer_type == CL_MEM_OBJECT_IMAGE1D_BUFFER ||
- pointer_type == CL_MEM_OBJECT_IMAGE2D_ARRAY) {
- amd::Image::Impl& impl = memArg->asImage()->getImpl();
- impl.reserved_ = hostMemPtr;
- *reinterpret_cast(param) = (void*)&impl;
- } else {
- *reinterpret_cast(param) = hostMemPtr;
- }
- }
- } else if (desc.type_ == T_SAMPLER) {
- // Switch from an Amd::Sampler to the 32bit integer
- // variable that is a clk_sampler.
- amd::Sampler* samplerArg = *reinterpret_cast(cmdParam);
- *reinterpret_cast(param) = (uint32_t)samplerArg->state();
- } else {
- // Using HCtoDCmap
- HCtoDCmap arg_map = cpuKernel.getHCtoDCmap(i);
- unsigned int arg_offset = effectiveOffset;
- int err_code = 0;
- int inStruct = 0;
- int sys_64bit = LP64_SWITCH(0, 1); // Mapping only required for 32 bit targets
- if (CPU_USE_ALIGNMENT_MAP == 0 && !sys_64bit) {
- effectiveOffset += arg_map.copy_params(param, cmdParam, arg_offset, err_code, inStruct);
- if (err_code) {
- return false;
- }
- prmSize = arg_map.dc_size;
- } else {
- ::memcpy(param, cmdParam, desc.size_);
- }
- }
- effectiveOffset += prmSize;
- }
-
- localMemPtr = amd::alignUp(localMemPtr, sizeof(cl_long16));
- if ((localMemPtr + localMemSize) > localMemLimit) {
- command.setException(CL_MEM_OBJECT_ALLOCATION_FAILURE);
- return false;
- }
-
- return true;
-}
-
-void NDRangeKernelBatch::execute() {
- amd::NDRangeKernelCommand& command = static_cast(command_);
-
- const cpu::Kernel& kernel =
- static_cast(*command.kernel().getDeviceKernel(command.queue()->device()));
-
- WorkerThread& thread = *WorkerThread::current();
-
- const size_t numWorkItems = command.sizes().local().product();
-
- address params = thread.baseWorkItemsStack();
- address baseLocalMemPtr = thread.localDataStorage();
- address patchedLocalMemPtr = thread.localDataStorage() + __CPU_SCRATCH_SIZE;
- if (!patchParameters(kernel, params, patchedLocalMemPtr,
- patchedLocalMemPtr + thread.localDataSize(),
- kernel.workGroupInfo()->localMemSize_)) {
- return;
- }
-
- WorkItem* workItem0 =
- ::new ((WorkItem*)params - 1) WorkItem(command.sizes(), baseLocalMemPtr, patchedLocalMemPtr);
-
- WorkGroup wg(command, kernel, thread, params, workItem0, numWorkItems);
-
- if (numWorkItems == 1) {
- static_cast*>(this)->executeMode(wg);
- } else if (kernel.hasBarrier()) {
- static_cast*>(this)->executeMode(wg);
- } else {
- static_cast*>(this)->executeMode(wg);
- }
-}
-
-void WorkGroup::executeWorkItem() {
- callKernel((kernelentrypoint_t)kernel_.getEntryPoint(), workItem0_->nativeStackPtr());
-}
-
-void WorkGroup::executeWithBarrier() {
- kernelentrypoint_t entryPoint = (kernelentrypoint_t)kernel_.getEntryPoint();
-
- workingFiber_ = workItem0_;
- address workGroupStackPtr = workItem0_->nativeStackPtr();
-
- // Save the current stack context in case we execute a barrier.
- volatile size_t threadCounter = 0;
- bool barrier = !thread_.mainFiber().save();
-
- size_t tid = threadCounter++;
- WorkItem* workItem = (WorkItem*)((char*)workItem0_ - tid * CLK_PRIVATE_MEMORY_SIZE);
-
- if (barrier) {
- WorkItem* prev = (WorkItem*)((char*)workItem + CLK_PRIVATE_MEMORY_SIZE);
-
- WINDOWS_ONLY(amd::Os::touchStackPages((address)(workItem + 1), (address)prev));
- ::memcpy(workItem, prev, sizeof(WorkItem));
-
- clk_thread_info_block_t& tib = workItem->infoBlock();
- ++tib.local_id[0];
- if (unlikely(tib.local_id[0] >= tib.local_size[0])) {
- //
- // Compiling for Windows 64bit (only in release) introduces a bug,
- // which uses the same register for saving threadCounter and the
- // 0 value. Therefore "tib.local_id[i] = 0" was actually translated
- // to "tib.local_id[0] = threadCounter". To avoid this issue, and
- // still be able to store a 0 into tib.local_id[i], we trick the
- // compiler, by using the value in tib.local_id[3], which is always
- // initialized to 0.
- //
- tib.local_id[0] = tib.local_id[3];
-
- ++tib.local_id[1];
- if (unlikely(tib.local_id[1] >= tib.local_size[1])) {
- tib.local_id[1] = tib.local_id[3];
-
- ++tib.local_id[2];
- }
- }
-
- // Link the previous workitem to this one.
- prev->setNext(workItem);
- // If this is the last workitem, complete the ring.
- if (tid >= numWorkItems_ - 1) {
- workItem->setNext(workItem0_);
- }
- }
-
- // Execute thread0
-
- address workItemStackPtr = workItem->nativeStackPtr();
- callKernelProtectedReturn(entryPoint, workItemStackPtr);
-
- // Check if thread0 executed a barrier()
- if (threadCounter > 1) {
- workItem = (WorkItem*)workingFiber_;
- workingFiber_ = workingFiber_->next();
-
- tid = ((address)workItem0_ - (address)workItem) / CLK_PRIVATE_MEMORY_SIZE;
- if (tid == (numWorkItems_ - 1)) {
- // If we get here, we are done!
- return;
- }
- if (workItem->next() == &thread_.mainFiber()) {
- // Detected a deadlock
- command_.setException(CL_INVALID_KERNEL);
- return;
- }
-
- // Schedule the next workitem.
- workItem->next()->restore();
- ShouldNotReachHere();
- }
-
- // Execute thread1...threadN
- callKernelRange(entryPoint, workItemStackPtr, workItem->infoBlock());
-}
-
-void WorkGroup::executeWithoutBarrier() {
- kernelentrypoint_t entryPoint = (kernelentrypoint_t)kernel_.getEntryPoint();
- address workItemStackPtr = workItem0_->nativeStackPtr();
-
- // Execute thread0
- callKernel(entryPoint, workItemStackPtr);
-
- // Execute thread1...threadN
- callKernelRange(entryPoint, workItemStackPtr, workItem0_->infoBlock());
-}
-
-void WorkGroup::callKernelRange(kernelentrypoint_t entryPoint, address stackPtr,
- clk_thread_info_block_t& tib) {
- while (true) {
- ++tib.local_id[0];
- if (unlikely(tib.local_id[0] >= tib.local_size[0])) {
- tib.local_id[0] = 0;
-
- ++tib.local_id[1];
- if (unlikely(tib.local_id[1] >= tib.local_size[1])) {
- tib.local_id[1] = 0;
-
- ++tib.local_id[2];
- if (unlikely(tib.local_id[2] >= tib.local_size[2])) {
- tib.local_id[2] = 0;
-
- return;
- }
- }
- }
-
- callKernel(entryPoint, stackPtr);
- }
-}
-
-WorkItem::WorkItem(const amd::NDRangeContainer& sizes, void* scratchMemPtr, void* localMemPtr) {
- const amd::NDRange& local = sizes.local();
- const amd::NDRange& global = sizes.global();
- const amd::NDRange& offset = sizes.offset();
- const size_t dims = sizes.dimensions();
-
- tib_.builtins = &Builtins::dispatchTable_;
- tib_.local_mem_base = localMemPtr;
- tib_.local_scratch = scratchMemPtr;
- tib_.table_base = (const void*)cpuTables;
- tib_.work_dim = (cl_uint)sizes.dimensions();
-
- for (size_t i = 0; i < dims; ++i) {
- tib_.global_offset[i] = offset[i];
- tib_.global_size[i] = global[i];
- tib_.local_size[i] = local[i];
- tib_.enqueued_local_size[i] = local[i];
- tib_.local_id[i] = 0;
- tib_.group_id[i] = 0;
- }
-
- // Fill the remaining dimensions.
- for (size_t i = dims; i < sizeof(tib_.global_size) / sizeof(size_t); ++i) {
- tib_.global_offset[i] = 0;
- tib_.global_size[i] = 1;
- tib_.local_size[i] = 1;
- tib_.enqueued_local_size[i] = 1;
- tib_.local_id[i] = 0;
- tib_.group_id[i] = 0;
- }
-}
-
-ALWAYSINLINE void WorkItem::setGroupId(const amd::NDRange& rangeLimits, const amd::NDRange& offset,
- size_t n) {
- const size_t dims = rangeLimits.dimensions();
- for (size_t i = 0; i < dims; ++i) {
- size_t lim = rangeLimits[i];
- size_t& val = tib_.group_id[i];
- val = n;
- if (n < lim) {
- tib_.global_offset[i] = offset[i] + val * tib_.enqueued_local_size[i];
- tib_.local_id[i] = 0;
- tib_.local_size[i] = std::min(tib_.enqueued_local_size[i],
- tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
-
- ++i;
- for (; i < dims; ++i) {
- tib_.global_offset[i] = offset[i];
- tib_.local_id[i] = 0;
- tib_.group_id[i] = 0;
- }
- break;
- } else {
- n /= lim;
- val -= n * lim;
- tib_.global_offset[i] = offset[i] + val * tib_.enqueued_local_size[i];
- tib_.local_id[i] = 0;
- tib_.local_size[i] = std::min(tib_.enqueued_local_size[i],
- tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
- }
- }
-}
-
-ALWAYSINLINE void WorkItem::incrementGroupId(const amd::NDRange& rangeLimits,
- const amd::NDRange& offset, size_t n) {
- const size_t dims = rangeLimits.dimensions();
- for (size_t i = 0; i < dims; ++i) {
- size_t lim = rangeLimits[i];
- size_t& val = tib_.group_id[i];
- val += n;
- if (val < lim) {
- tib_.global_offset[i] = offset[i] + val * tib_.enqueued_local_size[i];
- tib_.local_id[i] = 0;
- tib_.local_size[i] = std::min(tib_.enqueued_local_size[i],
- tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
- break;
- } else {
- n = val / lim;
- val -= n * lim;
- tib_.global_offset[i] = offset[i] + val * tib_.enqueued_local_size[i];
- tib_.local_id[i] = 0;
- tib_.local_size[i] = std::min(tib_.enqueued_local_size[i],
- tib_.global_size[i] - (val * tib_.enqueued_local_size[i]));
- }
- }
-}
-
-void WorkItem::barrier(cl_mem_fence_flags flags) {
- WorkItem* workItem = WorkItem::current();
- workItem->swap(workItem->next());
-}
-
-void Operation::cleanup() {
- cl_int lastException = command().exception();
- cl_int status = (lastException != 0) ? lastException : CL_COMPLETE;
-
- Counter* counter = reinterpret_cast(command().data());
- if (counter == NULL) {
- command().setStatus(status);
- } else if (counter->decrement() == 0) {
- counter->event().setStatus(status);
- }
-}
-
-} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpucommand.hpp b/rocclr/runtime/device/cpu/cpucommand.hpp
deleted file mode 100644
index d5b4e35e83..0000000000
--- a/rocclr/runtime/device/cpu/cpucommand.hpp
+++ /dev/null
@@ -1,377 +0,0 @@
-//
-// Copyright 2010 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef OPERATION_HPP_
-#define OPERATION_HPP_
-
-#include "top.hpp"
-#include "device/cpu/cpudevice.hpp"
-#include "device/cpu/cpukernel.hpp"
-#include "platform/command.hpp"
-#include "thread/thread.hpp"
-#include "os/os.hpp"
-#include "amdocl/cl_kernel.h"
-
-#if defined(ATI_ARCH_ARM)
-#include
-#endif // ATI_ARCH_ARM
-
-namespace cpu {
-
-/*! \addtogroup CPU
- * @{
- *
- * \addtogroup CPUExec Execution environment
- * @{
- */
-
-//! A saved stack context
-class StackContext : public amd::StackObject {
- private:
-#if defined(ATI_ARCH_ARM)
- jmp_buf env_;
-#elif defined(_WIN64)
- intptr_t __declspec(align(16)) regs_[32];
-#else // !_WIN64
- intptr_t regs_[LP64_SWITCH(6, 8)];
-#endif // !_WIN64
-
- public:
- //! Save the stack context. Return 0 if returning directly.
- inline intptr_t setjmp();
-
- //! Restore the stack context
- inline void longjmp(intptr_t val) const;
-};
-
-//! A thread fiber
-class Fiber : public amd::StackObject {
- private:
- //! Next fiber in the thread.
- Fiber* next_;
-
- //! This fiber's saved state.
- StackContext context_;
-
- public:
- //! Construct a new Fiber
- Fiber() : next_(NULL) {}
-
- //! Return the next fiber in the current thread.
- const Fiber* next() const { return next_; }
- //! Set the next fiber in the current thread.
- void setNext(Fiber* next) { next_ = next; }
-
- //! Save the state of this fiber. Return true if directly returning.
- ALWAYSINLINE bool save() { return context_.setjmp() == 0; }
- //! Restore this fiber from the saved context.
- void restore() const { context_.longjmp(1); }
-
- //! Switch to the given fiber.
- void swap(const Fiber* fiber) {
- if (save()) {
- fiber->restore();
- }
- }
-};
-
-
-//! A CPU core operation (enqueued in the worker thread queue)
-class Operation : public amd::HeapObject {
- public:
- //! An atomic counter
- class Counter {
- // FIXME_lmoriche: recycle the counters, implement a thread local pool.
- private:
- amd::Event& event_;
- //! The atomic counter value.
- amd::Atomic counter_;
-
- public:
- //! Initialize the counter with the given initial value.
- Counter(amd::Event& event, size_t initialValue) : event_(event), counter_(initialValue) {}
- //! Return the event associated with this counter.
- amd::Event& event() { return event_; }
- //! Decrement the counter and return the new value.
- size_t decrement() { return --counter_; }
- };
-
- protected:
- amd::Command& command_;
-
- public:
- Operation(amd::Command& command) : command_(command) {}
-
- virtual ~Operation(){};
-
- virtual void clone(Operation* buf) = 0;
-
- void cleanup();
-
- amd::Command& command() { return command_; }
-
- virtual void execute() = 0;
-};
-
-/*! @}
- * \defgroup CPUOperations Operations
- * @{
- */
-
-//! A work item instance
-class WorkItem : public Fiber {
- private:
- //! Thread info block (must be the last field).
- clk_thread_info_block_t tib_;
-
- private:
- //! Cannot be deleted (allocated with placement new).
- void operator delete(void*) { ShouldNotCallThis(); }
-
- public:
- //! Initialize this workgroup.
- WorkItem(const amd::NDRangeContainer& size, void* scratchMemPtr, void* localMemPtr);
-
- //! Return the current WorkItem (based of the current stack pointer).
- static WorkItem* current() {
- return (WorkItem*)amd::alignUp((intptr_t)amd::Os::currentStackPtr(), CLK_PRIVATE_MEMORY_SIZE) -
- 1;
- }
-
- clk_thread_info_block_t& infoBlock() { return tib_; }
-
- //! Return the native stack pointer base for this workitem.
- address nativeStackPtr() const {
- address newSp = amd::alignDown((address) this - CPUKERNEL_STACK_ALIGN, CPUKERNEL_STACK_ALIGN);
- WINDOWS_ONLY(NOT_WIN64(newSp += sizeof(void*)));
- return newSp;
- }
-
- //! These functions are mapping "n" from 1d index to the required dimension
- inline void setGroupId(const amd::NDRange& rangeLimits, const amd::NDRange& offset, size_t n);
- inline void incrementGroupId(const amd::NDRange& rangeLimits, const amd::NDRange& offset,
- size_t n);
-
- //! Execute a thread synchronization barrier.
- static void barrier(cl_mem_fence_flags flags);
-};
-
-typedef void (*kernelentrypoint_t)(const void*);
-
-//! Execute a workgroup (work-items).
-class WorkGroup {
- private:
- amd::NDRangeKernelCommand& command_;
- const cpu::Kernel& kernel_;
- WorkerThread& thread_;
- address params_;
- WorkItem* const workItem0_;
- const Fiber* workingFiber_;
- size_t numWorkItems_;
-
- public:
- WorkGroup(amd::NDRangeKernelCommand& parent, const cpu::Kernel& kernel, WorkerThread& thread,
- address params, WorkItem* workItem0, const size_t numWorkItems)
- : command_(parent),
- kernel_(kernel),
- thread_(thread),
- params_(params),
- workItem0_(workItem0),
- numWorkItems_(numWorkItems) {}
-
- WorkItem* getBaseWorkItem() { return workItem0_; }
- WorkerThread& getWorkerThread() { return thread_; }
-
- void executeWorkItem(); // In case of 1 WorkItem
- void executeWithBarrier();
- void executeWithoutBarrier();
-
- void setNumWorkItems(size_t workItems) { numWorkItems_ = workItems; }
- size_t getNumWorkItems() { return numWorkItems_; }
-
- private:
- void callKernelRange(kernelentrypoint_t entryPoint, address stackPtr,
- clk_thread_info_block_t& tib);
- inline void callKernel(kernelentrypoint_t entryPoint, address stackPtr);
- inline void callKernelProtectedReturn(kernelentrypoint_t entryPoint, address stackPtr);
-};
-
-class NDRangeKernelBatch : public Operation {
- protected:
- size_t coreId_;
- const size_t numWorkGroups_;
- const size_t numCores_;
- volatile size_t currentOpId_;
- const amd::NDRange groupIds_; //!< Number of groups in each dimensions
- VirtualCPU& virtualDevice_;
-
- public:
- enum ExecutionOrder {
- ORDER_DEFAULT,
- ORDER_ROUND_ROBIN = ORDER_DEFAULT,
- // ORDER_LINEAR
- };
-
- enum ExecutionNature {
- NATURE_WITH_BARRIER,
- NATURE_WITHOUT_BARRIER,
- NATURE_1_WORK_ITEM,
- NATURE_WG_LEVEL_EXEC
- };
-
- NDRangeKernelBatch(amd::NDRangeKernelCommand& parent, VirtualCPU& virtualDevice,
- const amd::NDRange& groupIds, size_t numCores)
- : Operation(parent),
- coreId_(0),
- numWorkGroups_(groupIds.product()),
- numCores_(numCores),
- currentOpId_(0),
- groupIds_(groupIds),
- virtualDevice_(virtualDevice) {}
-
- virtual void clone(Operation* buf) {
- ::new (buf) NDRangeKernelBatch(static_cast(command_),
- virtualDevice_, groupIds_, numCores_);
- static_cast(buf)->setCoreId(coreId_);
- }
-
- virtual void execute();
-
- void setCoreId(size_t coreId) {
- coreId_ = coreId;
- currentOpId_ = coreId;
- }
-
- inline bool getNextOperationId(size_t& opId);
- inline size_t getNextOperationIds(size_t& opId, size_t count);
-
- private:
- bool patchParameters(const cpu::Kernel& kernel, address params, address& localMemPtr,
- const address localMemLimit, size_t localMemSize) const;
-};
-
-class NativeFn : public Operation {
- public:
- NativeFn(amd::NativeFnCommand& parent) : Operation(parent) {}
-
- virtual void clone(Operation* buf) {
- ::new (buf) NativeFn(static_cast(command_));
- }
-
- virtual void execute();
-};
-#ifndef MAX
-#define MAX(x, y) ((x) >= (y) ? (x) : (y))
-#endif // MAX
-
-#define MAX_OPERATION_ALLOC_SIZE (MAX(sizeof(NDRangeKernelBatch), sizeof(NativeFn)))
-
-//! A thread bound to a cpu core.
-class WorkerThread : public amd::Thread {
- private:
- Fiber mainFiber_; //!< main fiber for this worker thread.
-
- amd::Monitor queueLock_; //!< lock protecting the queue.
- volatile int waitingOp_;
- bool terminated_; //!< true if the thread is shutting down.
-
- //! Local memory storage
- address localDataStorage_;
- //! Size of the local memory.
- size_t localDataSize_;
-
- char operation_[MAX_OPERATION_ALLOC_SIZE];
-
- address baseWorkItemsStack_;
-
- private:
- //! Awaits operations and execute them as they become ready.
- void loop();
-
- public:
- //! Construct a new WorkerThread.
- WorkerThread(const cpu::Device& device);
- //! Destroy the worker thread.
- virtual ~WorkerThread();
- //! Cleanup the thread before termination.
- bool terminate();
-
- //! Return the main fiber for this thread.
- Fiber& mainFiber() { return mainFiber_; }
- //! Return the LDS for this thread
- address localDataStorage() const { return localDataStorage_; }
- //! Return the size of the local memory for this thread.
- size_t localDataSize() const { return localDataSize_; }
-
- address baseWorkItemsStack() { return baseWorkItemsStack_; }
-
- Operation* operation() { return reinterpret_cast(operation_); }
- bool isOperationValid() { return waitingOp_ > 0; }
-
- //! Enqueue a new operation to execute in this thread.
- void enqueue(Operation& op);
- //! Signal to start processing the commands in the queue.
- void flush() {
- amd::ScopedLock sl(queueLock_);
- queueLock_.notify();
- }
-
- //! This thread's execution engine.
- void run(void* data) { loop(); }
-
- bool isWorkerThread() const { return true; }
-
- //! Return the currently executing WorkerThread's instance.
- static WorkerThread* current() { return static_cast(Thread::current()); }
-};
-
-/*! @}
- * @}
- */
-
-extern "C" intptr_t _StackContext_setjmp(intptr_t* regs);
-
-#if !defined(ATI_ARCH_ARM)
-ALWAYSINLINE
-#endif
-intptr_t StackContext::setjmp() {
-#if defined(ATI_ARCH_ARM)
- return ::setjmp(env_);
-#else
- return _StackContext_setjmp(regs_);
-#endif
-}
-
-extern "C" void _StackContext_longjmp(const intptr_t* env, intptr_t val);
-
-ALWAYSINLINE void StackContext::longjmp(intptr_t val) const {
-#if defined(ATI_ARCH_ARM)
- return ::longjmp(*const_cast(&env_), val);
-#else
- return _StackContext_longjmp(regs_, val);
-#endif
-}
-
-
-extern "C" void _WorkGroup_callKernel(address params, kernelentrypoint_t entryPoint,
- address stackPtr);
-
-extern "C" void _WorkGroup_callKernelProtectedReturn(address params, kernelentrypoint_t entryPoint,
- address stackPtr);
-
-
-ALWAYSINLINE void WorkGroup::callKernel(kernelentrypoint_t entryPoint, address stackPtr) {
- _WorkGroup_callKernel(params_, entryPoint, stackPtr);
-}
-
-// This version support the case of changing the stack for fibers.
-ALWAYSINLINE void WorkGroup::callKernelProtectedReturn(kernelentrypoint_t entryPoint,
- address stackPtr) {
- _WorkGroup_callKernelProtectedReturn(params_, entryPoint, stackPtr);
-}
-
-
-} // namespace cpu
-
-#endif /*OPERATION_HPP_*/
diff --git a/rocclr/runtime/device/cpu/cpudevice.cpp b/rocclr/runtime/device/cpu/cpudevice.cpp
deleted file mode 100644
index a88deb505e..0000000000
--- a/rocclr/runtime/device/cpu/cpudevice.cpp
+++ /dev/null
@@ -1,1049 +0,0 @@
-//
-// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#include "device/cpu/cpudevice.hpp"
-#include "device/cpu/cpuprogram.hpp"
-#include "utils/versions.hpp"
-#include "utils/flags.hpp"
-
-#include "amdocl/cl_common.hpp"
-
-#include
-#include
-#include
-#include
-#include
-
-#if defined(__linux__)
-#if !defined(ATI_ARCH_ARM)
-#include
-#endif // ATI_ARCH_ARM
-#include
-#endif
-
-#if defined(_WIN32)
-#include
-#include
-
-extern BOOL(WINAPI* pfnGetNumaNodeProcessorMaskEx)(USHORT, PGROUP_AFFINITY);
-#endif // _WIN32
-
-namespace cpu {
-
-aclCompiler* Device::compiler_;
-
-size_t Device::maxWorkerThreads_ = (size_t)-1;
-
-Device::~Device() {
-#if defined(__linux__) && defined(NUMA_SUPPORT)
- if (getNumaMask() != NULL) {
- if (numaMask_ != NULL) {
- delete numaMask_;
- }
- } else
-#endif
- if (workerThreadsAffinity_ != NULL) {
- delete workerThreadsAffinity_;
- }
-}
-void Device::tearDown() {
- amd::Os::uninstallSigfpeHandler();
- aclCompilerFini(compiler_);
-}
-bool Device::init() {
- // Allow disabling of the CPU device
- if (CPU_MAX_COMPUTE_UNITS == 0) return false;
-
- if (!amd::Os::installSigfpeHandler()) return false;
-
- const char* library = getenv("COMPILER_LIBRARY");
- aclCompilerOptions opts = {sizeof(aclCompilerOptions_0_8), (library || CPU_OPENCL_VERSION >= 200)
- ? library
- : LINUX_ONLY("lib") "amdocl12cl" LP64_SWITCH(
- LINUX_SWITCH("32", ""), "64") LINUX_SWITCH(".so", ".dll"),
- NULL, NULL, NULL, NULL, NULL, NULL};
- acl_error error;
- compiler_ = aclCompilerInit(&opts, &error);
- if (error != ACL_SUCCESS) {
- LogError("Error initializing the compiler");
- return false;
- }
-
- device::Info info;
- ::memset(&info, '\0', sizeof(info));
-
- info.type_ = CL_DEVICE_TYPE_CPU;
- info.vendorId_ = 0x1002;
-
- int systemProcessorCount = amd::Os::processorCount();
- info.maxComputeUnits_ = systemProcessorCount;
- if (!flagIsDefault(CPU_MAX_COMPUTE_UNITS)) {
- if ((CPU_MAX_COMPUTE_UNITS <= 0) || (CPU_MAX_COMPUTE_UNITS > systemProcessorCount))
- info.maxComputeUnits_ = systemProcessorCount;
- else
- info.maxComputeUnits_ = CPU_MAX_COMPUTE_UNITS;
- }
-
- info.maxWorkItemDimensions_ = 3;
- info.maxWorkGroupSize_ = CPU_MAX_WORKGROUP_SIZE;
- info.maxWorkItemSizes_[0] = info.maxWorkGroupSize_;
- info.maxWorkItemSizes_[1] = info.maxWorkGroupSize_;
- info.maxWorkItemSizes_[2] = info.maxWorkGroupSize_;
- info.preferredWorkGroupSize_ = CPU_MAX_WORKGROUP_SIZE;
-
- info.addressBits_ = LP64_SWITCH(32, 64);
-
-
- if (CPU_IMAGE_SUPPORT) {
- info.imageSupport_ = CL_TRUE;
- info.maxReadImageArgs_ = MaxReadImage;
- info.maxWriteImageArgs_ = MaxWriteImage;
- info.image2DMaxWidth_ = 8 * Ki;
- info.image2DMaxHeight_ = 8 * Ki;
- info.image3DMaxWidth_ = 2 * Ki;
- info.image3DMaxHeight_ = 2 * Ki;
- info.image3DMaxDepth_ = 2 * Ki;
- info.maxSamplers_ = MaxSamplers;
-
- // OpenCL 1.2 device info fields
- info.imageMaxBufferSize_ = 64 * Ki;
- info.imageMaxArraySize_ = 2 * Ki;
-
- info.imagePitchAlignment_ = 0;
- info.imageBaseAddressAlignment_ = 0;
- info.bufferFromImageSupport_ = CL_FALSE;
- }
-
- info.maxParameterSize_ = 4 * Ki;
-
- info.memBaseAddrAlign_ =
- 8 * (flagIsDefault(MEMOBJ_BASE_ADDR_ALIGN) ? sizeof(cl_long16) : MEMOBJ_BASE_ADDR_ALIGN);
- info.minDataTypeAlignSize_ = sizeof(cl_long16);
-
- info.singleFPConfig_ = CL_FP_DENORM | CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST |
- CL_FP_ROUND_TO_ZERO | CL_FP_ROUND_TO_INF | CL_FP_FMA;
-
- info.doubleFPConfig_ = info.singleFPConfig_;
- info.singleFPConfig_ |= CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT;
-
- info.affinityDomain_.value_ = 0;
- info.affinityDomain_.next_ = 1;
-
- info.globalMemCacheType_ = CL_READ_WRITE_CACHE;
-
-#if defined(__linux__)
-
- info.globalMemCacheLineSize_ = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
- info.globalMemCacheSize_ = sysconf(_SC_LEVEL1_DCACHE_SIZE);
- info.affinityDomain_.cacheL1_ = 1;
-
- if (sysconf(_SC_LEVEL2_CACHE_SIZE) > 0) {
- info.affinityDomain_.cacheL2_ = 1;
- }
- if (sysconf(_SC_LEVEL3_CACHE_SIZE) > 0) {
- info.affinityDomain_.cacheL3_ = 1;
- }
- if (sysconf(_SC_LEVEL4_CACHE_SIZE) > 0) {
- info.affinityDomain_.cacheL4_ = 1;
- }
-
-#if defined(NUMA_SUPPORT)
- if (numa_available() != -1 && numa_max_node() = > 0) {
- info.affinityDomain_.numa_ = 1;
- }
-#endif
-
-#else // win32
-
- DWORD length = 0;
- ::GetLogicalProcessorInformation(NULL, &length);
-
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer =
- (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(length);
-
- if (buffer != NULL && ::GetLogicalProcessorInformation(buffer, &length)) {
- bool found = false;
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr,
- limit = &buffer[length / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)];
- for (ptr = buffer; ptr < limit; ++ptr) {
- PCACHE_DESCRIPTOR cache = &ptr->Cache;
- if (ptr->Relationship == RelationCache && cache->Type != CacheInstruction) {
- info.affinityDomain_.value_ |=
- (device::AffinityDomain::AFFINITY_DOMAIN_L1_CACHE << 1) >> cache->Level;
-
- if (!found && cache->Level == 1) {
- info.globalMemCacheLineSize_ = cache->LineSize;
- info.globalMemCacheSize_ = cache->Size;
- found = true;
- }
- }
- }
- }
-
- free(buffer);
-
- ULONG highestNuma = 0;
- if (::GetNumaHighestNodeNumber(&highestNuma) && highestNuma != 0) {
- info.affinityDomain_.numa_ = 1;
- }
-
-#endif
-
- uintptr_t virtualMemSize;
-
-#if defined(__linux__)
-#if !defined(ATI_ARCH_ARM)
- struct sysinfo si;
-
- if (sysinfo(&si) != 0) {
- return false;
- }
- if (si.mem_unit == 0) {
- // Linux kernels prior to 2.3.23 return sizes in bytes.
- si.mem_unit = 1;
- }
- info.globalMemSize_ = (cl_ulong)si.totalram * si.mem_unit;
-#else
- info.globalMemSize_ = 0;
-#endif
- virtualMemSize = (uintptr_t)info.globalMemSize_;
-#else
- MEMORYSTATUSEX statex;
- statex.dwLength = sizeof(statex);
-
- if (GlobalMemoryStatusEx(&statex) == 0) {
- return false;
- }
- info.globalMemSize_ = (cl_ulong)statex.ullTotalPhys;
- virtualMemSize = (uintptr_t)std::min(statex.ullTotalPageFile, statex.ullTotalVirtual);
-#endif
- // disable CPU device if system memory is equal to or less than 2GB
- if (info.globalMemSize_ <= OCL_SYSMEM_REQUIREMENT * Gi) {
- return true;
- }
-
- maxWorkerThreads_ = (size_t)(
- virtualMemSize / (uintptr_t)((CPU_WORKER_THREAD_STACK_SIZE +
- CLK_PRIVATE_MEMORY_SIZE * (CPU_MAX_WORKGROUP_SIZE + 1))) *
- 7 / 10);
-
-#if defined(_LP64)
- // Cap at 8TiB for 64-bit
- const cl_ulong maxGlobalMemSize = 8ULL * Ki * Gi;
-#elif defined(_WIN32)
- // Cap at 2GiB (see http://msdn.microsoft.com/en-us/library/aa366778.aspx)
- const cl_ulong maxGlobalMemSize = 2ULL * Gi;
-#else // linux
- // Cap at 3.5GiB
- const cl_ulong maxGlobalMemSize = 3584ULL * Mi;
-#endif
- info.globalMemSize_ = std::min(info.globalMemSize_, maxGlobalMemSize);
-
- info.maxMemAllocSize_ = info.globalMemSize_ * CPU_MAX_ALLOC_PERCENT / 100;
- if (flagIsDefault(CPU_MAX_ALLOC_PERCENT)) {
- const cl_ulong minAllocSize = LP64_SWITCH(1ULL * Gi, 2ULL * Gi);
- info.maxMemAllocSize_ =
- std::max(info.maxMemAllocSize_, std::min(info.globalMemSize_, minAllocSize));
- }
-
- info.maxConstantBufferSize_ = 64 * Ki;
- info.maxConstantArgs_ = 8;
-
- info.localMemType_ = CL_GLOBAL;
- info.localMemSize_ = std::max((cl_ulong)32 * Ki, info.globalMemCacheSize_ / 2);
-
- info.errorCorrectionSupport_ = CL_FALSE;
- info.hostUnifiedMemory_ = CL_TRUE;
- info.profilingTimerResolution_ = (size_t)amd::Os::timerResolutionNanos();
- info.profilingTimerOffset_ = amd::Os::offsetToEpochNanos();
- info.littleEndian_ = CL_TRUE;
- info.available_ = CL_TRUE;
- info.compilerAvailable_ = CL_TRUE;
- info.linkerAvailable_ = CL_TRUE;
-
- info.executionCapabilities_ = CL_EXEC_KERNEL | CL_EXEC_NATIVE_KERNEL;
- // Enable SVM only for OpenCL 2.0
- if (((OPENCL_MAJOR >= 2) && (CPU_OPENCL_VERSION >= 200)) || OCL_FORCE_CPU_SVM) {
- info.svmCapabilities_ = CL_DEVICE_SVM_COARSE_GRAIN_BUFFER | CL_DEVICE_SVM_FINE_GRAIN_BUFFER |
- CL_DEVICE_SVM_FINE_GRAIN_SYSTEM | CL_DEVICE_SVM_ATOMICS;
- }
- info.preferredPlatformAtomicAlignment_ = 0;
- info.preferredGlobalAtomicAlignment_ = 0;
- info.preferredLocalAtomicAlignment_ = 0;
- info.queueProperties_ = CL_QUEUE_PROFILING_ENABLE;
-
- info.platform_ = AMD_PLATFORM;
-
-#if defined(__linux__)
-
- std::ifstream ifs("/proc/cpuinfo", std::ios::in);
- if (ifs.is_open()) {
- std::string line;
- bool vendor = false;
- bool name = false;
- bool freq = false;
-
- while (std::getline(ifs, line) && !(vendor && name && freq)) {
- if (!vendor && (line.find("vendor_id\t: ") != std::string::npos)) {
- ::strcpy(info.vendor_, line.substr(line.find_first_of(':') + 2).c_str());
- vendor = true;
- } else if (!name && (line.find("model name\t: ") != std::string::npos ||
- line.find("Processor\t: ") != std::string::npos)) {
- ::strcpy(info.name_, line.substr(line.find_first_of(':') + 2).c_str());
- name = true;
- } else if (!freq && (line.find("cpu MHz\t\t: ") != std::string::npos)) {
- info.maxEngineClockFrequency_ = ::atoi(line.substr(line.find_first_of(':') + 2).c_str());
- freq = true;
- }
- }
- ifs.close();
- }
-
-#elif defined(_WIN32)
-
- int CPUInfo[4] = {-1};
- int nRet = 0;
- unsigned nIds, nExIds, i;
-
- // cpuid with an InfoType argument of 0 returns the number of
- // valid Ids in CPUInfo[0] and the CPU identification string in
- // the other three array elements. The CPU identification string is
- // not in linear order. The code below arranges the information
- // in a human readable form.
- amd::Os::cpuid(CPUInfo, 0);
- nIds = CPUInfo[0];
- memset(info.vendor_, 0, sizeof(info.vendor_));
- *((int*)(info.vendor_ + 0)) = CPUInfo[1];
- *((int*)(info.vendor_ + 4)) = CPUInfo[3];
- *((int*)(info.vendor_ + 8)) = CPUInfo[2];
-
- // Calling cpuid with 0x80000000 as the InfoType argument
- // gets the number of valid extended IDs.
- amd::Os::cpuid(CPUInfo, 0x80000000);
- nExIds = CPUInfo[0];
- memset(info.name_, 0, sizeof(info.name_));
- sprintf(info.name_, "Unknown Processor");
-
- // Get the information associated with each extended ID.
- for (i = 0x80000000; i <= nExIds; ++i) {
- amd::Os::cpuid(CPUInfo, i);
- // Interpret CPU brand string and cache information.
- if (i == 0x80000002)
- memcpy(info.name_, CPUInfo, sizeof(CPUInfo));
- else if (i == 0x80000003)
- memcpy(info.name_ + 16, CPUInfo, sizeof(CPUInfo));
- else if (i == 0x80000004)
- memcpy(info.name_ + 32, CPUInfo, sizeof(CPUInfo));
- }
-
-
- info.maxEngineClockFrequency_ = 0;
- info.maxMemoryClockFrequency_ = 0;
- HKEY hKey;
-
- // Open the key
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\\", 0,
- KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
- // Read the value
- DWORD dwLen = 4;
- RegQueryValueEx(hKey, "~MHz", NULL, NULL, (LPBYTE)&info.maxEngineClockFrequency_, &dwLen);
-
- // Cleanup and return
- RegCloseKey(hKey);
- }
-
-#else
- ::strcpy(info.name_, "Unknown Processor");
- ::strcpy(info.vendor_, "Unknown Vendor");
- info.maxEngineClockFrequency_ = 0;
- info.maxMemoryClockFrequency_ = 0;
-#endif
-
-#define OPENCL_VERSION_STR XSTR(OPENCL_MAJOR) "." XSTR(OPENCL_MINOR)
-
- info.profile_ = "FULL_PROFILE";
- if (CPU_OPENCL_VERSION < 200) {
- info.version_ = "OpenCL 1.2 " AMD_PLATFORM_INFO;
- info.oclcVersion_ = "OpenCL C 1.2 ";
- } else {
- info.version_ = "OpenCL " OPENCL_VERSION_STR " " AMD_PLATFORM_INFO;
- info.oclcVersion_ = "OpenCL C " OPENCL_VERSION_STR " ";
- }
- info.spirVersions_ = "1.2";
-
- info.partitionCreateInfo_.type_.value_ = 0;
- info.partitionProperties_.value_ = 0;
- if (info.maxComputeUnits_ > 1) {
- info.partitionProperties_.equally_ = 1;
- info.partitionProperties_.byCounts_ = 1;
- if (info.affinityDomain_.value_ != 0) {
- info.partitionProperties_.byAffinityDomain_ = 1;
- }
- } else {
- info.affinityDomain_.value_ = 0;
- }
-
- // Copy the name into the boardName data member for CPU implementation.
- // ::strncpy(info.boardName_, info.name_, sizeof(info.boardName_));
- memset(info.boardName_, 0, sizeof(info.boardName_));
-
- Device* device = new Device();
-
- if (device == NULL || !device->create()) {
- delete device;
- return false;
- }
-
- ::snprintf(info.driverVersion_, sizeof(info.driverVersion_) - 1, "%s (%s%s%s)", AMD_BUILD_STRING,
-#if defined(ATI_ARCH_X86)
- "sse2",
-#else // !ATI_ARCH_X86
- "",
-#endif // !ATI_ARCH_X86
- device->hasAVXInstructions() ? ",avx" : "",
- device->hasFMA4Instructions() ? ",fma4" : "");
-
- // These will need to change for AVX2
- info.preferredVectorWidthChar_ = 16;
- info.preferredVectorWidthShort_ = 8;
- info.preferredVectorWidthInt_ = 4;
- info.preferredVectorWidthLong_ = 2;
- if (device->hasAVXInstructions()) {
- info.preferredVectorWidthFloat_ = 8;
- info.preferredVectorWidthDouble_ = 4;
- } else {
- info.preferredVectorWidthFloat_ = 4;
- info.preferredVectorWidthDouble_ = 2;
- }
- info.preferredVectorWidthHalf_ = 0; // no half support
-
- // Same here, will need to change for AVX2
- info.nativeVectorWidthChar_ = 16;
- info.nativeVectorWidthShort_ = 8;
- info.nativeVectorWidthInt_ = 4;
- info.nativeVectorWidthLong_ = 2;
- if (device->hasAVXInstructions()) {
- info.nativeVectorWidthFloat_ = 8;
- info.nativeVectorWidthDouble_ = 4;
- } else {
- info.nativeVectorWidthFloat_ = 4;
- info.nativeVectorWidthDouble_ = 2;
- }
- info.nativeVectorWidthHalf_ = 0; // no half support
-
- // Find all supported device extensions
- info.extensions_ = device->getExtensionString();
-
- // OpenCL 1.2 device info fields
- info.builtInKernels_ = "";
- info.preferredInteropUserSync_ = true;
- info.printfBufferSize_ = 64 * Ki;
-
- info.maxPipePacketSize_ = info.maxMemAllocSize_;
- info.maxPipeActiveReservations_ = 16;
- info.maxPipeArgs_ = 16;
- info.maxReadWriteImageArgs_ = MaxReadWriteImage;
-
- // Max size should not be bigger than 1.75 GB
- const cl_ulong maxSize = std::min(static_cast((Gi / 4) * 7), info.maxMemAllocSize_);
- info.maxGlobalVariableSize_ = static_cast(maxSize);
- info.globalVariablePreferredTotalSize_ = static_cast(maxSize);
-
- device->info_ = info;
- device->registerDevice();
-
- return true;
-}
-
-bool Device::create() {
- // Create CPU settings
- settings_ = new cpu::Settings();
- cpu::Settings* cpuSettings = reinterpret_cast(settings_);
-
- if ((cpuSettings == NULL) || !cpuSettings->create()) {
- return false;
- }
-
-#if defined(ATI_ARCH_X86)
- // Check that we have at least SSE2
- if (settings().cpuFeatures_ == 0) {
- return false;
- }
-#endif
-
- return true;
-}
-
-bool Device::initSubDevice(device::Info& info, cl_uint maxComputeUnits,
- const device::CreateSubDevicesInfo& create_info) {
- if (workerThreadsAffinity_ == NULL) {
- workerThreadsAffinity_ = new amd::Os::ThreadAffinityMask;
- if (workerThreadsAffinity_ == NULL) {
- return false;
- }
- }
-
- info_ = info;
- info_.maxComputeUnits_ = maxComputeUnits;
- info_.partitionCreateInfo_ = create_info.p_;
- if (create_info.p_.type_.value_ == device::PartitionType::BY_COUNTS) {
- cl_uint* countsList = new cl_uint[create_info.p_.byCounts_.listSize_];
- if (countsList == NULL) {
- return false;
- }
- for (size_t i = 0; i < create_info.p_.byCounts_.listSize_; ++i) {
- countsList[i] = create_info.countsListAt(i);
- }
- info_.partitionCreateInfo_.byCounts_.countsList_ = countsList;
- }
-
- // The device cannot be partitioned further
- if (maxComputeUnits == 1) {
- info_.partitionProperties_.value_ = 0;
- info_.affinityDomain_.value_ = 0;
- }
- return true;
-}
-
-void Device::setWorkerThreadsAffinity(cl_uint numWorkerThreads,
- const amd::Os::ThreadAffinityMask* threadsAffinityMask,
- uint& baseCoreId) {
- uint coreId = baseCoreId;
- if (threadsAffinityMask == NULL) {
- for (cl_uint i = 0; i < numWorkerThreads; ++i) {
- ++coreId;
- workerThreadsAffinity_->set(coreId);
- }
- } else { // Already has affinity, so filter accordingly
- for (cl_uint i = 0; i < numWorkerThreads; ++i) {
- coreId = threadsAffinityMask->getNextSet(coreId);
- workerThreadsAffinity_->set(coreId);
- }
- }
- baseCoreId = coreId;
-}
-
-cl_int Device::createSubDevices(device::CreateSubDevicesInfo& create_info, cl_uint num_entries,
- cl_device_id* devices, cl_uint* num_devices) {
- switch (create_info.p_.type_.value_) {
- case device::PartitionType::EQUALLY:
- return partitionEqually(create_info, num_entries, devices, num_devices);
-
- case device::PartitionType::BY_COUNTS:
- return partitionByCounts(create_info, num_entries, devices, num_devices);
-
- case device::PartitionType::BY_AFFINITY_DOMAIN:
- if (info_.affinityDomain_.value_ == 0) {
- return CL_DEVICE_PARTITION_FAILED;
- }
-
- if (create_info.p_.byAffinityDomain_.next_) {
- create_info.p_.byAffinityDomain_.next_ = 0;
- create_info.p_.byAffinityDomain_.value_ =
- (1 << amd::leastBitSet(info_.affinityDomain_.value_));
- } else {
- if ((create_info.p_.byAffinityDomain_.value_ & info_.affinityDomain_.value_) == 0) {
- return CL_INVALID_VALUE;
- }
- }
-
- if (create_info.p_.byAffinityDomain_.numa_) {
- return partitionByAffinityDomainNUMA(create_info, num_entries, devices, num_devices);
- } else {
- return partitionByAffinityDomainCacheLevel(create_info, num_entries, devices, num_devices);
- }
- default:
- return CL_INVALID_VALUE;
- }
- return CL_SUCCESS;
-}
-
-cl_int Device::partitionEqually(const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries, cl_device_id* devices, cl_uint* num_devices) {
- cl_uint subComputeUnits = (cl_uint)create_info.p_.equally_.numComputeUnits_;
- if (subComputeUnits == 0) {
- return CL_INVALID_VALUE;
- }
-
- cl_uint numSubDevices = info_.maxComputeUnits_ / subComputeUnits;
- if (numSubDevices == 0) {
- return CL_DEVICE_PARTITION_FAILED;
- }
-
- if (num_devices != NULL) {
- *num_devices = numSubDevices;
- }
-
- if (devices != NULL) {
- if (num_entries < numSubDevices) {
- return CL_INVALID_VALUE;
- }
- uint coreId = (uint)-1;
- while (numSubDevices-- > 0) {
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- if (!device->create() || !device->initSubDevice(info_, subComputeUnits, create_info)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->setWorkerThreadsAffinity(subComputeUnits, workerThreadsAffinity_, coreId);
- *devices++ = as_cl(static_cast(device));
- }
- }
-
- return CL_SUCCESS;
-}
-
-cl_int Device::partitionByCounts(const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries, cl_device_id* devices, cl_uint* num_devices) {
- cl_uint maxComputeUnits = 0;
- cl_uint numSubDevices = (cl_uint)create_info.p_.byCounts_.listSize_;
- for (size_t i = (size_t)numSubDevices; i > 0; --i) {
- maxComputeUnits += create_info.countsListAt(i);
- }
- if (numSubDevices == 0 || maxComputeUnits > info_.maxComputeUnits_) {
- return CL_INVALID_DEVICE_PARTITION_COUNT;
- }
-
- if (num_devices != NULL) {
- *num_devices = numSubDevices;
- }
-
- if (devices != NULL) {
- if (num_entries < numSubDevices) {
- return CL_INVALID_VALUE;
- }
- uint coreId = (uint)-1;
- for (uint subDev = 0; subDev < numSubDevices; ++subDev) {
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- cl_uint subComputeUnits = create_info.countsListAt((size_t)subDev);
- if (!device->create() || !device->initSubDevice(info_, subComputeUnits, create_info)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->setWorkerThreadsAffinity(subComputeUnits, workerThreadsAffinity_, coreId);
- *devices++ = as_cl(static_cast(device));
- }
- }
-
- return CL_SUCCESS;
-}
-
-cl_int Device::partitionByAffinityDomainNUMA(const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries, cl_device_id* devices,
- cl_uint* num_devices) {
- cl_uint numSubDevices = 0;
-
-#if defined(__linux__)
-#if !defined(NUMA_SUPPORT)
- return CL_INVALID_VALUE;
-#else
- int highestNuma = numa_max_node();
- if (highestNuma < 0) {
- return CL_INVALID_VALUE;
- }
-
- numSubDevices = (cl_uint)highestNuma;
- if (devices != NULL) {
- for (int node = 0; node <= highestNuma; ++node) {
- cl_uint subComputeUnits = 0;
- int len = 1;
- while (true) {
- ulong* cpus = alloca(sizeof(ulong) * len);
- if (numa_node_to_cpus(node, cpus, len * sizeof(ulong)) < 0) {
- if (errno != ERANGE) {
- return CL_INVALID_VALUE;
- }
- len *= 2;
- } else {
- len *= sizeof(ulong) * 8;
- for (int i = 0; i < len; i++) {
- if (test_bit(i, cpus)) {
- ++subComputeUnits;
- }
- }
- break;
- }
- }
-
- if (subComputeUnits == 0) {
- return CL_INVALID_VALUE;
- }
-
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- if (!device->create() || NULL == (device->numaMask_ = new nodemask_t)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
-
- if (!device->initSubDevice(info_, subComputeUnits, create_info)) {
- delete device->numaMask_;
- device->numaMask_ = NULL;
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- nodemask_zero(device->numaMask_);
- nodemask_set(device->numaMask_, node);
- // Need to remove this domain type
- device->info_.affinityDomain_.numa_ = 0;
- *devices++ = as_cl(static_cast(device));
- }
- }
-#endif // NUMA_SUPPORT
-
-#else // win32
- GROUP_AFFINITY numaNodeMask;
- ULONG highestNuma = 0;
- if (!::GetNumaHighestNodeNumber(&highestNuma)) {
- return CL_INVALID_VALUE;
- }
-
- for (ULONG node = 0; node <= highestNuma; ++node) {
- if (pfnGetNumaNodeProcessorMaskEx != NULL) {
- if (!pfnGetNumaNodeProcessorMaskEx((USHORT)node, &numaNodeMask)) {
- // Highet NUMA node number is not guaranteed to be the
- // number of nodes.
- continue;
- }
- } else {
- ULONGLONG tmpMask;
- if (!::GetNumaNodeProcessorMask((UCHAR)node, &tmpMask)) {
- // Highet NUMA node number is not guaranteed to be the
- // number of nodes.
- continue;
- }
- numaNodeMask.Group = 0;
- numaNodeMask.Mask = (KAFFINITY)tmpMask;
- }
-
- if (workerThreadsAffinity_ != NULL) {
- workerThreadsAffinity_->adjust(0, numaNodeMask.Mask);
- }
- if (numaNodeMask.Mask == 0) {
- continue;
- }
-
- if (devices != NULL) {
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- if (!device->create() ||
- !device->initSubDevice(info_, (cl_uint)amd::countBitsSet(numaNodeMask.Mask),
- create_info)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->workerThreadsAffinity_->set(numaNodeMask.Group, numaNodeMask.Mask);
- // Need to remove this domain type
- device->info_.affinityDomain_.numa_ = 0;
- *devices++ = as_cl(static_cast(device));
- }
- numSubDevices++;
- }
-
-#endif // win32
-
- if (num_devices != NULL) {
- *num_devices = numSubDevices;
- }
-
- // Could not get a processor mask for any of the nodes
- if (numSubDevices == 0) {
- return CL_INVALID_VALUE;
- }
- return CL_SUCCESS;
-}
-
-#if defined(__linux__)
-static bool readFileString(const char* file, char* buf, size_t bufSize) {
- int fd = open(file, O_RDONLY);
- if (fd < 0) {
- return false;
- }
-
- struct stat st;
- if (fstat(fd, &st) < 0) {
- close(fd);
- return false;
- }
-
- if ((size_t)st.st_size < bufSize) {
- bufSize = (size_t)st.st_size;
- }
-
- ssize_t n = read(fd, buf, bufSize);
- close(fd);
-
- if (n <= 0) {
- return false;
- }
-
- if (n >= (ssize_t)bufSize) {
- n = (ssize_t)bufSize - 1;
- }
- buf[n] = '\0';
- return true;
-}
-
-static void parseSharedCpuMap(const char* cpuMap, cpu_set_t& mask) {
- CPU_ZERO(&mask);
- uint32_t* bits = (uint32_t*)mask.__bits;
- const char* s = cpuMap + strlen(cpuMap);
- while (true) {
- s = (const char*)memrchr(cpuMap, ',', s - cpuMap);
- if (!s) {
- s = cpuMap;
- } else {
- s++;
- }
-
- *bits++ = strtoul(s, NULL, 16);
-
- if (s == cpuMap) {
- return;
- }
-
- --s;
- }
-}
-#endif // linux
-
-cl_int Device::partitionByAffinityDomainCacheLevel(const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries, cl_device_id* devices,
- cl_uint* num_devices) {
- cl_uint cacheLevel = 0;
- switch (create_info.p_.byAffinityDomain_.value_) {
- case device::AffinityDomain::AFFINITY_DOMAIN_L4_CACHE:
- cacheLevel = 4;
- break;
- case device::AffinityDomain::AFFINITY_DOMAIN_L3_CACHE:
- cacheLevel = 3;
- break;
- case device::AffinityDomain::AFFINITY_DOMAIN_L2_CACHE:
- cacheLevel = 2;
- break;
- case device::AffinityDomain::AFFINITY_DOMAIN_L1_CACHE:
- cacheLevel = 1;
- break;
- default:
- return CL_INVALID_VALUE;
- }
-
- const uint negAffinityDomain = ~create_info.p_.byAffinityDomain_.value_;
- cl_uint numSubDevices = 0;
-
-#if defined(__linux__)
-
- amd::Os::ThreadAffinityMask affinityMask;
- if (workerThreadsAffinity_ != NULL) {
- affinityMask = *workerThreadsAffinity_;
- } else {
- for (uint cpuId = 0; cpuId < (uint)info_.maxComputeUnits_; ++cpuId) {
- affinityMask.set(cpuId);
- }
- }
-
- amd::Os::ThreadAffinityMask currentMask;
- char buf[1024];
- for (uint cpuId = affinityMask.getFirstSet(); cpuId != (uint)-1;
- cpuId = affinityMask.getNextSet(cpuId)) {
- sprintf(buf, "/sys/devices/system/cpu/cpu%u/cache/index%u/shared_cpu_map", cpuId, cacheLevel);
-
- if (!readFileString(buf, buf, sizeof(buf))) {
- return CL_INVALID_VALUE;
- }
-
- parseSharedCpuMap(buf, currentMask.getNative());
- affinityMask.adjust(currentMask.getNative());
- if (currentMask.isEmpty()) {
- continue;
- }
-
- cl_uint maxComputeUnits;
- if (cacheLevel > 1) {
- maxComputeUnits = 0;
- amd::Os::ThreadAffinityMask currentMaskSub;
- cl_uint cacheLevelSub = cacheLevel - 1;
- for (uint cpuIdSub = affinityMask.getFirstSet(); cpuIdSub != (uint)-1;
- cpuIdSub = affinityMask.getNextSet(cpuIdSub)) {
- sprintf(buf, "/sys/devices/system/cpu/cpu%u/cache/index%u/shared_cpu_map", cpuIdSub,
- cacheLevelSub);
-
- if (!readFileString(buf, buf, sizeof(buf))) {
- return CL_INVALID_VALUE;
- }
-
- parseSharedCpuMap(buf, currentMaskSub.getNative());
- currentMask.adjust(currentMaskSub.getNative());
- if (!currentMaskSub.isEmpty()) {
- ++maxComputeUnits;
- }
- }
-
- if (maxComputeUnits == 0) {
- continue;
- }
- } else {
- maxComputeUnits = 1;
- }
-
- if (devices != NULL) {
- Device* device = new Device(this);
- if (device == NULL) {
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- if (!device->create() || !device->initSubDevice(info_, maxComputeUnits, create_info)) {
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->workerThreadsAffinity_->set(currentMask.getNative());
- // Need to remove this domain type
- device->info_.affinityDomain_.value_ &= negAffinityDomain;
- *devices++ = as_cl(static_cast(device));
- }
- numSubDevices++;
- affinityMask.clear(currentMask.getNative());
- }
-
-#else // win32
- DWORD length = 0;
- ::GetLogicalProcessorInformation(NULL, &length);
-
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer =
- (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(length);
-
- if (buffer != NULL && ::GetLogicalProcessorInformation(buffer, &length)) {
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr,
- limit = &buffer[length / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)];
-
- for (ptr = buffer; ptr < limit; ++ptr) {
- PCACHE_DESCRIPTOR cache = &ptr->Cache;
- if (ptr->Relationship == RelationCache && cache->Type != CacheInstruction) {
- if (cache->Level == cacheLevel) {
- KAFFINITY affinityMask = (KAFFINITY)ptr->ProcessorMask;
- if (workerThreadsAffinity_ != NULL) {
- workerThreadsAffinity_->adjust(0, affinityMask);
- }
- if (affinityMask == 0) {
- continue;
- }
-
- cl_uint maxComputeUnits;
- if (cacheLevel > 1) {
- maxComputeUnits = 0;
- cl_uint cacheLevelSub = cacheLevel - 1;
- for (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptrSub = buffer; ptrSub < limit; ++ptrSub) {
- PCACHE_DESCRIPTOR cacheSub = &ptrSub->Cache;
- if (ptrSub->Relationship == RelationCache && cacheSub->Type != CacheInstruction) {
- if (cacheSub->Level == cacheLevelSub &&
- ((affinityMask & (KAFFINITY)ptrSub->ProcessorMask) != 0)) {
- ++maxComputeUnits;
- }
- }
- }
-
- if (maxComputeUnits == 0) {
- continue;
- }
- } else {
- maxComputeUnits = 1;
- }
-
- if (devices != NULL) {
- Device* device = new Device(this);
- if (device == NULL) {
- free(buffer);
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- if (!device->create() || !device->initSubDevice(info_, maxComputeUnits, create_info)) {
- free(buffer);
- device->release();
- return CL_OUT_OF_HOST_MEMORY;
- }
-
- device->workerThreadsAffinity_->set(0, affinityMask);
- // Need to remove this domain type
- device->info_.affinityDomain_.value_ &= negAffinityDomain;
- *devices++ = as_cl(static_cast(device));
- }
- numSubDevices++;
- if (numSubDevices >= info_.maxComputeUnits_) {
- break;
- }
- }
- }
- }
- }
-
- free(buffer);
-
-#endif
-
- if (num_devices != NULL) {
- *num_devices = numSubDevices;
- }
-
- if (numSubDevices == 0) {
- return CL_INVALID_VALUE;
- }
-
- return CL_SUCCESS;
-}
-
-device::Program* Device::createProgram(amd::option::Options* options) {
- Program* cpuProgram = new Program(*this);
- if (cpuProgram == NULL) {
- LogError("We failed memory allocation for program!");
- }
-
- return cpuProgram;
-}
-
-void* Device::allocMapTarget(amd::Memory& mem, const amd::Coord3D& origin,
- const amd::Coord3D& region, uint mapFlags, size_t* rowPitch,
- size_t* slicePitch) {
- if (mem.asImage() != NULL) {
- amd::Image* image = mem.asImage();
- size_t elementSize = image->getImageFormat().getElementSize();
- size_t rp = image->getRowPitch();
- size_t sp = image->getSlicePitch();
- *rowPitch = rp;
- if (slicePitch) {
- *slicePitch = sp;
- }
- return (address)image->getHostMem() +
- (origin[0] * elementSize + origin[1] * rp + origin[2] * sp);
- } else if (mem.asBuffer() != NULL) {
- return (address)mem.getHostMem() + origin[0];
- }
-
- return NULL;
-}
-
-void Device::freeMapTarget(amd::Memory& mem, void* target) {
- // nop for CPU
-}
-
-} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpudevice.hpp b/rocclr/runtime/device/cpu/cpudevice.hpp
deleted file mode 100644
index 16df72d541..0000000000
--- a/rocclr/runtime/device/cpu/cpudevice.hpp
+++ /dev/null
@@ -1,208 +0,0 @@
-//
-// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef CPUDEVICE_HPP_
-#define CPUDEVICE_HPP_
-
-#include "top.hpp"
-#include "device/device.hpp"
-#include "device/cpu/cpuvirtual.hpp"
-#include "device/cpu/cpusettings.hpp"
-#include "os/os.hpp"
-
-#if defined(__linux__) && defined(NUMA_SUPPORT)
-#include
-#endif
-
-#include "acl.h"
-
-//! \namespace cpu CPU Device Implementation
-namespace cpu {
-
-//! Maximum number of the supported samplers
-const static uint32_t MaxSamplers = 16;
-//! Maximum number of supported read images
-const static uint32_t MaxReadImage = 128;
-//! Maximum number of supported write images
-const static uint32_t MaxWriteImage = 64;
-//! Maximum number of supported read/write images
-const static uint32_t MaxReadWriteImage = 64;
-
-/*! \addtogroup CPU CPU Device Implementation
- * @{
- *
- * \addtogroup CPUDevice Device
- *
- * \copydoc cpu::Device
- *
- * @{
- */
-
-//! A CPU device ordinal
-class Device : public amd::Device {
- protected:
- static aclCompiler* compiler_;
-
- public:
- aclCompiler* compiler() const { return compiler_; }
-
- public:
- static bool init(void);
-
- //! Shutdown CPU device
- static void tearDown();
-
- //! Construct a new identifier
- Device(Device* parent = NULL) : amd::Device(parent), workerThreadsAffinity_(NULL) {}
-
- virtual ~Device();
-
- bool create();
-
- virtual cl_int createSubDevices(device::CreateSubDevicesInfo& create_info, cl_uint num_entries,
- cl_device_id* devices, cl_uint* num_devices);
-
- //! Instantiate a new virtual device
- virtual device::VirtualDevice* createVirtualDevice(amd::CommandQueue* queue = NULL) {
- VirtualCPU* virtualCpu = new VirtualCPU(*this);
- if (virtualCpu != NULL && !virtualCpu->acceptingCommands()) {
- virtualCpu->terminate();
- delete virtualCpu;
- virtualCpu = NULL;
- }
- return virtualCpu;
- }
-
- //! Compile the given source code.
- virtual device::Program* createProgram(amd::option::Options* options = NULL);
-
- //! Just returns NULL as CPU devices use the host memory
- virtual device::Memory* createMemory(amd::Memory& owner) const { return NULL; }
-
- //! Sampler object allocation
- virtual bool createSampler(const amd::Sampler& owner, //!< abstraction layer sampler object
- device::Sampler** sampler //!< device sampler object
- ) const {
- // Just return NULL on CPU device
- *sampler = NULL;
- return true;
- }
-
- //! Reallocates device memory obje
- virtual bool reallocMemory(amd::Memory& owner) const { return true; }
-
- //! Just returns NULL as CPU devices use the host memory
- virtual device::Memory* createView(
- amd::Memory& owner, //!< Owner memory object
- const device::Memory& parent //!< Parent device memory object for the view
- ) const {
- return NULL;
- }
-
- //! Acquire external graphics API object in the host thread
- //! Needed for OpenGL objects on CPU device
-
- //! Return true if initialized interoperability, otherwise false
- virtual bool bindExternalDevice(uint flags, void* const pDevice[], void* pContext,
- bool validateOnly) {
- return true; // On CPU always avail if pD3DDevice is not NULL
- }
-
- virtual bool unbindExternalDevice(uint flags, void* const pDevice[], void* pContext,
- bool validateOnly) {
- return true;
- }
-
- //! Gets a pointer to a region of host-visible memory for use as the target
- //! of a non-blocking map for a given memory object
- virtual void* allocMapTarget(amd::Memory& mem, //!< Abstraction layer memory object
- const amd::Coord3D& origin, //!< The map location in memory
- const amd::Coord3D& region, //!< The map region in memory
- uint mapFlags, //!< Map flags
- size_t* rowPitch = NULL, //!< Row pitch for the mapped memory
- size_t* slicePitch = NULL //!< Slice for the mapped memory
- );
-
- //! Releases non-blocking map target memory
- virtual void freeMapTarget(amd::Memory& mem, void* target);
-
- //! Empty implementation on a CPU device
- virtual bool globalFreeMemory(size_t* freeMemory) const { return false; }
-
- //! Get CPU device settings
- const cpu::Settings& settings() const { return reinterpret_cast(*settings_); }
-
- bool hasAVXInstructions() const {
- return (settings().cpuFeatures_ & Settings::AVXInstructions) ? true : false;
- }
-
- bool hasFMA4Instructions() const {
- return (settings().cpuFeatures_ & Settings::FMA4Instructions) ? true : false;
- }
-
- static size_t getMaxWorkerThreadsNumber() { return maxWorkerThreads_; }
-
- void setWorkerThreadsAffinity(cl_uint numWorkerThreads,
- const amd::Os::ThreadAffinityMask* threadsAffinityMask,
- uint& baseCoreId);
-
- const amd::Os::ThreadAffinityMask* getWorkerThreadsAffinity() const {
- return workerThreadsAffinity_;
- }
- //! host memory alloc
- virtual void* svmAlloc(amd::Context& context, size_t size, size_t alignment,
- cl_svm_mem_flags flags, void* svmPtr) const {
- return NULL;
- }
-
- //! host memory deallocation
- virtual void svmFree(void* ptr) const { return; }
-
- private:
- bool initSubDevice(device::Info& info, cl_uint maxComputeUnits,
- const device::CreateSubDevicesInfo& create_info);
-
- cl_int partitionEqually(const device::CreateSubDevicesInfo& create_info, cl_uint num_entries,
- cl_device_id* devices, cl_uint* num_devices);
-
- cl_int partitionByCounts(const device::CreateSubDevicesInfo& create_info, cl_uint num_entries,
- cl_device_id* devices, cl_uint* num_devices);
-
- cl_int partitionByAffinityDomainNUMA(const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries, cl_device_id* devices,
- cl_uint* num_devices);
-
- cl_int partitionByAffinityDomainCacheLevel(const device::CreateSubDevicesInfo& create_info,
- cl_uint num_entries, cl_device_id* devices,
- cl_uint* num_devices);
-
- private:
-#if defined(__linux__) && defined(NUMA_SUPPORT)
- public:
- const nodemask_t* getNumaMask() const {
- return (info_.partitionCreateInfo_.type_ == device::PartitionType::BY_AFFINITY_DOMAIN &&
- info_.partitionCreateInfo_.byAffinityDomain_.numa_)
- ? numaMask_
- : NULL;
- }
-
- private:
- union {
- nodemask_t* numaMask_;
- amd::Os::ThreadAffinityMask* workerThreadsAffinity_; //!< As the number of compute units.
- };
-#else
- amd::Os::ThreadAffinityMask* workerThreadsAffinity_; //!< As the number of compute units.
-#endif
-
- static size_t maxWorkerThreads_; //!< Maximum number of Worker Threads
-};
-
-/*! @}
- * @}
- */
-
-} // namespace cpu
-
-#endif // CPUDEVICE_HPP_
diff --git a/rocclr/runtime/device/cpu/cpufeat.hpp b/rocclr/runtime/device/cpu/cpufeat.hpp
deleted file mode 100644
index 75ffceaedb..0000000000
--- a/rocclr/runtime/device/cpu/cpufeat.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef CPUFEAT_HPP
-#define CPUFEAT_HPP
-
-#define CPUFEAT_CX_SSE3 (1 << 0)
-#define CPUFEAT_CX_SSSE3 (1 << 9)
-#define CPUFEAT_CX_CMPXCHG16B (1 << 13)
-#define CPUFEAT_CX_SSE4_1 (1 << 19)
-#define CPUFEAT_CX_SSE4_2 (1 << 20)
-#define CPUFEAT_CX_POPCNT (1 << 23)
-#define CPUFEAT_CX_AES (1 << 25)
-#define CPUFEAT_CX_OSXSAVE (1 << 27)
-#define CPUFEAT_CX_AVX (1 << 28)
-
-#define INTEL_CPUFEAT_CX_FMA3 (1 << 12)
-
-#define AMD_CPUFEAT_CX_FMA4 (1 << 16)
-#define AMD_CPUFEAT_CX_XOP (1 << 11)
-#define AMD_CPUFEAT_CX_SSE4A (1 << 6)
-
-#define CPUFEAT_DX_SSE (1 < 25)
-#define CPUFEAT_DX_SSE2 (1 << 26)
-
-#endif // CPUFEAT_HPP
diff --git a/rocclr/runtime/device/cpu/cpukernel.S b/rocclr/runtime/device/cpu/cpukernel.S
deleted file mode 100644
index 19a1ce7d7b..0000000000
--- a/rocclr/runtime/device/cpu/cpukernel.S
+++ /dev/null
@@ -1,87 +0,0 @@
-#
-# Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-#
-
- .text
-.globl _WorkGroup_callKernel
-#if defined(ATI_ARCH_X86)
- .type _WorkGroup_callKernel, @function
-_WorkGroup_callKernel:
-#if defined(_LP64)
- pushq %rbp
- movq %rsp, %rbp
- movq %rdx, %rsp // stackPtr
- call *%rsi
- movq %rbp, %rsp
- popq %rbp
-#else // _LP64
- pushl %ebp
- movl %esp, %ebp
- movl 0x10(%ebp), %esp // stackPtr
- movl 0x0C(%ebp), %edx // entryPoint
- movl 0x08(%ebp), %ecx // params
- movl %ecx, (%esp)
- call *%edx
- movl %ebp, %esp
- popl %ebp
-#endif // _LP64
- ret
-#elif defined(ATI_ARCH_ARM)
- .type _WorkGroup_callKernel, %function
-_WorkGroup_callKernel:
- bx lr
-#endif
-
-.globl _WorkGroup_callKernelProtectedReturn
-#if defined(ATI_ARCH_X86)
- .type _WorkGroup_callKernelProtectedReturn, @function
-_WorkGroup_callKernelProtectedReturn:
-#if defined(_LP64)
- movq %rbp, %rax
- movq %rsp, %rbp
- movq %rdx, %rsp // stackPtr
- subq $CPUKERNEL_STACK_ALIGN, %rsp
- movq %rax, 0x08(%rsp) // save rbp
- movq %rbx, 0x00(%rsp) // save rbx
- movq (%rbp), %rbx // return address
-
- call *%rsi
-
- movq %rbx, %rdx
- movq %rbp, %rcx
- movq 0x00(%rsp), %rbx // load rbx
- movq 0x08(%rsp), %rbp // load rbp
- movq %rcx, %rsp
- addq $0x08, %rsp // skip return address
- jmp *%rdx
-#else // !_LP64
- movl %ebp, %eax
- movl %esp, %ebp
- movl 0x0C(%ebp), %esp // stackPtr
- subl $CPUKERNEL_STACK_ALIGN, %esp
- movl 0x04(%ebp), %ecx // params
- movl %eax, 0x08(%esp) // save ebp
- movl %ebx, 0x04(%esp) // save ebx
- movl %ecx, 0x00(%esp) // pass params
- movl 0x00(%ebp), %ebx // return address
- movl 0x08(%ebp), %edx // entryPoint
-
- call *%edx
-
- movl %ebx, %edx
- movl %ebp, %ecx
- movl 0x04(%esp), %ebx // load ebx
- movl 0x08(%esp), %ebp // load ebp
- movl %ecx, %esp
- addl $0x4, %esp // skip return address
- jmp *%edx
-#endif // !_LP64
-#elif defined(ATI_ARCH_ARM)
- .type _WorkGroup_callKernelProtectedReturn, %function
-_WorkGroup_callKernelProtectedReturn:
- bx lr
-#endif
-
-
-.section .note.GNU-stack,"",%progbits
-
diff --git a/rocclr/runtime/device/cpu/cpukernel.asm b/rocclr/runtime/device/cpu/cpukernel.asm
deleted file mode 100644
index bb729c9f58..0000000000
--- a/rocclr/runtime/device/cpu/cpukernel.asm
+++ /dev/null
@@ -1,84 +0,0 @@
-;
-; Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-;
-
-ifndef _WIN64
- .386
- .model flat, c
-endif ; !_WIN64
-
-OPTION PROLOGUE:NONE
-OPTION EPILOGUE:NONE
-.code
-
-ifndef _WIN64
-
-_WorkGroup_callKernel proc
- push ebp
- mov ebp, esp
- mov esp, 10h[ebp] ; stackPtr
- mov edx, 0Ch[ebp] ; entryPoint
- push 08h[ebp] ; params
- call edx
- mov esp, ebp
- pop ebp
- ret
-_WorkGroup_callKernel endp
-
-_WorkGroup_callKernelProtectedReturn proc
- mov eax, ebp
- mov ebp, esp
- mov esp, 0Ch[ebp] ; stackPtr
- sub esp, CPUKERNEL_STACK_ALIGN
- mov 04h[esp], eax ; save ebp
- mov 00h[esp], ebx ; save ebx
- mov ebx, 00h[ebp] ; return address
- mov edx, 08h[ebp] ; entryPoint
-
- push 04h[ebp] ; params
- call edx
-
- mov edx, ebx
- mov ecx, ebp
- mov ebx, 04h[esp] ; load ebx
- mov ebp, 08h[esp] ; load ebp
- mov esp, ecx
- add esp, 04h ; skip return address
- jmp edx
-_WorkGroup_callKernelProtectedReturn endp
-
-else ; _WIN64
-
-_WorkGroup_callKernel proc
- push rbp
- mov rbp, rsp
- mov rsp, r8 ; stackPtr
- call rdx
- mov rsp, rbp
- pop rbp
- ret
-_WorkGroup_callKernel endp
-
-_WorkGroup_callKernelProtectedReturn proc
- mov rax, rbp
- mov rbp, rsp
- mov rsp, r8 ; stackPtr
- sub rsp, CPUKERNEL_STACK_ALIGN
- mov 08h[rsp], rax ; save rbp
- mov 00h[rsp], rbx ; save rbx
- mov rbx, [rbp] ; return address
-
- call rdx
-
- mov rdx, rbx
- mov rcx, rbp
- mov rbx, 00h[rsp] ; load rbx
- mov rbp, 08h[rsp] ; load rbp
- mov rsp, rcx
- add rsp, 08h ; skip return address
- jmp rdx
-_WorkGroup_callKernelProtectedReturn endp
-
-endif ; _WIN64
-
-end
diff --git a/rocclr/runtime/device/cpu/cpukernel.hpp b/rocclr/runtime/device/cpu/cpukernel.hpp
deleted file mode 100644
index a2544850ce..0000000000
--- a/rocclr/runtime/device/cpu/cpukernel.hpp
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef CPUKERNEL_HPP_
-#define CPUKERNEL_HPP_
-
-#include "top.hpp"
-#include "device/device.hpp"
-#include
-
-#include "device/cpu/cpumapping.hpp"
-
-//! \namespace cpu CPU Device Implementation
-namespace cpu {
-
-//! \class CPU kernel
-class Kernel : public device::Kernel {
- private:
- const void* entryPoint_; //!< entry for the kernel
-
- std::vector > args_;
- std::vector > HCtoDCmaps_;
- std::vector internal_maps_;
-
- public:
- uint nature_; //!< kernel's nature
- uint privateSize_; //!< WorkItem's private memory size (in bytes)
-
- private:
- //! Disable default copy constructor
- Kernel(const Kernel&);
- //! Disable operator=
- Kernel& operator=(const Kernel&);
-
- public:
- void addArg(size_t size, size_t alignment) {
- args_.push_back(std::pair(size, alignment));
- }
-
- size_t getArgSize(int argIndex) const { return args_[argIndex].first; }
-
- size_t getArgAlignment(int argIndex) const { return args_[argIndex].second; }
-
- void addInternalMap(HCtoDCmap* new_map) {
- if (new_map != NULL) {
- internal_maps_.push_back(*new_map);
- this->addInternalMap(new_map->internal_field_map);
- this->addInternalMap(new_map->next_field_map);
- } else
- return;
- }
-
- void addHCtoDCmap(HCtoDCmap* new_map) {
- if (new_map != NULL) {
- if (HCtoDCmaps_.size() > 0)
- HCtoDCmaps_.push_back(std::pair(*new_map, HCtoDCmaps_.back().second));
- else
- HCtoDCmaps_.push_back(std::pair(*new_map, 0));
- } else
- return;
- }
-
- HCtoDCmap getHCtoDCmap(int mapIndex) const { return HCtoDCmaps_[mapIndex].first; }
-
-
- uint getArgNumber() { return HCtoDCmaps_.size(); }
-
- //! Default constructor
- Kernel(const std::string& name)
- : device::Kernel(name), entryPoint_(NULL), nature_(0), privateSize_(CLK_PRIVATE_MEMORY_SIZE) {
- workGroupInfo_.size_ = CPU_MAX_WORKGROUP_SIZE;
- }
-
- //! Default destructor
- ~Kernel() {}
-
- //! Returns the CPU kernel entry point
- const void* getEntryPoint() const { return entryPoint_; }
-
- //! Sets the CPU kernel entry point
- void setEntryPoint(const void* entryPoint) { entryPoint_ = entryPoint; }
-
- //! Returns true if the kernel has a call to barrier
- bool hasBarrier() const { return 0 != (nature_ & KN_HAS_BARRIER); }
-
- //! Returns the private memory size of a single WorkItem
- uint getWorkItemPrivateMemSize() const { return privateSize_; }
-};
-
-} // namespace cpu
-
-#endif // CPUKERNEL_HPP_
diff --git a/rocclr/runtime/device/cpu/cpumapping.cpp b/rocclr/runtime/device/cpu/cpumapping.cpp
deleted file mode 100644
index 43b3279fae..0000000000
--- a/rocclr/runtime/device/cpu/cpumapping.cpp
+++ /dev/null
@@ -1,427 +0,0 @@
-//
-// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#include "device/cpu/cpudevice.hpp"
-#include "device/cpu/cpukernel.hpp"
-#include "platform/program.hpp"
-#include "os/os.hpp"
-#include "device/cpu/cpumapping.hpp"
-#include
-#include
-#include
-#include
-#include
-
-#if defined(_WIN32)
-#include
-#endif
-// amdrt.o
-#if defined(WITH_ONLINE_COMPILER) && !defined(_LP64) && !defined(ATI_ARCH_ARM)
-#include "amdrt.inc"
-#endif
-#include "acl.h"
-using std::min;
-using std::max;
-
-namespace cpu {
-HCtoDCmap::HCtoDCmap(const clk_parameter_descriptor_t* desc, unsigned int level_alignment,
- unsigned int index, unsigned int init_offset) {
- level_alignment =
- std::max(level_alignment,
- 1u); // Minimal possible alignment is 1 and alignment is used as a divisor below.
- // Initialize fields
- hc_offset = 0;
- hc_size = 0;
- dc_offset = 0;
- dc_size = 0;
- hc_alignment = level_alignment;
- dc_alignment = level_alignment;
- internal_field_map = NULL;
- next_field_map = NULL;
- return;
-}
-
-HCtoDCmap::~HCtoDCmap() { return; }
-
-// Helper to find sizes of each scalar type
-size_t HCtoDCmap::getHostScalarParamSize(const clk_value_type_t type) const {
- size_t size = 0;
- switch (type) {
- case T_CHAR:
- size = 1;
- break;
- case T_SHORT:
- case T_CHAR2:
- size = 2;
- break;
- case T_FLOAT:
- case T_INT:
- case T_CHAR4:
- case T_SHORT2:
- case T_CHAR3:
- size = 4;
- break;
- case T_SAMPLER:
- size = 4;
- break;
- case T_LONG:
- case T_DOUBLE:
- case T_CHAR8:
- case T_SHORT4:
- case T_INT2:
- case T_FLOAT2:
- case T_SHORT3:
- size = 8;
- break;
- case T_INT3:
- case T_FLOAT3:
- case T_CHAR16:
- case T_SHORT8:
- case T_INT4:
- case T_FLOAT4:
- case T_LONG2:
- case T_DOUBLE2:
- size = 16;
- break;
- case T_LONG3:
- case T_DOUBLE3:
- case T_SHORT16:
- case T_INT8:
- case T_FLOAT8:
- case T_LONG4:
- case T_DOUBLE4:
- size = 32;
- break;
- case T_INT16:
- case T_FLOAT16:
- case T_LONG8:
- case T_DOUBLE8:
- size = 64;
- break;
- case T_LONG16:
- case T_DOUBLE16:
- size = 128;
- break;
- case T_POINTER:
- case T_VOID:
- size = sizeof(void*);
- break;
- default:
- assert(0 && "unknown scalar parameter size");
- break;
- }
- return size;
-}
-
-size_t HCtoDCmap::getScalarAlignment(const clk_value_type_t type, bool isHost) const {
- size_t align = 0;
- switch (type) {
- case T_CHAR:
- align = 1;
- break;
- case T_SHORT:
- case T_CHAR2:
- align = 2;
- break;
- case T_FLOAT:
- case T_INT:
- case T_CHAR4:
- case T_SHORT2:
- case T_CHAR3:
- align = 4;
- break;
- case T_SAMPLER:
- align = sizeof(uint32_t);
- break;
- case T_LONG:
-#if defined(_WIN32)
- align = 8;
-#else
- align = isHost ? 8 : LP64_SWITCH(4, 8);
-#endif
- break;
- case T_DOUBLE:
-#if defined(_WIN32)
- align = 8;
-#else
- align = LP64_SWITCH(4, 8);
-#endif
- break;
- case T_CHAR8:
- case T_SHORT4:
- case T_INT2:
- case T_FLOAT2:
- case T_SHORT3:
- align = 4;
- break;
- case T_INT3:
- case T_FLOAT3:
- case T_CHAR16:
- case T_SHORT8:
- case T_INT4:
- case T_FLOAT4:
- case T_LONG2:
- case T_DOUBLE2:
- case T_LONG3:
- case T_DOUBLE3:
- case T_SHORT16:
- case T_INT8:
- case T_FLOAT8:
- case T_LONG4:
- case T_DOUBLE4:
- case T_INT16:
- case T_FLOAT16:
- case T_LONG8:
- case T_DOUBLE8:
- case T_LONG16:
- case T_DOUBLE16:
- align = LP64_SWITCH(4, 8);
- break;
- case T_POINTER:
- case T_VOID:
- align = sizeof(void*);
- break;
- default:
- assert(0 && "unknown scalar parameter alignment");
- break;
- }
- return align;
-}
-
-// Align up arguments within each map, return the size of current map parameter
-// Input current alignment of the parameter, size of outer struct if it exists
-void HCtoDCmap::align_map(unsigned outer_hc_alignment, unsigned outer_dc_alignment,
- unsigned& outer_hc_size, unsigned& outer_dc_size, int& inStruct) {
- unsigned map_param_size = 0;
- if (internal_field_map != NULL) {
- hc_size = 0; // Recalculate size to account for internal offsets
- inStruct++;
- internal_field_map->align_map(
- hc_alignment, dc_alignment, hc_size, dc_size,
- inStruct); // align internal struct, might alter size of this struct
- if (hc_alignment != 1 && hc_size % hc_alignment)
- hc_size = max(hc_size, hc_size - (hc_size % hc_alignment) + hc_alignment);
- if (dc_alignment != 1 && dc_size % dc_alignment)
- dc_size = max(dc_size, dc_size - (dc_size % dc_alignment) + dc_alignment);
- }
- // Use map_param_size to store current parameter size after adjusting alignment
- if (hc_alignment != 1 && hc_size % hc_alignment != 0) {
- map_param_size = max(hc_alignment, hc_size - (hc_size % hc_alignment) + hc_alignment);
- } else {
- map_param_size = max(hc_alignment, hc_size);
- }
- if (next_field_map != NULL) {
- next_field_map->hc_offset = this->next_offset(hc_offset, map_param_size, inStruct);
- next_field_map->align_map(outer_hc_alignment, outer_dc_alignment, outer_hc_size, outer_dc_size,
- inStruct);
- // Reset parameter size for char padding
- if (next_field_map->type == T_CHAR) map_param_size = 1;
- } else {
- // Moving out of struct
- if (inStruct > 0) inStruct--;
- if (type == T_CHAR) map_param_size = 1;
- }
- outer_hc_size = max(outer_hc_size, hc_offset + map_param_size);
- outer_dc_size = max(outer_dc_size, dc_offset + dc_size);
- return;
-}
-
-// Return current size of map, calculate internal maps and process next args if in struct.
-// Alignment: alignment flag for members in case of structs, alignment of scalar otherwise.
-int HCtoDCmap::compute_map(const clk_parameter_descriptor_t* desc, unsigned int& outer_hc_alignment,
- unsigned int& outer_dc_alignment, unsigned int init_offset,
- int& inStruct, int& index_out) {
- unsigned internal_index;
- internal_index = index_out;
- unsigned int next_offset = init_offset;
- unsigned struct_size = 0;
- type = desc[internal_index].type;
-
- if (desc[internal_index].type == T_STRUCT) {
- // Moving into struct, go to next index
- inStruct++;
- hc_offset = init_offset;
- if (desc[index_out + 1].type != T_VOID) {
- index_out++;
- internal_index = index_out;
- internal_field_map = new HCtoDCmap(desc, 0, internal_index, init_offset);
- hc_size = internal_field_map->compute_map(desc, hc_alignment, dc_alignment, next_offset,
- inStruct, index_out);
- hc_alignment =
- max(hc_alignment,
- internal_field_map->hc_alignment); // Adjust alignment to biggest member alignment
- struct_size = hc_size;
- internal_index = index_out;
- outer_hc_alignment = max(outer_hc_alignment, hc_alignment);
- if (inStruct > 0) {
- if (desc[index_out + 1].type != T_VOID) {
- // Still inside struct and not done
- index_out++;
- internal_index = index_out;
- next_field_map = new HCtoDCmap(desc, 0, internal_index, next_offset);
- struct_size = hc_size;
- struct_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment,
- next_offset, inStruct, index_out);
- next_offset = max(next_field_map->hc_offset + next_field_map->hc_size,
- next_field_map->hc_offset + hc_alignment);
- // running count of strucdc_size = hc_size + size of next member
- return struct_size;
- } else {
- // Moving out of struct, go to next index
- index_out++;
- internal_index = index_out;
- inStruct--;
- return hc_size; // return last struct member size
- }
- }
- }
- } else if (desc[internal_index].type == T_PAD) {
- // Struct has padding
- hc_offset = init_offset;
- if (desc[index_out + 1].type != T_VOID) {
- index_out++;
- internal_index = index_out;
- internal_field_map = new HCtoDCmap(desc, 0, internal_index, init_offset);
- hc_size = internal_field_map->compute_map(desc, hc_alignment, dc_alignment, next_offset,
- inStruct, index_out);
- // Adjust alignment to biggest member alignment
- hc_alignment = 1;
- dc_alignment = 1;
- unsigned pad_size = hc_size;
- internal_index = index_out;
- if (desc[index_out + 1].type != T_VOID) {
- // Still inside padding and not done
- index_out++;
- internal_index = index_out;
- next_field_map = new HCtoDCmap(desc, 0, internal_index, next_offset);
- pad_size = hc_size;
- pad_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment,
- next_offset, inStruct, index_out);
- next_offset = max(next_field_map->hc_offset + next_field_map->hc_size,
- next_field_map->hc_offset + hc_alignment);
- // running count of padding dc_size = hc_size + size of next member
- return pad_size;
- } else {
- // Moving out of struct, go to next index
- index_out++;
- internal_index = index_out;
- return hc_size; // return last padding member size
- }
- }
- } else {
- // Scalar parameter
- hc_offset = init_offset;
- hc_size = getHostScalarParamSize(desc[internal_index].type);
- dc_size = hc_size;
- hc_alignment = getScalarAlignment(desc[internal_index].type, true);
- dc_alignment = getScalarAlignment(desc[internal_index].type, false);
- outer_hc_alignment = max(outer_hc_alignment, hc_alignment); // Adjust alignment of upper level
- // struct if necessary, upper level
- // alignment = max alignment of
- // members
- outer_dc_alignment = max(outer_dc_alignment, dc_alignment); // Adjust alignment of upper level
- // struct if necessary, upper level
- // alignment = max alignment of
- // members
- if (inStruct > 0) {
- if (desc[index_out + 1].type != T_VOID) {
- // Still inside struct and not done
- index_out++;
- next_field_map = new HCtoDCmap(desc, outer_hc_alignment, internal_index, next_offset);
- struct_size = hc_size;
- struct_size += next_field_map->compute_map(desc, outer_hc_alignment, outer_dc_alignment,
- next_offset, inStruct, index_out);
- next_offset = hc_offset + hc_alignment;
- outer_hc_alignment = max(outer_hc_alignment, next_field_map->hc_alignment);
- outer_dc_alignment = max(outer_dc_alignment, next_field_map->dc_alignment);
- // running count of strucdc_size = hc_size + size of next member
- return struct_size;
- } else {
- // Moving out of struct, go to next index
- index_out++;
- inStruct--;
- return hc_size; // return last struct member size
- }
- }
- }
- return hc_size;
-}
-
-// Adjust offset for source and target, return next source offset
-unsigned HCtoDCmap::next_offset(unsigned current_offset, unsigned& map_param_size,
- int& inStruct_flag) {
- unsigned next_offset = current_offset;
- if (next_field_map == NULL) {
- assert(0 && "invalid next struct field map");
- return next_offset;
- } else {
- // Ignore alignment when a char occurs to account for padding
- if (type == T_PAD) {
- next_field_map->dc_offset = dc_offset + dc_size;
- next_offset = current_offset + hc_size;
- } else {
- if ((dc_offset + dc_size) % next_field_map->dc_alignment != 0) {
- this->next_field_map->dc_offset = dc_offset + dc_size -
- (dc_size % next_field_map->dc_alignment) + next_field_map->dc_alignment;
- } else {
- this->next_field_map->dc_offset = dc_offset + max(dc_size, next_field_map->dc_alignment);
- }
- if ((hc_offset + hc_size) % next_field_map->hc_alignment != 0) {
- next_offset = hc_offset + hc_size - (hc_size % next_field_map->hc_alignment) +
- next_field_map->hc_alignment;
- } else {
- next_offset = hc_offset + max(next_field_map->hc_alignment, map_param_size);
- }
- }
- return next_offset;
- }
-}
-
-// Copy memory according to mapping
-unsigned int HCtoDCmap::copy_params(void* dst, const void* src, unsigned int arg_offset,
- int& error_code, int& inStruct) const {
- unsigned int padding = 0;
- // Pad offset to be aligned by 8 if parameter is double, not as struct field
- if ((arg_offset) % 8 != 0 && (type == T_DOUBLE) && inStruct == 0)
- padding = hc_alignment - ((arg_offset + dc_offset) % hc_alignment);
-#if defined(_WIN32)
- // In windows, double is aligned by 8, add padding to struct if it contains double
- if ((arg_offset + dc_offset) % 8 != 0 && hc_alignment == 8)
- padding = hc_alignment - ((arg_offset + dc_offset) % hc_alignment);
-#endif
- ::memcpy(reinterpret_cast(reinterpret_cast(dst) + padding), src, hc_size);
-#if defined(_WIN32)
- if (internal_field_map != NULL) {
- inStruct++;
- void* internal_dst = reinterpret_cast(reinterpret_cast(dst) + padding);
- internal_field_map->copy_params(internal_dst, src, arg_offset + padding, error_code, inStruct);
- inStruct--;
- }
- if (next_field_map != NULL) {
- void* next_dst =
- reinterpret_cast(reinterpret_cast(dst) +
- next_field_map->dc_offset); // Next field starts with padding
- const void* next_src = reinterpret_cast(
- reinterpret_cast(src) + next_field_map->hc_offset);
- next_field_map->copy_params(next_dst, next_src, arg_offset + next_field_map->dc_offset,
- error_code, inStruct);
- }
-#else
- if (internal_field_map != NULL) {
- inStruct++;
- internal_field_map->copy_params(dst, src, arg_offset, error_code, inStruct);
- inStruct--;
- }
- if (next_field_map != NULL) {
- void* next_dst =
- reinterpret_cast(reinterpret_cast(dst) + next_field_map->dc_offset);
- const void* next_src = reinterpret_cast(
- reinterpret_cast(src) + next_field_map->hc_offset);
- next_field_map->copy_params(next_dst, next_src, arg_offset, error_code, inStruct);
- }
-#endif
- return padding;
-}
-
-} // namespace cpu
\ No newline at end of file
diff --git a/rocclr/runtime/device/cpu/cpumapping.hpp b/rocclr/runtime/device/cpu/cpumapping.hpp
deleted file mode 100644
index 00531ef8ea..0000000000
--- a/rocclr/runtime/device/cpu/cpumapping.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-// HCtoDCmap provides a mapping of parameters from host compiler to device compiler
-// The mapping can be used to copy parameters from host to device where field alignment
-// is different in compilers
-#ifndef CPUMAPPING_HPP_
-#define CPUMAPPING_HPP_
-
-namespace cpu {
-
-class HCtoDCmap {
- public:
- unsigned int hc_offset, hc_size; // Offset and size of this parameter in host compiler
- unsigned int dc_offset, dc_size; // Offset and size of this parameter in device compiler
- unsigned int hc_alignment; // Alignment of parameter in host compiler
- unsigned int dc_alignment; // Alignment of parameter in device compiler
- clk_value_type_t type; // Type of parameter
- HCtoDCmap*
- internal_field_map; // Pointer to internal mapping when current parameter is of type T_STRUCT
- HCtoDCmap*
- next_field_map; // Pointer to next struct field when current parameter is a struct member
-
- HCtoDCmap(const clk_parameter_descriptor_t*, unsigned int, unsigned int, unsigned int);
- virtual ~HCtoDCmap();
- int compute_map(const clk_parameter_descriptor_t*, unsigned int&, unsigned int&, unsigned int,
- int&, int&);
- unsigned next_offset(unsigned, unsigned&, int&);
- size_t getHostScalarParamSize(const clk_value_type_t) const;
- size_t getScalarAlignment(const clk_value_type_t, bool) const;
- void align_map(unsigned, unsigned, unsigned&, unsigned&, int&);
- unsigned int copy_params(void*, const void*, unsigned int, int&, int&) const;
-
- private:
-};
-
-
-} // namespace cpu
-
-#endif // CPUMAPPING_HPP_
- // Mapping rule
- // Long types are treated with 8 byte alignment in runtime when passed in as arguments
- // but they are treated with 4 byte alignment in compiler
- // Double members have 8 byte alignment when passed as scalar argument
- // but have 4 byte alignment as a field inside a struct
\ No newline at end of file
diff --git a/rocclr/runtime/device/cpu/cpuprogram.cpp b/rocclr/runtime/device/cpu/cpuprogram.cpp
deleted file mode 100644
index 5f52cdf574..0000000000
--- a/rocclr/runtime/device/cpu/cpuprogram.cpp
+++ /dev/null
@@ -1,1276 +0,0 @@
-
-//
-// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#include "device/cpu/cpuprogram.hpp"
-#include "device/cpu/cpudevice.hpp"
-#include "device/cpu/cpukernel.hpp"
-#include "platform/program.hpp"
-#include "utils/options.hpp"
-#include "os/os.hpp"
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#if defined(_WIN32)
-#include
-#endif
-
-// amdrt.o
-#if defined(WITH_ONLINE_COMPILER) && !defined(_LP64) && !defined(ATI_ARCH_ARM)
-#include "amdrt.inc"
-#endif
-
-// CLC_IN_PROCESS_CHANGE
-extern int openclFrontEnd(const char* cmdline, std::string*, std::string* typInfo = NULL);
-
-namespace cpu {
-
-static inline bool isScalar(clk_value_type_t type) {
- switch (type) {
- case T_CHAR:
- case T_SHORT:
- case T_INT:
- case T_LONG:
- case T_FLOAT:
- case T_DOUBLE:
- case T_POINTER:
- return true;
- default:
- return false;
- }
-}
-
-
-static cl_kernel_arg_address_qualifier getParamAddressQualifier(
- const clk_parameter_descriptor_t* desc) {
- switch (desc->space) {
- case A_LOCAL:
- return CL_KERNEL_ARG_ADDRESS_LOCAL;
- break;
- case A_CONSTANT:
- return CL_KERNEL_ARG_ADDRESS_CONSTANT;
- break;
- case A_GLOBAL:
- return CL_KERNEL_ARG_ADDRESS_GLOBAL;
- break;
- default:
- return CL_KERNEL_ARG_ADDRESS_PRIVATE;
- break;
- }
-}
-
-static cl_kernel_arg_type_qualifier getParamTypeQualifier(const clk_parameter_descriptor_t* desc) {
- cl_kernel_arg_type_qualifier typeQualifier = CL_KERNEL_ARG_TYPE_NONE;
-
- if (desc->space == A_CONSTANT) {
- typeQualifier |= CL_KERNEL_ARG_TYPE_CONST;
- }
-
- if ((desc->qualifier & Q_CONST) != 0) {
- typeQualifier |= CL_KERNEL_ARG_TYPE_CONST;
- }
- if ((desc->qualifier & Q_RESTRICT) != 0) {
- typeQualifier |= CL_KERNEL_ARG_TYPE_RESTRICT;
- }
- if ((desc->qualifier & Q_VOLATILE) != 0) {
- typeQualifier |= CL_KERNEL_ARG_TYPE_VOLATILE;
- }
-
- if ((desc->qualifier & Q_PIPE) != 0) {
- typeQualifier = CL_KERNEL_ARG_TYPE_PIPE;
- }
-
- return typeQualifier;
-}
-
-static cl_kernel_arg_access_qualifier getParamAccessQualifier(
- const clk_parameter_descriptor_t* desc) {
- uint access = desc->qualifier & (Q_READ | Q_WRITE);
- switch (access) {
- case Q_READ:
- return CL_KERNEL_ARG_ACCESS_READ_ONLY;
- break;
- case Q_WRITE:
- return CL_KERNEL_ARG_ACCESS_WRITE_ONLY;
- break;
- case (Q_READ | Q_WRITE):
- return CL_KERNEL_ARG_ACCESS_READ_WRITE;
- break;
- default:
- return CL_KERNEL_ARG_ACCESS_NONE;
- break;
- }
-}
-
-static size_t getScalarParamSize(bool cpuLayer, const clk_value_type_t type,
- cl_kernel_arg_address_qualifier qualifier) {
- size_t size = 0;
-
- if (qualifier == CL_KERNEL_ARG_ADDRESS_LOCAL) {
- return cpuLayer ? sizeof(void*) : 0;
- }
-
- switch (type) {
- case T_CHAR:
- size = 1;
- break;
- case T_SHORT:
- case T_CHAR2:
- size = 2;
- break;
- case T_FLOAT:
- case T_INT:
- case T_CHAR4:
- case T_SHORT2:
- case T_CHAR3:
- size = 4;
- break;
- case T_SAMPLER:
- size = cpuLayer ? sizeof(uint32_t) : sizeof(cl_sampler);
- break;
- case T_LONG:
- case T_DOUBLE:
- case T_CHAR8:
- case T_SHORT4:
- case T_INT2:
- case T_FLOAT2:
- case T_SHORT3:
- size = 8;
- break;
- case T_INT3:
- case T_FLOAT3:
- case T_CHAR16:
- case T_SHORT8:
- case T_INT4:
- case T_FLOAT4:
- case T_LONG2:
- case T_DOUBLE2:
- size = 16;
- break;
- case T_LONG3:
- case T_DOUBLE3:
- case T_SHORT16:
- case T_INT8:
- case T_FLOAT8:
- case T_LONG4:
- case T_DOUBLE4:
- size = 32;
- break;
- case T_INT16:
- case T_FLOAT16:
- case T_LONG8:
- case T_DOUBLE8:
- size = 64;
- break;
- case T_LONG16:
- case T_DOUBLE16:
- size = 128;
- break;
- case T_POINTER:
- case T_VOID:
- size = sizeof(void*);
- break;
- default:
- ShouldNotReachHere();
- break;
- }
- return size;
-}
-
-static size_t getParamSizeImpl(bool cpuLayer, const clk_parameter_descriptor_t* desc,
- unsigned index, cl_kernel_arg_address_qualifier qualifier,
- size_t* alignment, unsigned* index_out) {
- size_t size = 0;
- if (desc[index].type == T_STRUCT || desc[index].type == T_PAD) {
- size_t maxAlignment = 0;
- size_t structSize = 0;
- size_t structAlignment = 0;
- index++;
- while (desc[index].type != T_VOID) {
- size_t elementAlignment = 0;
- size_t elementSize =
- getParamSizeImpl(cpuLayer, desc, index, qualifier, &elementAlignment, index_out);
-#if defined(_WIN32)
- maxAlignment = std::max(maxAlignment, elementAlignment);
-#else
- // In Linux, the alignment of long field is 4 for GCC,
- // but it is 8 on LLVM side
- if (desc[index].type == T_LONG)
- structAlignment = cpuLayer ? LP64_SWITCH(4, 8) : 8;
- else
- structAlignment = std::max(maxAlignment, elementAlignment);
- maxAlignment = std::max(maxAlignment, structAlignment);
-#endif
- index = *index_out;
- structSize = amd::alignUp(structSize, std::min(elementAlignment, size_t(16))) + elementSize;
- }
- *index_out = index + 1;
- *alignment = maxAlignment;
- size = amd::alignUp(structSize, std::min(maxAlignment, size_t(16)));
- } else {
- size = getScalarParamSize(cpuLayer, desc[index].type, qualifier);
- if (desc[index].type == T_DOUBLE) {
-#if defined(_WIN32)
- *alignment = 8;
-#else
- *alignment = LP64_SWITCH(4, 8);
-#endif
- } else if (desc[index].type == T_LONG) {
- *alignment = 8;
- } else {
- *alignment = size;
- }
- *index_out = index + 1;
- }
- return size;
-}
-
-size_t getParamSize(bool cpuLayer, const clk_parameter_descriptor_t* desc,
- cl_kernel_arg_address_qualifier qualifier, size_t* alignment) {
- unsigned index_out = 0;
- return getParamSizeImpl(cpuLayer, desc, 0, qualifier, alignment, &index_out);
-}
-
-
-static unsigned getNumTypeDescs(const clk_parameter_descriptor_t* desc) {
- int numStruct = 0;
- unsigned i;
- for (i = 0; desc[i].type != T_VOID || numStruct > 0; ++i) {
- if (desc[i].type == T_STRUCT || desc[i].type == T_PAD) numStruct++;
- if (desc[i].type == T_VOID) numStruct--;
- }
- return i + 1;
-}
-
-static clk_value_type_t getFirstScalarType(const clk_parameter_descriptor_t* desc) {
- int i = 0;
- while (desc[i].type == T_STRUCT) i++;
-
- return desc[i].type;
-}
-
-static const clk_value_type_t getParamType(const clk_parameter_descriptor_t* desc,
- const clk_parameter_descriptor_t** desc_out,
- const char** type_name) {
- unsigned numDescs = getNumTypeDescs(desc);
- *desc_out = desc + numDescs;
- *type_name = desc[numDescs - 1].name;
- // Use old behaviour and return first scalar type in case of a struct.
- return getFirstScalarType(desc);
-}
-
-static amd::KernelParameterDescriptor getParam(bool cpuLayer,
- const clk_parameter_descriptor_t* desc,
- size_t offset_in,
- const clk_parameter_descriptor_t** desc_out) {
- size_t alignment;
-
- amd::KernelParameterDescriptor param;
- param.name_ = desc->name;
- param.type_ = getParamType(desc, desc_out, &(param.typeName_));
- param.addressQualifier_ = getParamAddressQualifier(desc);
- param.typeQualifier_ = getParamTypeQualifier(desc);
- param.accessQualifier_ = getParamAccessQualifier(desc);
- param.size_ = getParamSize(cpuLayer, desc, param.addressQualifier_, &alignment);
- if (param.size_ == 0) {
- param.offset_ = amd::alignUp(offset_in, std::min(sizeof(cl_mem), size_t(16)));
- } else {
- param.offset_ = amd::alignUp(offset_in, std::min(alignment, size_t(16)));
- }
- return param;
-}
-
-static bool setKernelInfoCallback(std::string symbol, const void* value, void* data) {
- cpu::Program* program = reinterpret_cast(data);
- device::Program::kernels_t& kernels = program->kernels();
- const char __OpenCL_[] = "__OpenCL_";
- const char _kernel[] = "_stub";
- const char _data[] = "_metadata";
- const char _nature[] = "_nature";
-
- const size_t offset = sizeof(__OpenCL_) - 1;
- if (symbol.compare(0, offset, __OpenCL_) != 0) {
- return false;
- }
-
- size_t suffixPos = symbol.rfind('_');
- if (suffixPos == std::string::npos) {
- return false;
- }
-
- std::string name = symbol.substr(offset, suffixPos - offset);
- cpu::Kernel* kernel = reinterpret_cast(kernels[name]);
- if (NULL == kernel) {
- kernel = new Kernel(name);
- kernels[name] = kernel;
- }
-
- if (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0) {
- kernel->setEntryPoint(value);
- return true;
- } else if (symbol.compare(suffixPos, sizeof(_data) - 1, _data) == 0) {
- device::Kernel::parameters_t params;
-
- size_t* recordPtr = (size_t*)value;
- size_t* recordEnd = recordPtr + (*recordPtr) / sizeof(size_t);
- ++recordPtr; // skip struct_length
-
- kernel->setLocalMemSize(*recordPtr++);
- kernel->setPreferredSizeMultiple(1);
-
- kernel->setUniformWorkGroupSize(
- program->getCompilerOptions()->oVariables->UniformWorkGroupSize);
-
- kernel->setReqdWorkGroupSize(recordPtr[0], recordPtr[1], recordPtr[2]);
- recordPtr += 3;
-
- kernel->setWorkGroupSizeHint(recordPtr[0], recordPtr[1], recordPtr[2]);
- recordPtr += 3;
-
- const clk_parameter_descriptor_t* desc =
- reinterpret_cast(recordPtr);
-
- size_t offset = 0;
- while (desc->type != T_VOID) {
- const clk_parameter_descriptor_t* next_desc = NULL;
- amd::KernelParameterDescriptor param = getParam(false, desc, offset, &next_desc);
-
- size_t cpuSize, cpuAlignment;
- cpuSize = getParamSize(true, desc, param.addressQualifier_, &cpuAlignment);
- kernel->addArg(cpuSize, cpuAlignment);
-
- // Init for HCtoDCmap
- unsigned int init_offset = 0;
- unsigned int align = 0;
- int inStruct = 0;
- int end_index = 0;
- HCtoDCmap* map_p = new HCtoDCmap(desc, align, 0, init_offset);
- map_p->dc_size = map_p->compute_map(desc, map_p->hc_alignment, map_p->dc_alignment,
- init_offset, inStruct, end_index);
- map_p->align_map(map_p->hc_alignment, map_p->dc_alignment, map_p->hc_size, map_p->dc_size,
- inStruct);
- if (CPU_USE_ALIGNMENT_MAP == 0) {
- kernel->addHCtoDCmap(map_p);
- if (map_p->internal_field_map != NULL) {
- kernel->addInternalMap(map_p->internal_field_map);
- }
- } else {
- delete (map_p);
- }
- // End of HCtoDCmap
-
- desc = next_desc;
- params.push_back(param);
- size_t size = param.size_ == 0 ? sizeof(cl_mem) : param.size_;
-#if defined(USE_NATIVE_ABI)
- size = amd::alignUp(size, sizeof(size_t));
-#endif // USE_NATIVE_ABI
- offset = param.offset_ + size;
- }
-
- // retrieve vector type hint metadata
- const clk_parameter_descriptor_t* vth_desc = NULL;
- getParam(false, desc, offset, &vth_desc);
- const size_t* vthPtr = reinterpret_cast(vth_desc);
- if (vthPtr < recordEnd && *vthPtr != 0) {
- const char* vecTypeHint = reinterpret_cast(*vthPtr);
- kernel->setVecTypeHint(vecTypeHint);
- }
-
- if (kernel->createSignature(params)) {
- return true;
- }
- } else if (symbol.compare(suffixPos, sizeof(_nature) - 1, _nature) == 0) {
- uint32_t* recordPtr = (uint32_t*)value;
- kernel->nature_ = (uint)recordPtr[0];
- kernel->privateSize_ = (uint)recordPtr[1];
- return true;
- }
-
- return false;
-}
-
-static bool setKernelInfoCallbackCStr(const char* symbol, const void* value, void* data) {
- std::string symbolString(symbol);
- return setKernelInfoCallback(symbolString, value, data);
-}
-
-static bool setSymbolsCallback(std::string symbol, const void* value, void* data) {
- device::ClBinary* clbinary = (device::ClBinary*)data;
- const char __OpenCL_[] = "__OpenCL_";
- const char _stub[] = "_stub";
- const char _kernel[] = "_kernel";
- const char _data[] = "_metadata";
-
- const size_t offset = sizeof(__OpenCL_) - 1;
- if (symbol.compare(0, offset, __OpenCL_) != 0) {
- return false;
- }
-
- size_t suffixPos = symbol.rfind('_');
- if (suffixPos == std::string::npos) {
- return false;
- }
-
- if ((symbol.compare(suffixPos, sizeof(_stub) - 1, _stub) == 0) ||
- (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0) ||
- (symbol.compare(suffixPos, sizeof(_data) - 1, _data) == 0)) {
- return clbinary->elfOut()->addSymbol(amd::OclElf::DLL, const_cast(symbol.c_str()), 0,
- false);
- }
- return false;
-}
-
-static bool setSymbolsCallbackCStr(const char* symbol, const void* value, void* data) {
- std::string symbolString(symbol);
- return setSymbolsCallback(symbolString, value, data);
-}
-
-// Some helper functions to simplify testing the disassembler
-struct DisasData {
- public:
- DisasData(std::stringstream* stream, aclJITObjectImage im, aclCompiler* cmpl)
- : asmstream(stream), image(im), compiler(cmpl){};
- std::stringstream* asmstream;
- aclJITObjectImage image;
- aclCompiler* compiler;
-};
-
-#if defined(LEGACY_COMPLIB)
-static bool disasSymbolsCallback(std::string symbol, const void* value, void* data) {
- DisasData* disasData = (DisasData*)data;
- std::stringstream& asmstream = *(disasData->asmstream);
- aclJITObjectImage image = disasData->image;
- aclCompiler* compiler = disasData->compiler;
- const char __OpenCL_[] = "__OpenCL_";
- const char _stub[] = "_stub";
- const char _kernel[] = "_kernel";
- const char _data[] = "_metadata";
-
- const size_t offset = sizeof(__OpenCL_) - 1;
- if (symbol.compare(0, offset, __OpenCL_) != 0) {
- return false;
- }
-
- size_t suffixPos = symbol.rfind('_');
- if (suffixPos == std::string::npos) {
- return false;
- }
-
- if ((symbol.compare(suffixPos, sizeof(_stub) - 1, _stub) == 0) ||
- (symbol.compare(suffixPos, sizeof(_kernel) - 1, _kernel) == 0)) {
- acl_error err = ACL_SUCCESS;
- char* kernelDisas = aclJITObjectImageDisassembleKernel(compiler, image, symbol.c_str(), &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageDisassembleKernel failed");
- return false;
- }
- asmstream << kernelDisas;
- free(kernelDisas);
- }
- return false;
-}
-
-static bool disasSymbolsCallbackCStr(const char* symbol, const void* value, void* data) {
- std::string symbolString(symbol);
- return disasSymbolsCallback(symbolString, value, data);
-}
-#endif
-
-bool Program::compileBinaryToISA(amd::option::Options* options) {
- const bool has_avx = !options->oVariables->DisableAVX && device().hasAVXInstructions();
- const bool has_fma4 = device().hasFMA4Instructions();
-
-#if defined(WITH_ONLINE_COMPILER)
- std::string tempName = amd::Os::getTempFileName();
- dllFileName_ = tempName + "dbg" + "." IF(IS_WINDOWS, "dll", "so");
-
- acl_error err = ACL_SUCCESS;
- aclTargetInfo aclinfo = info(has_avx ?
- /*has_fma4 ? "Bulldozer" :*/
- "Corei7_AVX"
- : "Athlon64");
-
- aclBinaryOptions binOpts = {0};
- binOpts.struct_size = sizeof(binOpts);
- binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
- binOpts.bitness = ELFDATA2LSB;
- binOpts.alloc = &::malloc;
- binOpts.dealloc = &::free;
-
- aclBinary* bin = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
- if (err != ACL_SUCCESS) {
- buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
- LogWarning("aclBinaryInit failed");
- return false;
- }
-
- aclSections_0_8 spirFlag;
- _acl_type_enum_0_8 aclTypeBinaryUsed;
- if (std::string::npos != options->clcOptions.find("--spirv") ||
- elfSectionType_ == amd::OclElf::SPIRV) {
- spirFlag = aclSPIRV;
- aclTypeBinaryUsed = ACL_TYPE_SPIRV_BINARY;
- } else if (std::string::npos != options->clcOptions.find("--spir") ||
- elfSectionType_ == amd::OclElf::SPIR) {
- spirFlag = aclSPIR;
- aclTypeBinaryUsed = ACL_TYPE_SPIR_BINARY;
- } else {
- spirFlag = aclLLVMIR;
- aclTypeBinaryUsed = ACL_TYPE_LLVMIR_BINARY;
- }
-
- if (ACL_SUCCESS !=
- aclInsertSection(compiler(), bin, llvmBinary_.data(), llvmBinary_.size(), spirFlag)) {
- LogWarning("aclInsertSection failed");
- aclBinaryFini(bin);
- return false;
- }
-
- // temporary solution to synchronize buildNo between runtime and complib
- // until we move runtime inside complib
- ((amd::option::Options*)bin->options)->setBuildNo(options->getBuildNo());
-
- err = aclCompile(compiler(), bin, options->origOptionStr.c_str(), aclTypeBinaryUsed, ACL_TYPE_ISA,
- NULL);
-
- buildLog_ += aclGetCompilerLog(compiler());
-
- if (err != ACL_SUCCESS) {
- LogWarning("aclCompile failed");
- aclBinaryFini(bin);
- return false;
- }
-
- if (options->oVariables->BinBIF30) {
- if (!createBIFBinary(bin)) {
- aclBinaryFini(bin);
- return false;
- }
- }
-
- if (options->oVariables->BinAS && !options->oVariables->UseJIT) {
- size_t len = 0;
- const char* asmtext =
- static_cast(aclExtractSection(compiler(), bin, &len, aclCODEGEN, &err));
- if (err != ACL_SUCCESS) {
- LogWarning("aclExtractSection failed");
- aclBinaryFini(bin);
- return false;
- }
-
- // Store the Asm text in ASTEXT section unless the JIT is used
-
- if (!clBinary()->storeX86Asm(asmtext, len)) {
- buildLog_ += "Internal Error: Storing X86 ASM failed!\n";
- return false;
- }
- }
-
- size_t len = 0;
- const void* isa = aclExtractSection(compiler(), bin, &len, aclTEXT, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclExtractSection failed");
- aclBinaryFini(bin);
- return false;
- }
-
- if (options->oVariables->UseJIT) {
- // printf("Using the jit!\n");
- aclJITObjectImage objectImage = aclJITObjectImageCreate(compiler(), isa, len, bin, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageCreate failed");
- aclBinaryFini(bin);
- return false;
- }
- err = aclJITObjectImageFinalize(compiler(), objectImage);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageFinalize failed");
- aclBinaryFini(bin);
- return false;
- }
- setJITBinary(objectImage);
- aclBinaryFini(bin);
-
- // Store the object image binary in the CL binary;
- if (!clBinary()->storeX86JIT(*this)) {
- buildLog_ += "Internal Error: Storing X86 DLL failed!\n";
- return false;
- }
-
-#if 0
- // Debug stuff. Try and disassemble all kernels and stubs
- std::stringstream asmtext;
- DisasData disasData(&asmtext, objectImage, compiler());
- err = aclJITObjectImageIterateSymbols(compiler(), objectImage,
- disasSymbolsCallbackCStr,
- &disasData);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageIterateSymbols failed");
- return false;
- }
- printf("DisasSize: %d\nDisas: %s\n", (int)asmtext.str().size(),
- asmtext.str().c_str());
-
-#endif
- return true;
- }
-
- std::fstream f;
- f.open(dllFileName_.c_str(), std::fstream::out | std::fstream::binary);
- f.write(static_cast(isa), len);
- f.close();
-
- aclBinaryFini(bin);
-
- if (f.fail() || f.bad()) {
- buildLog_ += "Internal error: fail to create an internal file!\n";
- return false;
- }
-
- // Store the dll binary in the CL binary;
- if (!clBinary()->storeX86(*this, dllFileName_)) {
- buildLog_ += "Internal Error: Storing X86 DLL failed!\n";
- return false;
- }
-
- return true;
-#endif // WITH_ONLINE_COMPILER
- return false;
-}
-
-bool Program::initBuild(amd::option::Options* options) {
- if (!this->::device::Program::initBuild(options)) {
- return false;
- }
-
- options->setPerBuildInfo("cpu", clBinary()->getEncryptCode(), false);
-
- /*
- -f[no-]bin-source : control .source
- -f[no-]bin-llvmir : control .llvmir
- -f[no-]bin-amdil : control .amdil
- -f[no-]bin-exe : control .text
-
- Default: -fno-bin-source -fbin-llvmir -fno-bin-amdil -fbin-exe
- */
- // Elf Binary setup
- clBinary()->init(options);
-
- std::string outFileName;
- if (options->isDumpFlagSet(amd::option::DUMP_BIF)) {
- outFileName = options->getDumpFileName(".bin");
- }
- if (!clBinary()->setElfOut(LP64_SWITCH(ELFCLASS32, ELFCLASS64),
- (outFileName.size() > 0) ? outFileName.c_str() : NULL)) {
- LogError("setup elfout for CPU failed");
- return false;
- }
-
- return true;
-}
-
-bool Program::finiBuild(bool isBuildGood) {
- clBinary()->resetElfOut();
- clBinary()->resetElfIn();
-
- if (!isBuildGood) {
- // Prevent the encrypted binary form leaking out
- clBinary()->setBinary(NULL, 0);
- }
-
- return this->::device::Program::finiBuild(isBuildGood);
-}
-
-bool Program::compileImpl(const std::string& sourceCode,
- const std::vector& headers,
- const char** headerIncludeNames, amd::option::Options* options) {
-#if defined(WITH_ONLINE_COMPILER)
- std::string tempFolder = amd::Os::getTempPath();
-
- std::fstream f;
- std::vector headerFileNames(headers.size());
- std::vector newDirs;
- for (size_t i = 0; i < headers.size(); ++i) {
- std::string headerPath = tempFolder;
- std::string headerIncludeName(headerIncludeNames[i]);
- // replace / in path with current os's file separator
- if (amd::Os::fileSeparator() != '/') {
- for (auto& it : headerIncludeName) {
- if (it == '/') it = amd::Os::fileSeparator();
- }
- }
- size_t pos = headerIncludeName.rfind(amd::Os::fileSeparator());
- if (pos != std::string::npos) {
- headerPath += amd::Os::fileSeparator();
- headerPath += headerIncludeName.substr(0, pos);
- headerIncludeName = headerIncludeName.substr(pos + 1);
- }
- if (!amd::Os::pathExists(headerPath)) {
- bool ret = amd::Os::createPath(headerPath);
- assert(ret && "failed creating path!");
- newDirs.push_back(headerPath);
- }
- std::string headerFullName = headerPath + amd::Os::fileSeparator() + headerIncludeName;
- headerFileNames[i] = headerFullName;
- f.open(headerFullName.c_str(), std::fstream::out);
- assert(!f.fail() && "failed creating header file!");
- f.write(headers[i]->c_str(), headers[i]->length());
- f.close();
- }
-
- acl_error err = ACL_SUCCESS;
- aclTargetInfo aclinfo = info();
-
- aclBinaryOptions binOpts = {0};
- binOpts.struct_size = sizeof(binOpts);
- binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
- binOpts.bitness = ELFDATA2LSB;
- binOpts.alloc = &::malloc;
- binOpts.dealloc = &::free;
-
- aclBinary* bin = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
- if (err != ACL_SUCCESS) {
- buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
- LogWarning("aclBinaryInit failed");
- return false;
- }
-
- if (ACL_SUCCESS !=
- aclInsertSection(compiler(), bin, sourceCode.c_str(), sourceCode.size(), aclSOURCE)) {
- LogWarning("aclInsertSection failed");
- aclBinaryFini(bin);
- return false;
- }
-
- // temporary solution to synchronize buildNo between runtime and complib
- // until we move runtime inside complib
- ((amd::option::Options*)bin->options)->setBuildNo(options->getBuildNo());
-
- std::stringstream opts;
- std::string token;
- opts << options->origOptionStr.c_str();
-
- if (options->origOptionStr.find("-cl-std=CL") == std::string::npos) {
- switch (OPENCL_MAJOR * 100 + OPENCL_MINOR * 10) {
- case 100:
- opts << " -cl-std=CL1.0";
- break;
- case 110:
- opts << " -cl-std=CL1.1";
- break;
- case 200:
- default:
- case 120:
- opts << " -cl-std=CL1.2";
- break;
- }
- }
-
- // Add only for CL2.0 and later
- bool spirFlag = false;
- if (options->oVariables->CLStd[2] >= '2') {
- opts << " -D"
- << "CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE=" << device().info().maxGlobalVariableSize_;
- spirFlag = true;
- }
-
- // FIXME: Should we prefix everything with -Wf,?
- std::istringstream iss(options->clcOptions);
- while (getline(iss, token, ' ')) {
- if (!token.empty()) {
- // Check if this is a -D option
- if (token.compare("-D") == 0) {
- // It is, skip payload
- getline(iss, token, ' ');
- continue;
- }
- opts << " -Wf," << token;
- }
- }
-
- if (!headers.empty()) {
- opts << " -I" << tempFolder;
- }
-
- if (device().info().imageSupport_) {
- opts << " -D__IMAGE_SUPPORT__=1";
- }
- if (device().hasFMA4Instructions()) {
- opts << " -DFP_FAST_FMA=1 -DFP_FAST_FMAF=1";
- }
-
- iss.clear();
- iss.str(device().info().extensions_);
- while (getline(iss, token, ' ')) {
- if (!token.empty()) {
- opts << " -D" << token << "=1";
- }
- }
-
- std::string newOpt = opts.str();
- size_t pos = newOpt.find("-fno-bin-llvmir");
- while (pos != std::string::npos) {
- newOpt.erase(pos, 15);
- pos = newOpt.find("-fno-bin-llvmir");
- }
-
- err = aclCompile(compiler(), bin, newOpt.c_str(), ACL_TYPE_OPENCL,
- spirFlag ? ACL_TYPE_SPIR_BINARY : ACL_TYPE_LLVMIR_BINARY, NULL);
-
- buildLog_ += aclGetCompilerLog(compiler());
-
- if (err != ACL_SUCCESS) {
- LogWarning("aclCompile failed");
- aclBinaryFini(bin);
- return false;
- }
-
- size_t size = 0;
- const void* llvmir = aclExtractSection(compiler(), bin, &size, aclLLVMIR, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclExtractSection failed");
- aclBinaryFini(bin);
- return false;
- }
-
- llvmBinary_.assign(reinterpret_cast(llvmir), size);
- elfSectionType_ = amd::OclElf::LLVMIR;
- aclBinaryFini(bin);
-
- if (clBinary()->saveSOURCE()) {
- clBinary()->elfOut()->addSection(amd::OclElf::SOURCE, sourceCode.data(), sourceCode.length());
- }
- if (clBinary()->saveLLVMIR()) {
- clBinary()->elfOut()->addSection(amd::OclElf::LLVMIR, llvmBinary_.data(), llvmBinary_.size(),
- false);
- // store the original compile options
- clBinary()->storeCompileOptions(compileOptions_);
- }
-
- return true;
-#else // WITH_ONLINE_COMPILER
- return false;
-#endif
-}
-
-bool Program::loadDllCode(amd::option::Options* options, bool addElfSymbols) {
- if (options->oVariables->UseJIT) {
- acl_error err = ACL_SUCCESS;
- aclJITObjectImage objectImage = getJITBinary();
- err = aclJITObjectImageIterateSymbols(compiler(), objectImage, setKernelInfoCallbackCStr, this);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageIterateSymbols failed");
- return false;
- }
- err = aclJITObjectImageIterateSymbols(compiler(), objectImage, setSymbolsCallbackCStr,
- clBinary());
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageIterateSymbols failed");
- return false;
- }
- size_t size = aclJITObjectImageGetGlobalsSize(compiler(), objectImage, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageGetGlobalsSize failed");
- return false;
- }
- setGlobalVariableTotalSize(size);
- return true;
- }
-// Check if we have a URI
-#if defined(_WIN32)
- UINT prevMode = ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
-
- handle_ = ::LoadLibraryEx(dllFileName_.c_str(), NULL, DONT_RESOLVE_DLL_REFERENCES);
-
- ::SetErrorMode(prevMode);
-#else
- handle_ = amd::Os::loadLibrary(dllFileName_.c_str());
-#endif
- if (!handle_) {
- return false;
- }
-
- if (!amd::Os::iterateSymbols(handle_, setKernelInfoCallback, this)) {
- return false;
- }
-
- // Add cpu symbols into elf
- if (addElfSymbols) {
- if (!amd::Os::iterateSymbols(handle_, setSymbolsCallback, clBinary())) {
- return false;
- }
- }
-
- return true;
-}
-
-bool Program::linkImpl(amd::option::Options* options) {
-#if defined(WITH_ONLINE_COMPILER)
- // If we don't have LLVM binary then attempt to use OCL binary
- if (llvmBinary_.empty()) {
- // Load ISA
- // For elf format, setup elfIn() and this elfIn() will be released
- // at the end of build by finiBuild().
- if (!clBinary()->setElfIn()) {
- buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
- LogError("Setting up input binary failed");
- return false;
- }
-
- if (options->oVariables->UseJIT) {
- bool hasJITBinary;
- if (!clBinary()->loadX86JIT(*this, hasJITBinary)) {
- return false;
- } else if (hasJITBinary) {
- aclJITObjectImage objectImage = getJITBinary();
- acl_error err = aclJITObjectImageIterateSymbols(compiler(), objectImage,
- setKernelInfoCallbackCStr, this);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageIterateSymbols failed");
- return false;
- }
- err = aclJITObjectImageIterateSymbols(compiler(), objectImage, setSymbolsCallbackCStr,
- clBinary());
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageIterateSymbols failed");
- return false;
- }
- size_t size = aclJITObjectImageGetGlobalsSize(compiler(), objectImage, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclJITObjectImageGetGlobalsSize failed");
- return false;
- }
- setGlobalVariableTotalSize(size);
- return true;
- }
- // Fall-through to recompile
- } else {
- // Trying to load DLL that was generated by out-process as/ld before
- bool hasDLL = false;
- bool loadSuccess = clBinary()->loadX86(*this, dllFileName_, hasDLL);
- if (!loadSuccess) {
- buildLog_ += "Error: loading a kernel from OpenCL binary failed!\n";
- return false;
- } else if (hasDLL) {
- if (loadDllCode(options)) {
- // No rebuid and use the original binary. Release any new binary if there is.
- clBinary()->restoreOrigBinary();
- return true;
- }
- }
- // Fall-through to recompile
- }
-
- // Need to try recompile, check to see if if LLVM IR is present
- if (clBinary()->loadLlvmBinary(llvmBinary_, elfSectionType_) &&
- clBinary()->isRecompilable(llvmBinary_, amd::OclElf::CPU_PLATFORM)) {
- // Copy both .source and .llvmir into the elfout_
- char* section;
- size_t sz;
- if (clBinary()->saveSOURCE() &&
- clBinary()->elfIn()->getSection(amd::OclElf::SOURCE, §ion, &sz)) {
- if ((section != NULL) && (sz > 0)) {
- clBinary()->elfOut()->addSection(amd::OclElf::SOURCE, section, sz);
- }
- }
-
- if (clBinary()->saveLLVMIR()) {
- clBinary()->elfOut()->addSection(elfSectionType_, llvmBinary_.data(), llvmBinary_.size(),
- false);
- }
- }
- // We failed kernels loading (wrong ASIC?)
- else {
- buildLog_ += "Error: Runtime failed to load kernels from OCL binary!\n";
- LogError(buildLog_.c_str());
- return false;
- }
- }
-
- // Do we have llvm binary?
- if (!llvmBinary_.empty()) {
- // Compile llvm binary to x86 source code
- if (!compileBinaryToISA(options)) {
- LogError("We failed to compile LLVMIR binary to ASM text!");
- return false;
- }
- }
-
- setType(TYPE_EXECUTABLE);
-
- /////////////////////////////////////////////////////////////
- //////////////// check, there is a good place to finish elf objects
- //////////////////////////////////////////////////////////////
-
- // Load dll executable
- if (loadDllCode(options, clBinary()->saveISA())) {
- if (!createBinary(options)) {
- buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
- return false;
- }
- return true;
- }
- buildLog_ += "Internal Error: loading shared library failed!\n";
-#endif // WITH_ONLINE_COMPILER
- return false;
-}
-
-bool Program::linkImpl(const std::vector& inputPrograms,
- amd::option::Options* options, bool createLibrary) {
-#if defined(WITH_ONLINE_COMPILER)
- std::vector llvmBinaries(inputPrograms.size());
- std::vector elfSectionType(inputPrograms.size());
- auto it = inputPrograms.cbegin();
- const auto itEnd = inputPrograms.cend();
- for (size_t i = 0; it != itEnd; ++it, ++i) {
- Program* program = (Program*)*it;
-
- if (program->llvmBinary_.empty()) {
- if (program->clBinary() == NULL) {
- buildLog_ += "Internal error: Input program not compiled!\n";
- LogError("Loading compiled input object failed");
- return false;
- }
-
- // If we don't have LLVM binary then attempt to use OCL binary
- // Load ISA
- // For elf format, setup elfIn() and this elfIn() will be released
- // at the end of build by finiBuild().
- if (!program->clBinary()->setElfIn()) {
- buildLog_ +=
- "Internal error: Setting up input OpenCL binary"
- " failed!\n";
- LogError("Setting up input binary failed");
- return false;
- }
-
- // Need to try recompile, check to see if if LLVM IR is present
- if (program->clBinary()->loadLlvmBinary(program->llvmBinary_, program->elfSectionType_) &&
- program->clBinary()->isRecompilable(program->llvmBinary_, amd::OclElf::CPU_PLATFORM)) {
-// Copy both .source and .llvmir into the elfout_
-#if 0
- // TODO: copy source into .source section of elfout_
- char *section;
- size_t sz;
- if (clBinary()->saveSOURCE() &&
- clBinary()->elfIn()->getSection(amd::OclElf::SOURCE, §ion, &sz)) {
- if ((section != NULL) && (sz > 0)) {
- clBinary()->elfOut()->addSection(amd::OclElf::SOURCE, section, sz);
- }
- }
-#endif
- }
- // We failed kernels loading (wrong ASIC?)
- else {
- buildLog_ +=
- "Error: Runtime failed to load kernels from OCL "
- "binary!\n";
- LogError(buildLog_.c_str());
- return false;
- }
- }
-
- llvmBinaries[i] = &program->llvmBinary_;
- elfSectionType[i] = program->elfSectionType_;
- }
-
- acl_error err = ACL_SUCCESS;
- aclTargetInfo aclinfo = info();
-
- aclBinaryOptions binOpts = {0};
- binOpts.struct_size = sizeof(binOpts);
- binOpts.elfclass = aclinfo.arch_id == aclX64 ? ELFCLASS64 : ELFCLASS32;
- binOpts.bitness = ELFDATA2LSB;
- binOpts.alloc = &::malloc;
- binOpts.dealloc = &::free;
-
- std::vector libs(llvmBinaries.size(), NULL);
- for (size_t i = 0; i < libs.size(); ++i) {
- libs[i] = aclBinaryInit(sizeof(aclBinary), &aclinfo, &binOpts, &err);
- if (err != ACL_SUCCESS) {
- buildLog_ += "Internal error: Setting up input OpenCL binary failed!\n";
- LogWarning("aclBinaryInit failed");
- break;
- }
-
- _bif_sections_enum_0_8 aclTypeUsed;
- if (elfSectionType[i] == amd::OclElf::SPIRV) {
- aclTypeUsed = aclSPIRV;
- } else if (elfSectionType[i] == amd::OclElf::SPIR) {
- aclTypeUsed = aclSPIR;
- } else {
- aclTypeUsed = aclLLVMIR;
- }
- err = aclInsertSection(compiler(), libs[i], llvmBinaries[i]->data(), llvmBinaries[i]->size(),
- aclTypeUsed);
-
- if (err != ACL_SUCCESS) {
- LogWarning("aclInsertSection failed");
- break;
- }
-
- // temporary solution to synchronize buildNo between runtime and complib
- // until we move runtime inside complib
- ((amd::option::Options*)libs[i]->options)->setBuildNo(options->getBuildNo());
- }
-
- if (libs.size() > 0 && err == ACL_SUCCESS) do {
- unsigned int numLibs = libs.size() - 1;
-
- if (numLibs > 0) {
- err = aclLink(compiler(), libs[0], libs.size() - 1, &libs[1], ACL_TYPE_LLVMIR_BINARY,
- "-create-library", NULL);
-
- buildLog_ += aclGetCompilerLog(compiler());
-
- if (err != ACL_SUCCESS) {
- LogWarning("aclLink failed");
- break;
- }
- }
-
- size_t size = 0;
- _bif_sections_enum_0_8 aclTypeUsed;
- if (elfSectionType[0] == amd::OclElf::SPIRV && numLibs == 0) {
- aclTypeUsed = aclSPIRV;
- } else if (elfSectionType[0] == amd::OclElf::SPIR && numLibs == 0) {
- aclTypeUsed = aclSPIR;
- } else {
- aclTypeUsed = aclLLVMIR;
- }
- const void* llvmir = aclExtractSection(compiler(), libs[0], &size, aclTypeUsed, &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclExtractSection failed");
- break;
- }
-
- llvmBinary_.assign(reinterpret_cast(llvmir), size);
- } while (0);
-
- std::for_each(libs.begin(), libs.end(), std::ptr_fun(aclBinaryFini));
-
- if (err != ACL_SUCCESS) {
- buildLog_ += "Error: linking llvm modules failed!";
- return false;
- }
-
- if (clBinary()->saveLLVMIR()) {
- clBinary()->elfOut()->addSection(elfSectionType_, llvmBinary_.data(), llvmBinary_.size(),
- false);
- // store the original link options
- clBinary()->storeLinkOptions(linkOptions_);
- clBinary()->storeCompileOptions(compileOptions_);
- }
-
- // skip the rest if we are building an opencl library
- if (createLibrary) {
- setType(TYPE_LIBRARY);
- if (!createBinary(options)) {
- buildLog_ += "Intenral error: creating OpenCL binary failed\n";
- return false;
- }
-
- return true;
- }
-
- // Compile llvm binary to x86 source code
- if (!compileBinaryToISA(options)) {
- LogError("We failed to compile LLVMIR binary to ASM text!");
- return false;
- }
-
- setType(TYPE_EXECUTABLE);
-
- /////////////////////////////////////////////////////////////
- //////////////// check, there is a good place to finish elf objects
- //////////////////////////////////////////////////////////////
-
- // Load dll executable
- if (loadDllCode(options, clBinary()->saveISA())) {
- if (!createBinary(options)) {
- buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
- return false;
- }
- return true;
- }
- buildLog_ += "Internal Error: loading shared library failed!\n";
-#endif // WITH_ONLINE_COMPILER
- return false;
-}
-
-bool Program::initClBinary() {
- if (clBinary_ == NULL) {
- clBinary_ = new ClBinary(device());
- if (clBinary_ == NULL) {
- return false;
- }
- }
- return true;
-}
-
-void Program::releaseClBinary() {
- if (clBinary_ != NULL) {
- delete clBinary_;
- clBinary_ = NULL;
- }
-}
-
-bool Program::createBinary(amd::option::Options* options) {
- if (options->oVariables->BinBIF30) {
- return true;
- }
-
- if (!clBinary()->createElfBinary(options->oVariables->BinEncrypt, type())) {
- buildLog_ += "Internal Error: creating OpenCL binary failed!\n";
- LogError("Failed to create ELF binary image!");
- return false;
- }
- return true;
-}
-
-const aclTargetInfo& Program::info(const char* str) {
- acl_error err = ACL_SUCCESS;
- info_ = aclGetTargetInfo(LP64_SWITCH("x86", "x86-64"), (str && str[0] == '\0' ? "Generic" : str),
- &err);
- if (err != ACL_SUCCESS) {
- LogWarning("aclGetTargetInfo failed");
- }
- return info_;
-}
-
-Program::~Program() {
- if (getJITBinary() != NULL) {
- aclJITObjectImageDestroy(compiler(), getJITBinary());
- }
-
- if (!sourceFileName_.empty()) {
- amd::Os::unlink(sourceFileName_.c_str());
- }
-
- if (handle_ != NULL) {
- amd::Os::unloadLibrary(handle_);
- amd::Os::unlink(dllFileName_);
- char dllName[256];
-#ifdef _WIN32
- memcpy(dllName, dllFileName_.data(), dllFileName_.size());
- char* tempName = strrchr(dllName, '.');
- if (tempName != NULL) {
- *tempName = '\0';
- amd::Os::unlink(dllName);
- }
-#endif // _WIN32
- }
-
-#if defined(WITH_ONLINE_COMPILER)
- releaseClBinary();
-#endif
-}
-
-} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpuprogram.hpp b/rocclr/runtime/device/cpu/cpuprogram.hpp
deleted file mode 100644
index 908956617a..0000000000
--- a/rocclr/runtime/device/cpu/cpuprogram.hpp
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef CPUPROGRAM_HPP_
-#define CPUPROGRAM_HPP_
-
-#include "top.hpp"
-#include "device/device.hpp"
-#include "device/cpu/cpubinary.hpp"
-#include
-
-// forward declaration
-namespace amd {
-namespace option {
-class Options;
-} // option
-} // amd
-
-//! \namespace cpu CPU Device Implementation
-namespace cpu {
-
-//! \class CPU program
-class Program : public device::Program {
- private:
- aclJITObjectImage JITBinary;
- std::string sourceFileName_; //!< The source image.
- void* handle_; // @todo: remove me
-
- public:
- //! Default constructor
- Program(Device& cpuDev) : device::Program(cpuDev), JITBinary(NULL), handle_(NULL) {}
-
- //! Default destructor
- ~Program();
-
- //! pre-compile setup for CPU
- virtual bool initBuild(amd::option::Options* options);
-
- //! post-compile setup for CPU
- virtual bool finiBuild(bool isBuildGood);
-
- //! Compiles CPU program
- virtual bool compileImpl(const std::string& sourceCode,
- const std::vector& headers,
- const char** headerIncludeNames, amd::option::Options* options);
-
- //! Links CPU program
- virtual bool linkImpl(amd::option::Options* options = NULL);
-
- //! Links CPU programs
- virtual bool linkImpl(const std::vector& inputPrograms,
- amd::option::Options* options = NULL, bool createLibrary = false);
-
- virtual bool createBinary(amd::option::Options* options);
-
- //! Returns the device object, associated with this program.
- const Device& device() { return static_cast(device::Program::device()); }
-
- /*! \brief Invokes the LLC compiler for the LLVM binary compilation
- * to x86 ASM text source code and ISA binary
- *
- * \return True if we successefully compiled a CPU program
- */
- bool compileBinaryToISA(amd::option::Options* options //!< options for compilation
- );
-
- //! Load the library into memory
- bool loadDllCode(amd::option::Options* options, bool addElfSymbols = false);
-
- //! Initialize binary for CPU
- virtual bool initClBinary();
-
- //! Release binary for CPU
- virtual void releaseClBinary();
-
- ClBinary* clBinary() { return static_cast(device::Program::clBinary()); }
- const ClBinary* clBinary() const {
- return static_cast(device::Program::clBinary());
- }
-
- aclJITObjectImage getJITBinary() { return this->JITBinary; }
- void setJITBinary(aclJITObjectImage JITBinary) { this->JITBinary = JITBinary; }
-
- //! Returns the pointer to the Compiler struct
- //! Became public (prev. private) due to use in cpubinary for aclJIT functionality
- aclCompiler* compiler() { return static_cast(device()).compiler(); }
-
- private:
- //! Disable default copy constructor
- Program(const Program&);
-
- //! Disable operator=
- Program& operator=(const Program&);
-
- std::string dllFileName_; //!< File name of the dll with kernels
- protected:
- virtual bool isElf(const char* bin) const {
- return amd::isElfHeader(bin, LP64_SWITCH(ELFCLASS32, ELFCLASS64));
- }
-
- virtual const aclTargetInfo& info(const char* str = "");
-};
-
-} // namespace cpu
-
-#endif // CPUPROGRAM_HPP_
diff --git a/rocclr/runtime/device/cpu/cpusettings.cpp b/rocclr/runtime/device/cpu/cpusettings.cpp
deleted file mode 100644
index 1389f235a9..0000000000
--- a/rocclr/runtime/device/cpu/cpusettings.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#include "device/cpu/cpusettings.hpp"
-#include "os/os.hpp"
-
-namespace cpu {
-
-bool Settings::create() {
- // This code is temporary until cl_khr_fp64 is unconditional
- if (flagIsDefault(CL_KHR_FP64) || CL_KHR_FP64) {
- enableExtension(ClKhrFp64);
- }
-
- enableExtension(ClAmdFp64);
- enableExtension(ClKhrGlobalInt32BaseAtomics);
- enableExtension(ClKhrGlobalInt32ExtendedAtomics);
- enableExtension(ClKhrLocalInt32BaseAtomics);
- enableExtension(ClKhrLocalInt32ExtendedAtomics);
-
-#ifdef _LP64
- enableExtension(ClKhrInt64BaseAtomics);
- enableExtension(ClKhrInt64ExtendedAtomics);
-#endif // _LP64
- enableExtension(ClKhrByteAddressableStore);
- enableExtension(ClKhrGlSharing);
- enableExtension(ClKhrGlEvent);
- enableExtension(ClExtDeviceFission);
- enableExtension(ClAmdDeviceAttributeQuery);
- enableExtension(ClAmdVec3);
- enableExtension(ClAmdMediaOps);
- enableExtension(ClAmdMediaOps2);
- enableExtension(ClAmdPopcnt);
- enableExtension(ClAmdPrintf);
-
- // enableExtension(ClKhrSelectFpRoundingMode);
- enableExtension(ClKhr3DImageWrites);
-
-// enableExtension(ClKhrFp16);
-
-#if defined(_WIN32)
- enableExtension(ClKhrD3d10Sharing);
-#endif // _WIN32
- enableExtension(ClKhrSpir);
- // ToDo: enable this after conformance test is updated to accept it
- // enableExtension(ClKhrIlProgram);
-
- // Enable some OpenCL 2.0 extensions
- if ((OPENCL_MAJOR >= 2) && (CPU_OPENCL_VERSION >= 200)) {
- partialDispatch_ = true;
- enableExtension(ClKhrSubGroups);
- supportDepthsRGB_ = true;
- enableExtension(ClKhrDepthImages);
- }
-
- // Map CPUID feature bits to our own feature bits
- const int sse2_features = CPUFEAT_DX_SSE | CPUFEAT_DX_SSE2;
- const int avx_features = CPUFEAT_CX_SSE3 | CPUFEAT_CX_SSSE3 | CPUFEAT_CX_SSE4_1 |
- CPUFEAT_CX_SSE4_2 | CPUFEAT_CX_POPCNT | CPUFEAT_CX_AVX | CPUFEAT_CX_OSXSAVE;
- const int fma3_features = INTEL_CPUFEAT_CX_FMA3;
- const int fma4_features = AMD_CPUFEAT_CX_FMA4 | AMD_CPUFEAT_CX_XOP;
- int regs[4];
-
-#if defined(ATI_ARCH_X86)
- amd::Os::cpuid(regs, 0x0);
- bool isAmd = regs[1] == ('A' | ('u' << 8) | ('t' << 16) | ('h' << 24));
- bool isIntel = regs[1] == ('G' | ('e' << 8) | ('n' << 16) | ('u' << 24));
-
- amd::Os::cpuid(regs, 0x1);
-
- cpuFeatures_ = (regs[3] & sse2_features) == sse2_features ? SSE2Instructions : 0;
-
- if ((regs[2] & avx_features) == avx_features) {
- // Check for state support
- uint64_t xcr0 = amd::Os::xgetbv(0);
-
- // Check for SSE and YMM bits (1 and 2)
- if (((uint32_t)xcr0 & 0x6U) == 0x6U) {
- cpuFeatures_ |= AVXInstructions;
-
- // Now check for FMA and XOP
- if (isIntel) {
- cpuFeatures_ |= (regs[2] & fma3_features) == fma3_features ? FMA3Instructions : 0;
- }
-
- if (isAmd) {
- amd::Os::cpuid(regs, 0x80000001);
- cpuFeatures_ |= (regs[2] & fma4_features) == fma4_features ? FMA4Instructions : 0;
- }
- }
- }
-#endif // ATI_ARCH_X86
-
- return true;
-}
-
-} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpusettings.hpp b/rocclr/runtime/device/cpu/cpusettings.hpp
deleted file mode 100644
index a5958d8900..0000000000
--- a/rocclr/runtime/device/cpu/cpusettings.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef CPUSETTINGS_HPP_
-#define CPUSETTINGS_HPP_
-
-#include "top.hpp"
-#include "device/device.hpp"
-#include "device/cpu/cpufeat.hpp"
-
-//! \namespace cpu CPU Device Implementation
-namespace cpu {
-
-//! Device settings
-class Settings : public device::Settings {
- public:
- enum CpuFeatures {
- SSE2Instructions = 0x01,
- AVXInstructions = 0x02, // Processor reports SSSE3, SSE4_1, SSE4_2
- // POPCNT and AVX
- FMA3Instructions = 0x04, // Intel processor reports FMA3
- FMA4Instructions = 0x08 // AMD processor reports FMA4 and XOP
- };
- uint32_t cpuFeatures_; //!< CPU features
-
- //! Default constructor
- Settings() { cpuFeatures_ = 0; }
-
- //! Creates settings
- bool create();
-
- private:
- //! Disable copy constructor
- Settings(const Settings&);
-
- //! Disable assignment
- Settings& operator=(const Settings&);
-};
-
-} // namespace cpu
-
-#endif // CPUSETTINGS_HPP_
diff --git a/rocclr/runtime/device/cpu/cputables.hpp b/rocclr/runtime/device/cpu/cputables.hpp
deleted file mode 100644
index 31f02a489a..0000000000
--- a/rocclr/runtime/device/cpu/cputables.hpp
+++ /dev/null
@@ -1,1010 +0,0 @@
-
-#ifndef TABLES_HPP_
-#define TABLES_HPP_
-
-static const uint32_t __ALIGNED__(32) cpuTables[8024] = {
- 0x00000000, 0x3faff55b, 0xbd38db2c, 0x3e56e59f, 0x00000000, 0x3fb0f99e, 0x54dedf96, 0x3e64e3aa,
- 0x00000000, 0x3fb1f86d, 0xab1bda88, 0x3e67e105, 0x00000000, 0x3fb2f719, 0x4d013fd0, 0x3e48c525,
- 0x00000000, 0x3fb3f59f, 0x3ad62670, 0x3e2cf8ab, 0x00000000, 0x3fb4f3fd, 0xbec80468, 0x3e59dca4,
- 0x00000000, 0x3fb5f232, 0xec98a8da, 0x3e53f4b5, 0x00000000, 0x3fb6f03b, 0x619d81fe, 0x3e6b9d49,
- 0x00000000, 0x3fb7ee18, 0x87460934, 0x3e430178, 0x00000000, 0x3fb8ebc5, 0xca0b9944, 0x3e511e3e,
- 0x00000000, 0x3fb9e941, 0x3c5a332e, 0x3e54f3f7, 0x00000000, 0x3fbae68a, 0xae0e00a6, 0x3e5c71c8,
- 0x00000000, 0x3fbbe39e, 0xf86fbdc7, 0x3e67cde0, 0x00000000, 0x3fbce07c, 0x8c889c72, 0x3e570f32,
- 0x00000000, 0x3fbddd21, 0x9b994efe, 0x3e5c07ae, 0x00000000, 0x3fbed98c, 0x1d7b1698, 0x3e40c802,
- 0x00000000, 0x3fbfd5ba, 0xedb8cb22, 0x3e635585, 0x00000000, 0x3fc068d5, 0x67b30e96, 0x3e708425,
- 0x00000000, 0x3fc0e6ad, 0x1031472e, 0x3e799e81, 0x00000000, 0x3fc16465, 0x1416bcee, 0x3e604182,
- 0x00000000, 0x3fc1e1fa, 0xe4dc96f4, 0x3e7f6086, 0x00000000, 0x3fc25f6e, 0x5c5f1b58, 0x3e471a53,
- 0x00000000, 0x3fc2dcbd, 0x3fe63ca1, 0x3e765f74, 0x00000000, 0x3fc359e8, 0x3472d014, 0x3e7dbd73,
- 0x00000000, 0x3fc3d6ee, 0x4d8b0d1d, 0x3e7d18cc, 0x00000000, 0x3fc453ce, 0x53c8fb29, 0x3e78c125,
- 0x00000000, 0x3fc4d087, 0xe2e8f991, 0x3e753b49, 0x00000000, 0x3fc54d18, 0xe148c141, 0x3e77422a,
- 0x00000000, 0x3fc5c981, 0x69df56a8, 0x3e4e3ec2, 0x00000000, 0x3fc645bf, 0x4e7e0ac9, 0x3e7ff675,
- 0x00000000, 0x3fc6c1d4, 0x7b1b5aad, 0x3e713126, 0x00000000, 0x3fc73dbd, 0x403a94bc, 0x3e7d14fa,
- 0x00000000, 0x3fc7b97b, 0xc089a3d8, 0x3e62f396, 0x00000000, 0x3fc8350b, 0x78fa95bb, 0x3e7c731d,
- 0x00000000, 0x3fc8b06e, 0x85177399, 0x3e7c50f3, 0x00000000, 0x3fc92ba3, 0x9c6f2c20, 0x3e6f4140,
- 0x00000000, 0x3fc9a6a8, 0xc4c39ec0, 0x3e7d2d90, 0x00000000, 0x3fca217e, 0x696f2106, 0x3e680420,
- 0x00000000, 0x3fca9c23, 0x7943a2e8, 0x3e4b4032, 0x00000000, 0x3fcb1696, 0x02f3d2a2, 0x3e65d35e,
- 0x00000000, 0x3fcb90d7, 0x288117b0, 0x3e64a498, 0x00000000, 0x3fcc0ae5, 0x19afb324, 0x3e635da1,
- 0x00000000, 0x3fcc84bf, 0xcdb9a908, 0x3e714e85, 0x00000000, 0x3fccfe65, 0xe5547b9a, 0x3e638754,
- 0x00000000, 0x3fcd77d5, 0xe6ce3246, 0x3e7be40a, 0x00000000, 0x3fcdf110, 0xb3bea7e7, 0x3e70c993,
- 0x00000000, 0x3fce6a14, 0x89ac3359, 0x3e71d2dd, 0x00000000, 0x3fcee2e1, 0x03332c46, 0x3e614766,
- 0x00000000, 0x3fcf5b75, 0x1bac55b7, 0x3e7f2590, 0x00000000, 0x3fcfd3d1, 0x7c826e28, 0x3e7f881b,
- 0x00000000, 0x3fd025fa, 0x6d698d20, 0x3e744199, 0x00000000, 0x3fd061ee, 0x521ea089, 0x3e8407ac,
- 0x00000000, 0x3fd09dc5, 0x6c4b1723, 0x3e82fb0c, 0x00000000, 0x3fd0d97e, 0x966a3e18, 0x3e8ca135,
- 0x00000000, 0x3fd1151a, 0xe4d646e4, 0x3e6b1218, 0x00000000, 0x3fd15097, 0xa350d288, 0x3e6d4e72,
- 0x00000000, 0x3fd18bf5, 0x2f04c329, 0x3e84617e, 0x00000000, 0x3fd1c735, 0x41e82650, 0x3e6096ec,
- 0x00000000, 0x3fd20255, 0x25773e6e, 0x3e79f91f, 0x00000000, 0x3fd23d56, 0x20f1d674, 0x3e659c08,
- 0x00000000, 0x3fd27837, 0xa2df1064, 0x3e602bf7, 0x00000000, 0x3fd2b2f7, 0xfc40508f, 0x3e8fb36b,
- 0x00000000, 0x3fd2ed98, 0x3f8dc892, 0x3e7ea08f, 0x00000000, 0x3fd32818, 0x54656a0e, 0x3e73ed62,
- 0x00000000, 0x3fd36277, 0xe5e69c58, 0x3e6b83f5, 0x00000000, 0x3fd39cb4, 0xaf768592, 0x3e8d6ec2,
- 0x00000000, 0x3fd3d6d1, 0x9a226f94, 0x3e649388, 0x00000000, 0x3fd410cb, 0xa65279ba, 0x3e85ad8f,
- 0x00000000, 0x3fd44aa4, 0x84d45434, 0x3e6b6157, 0x00000000, 0x3fd4845a, 0x4368f145, 0x3e809a18,
- 0x00000000, 0x3fd4bdee, 0x39b0d91c, 0x3e761a24, 0x00000000, 0x3fd4f75f, 0x5e39a978, 0x3e7ce1a6,
- 0x00000000, 0x3fd530ad, 0xa93b6a66, 0x3e832a39, 0x00000000, 0x3fd569d8, 0x9af804e7, 0x3e81c369,
- 0x00000000, 0x3fd5a2e0, 0x4e44ede8, 0x3e575e0f, 0x00000000, 0x3fd5dbc3, 0xd1a7a83b, 0x3e8f77ce,
- 0x00000000, 0x3fd61484, 0x0cb1b500, 0x3e284e7f, 0x00000000, 0x3fd64d1f, 0x38b02dfe, 0x3e8ec6b8,
- 0x00000000, 0x3fd68597, 0xdfbeda87, 0x3e83ebf4, 0x00000000, 0x3fd6bdea, 0xed9cb475, 0x3e89397a,
- 0x00000000, 0x3fd6f619, 0xbc239c54, 0x3e707937, 0x00000000, 0x3fd72e22, 0x553131b6, 0x3e8aa754,
- 0x00000000, 0x3fd76607, 0x407c45dc, 0x3e74a05d, 0x00000000, 0x3fd79dc6, 0x1a206dd0, 0x3e813223,
- 0x00000000, 0x3fd7d560, 0xfdd69c88, 0x3e72d8ec, 0x00000000, 0x3fd80cd4, 0x74218606, 0x3e7a852c,
- 0x00000000, 0x3fd84422, 0xbaeebb50, 0x3e871bf2, 0x00000000, 0x3fd87b4b, 0xb7491820, 0x3e483d7d,
- 0x00000000, 0x3fd8b24d, 0x92b6da14, 0x3e6ca50d, 0x00000000, 0x3fd8e929, 0xe8530298, 0x3e56f5cd,
- 0x00000000, 0x3fd91fde, 0x98910740, 0x3e7f3431, 0x00000000, 0x3fd9566d, 0x41ccd80a, 0x3e70e8d2,
- 0x00000000, 0x3fd98cd5, 0xc619e6c8, 0x3e71535a, 0x00000000, 0x3fd9c316, 0x41c36cd2, 0x3e773160,
- 0x00000000, 0x3fd9f930, 0x00637d8e, 0x3e7985a0, 0x00000000, 0x3fda2f23, 0x858c0a68, 0x3e6f2f29,
- 0x00000000, 0x3fda64ee, 0x7f96d909, 0x3e887984, 0x00000000, 0x3fda9a92, 0x19e12e42, 0x3e8ab3d3,
- 0x00000000, 0x3fdad00f, 0x62dfc4c2, 0x3e750881, 0x00000000, 0x3fdb0564, 0xa1cd9d8c, 0x3e605749,
- 0x00000000, 0x3fdb3a91, 0x6c6b8618, 0x3e5da65c, 0x00000000, 0x3fdb6f96, 0x7df1ad64, 0x3e6739bf,
- 0x00000000, 0x3fdba473, 0x52aa3340, 0x3e6bc312, 0x00000000, 0x3fdbd928, 0x91ad3aa8, 0x3e5e5281,
- 0x00000000, 0x3fdc0db4, 0x3df19f18, 0x3e8929d9, 0x00000000, 0x3fdc4219, 0xb693a080, 0x3e5ff11e,
- 0x00000000, 0x3fdc7655, 0xf145a3a0, 0x3e455ae3, 0x00000000, 0x3fdcaa68, 0xc6c0ca82, 0x3e7cbcd8,
- 0x00000000, 0x3fdcde53, 0xd425d304, 0x3e70cb04, 0x00000000, 0x3fdd1215, 0xab5be678, 0x3e79adfc,
- 0x00000000, 0x3fdd45ae, 0xc5662508, 0x3e893d90, 0x00000000, 0x3fdd791f, 0xbd35ff40, 0x3e768489,
- 0x00000000, 0x3fddac67, 0x3da2b7e0, 0x3e3586ed, 0x00000000, 0x3fdddf85, 0x2e850eee, 0x3e87604d,
- 0x00000000, 0x3fde127b, 0x2bfb53d8, 0x3e7ac1d1, 0x00000000, 0x3fde4548, 0x68274740, 0x3e39b3d4,
- 0x00000000, 0x3fde77eb, 0x8d10e53c, 0x3e7fc5d6, 0x00000000, 0x3fdeaa65, 0x1884becb, 0x3e88f9e5,
- 0x00000000, 0x3fdedcb6, 0x869c06d1, 0x3e8a87f0, 0x00000000, 0x3fdf0ede, 0x79f685fa, 0x3e831e72,
- 0x00000000, 0x3fdf40dd, 0x2f9719b0, 0x3e46a828, 0x00000000, 0x3fdf72b2, 0x4a8a44e0, 0x3e60d272,
- 0x00000000, 0x3fdfa45d, 0x4b11ad4e, 0x3e8a6052, 0x00000000, 0x3fdfd5e0, 0x832750f0, 0x3e575fdf,
- 0x00000000, 0x3fe0039c, 0x02e4cd36, 0x3e8cf069, 0x00000000, 0x3fe01c34, 0x2d4f6d10, 0x3e6e8242,
- 0x00000000, 0x3fe034b7, 0x1063e6c0, 0x3e524a09, 0x00000000, 0x3fe04d25, 0x72dc6f38, 0x3e78a1a1,
- 0x00000000, 0x3fe0657e, 0x19f8a92d, 0x3e929b66, 0x00000000, 0x3fe07dc3, 0x9c1b70c8, 0x3e79274d,
- 0x00000000, 0x3fe095f3, 0x1fbb7930, 0x3e50c34b, 0x00000000, 0x3fe0ae0e, 0x6c20eb50, 0x3e663986,
- 0x00000000, 0x3fe0c614, 0xf6832e9e, 0x3e86d6d0, 0x00000000, 0x3fe0de05, 0xef99f25e, 0x3e9af54d,
- 0x00000000, 0x3fe0f5e2, 0x52a00262, 0x3e916cfc, 0x00000000, 0x3fe10daa, 0x83569c32, 0x3e8dcc1e,
- 0x00000000, 0x3fe1255d, 0x551ed425, 0x3e937f7a, 0x00000000, 0x3fe13cfb, 0xadc98887, 0x3e9f6360,
- 0x00000000, 0x3fe15485, 0x8d35a2c1, 0x3e92c6ec, 0x00000000, 0x3fe16bfa, 0xf84cb036, 0x3e8bd44d,
- 0x00000000, 0x3fe1835a, 0x826e310e, 0x3e9117cf, 0x00000000, 0x3fe19aa5, 0xf332cfc9, 0x3e9ca533,
- 0x00000000, 0x3fe1b1dc, 0x509dbc2e, 0x3e90f208, 0x00000000, 0x3fe1c8fe, 0x93c945de, 0x3e8cd07d,
- 0x00000000, 0x3fe1e00b, 0xd67e6d72, 0x3e957bdf, 0x00000000, 0x3fe1f704, 0xc516c658, 0x3e7aab89,
- 0x00000000, 0x3fe20de8, 0xb1a1b8a0, 0x3e63e823, 0x00000000, 0x3fe224b7, 0x4a9d6d3c, 0x3e830746,
- 0x00000000, 0x3fe23b71, 0xcd438843, 0x3e9c5993, 0x00000000, 0x3fe25217, 0xa02ab554, 0x3e9ba2fc,
- 0x00000000, 0x3fe268a9, 0x6983a268, 0x3e801a5b, 0x00000000, 0x3fe27f26, 0xb350efc8, 0x3e6273d1,
- 0x00000000, 0x3fe2958e, 0x8c37b0c6, 0x3e864c23, 0x00000000, 0x3fe2abe2, 0x7370a300, 0x3e6aded0,
- 0x00000000, 0x3fe2c221, 0x197eb47e, 0x3e878091, 0x00000000, 0x3fe2d84c, 0x45e0dabc, 0x3e74b0f2,
- 0x00000000, 0x3fe2ee62, 0x794e2eaf, 0x3e9080d9, 0x00000000, 0x3fe30464, 0x42b60c76, 0x3e8d4ec2,
- 0x00000000, 0x3fe31a52, 0xf940caa0, 0x3e4221d2, 0x00000000, 0x3fe3302b, 0x2b2bba5c, 0x3e7cdbc4,
- 0x00000000, 0x3fe345f0, 0xbb440840, 0x3e6cce37, 0x00000000, 0x3fe35ba0, 0x99cf1dd0, 0x3e96c1d9,
- 0x00000000, 0x3fe3713d, 0x07eb0870, 0x3e5bed8a, 0x00000000, 0x3fe386c5, 0x8f490e3c, 0x3e769ed8,
- 0x00000000, 0x3fe39c39, 0x19b73ef0, 0x3e6cd417, 0x00000000, 0x3fe3b198, 0xc95b41b7, 0x3e9cbc4a,
- 0x00000000, 0x3fe3c6e4, 0xb890f5d7, 0x3e9238f1, 0x00000000, 0x3fe3dc1c, 0x82259cc4, 0x3e750c42,
- 0x00000000, 0x3fe3f13f, 0xde87b3e2, 0x3e9713d2, 0x00000000, 0x3fe4064f, 0xd2255276, 0x3e81d5a7,
- 0x00000000, 0x3fe41b4a, 0x48227ac1, 0x3e9c0dfd, 0x00000000, 0x3fe43032, 0xdab76753, 0x3e91c964,
- 0x00000000, 0x3fe44506, 0xd5704496, 0x3e86de56, 0x00000000, 0x3fe459c6, 0x1fd19968, 0x3e84aeb7,
- 0x00000000, 0x3fe46e72, 0xc57b1918, 0x3e8fbf91, 0x00000000, 0x3fe4830a, 0x7fbe5d9a, 0x3e9d6bef,
- 0x00000000, 0x3fe4978f, 0xdc249066, 0x3e9464d3, 0x00000000, 0x3fe4ac00, 0xec4d9073, 0x3e9638e2,
- 0x00000000, 0x3fe4c05e, 0x7247ea7c, 0x3e716f4a, 0x00000000, 0x3fe4d4a8, 0x40f1d440, 0x3e31a0a7,
- 0x00000000, 0x3fe4e8de, 0x0114a33c, 0x3e86edbb, 0x00000000, 0x3fe4fd01, 0xbf1d513c, 0x3e7dbee8,
- 0x00000000, 0x3fe51110, 0xb0248f73, 0x3e95b8bd, 0x00000000, 0x3fe5250c, 0x3f5eac64, 0x3e97de3d,
- 0x00000000, 0x3fe538f5, 0x87ae448a, 0x3e8ee241, 0x00000000, 0x3fe54cca, 0x91ec5192, 0x3e9e06c5,
- 0x00000000, 0x3fe5608d, 0x1a332738, 0x3e74e386, 0x00000000, 0x3fe5743c, 0xdcc2bfe4, 0x3e7a9599,
- 0x00000000, 0x3fe587d8, 0xbad43468, 0x3e6f732f, 0x00000000, 0x3fe59b60, 0x73b727d9, 0x3e9eb9f5,
- 0x00000000, 0x3fe5aed6, 0xa2eb9897, 0x3e98b212, 0x00000000, 0x3fe5c239, 0x4c167215, 0x3e938488,
- 0x00000000, 0x3fe5d589, 0x63020051, 0x3e90e2d3, 0x00000000, 0x3fe5e8c6, 0x79fbd022, 0x3e928208,
- 0x00000000, 0x3fe5fbf0, 0x893e4b30, 0x3e9a1ab9, 0x00000000, 0x3fe60f08, 0x17a24478, 0x3e82d1b8,
- 0x00000000, 0x3fe6220d, 0x8ded4878, 0x3e615d7b, 0x00000000, 0x3fe634ff, 0x9db3a5e4, 0x3e78968f,
- 0x00000000, 0x3fe647de, 0x71fe135f, 0x3e971c41, 0x00000000, 0x3fe65aab, 0x605d0d8c, 0x3e96d80f,
- 0x00000000, 0x3fe66d66, 0x43691590, 0x3e7c91f0, 0x00000000, 0x3fe6800e, 0x15fce2b2, 0x3e839f8a,
- 0x00000000, 0x3fe692a4, 0xa9d94b80, 0x3e455bed, 0x00000000, 0x3fe6a527, 0x5d60949a, 0x3e8b12c1,
- 0x00000000, 0x3fe6b798, 0xb312bfe3, 0x3e924167, 0x00000000, 0x3fe6c9f7, 0x33070277, 0x3e90ab86,
- 0x00000000, 0x3fe6dc44, 0xebbc80ee, 0x3e854554, 0x00000000, 0x3fe6ee7f, 0xef5a4bb8, 0x3e60204a,
- 0x00000000, 0x3fe700a7, 0xc679cf2c, 0x3e98af08, 0x00000000, 0x3fe712be, 0x330ae6c8, 0x3e90852a,
- 0x00000000, 0x3fe724c3, 0x9ec32916, 0x3e86d3eb, 0x00000000, 0x3fe736b6, 0x7fcbbafe, 0x3e8685cb,
- 0x00000000, 0x3fe74897, 0xc1e0bd95, 0x3e91f751, 0x00000000, 0x3fe75a67, 0xb0f72560, 0x3e5705b1,
- 0x00000000, 0x3fe76c24, 0xd808ca92, 0x3e9b98d8, 0x00000000, 0x3fe77dd1, 0xc75cc980, 0x3e62ea22,
- 0x00000000, 0x3fe78f6b, 0x2bca0350, 0x3e97aba6, 0x00000000, 0x3fe7a0f4, 0x3442278c, 0x3e9d7383,
- 0x00000000, 0x3fe7b26c, 0x1fb18bf9, 0x3e95a5ca, 0x00000000, 0x3fe7c3d3, 0x2b6ecf28, 0x3e61a609,
- 0x00000000, 0x3fe7d528, 0x49aac104, 0x3e744fd0, 0x00000000, 0x3fe7e66c, 0xd8df5180, 0x3e2c114f,
- 0x00000000, 0x3fe7f79e, 0x130feae5, 0x3e95972f, 0x00000000, 0x3fe808c0, 0xa55fe198, 0x3e7ca034,
- 0x00000000, 0x3fe819d0, 0x49990227, 0x3e96e2b1, 0x00000000, 0x3fe82ad0, 0x0294592c, 0x3e7b0000,
- 0x00000000, 0x3fe83bbe, 0xc442620e, 0x3e98b9bd, 0x00000000, 0x3fe84c9c, 0xfabf3e4e, 0x3e8d94fd,
- 0x00000000, 0x3fe85d69, 0xb145ad9a, 0x3e85db30, 0x00000000, 0x3fe86e25, 0xb95022b0, 0x3e8e3e1e,
- 0x00000000, 0x3fe87ed0, 0x45442bd6, 0x3e9d5b8b, 0x00000000, 0x3fe88f6b, 0x231ecd2e, 0x3e97a046,
- 0x00000000, 0x3fe89ff5, 0x3ef55232, 0x3e9feafe, 0x00000000, 0x3fe8b06f, 0xbfd78267, 0x3e9839e7,
- 0x00000000, 0x3fe8c0d9, 0x9d6fa900, 0x3e645cf4, 0x00000000, 0x3fe8d132, 0x2b27f380, 0x3e4be313,
- 0x00000000, 0x3fe8e17a, 0x0bb84f9f, 0x3e953398, 0x00000000, 0x3fe8f1b3, 0xce3ba390, 0x3e5889e2,
- 0x00000000, 0x3fe901db, 0xc3ad0cc8, 0x3e7f7778, 0x00000000, 0x3fe911f3, 0xcec4eba2, 0x3e846660,
- 0x00000000, 0x3fe921fb, 0x4611a626, 0x3e85110b, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
- 0x80000000, 0x3ff00553, 0xc81e4294, 0x3e6e6a24, 0x90000000, 0x3ff00aa3, 0x11e3a785, 0x3e585485,
- 0x10000000, 0x3ff00ff0, 0x36ec07f6, 0x3e64eb93, 0x20000000, 0x3ff01539, 0xb8b750e1, 0x3e40ea64,
- 0xb0000000, 0x3ff01a7e, 0xcff8a53c, 0x3e461637, 0xd0000000, 0x3ff01fc0, 0xf7bd1943, 0x3e40733b,
- 0x80000000, 0x3ff024ff, 0x1345cced, 0x3e566691, 0xd0000000, 0x3ff02a3a, 0x3f592f14, 0x3e477b7a,
- 0xb0000000, 0x3ff02f72, 0xdd1a5402, 0x3e6f18d3, 0x50000000, 0x3ff034a7, 0xa58ee9a4, 0x3e2be2f5,
- 0x80000000, 0x3ff039d8, 0x8f085fa7, 0x3e68901f, 0x70000000, 0x3ff03f06, 0xcd5b5d69, 0x3e5c68b8,
- 0x10000000, 0x3ff04431, 0x8624be42, 0x3e5a6b0e, 0x70000000, 0x3ff04958, 0xb06f68e7, 0x3dbc4b22,
- 0x80000000, 0x3ff04e7c, 0xafcabe9b, 0x3e60f3f0, 0x60000000, 0x3ff0539d, 0xbca4e1b7, 0x3e548495,
- 0x00000000, 0x3ff058bb, 0x1abdfdc3, 0x3e66107f, 0x70000000, 0x3ff05dd5, 0x1878288a, 0x3e6e6726,
- 0xc0000000, 0x3ff062ec, 0x55286f1e, 0x3e5a6bc1, 0xe0000000, 0x3ff06800, 0xc64a85f2, 0x3e58a759,
- 0xe0000000, 0x3ff06d11, 0x0a4a8d09, 0x3e45fce7, 0xc0000000, 0x3ff0721f, 0xf373fe1d, 0x3e32f9cb,
- 0x80000000, 0x3ff0772a, 0xce4ac359, 0x3e590564, 0x30000000, 0x3ff07c32, 0xe761b02f, 0x3e5ac29c,
- 0xd0000000, 0x3ff08136, 0xf497381c, 0x3e5cb752, 0x60000000, 0x3ff08638, 0x1cfb35e0, 0x3e68bb9e,
- 0xf0000000, 0x3ff08b36, 0x7099de90, 0x3e65b491, 0x80000000, 0x3ff09032, 0xc9c65ef2, 0x3e5cc77a,
- 0x10000000, 0x3ff0952b, 0xe7be3dba, 0x3e57a0f3, 0xa0000000, 0x3ff09a20, 0x1ee0c16f, 0x3e66ec85,
- 0x40000000, 0x3ff09f13, 0xbf2946da, 0x3e689449, 0xf0000000, 0x3ff0a402, 0x301ba223, 0x3e698f25,
- 0xc0000000, 0x3ff0a8ef, 0xc651f549, 0x3e347d5e, 0x90000000, 0x3ff0add9, 0x9a86007a, 0x3e6c33ec,
- 0x90000000, 0x3ff0b2c0, 0x53e92649, 0x3e5e0b66, 0xb0000000, 0x3ff0b7a4, 0xc09d755f, 0x3e3bd64a,
- 0xf0000000, 0x3ff0bc85, 0x06f78167, 0x3e2f5375, 0x50000000, 0x3ff0c164, 0xd1b3735e, 0x3e62c382,
- 0xe0000000, 0x3ff0c63f, 0x659f99e1, 0x3e6e20ed, 0xb0000000, 0x3ff0cb18, 0x3a9c182a, 0x3e586b63,
- 0xb0000000, 0x3ff0cfee, 0x5a65e777, 0x3e445cfd, 0xe0000000, 0x3ff0d4c1, 0x0f58bca4, 0x3e60c877,
- 0x50000000, 0x3ff0d992, 0x4b0933c5, 0x3e6739e4, 0x10000000, 0x3ff0de60, 0xd9ce7bd8, 0x3e027dc3,
- 0x00000000, 0x3ff0e32b, 0x7c5a7b64, 0x3e63c53c, 0x40000000, 0x3ff0e7f3, 0x83830cec, 0x3e696696,
- 0xd0000000, 0x3ff0ecb8, 0xc39bdcc4, 0x3e68d772, 0xb0000000, 0x3ff0f17b, 0x8bcf6d7b, 0x3e69b000,
- 0xf0000000, 0x3ff0f63b, 0x5825ce4f, 0x3e3bbb30, 0x70000000, 0x3ff0faf9, 0xaf13a406, 0x3e6da3f4,
- 0x60000000, 0x3ff0ffb4, 0x6f74ce86, 0x3e5f36b9, 0xb0000000, 0x3ff1046c, 0x2303f790, 0x3e165c00,
- 0x50000000, 0x3ff10922, 0x095ba7d5, 0x3e682f84, 0x60000000, 0x3ff10dd5, 0x3541b2c6, 0x3e6d4643,
- 0xe0000000, 0x3ff11285, 0x56e93a89, 0x3e671c3d, 0xd0000000, 0x3ff11733, 0xf4e40012, 0x3e598dce,
- 0x30000000, 0x3ff11bdf, 0xef17fe03, 0x3e4530eb, 0x00000000, 0x3ff12088, 0xa3715066, 0x3e4e8b8f,
- 0x40000000, 0x3ff1252e, 0xb3b211dc, 0x3e6ab26e, 0x10000000, 0x3ff129d2, 0xdc906307, 0x3e454dd4,
- 0x50000000, 0x3ff12e73, 0x2387984e, 0x3e5c9f96, 0x10000000, 0x3ff13312, 0x59afec09, 0x3e6c62a9,
- 0x60000000, 0x3ff137ae, 0xac6a866a, 0x3e6638d9, 0x40000000, 0x3ff13c48, 0xeca8a22d, 0x3e338704,
- 0xa0000000, 0x3ff140df, 0x1db14f8f, 0x3e4e6c9e, 0x90000000, 0x3ff14574, 0x7f9c9eaa, 0x3e58744b,
- 0x10000000, 0x3ff14a07, 0x3486373b, 0x3e66c289, 0x30000000, 0x3ff14e97, 0xe31699b7, 0x3e5b36bc,
- 0xe0000000, 0x3ff15324, 0x13d200c7, 0x3e671e38, 0x30000000, 0x3ff157b0, 0xab40aa88, 0x3e699755,
- 0x20000000, 0x3ff15c39, 0x0e4bcfc0, 0x3e6b45ca, 0xc0000000, 0x3ff160bf, 0x0d869c5d, 0x3e32dd09,
- 0xf0000000, 0x3ff16543, 0x16b917da, 0x3e64fe05, 0xd0000000, 0x3ff169c5, 0x226317a2, 0x3e694563,
- 0x60000000, 0x3ff16e45, 0xafc2c851, 0x3e653d8f, 0xa0000000, 0x3ff172c2, 0x1fbd41a3, 0x3e5dcbd4,
- 0x90000000, 0x3ff1773d, 0x5285f59c, 0x3e5862ff, 0x30000000, 0x3ff17bb6, 0xa97a1e1c, 0x3e63072e,
- 0x90000000, 0x3ff1802c, 0x75184805, 0x3e528390, 0xa0000000, 0x3ff184a0, 0x3e9eff42, 0x3e64b032,
- 0x70000000, 0x3ff18912, 0x93c45484, 0x3e6b1588, 0x10000000, 0x3ff18d82, 0x0fc35826, 0x3e3149ef,
- 0x60000000, 0x3ff191ef, 0xea96acaa, 0x3e5f2e77, 0x80000000, 0x3ff1965a, 0x4c471a95, 0x3e520007,
- 0x60000000, 0x3ff19ac3, 0x517f6f04, 0x3e63f8cc, 0x10000000, 0x3ff19f2a, 0xe311bb55, 0x3e660ba2,
- 0x90000000, 0x3ff1a38e, 0x730bbec3, 0x3e64b788, 0xe0000000, 0x3ff1a7f0, 0x795ee20c, 0x3e657090,
- 0x00000000, 0x3ff1ac51, 0x983670b1, 0x3e6d9ffe, 0x00000000, 0x3ff1b0af, 0xff61bfda, 0x3e62a463,
- 0xd0000000, 0x3ff1b50a, 0x6a5e65cf, 0x3e69d1bc, 0x80000000, 0x3ff1b964, 0xbaa9e922, 0x3e68718a,
- 0x10000000, 0x3ff1bdbc, 0x2ffa342e, 0x3e63c2f5, 0x80000000, 0x3ff1c211, 0x3ff42c80, 0x3e60fae1,
- 0xd0000000, 0x3ff1c664, 0x0ef00d57, 0x3e65440f, 0x10000000, 0x3ff1cab6, 0x2d4e3c1e, 0x3e46fcd2,
- 0x30000000, 0x3ff1cf05, 0xb409e863, 0x3e4e0c60, 0x30000000, 0x3ff1d352, 0x5a5f0333, 0x3e6f9cab,
- 0x30000000, 0x3ff1d79d, 0x744c333d, 0x3e630f24, 0x20000000, 0x3ff1dbe6, 0x2a76b2fe, 0x3e4b5062,
- 0xf0000000, 0x3ff1e02c, 0xba595375, 0x3e6fdb94, 0xd0000000, 0x3ff1e471, 0xb945a171, 0x3e3861b9,
- 0x90000000, 0x3ff1e8b4, 0x015188c4, 0x3e654348, 0x50000000, 0x3ff1ecf5, 0x49865523, 0x3e6b54d1,
- 0x10000000, 0x3ff1f134, 0x83d9de33, 0x3e6a0bb7, 0xd0000000, 0x3ff1f570, 0x2b1a2157, 0x3e6629d1,
- 0x90000000, 0x3ff1f9ab, 0x35d179df, 0x3e6467fe, 0x50000000, 0x3ff1fde4, 0x3e26c8f7, 0x3e69763f,
- 0x20000000, 0x3ff2021b, 0xbb9f7679, 0x3e53f798, 0xf0000000, 0x3ff2064f, 0x7e855898, 0x3e552e57,
- 0xc0000000, 0x3ff20a82, 0xe5502c3a, 0x3e6fde47, 0xb0000000, 0x3ff20eb3, 0x548d96a0, 0x3e5cbd0b,
- 0xa0000000, 0x3ff212e2, 0xf7be8de8, 0x3e6a9cd9, 0xb0000000, 0x3ff2170f, 0x704886de, 0x3e522bbe,
- 0xc0000000, 0x3ff21b3a, 0x8317f020, 0x3e6e3dea, 0xf0000000, 0x3ff21f63, 0x85ac8855, 0x3e6e8120,
- 0x40000000, 0x3ff2238b, 0x4f24cb07, 0x3e5c8714, 0xa0000000, 0x3ff227b0, 0xee311fa2, 0x3e61e128,
- 0x20000000, 0x3ff22bd4, 0x3d61a2d3, 0x3e5b5c16, 0xc0000000, 0x3ff22ff5, 0x7fb90633, 0x3e47d97e,
- 0x70000000, 0x3ff23415, 0x9d50f6a7, 0x3e6efe89, 0x50000000, 0x3ff23833, 0xeb75de5a, 0x3e6d0333,
- 0x60000000, 0x3ff23c4f, 0xbe73a573, 0x3e40e590, 0x80000000, 0x3ff24069, 0xcac3cdd2, 0x3e68ce8d,
- 0xd0000000, 0x3ff24481, 0x8954064b, 0x3e6ee8a4, 0x50000000, 0x3ff24898, 0x18461e09, 0x3e6aa62f,
- 0x00000000, 0x3ff24cad, 0x40986a15, 0x3e601e59, 0xe0000000, 0x3ff250bf, 0x4f9b8d4c, 0x3e3b082f,
- 0xe0000000, 0x3ff254d0, 0xe5527f5a, 0x3e6876e0, 0x20000000, 0x3ff258e0, 0x80831e6b, 0x3e636170,
- 0x90000000, 0x3ff25ced, 0xe34aa4a2, 0x3e681b26, 0x40000000, 0x3ff260f9, 0x6dfab0c1, 0x3e552ee6,
- 0x20000000, 0x3ff26503, 0x329e8819, 0x3e5d85a5, 0x40000000, 0x3ff2690b, 0xb646b5d1, 0x3e5105c1,
- 0x90000000, 0x3ff26d11, 0x0c1a379c, 0x3e6bb669, 0x30000000, 0x3ff27116, 0xa73ce3a9, 0x3e586aeb,
- 0x00000000, 0x3ff27519, 0x98294dd4, 0x3e6dd161, 0x20000000, 0x3ff2791a, 0x75775e83, 0x3e6454e6,
- 0x80000000, 0x3ff27d19, 0x026197ea, 0x3e63842e, 0x20000000, 0x3ff28117, 0xe70c44d2, 0x3e6f1ce0,
- 0x10000000, 0x3ff28513, 0x441a5627, 0x3e6ad636, 0x50000000, 0x3ff2890d, 0xd7212abb, 0x3e54c205,
- 0xd0000000, 0x3ff28d05, 0x6c116419, 0x3e6167c8, 0xa0000000, 0x3ff290fc, 0xef16e294, 0x3e638ec3,
- 0xc0000000, 0x3ff294f1, 0xeace9321, 0x3e6473fc, 0x30000000, 0x3ff298e5, 0xa836dba7, 0x3e67af53,
- 0x00000000, 0x3ff29cd7, 0xc383b652, 0x3e1a51f3, 0x10000000, 0x3ff2a0c7, 0xa190822d, 0x3e63696d,
- 0x80000000, 0x3ff2a4b5, 0xec77074b, 0x3e62f9ad, 0x50000000, 0x3ff2a8a2, 0xd5bee55f, 0x3e38190f,
- 0x70000000, 0x3ff2ac8d, 0xfac68e55, 0x3e4bfee8, 0xf0000000, 0x3ff2b076, 0x6bc5f68a, 0x3e331c9d,
- 0xc0000000, 0x3ff2b45e, 0x23737edf, 0x3e689d05, 0x00000000, 0x3ff2b845, 0x43bf47bb, 0x3e5a2959,
- 0xa0000000, 0x3ff2bc29, 0x2e5b3207, 0x3e396be3, 0x90000000, 0x3ff2c00c, 0xd909fa0e, 0x3e6e44c7,
- 0x00000000, 0x3ff2c3ee, 0xda94d9ea, 0x3e2b2505, 0xc0000000, 0x3ff2c7cd, 0xf46c9c98, 0x3e60c851,
- 0xf0000000, 0x3ff2cbab, 0x7d9aa3b7, 0x3e5da71f, 0x80000000, 0x3ff2cf88, 0x5d019ef1, 0x3e6f1b60,
- 0x90000000, 0x3ff2d363, 0xa2189563, 0x3e4386e8, 0x00000000, 0x3ff2d73d, 0x5d306ba7, 0x3e3b19fa,
- 0xd0000000, 0x3ff2db14, 0xb67aef76, 0x3e6dd749, 0x20000000, 0x3ff2deeb, 0xf1dc04b0, 0x3e676ff6,
- 0xe0000000, 0x3ff2e2bf, 0xd0b232a6, 0x3e635a33, 0x10000000, 0x3ff2e693, 0x0024a4e1, 0x3e64bdc8,
- 0xb0000000, 0x3ff2ea64, 0x770fd723, 0x3e6ebd61, 0xd0000000, 0x3ff2ee34, 0xc537264d, 0x3e64769f,
- 0x60000000, 0x3ff2f203, 0x429f3b98, 0x3e69021f, 0x70000000, 0x3ff2f5d0, 0x3efbd606, 0x3e5ee708,
- 0xf0000000, 0x3ff2f99b, 0x552a6b1a, 0x3e6ad985, 0xf0000000, 0x3ff2fd65, 0x78772160, 0x3e6e3df7,
- 0x70000000, 0x3ff3012e, 0x6ddc9b34, 0x3e6ca5d7, 0x70000000, 0x3ff304f5, 0xffdbaf74, 0x3e691154,
- 0xf0000000, 0x3ff308ba, 0x57fb306a, 0x3e667bdd, 0xf0000000, 0x3ff30c7e, 0x5ac40886, 0x3e67dc25,
- 0x80000000, 0x3ff31041, 0x8e8afafe, 0x3df219f3, 0x80000000, 0x3ff31402, 0xf9669a04, 0x3e62416b,
- 0x10000000, 0x3ff317c2, 0xb2b3987f, 0x3e611c96, 0x20000000, 0x3ff31b80, 0x447e1177, 0x3e6f99ed,
- 0xd0000000, 0x3ff31f3c, 0x26328a11, 0x3e132458, 0xf0000000, 0x3ff322f7, 0xd1e645f8, 0x3e66f56d,
- 0xb0000000, 0x3ff326b1, 0x46945535, 0x3e461649, 0xf0000000, 0x3ff32a69, 0x9d190028, 0x3e5e37d5,
- 0xc0000000, 0x3ff32e20, 0xf12bf828, 0x3e668671, 0x20000000, 0x3ff331d6, 0xca6aabbd, 0x3e6e8ecb,
- 0x20000000, 0x3ff3358a, 0x109a5912, 0x3e53f49e, 0xa0000000, 0x3ff3393c, 0x11ec3043, 0x3e6b8a0e,
- 0xc0000000, 0x3ff33ced, 0x0aed691a, 0x3e65fae0, 0x70000000, 0x3ff3409d, 0xbece3e4a, 0x3e6c0569,
- 0xc0000000, 0x3ff3444b, 0x744efbfe, 0x3e605e26, 0xa0000000, 0x3ff347f8, 0xa94be5c5, 0x3e65b570,
- 0x20000000, 0x3ff34ba4, 0x6ea0e063, 0x3e5d6f15, 0x30000000, 0x3ff34f4e, 0x612fc484, 0x3e6e0ca7,
- 0xf0000000, 0x3ff352f6, 0x27b25258, 0x3e4963c9, 0x40000000, 0x3ff3569e, 0xaa725a5c, 0x3e547930,
- 0x30000000, 0x3ff35a44, 0xe3af43b3, 0x3e58a79f, 0xc0000000, 0x3ff35de8, 0x9c41bdaf, 0x3e5e6dc2,
- 0xf0000000, 0x3ff3618b, 0x76f863a5, 0x3e657a2e, 0xd0000000, 0x3ff3652d, 0x1716354d, 0x3e2ae3b6,
- 0x40000000, 0x3ff368ce, 0xdf6906b1, 0x3e665fb5, 0x60000000, 0x3ff36c6d, 0x7f588f7b, 0x3e66177d,
- 0x30000000, 0x3ff3700b, 0xbd091b67, 0x3e3ad55a, 0xa0000000, 0x3ff373a7, 0xb2422d76, 0x3e155337,
- 0xb0000000, 0x3ff37742, 0xe86972d5, 0x3e6084eb, 0x70000000, 0x3ff37adc, 0x808e1ea3, 0x3e656395,
- 0xe0000000, 0x3ff37e74, 0x1b40fba7, 0x3e61bce2, 0x00000000, 0x3ff3820c, 0x4605b515, 0x3e5006f9,
- 0xc0000000, 0x3ff385a1, 0xaceb1f7d, 0x3e6aa676, 0x40000000, 0x3ff38936, 0x76554ce6, 0x3e58229f,
- 0x60000000, 0x3ff38cc9, 0x6cf57330, 0x3e6eabfc, 0x40000000, 0x3ff3905b, 0x9c0ce8bc, 0x3e64daed,
- 0xd0000000, 0x3ff393eb, 0x68237141, 0x3e60ff17, 0x10000000, 0x3ff3977b, 0x3051b085, 0x3e6575f8,
- 0x10000000, 0x3ff39b09, 0xeb523e29, 0x3e42667d, 0xc0000000, 0x3ff39e95, 0x6954f4fd, 0x3e181699,
- 0x20000000, 0x3ff3a221, 0xcf4d9cd4, 0x3e587cfc, 0x40000000, 0x3ff3a5ab, 0x18198353, 0x3e52c5d0,
- 0x10000000, 0x3ff3a934, 0x8dcc34aa, 0x3e6a7a89, 0xb0000000, 0x3ff3acbb, 0xdadc36d1, 0x3e2cead6,
- 0x00000000, 0x3ff3b042, 0x9c498bdf, 0x3e2a5575, 0x00000000, 0x3ff3b3c7, 0x9ef6de04, 0x3e6c414a,
- 0xd0000000, 0x3ff3b74a, 0x8a6e58fa, 0x3e63e210, 0x60000000, 0x3ff3bacd, 0x7643d77c, 0x3e5587fd,
- 0xb0000000, 0x3ff3be4e, 0x1d3ff3df, 0x3e3901eb, 0xb0000000, 0x3ff3c1ce, 0x7c812fc6, 0x3e6f2ccd,
- 0x90000000, 0x3ff3c54d, 0x70a01049, 0x3e21c8ee, 0x20000000, 0x3ff3c8cb, 0x02831eec, 0x3e563e8d,
- 0x70000000, 0x3ff3cc47, 0x2a92c7ff, 0x3e6f61a4, 0xa0000000, 0x3ff3cfc2, 0x99c84d24, 0x3dda9173,
- 0x80000000, 0x3ff3d33c, 0xc8eec2f0, 0x3e5e9197, 0x30000000, 0x3ff3d6b5, 0x2f5a1378, 0x3e5e6f84,
- 0xb0000000, 0x3ff3da2c, 0x2a90a0fc, 0x3e2fac24, 0xf0000000, 0x3ff3dda2, 0x26610227, 0x3e535ed7,
- 0x00000000, 0x3ff3e118, 0x4804b15b, 0x3e50e0d6, 0xe0000000, 0x3ff3e48b, 0x5daba814, 0x3e056067,
- 0x80000000, 0x3ff3e7fe, 0xc8768032, 0x3e637388, 0x00000000, 0x3ff3eb70, 0x9f9e01f5, 0x3e3ee3c8,
- 0x40000000, 0x3ff3eee0, 0x0d09747c, 0x3e639f6f, 0x60000000, 0x3ff3f24f, 0x27abb8f0, 0x3e4322c3,
- 0x40000000, 0x3ff3f5bd, 0x47c8ac80, 0x3e6961b3, 0x00000000, 0x3ff3f92a, 0xbbd0f118, 0x3e63711f,
- 0x90000000, 0x3ff3fc95, 0xd7718ffb, 0x3e64fad8, 0xf0000000, 0x3ff3ffff, 0xffffffff, 0x3e6fffff,
- 0x30000000, 0x3ff40369, 0x79ec35b4, 0x3e667efa, 0x40000000, 0x3ff406d1, 0x87a254a8, 0x3e6a7376,
- 0x30000000, 0x3ff40a38, 0xf87d924d, 0x3e5bace0, 0xf0000000, 0x3ff40d9d, 0xc237e392, 0x3e629e37,
- 0x90000000, 0x3ff41102, 0xac3f3012, 0x3e557ce7, 0x00000000, 0x3ff41466, 0x359f8fbd, 0x3e682829,
- 0x50000000, 0x3ff417c8, 0x42d14676, 0x3e6cc9be, 0x80000000, 0x3ff41b29, 0x1c137d0b, 0x3e6a8f00,
- 0x90000000, 0x3ff41e89, 0x687dda05, 0x3e636127, 0x80000000, 0x3ff421e8, 0x322646f0, 0x3e524dba,
- 0x40000000, 0x3ff42546, 0x1ed210b4, 0x3e6dc43f, 0xf0000000, 0x3ff428a2, 0x15c447bb, 0x3e631ae5,
- 0xf0000000, 0x3fe428a2, 0x15c447bb, 0x3e531ae5, 0xa0000000, 0x3fe965fe, 0xf20ac166, 0x3e44f5b8,
- 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0xf0000000, 0x3ff428a2, 0x15c447bb, 0x3e631ae5,
- 0xa0000000, 0x3ff965fe, 0xf20ac166, 0x3e54f5b8, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
- 0x30000000, 0x3ff02c9a, 0xc1dcdef9, 0x3e6cef00, 0xd0000000, 0x3ff059b0, 0xa1d73e2a, 0x3e48ac2b,
- 0x10000000, 0x3ff08745, 0x901186be, 0x3e60eb37, 0x60000000, 0x3ff0b558, 0x1ec53172, 0x3e69f312,
- 0x30000000, 0x3ff0e3ec, 0x10103a17, 0x3e469e8d, 0xd0000000, 0x3ff11301, 0xa4ebbf1a, 0x3df25b50,
- 0xa0000000, 0x3ff1429a, 0xbf668203, 0x3e6d525b, 0x30000000, 0x3ff172b8, 0xf5b9bef9, 0x3e68faa2,
- 0xe0000000, 0x3ff1a35b, 0xea796d31, 0x3e66df96, 0x30000000, 0x3ff1d487, 0xa7805b80, 0x3e368b9a,
- 0x80000000, 0x3ff2063b, 0xac771dd6, 0x3e60c519, 0x60000000, 0x3ff2387a, 0x70cd83f5, 0x3e6ceac4,
- 0x60000000, 0x3ff26b45, 0x7495e99c, 0x3e5789f3, 0xf0000000, 0x3ff29e9d, 0x84b09745, 0x3e547f7b,
- 0xa0000000, 0x3ff2d285, 0x2d002475, 0x3e5b900c, 0x00000000, 0x3ff306fe, 0x2a5bd1ab, 0x3e64636e,
- 0xb0000000, 0x3ff33c08, 0xfa64e430, 0x3e4320b7, 0x30000000, 0x3ff371a7, 0x2a9c5154, 0x3e5ceaa7,
- 0x30000000, 0x3ff3a7db, 0xdba86f24, 0x3e53967f, 0x40000000, 0x3ff3dea6, 0x446b6824, 0x3e682468,
- 0x20000000, 0x3ff4160a, 0x9f84325b, 0x3e3f72e2, 0x60000000, 0x3ff44e08, 0x40c4dbd0, 0x3e18624b,
- 0xb0000000, 0x3ff486a2, 0x404f068e, 0x3e5704f3, 0xd0000000, 0x3ff4bfda, 0x9c750e5e, 0x3e54d8a8,
- 0x70000000, 0x3ff4f9b2, 0x9ab4cf62, 0x3e5a74b2, 0x50000000, 0x3ff5342b, 0x077c2a0f, 0x3e5a753e,
- 0x30000000, 0x3ff56f47, 0x699bb2c0, 0x3e5ad49f, 0xd0000000, 0x3ff5ab07, 0x52b19260, 0x3e6a90a8,
- 0x10000000, 0x3ff5e76f, 0x21ba6f93, 0x3e56b485, 0xb0000000, 0x3ff6247e, 0x58f87d03, 0x3e0d2ac2,
- 0x80000000, 0x3ff66238, 0x24893ecf, 0x3e42a911, 0x60000000, 0x3ff6a09e, 0x32422cbe, 0x3e59fcef,
- 0x30000000, 0x3ff6dfb2, 0x5de441c5, 0x3e68ca34, 0xe0000000, 0x3ff71f75, 0xe7ba46e1, 0x3e61d8be,
- 0x50000000, 0x3ff75feb, 0x22fdba6a, 0x3e59099f, 0x70000000, 0x3ff7a114, 0x36bea881, 0x3e4f580c,
- 0x30000000, 0x3ff7e2f3, 0x8841740a, 0x3e5b3d39, 0x90000000, 0x3ff82589, 0x25159f11, 0x3e62999c,
- 0x90000000, 0x3ff868d9, 0xd901c83b, 0x3e668925, 0x40000000, 0x3ff8ace5, 0xdadd3e2a, 0x3e415506,
- 0x90000000, 0x3ff8f1ae, 0x6c57304e, 0x3e622aee, 0xb0000000, 0x3ff93737, 0x9e8a0387, 0x3e29b8bc,
- 0x90000000, 0x3ff97d82, 0x9f173d24, 0x3e6fbc9c, 0x80000000, 0x3ff9c491, 0x80e3e235, 0x3e451f84,
- 0x70000000, 0x3ffa0c66, 0xc96535b5, 0x3e66bbca, 0xb0000000, 0x3ffa5503, 0xe45a1224, 0x3e41f12a,
- 0x50000000, 0x3ffa9e6b, 0xfd0fac90, 0x3e55e7f6, 0x90000000, 0x3ffae89f, 0x5abd0e69, 0x3e62b5a7,
- 0xb0000000, 0x3ffb33a2, 0xf5ed7fa1, 0x3e609e2b, 0xf0000000, 0x3ffb7f76, 0x37553d84, 0x3e47daf2,
- 0x90000000, 0x3ffbcc1e, 0x891ee83d, 0x3e12f074, 0xd0000000, 0x3ffc199b, 0x38444196, 0x3e6b0aa5,
- 0x20000000, 0x3ffc67f1, 0x9694426f, 0x3e6cafa2, 0xd0000000, 0x3ffcb720, 0xd22a0797, 0x3e69df20,
- 0x40000000, 0x3ffd072d, 0xf71a1e45, 0x3e640f12, 0xd0000000, 0x3ffd5818, 0x0e4bb40b, 0x3e69f749,
- 0x00000000, 0x3ffda9e6, 0x2b84600d, 0x3e4ed994, 0x30000000, 0x3ffdfc97, 0xf5cb4656, 0x3e4bdcda,
- 0xe0000000, 0x3ffe502e, 0xd89cf44c, 0x3e5e2cff, 0xa0000000, 0x3ffea4af, 0xcc2c7b9d, 0x3e452486,
- 0xe0000000, 0x3ffefa1b, 0x4eee3fa4, 0x3e6cc2b4, 0x50000000, 0x3fff5076, 0x80ce9f09, 0x3e66dc8a,
- 0x80000000, 0x3fffa7c1, 0x82e90a7e, 0x3e39e90d, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x3f8fc0a8, 0x7c79f3db, 0x3e361f80, 0x00000000, 0x3f9f8298, 0x980267c8, 0x3e6873c1,
- 0x00000000, 0x3fa77458, 0x9f88c69e, 0x3e5ec65b, 0x00000000, 0x3faf0a30, 0x54cc2f99, 0x3e58022c,
- 0x00000000, 0x3fb341d7, 0x3a125330, 0x3e62c37a, 0x00000000, 0x3fb6f0d2, 0x69737c93, 0x3e615cad,
- 0x00000000, 0x3fba926d, 0xb1b285e9, 0x3e4d256a, 0x00000000, 0x3fbe2707, 0xb97a7aa2, 0x3e5b8abc,
- 0x00000000, 0x3fc0d77e, 0x9659a5dc, 0x3e6f3423, 0x80000000, 0x3fc29552, 0x48d30177, 0x3e6e07fd,
- 0x00000000, 0x3fc44d2b, 0x4799f4f6, 0x3e6b32df, 0x00000000, 0x3fc5ff30, 0xf4f21cf8, 0x3e6c29e4,
- 0x00000000, 0x3fc7ab89, 0x48df1b59, 0x3e1086c8, 0x80000000, 0x3fc9525a, 0xb4764130, 0x3e4cf456,
- 0x00000000, 0x3fcaf3c9, 0xfcb63398, 0x3e63a02f, 0x80000000, 0x3fcc8ff7, 0x886b0976, 0x3e61e6a6,
- 0x00000000, 0x3fce2707, 0xb97a7aa2, 0x3e6b8abc, 0x00000000, 0x3fcfb918, 0x8aa35552, 0x3e6b578f,
- 0xc0000000, 0x3fd0a324, 0x71afb9fc, 0x3e6139c8, 0x80000000, 0x3fd1675c, 0x0701ce64, 0x3e65d5d3,
- 0xc0000000, 0x3fd22941, 0xb2d12142, 0x3e6de7bc, 0x80000000, 0x3fd2e8e2, 0x984e1664, 0x3e6d708e,
- 0x40000000, 0x3fd3a64c, 0xe9c72f36, 0x3e556945, 0xc0000000, 0x3fd4618b, 0x13e85bda, 0x3e20e2f6,
- 0x80000000, 0x3fd51aad, 0xb42724f6, 0x3e3cb7e0, 0x80000000, 0x3fd5d1bd, 0xe52846c7, 0x3e6fac04,
- 0x00000000, 0x3fd686c8, 0xaec442be, 0x3e5e9b14, 0xc0000000, 0x3fd739d7, 0x034e7126, 0x3e6b5de8,
- 0x00000000, 0x3fd7eaf8, 0xe1b259d3, 0x3e6dc157, 0x80000000, 0x3fd89a33, 0x6ad69c62, 0x3e3b0509,
- 0x00000000, 0x3fd94794, 0xfaba4cdd, 0x3e5c2116, 0xc0000000, 0x3fd9f323, 0x25f95b47, 0x3e665fcc,
- 0x80000000, 0x3fda9cec, 0x498d4850, 0x3e5a9a08, 0x40000000, 0x3fdb44f7, 0xb1465f77, 0x3e6de647,
- 0x80000000, 0x3fdbeb4d, 0x7bf7861d, 0x3e5da71b, 0xc0000000, 0x3fdc8ff7, 0x86b09760, 0x3e3e6a68,
- 0x40000000, 0x3fdd32fe, 0xeab0ef64, 0x3e6f0075, 0x00000000, 0x3fddd46a, 0x82fb989b, 0x3e330712,
- 0x40000000, 0x3fde7442, 0xc3f1bed2, 0x3e60eb43, 0x40000000, 0x3fdf128f, 0xecb35c84, 0x3e5faf06,
- 0x80000000, 0x3fdfaf58, 0x3db35f68, 0x3e4ef1e6, 0xa0000000, 0x3fe02552, 0xfb1a71a5, 0x3e469743,
- 0x40000000, 0x3fe0723e, 0x404e5796, 0x3e6c1cdf, 0xe0000000, 0x3fe0be72, 0x0ada625e, 0x3e4094aa,
- 0x80000000, 0x3fe109f3, 0x96fde3ec, 0x3e6e2d4c, 0xc0000000, 0x3fe154c3, 0xe9a98f34, 0x3e62f4d5,
- 0xa0000000, 0x3fe19ee6, 0x6ecc5cbe, 0x3e6467c9, 0x40000000, 0x3fe1e85f, 0xd03dec5a, 0x3e6e7040,
- 0xc0000000, 0x3fe23130, 0x4282de36, 0x3e67bebf, 0x00000000, 0x3fe2795e, 0x1aeb783f, 0x3e6289b1,
- 0xe0000000, 0x3fe2c0e9, 0x1772f538, 0x3e5a891d, 0x20000000, 0x3fe307d7, 0xbe1fb591, 0x3e634f10,
- 0x80000000, 0x3fe34e28, 0xd316eb93, 0x3e6d9ce1, 0xc0000000, 0x3fe393e0, 0x19a9c442, 0x3e63562a,
- 0x60000000, 0x3fe3d902, 0xf548084c, 0x3e54e2ad, 0xe0000000, 0x3fe41d8f, 0x5cc8c97a, 0x3e508ce5,
- 0xc0000000, 0x3fe4618b, 0x13e85bda, 0x3e30e2f6, 0x40000000, 0x3fe4a4f8, 0xbb0227bf, 0x3e6db03e,
- 0x00000000, 0x3fe4e7d8, 0xb09cb098, 0x3e61b75b, 0x20000000, 0x3fe52a2d, 0xabb9df22, 0x3e496f16,
- 0xc0000000, 0x3fe56bf9, 0x99411c62, 0x3e65b3f3, 0x40000000, 0x3fe5ad40, 0x59f65355, 0x3e586b3e,
- 0xa0000000, 0x3fe5ee02, 0xeae1ac12, 0x3e52482c, 0xe0000000, 0x3fe62e42, 0xef35793c, 0x3e6efa39,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xa0000000, 0x3f6ff00a, 0x0250435a, 0x3db5885e,
- 0x60000000, 0x3f7fe02a, 0x11f86ed2, 0x3de620cf, 0x50000000, 0x3f87dc47, 0xedba4a25, 0x3dff0214,
- 0xb0000000, 0x3f8fc0a8, 0x79f3db4e, 0x3dbf807c, 0x40000000, 0x3f93cea4, 0xa779a52b, 0x3dea352b,
- 0x00000000, 0x3f97b91b, 0x6aa49fd5, 0x3dff56c4, 0x20000000, 0x3f9b9fc0, 0x5fef5196, 0x3dfebe46,
- 0x00000000, 0x3f9f829b, 0x0099f1f8, 0x3e0cf066, 0x80000000, 0x3fa1b0d9, 0xff85945d, 0x3e1247b2,
- 0xb0000000, 0x3fa39e87, 0xbf5202b6, 0x3e13fd7a, 0xa0000000, 0x3fa58a5b, 0xa918d51e, 0x3e1f91c9,
- 0xf0000000, 0x3fa77458, 0xf118d3ca, 0x3e08cb73, 0x00000000, 0x3fa95c83, 0xd6fad074, 0x3e1d91c7,
- 0x70000000, 0x3fab42dd, 0xec28d14c, 0x3de1971b, 0x80000000, 0x3fad276b, 0xa423c78a, 0x3e15b616,
- 0xc0000000, 0x3faf0a30, 0x617cc971, 0x3da162a6, 0x30000000, 0x3fb07598, 0xc4c06d29, 0x3e166391,
- 0xe0000000, 0x3fb16536, 0xc1d0c4b8, 0x3e2d46f5, 0x20000000, 0x3fb253f6, 0x2df1f6d3, 0x3e2e1428,
- 0x90000000, 0x3fb341d7, 0x424a660d, 0x3e186f47, 0xb0000000, 0x3fb42edc, 0xe077753e, 0x3e2d4c8d,
- 0x30000000, 0x3fb51b07, 0x7ed24f1c, 0x3e2e0c30, 0xa0000000, 0x3fb60658, 0x8763bdd3, 0x3e226ea1,
- 0x80000000, 0x3fb6f0d2, 0x9737c933, 0x3e25cad6, 0x60000000, 0x3fb7da76, 0x99088901, 0x3e2af625,
- 0xd0000000, 0x3fb8c345, 0x83d6b2d0, 0x3e18c66c, 0x40000000, 0x3fb9ab42, 0xb36fb30f, 0x3e1880ce,
- 0x30000000, 0x3fba926d, 0xc6ca17a4, 0x3e2495aa, 0x20000000, 0x3fbb78c8, 0x4210878c, 0x3e2761db,
- 0x80000000, 0x3fbc5e54, 0x862bac2f, 0x3e2eb78e, 0xd0000000, 0x3fbd4313, 0x75790dd9, 0x3e19b2cd,
- 0x60000000, 0x3fbe2707, 0xcbd3d50f, 0x3e2c55e5, 0xc0000000, 0x3fbf0a30, 0x617cc971, 0x3db162a6,
- 0x30000000, 0x3fbfec91, 0xaaa2e519, 0x3dfdbeab, 0x10000000, 0x3fc06715, 0x7150c647, 0x3e1652cb,
- 0x70000000, 0x3fc0d77e, 0xb2cd2ee2, 0x3e39a11c, 0x80000000, 0x3fc14785, 0xb1a28813, 0x3e219d0a,
- 0xd0000000, 0x3fc1b72a, 0x80a41811, 0x3e24bd9e, 0x10000000, 0x3fc2266f, 0x96faa3df, 0x3e3214b5,
- 0xf0000000, 0x3fc29552, 0x46980bb8, 0x3e303fea, 0x10000000, 0x3fc303d7, 0xa5fd28c7, 0x3e31c8ff,
- 0x20000000, 0x3fc371fc, 0x3bcd96c5, 0x3dce8f74, 0xb0000000, 0x3fc3dfc2, 0x395315c6, 0x3dfd98c5,
- 0x60000000, 0x3fc44d2b, 0x3ccfa7b2, 0x3e3996fa, 0xf0000000, 0x3fc4ba36, 0x2ad13037, 0x3e1cd2af,
- 0xe0000000, 0x3fc526e5, 0xbd17200e, 0x3e1d0da1, 0xd0000000, 0x3fc59338, 0x0ba68b75, 0x3e333041,
- 0x70000000, 0x3fc5ff30, 0x790e7c41, 0x3df4f27a, 0x40000000, 0x3fc66acd, 0x86f6ff1b, 0x3e13956a,
- 0xe0000000, 0x3fc6d60f, 0x723551d9, 0x3e2c6748, 0xf0000000, 0x3fc740f8, 0x9326cdfc, 0x3e2500de,
- 0x00000000, 0x3fc7ab89, 0x48df1b59, 0x3e1086c8, 0xa0000000, 0x3fc815c0, 0xad6836ff, 0x3e04357e,
- 0x60000000, 0x3fc87fa0, 0x42408024, 0x3e248324, 0xd0000000, 0x3fc8e928, 0x8154b13d, 0x3e3d10da,
- 0x90000000, 0x3fc9525a, 0x68ec8260, 0x3e39e8ad, 0x20000000, 0x3fc9bb36, 0x06abaf18, 0x3e3cfbf7,
- 0x10000000, 0x3fca23bc, 0xc6326e23, 0x3e3fc56a, 0xf0000000, 0x3fca8bec, 0x3185cf21, 0x3e39105e,
- 0x40000000, 0x3fcaf3c9, 0xe5b19cc0, 0x3e3d017f, 0x90000000, 0x3fcb5b51, 0x48dd13fe, 0x3e3d1f6b,
- 0x70000000, 0x3fcbc286, 0x58a7e73a, 0x3e20b633, 0x50000000, 0x3fcc2968, 0x028c211c, 0x3e263063,
- 0xc0000000, 0x3fcc8ff7, 0x86b09760, 0x3e2e6a68, 0x40000000, 0x3fccf635, 0xb891cd03, 0x3e3c138b,
- 0x60000000, 0x3fcd5c21, 0x22b7221a, 0x3e369f77, 0xa0000000, 0x3fcdc1bc, 0xac1a628c, 0x3df57d8f,
- 0x60000000, 0x3fce2707, 0xcbd3d50f, 0x3e3c55e5, 0x50000000, 0x3fce8c02, 0xff48fe2e, 0x3e1552d2,
- 0xc0000000, 0x3fcef0ad, 0x6ca431bc, 0x3e37b8b2, 0x50000000, 0x3fcf550a, 0xdc1c5f6d, 0x3e292dec,
- 0x60000000, 0x3fcfb918, 0x551aaa8c, 0x3e3abc7c, 0x40000000, 0x3fd00e6c, 0x731a354b, 0x3e36b540,
- 0x90000000, 0x3fd04025, 0x036b89ef, 0x3e32d341, 0x50000000, 0x3fd071b8, 0x1a3a2e0f, 0x3e4f9ab2,
- 0xe0000000, 0x3fd0a324, 0x1afb9fbd, 0x3e239c87, 0x50000000, 0x3fd0d46b, 0x2c81f640, 0x3e3e6add,
- 0xf0000000, 0x3fd1058b, 0xaa313f41, 0x3e435c95, 0x00000000, 0x3fd13687, 0x82f6cc53, 0x3e249d45,
- 0xa0000000, 0x3fd1675c, 0x1c07398f, 0x3e47574c, 0x20000000, 0x3fd1980d, 0xdece9e8d, 0x3e4ba846,
- 0xc0000000, 0x3fd1c898, 0xafbc68e7, 0x3e16999f, 0x90000000, 0x3fd1f8ff, 0xe51b0103, 0x3e4c9145,
- 0xf0000000, 0x3fd22941, 0xcb44850a, 0x3e479ef2, 0x10000000, 0x3fd25960, 0x3de11275, 0x3e0beec7,
- 0x10000000, 0x3fd2895a, 0x1af5a498, 0x3e2ef435, 0x30000000, 0x3fd2b930, 0x493b4a50, 0x3e45713a,
- 0xb0000000, 0x3fd2e8e2, 0x61385992, 0x3e45c23a, 0xc0000000, 0x3fd31871, 0x09f57299, 0x3e42a883,
- 0x90000000, 0x3fd347dd, 0xa9ac8ace, 0x3e4530fa, 0x60000000, 0x3fd37726, 0xd792a758, 0x3e25fec2,
- 0x50000000, 0x3fd3a64c, 0xa71cbcd7, 0x3e35a517, 0xa0000000, 0x3fd3d54f, 0x3e1cd9a3, 0x3e3707dc,
- 0x80000000, 0x3fd40430, 0x8ef43049, 0x3e3a1a9f, 0x20000000, 0x3fd432ef, 0x276b3674, 0x3e4409d0,
- 0xc0000000, 0x3fd4618b, 0x13e85bd9, 0x3e20e2f6, 0x80000000, 0x3fd49006, 0x33001e5f, 0x3df00274,
- 0x90000000, 0x3fd4be5f, 0x836d3265, 0x3e35dde2, 0x30000000, 0x3fd4ec97, 0x4d7aaf04, 0x3e230013,
- 0x80000000, 0x3fd51aad, 0xb42724f5, 0x3e3cb7e0, 0xc0000000, 0x3fd548a2, 0x167e6308, 0x3e2d6e93,
- 0x10000000, 0x3fd57677, 0xb1526adb, 0x3e3d1569, 0xb0000000, 0x3fd5a42a, 0x338a1a41, 0x3e0e99fc,
- 0xb0000000, 0x3fd5d1bd, 0x94a11b1c, 0x3e4eb013, 0x70000000, 0x3fd5ff30, 0x790e7c41, 0x3e04f27a,
- 0xf0000000, 0x3fd62c82, 0xa97b7af9, 0x3e25ce3c, 0x70000000, 0x3fd659b5, 0x940ed857, 0x3e281f0f,
- 0x10000000, 0x3fd686c8, 0x5d88857c, 0x3e4d3629, 0x20000000, 0x3fd6b3bb, 0xec4af526, 0x3e21aca1,
- 0xa0000000, 0x3fd6e08e, 0xc7182726, 0x3e445743, 0xe0000000, 0x3fd70d42, 0xaead337e, 0x3e23c491,
- 0xf0000000, 0x3fd739d7, 0x1a738931, 0x3e3aef40, 0x10000000, 0x3fd7664e, 0x76092a29, 0x3e21cede,
- 0x50000000, 0x3fd792a5, 0x44f82bb4, 0x3e4fba8f, 0x00000000, 0x3fd7bede, 0x7f3c3e1a, 0x3e446f5f,
- 0x30000000, 0x3fd7eaf8, 0x86c9674b, 0x3e47055f, 0x10000000, 0x3fd816f4, 0x2b6b6e1a, 0x3e4b41a9,
- 0xd0000000, 0x3fd842d1, 0x2e927628, 0x3e443d16, 0x90000000, 0x3fd86e91, 0x4013f9b1, 0x3e446617,
- 0x80000000, 0x3fd89a33, 0x6ad69c62, 0x3e3b0509, 0xc0000000, 0x3fd8c5b7, 0x150faa58, 0x3e40b169,
- 0x80000000, 0x3fd8f11e, 0x1df85da7, 0x3e3cd98b, 0xe0000000, 0x3fd91c67, 0x7b0f8fa8, 0x3e468b50,
- 0x10000000, 0x3fd94794, 0xf57499ba, 0x3e48422d, 0x40000000, 0x3fd972a3, 0x86970274, 0x3e113515,
- 0x80000000, 0x3fd99d95, 0xacba92ee, 0x3e117e08, 0x00000000, 0x3fd9c86b, 0x14dd0229, 0x3e26e043,
- 0xe0000000, 0x3fd9f323, 0x97e56d1a, 0x3e497f30, 0x60000000, 0x3fda1dc0, 0x55901286, 0x3e3356e6,
- 0x90000000, 0x3fda4840, 0x457f94d6, 0x3e0cb761, 0x90000000, 0x3fda72a4, 0xa85a9dac, 0x3e39af67,
- 0x90000000, 0x3fda9cec, 0x931a909f, 0x3e453410, 0xc0000000, 0x3fdac718, 0x206058f5, 0x3e22c587,
- 0x30000000, 0x3fdaf129, 0x58899c22, 0x3e223bc3, 0x00000000, 0x3fdb1b1e, 0xb6d223cb, 0x3e4d7bf8,
- 0x70000000, 0x3fdb44f7, 0xc5197ddb, 0x3e47991e, 0x90000000, 0x3fdb6eb5, 0xbb3a9219, 0x3e4a79e6,
- 0x90000000, 0x3fdb9858, 0xed663ec5, 0x3e3a4c43, 0x80000000, 0x3fdbc1e0, 0x1484f438, 0x3e461b5a,
- 0x90000000, 0x3fdbeb4d, 0xf7ef0c3a, 0x3e4b4e36, 0xf0000000, 0x3fdc149f, 0x6acd0d1b, 0x3e115f02,
- 0xa0000000, 0x3fdc3dd7, 0x35cecf05, 0x3e3f36b5, 0xe0000000, 0x3fdc66f4, 0xbf3eb5c6, 0x3e2ffb7f,
- 0xc0000000, 0x3fdc8ff7, 0x86b09760, 0x3e3e6a68, 0x70000000, 0x3fdcb8e0, 0x27f5bbc3, 0x3e3135eb,
- 0x00000000, 0x3fdce1af, 0xd6f6fa57, 0x3e470be7, 0xa0000000, 0x3fdd0a63, 0xc84ab338, 0x3e4ce43c,
- 0x70000000, 0x3fdd32fe, 0xaac3bd91, 0x3e4c01d7, 0x90000000, 0x3fdd5b7f, 0x07961060, 0x3e45c58d,
- 0x20000000, 0x3fdd83e7, 0xf941456e, 0x3e3628bc, 0x30000000, 0x3fddac35, 0xa8461cd2, 0x3e4c58b2,
- 0x00000000, 0x3fddd46a, 0x82fb989a, 0x3e330712, 0x90000000, 0x3fddfc85, 0x6a80f09c, 0x3e420dab,
- 0x10000000, 0x3fde2488, 0x4c397b1e, 0x3e44f8d8, 0xa0000000, 0x3fde4c71, 0x08599e48, 0x3e40d0ee,
- 0x60000000, 0x3fde7442, 0x7e37da36, 0x3e1d6878, 0x60000000, 0x3fde9bfa, 0xd591bafc, 0x3e366187,
- 0xd0000000, 0x3fdec399, 0x00bae772, 0x3e223466, 0xc0000000, 0x3fdeeb20, 0xd0d61b8e, 0x3e390377,
- 0x50000000, 0x3fdf128f, 0xd966b907, 0x3e4f5e0d, 0xb0000000, 0x3fdf39e5, 0xb79a00e2, 0x3e49023c,
- 0xf0000000, 0x3fdf6123, 0x58c28ad8, 0x3e44e051, 0x30000000, 0x3fdf884a, 0x08b18ae4, 0x3e3bfa7b,
- 0x80000000, 0x3fdfaf58, 0x3db35f67, 0x3e4ef1e6, 0x20000000, 0x3fdfd64f, 0x39493d4f, 0x3e0ec2ae,
- 0x00000000, 0x3fdffd2e, 0x30ab2fa0, 0x3e40afe9, 0xb0000000, 0x3fe011fa, 0xa1810dd4, 0x3e225ff8,
- 0xa0000000, 0x3fe02552, 0xfb1a71a5, 0x3e469743, 0xe0000000, 0x3fe0389e, 0x76785571, 0x3e5f9cc6,
- 0x90000000, 0x3fe04bdf, 0xa4cbf982, 0x3e5b524d, 0xb0000000, 0x3fe05f14, 0x381535b8, 0x3e5a4c8b,
- 0x50000000, 0x3fe0723e, 0x809caf2c, 0x3e5839be, 0x80000000, 0x3fe0855c, 0x1cb82c13, 0x3e50968a,
- 0x40000000, 0x3fe0986f, 0x41723fb5, 0x3e5eae6a, 0xb0000000, 0x3fe0ab76, 0xa380a4db, 0x3e5d9c29,
- 0xe0000000, 0x3fe0be72, 0x0ada625e, 0x3e4094aa, 0xc0000000, 0x3fe0d163, 0x6fc108ca, 0x3e5973ad,
- 0x80000000, 0x3fe0e449, 0x2fdbab97, 0x3e474732, 0x10000000, 0x3fe0f724, 0xfa9d4221, 0x3e593692,
- 0x90000000, 0x3fe109f3, 0x2dfbc7d9, 0x3e5c5a99, 0x10000000, 0x3fe11cb8, 0xe102387a, 0x3e4e1f33,
- 0x90000000, 0x3fe12f71, 0xf14c048c, 0x3e464fbe, 0x20000000, 0x3fe14220, 0x13ca5e3b, 0x3e4490f5,
- 0xd0000000, 0x3fe154c3, 0x4d4c799d, 0x3e37a6af, 0xa0000000, 0x3fe1675c, 0x1c07398f, 0x3e57574c,
- 0xb0000000, 0x3fe179ea, 0x417f8c1c, 0x3e57b133, 0x00000000, 0x3fe18c6e, 0x0c176514, 0x3e5feb9e,
- 0xb0000000, 0x3fe19ee6, 0xbb3172f7, 0x3e419f25, 0xb0000000, 0x3fe1b154, 0x7bbfb852, 0x3e45f68a,
- 0x10000000, 0x3fe1c3b8, 0x497929f1, 0x3e5ee278, 0xf0000000, 0x3fe1d610, 0x06109d58, 0x3e5ccee0,
- 0x50000000, 0x3fe1e85f, 0xa07bd8b3, 0x3e5ce081, 0x40000000, 0x3fe1faa3, 0x981817b8, 0x3e570e12,
- 0xd0000000, 0x3fe20cdc, 0xd93503d0, 0x3e292ab6, 0xf0000000, 0x3fe21f0b, 0xd7c3b61e, 0x3e58cb7d,
- 0xd0000000, 0x3fe23130, 0x0a0b78da, 0x3e4efafd, 0x60000000, 0x3fe2434b, 0x67c4288e, 0x3e5e9072,
- 0xc0000000, 0x3fe2555b, 0x96780875, 0x3e5d31ef, 0x00000000, 0x3fe26762, 0xfcd2ad50, 0x3e23430d,
- 0x10000000, 0x3fe2795e, 0xd75bc1f9, 0x3e344d88, 0x00000000, 0x3fe28b50, 0x055e04fc, 0x3e5bec0f,
- 0xf0000000, 0x3fe29d37, 0x1590b9ad, 0x3e5d8561, 0xf0000000, 0x3fe2af15, 0x8e583229, 0x3df32056,
- 0xe0000000, 0x3fe2c0e9, 0x1772f538, 0x3e5a891d, 0x00000000, 0x3fe2d2b4, 0xdabba74d, 0x3e22edc9,
- 0x30000000, 0x3fe2e474, 0xa1015086, 0x3e4b9009, 0x90000000, 0x3fe2f62a, 0x8c5b1a19, 0x3e52a12a,
- 0x30000000, 0x3fe307d7, 0xf0fdac85, 0x3e3a7885, 0x00000000, 0x3fe3197a, 0xd43ac691, 0x3e5f4ffc,
- 0x30000000, 0x3fe32b13, 0xe2640aad, 0x3e52243a, 0xb0000000, 0x3fe33ca2, 0x299035d3, 0x3e546513,
- 0x90000000, 0x3fe34e28, 0xa62dd725, 0x3e5b39c3, 0xe0000000, 0x3fe35fa4, 0x40049f51, 0x3e5ba6dd,
- 0xb0000000, 0x3fe37117, 0xd7177409, 0x3e451d1e, 0xf0000000, 0x3fe38280, 0xfd7f5216, 0x3e5cb0f2,
- 0xd0000000, 0x3fe393e0, 0xcd4e2213, 0x3e3ab150, 0x30000000, 0x3fe3a537, 0xf3193844, 0x3e5cfd7b,
- 0x40000000, 0x3fe3b684, 0x455f1dbd, 0x3e53fff8, 0xf0000000, 0x3fe3c7c7, 0x0b905fc9, 0x3e5fee64,
- 0x60000000, 0x3fe3d902, 0xf548084c, 0x3e54e2ad, 0x90000000, 0x3fe3ea33, 0xdc1ecdd2, 0x3e3b597a,
- 0x80000000, 0x3fe3fb5b, 0x096d3a75, 0x3e4345bd, 0x40000000, 0x3fe40c7a, 0xd2453c8b, 0x3e5101b9,
- 0xe0000000, 0x3fe41d8f, 0x5cc8c979, 0x3e508ce5, 0x60000000, 0x3fe42e9c, 0x7e595f71, 0x3e5bbf01,
- 0xe0000000, 0x3fe43f9f, 0x3bd393dc, 0x3e37ce73, 0x50000000, 0x3fe4509a, 0xa503f8a1, 0x3e233bb0,
- 0xc0000000, 0x3fe4618b, 0x13e85bd9, 0x3e30e2f6, 0x30000000, 0x3fe47274, 0x5a635b3c, 0x3e5e6755,
- 0xd0000000, 0x3fe48353, 0xf73d5e8b, 0x3e2ea88d, 0x80000000, 0x3fe4942a, 0x3bda18a8, 0x3e3d17e0,
- 0x50000000, 0x3fe4a4f8, 0x76044f7e, 0x3e5b607d, 0x60000000, 0x3fe4b5bd, 0xe71bc2fc, 0x3e52adc4,
- 0xa0000000, 0x3fe4c679, 0x7362d1d9, 0x3e5f99dc, 0x30000000, 0x3fe4d72d, 0x008e6a6a, 0x3e5473fa,
- 0x10000000, 0x3fe4e7d8, 0x09cb0985, 0x3e2b75bb, 0x30000000, 0x3fe4f87a, 0xd10b9aba, 0x3e5ea04d,
- 0xc0000000, 0x3fe50913, 0xd6979674, 0x3e5802d0, 0xc0000000, 0x3fe519a4, 0xccd99094, 0x3e174688,
- 0x20000000, 0x3fe52a2d, 0xabb9df22, 0x3e496f16, 0x00000000, 0x3fe53aad, 0xf2aa374f, 0x3e46e66d,
- 0x60000000, 0x3fe54b24, 0x5ea4550a, 0x3e4e6652, 0x50000000, 0x3fe55b93, 0x34f20cbd, 0x3e42d02f,
- 0xd0000000, 0x3fe56bf9, 0x65047188, 0x3e46cfce, 0xf0000000, 0x3fe57c57, 0x842d58b8, 0x3e39b78c,
- 0xb0000000, 0x3fe58cad, 0x24c24bc9, 0x3e4735e6, 0x20000000, 0x3fe59cfb, 0xf7dd1adf, 0x3e47eba1,
- 0x40000000, 0x3fe5ad40, 0x59f65355, 0x3e586b3e, 0x30000000, 0x3fe5bd7d, 0x637f1b4d, 0x3e1ce38e,
- 0xd0000000, 0x3fe5cdb1, 0xc919edc7, 0x3e58d82e, 0x50000000, 0x3fe5ddde, 0x8ddcfa37, 0x3e4c5264,
- 0xa0000000, 0x3fe5ee02, 0xeae1ac12, 0x3e52482c, 0xd0000000, 0x3fe5fe1e, 0x311aba4f, 0x3e55a312,
- 0xf0000000, 0x3fe60e32, 0x6329f225, 0x3e411e23, 0xf0000000, 0x3fe61e3e, 0xcd2f246c, 0x3e5b48c8,
- 0xe0000000, 0x3fe62e42, 0xef35793c, 0x3e6efa39, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x3fffe000, 0xe01fe020, 0x3effe01f,
- 0x00000000, 0x3fffc000, 0x01fc07f0, 0x3f1fc07f, 0x00000000, 0x3fffa000, 0x1fa11caa, 0x3f31caa0,
- 0x00000000, 0x3fff8000, 0x1f81f820, 0x3f3f81f8, 0x00000000, 0x3fff6000, 0x06ddaba6, 0x3f488565,
- 0x00000000, 0x3fff4000, 0x2909c560, 0x3f519679, 0x00000000, 0x3fff2000, 0x8c2ad433, 0x3f57d910,
- 0x00000000, 0x3fff0000, 0xf07c1f08, 0x3f5f07c1, 0x00000000, 0x3ffee000, 0x8b1c03dd, 0x3f638ff0,
- 0x00000000, 0x3ffec000, 0x03d980f6, 0x3f680f66, 0x00000000, 0x3ffea000, 0x7403d5d0, 0x3f6d00f5,
- 0x00000000, 0x3ffe9000, 0x0b7672a0, 0x3f331abf, 0x00000000, 0x3ffe7000, 0x5d43919b, 0x3f506a96,
- 0x00000000, 0x3ffe5000, 0x0795ceb2, 0x3f5ceb24, 0x00000000, 0x3ffe3000, 0xb834e67f, 0x3f6522f3,
- 0x00000000, 0x3ffe1000, 0x3c3c3c3c, 0x3f6c3c3c, 0x00000000, 0x3ffe0000, 0x1e01e01e, 0x3f3e01e0,
- 0x00000000, 0x3ffde000, 0xe21a291c, 0x3f575b8f, 0x00000000, 0x3ffdc000, 0x403b9404, 0x3f6403b9,
- 0x00000000, 0x3ffda000, 0x7303b5cc, 0x3f6cc0ed, 0x00000000, 0x3ffd9000, 0xf3fc4da2, 0x3f479118,
- 0x00000000, 0x3ffd7000, 0xe0b0ce46, 0x3f5ed952, 0x00000000, 0x3ffd5000, 0xeae56404, 0x3f695900,
- 0x00000000, 0x3ffd4000, 0x1d41d41d, 0x3f3d41d4, 0x00000000, 0x3ffd2000, 0xf16c69ae, 0x3f5cb28f,
- 0x00000000, 0x3ffd0000, 0xdd80e866, 0x3f696b1e, 0x00000000, 0x3ffcf000, 0x25fe30d9, 0x3f4372e2,
- 0x00000000, 0x3ffcd000, 0x073615a2, 0x3f60ad12, 0x00000000, 0x3ffcb000, 0x0397cdb3, 0x3f6cdb2c,
- 0x00000000, 0x3ffca000, 0x7b864407, 0x3f52cc15, 0x00000000, 0x3ffc8000, 0xf7148404, 0x3f664cb5,
- 0x00000000, 0x3ffc7000, 0x1c71c71c, 0x3f3c71c7, 0x00000000, 0x3ffc5000, 0x1a930b84, 0x3f6129a2,
- 0x00000000, 0x3ffc3000, 0x87f1e038, 0x3f6f1e03, 0x00000000, 0x3ffc2000, 0xba80709b, 0x3f5ad4e4,
- 0x00000000, 0x3ffc0000, 0x0381c0e0, 0x3f6c0e07, 0x00000000, 0x3ffbf000, 0x1a362bb0, 0x3f560fba,
- 0x00000000, 0x3ffbd000, 0x280dee96, 0x3f6a5713, 0x00000000, 0x3ffbc000, 0x20f9ece9, 0x3f53f596,
- 0x00000000, 0x3ffba000, 0x83759f23, 0x3f69f229, 0x00000000, 0x3ffb9000, 0x63fc8d5c, 0x3f5478ac,
- 0x00000000, 0x3ffb7000, 0xb4671656, 0x3f6ad87b, 0x00000000, 0x3ffb6000, 0xfbb8148c, 0x3f578b8e,
- 0x00000000, 0x3ffb4000, 0xd0369d03, 0x3f6d0369, 0x00000000, 0x3ffb3000, 0x601b3748, 0x3f5d212b,
- 0x00000000, 0x3ffb2000, 0x406c80d9, 0x3f0b2036, 0x00000000, 0x3ffb0000, 0xb24547d1, 0x3f629663,
- 0x00000000, 0x3ffaf000, 0x0d79435e, 0x3f4435e5, 0x00000000, 0x3ffad000, 0x2920bc03, 0x3f67d0ff,
- 0x00000000, 0x3ffac000, 0x15c06b16, 0x3f55c06b, 0x00000000, 0x3ffaa000, 0x0fd7f954, 0x3f6e3a5f,
- 0x00000000, 0x3ffa9000, 0xd4c77b03, 0x3f61dec0, 0x00000000, 0x3ffa8000, 0x870ac52e, 0x3f473289,
- 0x00000000, 0x3ffa6000, 0xa034da03, 0x3f6a034d, 0x00000000, 0x3ffa5000, 0xa2292856, 0x3f5d041d,
- 0x00000000, 0x3ffa4000, 0x1a41a41a, 0x3f3a41a4, 0x00000000, 0x3ffa2000, 0x8a39409d, 0x3f68550f,
- 0x00000000, 0x3ffa1000, 0xe92c0686, 0x3f5b4fe5, 0x00000000, 0x3ffa0000, 0x1a01a01a, 0x3f3a01a0,
- 0x00000000, 0x3ff9e000, 0x2067b23a, 0x3f691d2a, 0x00000000, 0x3ff9d000, 0xada0b4e5, 0x3f5e7c5d,
- 0x00000000, 0x3ff9c000, 0x25080ce1, 0x3f468a77, 0x00000000, 0x3ff9a000, 0xaa21b490, 0x3f6c49d4,
- 0x00000000, 0x3ff99000, 0x33333333, 0x3f633333, 0x00000000, 0x3ff98000, 0x3b03fccf, 0x3f54bc36,
- 0x00000000, 0x3ff97000, 0x970e4f81, 0x3f2c9f01, 0x00000000, 0x3ff95000, 0xc6ef5b25, 0x3f697617,
- 0x00000000, 0x3ff94000, 0xadd3c0ca, 0x3f6161f9, 0x00000000, 0x3ff93000, 0x6cb39806, 0x3f5319fe,
- 0x00000000, 0x3ff92000, 0x1c451ab3, 0x3f2f693a, 0x00000000, 0x3ff90000, 0x0321a9e2, 0x3f6a9e24,
- 0x00000000, 0x3ff8f000, 0x3831f383, 0x3f63831f, 0x00000000, 0x3ff8e000, 0xc4dcfc1c, 0x3f5949eb,
- 0x00000000, 0x3ff8d000, 0x80c6980c, 0x3f480c69, 0x00000000, 0x3ff8b000, 0xc5fe7403, 0x3f6f9d00,
- 0x00000000, 0x3ff8a000, 0xd7e75347, 0x3f69721e, 0x00000000, 0x3ff89000, 0x0313381f, 0x3f6381ec,
- 0x00000000, 0x3ff88000, 0xaec12653, 0x3f5b97c2, 0x00000000, 0x3ff87000, 0x024ae3ba, 0x3f509ef3,
- 0x00000000, 0x3ff86000, 0x18618618, 0x3f386186, 0x00000000, 0x3ff84000, 0xf00c2780, 0x3f6e0184,
- 0x00000000, 0x3ff83000, 0x657dba52, 0x3f692ef5, 0x00000000, 0x3ff82000, 0x05494030, 0x3f649403,
- 0x00000000, 0x3ff81000, 0x30303030, 0x3f603030, 0x00000000, 0x3ff80000, 0x80601806, 0x3f580601,
- 0x00000000, 0x3ff7f000, 0x05fd017f, 0x3f5017f4, 0x00000000, 0x3ff7e000, 0xd278e8dd, 0x3f412a8a,
- 0x00000000, 0x3ff7d000, 0x417d05f4, 0x3f17d05f, 0x00000000, 0x3ff7b000, 0x5c02f7d6, 0x3f6d6724,
- 0x00000000, 0x3ff7a000, 0xc1d986a9, 0x3f6a4411, 0x00000000, 0x3ff79000, 0x6c7316df, 0x3f6754d7,
- 0x00000000, 0x3ff78000, 0xf149902f, 0x3f649902, 0x00000000, 0x3ff77000, 0x358c1a68, 0x3f621023,
- 0x00000000, 0x3ff76000, 0xd2a6c406, 0x3f5f7390, 0x00000000, 0x3ff75000, 0x05d5b2b1, 0x3f5b2b08,
- 0x00000000, 0x3ff74000, 0x745d1746, 0x3f5745d1, 0x00000000, 0x3ff73000, 0x07fa32c4, 0x3f53c315,
- 0x00000000, 0x3ff72000, 0x1b7af017, 0x3f50a1fd, 0x00000000, 0x3ff71000, 0xe3e0453a, 0x3f4bc36c,
- 0x00000000, 0x3ff70000, 0x5c0b8170, 0x3f4702e0, 0x00000000, 0x3ff6f000, 0x9300b793, 0x3f4300b7,
- 0x00000000, 0x3ff6e000, 0x337c6cb1, 0x3f3f76b4, 0x00000000, 0x3ff6d000, 0x1c860fb0, 0x3f3a6268,
- 0x00000000, 0x3ff6c000, 0x16c16c17, 0x3f36c16c, 0x00000000, 0x3ff6b000, 0x31a3cfc7, 0x3f3490aa,
- 0x00000000, 0x3ff6a000, 0x3729043e, 0x3f33cd15, 0x00000000, 0x3ff69000, 0x8d0bfd2e, 0x3f3473a8,
- 0x00000000, 0x3ff68000, 0x16816817, 0x3f368168, 0x00000000, 0x3ff67000, 0x16719f36, 0x3f39f360,
- 0x00000000, 0x3ff66000, 0x122f9016, 0x3f3ec6a5, 0x00000000, 0x3ff65000, 0xda5519cf, 0x3f427c29,
- 0x00000000, 0x3ff64000, 0x590b2164, 0x3f4642c8, 0x00000000, 0x3ff63000, 0x5606f00b, 0x3f4ab5c4,
- 0x00000000, 0x3ff62000, 0x0b11fd3c, 0x3f4fd3b8, 0x00000000, 0x3ff61000, 0xc6ba4eaa, 0x3f52cda0,
- 0x00000000, 0x3ff60000, 0x60581606, 0x3f560581, 0x00000000, 0x3ff5f000, 0xa4b7ef87, 0x3f5990d0,
- 0x00000000, 0x3ff5e000, 0x40579d6f, 0x3f5d6ee3, 0x00000000, 0x3ff5d000, 0xd9c54a69, 0x3f60cf87,
- 0x00000000, 0x3ff5c000, 0x2620ae4c, 0x3f631057, 0x00000000, 0x3ff5b000, 0x8ff522a2, 0x3f65798c,
- 0x00000000, 0x3ff5a000, 0x02b580ad, 0x3f680ad6, 0x00000000, 0x3ff59000, 0x4799546f, 0x3f6ac3e2,
- 0x00000000, 0x3ff58000, 0x02b1da46, 0x3f6da461, 0x00000000, 0x3ff58000, 0x01580560, 0x3f158056,
- 0x00000000, 0x3ff57000, 0x06b39a23, 0x3f3ed3c5, 0x00000000, 0x3ff56000, 0xe2970f60, 0x3f4cbdd3,
- 0x00000000, 0x3ff55000, 0x55555555, 0x3f555555, 0x00000000, 0x3ff54000, 0xee0bf805, 0x3f5c979a,
- 0x00000000, 0x3ff53000, 0xe81fd58e, 0x3f621291, 0x00000000, 0x3ff52000, 0x500a9580, 0x3f65fead,
- 0x00000000, 0x3ff51000, 0xc5f02a3a, 0x3f6a0fd5, 0x00000000, 0x3ff50000, 0x23898adc, 0x3f6e45c2,
- 0x00000000, 0x3ff50000, 0x15015015, 0x3f350150, 0x00000000, 0x3ff4f000, 0xea64d422, 0x3f4c7b16,
- 0x00000000, 0x3ff4e000, 0xbc14e5e1, 0x3f57829c, 0x00000000, 0x3ff4d000, 0xb8589720, 0x3f60877d,
- 0x00000000, 0x3ff4c000, 0x4b5edcea, 0x3f65710e, 0x00000000, 0x3ff4b000, 0x4d1fc1c8, 0x3f6a7dbb,
- 0x00000000, 0x3ff4a000, 0xa57eb503, 0x3f6fad40, 0x00000000, 0x3ff4a000, 0xb00a5140, 0x3f43fd6b,
- 0x00000000, 0x3ff49000, 0xcb419ba9, 0x3f54e78e, 0x00000000, 0x3ff48000, 0x029100a4, 0x3f600a44,
- 0x00000000, 0x3ff47000, 0x5c28f5c3, 0x3f65c28f, 0x00000000, 0x3ff46000, 0xb2c0cc4a, 0x3f6b9c68,
- 0x00000000, 0x3ff46000, 0xb9f34381, 0x3f2978fe, 0x00000000, 0x3ff45000, 0x3bb6500a, 0x3f4ecf16,
- 0x00000000, 0x3ff44000, 0x8b67ebb9, 0x3f5be195, 0x00000000, 0x3ff43000, 0x57dc9a3b, 0x3f644e61,
- 0x00000000, 0x3ff42000, 0xaa3f0ddf, 0x3f6acc4b, 0x00000000, 0x3ff42000, 0xcb2a247b, 0x3f26a4cb,
- 0x00000000, 0x3ff41000, 0x50505050, 0x3f505050, 0x00000000, 0x3ff40000, 0x39959819, 0x3f5e0b44,
- 0x00000000, 0x3ff3f000, 0x6027f602, 0x3f66027f, 0x00000000, 0x3ff3e000, 0x4b5e0db4, 0x3f6d1e85,
- 0x00000000, 0x3ff3e000, 0x254813e2, 0x3f4165e7, 0x00000000, 0x3ff3d000, 0xa9d716ef, 0x3f576646,
- 0x00000000, 0x3ff3c000, 0xf757ce88, 0x3f632b48, 0x00000000, 0x3ff3b000, 0x4652a906, 0x3f6ac1b2,
- 0x00000000, 0x3ff3b000, 0x13b13b14, 0x3f33b13b, 0x00000000, 0x3ff3a000, 0xeb208984, 0x3f5490e1,
- 0x00000000, 0x3ff39000, 0x30fec66e, 0x3f623858, 0x00000000, 0x3ff38000, 0xcc111b7e, 0x3f6a45a6,
- 0x00000000, 0x3ff38000, 0x13813814, 0x3f338138, 0x00000000, 0x3ff37000, 0x2517b708, 0x3f556f47,
- 0x00000000, 0x3ff36000, 0xbc0e8f2a, 0x3f631be7, 0x00000000, 0x3ff35000, 0x3e55f044, 0x3f6b9cbf,
- 0x00000000, 0x3ff35000, 0x5bc609a9, 0x3f40e7d9, 0x00000000, 0x3ff34000, 0x804d19e7, 0x3f59e6b3,
- 0x00000000, 0x3ff33000, 0xaf7963c2, 0x3f65c8b6, 0x00000000, 0x3ff32000, 0xd43bf402, 0x3f6eb9da,
- 0x00000000, 0x3ff32000, 0x5885fb37, 0x3f4f1a51, 0x00000000, 0x3ff31000, 0xd3d76c02, 0x3f60eeb1,
- 0x00000000, 0x3ff30000, 0x61a32026, 0x3f6a3202, 0x00000000, 0x3ff30000, 0x40260390, 0x3f3c82ac,
- 0x00000000, 0x3ff2f000, 0x84bda12f, 0x3f5a12f6, 0x00000000, 0x3ff2e000, 0xfda2962c, 0x3f669d43,
- 0x00000000, 0x3ff2e000, 0xc04b8097, 0x3f02e025, 0x00000000, 0x3ff2d000, 0xb542804b, 0x3f542804,
- 0x00000000, 0x3ff2c000, 0x02593f6a, 0x3f63f69b, 0x00000000, 0x3ff2b000, 0xb46e21fa, 0x3f6df31c,
- 0x00000000, 0x3ff2b000, 0x04ad012b, 0x3f5012b4, 0x00000000, 0x3ff2a000, 0xe7820a7f, 0x3f623925,
- 0x00000000, 0x3ff29000, 0xc8253c82, 0x3f6c8253, 0x00000000, 0x3ff29000, 0xc02526e5, 0x3f4b92dd,
- 0x00000000, 0x3ff28000, 0x11602511, 0x3f616025, 0x00000000, 0x3ff27000, 0x439c9adf, 0x3f6bf471,
- 0x00000000, 0x3ff27000, 0x0939a85c, 0x3f4a85c4, 0x00000000, 0x3ff26000, 0xac024d16, 0x3f6166f9,
- 0x00000000, 0x3ff25000, 0x0125e227, 0x3f6c44e1, 0x00000000, 0x3ff25000, 0x8bbd90e5, 0x3f4cebf4,
- 0x00000000, 0x3ff24000, 0x92492492, 0x3f624924, 0x00000000, 0x3ff23000, 0x2ec0b673, 0x3f6d6f2e,
- 0x00000000, 0x3ff23000, 0x6af37c05, 0x3f5159e2, 0x00000000, 0x3ff22000, 0x40245402, 0x3f640245,
- 0x00000000, 0x3ff21000, 0x43f6f024, 0x3f6f6f02, 0x00000000, 0x3ff21000, 0x21579805, 0x3f55e601,
- 0x00000000, 0x3ff20000, 0xcf81b10f, 0x3f668e18, 0x00000000, 0x3ff20000, 0x12012012, 0x3f320120,
- 0x00000000, 0x3ff1f000, 0x047dc11f, 0x3f5c11f7, 0x00000000, 0x3ff1e000, 0xff70985e, 0x3f69e878,
- 0x00000000, 0x3ff1e000, 0xfdc3a219, 0x3f4779d9, 0x00000000, 0x3ff1d000, 0x5c957907, 0x3f61eace,
- 0x00000000, 0x3ff1c000, 0x450239e1, 0x3f6e0d5b, 0x00000000, 0x3ff1c000, 0x73816367, 0x3f548bf0,
- 0x00000000, 0x3ff1b000, 0x8dda5202, 0x3f669480, 0x00000000, 0x3ff1b000, 0x2bae2b21, 0x3f37c67f,
- 0x00000000, 0x3ff1a000, 0x69ee5847, 0x3f5ee584, 0x00000000, 0x3ff19000, 0xc0233c02, 0x3f6c0233,
- 0x00000000, 0x3ff19000, 0x328a7012, 0x3f514e02, 0x00000000, 0x3ff18000, 0x2057b573, 0x3f656107,
- 0x00000000, 0x3ff18000, 0x11811812, 0x3f318118, 0x00000000, 0x3ff17000, 0x6f5a1060, 0x3f5e2864,
- 0x00000000, 0x3ff16000, 0x84e6f1d7, 0x3f6c0d12, 0x00000000, 0x3ff16000, 0xf0c80459, 0x3f523543,
- 0x00000000, 0x3ff15000, 0xea4e1a09, 0x3f663cbe, 0x00000000, 0x3ff15000, 0xdd5c8cb8, 0x3f3b9a3f,
- 0x00000000, 0x3ff14000, 0x159a76d2, 0x3f60be1c, 0x00000000, 0x3ff13000, 0x688e4838, 0x3f6e1d1a,
- 0x00000000, 0x3ff13000, 0xd72044d7, 0x3f572044, 0x00000000, 0x3ff12000, 0xdb81577b, 0x3f691713,
- 0x00000000, 0x3ff12000, 0xe9819b50, 0x3f4ac73a, 0x00000000, 0x3ff11000, 0x4e904cf6, 0x3f646033,
- 0x00000000, 0x3ff11000, 0x11111111, 0x3f311111, 0x00000000, 0x3ff10000, 0x0441fef0, 0x3f5feef8,
- 0x00000000, 0x3ff0f000, 0xfde021fe, 0x3f6de021, 0x00000000, 0x3ff0f000, 0xcc9686a0, 0x3f57b7ea,
- 0x00000000, 0x3ff0e000, 0xcd391fbc, 0x3f69ead7, 0x00000000, 0x3ff0e000, 0x09804390, 0x3f501956,
- 0x00000000, 0x3ff0d000, 0x1e8d2b32, 0x3f664151, 0x00000000, 0x3ff0d000, 0xacf1ce96, 0x3f4222b1,
- 0x00000000, 0x3ff0c000, 0x79b47582, 0x3f62e29f, 0x00000000, 0x3ff0c000, 0x682e11cd, 0x3f24f0d1,
- 0x00000000, 0x3ff0b000, 0x96771e4d, 0x3f5f9bb0, 0x00000000, 0x3ff0a000, 0x5dd96ae2, 0x3f6e5ee4,
- 0x00000000, 0x3ff0a000, 0xa0429a04, 0x3f5a0429, 0x00000000, 0x3ff09000, 0x5f06c021, 0x3f6bb74d,
- 0x00000000, 0x3ff09000, 0x04254fce, 0x3f54fce4, 0x00000000, 0x3ff08000, 0xeacbc402, 0x3f695766,
- 0x00000000, 0x3ff08000, 0x08421084, 0x3f508421, 0x00000000, 0x3ff07000, 0x71d5c338, 0x3f673e53,
- 0x00000000, 0x3ff07000, 0x3fbe3368, 0x3f493052, 0x00000000, 0x3ff06000, 0xf225f6c4, 0x3f656b38,
- 0x00000000, 0x3ff06000, 0x8d4fdf3b, 0x3f426e97, 0x00000000, 0x3ff05000, 0xe4eb0cc6, 0x3f63dd40,
- 0x00000000, 0x3ff05000, 0x73404146, 0x3f397f7d, 0x00000000, 0x3ff04000, 0x2cc98af1, 0x3f629398,
- 0x00000000, 0x3ff04000, 0x10410410, 0x3f304104, 0x00000000, 0x3ff03000, 0x048ff7e4, 0x3f618d6f,
- 0x00000000, 0x3ff03000, 0xebc349de, 0x3f2236a3, 0x00000000, 0x3ff02000, 0xee53d18c, 0x3f60c9f8,
- 0x00000000, 0x3ff02000, 0x81020408, 0x3f102040, 0x00000000, 0x3ff01000, 0xa2f46ea6, 0x3f60486c,
- 0x00000000, 0x3ff01000, 0x10101010, 0x3ef01010, 0x00000000, 0x3ff00000, 0x02010080, 0x3f600804,
- 0x00000000, 0x3ff00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
- 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xc0000000, 0x3ff2cd9f, 0x096a0092, 0x3e513ae6,
- 0x60000000, 0x400d03cf, 0xfb79a640, 0x3e5db70c, 0xe0000000, 0x40240926, 0xb66dc067, 0x3e8c2526,
- 0x00000000, 0x403b4a38, 0x8647f380, 0x3e8b81b1, 0x60000000, 0x40528d01, 0xd1e1eb08, 0x3ebbc1cd,
- 0x28000000, 0x406936d2, 0x1534fb09, 0x3ecd9f20, 0x68000000, 0x40812287, 0x4a4e9954, 0x3edd1c06,
- 0x50000000, 0x409749ea, 0x5d06ea74, 0x3ed4eca6, 0x70000000, 0x40afa715, 0xbcc0ecc5, 0x3f00c259,
- 0xc8000000, 0x40c5829d, 0x47cf9016, 0x3f2b5a66, 0x88000000, 0x40dd3c44, 0xdefb0870, 0x3f09691a,
- 0x50000000, 0x40f3de16, 0xc29cde38, 0x3f53410f, 0x90000000, 0x410b00b5, 0x50b6fb3c, 0x3f46a31a,
- 0x48000000, 0x412259ac, 0x71805c40, 0x3f57defc, 0xa8000000, 0x4138f0cc, 0xd80e0bab, 0x3f9eb49f,
- 0xd0000000, 0x4150f2eb, 0x7bcd5920, 0x3f84fffc, 0x88000000, 0x41670934, 0xb6c63435, 0x3fc03a93,
- 0x08000000, 0x417f4f22, 0xb255fd1c, 0x3fb1940b, 0xf8000000, 0x419546d8, 0x14260b50, 0x3fded26e,
- 0x88000000, 0x41aceb08, 0x1fc9f2a2, 0x3ffb4740, 0xf8000000, 0x41c3a6e1, 0xf55634f1, 0x40267bb3,
- 0xb8000000, 0x41dab5ad, 0xf8194ddc, 0x401c435f, 0x30000000, 0x41f226af, 0x052ba63a, 0x404d8fee,
- 0xb0000000, 0x4208ab7f, 0xdccde3f6, 0x40651d7e, 0x90000000, 0x4220c3d3, 0x44557d1a, 0x40704b16,
- 0x68000000, 0x4236c932, 0xca0a9dc4, 0x4076a6b5, 0xf0000000, 0x424ef822, 0x72249aba, 0x40afd9cc,
- 0x30000000, 0x42650bba, 0x693edab5, 0x40ce58de, 0x40000000, 0x427c9aae, 0x58ac6363, 0x40d8c701,
- 0x08000000, 0x42937047, 0x64f43e20, 0x40e76147, 0x58000000, 0x42aa6b76, 0xb36fc718, 0x4106337d,
- 0xc8000000, 0x42c1f43f, 0xb1f611e2, 0x41212d98, 0x48000000, 0x42d866f3, 0x108b37cc, 0x412392bc,
- 0x28000000, 0x42f0953e, 0xdc3473dc, 0x415ce87b, 0x20000000, 0x430689e2, 0xae99ad14, 0x414bc8d5,
- 0xa0000000, 0x431ea215, 0x6744835c, 0x415d20d7, 0x00000000, 0x3ff00000, 0x00000000, 0x00000000,
- 0x50000000, 0x3ff8b075, 0x04c2bd28, 0x3e3d9f55, 0x08000000, 0x400e18fa, 0xf0a4c9fd, 0x3e67cb66,
- 0x90000000, 0x402422a4, 0x7928e588, 0x3e8f5861, 0x58000000, 0x403b4ee8, 0x00c38d48, 0x3e6bc7d0,
- 0xc8000000, 0x40528d6f, 0x4e329998, 0x3eaf7f9d, 0x78000000, 0x406936e6, 0x64885269, 0x3ec6e6e4,
- 0x48000000, 0x40812289, 0xb946c154, 0x3ecba3a8, 0xa8000000, 0x409749ea, 0x6110d5a4, 0x3ed3f4e7,
- 0x80000000, 0x40afa715, 0x515a3e2b, 0x3f017622, 0xd0000000, 0x40c5829d, 0x528af3d0, 0x3ee4dc4b,
- 0x88000000, 0x40dd3c44, 0x78615e10, 0x3f111562, 0x50000000, 0x40f3de16, 0x0ed821f5, 0x3f535ad5,
- 0x90000000, 0x410b00b5, 0x55f2935c, 0x3f46b610, 0x48000000, 0x412259ac, 0x4a601240, 0x3f57e279,
- 0xa8000000, 0x4138f0cc, 0x5f6aadd3, 0x3f9eb4b4, 0xd0000000, 0x4150f2eb, 0x967b3698, 0x3f85000b,
- 0x88000000, 0x41670934, 0x0fadc092, 0x3fc03a94, 0x08000000, 0x417f4f22, 0xf3bf874c, 0x3fb1940b,
- 0xf8000000, 0x419546d8, 0x1a2a2110, 0x3fded26e, 0x88000000, 0x41aceb08, 0x205796d6, 0x3ffb4740,
- 0xf8000000, 0x41c3a6e1, 0xf55cb85d, 0x40267bb3, 0xb8000000, 0x41dab5ad, 0xf81e18ac, 0x401c435f,
- 0x30000000, 0x41f226af, 0x052bdea4, 0x404d8fee, 0xb0000000, 0x4208ab7f, 0xdccde926, 0x40651d7e,
- 0x90000000, 0x4220c3d3, 0x44557e0e, 0x40704b16, 0x68000000, 0x4236c932, 0xca0a9e1c, 0x4076a6b5,
- 0xf0000000, 0x424ef822, 0x72249abe, 0x40afd9cc, 0x30000000, 0x42650bba, 0x693edab5, 0x40ce58de,
- 0x40000000, 0x427c9aae, 0x58ac6364, 0x40d8c701, 0x08000000, 0x42937047, 0x64f43e20, 0x40e76147,
- 0x58000000, 0x42aa6b76, 0xb36fc718, 0x4106337d, 0xc8000000, 0x42c1f43f, 0xb1f611e2, 0x41212d98,
- 0x48000000, 0x42d866f3, 0x108b37cc, 0x412392bc, 0x28000000, 0x42f0953e, 0xdc3473dc, 0x415ce87b,
- 0x20000000, 0x430689e2, 0xae99ad14, 0x414bc8d5, 0xa0000000, 0x431ea215, 0x6744835c, 0x415d20d7,
- 0x00000000, 0x40000000, 0xe01fe020, 0x3fffe01f, 0x01fc07f0, 0x3fffc07f, 0xaa01fa12, 0x3fffa11c,
- 0x1f81f820, 0x3fff81f8, 0xaca0dbb5, 0x3fff6310, 0x9e4a4271, 0x3fff4465, 0x44230ab5, 0x3fff25f6,
- 0xf07c1f08, 0x3fff07c1, 0xf8458e02, 0x3ffee9c7, 0xb301ecc0, 0x3ffecc07, 0x7aba01eb, 0x3ffeae80,
- 0xabf0b767, 0x3ffe9131, 0xa59750e4, 0x3ffe741a, 0xc901e574, 0x3ffe573a, 0x79dc1a73, 0x3ffe3a91,
- 0x1e1e1e1e, 0x3ffe1e1e, 0x1e01e01e, 0x3ffe01e0, 0xe3f8868a, 0x3ffde5d6, 0xdca01dca, 0x3ffdca01,
- 0x76b981db, 0x3ffdae60, 0x231e7f8a, 0x3ffd92f2, 0x54b82c34, 0x3ffd77b6, 0x807572b2, 0x3ffd5cac,
- 0x1d41d41d, 0x3ffd41d4, 0xa3fc5b1a, 0x3ffd272c, 0x8f6ec074, 0x3ffd0cb5, 0x5c44bfc6, 0x3ffcf26e,
- 0x89039b0b, 0x3ffcd856, 0x9601cbe7, 0x3ffcbe6d, 0x055ee191, 0x3ffca4b3, 0x5afb8a42, 0x3ffc8b26,
- 0x1c71c71c, 0x3ffc71c7, 0xd10d4986, 0x3ffc5894, 0x01c3f8f0, 0x3ffc3f8f, 0x392ea01c, 0x3ffc26b5,
- 0x0381c0e0, 0x3ffc0e07, 0xee868d8b, 0x3ffbf583, 0x899406f7, 0x3ffbdd2b, 0x65883e7b, 0x3ffbc4fd,
- 0x14c1bad0, 0x3ffbacf9, 0x2b18ff23, 0x3ffb951e, 0x3dda338b, 0x3ffb7d6c, 0xe3beee05, 0x3ffb65e2,
- 0xb4e81b4f, 0x3ffb4e81, 0x4ad806ce, 0x3ffb3748, 0x406c80d9, 0x3ffb2036, 0x31d922a4, 0x3ffb094b,
- 0xbca1af28, 0x3ffaf286, 0x7f94905e, 0x3ffadbe8, 0x1ac5701b, 0x3ffac570, 0x2f87ebfd, 0x3ffaaf1d,
- 0x606a63be, 0x3ffa98ef, 0x5130e159, 0x3ffa82e6, 0xa6d01a6d, 0x3ffa6d01, 0x07688a4a, 0x3ffa5741,
- 0x1a41a41a, 0x3ffa41a4, 0x87c51ca0, 0x3ffa2c2a, 0xf97a4b02, 0x3ffa16d3, 0x1a01a01a, 0x3ffa01a0,
- 0x951033d9, 0x3ff9ec8e, 0x176b682d, 0x3ff9d79f, 0x4ee4a102, 0x3ff9c2d1, 0xea5510da, 0x3ff9ae24,
- 0x9999999a, 0x3ff99999, 0x0d8ec0ff, 0x3ff9852f, 0xf80cb872, 0x3ff970e4, 0x0be377ae, 0x3ff95cbb,
- 0xfcd6e9e0, 0x3ff948b0, 0x7f9b2ce6, 0x3ff934c6, 0x49d0e229, 0x3ff920fb, 0x120190d5, 0x3ff90d4f,
- 0x8f9c18fa, 0x3ff8f9c1, 0x7af1373f, 0x3ff8e652, 0x8d3018d3, 0x3ff8d301, 0x8062ff3a, 0x3ff8bfce,
- 0x0f6bf3aa, 0x3ff8acb9, 0xf601899c, 0x3ff899c0, 0xf0abb04a, 0x3ff886e5, 0xbcc092b9, 0x3ff87427,
- 0x18618618, 0x3ff86186, 0xc2780614, 0x3ff84f00, 0x7ab2bedd, 0x3ff83c97, 0x0182a4a0, 0x3ff82a4a,
- 0x18181818, 0x3ff81818, 0x80601806, 0x3ff80601, 0xfd017f40, 0x3ff7f405, 0x515a4f1d, 0x3ff7e225,
- 0x417d05f4, 0x3ff7d05f, 0x922e017c, 0x3ff7beb3, 0x08e0ecc3, 0x3ff7ad22, 0x6bb6398b, 0x3ff79baa,
- 0x8178a4c8, 0x3ff78a4c, 0x119ac60d, 0x3ff77908, 0xe434a9b1, 0x3ff767dc, 0xc201756d, 0x3ff756ca,
- 0x745d1746, 0x3ff745d1, 0xc541fe8d, 0x3ff734f0, 0x7f46debc, 0x3ff72428, 0x6d9c7c09, 0x3ff71378,
- 0x5c0b8170, 0x3ff702e0, 0x16f26017, 0x3ff6f260, 0x6b4337c7, 0x3ff6e1f7, 0x2681c861, 0x3ff6d1a6,
- 0x16c16c17, 0x3ff6c16c, 0x0aa31a3d, 0x3ff6b149, 0xd1537290, 0x3ff6a13c, 0x3a88d0c0, 0x3ff69147,
- 0x16816817, 0x3ff68168, 0x3601671a, 0x3ff6719f, 0x6a5122f9, 0x3ff661ec, 0x853b4aa3, 0x3ff6524f,
- 0x590b2164, 0x3ff642c8, 0xb88ac0de, 0x3ff63356, 0x77016240, 0x3ff623fa, 0x6831ae94, 0x3ff614b3,
- 0x60581606, 0x3ff60581, 0x34292dfc, 0x3ff5f664, 0xb8d015e7, 0x3ff5e75b, 0xc3ece2a5, 0x3ff5d867,
- 0x2b931057, 0x3ff5c988, 0xc647fa91, 0x3ff5babc, 0x6b015ac0, 0x3ff5ac05, 0xf123ccaa, 0x3ff59d61,
- 0x308158ed, 0x3ff58ed2, 0x01580560, 0x3ff58056, 0x3c506b3a, 0x3ff571ed, 0xba7c52e2, 0x3ff56397,
- 0x55555555, 0x3ff55555, 0xe6bb82fe, 0x3ff54725, 0x48f40feb, 0x3ff53909, 0x56a8054b, 0x3ff52aff,
- 0xeae2f815, 0x3ff51d07, 0xe111c4c5, 0x3ff50f22, 0x15015015, 0x3ff50150, 0x62dd4c9b, 0x3ff4f38f,
- 0xa72f0539, 0x3ff4e5e0, 0xbedc2c4c, 0x3ff4d843, 0x8725af6e, 0x3ff4cab8, 0xdda68fe1, 0x3ff4bd3e,
- 0xa052bf5b, 0x3ff4afd6, 0xad76014a, 0x3ff4a27f, 0xe3b2d067, 0x3ff49539, 0x22014880, 0x3ff48805,
- 0x47ae147b, 0x3ff47ae1, 0x34596066, 0x3ff46dce, 0xc7f5cf9a, 0x3ff460cb, 0xe2c776ca, 0x3ff453d9,
- 0x6562d9fb, 0x3ff446f8, 0x30abee4d, 0x3ff43a27, 0x25d51f87, 0x3ff42d66, 0x265e5951, 0x3ff420b5,
- 0x14141414, 0x3ff41414, 0xd10e6566, 0x3ff40782, 0x3fb013fb, 0x3ff3fb01, 0x42a5af07, 0x3ff3ee8f,
- 0xbce4a902, 0x3ff3e22c, 0x91aa75c6, 0x3ff3d5d9, 0xa47babe7, 0x3ff3c995, 0xd9232955, 0x3ff3bd60,
- 0x13b13b14, 0x3ff3b13b, 0x387ac822, 0x3ff3a524, 0x2c187f63, 0x3ff3991c, 0xd366088e, 0x3ff38d22,
- 0x13813814, 0x3ff38138, 0xd1c945ee, 0x3ff3755b, 0xf3de0748, 0x3ff3698d, 0x5f9f2af8, 0x3ff35dce,
- 0xfb2b78c1, 0x3ff3521c, 0xace01346, 0x3ff34679, 0x5b57bcb2, 0x3ff33ae4, 0xed6a1dfa, 0x3ff32f5c,
- 0x4a2b10bf, 0x3ff323e3, 0x58e9ebb6, 0x3ff31877, 0x0130d190, 0x3ff30d19, 0x2ac40260, 0x3ff301c8,
- 0xbda12f68, 0x3ff2f684, 0xa1fed14b, 0x3ff2eb4e, 0xc04b8097, 0x3ff2e025, 0x012d50a0, 0x3ff2d50a,
- 0x4d812ca0, 0x3ff2c9fb, 0x8e5a3711, 0x3ff2bef9, 0xad012b40, 0x3ff2b404, 0x92f3c105, 0x3ff2a91c,
- 0x29e4129e, 0x3ff29e41, 0x5bb804a5, 0x3ff29372, 0x1288b013, 0x3ff288b0, 0x38a1ce4d, 0x3ff27dfa,
- 0xb8812735, 0x3ff27350, 0x7cd60127, 0x3ff268b3, 0x708092f1, 0x3ff25e22, 0x7e9177b2, 0x3ff2539d,
- 0x92492492, 0x3ff24924, 0x9717605b, 0x3ff23eb7, 0x789abcdf, 0x3ff23456, 0x22a0122a, 0x3ff22a01,
- 0x8121fb78, 0x3ff21fb7, 0x804855e6, 0x3ff21579, 0x0c67c0d9, 0x3ff20b47, 0x12012012, 0x3ff20120,
- 0x7dc11f70, 0x3ff1f704, 0x3c7fb84c, 0x3ff1ecf4, 0x3b3fb874, 0x3ff1e2ef, 0x672e4abd, 0x3ff1d8f5,
- 0xada2811d, 0x3ff1cf06, 0xfc1ce059, 0x3ff1c522, 0x4046ed29, 0x3ff1bb4a, 0x67f2bae3, 0x3ff1b17c,
- 0x611a7b96, 0x3ff1a7b9, 0x19e0119e, 0x3ff19e01, 0x808ca29c, 0x3ff19453, 0x83902bdb, 0x3ff18ab0,
- 0x11811812, 0x3ff18118, 0x191bd684, 0x3ff1778a, 0x89427379, 0x3ff16e06, 0x50fc3201, 0x3ff1648d,
- 0x5f75270d, 0x3ff15b1e, 0xa3fdd5c9, 0x3ff151b9, 0x0e0acd3b, 0x3ff1485f, 0x8d344724, 0x3ff13f0e,
- 0x1135c811, 0x3ff135c8, 0x89edc0ac, 0x3ff12c8b, 0xe75d3033, 0x3ff12358, 0x19a74826, 0x3ff11a30,
- 0x11111111, 0x3ff11111, 0xbe011080, 0x3ff107fb, 0x10fef011, 0x3ff0fef0, 0xfab325a2, 0x3ff0f5ed,
- 0x6be69c90, 0x3ff0ecf5, 0x55826011, 0x3ff0e406, 0xa88f4696, 0x3ff0db20, 0x56359e3a, 0x3ff0d244,
- 0x4fbcda3b, 0x3ff0c971, 0x868b4171, 0x3ff0c0a7, 0xec259dc8, 0x3ff0b7e6, 0x722eecb5, 0x3ff0af2f,
- 0x0a6810a7, 0x3ff0a681, 0xa6af8360, 0x3ff09ddb, 0x39010954, 0x3ff0953f, 0xb37565e2, 0x3ff08cab,
- 0x08421084, 0x3ff08421, 0x29b8eae2, 0x3ff07b9f, 0x0a47f7c6, 0x3ff07326, 0x9c7912fb, 0x3ff06ab5,
- 0xd2f1a9fc, 0x3ff0624d, 0xa0727586, 0x3ff059ee, 0xf7d73404, 0x3ff05197, 0xcc1664c5, 0x3ff04949,
- 0x10410410, 0x3ff04104, 0xb78247fc, 0x3ff038c6, 0xb51f5e1a, 0x3ff03091, 0xfc7729e9, 0x3ff02864,
- 0x81020408, 0x3ff02040, 0x36517a37, 0x3ff01824, 0x10101010, 0x3ff01010, 0x02010080, 0x3ff00804,
- 0x00000000, 0x3ff00000, 0x87ec3637, 0x3dd06139, 0x8db86d61, 0xbe138a4b, 0xe5bcc98d, 0x3e4f7b72,
- 0x634fb0e4, 0xbe85f1f0, 0x954a9137, 0x3ebb9df2, 0x3a67dc3c, 0xbeef4d1e, 0x1dd3898b, 0x3f1f9a32,
- 0x3db06d60, 0xbf4c02db, 0xd0dbc1ad, 0x3f7565bc, 0x31284e9c, 0xbf9b82ce, 0x1a042b32, 0x3fbce2f2,
- 0x6b0379e6, 0xbfd81274, 0x50429b6d, 0x3ff20dd7, 0x1438dcf6, 0x3dba1606, 0x016becfe, 0xbdff4342,
- 0x75b4cde8, 0x3e395b1b, 0xf9c2a481, 0xbe71d468, 0xb7a0966a, 0x3ea6ae6b, 0xfda1afb2, 0xbeda0df5,
- 0xd9475b18, 0x3f0ac250, 0xc8a35a21, 0xbf384227, 0xceb7b0e9, 0x3f631cd0, 0x054eefef, 0xbf89b3c1,
- 0xbc5785f9, 0x3facf6d2, 0x451254ef, 0xbfcb5db0, 0xa741088b, 0x3feaf767, 0x6a2dd61d, 0x3da4e37d,
- 0xe1edf74c, 0xbde92a56, 0x4377a2ac, 0x3e2491d9, 0x39f489a1, 0xbe5d38a6, 0x1dce54b4, 0x3e92d22f,
- 0xc5671218, 0xbec5f6c1, 0x3a1bb9bd, 0x3ef70561, 0x46c610de, 0xbf25712a, 0xbf0e3574, 0x3f518a17,
- 0xdb5a4b51, 0xbf78ea53, 0x50e230dd, 0x3f9e962f, 0x85d30895, 0xbfc0b60e, 0x95f8c2b3, 0x3fe5990d,
- 0x45479566, 0x3d90d511, 0x59127e17, 0xbdd4667c, 0x3e09cefe, 0x3e10d308, 0xa495656e, 0xbe482e4c,
- 0xa05c8f4f, 0x3e7f9bcf, 0x66933f59, 0xbeb2ca0d, 0xf3cce792, 0x3ee42cd2, 0x99c503dd, 0xbf136902,
- 0x532c5193, 0x3f409c2f, 0xdf44f35e, 0xbf6931da, 0x1aa68815, 0x3f911720, 0x1d221312, 0xbfb5e25e,
- 0xd6c7e25c, 0x3fe235fd, 0xc24c08dd, 0x3d7b51ef, 0x4c2104f1, 0xbdc0ab73, 0x866c02a1, 0x3dfbc79c,
- 0x72027ff7, 0xbe343c2f, 0x21752c63, 0x3e6ae853, 0x76229e21, 0xbea0593b, 0x32c6dda4, 0x3ed2106d,
- 0xf8633468, 0xbf020fd5, 0xc5ffc392, 0x3f304e0c, 0x0a3b61e7, 0xbf5ab23d, 0x9b1a01ca, 0x3f844016,
- 0x759a9c41, 0xbfae8712, 0x142795e3, 0x3fdfd9ae, 0xcee056b0, 0xbdf46eed, 0xbf31cd83, 0x3e272c71,
- 0x3414494b, 0xbe3b858c, 0x150492a9, 0xbe51e878, 0x4f9d39bd, 0xbe8d551c, 0x081cc18c, 0x3ec65597,
- 0x3a3f547c, 0x3ef0e91e, 0x5416a98f, 0xbf30c9b6, 0x4dfcdccd, 0x3f2428f4, 0xe4d81e00, 0x3f80b3bd,
- 0x46178bfd, 0xbf8cb801, 0x675394d2, 0xbfc946a9, 0x791dc8fb, 0x3fe6e23d, 0xd42d57ef, 0xbdb573c8,
- 0xed1a27a8, 0xbdf632bf, 0x6b1145de, 0x3e367087, 0xbdc2436d, 0x3e2d7559, 0xa688c6ab, 0xbe9801bb,
- 0xf4ea88f0, 0x3e8ad7ec, 0xf8bce95a, 0x3efc2cfa, 0x2fa996ef, 0xbf1f0bdd, 0x22b44655, 0xbf4a8a14,
- 0x66397f44, 0x3f7b13bf, 0xbd4c13b8, 0x3f82a08f, 0x7a57ce71, 0xbfc9ce0d, 0x517103fe, 0x3fe05fd2,
- 0x0e7c1431, 0x3dc14df8, 0xad2781f0, 0xbe00a71c, 0x333bdac6, 0x3e05e0fa, 0x8ecd3732, 0x3e62222b,
- 0x9d8f65fe, 0xbe84bcf8, 0xe8101ae5, 0xbec10eb4, 0xc2c15462, 0x3ef46afc, 0x0af95711, 0x3efded8b,
- 0x8fc77467, 0xbf50a3f2, 0x2397107c, 0x3f663734, 0x2190992e, 0x3f97d6f6, 0x75be54c3, 0xbfc56874,
- 0xacd147f5, 0x3fd4cb2b, 0x7100d5fc, 0x3db9806d, 0xc3b2ca73, 0xbdd1537c, 0x60cdaaa7, 0xbe26c0f4,
- 0x7eb23d7f, 0x3e5604f1, 0x4c3adb34, 0x3e7e86ae, 0x9b1fe971, 0xbec1b7ba, 0xc100d516, 0x3eceefdc,
- 0x7287d24a, 0x3f19c090, 0xf860db94, 0xbf4594c1, 0x906b63ac, 0xbf48ab6e, 0xabea8a44, 0x3f9a798f,
- 0x314c81f1, 0xbfbdca7c, 0x462cb19e, 0x3fc761d7, 0xaa177cb2, 0xbd902cf0, 0x207e29b4, 0x3decb11b,
- 0x5fac5489, 0xbe209b21, 0xb5bdf6e3, 0xbe32b95b, 0xca4c97b7, 0x3e882b27, 0xc0a47266, 0xbeaa520c,
- 0x67f1145d, 0xbedc5422, 0x3e7fc487, 0x3f161837, 0x7eb92091, 0xbf27130d, 0x8d1e6d3f, 0xbf63a37e,
- 0x8a1743b5, 0x3f9522fd, 0x334d0c36, 0xbfb1ada1, 0xae493c1d, 0x3fb741a2, 0x3f800000, 0x00000000,
- 0x3f804000, 0x3a28e585, 0x3f80a000, 0x399c910f, 0x3f80e000, 0x3a703484, 0x3f814000, 0x3a0eb4bc,
- 0x3f81a000, 0x392750df, 0x3f81e000, 0x3a419dc7, 0x3f824000, 0x39ac3801, 0x3f828000, 0x3a675948,
- 0x3f82e000, 0x39eabf9a, 0x3f834000, 0x356629d6, 0x3f838000, 0x3a07f04c, 0x3f83e000, 0x3848dac3,
- 0x3f842000, 0x3a0e1b17, 0x3f848000, 0x384a1cc7, 0x3f84c000, 0x3a082ade, 0x3f852000, 0x363f31e5,
- 0x3f856000, 0x39eccf0d, 0x3f85a000, 0x3a692c6f, 0x3f860000, 0x39b22cb1, 0x3f864000, 0x3a462d87,
- 0x3f86a000, 0x3941e864, 0x3f86e000, 0x3a180409, 0x3f872000, 0x3a7cd32d, 0x3f878000, 0x39bdde6c,
- 0x3f87c000, 0x3a3e5fb4, 0x3f882000, 0x38d960b3, 0x3f886000, 0x39eab752, 0x3f88a000, 0x3a4cf599,
- 0x3f890000, 0x390803d1, 0x3f894000, 0x39e90955, 0x3f898000, 0x3a44878c, 0x3f89e000, 0x38908271,
- 0x3f8a2000, 0x39ba4b0f, 0x3f8a6000, 0x3a25cdb3, 0x3f8aa000, 0x3a6c0f33, 0x3f8b0000, 0x393fc12e,
- 0x3f8b4000, 0x39e2ee51, 0x3f8b8000, 0x3a30a9dd, 0x3f8bc000, 0x3a6d8e61, 0x3f8c2000, 0x3920aa58,
- 0x3f8c6000, 0x39c1088a, 0x3f8ca000, 0x3a16a120, 0x3f8ce000, 0x3a4a86c1, 0x3f8d2000, 0x3a7c3aae,
- 0x3f8d8000, 0x392f0952, 0x3f8dc000, 0x39b2461c, 0x3f8e0000, 0x3a04621f, 0x3f8e4000, 0x3a2d84b8,
- 0x3f8e8000, 0x3a548ff4, 0x3f8ec000, 0x3a7988db, 0x3f8f2000, 0x38e3a30c, 0x3f8f6000, 0x39755daa,
- 0x3f8fa000, 0x39b86d8a, 0x3f8fe000, 0x39f22e5e, 0x3f902000, 0x3a13fd53, 0x3f906000, 0x3a2cedcc,
- 0x3f90a000, 0x3a43ed23, 0x3f90e000, 0x3a58ffd0, 0x3f912000, 0x3a6c2a3c, 0x3f916000, 0x3a7d70bf,
- 0x3f91c000, 0x384d7a06, 0x3f920000, 0x38d318cf, 0x3f924000, 0x39185d53, 0x3f928000, 0x393fe1b1,
- 0x3f92c000, 0x396029b1, 0x3f930000, 0x3979454c, 0x3f934000, 0x3985a221, 0x3f938000, 0x398b1b0d,
- 0x3f93c000, 0x398d1515, 0x3f940000, 0x398b97c7, 0x3f944000, 0x3986aa98, 0x3f948000, 0x397ca9c7,
- 0x3f94c000, 0x39653bd8, 0x3f950000, 0x394719b5, 0x3f954000, 0x39225182, 0x3f958000, 0x38ede264,
- 0x3f95c000, 0x388a0d15, 0x3f960000, 0x3749f226, 0x3f962000, 0x3a737219, 0x3f966000, 0x3a6223e3,
- 0x3f96a000, 0x3a4f406c, 0x3f96e000, 0x3a3acaee, 0x3f972000, 0x3a24c698, 0x3f976000, 0x3a0d368f,
- 0x3f97a000, 0x39e83bdd, 0x3f97e000, 0x39b2ff8f, 0x3f982000, 0x39757c89, 0x3f986000, 0x38fdf7dc,
- 0x3f98a000, 0x3622482d, 0x3f98c000, 0x3a600bf3, 0x3f990000, 0x3a3dfedf, 0x3f994000, 0x3a1a7de3,
- 0x3f998000, 0x39eb17a4, 0x3f99c000, 0x399e56e3, 0x3f9a0000, 0x391d7e03, 0x3f9a2000, 0x3a7e2ab7,
- 0x3f9a6000, 0x3a538fc2, 0x3f9aa000, 0x3a279148, 0x3f9ae000, 0x39f463ce, 0x3f9b2000, 0x3996e86c,
- 0x3f9b6000, 0x38dad617, 0x3f9b8000, 0x3a69e815, 0x3f9bc000, 0x3a371eac, 0x3f9c0000, 0x3a030100,
- 0x3f9c4000, 0x399b2304, 0x3f9c8000, 0x38b694db, 0x3f9ca000, 0x3a5ec6af, 0x3f9ce000, 0x3a257018,
- 0x3f9d2000, 0x39d5a259, 0x3f9d6000, 0x393bb0e7, 0x3f9d8000, 0x3a71c388, 0x3f9dc000, 0x3a335958,
- 0x3f9e0000, 0x39e75fcb, 0x3f9e4000, 0x394b2590, 0x3f9e6000, 0x3a70a802, 0x3f9ea000, 0x3a2d4de7,
- 0x3f9ee000, 0x39d17a6c, 0x3f9f2000, 0x390be02b, 0x3f9f4000, 0x3a5c007c, 0x3f9f8000, 0x3a13d899,
- 0x3f9fc000, 0x399504dc, 0x3fa00000, 0x00000000, 0x3fa02000, 0x3a34534e, 0x3fa06000, 0x39cefca8,
- 0x3fa0a000, 0x38cc1828, 0x3fa0c000, 0x3a4a6352, 0x3fa10000, 0x39f4424a, 0x3fa14000, 0x3922f98d,
- 0x3f214000, 0x38a2f98d, 0x3f4b2000, 0x397f529f, 0x3f800000, 0x00000000, 0x3fa14000, 0x3922f98d,
- 0x3fcb2000, 0x39ff529f, 0x3f800000, 0x00000000, 0x3f816000, 0x391a3e77, 0x3f82c000, 0x39d8698a,
- 0x3f842000, 0x3a51461d, 0x3f85a000, 0x39ac367c, 0x3f870000, 0x3a7b0cb4, 0x3f888000, 0x3a407404,
- 0x3f8a0000, 0x3a26abaa, 0x3f8b8000, 0x3a2e0f1f, 0x3f8d0000, 0x3a56fadb, 0x3f8ea000, 0x39073168,
- 0x3f902000, 0x3a0ee218, 0x3f91c000, 0x38f4dcea, 0x3f934000, 0x3a515978, 0x3f94e000, 0x3a277d47,
- 0x3f968000, 0x3a2169b9, 0x3f982000, 0x3a3f828c, 0x3f99e000, 0x370b2641, 0x3f9b8000, 0x39d39b9d,
- 0x3f9d2000, 0x3a76cd39, 0x3f9ee000, 0x3a299304, 0x3fa0a000, 0x3a02887d, 0x3fa26000, 0x3a021818,
- 0x3fa42000, 0x3a28ad70, 0x3fa5e000, 0x3a76b54d, 0x3fa7c000, 0x39d93b4e, 0x3fa9a000, 0x382d5a75,
- 0x3fab6000, 0x3a51cdad, 0x3fad4000, 0x3a41f752, 0x3faf2000, 0x3a5bc56b, 0x3fb12000, 0x38fd6074,
- 0x3fb30000, 0x3a0e2095, 0x3fb50000, 0x391e667f, 0x3fb6e000, 0x3a6c8f19, 0x3fb8e000, 0x3a5d7a3b,
- 0x3fbae000, 0x3a7ad590, 0x3fbd0000, 0x398a39f5, 0x3fbf0000, 0x3a3ccdb3, 0x3fc12000, 0x39c4cca6,
- 0x3fc34000, 0x39599b44, 0x3fc56000, 0x3965422a, 0x3fc78000, 0x39d74c8a, 0x3fc9a000, 0x3a4dec33,
- 0x3fcbe000, 0x39c14fef, 0x3fce2000, 0x391182a3, 0x3fd06000, 0x38ccf6bb, 0x3fd2a000, 0x3981d91f,
- 0x3fd4e000, 0x3a1ad55e, 0x3fd74000, 0x391f995a, 0x3fd98000, 0x3a68ae13, 0x3fdbe000, 0x3a5dbcbe,
- 0x3fde6000, 0x37f4825e, 0x3fe0c000, 0x39cdeec2, 0x3fe32000, 0x3a7c4b95, 0x3fe5a000, 0x3a48373b,
- 0x3fe82000, 0x3a4b5281, 0x3feac000, 0x37c6e7dd, 0x3fed4000, 0x39f301ed, 0x3fefe000, 0x3917337b,
- 0x3ff28000, 0x383b9e2c, 0x3ff52000, 0x392fa2a4, 0x3ff7c000, 0x3a06fb98, 0x3ffa8000, 0x38ecb6dc,
- 0x3ffd2000, 0x3a706067, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x3c37c000, 0x374a16dd,
- 0x3cb70000, 0x37f2d0b8, 0x3d08c000, 0x381a3aa2, 0x3d35c000, 0x37b4dd63, 0x3d624000, 0x383f5721,
- 0x3d874000, 0x384e27e8, 0x3d9d4000, 0x380bf749, 0x3db30000, 0x387dbeb2, 0x3dc8c000, 0x37216e46,
- 0x3dde4000, 0x3684815b, 0x3df38000, 0x383b045f, 0x3e044000, 0x390b119b, 0x3e0ec000, 0x391a32ea,
- 0x3e194000, 0x38ba789e, 0x3e238000, 0x39553f30, 0x3e2e0000, 0x3651cfde, 0x3e380000, 0x39685a9d,
- 0x3e424000, 0x39057a05, 0x3e4c4000, 0x395ba0ef, 0x3e564000, 0x396bc5b6, 0x3e604000, 0x3936d9bb,
- 0x3e6a4000, 0x38772619, 0x3e740000, 0x39017ce9, 0x3e7dc000, 0x3902d720, 0x3e83c000, 0x38856dd8,
- 0x3e888000, 0x3941f6b4, 0x3e8d4000, 0x3980b652, 0x3e920000, 0x3980f561, 0x3e96c000, 0x39443f13,
- 0x3e9b8000, 0x38926752, 0x3ea00000, 0x39c8c763, 0x3ea4c000, 0x391e12f3, 0x3ea94000, 0x39b7bf89,
- 0x3eae0000, 0x36d1cfde, 0x3eb28000, 0x38c7f233, 0x3eb70000, 0x39087367, 0x3ebb8000, 0x38e95d3f,
- 0x3ec00000, 0x38256316, 0x3ec44000, 0x39d38e5c, 0x3ec8c000, 0x396ea247, 0x3ecd4000, 0x350e4788,
- 0x3ed18000, 0x395d829f, 0x3ed5c000, 0x39c30f2f, 0x3eda0000, 0x39fd7ee7, 0x3ede8000, 0x3872e9e7,
- 0x3ee2c000, 0x3897d694, 0x3ee70000, 0x3824923a, 0x3eeb0000, 0x39ea7c06, 0x3eef4000, 0x39a7fa88,
- 0x3ef38000, 0x391aa879, 0x3ef78000, 0x39dace65, 0x3efbc000, 0x39215a32, 0x3effc000, 0x39af3350,
- 0x3f01c000, 0x3a7b5172, 0x3f040000, 0x389cf27f, 0x3f060000, 0x3902806b, 0x3f080000, 0x3909d8a9,
- 0x3f0a0000, 0x38c9faa1, 0x3f0c0000, 0x37a33dca, 0x3f0dc000, 0x3a6623d2, 0x3f0fc000, 0x3a3c7a61,
- 0x3f11c000, 0x3a083a84, 0x3f13c000, 0x39930161, 0x3f15c000, 0x35d1cfde, 0x3f178000, 0x3a2d0ebd,
- 0x3f198000, 0x399f1aad, 0x3f1b4000, 0x3a67ff6d, 0x3f1d4000, 0x39ecfea8, 0x3f1f0000, 0x3a7b26f3,
- 0x3f210000, 0x39ec1fa6, 0x3f22c000, 0x3a675314, 0x3f24c000, 0x399e12f3, 0x3f268000, 0x3a2d4b66,
- 0x3f288000, 0x370c3845, 0x3f2a4000, 0x399ba329, 0x3f2c0000, 0x3a1044d3, 0x3f2dc000, 0x3a49a196,
- 0x3f2f8000, 0x3a79fe83, 0x3f318000, 0x3905c7aa, 0x3f334000, 0x39802391, 0x3f350000, 0x39abe796,
- 0x3f36c000, 0x39c65a9d, 0x3f388000, 0x39cfa6c5, 0x3f3a4000, 0x39c7f593, 0x3f3c0000, 0x39af6ff7,
- 0x3f3dc000, 0x39863e4d, 0x3f3f8000, 0x391910c1, 0x3f414000, 0x369d5be7, 0x3f42c000, 0x3a541616,
- 0x3f448000, 0x3a1ee960, 0x3f464000, 0x39c38ed2, 0x3f480000, 0x38e61600, 0x3f498000, 0x3a4fedb4,
- 0x3f4b4000, 0x39f6b4ab, 0x3f4d0000, 0x38f8d3b0, 0x3f4e8000, 0x3a3b3faa, 0x3f504000, 0x399fb693,
- 0x3f51c000, 0x3a5cfe71, 0x3f538000, 0x39c5740b, 0x3f550000, 0x3a611eb0, 0x3f56c000, 0x39b079c4,
- 0x3f584000, 0x3a4824d7, 0x3f5a0000, 0x39439a54, 0x3f5b8000, 0x3a1291ea, 0x3f5d0000, 0x3a6d3673,
- 0x3f5ec000, 0x3981c731, 0x3f604000, 0x3a0da88f, 0x3f61c000, 0x3a53945c, 0x3f638000, 0x3895ae91,
- 0x3f650000, 0x3996372a, 0x3f668000, 0x39f9a832, 0x3f680000, 0x3a27eda4, 0x3f698000, 0x3a4c764f,
- 0x3f6b0000, 0x3a6a7c06, 0x3f6cc000, 0x370321eb, 0x3f6e4000, 0x3899ab3f, 0x3f6fc000, 0x38f02086,
- 0x3f714000, 0x390a1707, 0x3f72c000, 0x39031e44, 0x3f744000, 0x38c6b362, 0x3f75c000, 0x382bf195,
- 0x3f770000, 0x3a768e36, 0x3f788000, 0x3a5c503b, 0x3f7a0000, 0x3a3c1179, 0x3f7b8000, 0x3a15de1d,
- 0x3f7d0000, 0x39d3845d, 0x3f7e8000, 0x395f263f, 0x3f800000, 0x00000000, 0x00000000, 0x00000000,
- 0x3b5d4000, 0x367a8e44, 0x3bdc8000, 0x368ed49f, 0x3c24c000, 0x36c21451, 0x3c5ac000, 0x375211d6,
- 0x3c884000, 0x3720ea11, 0x3ca2c000, 0x37e9eb59, 0x3cbd4000, 0x37b87be7, 0x3cd78000, 0x37bf2560,
- 0x3cf1c000, 0x33d597a0, 0x3d05c000, 0x37806a05, 0x3d128000, 0x3820581f, 0x3d1f4000, 0x38223334,
- 0x3d2c0000, 0x378e3bac, 0x3d388000, 0x3810684f, 0x3d450000, 0x37feb7ae, 0x3d518000, 0x36a9d609,
- 0x3d5dc000, 0x37a68163, 0x3d6a0000, 0x376a8b27, 0x3d760000, 0x384c8fd6, 0x3d810000, 0x3885183e,
- 0x3d870000, 0x3874a760, 0x3d8d0000, 0x380d1154, 0x3d92c000, 0x38ea42bd, 0x3d98c000, 0x384c1571,
- 0x3d9e8000, 0x38ba66b8, 0x3da44000, 0x38e7da3b, 0x3daa0000, 0x38eee632, 0x3dafc000, 0x38d00911,
- 0x3db58000, 0x388bbede, 0x3dbb4000, 0x378a0512, 0x3dc0c000, 0x3894c7a0, 0x3dc64000, 0x38e30710,
- 0x3dcc0000, 0x36db2829, 0x3dd18000, 0x3729d609, 0x3dd6c000, 0x38fa0e82, 0x3ddc4000, 0x38bc9a75,
- 0x3de1c000, 0x383a9297, 0x3de70000, 0x38dc83c8, 0x3dec8000, 0x37eac335, 0x3df1c000, 0x38706ac3,
- 0x3df70000, 0x389574c2, 0x3dfc4000, 0x3892d068, 0x3e00c000, 0x38615032, 0x3e034000, 0x3917acf4,
- 0x3e05c000, 0x3967a126, 0x3e088000, 0x38217840, 0x3e0b0000, 0x38b420ab, 0x3e0d8000, 0x38f9c7b2,
- 0x3e100000, 0x391103bd, 0x3e128000, 0x39169a6b, 0x3e150000, 0x390dd194, 0x3e178000, 0x38eda471,
- 0x3e1a0000, 0x38a38950, 0x3e1c8000, 0x37f6844a, 0x3e1ec000, 0x395e1cdb, 0x3e214000, 0x390fcffc,
- 0x3e23c000, 0x38503e9d, 0x3e260000, 0x394b00fd, 0x3e288000, 0x38a9910a, 0x3e2ac000, 0x39518a31,
- 0x3e2d4000, 0x3882d2c2, 0x3e2f8000, 0x392488e4, 0x3e31c000, 0x397b0aff, 0x3e344000, 0x388a22d8,
- 0x3e368000, 0x3902bd5e, 0x3e38c000, 0x39342f85, 0x3e3b0000, 0x39598811, 0x3e3d4000, 0x3972e6b1,
- 0x3e3fc000, 0x34d53654, 0x3e420000, 0x360ca25e, 0x3e440000, 0x39785cc0, 0x3e464000, 0x39630710,
- 0x3e488000, 0x39424ed7, 0x3e4ac000, 0x39165101, 0x3e4d0000, 0x38be5421, 0x3e4f4000, 0x37e7b0c0,
- 0x3e514000, 0x394fd0c3, 0x3e538000, 0x38efaaaa, 0x3e55c000, 0x37a8f566, 0x3e57c000, 0x3927c744,
- 0x3e5a0000, 0x383fa4d5, 0x3e5c0000, 0x392d9e39, 0x3e5e4000, 0x3803feae, 0x3e604000, 0x390a268c,
- 0x3e624000, 0x39692b80, 0x3e648000, 0x38789b4f, 0x3e668000, 0x3909307d, 0x3e688000, 0x394a601c,
- 0x3e6ac000, 0x35e67edc, 0x3e6cc000, 0x383e386d, 0x3e6ec000, 0x38a7743d, 0x3e70c000, 0x38dccec3,
- 0x3e72c000, 0x38ff57e0, 0x3e74c000, 0x39079d8b, 0x3e76c000, 0x390651a6, 0x3e78c000, 0x38f7bad9,
- 0x3e7ac000, 0x38d0ab82, 0x3e7cc000, 0x38979e7d, 0x3e7ec000, 0x381978ee, 0x3e804000, 0x397816c8,
- 0x3e814000, 0x39410cb2, 0x3e824000, 0x39015384, 0x3e834000, 0x3863fa28, 0x3e840000, 0x39f41065,
- 0x3e850000, 0x39c7668a, 0x3e860000, 0x39968afa, 0x3e870000, 0x39430db9, 0x3e880000, 0x38a18cf3,
- 0x3e88c000, 0x39eb2907, 0x3e89c000, 0x39a9e10c, 0x3e8ac000, 0x39492800, 0x3e8bc000, 0x385a53d1,
- 0x3e8c8000, 0x39ce0cf7, 0x3e8d8000, 0x3979c7b2, 0x3e8e8000, 0x389f5d99, 0x3e8f4000, 0x39ceefcb,
- 0x3e904000, 0x39646a39, 0x3e914000, 0x380d7a9b, 0x3e920000, 0x39ad6650, 0x3e930000, 0x390ac3b8,
- 0x3e93c000, 0x39d9a9a8, 0x3e94c000, 0x39548a99, 0x3e958000, 0x39f73c4b, 0x3e968000, 0x3980960e,
- 0x3e978000, 0x374b3d5a, 0x3e984000, 0x39888f1e, 0x3e994000, 0x37679a07, 0x3e9a0000, 0x39826a13,
- 0x00000000, 0x00000000, 0x3bff0000, 0x3429ac41, 0x3c7e0000, 0x35a8b0fc, 0x3cbdc000, 0x368d83ea,
- 0x3cfc1000, 0x361b0e78, 0x3d1cf000, 0x3687b9fe, 0x3d3ba000, 0x3631ec65, 0x3d5a1000, 0x36dd7119,
- 0x3d785000, 0x35c30045, 0x3d8b2000, 0x379b7751, 0x3d9a0000, 0x37ebcb0d, 0x3da8d000, 0x37839f83,
- 0x3db78000, 0x37528ae5, 0x3dc61000, 0x37a2eb18, 0x3dd49000, 0x36da7495, 0x3de2f000, 0x36a91eb7,
- 0x3df13000, 0x3783b715, 0x3dff6000, 0x371131db, 0x3e06b000, 0x383f3e68, 0x3e0db000, 0x38156a97,
- 0x3e14a000, 0x38297c0f, 0x3e1b8000, 0x387e100f, 0x3e226000, 0x3815b665, 0x3e293000, 0x37e5e3a1,
- 0x3e2ff000, 0x38183853, 0x3e36b000, 0x35fe719d, 0x3e3d5000, 0x38448108, 0x3e43f000, 0x38503290,
- 0x3e4a9000, 0x373539e8, 0x3e511000, 0x385e0ff1, 0x3e579000, 0x3864a740, 0x3e5e1000, 0x3786742d,
- 0x3e647000, 0x387be3cd, 0x3e6ae000, 0x3685ad3e, 0x3e713000, 0x3803b715, 0x3e778000, 0x37adcbdc,
- 0x3e7dc000, 0x380c36af, 0x3e820000, 0x371652d3, 0x3e851000, 0x38927139, 0x3e882000, 0x38c5fcd7,
- 0x3e8b3000, 0x38ae55d5, 0x3e8e4000, 0x3818c169, 0x3e914000, 0x38a0fde7, 0x3e944000, 0x38ad09ef,
- 0x3e974000, 0x3862bae1, 0x3e9a3000, 0x38eecd4c, 0x3e9d3000, 0x3798aad2, 0x3ea02000, 0x37421a1a,
- 0x3ea30000, 0x38c5e10e, 0x3ea5f000, 0x37bf2aee, 0x3ea8d000, 0x382d872d, 0x3eabb000, 0x37ee2e8a,
- 0x3eae8000, 0x38dedfac, 0x3eb16000, 0x3802f2b9, 0x3eb43000, 0x38481e9b, 0x3eb70000, 0x380eaa2b,
- 0x3eb9c000, 0x38ebfb5d, 0x3ebc9000, 0x38255fdd, 0x3ebf5000, 0x38783b82, 0x3ec21000, 0x3851da1e,
- 0x3ec4d000, 0x374e1b05, 0x3ec78000, 0x388f439b, 0x3eca3000, 0x38ca0e10, 0x3ecce000, 0x38cac08b,
- 0x3ecf9000, 0x3891f65f, 0x3ed24000, 0x378121cb, 0x3ed4e000, 0x386c9a9a, 0x3ed78000, 0x38949923,
- 0x3eda2000, 0x38777bcc, 0x3edcc000, 0x37b12d26, 0x3edf5000, 0x38a6ced3, 0x3ee1e000, 0x38ebd3e6,
- 0x3ee47000, 0x38fbe3cd, 0x3ee70000, 0x38d785c2, 0x3ee99000, 0x387e7e00, 0x3eec1000, 0x38f392c5,
- 0x3eeea000, 0x37d40983, 0x3ef12000, 0x38081a7c, 0x3ef3a000, 0x3784c3ad, 0x3ef61000, 0x38cce923,
- 0x3ef89000, 0x380f5faf, 0x3efb0000, 0x3891fd38, 0x3efd7000, 0x38ac47bc, 0x3effe000, 0x3897042b,
- 0x3f012000, 0x392952d2, 0x3f025000, 0x396fced4, 0x3f039000, 0x37f97073, 0x3f04c000, 0x385e9eae,
- 0x3f05f000, 0x3865c84a, 0x3f072000, 0x38130ba3, 0x3f084000, 0x3979cf16, 0x3f097000, 0x3938cac9,
- 0x3f0aa000, 0x38c3d2f4, 0x3f0bc000, 0x39755dec, 0x3f0cf000, 0x38e6b467, 0x3f0e1000, 0x395c0fb8,
- 0x3f0f4000, 0x383ebce0, 0x3f106000, 0x38dcd192, 0x3f118000, 0x39186bdf, 0x3f12a000, 0x392de74c,
- 0x3f13c000, 0x392f0944, 0x3f14e000, 0x391bff61, 0x3f160000, 0x38e9ed44, 0x3f172000, 0x38686dc8,
- 0x3f183000, 0x396b99a7, 0x3f195000, 0x39099c89, 0x3f1a7000, 0x37a27673, 0x3f1b8000, 0x390bdaa3,
- 0x3f1c9000, 0x397069ab, 0x3f1db000, 0x388449ff, 0x3f1ec000, 0x39013538, 0x3f1fd000, 0x392dc268,
- 0x3f20e000, 0x3947f423, 0x3f21f000, 0x394ff17c, 0x3f230000, 0x3945e10e, 0x3f241000, 0x3929e8f5,
- 0x3f252000, 0x38f85db0, 0x3f263000, 0x38735f99, 0x3f273000, 0x396c08db, 0x3f284000, 0x3909e600,
- 0x3f295000, 0x37b4996f, 0x3f2a5000, 0x391233cc, 0x3f2b5000, 0x397cead9, 0x3f2c6000, 0x38adb5cd,
- 0x3f2d6000, 0x3920261a, 0x3f2e6000, 0x3958ee36, 0x3f2f7000, 0x35aa4905, 0x3f307000, 0x37cbd11e,
- 0x3f317000, 0x3805fdf4, 0x40000000, 0x00000000, 0x3ffe0000, 0x38fe03f8, 0x3ffc0000, 0x39fc0fc1,
- 0x3ffa0000, 0x3a8cb3c9, 0x3ff80000, 0x3af83e10, 0x3ff60000, 0x3b407b30, 0x3ff40000, 0x3b898d60,
- 0x3ff20000, 0x3bb9d648, 0x3ff00000, 0x3bf0f0f1, 0x3fef0000, 0x3abadc7f, 0x3fed0000, 0x3b66076c,
- 0x3feb0000, 0x3bbdb2a6, 0x3fea0000, 0x39ea0ea1, 0x3fe80000, 0x3b4b58f7, 0x3fe60000, 0x3bc2b448,
- 0x3fe50000, 0x3a9660ac, 0x3fe30000, 0x3b8e38e4, 0x3fe10000, 0x3bfc780e, 0x3fe00000, 0x3b607038,
- 0x3fde0000, 0x3be95c4d, 0x3fdd0000, 0x3b4f914c, 0x3fdb0000, 0x3beb61ef, 0x3fda0000, 0x3b681b4f,
- 0x3fd90000, 0x385901b2, 0x3fd70000, 0x3b9435e5, 0x3fd60000, 0x3aae0359, 0x3fd40000, 0x3bc77b03,
- 0x3fd30000, 0x3b501a6d, 0x3fd20000, 0x39d20d21, 0x3fd00000, 0x3bb69fcc, 0x3fcf0000, 0x3b48e951,
- 0x3fce0000, 0x3a3453b9, 0x3fcc0000, 0x3bcccccd, 0x3fcb0000, 0x3b8727c0, 0x3fca0000, 0x3b0b0fcd,
- 0x3fc90000, 0x397b49d1, 0x3fc70000, 0x3bce0c7d, 0x3fc60000, 0x3b980c6a, 0x3fc50000, 0x3b4b90f7,
- 0x3fc40000, 0x3adcbe15, 0x3fc30000, 0x39c30c31, 0x3fc10000, 0x3be4bbd6, 0x3fc00000, 0x3bc0c0c1,
- 0x3fbf0000, 0x3ba02fe8, 0x3fbe0000, 0x3b82fa0c, 0x3fbd0000, 0x3b52208e, 0x3fbc0000, 0x3b24c818,
- 0x3fbb0000, 0x3afb9c87, 0x3fba0000, 0x3aba2e8c, 0x3fb90000, 0x3a850fe9, 0x3fb80000, 0x3a381703,
- 0x3fb70000, 0x39fbb5a2, 0x3fb60000, 0x39b60b61, 0x3fb50000, 0x399e68aa, 0x3fb40000, 0x39b40b41,
- 0x3fb30000, 0x39f63529, 0x3fb20000, 0x3a321643, 0x3fb10000, 0x3a7e9dc0, 0x3fb00000, 0x3ab02c0b,
- 0x3faf0000, 0x3aeb771a, 0x3fae0000, 0x3b1882b9, 0x3fad0000, 0x3b4056b0, 0x3fac0000, 0x3b6d2308,
- 0x3fab0000, 0x3b8f69e3, 0x3faa0000, 0x3baaaaab, 0x3fa90000, 0x3bc84a48, 0x3fa80000, 0x3be83f57,
- 0x3fa80000, 0x39a80a81, 0x3fa70000, 0x3abc14e6, 0x3fa60000, 0x3b2b8872, 0x3fa50000, 0x3b7d6a05,
- 0x3fa40000, 0x3ba9cf1e, 0x3fa30000, 0x3bd70a3d, 0x3fa30000, 0x394bc7f6, 0x3fa20000, 0x3adf0cac,
- 0x3fa10000, 0x3b56625d, 0x3fa00000, 0x3ba0a0a1, 0x3f9f0000, 0x3bd809fe, 0x3f9f0000, 0x3a0b2f39,
- 0x3f9e0000, 0x3b195a48, 0x3f9d0000, 0x3b89d89e, 0x3f9c0000, 0x3bc8e161, 0x3f9c0000, 0x399c09c1,
- 0x3f9b0000, 0x3b18df3e, 0x3f9a0000, 0x3b90e7d9, 0x3f990000, 0x3bd722db, 0x3f990000, 0x3a78d28b,
- 0x3f980000, 0x3b519013, 0x3f970000, 0x3bb425ed, 0x3f970000, 0x3817012e, 0x3f960000, 0x3b1fb4d8,
- 0x3f950000, 0x3ba02568, 0x3f940000, 0x3bf2094f, 0x3f940000, 0x3b0b0129, 0x3f930000, 0x3b9a85c4,
- 0x3f920000, 0x3bf11384, 0x3f920000, 0x3b124925, 0x3f910000, 0x3ba2b3c5, 0x3f900000, 0x3bfdbc09,
- 0x3f900000, 0x3b3470c6, 0x3f8f0000, 0x3bb823ee, 0x3f8f0000, 0x3a3bced0, 0x3f8e0000, 0x3b706ada,
- 0x3f8d0000, 0x3bda5202, 0x3f8d0000, 0x3af72c23, 0x3f8c0000, 0x3ba29c04, 0x3f8c0000, 0x398c08c1,
- 0x3f8b0000, 0x3b606894, 0x3f8a0000, 0x3bd8f2fc, 0x3f8a0000, 0x3b05f0e1, 0x3f890000, 0x3bae408a,
- 0x3f890000, 0x3a5639d7, 0x3f880000, 0x3b888889, 0x3f870000, 0x3bf78088, 0x3f870000, 0x3b4f56be,
- 0x3f860000, 0x3bd90544, 0x3f860000, 0x3b1714fc, 0x3f850000, 0x3bbf3761, 0x3f850000, 0x3ad0214d,
- 0x3f840000, 0x3ba9f9c8, 0x3f840000, 0x3a842108, 0x3f830000, 0x3b993052, 0x3f830000, 0x3a1374bc,
- 0x3f820000, 0x3b8cbfbf, 0x3f820000, 0x39820821, 0x3f810000, 0x3b848da9, 0x3f810000, 0x38810204,
- 0x3f800000, 0x3b808081, 0x3f800000, 0x00000000, 0x00000000, 0x3f800000, 0x3f966cfe, 0x3fc583ab,
- 0x40681e7b, 0x4070c7d0, 0x41204937, 0x41211525, 0x41da51c0, 0x41da7743, 0x4294680b, 0x42946b7e,
- 0x4349b691, 0x4349b734, 0x4409143b, 0x4409144a, 0x44ba4f53, 0x44ba4f55, 0x457d38ac, 0x457d38ac,
- 0x462c14ee, 0x462c14ef, 0x46e9e224, 0x46e9e224, 0x479ef0b3, 0x479ef0b3, 0x485805ad, 0x485805ad,
- 0x4912cd62, 0x4912cd62, 0x49c78665, 0x49c78665, 0x4a87975f, 0x4a87975f, 0x4b3849a4, 0x4b3849a4,
- 0x4bfa7910, 0x4bfa7910, 0x4caa36c8, 0x4caa36c8, 0x4d675844, 0x4d675844, 0x4e1d3710, 0x4e1d3710,
- 0x4ed5ad6e, 0x4ed5ad6e, 0x4f91357a, 0x4f91357a, 0x50455bfe, 0x50455bfe, 0x51061e9d, 0x51061e9d,
- 0x51b64993, 0x51b64993, 0x5277c118, 0x5277c118, 0x53285dd2, 0x53285dd2, 0x53e4d572, 0x53e4d572,
- 0x549b8238, 0x549b8238, 0x55535bb3, 0x55535bb3, 0x560fa1fe, 0x560fa1fe, 0x56c3379a, 0x56c3379a,
- 0x5784a9f1, 0x5784a9f1, 0x58344f11, 0x58344f11, 0x58f510ad, 0x58f510ad, 0x3d7faade, 0x3d87ccf5,
- 0x3d8fc36e, 0x3d97b8ca, 0x3d9facf8, 0x3da79feb, 0x3daf9192, 0x3db781df, 0x3dbf70c1, 0x3dc75e2a,
- 0x3dcf4a0b, 0x3dd73454, 0x3ddf1cf6, 0x3de703e3, 0x3deee90c, 0x3df6cc61, 0x3dfeadd5, 0x3e0346ac,
- 0x3e07356e, 0x3e0b232a, 0x3e0f0fd8, 0x3e12fb71, 0x3e16e5ee, 0x3e1acf47, 0x3e1eb777, 0x3e229e76,
- 0x3e26843d, 0x3e2a68c6, 0x3e2e4c09, 0x3e322e00, 0x3e360ea4, 0x3e39edef, 0x3e3dcbda, 0x3e41a85f,
- 0x3e458377, 0x3e495d1c, 0x3e4d3547, 0x3e510bf3, 0x3e54e119, 0x3e58b4b3, 0x3e5c86bb, 0x3e60572a,
- 0x3e6425fc, 0x3e67f32a, 0x3e6bbeaf, 0x3e6f8884, 0x3e7350a4, 0x3e77170a, 0x3e7adbb0, 0x3e7e9e90,
- 0x3e812fd3, 0x3e830f75, 0x3e84ee2d, 0x3e86cbf7, 0x3e88a8d2, 0x3e8a84ba, 0x3e8c5fad, 0x3e8e39a9,
- 0x3e9012ab, 0x3e91eab1, 0x3e93c1b9, 0x3e9597c0, 0x3e976cc4, 0x3e9940c2, 0x3e9b13ba, 0x3e9ce5a7,
- 0x3e9eb689, 0x3ea0865d, 0x3ea25522, 0x3ea422d4, 0x3ea5ef73, 0x3ea7bafc, 0x3ea9856d, 0x3eab4ec4,
- 0x3ead1701, 0x3eaede20, 0x3eb0a420, 0x3eb26900, 0x3eb42cbd, 0x3eb5ef56, 0x3eb7b0ca, 0x3eb97117,
- 0x3ebb303b, 0x3ebcee34, 0x3ebeab02, 0x3ec066a3, 0x3ec22116, 0x3ec3da58, 0x3ec5926a, 0x3ec74949,
- 0x3ec8fef4, 0x3ecab36a, 0x3ecc66aa, 0x3ece18b3, 0x3ecfc983, 0x3ed1791a, 0x3ed32776, 0x3ed4d497,
- 0x3ed6807b, 0x3ed82b21, 0x3ed9d489, 0x3edb7cb1, 0x3edd239a, 0x3edec941, 0x3ee06da6, 0x3ee210c9,
- 0x3ee3b2a8, 0x3ee55344, 0x3ee6f29a, 0x3ee890ab, 0x3eea2d76, 0x3eebc8fb, 0x3eed6338, 0x3eeefc2e,
- 0x3ef093db, 0x3ef22a40, 0x3ef3bf5c, 0x3ef5532e, 0x3ef6e5b7, 0x3ef876f5, 0x3efa06e8, 0x3efb9591,
- 0x3efd22ef, 0x3efeaf01, 0x3f001ce4, 0x3f00e1a1, 0x3f01a5b8, 0x3f02692a, 0x3f032bf5, 0x3f03ee1a,
- 0x3f04af98, 0x3f057071, 0x3f0630a3, 0x3f06f02f, 0x3f07af14, 0x3f086d54, 0x3f092aed, 0x3f09e7e0,
- 0x3f0aa42d, 0x3f0b5fd3, 0x3f0c1ad4, 0x3f0cd52f, 0x3f0d8ee4, 0x3f0e47f4, 0x3f0f005d, 0x3f0fb822,
- 0x3f106f41, 0x3f1125ba, 0x3f11db8f, 0x3f1290bf, 0x3f13454a, 0x3f13f931, 0x3f14ac73, 0x3f155f11,
- 0x3f16110b, 0x3f16c261, 0x3f177314, 0x3f182324, 0x3f18d290, 0x3f19815a, 0x3f1a2f81, 0x3f1add06,
- 0x3f1b89e8, 0x3f1c3629, 0x3f1ce1c9, 0x3f1d8cc7, 0x3f1e3725, 0x3f1ee0e1, 0x3f1f89fe, 0x3f20327a,
- 0x3f20da57, 0x3f218194, 0x3f222833, 0x3f22ce33, 0x3f237394, 0x3f241857, 0x3f24bc7d, 0x3f256006,
- 0x3f2602f1, 0x3f26a540, 0x3f2746f3, 0x3f27e80a, 0x3f288885, 0x3f292866, 0x3f29c7ac, 0x3f2a6658,
- 0x3f2b0469, 0x3f2ba1e2, 0x3f2c3ec1, 0x3f2cdb08, 0x3f2d76b6, 0x3f2e11cd, 0x3f2eac4c, 0x3f2f4635,
- 0x3f2fdf87, 0x3f307842, 0x3f311069, 0x3f31a7fa, 0x3f323ef6, 0x3f32d55e, 0x3f336b32, 0x3f340072,
- 0x3f349520, 0x3f35293b, 0x3f35bcc5, 0x3f364fbc, 0x3f36e223, 0x3f3773f9, 0x3f38053e, 0x3f3895f4,
- 0x3f39261b, 0x3f39b5b3, 0x3f3a44bc, 0x3f3ad338, 0x3f3b6127, 0x3f3bee89, 0x3f3c7b5e, 0x3f3d07a7,
- 0x3f3d9365, 0x3f3e1e99, 0x3f3ea941, 0x3f3f3360, 0x3f3fbcf5, 0x3f404602, 0x3f40ce86, 0x3f415682,
- 0x3f41ddf6, 0x3f4264e4, 0x3f42eb4b, 0x3f43712c, 0x3f43f687, 0x3f447b5e, 0x3f44ffb0, 0x3f45837e,
- 0x3f4606c9, 0x3f468990, 0x3f470bd5, 0x3f478d98, 0x3f480eda, 0x3f488f9b, 0x3f490fdb, 0x3f800000,
- 0x3f8164d2, 0x3f82cd87, 0x3f843a29, 0x3f85aac3, 0x3f871f62, 0x3f88980f, 0x3f8a14d5, 0x3f8b95c2,
- 0x3f8d1adf, 0x3f8ea43a, 0x3f9031dc, 0x3f91c3d3, 0x3f935a2b, 0x3f94f4f0, 0x3f96942d, 0x3f9837f0,
- 0x3f99e046, 0x3f9b8d3a, 0x3f9d3eda, 0x3f9ef532, 0x3fa0b051, 0x3fa27043, 0x3fa43516, 0x3fa5fed7,
- 0x3fa7cd94, 0x3fa9a15b, 0x3fab7a3a, 0x3fad583f, 0x3faf3b79, 0x3fb123f6, 0x3fb311c4, 0x3fb504f3,
- 0x3fb6fd92, 0x3fb8fbaf, 0x3fbaff5b, 0x3fbd08a4, 0x3fbf179a, 0x3fc12c4d, 0x3fc346cd, 0x3fc5672a,
- 0x3fc78d75, 0x3fc9b9be, 0x3fcbec15, 0x3fce248c, 0x3fd06334, 0x3fd2a81e, 0x3fd4f35b, 0x3fd744fd,
- 0x3fd99d16, 0x3fdbfbb8, 0x3fde60f5, 0x3fe0ccdf, 0x3fe33f89, 0x3fe5b907, 0x3fe8396a, 0x3feac0c7,
- 0x3fed4f30, 0x3fefe4ba, 0x3ff28177, 0x3ff5257d, 0x3ff7d0df, 0x3ffa83b3, 0x3ffd3e0c, 0x40000000,
- 0x40000000, 0x3ffe03f8, 0x3ffc0fc1, 0x3ffa232d, 0x3ff83e10, 0x3ff6603e, 0x3ff4898d, 0x3ff2b9d6,
- 0x3ff0f0f1, 0x3fef2eb7, 0x3fed7304, 0x3febbdb3, 0x3fea0ea1, 0x3fe865ac, 0x3fe6c2b4, 0x3fe52598,
- 0x3fe38e39, 0x3fe1fc78, 0x3fe07038, 0x3fdee95c, 0x3fdd67c9, 0x3fdbeb62, 0x3fda740e, 0x3fd901b2,
- 0x3fd79436, 0x3fd62b81, 0x3fd4c77b, 0x3fd3680d, 0x3fd20d21, 0x3fd0b6a0, 0x3fcf6475, 0x3fce168a,
- 0x3fcccccd, 0x3fcb8728, 0x3fca4588, 0x3fc907da, 0x3fc7ce0c, 0x3fc6980c, 0x3fc565c8, 0x3fc43730,
- 0x3fc30c31, 0x3fc1e4bc, 0x3fc0c0c1, 0x3fbfa030, 0x3fbe82fa, 0x3fbd6910, 0x3fbc5264, 0x3fbb3ee7,
- 0x3fba2e8c, 0x3fb92144, 0x3fb81703, 0x3fb70fbb, 0x3fb60b61, 0x3fb509e7, 0x3fb40b41, 0x3fb30f63,
- 0x3fb21643, 0x3fb11fd4, 0x3fb02c0b, 0x3faf3ade, 0x3fae4c41, 0x3fad602b, 0x3fac7692, 0x3fab8f6a,
- 0x3faaaaab, 0x3fa9c84a, 0x3fa8e83f, 0x3fa80a81, 0x3fa72f05, 0x3fa655c4, 0x3fa57eb5, 0x3fa4a9cf,
- 0x3fa3d70a, 0x3fa3065e, 0x3fa237c3, 0x3fa16b31, 0x3fa0a0a1, 0x3f9fd80a, 0x3f9f1166, 0x3f9e4cad,
- 0x3f9d89d9, 0x3f9cc8e1, 0x3f9c09c1, 0x3f9b4c70, 0x3f9a90e8, 0x3f99d723, 0x3f991f1a, 0x3f9868c8,
- 0x3f97b426, 0x3f97012e, 0x3f964fda, 0x3f95a025, 0x3f94f209, 0x3f944581, 0x3f939a86, 0x3f92f114,
- 0x3f924925, 0x3f91a2b4, 0x3f90fdbc, 0x3f905a38, 0x3f8fb824, 0x3f8f177a, 0x3f8e7835, 0x3f8dda52,
- 0x3f8d3dcb, 0x3f8ca29c, 0x3f8c08c1, 0x3f8b7034, 0x3f8ad8f3, 0x3f8a42f8, 0x3f89ae41, 0x3f891ac7,
- 0x3f888889, 0x3f87f781, 0x3f8767ab, 0x3f86d905, 0x3f864b8a, 0x3f85bf37, 0x3f853408, 0x3f84a9fa,
- 0x3f842108, 0x3f839930, 0x3f83126f, 0x3f828cc0, 0x3f820821, 0x3f81848e, 0x3f810204, 0x3f808081,
- 0x3f800000, 0x00000000, 0x399f22b4, 0x3a1f22b4, 0x3a6eb40e, 0x3a9f22b4, 0x3ac6eb61, 0x3aeeb40e,
- 0x3b0b3e5d, 0x3b1f22b4, 0x3b33070a, 0x3b46eb61, 0x3b5b518e, 0x3b70f18f, 0x3b83e1c6, 0x3b8fe616,
- 0x3b9c87fd, 0x3ba9c9b6, 0x3bb7ad6f, 0x3bc6354a, 0x3bd56360, 0x3be539c1, 0x3bf5ba71, 0x3c0373b6,
- 0x3c0c6153, 0x3c15a705, 0x3c1f45be, 0x3c293e6b, 0x3c3391f7, 0x3c3e4149, 0x3c494d44, 0x3c54b6c9,
- 0x3c607eb4, 0x3c6ca5df, 0x3c792d22, 0x3c830aa9, 0x3c89af9f, 0x3c9085dc, 0x3c978dc6, 0x3c9ec7c2,
- 0x3ca63433, 0x3cadd37d, 0x3cb5a602, 0x3cbdac21, 0x3cc5e63a, 0x3cce54ac, 0x3cd6f7d5, 0x3cdfd010,
- 0x3ce8ddba, 0x3cf2212d, 0x3cfb9ac3, 0x3d02a56a, 0x3d0798dd, 0x3d0ca7e6, 0x3d11d2af, 0x3d171964,
- 0x3d1c7c30, 0x3d21fb3c, 0x3d2796b2, 0x3d2d4ebb, 0x3d332381, 0x3d39152b, 0x3d3f23e4, 0x3d454fd2,
- 0x3d4b991d, 0x3d51ffec, 0x3d588468, 0x3d5f26b6, 0x3d65e6fd, 0x3d6cc563, 0x3d73c20e, 0x3d7add24,
- 0x3d810b65, 0x3d84b793, 0x3d88732e, 0x3d8c3e48, 0x3d9018f4, 0x3d940344, 0x3d97fd49, 0x3d9c0715,
- 0x3da020ba, 0x3da44a4a, 0x3da883d6, 0x3daccd6f, 0x3db12727, 0x3db5910f, 0x3dba0b38, 0x3dbe95b3,
- 0x3dc33090, 0x3dc7dbe0, 0x3dcc97b4, 0x3dd1641d, 0x3dd6412b, 0x3ddb2eee, 0x3de02d76, 0x3de53cd4,
- 0x3dea5d18, 0x3def8e51, 0x3df4d090, 0x3dfa23e5, 0x3dff885e, 0x3e027f06, 0x3e05427f, 0x3e080ea2,
- 0x3e0ae377, 0x3e0dc104, 0x3e10a753, 0x3e13966a, 0x3e168e51, 0x3e198f0f, 0x3e1c98ac, 0x3e1fab30,
- 0x3e22c6a1, 0x3e25eb07, 0x3e29186a, 0x3e2c4ed0, 0x3e2f8e42, 0x3e32d6c5, 0x3e362862, 0x3e39831f,
- 0x3e3ce703, 0x3e405417, 0x3e43ca60, 0x3e4749e6, 0x3e4ad2af, 0x3e4e64c3, 0x3e520029, 0x3e55a4e7,
- 0x3e595305, 0x3e5d0a89, 0x3e60cb7a, 0x3e6495df, 0x3e6869be, 0x3e6c471f, 0x3e702e07, 0x3e741e7e,
- 0x3e78188b, 0x3e7c1c33, 0x3e8014bf, 0x3e822039, 0x3e84308b, 0x3e8645b8, 0x3e885fc3, 0x3e8a7eb0,
- 0x3e8ca281, 0x3e8ecb3b, 0x3e90f8df, 0x3e932b72, 0x3e9562f6, 0x3e979f6f, 0x3e99e0e0, 0x3e9c274c,
- 0x3e9e72b6, 0x3ea0c321, 0x3ea31890, 0x3ea57307, 0x3ea7d288, 0x3eaa3716, 0x3eaca0b6, 0x3eaf0f68,
- 0x3eb18332, 0x3eb3fc15, 0x3eb67a14, 0x3eb8fd34, 0x3ebb8576, 0x3ebe12de, 0x3ec0a56e, 0x3ec33d2a,
- 0x3ec5da14, 0x3ec87c30, 0x3ecb2380, 0x3ecdd008, 0x3ed081ca, 0x3ed338c9, 0x3ed5f508, 0x3ed8b68a,
- 0x3edb7d52, 0x3ede4963, 0x3ee11abf, 0x3ee3f169, 0x3ee6cd65, 0x3ee9aeb5, 0x3eec955b, 0x3eef815c,
- 0x3ef272b8, 0x3ef56974, 0x3ef86593, 0x3efb6716, 0x3efe6e00, 0x3f00bd2b, 0x3f02460c, 0x3f03d1a5,
- 0x3f055ff7, 0x3f06f104, 0x3f0884cd, 0x3f0a1b54, 0x3f0bb499, 0x3f0d509f, 0x3f0eef65, 0x3f1090ef,
- 0x3f12353d, 0x3f13dc50, 0x3f15862a, 0x3f1732cc, 0x3f18e237, 0x3f1a946e, 0x3f1c4970, 0x3f1e0140,
- 0x3f1fbbde, 0x3f21794d, 0x3f23398c, 0x3f24fc9f, 0x3f26c285, 0x3f288b41, 0x3f2a56d2, 0x3f2c253c,
- 0x3f2df67f, 0x3f2fca9c, 0x3f31a194, 0x3f337b6a, 0x3f35581d, 0x3f3737b0, 0x3f391a24, 0x3f3aff7a,
- 0x3f3ce7b2, 0x3f3ed2cf, 0x3f40c0d2, 0x3f42b1bc, 0x3f44a58e, 0x3f469c49, 0x3f4895ef, 0x3f4a9280,
- 0x3f4c91ff, 0x3f4e946c, 0x3f5099c9, 0x3f52a216, 0x3f54ad56, 0x3f56bb88, 0x3f58ccaf, 0x3f5ae0cc,
- 0x3f5cf7df, 0x3f5f11ea, 0x3f612eef, 0x3f634eee, 0x3f6571e9, 0x3f6797e0, 0x3f69c0d5, 0x3f6becca,
- 0x3f6e1bbf, 0x3f704db5, 0x3f7282ae, 0x3f74baab, 0x3f76f5ae, 0x3f7933b6, 0x3f7b74c6, 0x3f7db8de,
- 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000a2,
- 0x000003e6, 0x00000036, 0x00000393, 0x00000244, 0x00000054, 0x0000029f, 0x00000309, 0x00000357,
- 0x00000347, 0x00000353, 0x00000137, 0x000001c0, 0x0000036d, 0x00000229, 0x00000166, 0x0000013c,
- 0x0000010e, 0x00000104, 0x0000007f, 0x00000251, 0x0000018e, 0x000002bd, 0x000003ae, 0x000003c5,
- 0x00000186, 0x00000372, 0x0000011b, 0x0000023a, 0x00000109, 0x000000dd, 0x000000b8, 0x00000006,
- 0x00000124, 0x000002ee, 0x00000282, 0x000001d1, 0x00000248, 0x000001cf, 0x00000387, 0x000001eb,
- 0x00000072, 0x00000312, 0x00000269, 0x0000033e, 0x000003a2, 0x00000023, 0x0000017d, 0x0000012e,
- 0x000002ed, 0x00000048, 0x0000013a, 0x0000019c, 0x000001c0, 0x0000026b, 0x00000117, 0x0000037e,
- 0x00000104, 0x00000399, 0x00000075, 0x00000239, 0x0000020d, 0x00000133, 0x0000027d, 0x0000009c,
- 0x00000211, 0x000001f8, 0x000002ef, 0x000001f9, 0x000000a0, 0x000003b1, 0x000003fe, 0x00000097,
- 0x000003ff, 0x000001e0, 0x00000166, 0x0000000f, 0x000003bc, 0x000002f1, 0x00000062, 0x0000035a,
- 0x00000029, 0x000002d1, 0x000003db, 0x00000136, 0x000001fb, 0x000000f2, 0x000001f2, 0x00000309,
- 0x000002dd, 0x000000f4, 0x0000018f, 0x00000366, 0x00000279, 0x000001fe, 0x0000028b, 0x00000175,
- 0x0000009e, 0x000003ac, 0x000001fa, 0x000003e5, 0x000003c5, 0x000003b3, 0x00000341, 0x00000339,
- 0x000003de, 0x000000a5, 0x000000a4, 0x000002ea, 0x000001af, 0x000003b5, 0x000003ec, 0x0000011f,
- 0x00000235, 0x000001d0, 0x00000215, 0x00000203, 0x000000c1, 0x0000006f, 0x0000031e, 0xc11bf1e0,
- 0x7421580c, 0x7ec47e35, 0x4ba9afed, 0xe7de294a, 0xc5ecf41c, 0xeb1faf97, 0xa8b5d49e, 0xfd9a797f,
- 0x26dd3d18, 0xfb3c9f2c, 0xb47db4d9, 0x462d6829, 0x603fbcbc, 0x5fff7816, 0xa0ec7fe2, 0x7e2ef7e4,
- 0xe7d27211, 0x58e60d4c, 0xf904e647, 0xc09ad17d, 0x1213a671, 0xd7d4baed, 0x9cfba208, 0xac72c4a6,
- 0x4873f877, 0xbba82746, 0x4b801924, 0xb8e90937, 0x1586dc91, 0x8eaf7aef, 0x4107f945, 0x5664f10e,
- 0x77036d8a, 0x5f47d4d3, 0x54a7f09d, 0x0db93910, 0x00028be6, 0x00000000, 0x00000000, 0x00000000};
-
-#endif // TABLES_HPP_
diff --git a/rocclr/runtime/device/cpu/cpuvirtual.cpp b/rocclr/runtime/device/cpu/cpuvirtual.cpp
deleted file mode 100644
index 806cee2ed2..0000000000
--- a/rocclr/runtime/device/cpu/cpuvirtual.cpp
+++ /dev/null
@@ -1,534 +0,0 @@
-//
-// Copyright 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#include "device/cpu/cpuvirtual.hpp"
-#include "device/cpu/cpudevice.hpp"
-#include "device/cpu/cpucommand.hpp"
-#include "device/blit.hpp"
-#include "platform/command.hpp"
-#include "platform/commandqueue.hpp"
-#include "platform/memory.hpp"
-#include "platform/sampler.hpp"
-#include "os/os.hpp"
-#include
-
-namespace cpu {
-
-amd::Atomic VirtualCPU::numWorkerThreads_(0);
-
-VirtualCPU::VirtualCPU(Device& device) : device::VirtualDevice(device), acceptingCommands_(false) {
- const size_t numCores = device.info().maxComputeUnits_;
-
- if ((numWorkerThreads_ += numCores) >= Device::getMaxWorkerThreadsNumber()) {
- numWorkerThreads_ -= numCores;
- cores_ = NULL;
- return;
- }
-
- cores_ = new (std::nothrow) WorkerThread*[numCores];
- if (cores_ == NULL) {
- return;
- }
-
- // Clear memory for the worker threads
- memset(cores_, 0, numCores * sizeof(WorkerThread*));
-
-#if defined(__linux__)
- const bool isNuma =
-#if defined(NUMA_SUPPORT)
- device.getNumaMask() == NULL;
-#else
- false;
-#endif // NUMA_SUPPORT
- const amd::Os::ThreadAffinityMask* affinityMask = isNuma ? NULL :
-#else
- const amd::Os::ThreadAffinityMask* affinityMask =
-#endif
- device.getWorkerThreadsAffinity();
-
- uint coreId = affinityMask != NULL ? affinityMask->getFirstSet() : (uint)-1;
-
- for (size_t i = 0; i < numCores; ++i) {
- WorkerThread* thread = cores_[i] = new WorkerThread(device);
- if (thread == NULL) {
- for (size_t j = 0; j < i; ++j) {
- cores_[j]->resume();
- }
- return;
- }
-
- if (thread->state() != amd::Thread::INITIALIZED) {
- return;
- }
-
-#if defined(__linux__)
- if (!isNuma) {
- if (coreId == (uint)-1) {
- thread->setAffinity((uint)i);
- } else {
- thread->setAffinity(coreId);
- coreId = affinityMask->getNextSet(coreId);
- }
- }
-#else // On Windows we set an affinity mask and not a specific ID.
- if (coreId != (uint)-1) {
- thread->setAffinity(*affinityMask);
- }
-#endif
- thread->start();
- }
-
- blitMgr_ = new device::HostBlitManager(*this);
- if ((NULL == blitMgr_) || !blitMgr_->create(device)) {
- LogError("Could not create BlitManager!");
- return;
- }
-
- acceptingCommands_ = true;
-}
-
-VirtualCPU::~VirtualCPU() {
- if (cores_ == NULL) {
- return;
- }
-
- delete blitMgr_;
-
- const size_t numCores = device().info().maxComputeUnits_;
- for (size_t i = 0; i < numCores; ++i) {
- delete cores_[i];
- }
- numWorkerThreads_ -= numCores;
- delete[] cores_;
-}
-
-bool VirtualCPU::terminate() {
- if (cores_ == NULL) {
- return true;
- }
-
- const size_t numCores = device().info().maxComputeUnits_;
- for (size_t i = 0; i < numCores; ++i) {
- if (cores_[i]) {
- cores_[i]->terminate();
- }
- }
- return true;
-}
-
-void VirtualCPU::submitReadMemory(amd::ReadMemoryCommand& vcmd) {
- vcmd.setStatus(CL_RUNNING);
-
- bool result = false;
- device::Memory memory(vcmd.source());
-
- // Ensure memory up-to-date
- vcmd.source().cacheWriteBack();
-
- switch (vcmd.type()) {
- case CL_COMMAND_READ_BUFFER:
- result = blitMgr().readBuffer(memory, vcmd.destination(), vcmd.origin(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
- case CL_COMMAND_READ_BUFFER_RECT:
- result = blitMgr().readBufferRect(memory, vcmd.destination(), vcmd.bufRect(), vcmd.hostRect(),
- vcmd.size(), vcmd.isEntireMemory());
- break;
- case CL_COMMAND_READ_IMAGE:
- result = blitMgr().readImage(memory, vcmd.destination(), vcmd.origin(), vcmd.size(),
- vcmd.rowPitch(), vcmd.slicePitch(), vcmd.isEntireMemory());
- break;
- default:
- LogError("Unsupported type for the read command");
- break;
- }
-
- if (!result) {
- LogError("submitReadMemory failed!");
- vcmd.setStatus(CL_INVALID_OPERATION);
- } else {
- vcmd.setStatus(CL_COMPLETE);
- }
-}
-
-void VirtualCPU::submitWriteMemory(amd::WriteMemoryCommand& vcmd) {
- vcmd.setStatus(CL_RUNNING);
-
- bool result = false;
- device::Memory memory(vcmd.destination());
-
- // Ensure memory up-to-date
- vcmd.destination().cacheWriteBack();
-
- // Process different write commands
- switch (vcmd.type()) {
- case CL_COMMAND_WRITE_BUFFER:
- result = blitMgr().writeBuffer(vcmd.source(), memory, vcmd.origin(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
- case CL_COMMAND_WRITE_BUFFER_RECT:
- result = blitMgr().writeBufferRect(vcmd.source(), memory, vcmd.hostRect(), vcmd.bufRect(),
- vcmd.size(), vcmd.isEntireMemory());
- break;
- case CL_COMMAND_WRITE_IMAGE:
- result = blitMgr().writeImage(vcmd.source(), memory, vcmd.origin(), vcmd.size(),
- vcmd.rowPitch(), vcmd.slicePitch(), vcmd.isEntireMemory());
- break;
- default:
- LogError("Unsupported type for the write command");
- break;
- }
-
- // Mark cache as clean (CPU works directly on backing store)
- vcmd.destination().signalWrite(NULL);
-
- if (!result) {
- LogError("submitWriteMemory failed!");
- vcmd.setStatus(CL_INVALID_OPERATION);
- } else {
- vcmd.setStatus(CL_COMPLETE);
- }
-}
-
-
-void VirtualCPU::submitCopyMemory(amd::CopyMemoryCommand& vcmd) {
- vcmd.setStatus(CL_RUNNING);
-
- // Ensure memory up-to-date
- vcmd.source().cacheWriteBack();
- vcmd.destination().cacheWriteBack();
-
- // Translate memory references and ensure cache up-to-date
- device::Memory dstMemory(vcmd.destination());
- device::Memory srcMemory(vcmd.source());
-
- bool result = false;
-
- // Check if HW can be used for memory copy
- switch (vcmd.type()) {
- case CL_COMMAND_COPY_BUFFER:
- result = blitMgr().copyBuffer(srcMemory, dstMemory, vcmd.srcOrigin(), vcmd.dstOrigin(),
- vcmd.size(), vcmd.isEntireMemory());
- break;
- case CL_COMMAND_COPY_BUFFER_RECT:
- result = blitMgr().copyBufferRect(srcMemory, dstMemory, vcmd.srcRect(), vcmd.dstRect(),
- vcmd.size(), vcmd.isEntireMemory());
- break;
- case CL_COMMAND_COPY_IMAGE_TO_BUFFER:
- result = blitMgr().copyImageToBuffer(srcMemory, dstMemory, vcmd.srcOrigin(), vcmd.dstOrigin(),
- vcmd.size(), vcmd.isEntireMemory());
- break;
- case CL_COMMAND_COPY_BUFFER_TO_IMAGE:
- result = blitMgr().copyBufferToImage(srcMemory, dstMemory, vcmd.srcOrigin(), vcmd.dstOrigin(),
- vcmd.size(), vcmd.isEntireMemory());
- break;
- case CL_COMMAND_COPY_IMAGE:
- result = blitMgr().copyImage(srcMemory, dstMemory, vcmd.srcOrigin(), vcmd.dstOrigin(),
- vcmd.size(), vcmd.isEntireMemory());
- break;
- default:
- LogError("Unsupported command type for memory copy!");
- break;
- }
-
- // Mark cache as clean (CPU works directly on backing store)
- vcmd.destination().signalWrite(NULL);
-
- if (!result) {
- LogError("submitCopyMemory failed!");
- vcmd.setStatus(CL_INVALID_OPERATION);
- } else {
- vcmd.setStatus(CL_COMPLETE);
- }
-}
-
-void VirtualCPU::submitMapMemory(amd::MapMemoryCommand& cmd) {
- cmd.setStatus(CL_RUNNING);
-
- if (cmd.mapFlags() & CL_MAP_READ || cmd.mapFlags() & CL_MAP_WRITE) {
- LogInfo("cpu::VirtualCPU::submitMapMemory() CL_MAP_READ and CL_MAP_WRITE ignored");
- }
-
- // Ensure memory up-to-date
- cmd.memory().cacheWriteBack();
-
- cmd.setStatus(CL_COMPLETE);
-}
-
-void VirtualCPU::submitUnmapMemory(amd::UnmapMemoryCommand& cmd) {
- cmd.setStatus(CL_RUNNING);
-
- // Mark cache as clean (CPU works directly on backing store)
- cmd.memory().signalWrite(NULL);
-
- //! @todo:dgladdin: strictly speaking we should check that the mem object was mapped
- cmd.setStatus(CL_COMPLETE);
-}
-
-void VirtualCPU::submitFillMemory(amd::FillMemoryCommand& vcmd) {
- vcmd.setStatus(CL_RUNNING);
-
- device::Memory memory(vcmd.memory());
-
- vcmd.memory().cacheWriteBack();
-
- bool result = false;
-
- // Find the the right fill operation
- switch (vcmd.type()) {
- case CL_COMMAND_FILL_BUFFER:
- result = blitMgr().fillBuffer(memory, vcmd.pattern(), vcmd.patternSize(), vcmd.origin(),
- vcmd.size(), vcmd.isEntireMemory());
- break;
- case CL_COMMAND_FILL_IMAGE:
- result = blitMgr().fillImage(memory, vcmd.pattern(), vcmd.origin(), vcmd.size(),
- vcmd.isEntireMemory());
- break;
- default:
- LogError("Unsupported command type for FillMemory!");
- break;
- }
-
- vcmd.memory().signalWrite(NULL);
-
- if (!result) {
- LogError("submitFillMemory failed!");
- vcmd.setStatus(CL_INVALID_OPERATION);
- } else {
- vcmd.setStatus(CL_COMPLETE);
- }
-}
-
-//! Helper function for forcing a cache sync for all kernel parameters
-static void syncAllParams(amd::NDRangeKernelCommand& cmd) {
- const amd::Kernel& kernel = cmd.kernel();
- const amd::KernelParameters& kernelParam = kernel.parameters();
- const amd::KernelSignature& signature = kernel.signature();
- const amd::Device& device = cmd.queue()->device();
-
- for (size_t i = 0; i < signature.numParameters(); ++i) {
- const amd::KernelParameterDescriptor& desc = signature.at(i);
- if (desc.type_ == T_POINTER && desc.size_ > 0 &&
- !kernelParam.boundToSvmPointer(device, cmd.parameters(), i)) {
- address ptr = (address)(cmd.parameters() + desc.offset_);
- amd::Memory* memArg = *(amd::Memory**)ptr;
-
- if (memArg != NULL) {
- memArg->cacheWriteBack();
- memArg->signalWrite(NULL);
- }
- }
- }
-}
-
-void VirtualCPU::computeLocalSizes(amd::NDRangeKernelCommand& command, amd::NDRange& local) {
- bool uniformSize =
- (OPENCL_MAJOR < 2) || command.kernel().getDeviceKernel(device())->getUniformWorkGroupSize();
-
- const amd::NDRangeContainer& sizes = command.sizes();
- const size_t numCores = device().info().maxComputeUnits_;
-
- const size_t globalSize1D = sizes.global().product();
- const size_t targetNumOperations = std::min(globalSize1D, numCores * 4);
- size_t localSize1D =
- std::min(globalSize1D / targetNumOperations, device().info().maxWorkGroupSize_);
-
- for (size_t i = 0; i < local.dimensions(); ++i) {
- const size_t globalSize = sizes.global()[i];
- size_t localSize =
- std::min(std::min(localSize1D, globalSize), device().info().maxWorkItemSizes_[i]);
-
- // local must exactly divide global if uniform size is required
- // For non uniform size, we could use the work group size hint
- if (uniformSize && globalSize % localSize != 0) {
- while (true) {
- //! @todo: lmoriche: find a better way
- if (globalSize % localSize == 0) break;
- --localSize;
- }
- }
- local[i] = localSize;
- localSize1D /= localSize;
- }
-
- command.setLocalWorkSize(local);
-}
-
-
-static amd::NDRange computeRemainders(const amd::NDRange& global, const amd::NDRange& local) {
- amd::NDRange remainders(local.dimensions());
-
- for (size_t i = 0; i < local.dimensions(); ++i) {
- remainders[i] = (global[i] % local[i] != 0) ? 1 : 0;
- }
-
- return remainders;
-}
-
-void VirtualCPU::submitKernel(amd::NDRangeKernelCommand& command) {
- const amd::NDRangeContainer& sizes = command.sizes();
- const size_t numCores = device().info().maxComputeUnits_;
-
- amd::NDRange local = sizes.local();
-
- if (local == 0) {
- computeLocalSizes(command, local);
- }
- amd::NDRange remainders = computeRemainders(sizes.global(), local);
-
- // number of groups in each dimensions
- const amd::NDRange numGroups = (sizes.global() / local) + remainders;
-
- size_t numOperations = numGroups.product();
- if (numOperations == 0) {
- command.setStatus(CL_COMPLETE);
- return;
- }
-
- syncAllParams(command);
- // retain the command here instead of retaining in NDRangeKernelBatch' ctor
- command.retain();
-
- size_t batchCount = std::min(numOperations, numCores);
- NDRangeKernelBatch batch(command, *this, numGroups, batchCount);
-
- Operation::Counter counter(command, batchCount);
- command.setData(&counter);
-
- for (size_t coreId = 0; coreId < batchCount; ++coreId) {
- batch.setCoreId(coreId);
- cores_[coreId]->enqueue(batch);
- cores_[coreId]->flush();
- }
-
- command.awaitCompletion();
- command.release();
-}
-
-void VirtualCPU::submitNativeFn(amd::NativeFnCommand& command) {
- NativeFn fn(command);
- cores_[0]->enqueue(fn);
- cores_[0]->flush();
- command.awaitCompletion();
-}
-
-void VirtualCPU::submitMarker(amd::Marker& command) { command.setStatus(CL_COMPLETE); }
-
-void VirtualCPU::submitAcquireExtObjects(amd::AcquireExtObjectsCommand& cmd) {
- //! @todo [odintsov]: create an AcquireExtObjectsOperation and enqueue it
- //! to a core when a core scheduler is around.
- //
- // cores_[0]->enqueue(new AcquireExtObjectsOperation(cmd));
- // the code below will be moved to AcquireExtObjectsOperation::execute()
- cmd.setStatus(CL_RUNNING);
-
- //
- // AcquireExtObjects execution starts here
- //
- bool bError = false;
-
- //! Go through ext objects by one and call member function to execute
- //! a sequence of external graphics API commands for each external object
- for (const auto& it : cmd.getMemList()) {
- if (it) {
- bError |= !(it->mapExtObjectInCQThread());
- }
- }
- if (bError) {
- cmd.setStatus(CL_INVALID_OPERATION);
- } else {
- cmd.setStatus(CL_COMPLETE);
- }
-}
-
-void VirtualCPU::submitReleaseExtObjects(amd::ReleaseExtObjectsCommand& cmd) {
- //! @todo [odintsov]: create a ReleaseExtObjectsOperation and enqueue it
- //! to a core when a core scheduler is around.
- //
- // cores_[i]->enqueue(new ReleaseExtObjectsOperation(cmd));
- // the code below will be moved to ReleaseExtObjectsOperation::execute()
- cmd.setStatus(CL_RUNNING);
-
- bool bError = false;
-
- for (const auto& it : cmd.getMemList()) {
- if (it) {
- bError |= !(it->unmapExtObjectInCQThread());
- }
- }
- if (bError) {
- cmd.setStatus(CL_INVALID_OPERATION);
- } else {
- cmd.setStatus(CL_COMPLETE);
- }
-}
-
-void VirtualCPU::submitPerfCounter(amd::PerfCounterCommand& cmd) {
- cmd.setStatus(CL_RUNNING);
- LogError("We don't support HW perf counters on CPU");
- cmd.setStatus(CL_INVALID_OPERATION);
-}
-
-void VirtualCPU::submitThreadTraceMemObjects(amd::ThreadTraceMemObjectsCommand& cmd) {
- cmd.setStatus(CL_RUNNING);
- LogError("We don't support thread trace on CPU");
- cmd.setStatus(CL_INVALID_OPERATION);
-}
-
-void VirtualCPU::submitThreadTrace(amd::ThreadTraceCommand& cmd) {
- cmd.setStatus(CL_RUNNING);
- LogError("We don't support thread trace on CPU");
- cmd.setStatus(CL_INVALID_OPERATION);
-}
-
-void VirtualCPU::flush(amd::Command* list, bool wait) {
- amd::Command* head = list;
-
- // Release all commands from the link list
- while (head != NULL) {
- amd::Command* it = head->getNext();
- head->release();
- head = it;
- }
-}
-
-void VirtualCPU::submitSignal(amd::SignalCommand& cmd) { cmd.setStatus(CL_INVALID_OPERATION); }
-
-void VirtualCPU::submitMakeBuffersResident(amd::MakeBuffersResidentCommand& cmd) {
- cmd.setStatus(CL_INVALID_OPERATION);
-}
-
-void VirtualCPU::submitSvmFreeMemory(amd::SvmFreeMemoryCommand& cmd) {
- cmd.setStatus(CL_RUNNING);
- if (cmd.pfnFreeFunc() == NULL) {
- // pointers allocated using clSVMAlloc
- for (cl_uint i = 0; i < cmd.svmPointers().size(); i++) {
- amd::SvmBuffer::free(cmd.context(), cmd.svmPointers()[i]);
- }
- } else {
- cmd.pfnFreeFunc()(as_cl(cmd.queue()->asCommandQueue()), cmd.svmPointers().size(),
- (void**)(&(cmd.svmPointers()[0])), cmd.userData());
- }
- cmd.setStatus(CL_COMPLETE);
-}
-
-void VirtualCPU::submitSvmCopyMemory(amd::SvmCopyMemoryCommand& cmd) {
- cmd.setStatus(CL_RUNNING);
- amd::SvmBuffer::memFill(cmd.dst(), cmd.src(), cmd.srcSize(), 1);
- cmd.setStatus(CL_COMPLETE);
-}
-
-void VirtualCPU::submitSvmFillMemory(amd::SvmFillMemoryCommand& cmd) {
- cmd.setStatus(CL_RUNNING);
- amd::SvmBuffer::memFill(cmd.dst(), cmd.pattern(), cmd.patternSize(), cmd.times());
- cmd.setStatus(CL_COMPLETE);
-}
-
-void VirtualCPU::submitSvmMapMemory(amd::SvmMapMemoryCommand& cmd) { cmd.setStatus(CL_COMPLETE); }
-
-void VirtualCPU::submitSvmUnmapMemory(amd::SvmUnmapMemoryCommand& cmd) {
- cmd.setStatus(CL_COMPLETE);
-}
-
-} // namespace cpu
diff --git a/rocclr/runtime/device/cpu/cpuvirtual.hpp b/rocclr/runtime/device/cpu/cpuvirtual.hpp
deleted file mode 100644
index 2f30cee28e..0000000000
--- a/rocclr/runtime/device/cpu/cpuvirtual.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// Copyright (c) 2011 Advanced Micro Devices, Inc. All rights reserved.
-//
-
-#ifndef CPUVIRTUAL_HPP_
-#define CPUVIRTUAL_HPP_
-
-#include "top.hpp"
-#include "device/device.hpp"
-#include "thread/atomic.hpp"
-#include "thread/thread.hpp"
-#include "platform/ndrange.hpp"
-
-//! \namespace cpu CPU Device Implementation
-namespace cpu {
-
-class WorkerThread;
-class Device;
-
-class VirtualCPU : public device::VirtualDevice {
- private:
- WorkerThread** cores_; //!< Pointer to array of Worker threads
- static amd::Atomic numWorkerThreads_; //!< Current Worker Threads number
- bool acceptingCommands_;
-
- public:
- VirtualCPU(cpu::Device& device);
- ~VirtualCPU();
- bool terminate();
-
- WorkerThread* getWorkerThread(size_t id) { return cores_[id]; }
-
- bool acceptingCommands() const { return acceptingCommands_; }
-
- virtual void submitReadMemory(amd::ReadMemoryCommand& command);
- virtual void submitWriteMemory(amd::WriteMemoryCommand& command);
- virtual void submitCopyMemory(amd::CopyMemoryCommand& command);
- virtual void submitCopyMemoryP2P(amd::CopyMemoryP2PCommand& command) {}
- virtual void submitMapMemory(amd::MapMemoryCommand& command);
- virtual void submitUnmapMemory(amd::UnmapMemoryCommand& command);
- virtual void submitKernel(amd::NDRangeKernelCommand& command);
- virtual void submitNativeFn(amd::NativeFnCommand& command);
- virtual void submitMarker(amd::Marker& command);
- virtual void submitFillMemory(amd::FillMemoryCommand& command);
- virtual void submitMigrateMemObjects(amd::MigrateMemObjectsCommand& cmd) {}
- virtual void submitAcquireExtObjects(amd::AcquireExtObjectsCommand& cmd);
- virtual void submitReleaseExtObjects(amd::ReleaseExtObjectsCommand& cmd);
- virtual void submitPerfCounter(amd::PerfCounterCommand& cmd);
- virtual void submitThreadTraceMemObjects(amd::ThreadTraceMemObjectsCommand& cmd);
- virtual void submitThreadTrace(amd::ThreadTraceCommand& cmd);
- virtual void flush(amd::Command* list = NULL, bool wait = false);
- virtual void submitSignal(amd::SignalCommand& cmd);
- virtual void submitMakeBuffersResident(amd::MakeBuffersResidentCommand& cmd);
- virtual void submitSvmFreeMemory(amd::SvmFreeMemoryCommand& cmd);
- virtual void submitSvmCopyMemory(amd::SvmCopyMemoryCommand& cmd);
- virtual void submitSvmFillMemory(amd::SvmFillMemoryCommand& cmd);
- virtual void submitSvmMapMemory(amd::SvmMapMemoryCommand& cmd);
- virtual void submitSvmUnmapMemory(amd::SvmUnmapMemoryCommand& cmd);
-
- virtual void computeLocalSizes(amd::NDRangeKernelCommand& command, amd::NDRange& local);
-
- static bool fillImage(amd::Image& image, address fillMem, const void* pattern,
- const amd::Coord3D& origin, const amd::Coord3D& region, size_t rowPitch,
- size_t slicePitch, size_t elementSize);
-};
-
-} // namespace cpu
-
-#endif // CPUVIRTUAL_HPP_