aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <tschwinge@baylibre.com>2024-03-22 09:58:02 +0100
committerThomas Schwinge <tschwinge@baylibre.com>2024-03-22 09:58:02 +0100
commit000c6d0a37b729c62d89f924bd6152b593bd39b9 (patch)
treea79a5eefdb6c5d477c19854f5f4fea54d0737443
parent59bc3e7924ed9dc293a77e3d9c6cdd99c252eefb (diff)
parent78dff4c25c1b959e4682d7da50d00fb371849a46 (diff)
downloadgcc-000c6d0a37b729c62d89f924bd6152b593bd39b9.zip
gcc-000c6d0a37b729c62d89f924bd6152b593bd39b9.tar.gz
gcc-000c6d0a37b729c62d89f924bd6152b593bd39b9.tar.bz2
Merge commit 'cde6f1085b7027f6a42fdb71c786d422606a8765^' into HEAD
-rw-r--r--contrib/ChangeLog25
-rwxr-xr-xcontrib/analyze_brprob.py2
-rwxr-xr-xcontrib/analyze_brprob_spec.py2
-rwxr-xr-xcontrib/check-params-in-docs.py2
-rwxr-xr-xcontrib/check_GNU_style.py2
-rwxr-xr-xcontrib/check_GNU_style_lib.py2
-rwxr-xr-xcontrib/filter-clang-warnings.py2
-rwxr-xr-xcontrib/gcc-changelog/git_check_commit.py2
-rwxr-xr-xcontrib/gcc-changelog/git_commit.py2
-rwxr-xr-xcontrib/gcc-changelog/git_email.py2
-rwxr-xr-xcontrib/gcc-changelog/git_repository.py2
-rwxr-xr-xcontrib/gcc-changelog/git_update_version.py2
-rwxr-xr-xcontrib/gcc-changelog/test_email.py2
-rwxr-xr-xcontrib/gen_autofdo_event.py2
-rwxr-xr-xcontrib/mark_spam.py2
-rw-r--r--contrib/unicode/GraphemeBreakProperty.txt1475
-rw-r--r--contrib/unicode/README12
-rw-r--r--contrib/unicode/emoji-data.txt1320
-rwxr-xr-xcontrib/unicode/gen-box-drawing-chars.py2
-rwxr-xr-xcontrib/unicode/gen-combining-chars.py2
-rwxr-xr-xcontrib/unicode/gen-printable-chars.py2
-rwxr-xr-xcontrib/unicode/gen_libstdcxx_unicode_data.py222
-rwxr-xr-xcontrib/unicode/gen_wcwidth.py4
-rw-r--r--gcc/ChangeLog596
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/analyzer/ChangeLog33
-rw-r--r--gcc/asan.cc6
-rw-r--r--gcc/c-family/ChangeLog4
-rw-r--r--gcc/config/aarch64/aarch64-ldp-fusion.cc9
-rw-r--r--gcc/config/aarch64/aarch64.cc15
-rw-r--r--gcc/config/aarch64/aarch64.opt7
-rw-r--r--gcc/config/alpha/alpha.cc5
-rw-r--r--gcc/config/arm/aout.h2
-rw-r--r--gcc/config/arm/arm.cc2
-rw-r--r--gcc/config/arm/neon.md49
-rw-r--r--gcc/config/bfin/bfin.h16
-rw-r--r--gcc/config/c6x/c6x.h2
-rw-r--r--gcc/config/gcn/gcn.cc5
-rw-r--r--gcc/config/gcn/mkoffload.cc52
-rw-r--r--gcc/config/h8300/h8300.h2
-rw-r--r--gcc/config/i386/i386-features.cc364
-rw-r--r--gcc/config/i386/i386.cc2
-rw-r--r--gcc/config/i386/i386.opt3
-rw-r--r--gcc/config/ia64/ia64.cc5
-rw-r--r--gcc/config/loongarch/lasx.md35
-rw-r--r--gcc/config/loongarch/loongarch.cc19
-rw-r--r--gcc/config/loongarch/lsx.md26
-rw-r--r--gcc/config/loongarch/predicates.md16
-rw-r--r--gcc/config/mcore/mcore-elf.h2
-rw-r--r--gcc/config/microblaze/microblaze.cc3
-rw-r--r--gcc/config/mips/mips.cc19
-rw-r--r--gcc/config/pa/pa.cc3
-rw-r--r--gcc/config/riscv/riscv-protos.h1
-rw-r--r--gcc/config/riscv/riscv-v.cc28
-rw-r--r--gcc/config/riscv/riscv-vector-costs.cc63
-rw-r--r--gcc/config/riscv/riscv-vsetvl.cc21
-rw-r--r--gcc/config/riscv/riscv.cc2
-rw-r--r--gcc/config/riscv/vector.md13
-rw-r--r--gcc/config/rs6000/rs6000.cc4
-rw-r--r--gcc/config/s390/s390.cc2
-rw-r--r--gcc/cp/ChangeLog22
-rw-r--r--gcc/cp/module.cc9
-rw-r--r--gcc/cp/parser.cc100
-rw-r--r--gcc/d/ChangeLog5
-rw-r--r--gcc/defaults.h2
-rw-r--r--gcc/doc/extend.texi6
-rw-r--r--gcc/doc/invoke.texi25
-rw-r--r--gcc/final.cc3
-rw-r--r--gcc/fortran/ChangeLog12
-rw-r--r--gcc/fortran/iresolve.cc10
-rw-r--r--gcc/gimple-match-head.cc20
-rw-r--r--gcc/go/ChangeLog5
-rw-r--r--gcc/internal-fn.cc15
-rw-r--r--gcc/lto/ChangeLog5
-rw-r--r--gcc/m2/ChangeLog5
-rw-r--r--gcc/match.pd6
-rw-r--r--gcc/options-urls-cc-gen.awk2
-rw-r--r--gcc/output.h4
-rwxr-xr-xgcc/regenerate-opt-urls.py2
-rw-r--r--gcc/rust/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog431
-rw-r--r--gcc/testsuite/g++.dg/modules/init-5_a.C9
-rw-r--r--gcc/testsuite/g++.dg/modules/init-5_b.C10
-rw-r--r--gcc/testsuite/g++.dg/modules/mod-invalid-1.C7
-rw-r--r--gcc/testsuite/g++.dg/modules/part-8_a.C6
-rw-r--r--gcc/testsuite/g++.dg/modules/part-8_b.C6
-rw-r--r--gcc/testsuite/g++.dg/modules/part-8_c.C8
-rw-r--r--gcc/testsuite/g++.dg/modules/part-hdr-1_c.C2
-rw-r--r--gcc/testsuite/g++.dg/modules/part-mac-1_c.C2
-rw-r--r--gcc/testsuite/g++.dg/modules/using-11.h2
-rw-r--r--gcc/testsuite/g++.dg/modules/using-11_a.C9
-rw-r--r--gcc/testsuite/g++.dg/modules/using-11_b.C8
-rw-r--r--gcc/testsuite/g++.dg/pr113217.C15
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c3
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr106537-1.c6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr106537-2.c6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr106537-3.c6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr113201.c15
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20230630-3.c2
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20230630-4.c2
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr109938.c1
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr109986.c1
-rw-r--r--gcc/testsuite/gcc.dg/builtin-bswap-13.c4
-rw-r--r--gcc/testsuite/gcc.dg/builtin-bswap-14.c4
-rw-r--r--gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c1
-rw-r--r--gcc/testsuite/gcc.dg/builtin-object-size-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/builtin-object-size-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/builtin-object-size-3.c4
-rw-r--r--gcc/testsuite/gcc.dg/builtin-object-size-4.c4
-rw-r--r--gcc/testsuite/gcc.dg/c23-constexpr-9.c1
-rw-r--r--gcc/testsuite/gcc.dg/c23-nullptr-1.c1
-rw-r--r--gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c4
-rw-r--r--gcc/testsuite/gcc.dg/fma-3.c2
-rw-r--r--gcc/testsuite/gcc.dg/fma-4.c2
-rw-r--r--gcc/testsuite/gcc.dg/fma-6.c2
-rw-r--r--gcc/testsuite/gcc.dg/fma-7.c2
-rw-r--r--gcc/testsuite/gcc.dg/fold-ior-4.c1
-rw-r--r--gcc/testsuite/gcc.dg/fold-ior-5.c1
-rw-r--r--gcc/testsuite/gcc.dg/fold-parity-5.c1
-rw-r--r--gcc/testsuite/gcc.dg/fold-popcount-5.c1
-rw-r--r--gcc/testsuite/gcc.dg/loop-unswitch-10.c1
-rw-r--r--gcc/testsuite/gcc.dg/loop-unswitch-11.c1
-rw-r--r--gcc/testsuite/gcc.dg/loop-unswitch-14.c1
-rw-r--r--gcc/testsuite/gcc.dg/memchr-3.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr101836.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr101836_1.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr101836_2.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr101836_3.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr103207.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr103451.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr109977.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr110496.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr110506-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr110582.c1
-rw-r--r--gcc/testsuite/gcc.dg/pr111039.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr111070.c4
-rw-r--r--gcc/testsuite/gcc.dg/pr111599.c4
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr110838.c4
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr112282.c10
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/bitcmp-5.c3
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/bitcmp-6.c4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/bitops-bool-1.c14
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/cltz-complement-max.c4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/cltz-max.c4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-9.c1
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/negneg-3.c3
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/phi-opt-25b.c6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/popcount-max.c4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr111583-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr111583-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr55177-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-12.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c74
-rw-r--r--gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-14.c64
-rw-r--r--gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-82.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-83.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-12.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-23.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-early-break_2.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-early-break_7.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-early-break_75.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-early-break_77.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-early-break_82.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-early-break_88.c2
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c1
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c1
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr113104.c25
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1_run.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3_run.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/gather_load_6.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/gather_load_7.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_2.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_3.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_6.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_7.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_load_slp_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1_run.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2_run.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/pack_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/reduc_4.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/scatter_store_6.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/scatter_store_7.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/strided_load_3.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/strided_store_3.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_signed_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_unsigned_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/unpack_signed_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1_run.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vcond_11.c2
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/vcond_11_run.c2
-rw-r--r--gcc/testsuite/gcc.target/arm/vect-early-break-cbranch.c138
-rw-r--r--gcc/testsuite/gcc.target/avr/lra-cpymem_qi.c2
-rw-r--r--gcc/testsuite/gcc.target/avr/lra-elim.c2
-rw-r--r--gcc/testsuite/gcc.target/avr/pr112830.c2
-rw-r--r--gcc/testsuite/gcc.target/avr/pr46779-1.c2
-rw-r--r--gcc/testsuite/gcc.target/avr/pr46779-2.c2
-rw-r--r--gcc/testsuite/gcc.target/avr/pr86869.c3
-rw-r--r--gcc/testsuite/gcc.target/avr/pr89270.c3
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/addr-space-1-1.c4
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/addr-space-2-1.c4
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/builtins-2-flash.c4
-rw-r--r--gcc/testsuite/gcc.target/i386/pr113231.c8
-rw-r--r--gcc/testsuite/gcc.target/i386/pr90693-2.c33
-rw-r--r--gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c15
-rw-r--r--gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-xvpermi_q.c64
-rw-r--r--gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-xvpremi.c19
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-scalar-template.h5
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-1.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-2.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-3.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-4.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-1.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-2.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-3.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-4.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-1.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-2.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-3.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-4.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-1.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-2.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-3.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-4.c1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-2.h9
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-3.h81
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112694-1.c4
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/abs-template.h1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vneg-template.h1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vnot-template.h1
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/base/vf_avl-4.c13
-rw-r--r--gcc/testsuite/gcc.target/riscv/rvv/vsetvl/pr113248.c15
-rw-r--r--gcc/testsuite/gfortran.dg/bind_c_array_params_2.f904
-rw-r--r--gcc/testsuite/gfortran.dg/dtio_25.f902
-rw-r--r--gcc/testsuite/gfortran.dg/namelist_57.f902
-rw-r--r--gcc/testsuite/gfortran.dg/namelist_65.f902
-rw-r--r--gcc/testsuite/gfortran.dg/repeat_8.f90123
-rw-r--r--gcc/testsuite/gfortran.dg/vect/pr60510.f1
-rw-r--r--gcc/testsuite/lib/target-supports.exp224
-rw-r--r--gcc/tree-scalar-evolution.cc2
-rw-r--r--gcc/tree-ssa-math-opts.cc20
-rw-r--r--gcc/varasm.cc14
-rw-r--r--libbacktrace/Makefile.in2
-rw-r--r--libcpp/ChangeLog7
-rw-r--r--libgfortran/ChangeLog4
-rw-r--r--libgfortran/io/write.c2
-rw-r--r--libgm2/ChangeLog4
-rw-r--r--libgm2/libm2iso/RTco.cc2
-rw-r--r--libgomp/ChangeLog13
-rw-r--r--libgomp/Makefile.in2
-rwxr-xr-xlibgomp/configure2
-rw-r--r--libgomp/libgomp.texi169
-rw-r--r--libphobos/Makefile.in2
-rw-r--r--libphobos/libdruntime/Makefile.in2
-rw-r--r--libstdc++-v3/ChangeLog77
-rw-r--r--libstdc++-v3/include/Makefile.am2
-rw-r--r--libstdc++-v3/include/Makefile.in2
-rw-r--r--libstdc++-v3/include/bits/char_traits.h16
-rw-r--r--libstdc++-v3/include/bits/chrono_io.h15
-rw-r--r--libstdc++-v3/include/bits/locale_classes.tcc5
-rw-r--r--libstdc++-v3/include/bits/unicode-data.h449
-rw-r--r--libstdc++-v3/include/bits/unicode.h1065
-rw-r--r--libstdc++-v3/include/bits/version.def9
-rw-r--r--libstdc++-v3/include/bits/version.h141
-rw-r--r--libstdc++-v3/include/std/chrono79
-rw-r--r--libstdc++-v3/include/std/format182
-rw-r--r--libstdc++-v3/include/std/generator8
-rw-r--r--libstdc++-v3/include/std/ostream4
-rw-r--r--libstdc++-v3/include/std/print4
-rw-r--r--libstdc++-v3/include/std/type_traits34
-rw-r--r--libstdc++-v3/libsupc++/unwind-cxx.h2
-rw-r--r--libstdc++-v3/src/c++17/fs_path.cc34
-rw-r--r--libstdc++-v3/src/c++23/print.cc2
-rw-r--r--libstdc++-v3/src/libbacktrace/Makefile.in2
-rw-r--r--libstdc++-v3/testsuite/20_util/duration/io.cc3
-rw-r--r--libstdc++-v3/testsuite/20_util/is_trivially_destructible/value_v.cc40
-rw-r--r--libstdc++-v3/testsuite/20_util/variant/87619.cc2
-rw-r--r--libstdc++-v3/testsuite/21_strings/char_traits/requirements/113200.cc20
-rw-r--r--libstdc++-v3/testsuite/ext/unicode/view.cc102
-rw-r--r--libstdc++-v3/testsuite/std/format/arguments/args.cc26
-rw-r--r--libstdc++-v3/testsuite/std/format/arguments/args_neg.cc12
-rw-r--r--libstdc++-v3/testsuite/std/format/arguments/lwg3810.cc8
-rw-r--r--libstdc++-v3/testsuite/std/format/functions/format.cc100
-rw-r--r--libstdc++-v3/testsuite/std/format/functions/vformat_to.cc9
-rw-r--r--libstdc++-v3/testsuite/std/format/runtime_format.cc37
-rw-r--r--libstdc++-v3/testsuite/std/format/string.cc7
-rw-r--r--libstdc++-v3/testsuite/std/time/day/io.cc4
-rw-r--r--libstdc++-v3/testsuite/std/time/month/1.cc19
-rw-r--r--libstdc++-v3/testsuite/std/time/month/2.cc32
-rw-r--r--libstdc++-v3/testsuite/std/time/month/io.cc4
-rw-r--r--libstdc++-v3/testsuite/std/time/weekday/1.cc16
-rw-r--r--libstdc++-v3/testsuite/std/time/weekday/2.cc32
-rw-r--r--libstdc++-v3/testsuite/std/time/weekday/io.cc4
-rw-r--r--libstdc++-v3/testsuite/std/time/year/io.cc4
-rw-r--r--libstdc++-v3/testsuite/std/time/year_month_day/io.cc4
-rw-r--r--libstdc++-v3/testsuite/tr1/8_c_compatibility/cinttypes/functions.cc4
315 files changed, 8518 insertions, 969 deletions
diff --git a/contrib/ChangeLog b/contrib/ChangeLog
index 02de42f..bf16df8 100644
--- a/contrib/ChangeLog
+++ b/contrib/ChangeLog
@@ -1,3 +1,28 @@
+2024-01-05 Jonathan Wakely <jwakely@redhat.com>
+
+ * analyze_brprob.py: Remove stray text at end of comment.
+ * analyze_brprob_spec.py: Likewise.
+ * check-params-in-docs.py: Likewise.
+ * check_GNU_style.py: Likewise.
+ * check_GNU_style_lib.py: Likewise.
+ * filter-clang-warnings.py: Likewise.
+ * gcc-changelog/git_check_commit.py: Likewise.
+ * gcc-changelog/git_commit.py: Likewise.
+ * gcc-changelog/git_email.py: Likewise.
+ * gcc-changelog/git_repository.py: Likewise.
+ * gcc-changelog/git_update_version.py: Likewise.
+ * gcc-changelog/test_email.py: Likewise.
+ * gen_autofdo_event.py: Likewise.
+ * mark_spam.py: Likewise.
+ * unicode/gen-box-drawing-chars.py: Likewise.
+ * unicode/gen-combining-chars.py: Likewise.
+ * unicode/gen-printable-chars.py: Likewise.
+ * unicode/gen_wcwidth.py: Likewise.
+
+2024-01-05 Jonathan Wakely <jwakely@redhat.com>
+
+ * unicode/gen_wcwidth.py: Add sys.argv[0] to usage error.
+
2024-01-03 Jakub Jelinek <jakub@redhat.com>
* update-copyright.py (GenericFilter): Skip gpl_v3_without_node.texi.
diff --git a/contrib/analyze_brprob.py b/contrib/analyze_brprob.py
index a482b5a..ca42fa6 100755
--- a/contrib/analyze_brprob.py
+++ b/contrib/analyze_brprob.py
@@ -18,7 +18,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
#
#
#
diff --git a/contrib/analyze_brprob_spec.py b/contrib/analyze_brprob_spec.py
index 0ec5541..b8af7b9 100755
--- a/contrib/analyze_brprob_spec.py
+++ b/contrib/analyze_brprob_spec.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import sys
import os
diff --git a/contrib/check-params-in-docs.py b/contrib/check-params-in-docs.py
index 5da7a60..623c822 100755
--- a/contrib/check-params-in-docs.py
+++ b/contrib/check-params-in-docs.py
@@ -19,7 +19,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
#
#
#
diff --git a/contrib/check_GNU_style.py b/contrib/check_GNU_style.py
index 55e49a0..6b946a5 100755
--- a/contrib/check_GNU_style.py
+++ b/contrib/check_GNU_style.py
@@ -20,7 +20,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import argparse
import sys
diff --git a/contrib/check_GNU_style_lib.py b/contrib/check_GNU_style_lib.py
index 9f5851c..f1a120f 100755
--- a/contrib/check_GNU_style_lib.py
+++ b/contrib/check_GNU_style_lib.py
@@ -20,7 +20,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
#
# The script requires python packages, which can be installed via pip3
# like this:
diff --git a/contrib/filter-clang-warnings.py b/contrib/filter-clang-warnings.py
index eb14c56..6ae2a90 100755
--- a/contrib/filter-clang-warnings.py
+++ b/contrib/filter-clang-warnings.py
@@ -18,7 +18,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
#
#
#
diff --git a/contrib/gcc-changelog/git_check_commit.py b/contrib/gcc-changelog/git_check_commit.py
index 86a2105..8cca9f4 100755
--- a/contrib/gcc-changelog/git_check_commit.py
+++ b/contrib/gcc-changelog/git_check_commit.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import argparse
diff --git a/contrib/gcc-changelog/git_commit.py b/contrib/gcc-changelog/git_commit.py
index 282f526..87bec4e 100755
--- a/contrib/gcc-changelog/git_commit.py
+++ b/contrib/gcc-changelog/git_commit.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import difflib
import os
diff --git a/contrib/gcc-changelog/git_email.py b/contrib/gcc-changelog/git_email.py
index 2f94816..9d8e44e 100755
--- a/contrib/gcc-changelog/git_email.py
+++ b/contrib/gcc-changelog/git_email.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import os
import re
diff --git a/contrib/gcc-changelog/git_repository.py b/contrib/gcc-changelog/git_repository.py
index f61c521..03ec38c 100755
--- a/contrib/gcc-changelog/git_repository.py
+++ b/contrib/gcc-changelog/git_repository.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
from datetime import datetime
diff --git a/contrib/gcc-changelog/git_update_version.py b/contrib/gcc-changelog/git_update_version.py
index dd73a5b..92639ba 100755
--- a/contrib/gcc-changelog/git_update_version.py
+++ b/contrib/gcc-changelog/git_update_version.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import argparse
import datetime
diff --git a/contrib/gcc-changelog/test_email.py b/contrib/gcc-changelog/test_email.py
index 5b8c0be..57247f3 100755
--- a/contrib/gcc-changelog/test_email.py
+++ b/contrib/gcc-changelog/test_email.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import os
import tempfile
diff --git a/contrib/gen_autofdo_event.py b/contrib/gen_autofdo_event.py
index 8c0ef8b..4c20194 100755
--- a/contrib/gen_autofdo_event.py
+++ b/contrib/gen_autofdo_event.py
@@ -15,7 +15,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
# Run it with perf record -b -e EVENT program ...
# The Linux Kernel needs to support the PMU of the current CPU, and
diff --git a/contrib/mark_spam.py b/contrib/mark_spam.py
index 9bed790..393d362 100755
--- a/contrib/mark_spam.py
+++ b/contrib/mark_spam.py
@@ -18,7 +18,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
#
#
#
diff --git a/contrib/unicode/GraphemeBreakProperty.txt b/contrib/unicode/GraphemeBreakProperty.txt
new file mode 100644
index 0000000..12453cb
--- /dev/null
+++ b/contrib/unicode/GraphemeBreakProperty.txt
@@ -0,0 +1,1475 @@
+# GraphemeBreakProperty-15.1.0.txt
+# Date: 2023-01-05, 20:34:41 GMT
+# © 2023 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
+#
+# Unicode Character Database
+# For documentation, see https://www.unicode.org/reports/tr44/
+
+# ================================================
+
+# Property: Grapheme_Cluster_Break
+
+# All code points not explicitly listed for Grapheme_Cluster_Break
+# have the value Other (XX).
+
+# @missing: 0000..10FFFF; Other
+
+# ================================================
+
+0600..0605 ; Prepend # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE
+06DD ; Prepend # Cf ARABIC END OF AYAH
+070F ; Prepend # Cf SYRIAC ABBREVIATION MARK
+0890..0891 ; Prepend # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE
+08E2 ; Prepend # Cf ARABIC DISPUTED END OF AYAH
+0D4E ; Prepend # Lo MALAYALAM LETTER DOT REPH
+110BD ; Prepend # Cf KAITHI NUMBER SIGN
+110CD ; Prepend # Cf KAITHI NUMBER SIGN ABOVE
+111C2..111C3 ; Prepend # Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA
+1193F ; Prepend # Lo DIVES AKURU PREFIXED NASAL SIGN
+11941 ; Prepend # Lo DIVES AKURU INITIAL RA
+11A3A ; Prepend # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA
+11A84..11A89 ; Prepend # Lo [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA
+11D46 ; Prepend # Lo MASARAM GONDI REPHA
+11F02 ; Prepend # Lo KAWI SIGN REPHA
+
+# Total code points: 27
+
+# ================================================
+
+000D ; CR # Cc <control-000D>
+
+# Total code points: 1
+
+# ================================================
+
+000A ; LF # Cc <control-000A>
+
+# Total code points: 1
+
+# ================================================
+
+0000..0009 ; Control # Cc [10] <control-0000>..<control-0009>
+000B..000C ; Control # Cc [2] <control-000B>..<control-000C>
+000E..001F ; Control # Cc [18] <control-000E>..<control-001F>
+007F..009F ; Control # Cc [33] <control-007F>..<control-009F>
+00AD ; Control # Cf SOFT HYPHEN
+061C ; Control # Cf ARABIC LETTER MARK
+180E ; Control # Cf MONGOLIAN VOWEL SEPARATOR
+200B ; Control # Cf ZERO WIDTH SPACE
+200E..200F ; Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2028 ; Control # Zl LINE SEPARATOR
+2029 ; Control # Zp PARAGRAPH SEPARATOR
+202A..202E ; Control # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+2060..2064 ; Control # Cf [5] WORD JOINER..INVISIBLE PLUS
+2065 ; Control # Cn <reserved-2065>
+2066..206F ; Control # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES
+FEFF ; Control # Cf ZERO WIDTH NO-BREAK SPACE
+FFF0..FFF8 ; Control # Cn [9] <reserved-FFF0>..<reserved-FFF8>
+FFF9..FFFB ; Control # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+13430..1343F ; Control # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE
+1BCA0..1BCA3 ; Control # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
+1D173..1D17A ; Control # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+E0000 ; Control # Cn <reserved-E0000>
+E0001 ; Control # Cf LANGUAGE TAG
+E0002..E001F ; Control # Cn [30] <reserved-E0002>..<reserved-E001F>
+E0080..E00FF ; Control # Cn [128] <reserved-E0080>..<reserved-E00FF>
+E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+
+# Total code points: 3893
+
+# ================================================
+
+0300..036F ; Extend # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+0483..0487 ; Extend # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488..0489 ; Extend # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+0591..05BD ; Extend # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BF ; Extend # Mn HEBREW POINT RAFE
+05C1..05C2 ; Extend # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4..05C5 ; Extend # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C7 ; Extend # Mn HEBREW POINT QAMATS QATAN
+0610..061A ; Extend # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+064B..065F ; Extend # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW
+0670 ; Extend # Mn ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC ; Extend # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DF..06E4 ; Extend # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E7..06E8 ; Extend # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED ; Extend # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+0711 ; Extend # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..074A ; Extend # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0 ; Extend # Mn [11] THAANA ABAFILI..THAANA SUKUN
+07EB..07F3 ; Extend # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07FD ; Extend # Mn NKO DANTAYALAN
+0816..0819 ; Extend # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH
+081B..0823 ; Extend # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A
+0825..0827 ; Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
+0829..082D ; Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
+0859..085B ; Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK
+0898..089F ; Extend # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA
+08CA..08E1 ; Extend # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA
+08E3..0902 ; Extend # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA
+093A ; Extend # Mn DEVANAGARI VOWEL SIGN OE
+093C ; Extend # Mn DEVANAGARI SIGN NUKTA
+0941..0948 ; Extend # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+094D ; Extend # Mn DEVANAGARI SIGN VIRAMA
+0951..0957 ; Extend # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE
+0962..0963 ; Extend # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981 ; Extend # Mn BENGALI SIGN CANDRABINDU
+09BC ; Extend # Mn BENGALI SIGN NUKTA
+09BE ; Extend # Mc BENGALI VOWEL SIGN AA
+09C1..09C4 ; Extend # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09CD ; Extend # Mn BENGALI SIGN VIRAMA
+09D7 ; Extend # Mc BENGALI AU LENGTH MARK
+09E2..09E3 ; Extend # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09FE ; Extend # Mn BENGALI SANDHI MARK
+0A01..0A02 ; Extend # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A3C ; Extend # Mn GURMUKHI SIGN NUKTA
+0A41..0A42 ; Extend # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48 ; Extend # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D ; Extend # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51 ; Extend # Mn GURMUKHI SIGN UDAAT
+0A70..0A71 ; Extend # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A75 ; Extend # Mn GURMUKHI SIGN YAKASH
+0A81..0A82 ; Extend # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0ABC ; Extend # Mn GUJARATI SIGN NUKTA
+0AC1..0AC5 ; Extend # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8 ; Extend # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0ACD ; Extend # Mn GUJARATI SIGN VIRAMA
+0AE2..0AE3 ; Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AFA..0AFF ; Extend # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE
+0B01 ; Extend # Mn ORIYA SIGN CANDRABINDU
+0B3C ; Extend # Mn ORIYA SIGN NUKTA
+0B3E ; Extend # Mc ORIYA VOWEL SIGN AA
+0B3F ; Extend # Mn ORIYA VOWEL SIGN I
+0B41..0B44 ; Extend # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B4D ; Extend # Mn ORIYA SIGN VIRAMA
+0B55..0B56 ; Extend # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK
+0B57 ; Extend # Mc ORIYA AU LENGTH MARK
+0B62..0B63 ; Extend # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B82 ; Extend # Mn TAMIL SIGN ANUSVARA
+0BBE ; Extend # Mc TAMIL VOWEL SIGN AA
+0BC0 ; Extend # Mn TAMIL VOWEL SIGN II
+0BCD ; Extend # Mn TAMIL SIGN VIRAMA
+0BD7 ; Extend # Mc TAMIL AU LENGTH MARK
+0C00 ; Extend # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
+0C04 ; Extend # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE
+0C3C ; Extend # Mn TELUGU SIGN NUKTA
+0C3E..0C40 ; Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C46..0C48 ; Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D ; Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56 ; Extend # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C62..0C63 ; Extend # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C81 ; Extend # Mn KANNADA SIGN CANDRABINDU
+0CBC ; Extend # Mn KANNADA SIGN NUKTA
+0CBF ; Extend # Mn KANNADA VOWEL SIGN I
+0CC2 ; Extend # Mc KANNADA VOWEL SIGN UU
+0CC6 ; Extend # Mn KANNADA VOWEL SIGN E
+0CCC..0CCD ; Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6 ; Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CE2..0CE3 ; Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0D00..0D01 ; Extend # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU
+0D3B..0D3C ; Extend # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA
+0D3E ; Extend # Mc MALAYALAM VOWEL SIGN AA
+0D41..0D44 ; Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D4D ; Extend # Mn MALAYALAM SIGN VIRAMA
+0D57 ; Extend # Mc MALAYALAM AU LENGTH MARK
+0D62..0D63 ; Extend # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D81 ; Extend # Mn SINHALA SIGN CANDRABINDU
+0DCA ; Extend # Mn SINHALA SIGN AL-LAKUNA
+0DCF ; Extend # Mc SINHALA VOWEL SIGN AELA-PILLA
+0DD2..0DD4 ; Extend # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6 ; Extend # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DDF ; Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA
+0E31 ; Extend # Mn THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A ; Extend # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E47..0E4E ; Extend # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0EB1 ; Extend # Mn LAO VOWEL SIGN MAI KAN
+0EB4..0EBC ; Extend # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO
+0EC8..0ECE ; Extend # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN
+0F18..0F19 ; Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35 ; Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37 ; Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39 ; Extend # Mn TIBETAN MARK TSA -PHRU
+0F71..0F7E ; Extend # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F80..0F84 ; Extend # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87 ; Extend # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F8D..0F97 ; Extend # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC ; Extend # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6 ; Extend # Mn TIBETAN SYMBOL PADMA GDAN
+102D..1030 ; Extend # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1032..1037 ; Extend # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1039..103A ; Extend # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103D..103E ; Extend # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+1058..1059 ; Extend # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105E..1060 ; Extend # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1071..1074 ; Extend # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1082 ; Extend # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1085..1086 ; Extend # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+108D ; Extend # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+109D ; Extend # Mn MYANMAR VOWEL SIGN AITON AI
+135D..135F ; Extend # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK
+1712..1714 ; Extend # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1732..1733 ; Extend # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
+1752..1753 ; Extend # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773 ; Extend # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B4..17B5 ; Extend # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B7..17BD ; Extend # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17C6 ; Extend # Mn KHMER SIGN NIKAHIT
+17C9..17D3 ; Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD ; Extend # Mn KHMER SIGN ATTHACAN
+180B..180D ; Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180F ; Extend # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR
+1885..1886 ; Extend # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
+18A9 ; Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922 ; Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1927..1928 ; Extend # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1932 ; Extend # Mn LIMBU SMALL LETTER ANUSVARA
+1939..193B ; Extend # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1A17..1A18 ; Extend # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A1B ; Extend # Mn BUGINESE VOWEL SIGN AE
+1A56 ; Extend # Mn TAI THAM CONSONANT SIGN MEDIAL LA
+1A58..1A5E ; Extend # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA
+1A60 ; Extend # Mn TAI THAM SIGN SAKOT
+1A62 ; Extend # Mn TAI THAM VOWEL SIGN MAI SAT
+1A65..1A6C ; Extend # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW
+1A73..1A7C ; Extend # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN
+1A7F ; Extend # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
+1AB0..1ABD ; Extend # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW
+1ABE ; Extend # Me COMBINING PARENTHESES OVERLAY
+1ABF..1ACE ; Extend # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T
+1B00..1B03 ; Extend # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B34 ; Extend # Mn BALINESE SIGN REREKAN
+1B35 ; Extend # Mc BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A ; Extend # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3C ; Extend # Mn BALINESE VOWEL SIGN LA LENGA
+1B42 ; Extend # Mn BALINESE VOWEL SIGN PEPET
+1B6B..1B73 ; Extend # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B80..1B81 ; Extend # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1BA2..1BA5 ; Extend # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA8..1BA9 ; Extend # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAB..1BAD ; Extend # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA
+1BE6 ; Extend # Mn BATAK SIGN TOMPI
+1BE8..1BE9 ; Extend # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE
+1BED ; Extend # Mn BATAK VOWEL SIGN KARO O
+1BEF..1BF1 ; Extend # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H
+1C2C..1C33 ; Extend # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C36..1C37 ; Extend # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1CD0..1CD2 ; Extend # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA
+1CD4..1CE0 ; Extend # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA
+1CE2..1CE8 ; Extend # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL
+1CED ; Extend # Mn VEDIC SIGN TIRYAK
+1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE
+1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
+1DC0..1DFF ; Extend # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+200C ; Extend # Cf ZERO WIDTH NON-JOINER
+20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0 ; Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1 ; Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4 ; Extend # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0 ; Extend # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+2CEF..2CF1 ; Extend # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS
+2D7F ; Extend # Mn TIFINAGH CONSONANT JOINER
+2DE0..2DFF ; Extend # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+302A..302D ; Extend # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK
+302E..302F ; Extend # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A ; Extend # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+A66F ; Extend # Mn COMBINING CYRILLIC VZMET
+A670..A672 ; Extend # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A674..A67D ; Extend # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK
+A69E..A69F ; Extend # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E
+A6F0..A6F1 ; Extend # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS
+A802 ; Extend # Mn SYLOTI NAGRI SIGN DVISVARA
+A806 ; Extend # Mn SYLOTI NAGRI SIGN HASANTA
+A80B ; Extend # Mn SYLOTI NAGRI SIGN ANUSVARA
+A825..A826 ; Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A82C ; Extend # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA
+A8C4..A8C5 ; Extend # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU
+A8E0..A8F1 ; Extend # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA
+A8FF ; Extend # Mn DEVANAGARI VOWEL SIGN AY
+A926..A92D ; Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A947..A951 ; Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A980..A982 ; Extend # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR
+A9B3 ; Extend # Mn JAVANESE SIGN CECAK TELU
+A9B6..A9B9 ; Extend # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT
+A9BC..A9BD ; Extend # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET
+A9E5 ; Extend # Mn MYANMAR SIGN SHAN SAW
+AA29..AA2E ; Extend # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA31..AA32 ; Extend # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA35..AA36 ; Extend # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA43 ; Extend # Mn CHAM CONSONANT SIGN FINAL NG
+AA4C ; Extend # Mn CHAM CONSONANT SIGN FINAL M
+AA7C ; Extend # Mn MYANMAR SIGN TAI LAING TONE-2
+AAB0 ; Extend # Mn TAI VIET MAI KANG
+AAB2..AAB4 ; Extend # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U
+AAB7..AAB8 ; Extend # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA
+AABE..AABF ; Extend # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK
+AAC1 ; Extend # Mn TAI VIET TONE MAI THO
+AAEC..AAED ; Extend # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI
+AAF6 ; Extend # Mn MEETEI MAYEK VIRAMA
+ABE5 ; Extend # Mn MEETEI MAYEK VOWEL SIGN ANAP
+ABE8 ; Extend # Mn MEETEI MAYEK VOWEL SIGN UNAP
+ABED ; Extend # Mn MEETEI MAYEK APUN IYEK
+FB1E ; Extend # Mn HEBREW POINT JUDEO-SPANISH VARIKA
+FE00..FE0F ; Extend # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE2F ; Extend # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF
+FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+101FD ; Extend # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+102E0 ; Extend # Mn COPTIC EPACT THOUSANDS MARK
+10376..1037A ; Extend # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII
+10A01..10A03 ; Extend # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06 ; Extend # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F ; Extend # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A38..10A3A ; Extend # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F ; Extend # Mn KHAROSHTHI VIRAMA
+10AE5..10AE6 ; Extend # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
+10D24..10D27 ; Extend # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
+10EAB..10EAC ; Extend # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
+10EFD..10EFF ; Extend # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA
+10F46..10F50 ; Extend # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
+10F82..10F85 ; Extend # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
+11001 ; Extend # Mn BRAHMI SIGN ANUSVARA
+11038..11046 ; Extend # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA
+11070 ; Extend # Mn BRAHMI SIGN OLD TAMIL VIRAMA
+11073..11074 ; Extend # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O
+1107F..11081 ; Extend # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA
+110B3..110B6 ; Extend # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
+110B9..110BA ; Extend # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+110C2 ; Extend # Mn KAITHI VOWEL SIGN VOCALIC R
+11100..11102 ; Extend # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA
+11127..1112B ; Extend # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
+1112D..11134 ; Extend # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
+11173 ; Extend # Mn MAHAJANI SIGN NUKTA
+11180..11181 ; Extend # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
+111B6..111BE ; Extend # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
+111C9..111CC ; Extend # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK
+111CF ; Extend # Mn SHARADA SIGN INVERTED CANDRABINDU
+1122F..11231 ; Extend # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI
+11234 ; Extend # Mn KHOJKI SIGN ANUSVARA
+11236..11237 ; Extend # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA
+1123E ; Extend # Mn KHOJKI SIGN SUKUN
+11241 ; Extend # Mn KHOJKI VOWEL SIGN VOCALIC R
+112DF ; Extend # Mn KHUDAWADI SIGN ANUSVARA
+112E3..112EA ; Extend # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA
+11300..11301 ; Extend # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU
+1133B..1133C ; Extend # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA
+1133E ; Extend # Mc GRANTHA VOWEL SIGN AA
+11340 ; Extend # Mn GRANTHA VOWEL SIGN II
+11357 ; Extend # Mc GRANTHA AU LENGTH MARK
+11366..1136C ; Extend # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX
+11370..11374 ; Extend # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA
+11438..1143F ; Extend # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI
+11442..11444 ; Extend # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA
+11446 ; Extend # Mn NEWA SIGN NUKTA
+1145E ; Extend # Mn NEWA SANDHI MARK
+114B0 ; Extend # Mc TIRHUTA VOWEL SIGN AA
+114B3..114B8 ; Extend # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL
+114BA ; Extend # Mn TIRHUTA VOWEL SIGN SHORT E
+114BD ; Extend # Mc TIRHUTA VOWEL SIGN SHORT O
+114BF..114C0 ; Extend # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA
+114C2..114C3 ; Extend # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA
+115AF ; Extend # Mc SIDDHAM VOWEL SIGN AA
+115B2..115B5 ; Extend # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR
+115BC..115BD ; Extend # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA
+115BF..115C0 ; Extend # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA
+115DC..115DD ; Extend # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU
+11633..1163A ; Extend # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI
+1163D ; Extend # Mn MODI SIGN ANUSVARA
+1163F..11640 ; Extend # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA
+116AB ; Extend # Mn TAKRI SIGN ANUSVARA
+116AD ; Extend # Mn TAKRI VOWEL SIGN AA
+116B0..116B5 ; Extend # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU
+116B7 ; Extend # Mn TAKRI SIGN NUKTA
+1171D..1171F ; Extend # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA
+11722..11725 ; Extend # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
+11727..1172B ; Extend # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER
+1182F..11837 ; Extend # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
+11839..1183A ; Extend # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
+11930 ; Extend # Mc DIVES AKURU VOWEL SIGN AA
+1193B..1193C ; Extend # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU
+1193E ; Extend # Mn DIVES AKURU VIRAMA
+11943 ; Extend # Mn DIVES AKURU SIGN NUKTA
+119D4..119D7 ; Extend # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR
+119DA..119DB ; Extend # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI
+119E0 ; Extend # Mn NANDINAGARI SIGN VIRAMA
+11A01..11A0A ; Extend # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
+11A33..11A38 ; Extend # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
+11A3B..11A3E ; Extend # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
+11A47 ; Extend # Mn ZANABAZAR SQUARE SUBJOINER
+11A51..11A56 ; Extend # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE
+11A59..11A5B ; Extend # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK
+11A8A..11A96 ; Extend # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA
+11A98..11A99 ; Extend # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
+11C30..11C36 ; Extend # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L
+11C38..11C3D ; Extend # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA
+11C3F ; Extend # Mn BHAIKSUKI SIGN VIRAMA
+11C92..11CA7 ; Extend # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA
+11CAA..11CB0 ; Extend # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA
+11CB2..11CB3 ; Extend # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E
+11CB5..11CB6 ; Extend # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU
+11D31..11D36 ; Extend # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R
+11D3A ; Extend # Mn MASARAM GONDI VOWEL SIGN E
+11D3C..11D3D ; Extend # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O
+11D3F..11D45 ; Extend # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA
+11D47 ; Extend # Mn MASARAM GONDI RA-KARA
+11D90..11D91 ; Extend # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
+11D95 ; Extend # Mn GUNJALA GONDI SIGN ANUSVARA
+11D97 ; Extend # Mn GUNJALA GONDI VIRAMA
+11EF3..11EF4 ; Extend # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
+11F00..11F01 ; Extend # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA
+11F36..11F3A ; Extend # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R
+11F40 ; Extend # Mn KAWI VOWEL SIGN EU
+11F42 ; Extend # Mn KAWI CONJOINER
+13440 ; Extend # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY
+13447..13455 ; Extend # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
+16AF0..16AF4 ; Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
+16B30..16B36 ; Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
+16F4F ; Extend # Mn MIAO SIGN CONSONANT MODIFIER BAR
+16F8F..16F92 ; Extend # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
+16FE4 ; Extend # Mn KHITAN SMALL SCRIPT FILLER
+1BC9D..1BC9E ; Extend # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK
+1CF00..1CF2D ; Extend # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT
+1CF30..1CF46 ; Extend # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG
+1D165 ; Extend # Mc MUSICAL SYMBOL COMBINING STEM
+1D167..1D169 ; Extend # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D16E..1D172 ; Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5
+1D17B..1D182 ; Extend # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B ; Extend # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD ; Extend # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+1D242..1D244 ; Extend # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1DA00..1DA36 ; Extend # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN
+1DA3B..1DA6C ; Extend # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT
+1DA75 ; Extend # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS
+1DA84 ; Extend # Mn SIGNWRITING LOCATION HEAD NECK
+1DA9B..1DA9F ; Extend # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6
+1DAA1..1DAAF ; Extend # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16
+1E000..1E006 ; Extend # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE
+1E008..1E018 ; Extend # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU
+1E01B..1E021 ; Extend # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI
+1E023..1E024 ; Extend # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
+1E026..1E02A ; Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
+1E08F ; Extend # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+1E130..1E136 ; Extend # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
+1E2AE ; Extend # Mn TOTO SIGN RISING TONE
+1E2EC..1E2EF ; Extend # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI
+1E4EC..1E4EF ; Extend # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH
+1E8D0..1E8D6 ; Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
+1E944..1E94A ; Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
+1F3FB..1F3FF ; Extend # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
+E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG
+E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 2130
+
+# ================================================
+
+1F1E6..1F1FF ; Regional_Indicator # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
+
+# Total code points: 26
+
+# ================================================
+
+0903 ; SpacingMark # Mc DEVANAGARI SIGN VISARGA
+093B ; SpacingMark # Mc DEVANAGARI VOWEL SIGN OOE
+093E..0940 ; SpacingMark # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0949..094C ; SpacingMark # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094E..094F ; SpacingMark # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW
+0982..0983 ; SpacingMark # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+09BF..09C0 ; SpacingMark # Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II
+09C7..09C8 ; SpacingMark # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC ; SpacingMark # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+0A03 ; SpacingMark # Mc GURMUKHI SIGN VISARGA
+0A3E..0A40 ; SpacingMark # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A83 ; SpacingMark # Mc GUJARATI SIGN VISARGA
+0ABE..0AC0 ; SpacingMark # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC9 ; SpacingMark # Mc GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC ; SpacingMark # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0B02..0B03 ; SpacingMark # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B40 ; SpacingMark # Mc ORIYA VOWEL SIGN II
+0B47..0B48 ; SpacingMark # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C ; SpacingMark # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0BBF ; SpacingMark # Mc TAMIL VOWEL SIGN I
+0BC1..0BC2 ; SpacingMark # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8 ; SpacingMark # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC ; SpacingMark # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0C01..0C03 ; SpacingMark # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C41..0C44 ; SpacingMark # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C82..0C83 ; SpacingMark # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0CBE ; SpacingMark # Mc KANNADA VOWEL SIGN AA
+0CC0..0CC1 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U
+0CC3..0CC4 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR
+0CC7..0CC8 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB ; SpacingMark # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CF3 ; SpacingMark # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
+0D02..0D03 ; SpacingMark # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D3F..0D40 ; SpacingMark # Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II
+0D46..0D48 ; SpacingMark # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C ; SpacingMark # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D82..0D83 ; SpacingMark # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0DD0..0DD1 ; SpacingMark # Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD8..0DDE ; SpacingMark # Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0DF2..0DF3 ; SpacingMark # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0E33 ; SpacingMark # Lo THAI CHARACTER SARA AM
+0EB3 ; SpacingMark # Lo LAO VOWEL SIGN AM
+0F3E..0F3F ; SpacingMark # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F7F ; SpacingMark # Mc TIBETAN SIGN RNAM BCAD
+1031 ; SpacingMark # Mc MYANMAR VOWEL SIGN E
+103B..103C ; SpacingMark # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+1056..1057 ; SpacingMark # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1084 ; SpacingMark # Mc MYANMAR VOWEL SIGN SHAN E
+1715 ; SpacingMark # Mc TAGALOG SIGN PAMUDPOD
+1734 ; SpacingMark # Mc HANUNOO SIGN PAMUDPOD
+17B6 ; SpacingMark # Mc KHMER VOWEL SIGN AA
+17BE..17C5 ; SpacingMark # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C7..17C8 ; SpacingMark # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+1923..1926 ; SpacingMark # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1929..192B ; SpacingMark # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; SpacingMark # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1933..1938 ; SpacingMark # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1A19..1A1A ; SpacingMark # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O
+1A55 ; SpacingMark # Mc TAI THAM CONSONANT SIGN MEDIAL RA
+1A57 ; SpacingMark # Mc TAI THAM CONSONANT SIGN LA TANG LAI
+1A6D..1A72 ; SpacingMark # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
+1B04 ; SpacingMark # Mc BALINESE SIGN BISAH
+1B3B ; SpacingMark # Mc BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3D..1B41 ; SpacingMark # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B43..1B44 ; SpacingMark # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B82 ; SpacingMark # Mc SUNDANESE SIGN PANGWISAD
+1BA1 ; SpacingMark # Mc SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA6..1BA7 ; SpacingMark # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BAA ; SpacingMark # Mc SUNDANESE SIGN PAMAAEH
+1BE7 ; SpacingMark # Mc BATAK VOWEL SIGN E
+1BEA..1BEC ; SpacingMark # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O
+1BEE ; SpacingMark # Mc BATAK VOWEL SIGN U
+1BF2..1BF3 ; SpacingMark # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN
+1C24..1C2B ; SpacingMark # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C34..1C35 ; SpacingMark # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1CE1 ; SpacingMark # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA
+1CF7 ; SpacingMark # Mc VEDIC SIGN ATIKRAMA
+A823..A824 ; SpacingMark # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A827 ; SpacingMark # Mc SYLOTI NAGRI VOWEL SIGN OO
+A880..A881 ; SpacingMark # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A8B4..A8C3 ; SpacingMark # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A952..A953 ; SpacingMark # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A983 ; SpacingMark # Mc JAVANESE SIGN WIGNYAN
+A9B4..A9B5 ; SpacingMark # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG
+A9BA..A9BB ; SpacingMark # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE
+A9BE..A9C0 ; SpacingMark # Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON
+AA2F..AA30 ; SpacingMark # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA33..AA34 ; SpacingMark # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA4D ; SpacingMark # Mc CHAM CONSONANT SIGN FINAL H
+AAEB ; SpacingMark # Mc MEETEI MAYEK VOWEL SIGN II
+AAEE..AAEF ; SpacingMark # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU
+AAF5 ; SpacingMark # Mc MEETEI MAYEK VOWEL SIGN VISARGA
+ABE3..ABE4 ; SpacingMark # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP
+ABE6..ABE7 ; SpacingMark # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP
+ABE9..ABEA ; SpacingMark # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG
+ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK
+11000 ; SpacingMark # Mc BRAHMI SIGN CANDRABINDU
+11002 ; SpacingMark # Mc BRAHMI SIGN VISARGA
+11082 ; SpacingMark # Mc KAITHI SIGN VISARGA
+110B0..110B2 ; SpacingMark # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
+110B7..110B8 ; SpacingMark # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+1112C ; SpacingMark # Mc CHAKMA VOWEL SIGN E
+11145..11146 ; SpacingMark # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
+11182 ; SpacingMark # Mc SHARADA SIGN VISARGA
+111B3..111B5 ; SpacingMark # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
+111BF..111C0 ; SpacingMark # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
+111CE ; SpacingMark # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E
+1122C..1122E ; SpacingMark # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II
+11232..11233 ; SpacingMark # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU
+11235 ; SpacingMark # Mc KHOJKI SIGN VIRAMA
+112E0..112E2 ; SpacingMark # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II
+11302..11303 ; SpacingMark # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA
+1133F ; SpacingMark # Mc GRANTHA VOWEL SIGN I
+11341..11344 ; SpacingMark # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR
+11347..11348 ; SpacingMark # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI
+1134B..1134D ; SpacingMark # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA
+11362..11363 ; SpacingMark # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL
+11435..11437 ; SpacingMark # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II
+11440..11441 ; SpacingMark # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU
+11445 ; SpacingMark # Mc NEWA SIGN VISARGA
+114B1..114B2 ; SpacingMark # Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II
+114B9 ; SpacingMark # Mc TIRHUTA VOWEL SIGN E
+114BB..114BC ; SpacingMark # Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O
+114BE ; SpacingMark # Mc TIRHUTA VOWEL SIGN AU
+114C1 ; SpacingMark # Mc TIRHUTA SIGN VISARGA
+115B0..115B1 ; SpacingMark # Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II
+115B8..115BB ; SpacingMark # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU
+115BE ; SpacingMark # Mc SIDDHAM SIGN VISARGA
+11630..11632 ; SpacingMark # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II
+1163B..1163C ; SpacingMark # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU
+1163E ; SpacingMark # Mc MODI SIGN VISARGA
+116AC ; SpacingMark # Mc TAKRI SIGN VISARGA
+116AE..116AF ; SpacingMark # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II
+116B6 ; SpacingMark # Mc TAKRI SIGN VIRAMA
+11726 ; SpacingMark # Mc AHOM VOWEL SIGN E
+1182C..1182E ; SpacingMark # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
+11838 ; SpacingMark # Mc DOGRA SIGN VISARGA
+11931..11935 ; SpacingMark # Mc [5] DIVES AKURU VOWEL SIGN I..DIVES AKURU VOWEL SIGN E
+11937..11938 ; SpacingMark # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O
+1193D ; SpacingMark # Mc DIVES AKURU SIGN HALANTA
+11940 ; SpacingMark # Mc DIVES AKURU MEDIAL YA
+11942 ; SpacingMark # Mc DIVES AKURU MEDIAL RA
+119D1..119D3 ; SpacingMark # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II
+119DC..119DF ; SpacingMark # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA
+119E4 ; SpacingMark # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E
+11A39 ; SpacingMark # Mc ZANABAZAR SQUARE SIGN VISARGA
+11A57..11A58 ; SpacingMark # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU
+11A97 ; SpacingMark # Mc SOYOMBO SIGN VISARGA
+11C2F ; SpacingMark # Mc BHAIKSUKI VOWEL SIGN AA
+11C3E ; SpacingMark # Mc BHAIKSUKI SIGN VISARGA
+11CA9 ; SpacingMark # Mc MARCHEN SUBJOINED LETTER YA
+11CB1 ; SpacingMark # Mc MARCHEN VOWEL SIGN I
+11CB4 ; SpacingMark # Mc MARCHEN VOWEL SIGN O
+11D8A..11D8E ; SpacingMark # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
+11D93..11D94 ; SpacingMark # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
+11D96 ; SpacingMark # Mc GUNJALA GONDI SIGN VISARGA
+11EF5..11EF6 ; SpacingMark # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
+11F03 ; SpacingMark # Mc KAWI SIGN VISARGA
+11F34..11F35 ; SpacingMark # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA
+11F3E..11F3F ; SpacingMark # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI
+11F41 ; SpacingMark # Mc KAWI SIGN KILLER
+16F51..16F87 ; SpacingMark # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI
+16FF0..16FF1 ; SpacingMark # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY
+1D166 ; SpacingMark # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D16D ; SpacingMark # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT
+
+# Total code points: 395
+
+# ================================================
+
+1100..115F ; L # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER
+A960..A97C ; L # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH
+
+# Total code points: 125
+
+# ================================================
+
+1160..11A7 ; V # Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE
+D7B0..D7C6 ; V # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E
+
+# Total code points: 95
+
+# ================================================
+
+11A8..11FF ; T # Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN
+D7CB..D7FB ; T # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH
+
+# Total code points: 137
+
+# ================================================
+
+AC00 ; LV # Lo HANGUL SYLLABLE GA
+AC1C ; LV # Lo HANGUL SYLLABLE GAE
+AC38 ; LV # Lo HANGUL SYLLABLE GYA
+AC54 ; LV # Lo HANGUL SYLLABLE GYAE
+AC70 ; LV # Lo HANGUL SYLLABLE GEO
+AC8C ; LV # Lo HANGUL SYLLABLE GE
+ACA8 ; LV # Lo HANGUL SYLLABLE GYEO
+ACC4 ; LV # Lo HANGUL SYLLABLE GYE
+ACE0 ; LV # Lo HANGUL SYLLABLE GO
+ACFC ; LV # Lo HANGUL SYLLABLE GWA
+AD18 ; LV # Lo HANGUL SYLLABLE GWAE
+AD34 ; LV # Lo HANGUL SYLLABLE GOE
+AD50 ; LV # Lo HANGUL SYLLABLE GYO
+AD6C ; LV # Lo HANGUL SYLLABLE GU
+AD88 ; LV # Lo HANGUL SYLLABLE GWEO
+ADA4 ; LV # Lo HANGUL SYLLABLE GWE
+ADC0 ; LV # Lo HANGUL SYLLABLE GWI
+ADDC ; LV # Lo HANGUL SYLLABLE GYU
+ADF8 ; LV # Lo HANGUL SYLLABLE GEU
+AE14 ; LV # Lo HANGUL SYLLABLE GYI
+AE30 ; LV # Lo HANGUL SYLLABLE GI
+AE4C ; LV # Lo HANGUL SYLLABLE GGA
+AE68 ; LV # Lo HANGUL SYLLABLE GGAE
+AE84 ; LV # Lo HANGUL SYLLABLE GGYA
+AEA0 ; LV # Lo HANGUL SYLLABLE GGYAE
+AEBC ; LV # Lo HANGUL SYLLABLE GGEO
+AED8 ; LV # Lo HANGUL SYLLABLE GGE
+AEF4 ; LV # Lo HANGUL SYLLABLE GGYEO
+AF10 ; LV # Lo HANGUL SYLLABLE GGYE
+AF2C ; LV # Lo HANGUL SYLLABLE GGO
+AF48 ; LV # Lo HANGUL SYLLABLE GGWA
+AF64 ; LV # Lo HANGUL SYLLABLE GGWAE
+AF80 ; LV # Lo HANGUL SYLLABLE GGOE
+AF9C ; LV # Lo HANGUL SYLLABLE GGYO
+AFB8 ; LV # Lo HANGUL SYLLABLE GGU
+AFD4 ; LV # Lo HANGUL SYLLABLE GGWEO
+AFF0 ; LV # Lo HANGUL SYLLABLE GGWE
+B00C ; LV # Lo HANGUL SYLLABLE GGWI
+B028 ; LV # Lo HANGUL SYLLABLE GGYU
+B044 ; LV # Lo HANGUL SYLLABLE GGEU
+B060 ; LV # Lo HANGUL SYLLABLE GGYI
+B07C ; LV # Lo HANGUL SYLLABLE GGI
+B098 ; LV # Lo HANGUL SYLLABLE NA
+B0B4 ; LV # Lo HANGUL SYLLABLE NAE
+B0D0 ; LV # Lo HANGUL SYLLABLE NYA
+B0EC ; LV # Lo HANGUL SYLLABLE NYAE
+B108 ; LV # Lo HANGUL SYLLABLE NEO
+B124 ; LV # Lo HANGUL SYLLABLE NE
+B140 ; LV # Lo HANGUL SYLLABLE NYEO
+B15C ; LV # Lo HANGUL SYLLABLE NYE
+B178 ; LV # Lo HANGUL SYLLABLE NO
+B194 ; LV # Lo HANGUL SYLLABLE NWA
+B1B0 ; LV # Lo HANGUL SYLLABLE NWAE
+B1CC ; LV # Lo HANGUL SYLLABLE NOE
+B1E8 ; LV # Lo HANGUL SYLLABLE NYO
+B204 ; LV # Lo HANGUL SYLLABLE NU
+B220 ; LV # Lo HANGUL SYLLABLE NWEO
+B23C ; LV # Lo HANGUL SYLLABLE NWE
+B258 ; LV # Lo HANGUL SYLLABLE NWI
+B274 ; LV # Lo HANGUL SYLLABLE NYU
+B290 ; LV # Lo HANGUL SYLLABLE NEU
+B2AC ; LV # Lo HANGUL SYLLABLE NYI
+B2C8 ; LV # Lo HANGUL SYLLABLE NI
+B2E4 ; LV # Lo HANGUL SYLLABLE DA
+B300 ; LV # Lo HANGUL SYLLABLE DAE
+B31C ; LV # Lo HANGUL SYLLABLE DYA
+B338 ; LV # Lo HANGUL SYLLABLE DYAE
+B354 ; LV # Lo HANGUL SYLLABLE DEO
+B370 ; LV # Lo HANGUL SYLLABLE DE
+B38C ; LV # Lo HANGUL SYLLABLE DYEO
+B3A8 ; LV # Lo HANGUL SYLLABLE DYE
+B3C4 ; LV # Lo HANGUL SYLLABLE DO
+B3E0 ; LV # Lo HANGUL SYLLABLE DWA
+B3FC ; LV # Lo HANGUL SYLLABLE DWAE
+B418 ; LV # Lo HANGUL SYLLABLE DOE
+B434 ; LV # Lo HANGUL SYLLABLE DYO
+B450 ; LV # Lo HANGUL SYLLABLE DU
+B46C ; LV # Lo HANGUL SYLLABLE DWEO
+B488 ; LV # Lo HANGUL SYLLABLE DWE
+B4A4 ; LV # Lo HANGUL SYLLABLE DWI
+B4C0 ; LV # Lo HANGUL SYLLABLE DYU
+B4DC ; LV # Lo HANGUL SYLLABLE DEU
+B4F8 ; LV # Lo HANGUL SYLLABLE DYI
+B514 ; LV # Lo HANGUL SYLLABLE DI
+B530 ; LV # Lo HANGUL SYLLABLE DDA
+B54C ; LV # Lo HANGUL SYLLABLE DDAE
+B568 ; LV # Lo HANGUL SYLLABLE DDYA
+B584 ; LV # Lo HANGUL SYLLABLE DDYAE
+B5A0 ; LV # Lo HANGUL SYLLABLE DDEO
+B5BC ; LV # Lo HANGUL SYLLABLE DDE
+B5D8 ; LV # Lo HANGUL SYLLABLE DDYEO
+B5F4 ; LV # Lo HANGUL SYLLABLE DDYE
+B610 ; LV # Lo HANGUL SYLLABLE DDO
+B62C ; LV # Lo HANGUL SYLLABLE DDWA
+B648 ; LV # Lo HANGUL SYLLABLE DDWAE
+B664 ; LV # Lo HANGUL SYLLABLE DDOE
+B680 ; LV # Lo HANGUL SYLLABLE DDYO
+B69C ; LV # Lo HANGUL SYLLABLE DDU
+B6B8 ; LV # Lo HANGUL SYLLABLE DDWEO
+B6D4 ; LV # Lo HANGUL SYLLABLE DDWE
+B6F0 ; LV # Lo HANGUL SYLLABLE DDWI
+B70C ; LV # Lo HANGUL SYLLABLE DDYU
+B728 ; LV # Lo HANGUL SYLLABLE DDEU
+B744 ; LV # Lo HANGUL SYLLABLE DDYI
+B760 ; LV # Lo HANGUL SYLLABLE DDI
+B77C ; LV # Lo HANGUL SYLLABLE RA
+B798 ; LV # Lo HANGUL SYLLABLE RAE
+B7B4 ; LV # Lo HANGUL SYLLABLE RYA
+B7D0 ; LV # Lo HANGUL SYLLABLE RYAE
+B7EC ; LV # Lo HANGUL SYLLABLE REO
+B808 ; LV # Lo HANGUL SYLLABLE RE
+B824 ; LV # Lo HANGUL SYLLABLE RYEO
+B840 ; LV # Lo HANGUL SYLLABLE RYE
+B85C ; LV # Lo HANGUL SYLLABLE RO
+B878 ; LV # Lo HANGUL SYLLABLE RWA
+B894 ; LV # Lo HANGUL SYLLABLE RWAE
+B8B0 ; LV # Lo HANGUL SYLLABLE ROE
+B8CC ; LV # Lo HANGUL SYLLABLE RYO
+B8E8 ; LV # Lo HANGUL SYLLABLE RU
+B904 ; LV # Lo HANGUL SYLLABLE RWEO
+B920 ; LV # Lo HANGUL SYLLABLE RWE
+B93C ; LV # Lo HANGUL SYLLABLE RWI
+B958 ; LV # Lo HANGUL SYLLABLE RYU
+B974 ; LV # Lo HANGUL SYLLABLE REU
+B990 ; LV # Lo HANGUL SYLLABLE RYI
+B9AC ; LV # Lo HANGUL SYLLABLE RI
+B9C8 ; LV # Lo HANGUL SYLLABLE MA
+B9E4 ; LV # Lo HANGUL SYLLABLE MAE
+BA00 ; LV # Lo HANGUL SYLLABLE MYA
+BA1C ; LV # Lo HANGUL SYLLABLE MYAE
+BA38 ; LV # Lo HANGUL SYLLABLE MEO
+BA54 ; LV # Lo HANGUL SYLLABLE ME
+BA70 ; LV # Lo HANGUL SYLLABLE MYEO
+BA8C ; LV # Lo HANGUL SYLLABLE MYE
+BAA8 ; LV # Lo HANGUL SYLLABLE MO
+BAC4 ; LV # Lo HANGUL SYLLABLE MWA
+BAE0 ; LV # Lo HANGUL SYLLABLE MWAE
+BAFC ; LV # Lo HANGUL SYLLABLE MOE
+BB18 ; LV # Lo HANGUL SYLLABLE MYO
+BB34 ; LV # Lo HANGUL SYLLABLE MU
+BB50 ; LV # Lo HANGUL SYLLABLE MWEO
+BB6C ; LV # Lo HANGUL SYLLABLE MWE
+BB88 ; LV # Lo HANGUL SYLLABLE MWI
+BBA4 ; LV # Lo HANGUL SYLLABLE MYU
+BBC0 ; LV # Lo HANGUL SYLLABLE MEU
+BBDC ; LV # Lo HANGUL SYLLABLE MYI
+BBF8 ; LV # Lo HANGUL SYLLABLE MI
+BC14 ; LV # Lo HANGUL SYLLABLE BA
+BC30 ; LV # Lo HANGUL SYLLABLE BAE
+BC4C ; LV # Lo HANGUL SYLLABLE BYA
+BC68 ; LV # Lo HANGUL SYLLABLE BYAE
+BC84 ; LV # Lo HANGUL SYLLABLE BEO
+BCA0 ; LV # Lo HANGUL SYLLABLE BE
+BCBC ; LV # Lo HANGUL SYLLABLE BYEO
+BCD8 ; LV # Lo HANGUL SYLLABLE BYE
+BCF4 ; LV # Lo HANGUL SYLLABLE BO
+BD10 ; LV # Lo HANGUL SYLLABLE BWA
+BD2C ; LV # Lo HANGUL SYLLABLE BWAE
+BD48 ; LV # Lo HANGUL SYLLABLE BOE
+BD64 ; LV # Lo HANGUL SYLLABLE BYO
+BD80 ; LV # Lo HANGUL SYLLABLE BU
+BD9C ; LV # Lo HANGUL SYLLABLE BWEO
+BDB8 ; LV # Lo HANGUL SYLLABLE BWE
+BDD4 ; LV # Lo HANGUL SYLLABLE BWI
+BDF0 ; LV # Lo HANGUL SYLLABLE BYU
+BE0C ; LV # Lo HANGUL SYLLABLE BEU
+BE28 ; LV # Lo HANGUL SYLLABLE BYI
+BE44 ; LV # Lo HANGUL SYLLABLE BI
+BE60 ; LV # Lo HANGUL SYLLABLE BBA
+BE7C ; LV # Lo HANGUL SYLLABLE BBAE
+BE98 ; LV # Lo HANGUL SYLLABLE BBYA
+BEB4 ; LV # Lo HANGUL SYLLABLE BBYAE
+BED0 ; LV # Lo HANGUL SYLLABLE BBEO
+BEEC ; LV # Lo HANGUL SYLLABLE BBE
+BF08 ; LV # Lo HANGUL SYLLABLE BBYEO
+BF24 ; LV # Lo HANGUL SYLLABLE BBYE
+BF40 ; LV # Lo HANGUL SYLLABLE BBO
+BF5C ; LV # Lo HANGUL SYLLABLE BBWA
+BF78 ; LV # Lo HANGUL SYLLABLE BBWAE
+BF94 ; LV # Lo HANGUL SYLLABLE BBOE
+BFB0 ; LV # Lo HANGUL SYLLABLE BBYO
+BFCC ; LV # Lo HANGUL SYLLABLE BBU
+BFE8 ; LV # Lo HANGUL SYLLABLE BBWEO
+C004 ; LV # Lo HANGUL SYLLABLE BBWE
+C020 ; LV # Lo HANGUL SYLLABLE BBWI
+C03C ; LV # Lo HANGUL SYLLABLE BBYU
+C058 ; LV # Lo HANGUL SYLLABLE BBEU
+C074 ; LV # Lo HANGUL SYLLABLE BBYI
+C090 ; LV # Lo HANGUL SYLLABLE BBI
+C0AC ; LV # Lo HANGUL SYLLABLE SA
+C0C8 ; LV # Lo HANGUL SYLLABLE SAE
+C0E4 ; LV # Lo HANGUL SYLLABLE SYA
+C100 ; LV # Lo HANGUL SYLLABLE SYAE
+C11C ; LV # Lo HANGUL SYLLABLE SEO
+C138 ; LV # Lo HANGUL SYLLABLE SE
+C154 ; LV # Lo HANGUL SYLLABLE SYEO
+C170 ; LV # Lo HANGUL SYLLABLE SYE
+C18C ; LV # Lo HANGUL SYLLABLE SO
+C1A8 ; LV # Lo HANGUL SYLLABLE SWA
+C1C4 ; LV # Lo HANGUL SYLLABLE SWAE
+C1E0 ; LV # Lo HANGUL SYLLABLE SOE
+C1FC ; LV # Lo HANGUL SYLLABLE SYO
+C218 ; LV # Lo HANGUL SYLLABLE SU
+C234 ; LV # Lo HANGUL SYLLABLE SWEO
+C250 ; LV # Lo HANGUL SYLLABLE SWE
+C26C ; LV # Lo HANGUL SYLLABLE SWI
+C288 ; LV # Lo HANGUL SYLLABLE SYU
+C2A4 ; LV # Lo HANGUL SYLLABLE SEU
+C2C0 ; LV # Lo HANGUL SYLLABLE SYI
+C2DC ; LV # Lo HANGUL SYLLABLE SI
+C2F8 ; LV # Lo HANGUL SYLLABLE SSA
+C314 ; LV # Lo HANGUL SYLLABLE SSAE
+C330 ; LV # Lo HANGUL SYLLABLE SSYA
+C34C ; LV # Lo HANGUL SYLLABLE SSYAE
+C368 ; LV # Lo HANGUL SYLLABLE SSEO
+C384 ; LV # Lo HANGUL SYLLABLE SSE
+C3A0 ; LV # Lo HANGUL SYLLABLE SSYEO
+C3BC ; LV # Lo HANGUL SYLLABLE SSYE
+C3D8 ; LV # Lo HANGUL SYLLABLE SSO
+C3F4 ; LV # Lo HANGUL SYLLABLE SSWA
+C410 ; LV # Lo HANGUL SYLLABLE SSWAE
+C42C ; LV # Lo HANGUL SYLLABLE SSOE
+C448 ; LV # Lo HANGUL SYLLABLE SSYO
+C464 ; LV # Lo HANGUL SYLLABLE SSU
+C480 ; LV # Lo HANGUL SYLLABLE SSWEO
+C49C ; LV # Lo HANGUL SYLLABLE SSWE
+C4B8 ; LV # Lo HANGUL SYLLABLE SSWI
+C4D4 ; LV # Lo HANGUL SYLLABLE SSYU
+C4F0 ; LV # Lo HANGUL SYLLABLE SSEU
+C50C ; LV # Lo HANGUL SYLLABLE SSYI
+C528 ; LV # Lo HANGUL SYLLABLE SSI
+C544 ; LV # Lo HANGUL SYLLABLE A
+C560 ; LV # Lo HANGUL SYLLABLE AE
+C57C ; LV # Lo HANGUL SYLLABLE YA
+C598 ; LV # Lo HANGUL SYLLABLE YAE
+C5B4 ; LV # Lo HANGUL SYLLABLE EO
+C5D0 ; LV # Lo HANGUL SYLLABLE E
+C5EC ; LV # Lo HANGUL SYLLABLE YEO
+C608 ; LV # Lo HANGUL SYLLABLE YE
+C624 ; LV # Lo HANGUL SYLLABLE O
+C640 ; LV # Lo HANGUL SYLLABLE WA
+C65C ; LV # Lo HANGUL SYLLABLE WAE
+C678 ; LV # Lo HANGUL SYLLABLE OE
+C694 ; LV # Lo HANGUL SYLLABLE YO
+C6B0 ; LV # Lo HANGUL SYLLABLE U
+C6CC ; LV # Lo HANGUL SYLLABLE WEO
+C6E8 ; LV # Lo HANGUL SYLLABLE WE
+C704 ; LV # Lo HANGUL SYLLABLE WI
+C720 ; LV # Lo HANGUL SYLLABLE YU
+C73C ; LV # Lo HANGUL SYLLABLE EU
+C758 ; LV # Lo HANGUL SYLLABLE YI
+C774 ; LV # Lo HANGUL SYLLABLE I
+C790 ; LV # Lo HANGUL SYLLABLE JA
+C7AC ; LV # Lo HANGUL SYLLABLE JAE
+C7C8 ; LV # Lo HANGUL SYLLABLE JYA
+C7E4 ; LV # Lo HANGUL SYLLABLE JYAE
+C800 ; LV # Lo HANGUL SYLLABLE JEO
+C81C ; LV # Lo HANGUL SYLLABLE JE
+C838 ; LV # Lo HANGUL SYLLABLE JYEO
+C854 ; LV # Lo HANGUL SYLLABLE JYE
+C870 ; LV # Lo HANGUL SYLLABLE JO
+C88C ; LV # Lo HANGUL SYLLABLE JWA
+C8A8 ; LV # Lo HANGUL SYLLABLE JWAE
+C8C4 ; LV # Lo HANGUL SYLLABLE JOE
+C8E0 ; LV # Lo HANGUL SYLLABLE JYO
+C8FC ; LV # Lo HANGUL SYLLABLE JU
+C918 ; LV # Lo HANGUL SYLLABLE JWEO
+C934 ; LV # Lo HANGUL SYLLABLE JWE
+C950 ; LV # Lo HANGUL SYLLABLE JWI
+C96C ; LV # Lo HANGUL SYLLABLE JYU
+C988 ; LV # Lo HANGUL SYLLABLE JEU
+C9A4 ; LV # Lo HANGUL SYLLABLE JYI
+C9C0 ; LV # Lo HANGUL SYLLABLE JI
+C9DC ; LV # Lo HANGUL SYLLABLE JJA
+C9F8 ; LV # Lo HANGUL SYLLABLE JJAE
+CA14 ; LV # Lo HANGUL SYLLABLE JJYA
+CA30 ; LV # Lo HANGUL SYLLABLE JJYAE
+CA4C ; LV # Lo HANGUL SYLLABLE JJEO
+CA68 ; LV # Lo HANGUL SYLLABLE JJE
+CA84 ; LV # Lo HANGUL SYLLABLE JJYEO
+CAA0 ; LV # Lo HANGUL SYLLABLE JJYE
+CABC ; LV # Lo HANGUL SYLLABLE JJO
+CAD8 ; LV # Lo HANGUL SYLLABLE JJWA
+CAF4 ; LV # Lo HANGUL SYLLABLE JJWAE
+CB10 ; LV # Lo HANGUL SYLLABLE JJOE
+CB2C ; LV # Lo HANGUL SYLLABLE JJYO
+CB48 ; LV # Lo HANGUL SYLLABLE JJU
+CB64 ; LV # Lo HANGUL SYLLABLE JJWEO
+CB80 ; LV # Lo HANGUL SYLLABLE JJWE
+CB9C ; LV # Lo HANGUL SYLLABLE JJWI
+CBB8 ; LV # Lo HANGUL SYLLABLE JJYU
+CBD4 ; LV # Lo HANGUL SYLLABLE JJEU
+CBF0 ; LV # Lo HANGUL SYLLABLE JJYI
+CC0C ; LV # Lo HANGUL SYLLABLE JJI
+CC28 ; LV # Lo HANGUL SYLLABLE CA
+CC44 ; LV # Lo HANGUL SYLLABLE CAE
+CC60 ; LV # Lo HANGUL SYLLABLE CYA
+CC7C ; LV # Lo HANGUL SYLLABLE CYAE
+CC98 ; LV # Lo HANGUL SYLLABLE CEO
+CCB4 ; LV # Lo HANGUL SYLLABLE CE
+CCD0 ; LV # Lo HANGUL SYLLABLE CYEO
+CCEC ; LV # Lo HANGUL SYLLABLE CYE
+CD08 ; LV # Lo HANGUL SYLLABLE CO
+CD24 ; LV # Lo HANGUL SYLLABLE CWA
+CD40 ; LV # Lo HANGUL SYLLABLE CWAE
+CD5C ; LV # Lo HANGUL SYLLABLE COE
+CD78 ; LV # Lo HANGUL SYLLABLE CYO
+CD94 ; LV # Lo HANGUL SYLLABLE CU
+CDB0 ; LV # Lo HANGUL SYLLABLE CWEO
+CDCC ; LV # Lo HANGUL SYLLABLE CWE
+CDE8 ; LV # Lo HANGUL SYLLABLE CWI
+CE04 ; LV # Lo HANGUL SYLLABLE CYU
+CE20 ; LV # Lo HANGUL SYLLABLE CEU
+CE3C ; LV # Lo HANGUL SYLLABLE CYI
+CE58 ; LV # Lo HANGUL SYLLABLE CI
+CE74 ; LV # Lo HANGUL SYLLABLE KA
+CE90 ; LV # Lo HANGUL SYLLABLE KAE
+CEAC ; LV # Lo HANGUL SYLLABLE KYA
+CEC8 ; LV # Lo HANGUL SYLLABLE KYAE
+CEE4 ; LV # Lo HANGUL SYLLABLE KEO
+CF00 ; LV # Lo HANGUL SYLLABLE KE
+CF1C ; LV # Lo HANGUL SYLLABLE KYEO
+CF38 ; LV # Lo HANGUL SYLLABLE KYE
+CF54 ; LV # Lo HANGUL SYLLABLE KO
+CF70 ; LV # Lo HANGUL SYLLABLE KWA
+CF8C ; LV # Lo HANGUL SYLLABLE KWAE
+CFA8 ; LV # Lo HANGUL SYLLABLE KOE
+CFC4 ; LV # Lo HANGUL SYLLABLE KYO
+CFE0 ; LV # Lo HANGUL SYLLABLE KU
+CFFC ; LV # Lo HANGUL SYLLABLE KWEO
+D018 ; LV # Lo HANGUL SYLLABLE KWE
+D034 ; LV # Lo HANGUL SYLLABLE KWI
+D050 ; LV # Lo HANGUL SYLLABLE KYU
+D06C ; LV # Lo HANGUL SYLLABLE KEU
+D088 ; LV # Lo HANGUL SYLLABLE KYI
+D0A4 ; LV # Lo HANGUL SYLLABLE KI
+D0C0 ; LV # Lo HANGUL SYLLABLE TA
+D0DC ; LV # Lo HANGUL SYLLABLE TAE
+D0F8 ; LV # Lo HANGUL SYLLABLE TYA
+D114 ; LV # Lo HANGUL SYLLABLE TYAE
+D130 ; LV # Lo HANGUL SYLLABLE TEO
+D14C ; LV # Lo HANGUL SYLLABLE TE
+D168 ; LV # Lo HANGUL SYLLABLE TYEO
+D184 ; LV # Lo HANGUL SYLLABLE TYE
+D1A0 ; LV # Lo HANGUL SYLLABLE TO
+D1BC ; LV # Lo HANGUL SYLLABLE TWA
+D1D8 ; LV # Lo HANGUL SYLLABLE TWAE
+D1F4 ; LV # Lo HANGUL SYLLABLE TOE
+D210 ; LV # Lo HANGUL SYLLABLE TYO
+D22C ; LV # Lo HANGUL SYLLABLE TU
+D248 ; LV # Lo HANGUL SYLLABLE TWEO
+D264 ; LV # Lo HANGUL SYLLABLE TWE
+D280 ; LV # Lo HANGUL SYLLABLE TWI
+D29C ; LV # Lo HANGUL SYLLABLE TYU
+D2B8 ; LV # Lo HANGUL SYLLABLE TEU
+D2D4 ; LV # Lo HANGUL SYLLABLE TYI
+D2F0 ; LV # Lo HANGUL SYLLABLE TI
+D30C ; LV # Lo HANGUL SYLLABLE PA
+D328 ; LV # Lo HANGUL SYLLABLE PAE
+D344 ; LV # Lo HANGUL SYLLABLE PYA
+D360 ; LV # Lo HANGUL SYLLABLE PYAE
+D37C ; LV # Lo HANGUL SYLLABLE PEO
+D398 ; LV # Lo HANGUL SYLLABLE PE
+D3B4 ; LV # Lo HANGUL SYLLABLE PYEO
+D3D0 ; LV # Lo HANGUL SYLLABLE PYE
+D3EC ; LV # Lo HANGUL SYLLABLE PO
+D408 ; LV # Lo HANGUL SYLLABLE PWA
+D424 ; LV # Lo HANGUL SYLLABLE PWAE
+D440 ; LV # Lo HANGUL SYLLABLE POE
+D45C ; LV # Lo HANGUL SYLLABLE PYO
+D478 ; LV # Lo HANGUL SYLLABLE PU
+D494 ; LV # Lo HANGUL SYLLABLE PWEO
+D4B0 ; LV # Lo HANGUL SYLLABLE PWE
+D4CC ; LV # Lo HANGUL SYLLABLE PWI
+D4E8 ; LV # Lo HANGUL SYLLABLE PYU
+D504 ; LV # Lo HANGUL SYLLABLE PEU
+D520 ; LV # Lo HANGUL SYLLABLE PYI
+D53C ; LV # Lo HANGUL SYLLABLE PI
+D558 ; LV # Lo HANGUL SYLLABLE HA
+D574 ; LV # Lo HANGUL SYLLABLE HAE
+D590 ; LV # Lo HANGUL SYLLABLE HYA
+D5AC ; LV # Lo HANGUL SYLLABLE HYAE
+D5C8 ; LV # Lo HANGUL SYLLABLE HEO
+D5E4 ; LV # Lo HANGUL SYLLABLE HE
+D600 ; LV # Lo HANGUL SYLLABLE HYEO
+D61C ; LV # Lo HANGUL SYLLABLE HYE
+D638 ; LV # Lo HANGUL SYLLABLE HO
+D654 ; LV # Lo HANGUL SYLLABLE HWA
+D670 ; LV # Lo HANGUL SYLLABLE HWAE
+D68C ; LV # Lo HANGUL SYLLABLE HOE
+D6A8 ; LV # Lo HANGUL SYLLABLE HYO
+D6C4 ; LV # Lo HANGUL SYLLABLE HU
+D6E0 ; LV # Lo HANGUL SYLLABLE HWEO
+D6FC ; LV # Lo HANGUL SYLLABLE HWE
+D718 ; LV # Lo HANGUL SYLLABLE HWI
+D734 ; LV # Lo HANGUL SYLLABLE HYU
+D750 ; LV # Lo HANGUL SYLLABLE HEU
+D76C ; LV # Lo HANGUL SYLLABLE HYI
+D788 ; LV # Lo HANGUL SYLLABLE HI
+
+# Total code points: 399
+
+# ================================================
+
+AC01..AC1B ; LVT # Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH
+AC1D..AC37 ; LVT # Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH
+AC39..AC53 ; LVT # Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
+AC55..AC6F ; LVT # Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH
+AC71..AC8B ; LVT # Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH
+AC8D..ACA7 ; LVT # Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH
+ACA9..ACC3 ; LVT # Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH
+ACC5..ACDF ; LVT # Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
+ACE1..ACFB ; LVT # Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH
+ACFD..AD17 ; LVT # Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH
+AD19..AD33 ; LVT # Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
+AD35..AD4F ; LVT # Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH
+AD51..AD6B ; LVT # Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH
+AD6D..AD87 ; LVT # Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
+AD89..ADA3 ; LVT # Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH
+ADA5..ADBF ; LVT # Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH
+ADC1..ADDB ; LVT # Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH
+ADDD..ADF7 ; LVT # Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH
+ADF9..AE13 ; LVT # Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
+AE15..AE2F ; LVT # Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH
+AE31..AE4B ; LVT # Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH
+AE4D..AE67 ; LVT # Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
+AE69..AE83 ; LVT # Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH
+AE85..AE9F ; LVT # Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH
+AEA1..AEBB ; LVT # Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH
+AEBD..AED7 ; LVT # Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH
+AED9..AEF3 ; LVT # Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
+AEF5..AF0F ; LVT # Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH
+AF11..AF2B ; LVT # Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH
+AF2D..AF47 ; LVT # Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH
+AF49..AF63 ; LVT # Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH
+AF65..AF7F ; LVT # Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
+AF81..AF9B ; LVT # Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH
+AF9D..AFB7 ; LVT # Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH
+AFB9..AFD3 ; LVT # Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH
+AFD5..AFEF ; LVT # Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH
+AFF1..B00B ; LVT # Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
+B00D..B027 ; LVT # Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH
+B029..B043 ; LVT # Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH
+B045..B05F ; LVT # Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH
+B061..B07B ; LVT # Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH
+B07D..B097 ; LVT # Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
+B099..B0B3 ; LVT # Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH
+B0B5..B0CF ; LVT # Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH
+B0D1..B0EB ; LVT # Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
+B0ED..B107 ; LVT # Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH
+B109..B123 ; LVT # Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH
+B125..B13F ; LVT # Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH
+B141..B15B ; LVT # Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH
+B15D..B177 ; LVT # Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
+B179..B193 ; LVT # Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH
+B195..B1AF ; LVT # Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH
+B1B1..B1CB ; LVT # Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
+B1CD..B1E7 ; LVT # Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH
+B1E9..B203 ; LVT # Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH
+B205..B21F ; LVT # Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
+B221..B23B ; LVT # Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH
+B23D..B257 ; LVT # Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH
+B259..B273 ; LVT # Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH
+B275..B28F ; LVT # Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH
+B291..B2AB ; LVT # Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
+B2AD..B2C7 ; LVT # Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH
+B2C9..B2E3 ; LVT # Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH
+B2E5..B2FF ; LVT # Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
+B301..B31B ; LVT # Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH
+B31D..B337 ; LVT # Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH
+B339..B353 ; LVT # Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH
+B355..B36F ; LVT # Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH
+B371..B38B ; LVT # Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
+B38D..B3A7 ; LVT # Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH
+B3A9..B3C3 ; LVT # Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH
+B3C5..B3DF ; LVT # Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH
+B3E1..B3FB ; LVT # Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH
+B3FD..B417 ; LVT # Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
+B419..B433 ; LVT # Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH
+B435..B44F ; LVT # Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH
+B451..B46B ; LVT # Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
+B46D..B487 ; LVT # Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH
+B489..B4A3 ; LVT # Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH
+B4A5..B4BF ; LVT # Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH
+B4C1..B4DB ; LVT # Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH
+B4DD..B4F7 ; LVT # Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
+B4F9..B513 ; LVT # Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH
+B515..B52F ; LVT # Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH
+B531..B54B ; LVT # Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
+B54D..B567 ; LVT # Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH
+B569..B583 ; LVT # Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH
+B585..B59F ; LVT # Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH
+B5A1..B5BB ; LVT # Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH
+B5BD..B5D7 ; LVT # Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
+B5D9..B5F3 ; LVT # Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH
+B5F5..B60F ; LVT # Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH
+B611..B62B ; LVT # Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH
+B62D..B647 ; LVT # Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH
+B649..B663 ; LVT # Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
+B665..B67F ; LVT # Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH
+B681..B69B ; LVT # Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH
+B69D..B6B7 ; LVT # Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH
+B6B9..B6D3 ; LVT # Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH
+B6D5..B6EF ; LVT # Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
+B6F1..B70B ; LVT # Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH
+B70D..B727 ; LVT # Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH
+B729..B743 ; LVT # Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH
+B745..B75F ; LVT # Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH
+B761..B77B ; LVT # Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
+B77D..B797 ; LVT # Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH
+B799..B7B3 ; LVT # Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH
+B7B5..B7CF ; LVT # Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
+B7D1..B7EB ; LVT # Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH
+B7ED..B807 ; LVT # Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH
+B809..B823 ; LVT # Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH
+B825..B83F ; LVT # Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH
+B841..B85B ; LVT # Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
+B85D..B877 ; LVT # Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH
+B879..B893 ; LVT # Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH
+B895..B8AF ; LVT # Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
+B8B1..B8CB ; LVT # Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH
+B8CD..B8E7 ; LVT # Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH
+B8E9..B903 ; LVT # Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
+B905..B91F ; LVT # Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH
+B921..B93B ; LVT # Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH
+B93D..B957 ; LVT # Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH
+B959..B973 ; LVT # Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH
+B975..B98F ; LVT # Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
+B991..B9AB ; LVT # Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH
+B9AD..B9C7 ; LVT # Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH
+B9C9..B9E3 ; LVT # Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
+B9E5..B9FF ; LVT # Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH
+BA01..BA1B ; LVT # Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH
+BA1D..BA37 ; LVT # Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH
+BA39..BA53 ; LVT # Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH
+BA55..BA6F ; LVT # Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
+BA71..BA8B ; LVT # Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH
+BA8D..BAA7 ; LVT # Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH
+BAA9..BAC3 ; LVT # Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH
+BAC5..BADF ; LVT # Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH
+BAE1..BAFB ; LVT # Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
+BAFD..BB17 ; LVT # Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH
+BB19..BB33 ; LVT # Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH
+BB35..BB4F ; LVT # Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
+BB51..BB6B ; LVT # Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH
+BB6D..BB87 ; LVT # Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH
+BB89..BBA3 ; LVT # Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH
+BBA5..BBBF ; LVT # Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH
+BBC1..BBDB ; LVT # Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
+BBDD..BBF7 ; LVT # Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH
+BBF9..BC13 ; LVT # Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH
+BC15..BC2F ; LVT # Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
+BC31..BC4B ; LVT # Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH
+BC4D..BC67 ; LVT # Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH
+BC69..BC83 ; LVT # Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH
+BC85..BC9F ; LVT # Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH
+BCA1..BCBB ; LVT # Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
+BCBD..BCD7 ; LVT # Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH
+BCD9..BCF3 ; LVT # Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH
+BCF5..BD0F ; LVT # Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH
+BD11..BD2B ; LVT # Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH
+BD2D..BD47 ; LVT # Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
+BD49..BD63 ; LVT # Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH
+BD65..BD7F ; LVT # Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH
+BD81..BD9B ; LVT # Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
+BD9D..BDB7 ; LVT # Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH
+BDB9..BDD3 ; LVT # Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH
+BDD5..BDEF ; LVT # Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH
+BDF1..BE0B ; LVT # Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH
+BE0D..BE27 ; LVT # Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
+BE29..BE43 ; LVT # Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH
+BE45..BE5F ; LVT # Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH
+BE61..BE7B ; LVT # Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
+BE7D..BE97 ; LVT # Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH
+BE99..BEB3 ; LVT # Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH
+BEB5..BECF ; LVT # Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH
+BED1..BEEB ; LVT # Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH
+BEED..BF07 ; LVT # Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
+BF09..BF23 ; LVT # Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH
+BF25..BF3F ; LVT # Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH
+BF41..BF5B ; LVT # Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH
+BF5D..BF77 ; LVT # Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH
+BF79..BF93 ; LVT # Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
+BF95..BFAF ; LVT # Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH
+BFB1..BFCB ; LVT # Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH
+BFCD..BFE7 ; LVT # Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH
+BFE9..C003 ; LVT # Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH
+C005..C01F ; LVT # Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
+C021..C03B ; LVT # Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH
+C03D..C057 ; LVT # Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH
+C059..C073 ; LVT # Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH
+C075..C08F ; LVT # Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH
+C091..C0AB ; LVT # Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
+C0AD..C0C7 ; LVT # Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH
+C0C9..C0E3 ; LVT # Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH
+C0E5..C0FF ; LVT # Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
+C101..C11B ; LVT # Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH
+C11D..C137 ; LVT # Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH
+C139..C153 ; LVT # Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH
+C155..C16F ; LVT # Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH
+C171..C18B ; LVT # Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
+C18D..C1A7 ; LVT # Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH
+C1A9..C1C3 ; LVT # Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH
+C1C5..C1DF ; LVT # Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
+C1E1..C1FB ; LVT # Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH
+C1FD..C217 ; LVT # Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH
+C219..C233 ; LVT # Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
+C235..C24F ; LVT # Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH
+C251..C26B ; LVT # Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH
+C26D..C287 ; LVT # Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH
+C289..C2A3 ; LVT # Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH
+C2A5..C2BF ; LVT # Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
+C2C1..C2DB ; LVT # Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH
+C2DD..C2F7 ; LVT # Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH
+C2F9..C313 ; LVT # Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
+C315..C32F ; LVT # Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH
+C331..C34B ; LVT # Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH
+C34D..C367 ; LVT # Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH
+C369..C383 ; LVT # Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH
+C385..C39F ; LVT # Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
+C3A1..C3BB ; LVT # Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH
+C3BD..C3D7 ; LVT # Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH
+C3D9..C3F3 ; LVT # Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH
+C3F5..C40F ; LVT # Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH
+C411..C42B ; LVT # Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
+C42D..C447 ; LVT # Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH
+C449..C463 ; LVT # Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH
+C465..C47F ; LVT # Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH
+C481..C49B ; LVT # Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH
+C49D..C4B7 ; LVT # Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
+C4B9..C4D3 ; LVT # Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH
+C4D5..C4EF ; LVT # Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH
+C4F1..C50B ; LVT # Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH
+C50D..C527 ; LVT # Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH
+C529..C543 ; LVT # Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
+C545..C55F ; LVT # Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH
+C561..C57B ; LVT # Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH
+C57D..C597 ; LVT # Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
+C599..C5B3 ; LVT # Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH
+C5B5..C5CF ; LVT # Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH
+C5D1..C5EB ; LVT # Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
+C5ED..C607 ; LVT # Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH
+C609..C623 ; LVT # Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH
+C625..C63F ; LVT # Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
+C641..C65B ; LVT # Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH
+C65D..C677 ; LVT # Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH
+C679..C693 ; LVT # Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
+C695..C6AF ; LVT # Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH
+C6B1..C6CB ; LVT # Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH
+C6CD..C6E7 ; LVT # Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
+C6E9..C703 ; LVT # Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH
+C705..C71F ; LVT # Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH
+C721..C73B ; LVT # Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
+C73D..C757 ; LVT # Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH
+C759..C773 ; LVT # Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH
+C775..C78F ; LVT # Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
+C791..C7AB ; LVT # Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH
+C7AD..C7C7 ; LVT # Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH
+C7C9..C7E3 ; LVT # Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
+C7E5..C7FF ; LVT # Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH
+C801..C81B ; LVT # Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH
+C81D..C837 ; LVT # Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH
+C839..C853 ; LVT # Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH
+C855..C86F ; LVT # Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
+C871..C88B ; LVT # Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH
+C88D..C8A7 ; LVT # Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH
+C8A9..C8C3 ; LVT # Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
+C8C5..C8DF ; LVT # Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH
+C8E1..C8FB ; LVT # Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH
+C8FD..C917 ; LVT # Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
+C919..C933 ; LVT # Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH
+C935..C94F ; LVT # Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH
+C951..C96B ; LVT # Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH
+C96D..C987 ; LVT # Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH
+C989..C9A3 ; LVT # Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
+C9A5..C9BF ; LVT # Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH
+C9C1..C9DB ; LVT # Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH
+C9DD..C9F7 ; LVT # Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
+C9F9..CA13 ; LVT # Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH
+CA15..CA2F ; LVT # Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH
+CA31..CA4B ; LVT # Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH
+CA4D..CA67 ; LVT # Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH
+CA69..CA83 ; LVT # Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
+CA85..CA9F ; LVT # Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH
+CAA1..CABB ; LVT # Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH
+CABD..CAD7 ; LVT # Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH
+CAD9..CAF3 ; LVT # Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH
+CAF5..CB0F ; LVT # Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
+CB11..CB2B ; LVT # Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH
+CB2D..CB47 ; LVT # Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH
+CB49..CB63 ; LVT # Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH
+CB65..CB7F ; LVT # Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH
+CB81..CB9B ; LVT # Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
+CB9D..CBB7 ; LVT # Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH
+CBB9..CBD3 ; LVT # Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH
+CBD5..CBEF ; LVT # Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH
+CBF1..CC0B ; LVT # Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH
+CC0D..CC27 ; LVT # Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
+CC29..CC43 ; LVT # Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH
+CC45..CC5F ; LVT # Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH
+CC61..CC7B ; LVT # Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
+CC7D..CC97 ; LVT # Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH
+CC99..CCB3 ; LVT # Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH
+CCB5..CCCF ; LVT # Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH
+CCD1..CCEB ; LVT # Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH
+CCED..CD07 ; LVT # Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
+CD09..CD23 ; LVT # Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH
+CD25..CD3F ; LVT # Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH
+CD41..CD5B ; LVT # Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
+CD5D..CD77 ; LVT # Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH
+CD79..CD93 ; LVT # Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH
+CD95..CDAF ; LVT # Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
+CDB1..CDCB ; LVT # Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH
+CDCD..CDE7 ; LVT # Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH
+CDE9..CE03 ; LVT # Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH
+CE05..CE1F ; LVT # Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH
+CE21..CE3B ; LVT # Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
+CE3D..CE57 ; LVT # Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH
+CE59..CE73 ; LVT # Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH
+CE75..CE8F ; LVT # Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
+CE91..CEAB ; LVT # Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH
+CEAD..CEC7 ; LVT # Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH
+CEC9..CEE3 ; LVT # Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH
+CEE5..CEFF ; LVT # Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH
+CF01..CF1B ; LVT # Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
+CF1D..CF37 ; LVT # Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH
+CF39..CF53 ; LVT # Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH
+CF55..CF6F ; LVT # Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH
+CF71..CF8B ; LVT # Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH
+CF8D..CFA7 ; LVT # Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
+CFA9..CFC3 ; LVT # Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH
+CFC5..CFDF ; LVT # Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH
+CFE1..CFFB ; LVT # Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
+CFFD..D017 ; LVT # Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH
+D019..D033 ; LVT # Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH
+D035..D04F ; LVT # Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH
+D051..D06B ; LVT # Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH
+D06D..D087 ; LVT # Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
+D089..D0A3 ; LVT # Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH
+D0A5..D0BF ; LVT # Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH
+D0C1..D0DB ; LVT # Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
+D0DD..D0F7 ; LVT # Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH
+D0F9..D113 ; LVT # Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH
+D115..D12F ; LVT # Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH
+D131..D14B ; LVT # Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH
+D14D..D167 ; LVT # Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
+D169..D183 ; LVT # Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH
+D185..D19F ; LVT # Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH
+D1A1..D1BB ; LVT # Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH
+D1BD..D1D7 ; LVT # Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH
+D1D9..D1F3 ; LVT # Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
+D1F5..D20F ; LVT # Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH
+D211..D22B ; LVT # Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH
+D22D..D247 ; LVT # Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
+D249..D263 ; LVT # Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH
+D265..D27F ; LVT # Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH
+D281..D29B ; LVT # Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH
+D29D..D2B7 ; LVT # Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH
+D2B9..D2D3 ; LVT # Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
+D2D5..D2EF ; LVT # Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH
+D2F1..D30B ; LVT # Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH
+D30D..D327 ; LVT # Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
+D329..D343 ; LVT # Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH
+D345..D35F ; LVT # Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH
+D361..D37B ; LVT # Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH
+D37D..D397 ; LVT # Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH
+D399..D3B3 ; LVT # Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
+D3B5..D3CF ; LVT # Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH
+D3D1..D3EB ; LVT # Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH
+D3ED..D407 ; LVT # Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH
+D409..D423 ; LVT # Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH
+D425..D43F ; LVT # Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
+D441..D45B ; LVT # Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH
+D45D..D477 ; LVT # Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH
+D479..D493 ; LVT # Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
+D495..D4AF ; LVT # Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH
+D4B1..D4CB ; LVT # Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH
+D4CD..D4E7 ; LVT # Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH
+D4E9..D503 ; LVT # Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH
+D505..D51F ; LVT # Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
+D521..D53B ; LVT # Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH
+D53D..D557 ; LVT # Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH
+D559..D573 ; LVT # Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
+D575..D58F ; LVT # Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH
+D591..D5AB ; LVT # Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH
+D5AD..D5C7 ; LVT # Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH
+D5C9..D5E3 ; LVT # Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH
+D5E5..D5FF ; LVT # Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
+D601..D61B ; LVT # Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH
+D61D..D637 ; LVT # Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH
+D639..D653 ; LVT # Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH
+D655..D66F ; LVT # Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH
+D671..D68B ; LVT # Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
+D68D..D6A7 ; LVT # Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH
+D6A9..D6C3 ; LVT # Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH
+D6C5..D6DF ; LVT # Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
+D6E1..D6FB ; LVT # Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH
+D6FD..D717 ; LVT # Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH
+D719..D733 ; LVT # Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH
+D735..D74F ; LVT # Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH
+D751..D76B ; LVT # Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
+D76D..D787 ; LVT # Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH
+D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
+
+# Total code points: 10773
+
+# ================================================
+
+200D ; ZWJ # Cf ZERO WIDTH JOINER
+
+# Total code points: 1
+
+# EOF
diff --git a/contrib/unicode/README b/contrib/unicode/README
index 1f5fee6..1448a8d 100644
--- a/contrib/unicode/README
+++ b/contrib/unicode/README
@@ -16,7 +16,12 @@ ftp://ftp.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt
ftp://ftp.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
ftp://ftp.unicode.org/Public/UNIDATA/NameAliases.txt
-These files have been added to source control in this directory;
+Two additional files are needed for lookup tables in libstdc++:
+
+ftp://ftp.unicode.org/Public/UNIDATA/auxiliary/GraphemeBreakProperty.txt
+ftp://ftp.unicode.org/Public/UNIDATA/emoji/emoji-data.txt
+
+All these files have been added to source control in this directory;
please see unicode-license.txt for the relevant copyright information.
In order to keep in sync with glibc's wcwidth as much as possible, it is
@@ -24,7 +29,7 @@ desirable for the logic that processes the Unicode data to be the same as
glibc's. To that end, we also put in this directory, in the from_glibc/
directory, the glibc python code that implements their logic. This code was
copied verbatim from glibc, and it can be updated at any time from the glibc
-source code repository. The files copied from that respository are:
+source code repository. The files copied from that repository are:
localedata/unicode-gen/unicode_utils.py
localedata/unicode-gen/utf8_gen.py
@@ -71,3 +76,6 @@ The procedure to update GCC's Unicode support is the following:
9: Generate uname2c.h as follows:
../../libcpp/makeuname2c UnicodeData.txt NameAliases.txt \
> ../../libcpp/uname2c.h
+
+See gen_libstdcxx_unicode_data.py for instructions on updating the lookup
+tables in libstdc++.
diff --git a/contrib/unicode/emoji-data.txt b/contrib/unicode/emoji-data.txt
new file mode 100644
index 0000000..0ba10e9
--- /dev/null
+++ b/contrib/unicode/emoji-data.txt
@@ -0,0 +1,1320 @@
+# emoji-data.txt
+# Date: 2023-02-01, 02:22:54 GMT
+# © 2023 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
+#
+# Emoji Data for UTS #51
+# Used with Emoji Version 15.1 and subsequent minor revisions (if any)
+#
+# For documentation and usage, see https://www.unicode.org/reports/tr51
+#
+# Format:
+# <codepoint(s)> ; <property> # <comments>
+# Note: there is no guarantee as to the structure of whitespace or comments
+#
+# Characters and sequences are listed in code point order. Users should be shown a more natural order.
+# See the CLDR collation order for Emoji.
+
+
+# ================================================
+
+# All omitted code points have Emoji=No
+
+0023 ; Emoji # E0.0 [1] (#️) hash sign
+002A ; Emoji # E0.0 [1] (*️) asterisk
+0030..0039 ; Emoji # E0.0 [10] (0️..9️) digit zero..digit nine
+00A9 ; Emoji # E0.6 [1] (©️) copyright
+00AE ; Emoji # E0.6 [1] (®️) registered
+203C ; Emoji # E0.6 [1] (‼️) double exclamation mark
+2049 ; Emoji # E0.6 [1] (⁉️) exclamation question mark
+2122 ; Emoji # E0.6 [1] (™️) trade mark
+2139 ; Emoji # E0.6 [1] (ℹ️) information
+2194..2199 ; Emoji # E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow
+21A9..21AA ; Emoji # E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right
+231A..231B ; Emoji # E0.6 [2] (⌚..⌛) watch..hourglass done
+2328 ; Emoji # E1.0 [1] (⌨️) keyboard
+23CF ; Emoji # E1.0 [1] (⏏️) eject button
+23E9..23EC ; Emoji # E0.6 [4] (⏩..⏬) fast-forward button..fast down button
+23ED..23EE ; Emoji # E0.7 [2] (⏭️..⏮️) next track button..last track button
+23EF ; Emoji # E1.0 [1] (⏯️) play or pause button
+23F0 ; Emoji # E0.6 [1] (⏰) alarm clock
+23F1..23F2 ; Emoji # E1.0 [2] (⏱️..⏲️) stopwatch..timer clock
+23F3 ; Emoji # E0.6 [1] (⏳) hourglass not done
+23F8..23FA ; Emoji # E0.7 [3] (⏸️..⏺️) pause button..record button
+24C2 ; Emoji # E0.6 [1] (Ⓜ️) circled M
+25AA..25AB ; Emoji # E0.6 [2] (▪️..▫️) black small square..white small square
+25B6 ; Emoji # E0.6 [1] (▶️) play button
+25C0 ; Emoji # E0.6 [1] (◀️) reverse button
+25FB..25FE ; Emoji # E0.6 [4] (◻️..◾) white medium square..black medium-small square
+2600..2601 ; Emoji # E0.6 [2] (☀️..☁️) sun..cloud
+2602..2603 ; Emoji # E0.7 [2] (☂️..☃️) umbrella..snowman
+2604 ; Emoji # E1.0 [1] (☄️) comet
+260E ; Emoji # E0.6 [1] (☎️) telephone
+2611 ; Emoji # E0.6 [1] (☑️) check box with check
+2614..2615 ; Emoji # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage
+2618 ; Emoji # E1.0 [1] (☘️) shamrock
+261D ; Emoji # E0.6 [1] (☝️) index pointing up
+2620 ; Emoji # E1.0 [1] (☠️) skull and crossbones
+2622..2623 ; Emoji # E1.0 [2] (☢️..☣️) radioactive..biohazard
+2626 ; Emoji # E1.0 [1] (☦️) orthodox cross
+262A ; Emoji # E0.7 [1] (☪️) star and crescent
+262E ; Emoji # E1.0 [1] (☮️) peace symbol
+262F ; Emoji # E0.7 [1] (☯️) yin yang
+2638..2639 ; Emoji # E0.7 [2] (☸️..☹️) wheel of dharma..frowning face
+263A ; Emoji # E0.6 [1] (☺️) smiling face
+2640 ; Emoji # E4.0 [1] (♀️) female sign
+2642 ; Emoji # E4.0 [1] (♂️) male sign
+2648..2653 ; Emoji # E0.6 [12] (♈..♓) Aries..Pisces
+265F ; Emoji # E11.0 [1] (♟️) chess pawn
+2660 ; Emoji # E0.6 [1] (♠️) spade suit
+2663 ; Emoji # E0.6 [1] (♣️) club suit
+2665..2666 ; Emoji # E0.6 [2] (♥️..♦️) heart suit..diamond suit
+2668 ; Emoji # E0.6 [1] (♨️) hot springs
+267B ; Emoji # E0.6 [1] (♻️) recycling symbol
+267E ; Emoji # E11.0 [1] (♾️) infinity
+267F ; Emoji # E0.6 [1] (♿) wheelchair symbol
+2692 ; Emoji # E1.0 [1] (⚒️) hammer and pick
+2693 ; Emoji # E0.6 [1] (⚓) anchor
+2694 ; Emoji # E1.0 [1] (⚔️) crossed swords
+2695 ; Emoji # E4.0 [1] (⚕️) medical symbol
+2696..2697 ; Emoji # E1.0 [2] (⚖️..⚗️) balance scale..alembic
+2699 ; Emoji # E1.0 [1] (⚙️) gear
+269B..269C ; Emoji # E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis
+26A0..26A1 ; Emoji # E0.6 [2] (⚠️..⚡) warning..high voltage
+26A7 ; Emoji # E13.0 [1] (⚧️) transgender symbol
+26AA..26AB ; Emoji # E0.6 [2] (⚪..⚫) white circle..black circle
+26B0..26B1 ; Emoji # E1.0 [2] (⚰️..⚱️) coffin..funeral urn
+26BD..26BE ; Emoji # E0.6 [2] (⚽..⚾) soccer ball..baseball
+26C4..26C5 ; Emoji # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud
+26C8 ; Emoji # E0.7 [1] (⛈️) cloud with lightning and rain
+26CE ; Emoji # E0.6 [1] (⛎) Ophiuchus
+26CF ; Emoji # E0.7 [1] (⛏️) pick
+26D1 ; Emoji # E0.7 [1] (⛑️) rescue worker’s helmet
+26D3 ; Emoji # E0.7 [1] (⛓️) chains
+26D4 ; Emoji # E0.6 [1] (⛔) no entry
+26E9 ; Emoji # E0.7 [1] (⛩️) shinto shrine
+26EA ; Emoji # E0.6 [1] (⛪) church
+26F0..26F1 ; Emoji # E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground
+26F2..26F3 ; Emoji # E0.6 [2] (⛲..⛳) fountain..flag in hole
+26F4 ; Emoji # E0.7 [1] (⛴️) ferry
+26F5 ; Emoji # E0.6 [1] (⛵) sailboat
+26F7..26F9 ; Emoji # E0.7 [3] (⛷️..⛹️) skier..person bouncing ball
+26FA ; Emoji # E0.6 [1] (⛺) tent
+26FD ; Emoji # E0.6 [1] (⛽) fuel pump
+2702 ; Emoji # E0.6 [1] (✂️) scissors
+2705 ; Emoji # E0.6 [1] (✅) check mark button
+2708..270C ; Emoji # E0.6 [5] (✈️..✌️) airplane..victory hand
+270D ; Emoji # E0.7 [1] (✍️) writing hand
+270F ; Emoji # E0.6 [1] (✏️) pencil
+2712 ; Emoji # E0.6 [1] (✒️) black nib
+2714 ; Emoji # E0.6 [1] (✔️) check mark
+2716 ; Emoji # E0.6 [1] (✖️) multiply
+271D ; Emoji # E0.7 [1] (✝️) latin cross
+2721 ; Emoji # E0.7 [1] (✡️) star of David
+2728 ; Emoji # E0.6 [1] (✨) sparkles
+2733..2734 ; Emoji # E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star
+2744 ; Emoji # E0.6 [1] (❄️) snowflake
+2747 ; Emoji # E0.6 [1] (❇️) sparkle
+274C ; Emoji # E0.6 [1] (❌) cross mark
+274E ; Emoji # E0.6 [1] (❎) cross mark button
+2753..2755 ; Emoji # E0.6 [3] (❓..❕) red question mark..white exclamation mark
+2757 ; Emoji # E0.6 [1] (❗) red exclamation mark
+2763 ; Emoji # E1.0 [1] (❣️) heart exclamation
+2764 ; Emoji # E0.6 [1] (❤️) red heart
+2795..2797 ; Emoji # E0.6 [3] (➕..➗) plus..divide
+27A1 ; Emoji # E0.6 [1] (➡️) right arrow
+27B0 ; Emoji # E0.6 [1] (➰) curly loop
+27BF ; Emoji # E1.0 [1] (➿) double curly loop
+2934..2935 ; Emoji # E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down
+2B05..2B07 ; Emoji # E0.6 [3] (⬅️..⬇️) left arrow..down arrow
+2B1B..2B1C ; Emoji # E0.6 [2] (⬛..⬜) black large square..white large square
+2B50 ; Emoji # E0.6 [1] (⭐) star
+2B55 ; Emoji # E0.6 [1] (⭕) hollow red circle
+3030 ; Emoji # E0.6 [1] (〰️) wavy dash
+303D ; Emoji # E0.6 [1] (〽️) part alternation mark
+3297 ; Emoji # E0.6 [1] (㊗️) Japanese “congratulations” button
+3299 ; Emoji # E0.6 [1] (㊙️) Japanese “secret” button
+1F004 ; Emoji # E0.6 [1] (🀄) mahjong red dragon
+1F0CF ; Emoji # E0.6 [1] (🃏) joker
+1F170..1F171 ; Emoji # E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type)
+1F17E..1F17F ; Emoji # E0.6 [2] (🅾️..🅿️) O button (blood type)..P button
+1F18E ; Emoji # E0.6 [1] (🆎) AB button (blood type)
+1F191..1F19A ; Emoji # E0.6 [10] (🆑..🆚) CL button..VS button
+1F1E6..1F1FF ; Emoji # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
+1F201..1F202 ; Emoji # E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button
+1F21A ; Emoji # E0.6 [1] (🈚) Japanese “free of charge” button
+1F22F ; Emoji # E0.6 [1] (🈯) Japanese “reserved” button
+1F232..1F23A ; Emoji # E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button
+1F250..1F251 ; Emoji # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
+1F300..1F30C ; Emoji # E0.6 [13] (🌀..🌌) cyclone..milky way
+1F30D..1F30E ; Emoji # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas
+1F30F ; Emoji # E0.6 [1] (🌏) globe showing Asia-Australia
+1F310 ; Emoji # E1.0 [1] (🌐) globe with meridians
+1F311 ; Emoji # E0.6 [1] (🌑) new moon
+1F312 ; Emoji # E1.0 [1] (🌒) waxing crescent moon
+1F313..1F315 ; Emoji # E0.6 [3] (🌓..🌕) first quarter moon..full moon
+1F316..1F318 ; Emoji # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon
+1F319 ; Emoji # E0.6 [1] (🌙) crescent moon
+1F31A ; Emoji # E1.0 [1] (🌚) new moon face
+1F31B ; Emoji # E0.6 [1] (🌛) first quarter moon face
+1F31C ; Emoji # E0.7 [1] (🌜) last quarter moon face
+1F31D..1F31E ; Emoji # E1.0 [2] (🌝..🌞) full moon face..sun with face
+1F31F..1F320 ; Emoji # E0.6 [2] (🌟..🌠) glowing star..shooting star
+1F321 ; Emoji # E0.7 [1] (🌡️) thermometer
+1F324..1F32C ; Emoji # E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face
+1F32D..1F32F ; Emoji # E1.0 [3] (🌭..🌯) hot dog..burrito
+1F330..1F331 ; Emoji # E0.6 [2] (🌰..🌱) chestnut..seedling
+1F332..1F333 ; Emoji # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree
+1F334..1F335 ; Emoji # E0.6 [2] (🌴..🌵) palm tree..cactus
+1F336 ; Emoji # E0.7 [1] (🌶️) hot pepper
+1F337..1F34A ; Emoji # E0.6 [20] (🌷..🍊) tulip..tangerine
+1F34B ; Emoji # E1.0 [1] (🍋) lemon
+1F34C..1F34F ; Emoji # E0.6 [4] (🍌..🍏) banana..green apple
+1F350 ; Emoji # E1.0 [1] (🍐) pear
+1F351..1F37B ; Emoji # E0.6 [43] (🍑..🍻) peach..clinking beer mugs
+1F37C ; Emoji # E1.0 [1] (🍼) baby bottle
+1F37D ; Emoji # E0.7 [1] (🍽️) fork and knife with plate
+1F37E..1F37F ; Emoji # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn
+1F380..1F393 ; Emoji # E0.6 [20] (🎀..🎓) ribbon..graduation cap
+1F396..1F397 ; Emoji # E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon
+1F399..1F39B ; Emoji # E0.7 [3] (🎙️..🎛️) studio microphone..control knobs
+1F39E..1F39F ; Emoji # E0.7 [2] (🎞️..🎟️) film frames..admission tickets
+1F3A0..1F3C4 ; Emoji # E0.6 [37] (🎠..🏄) carousel horse..person surfing
+1F3C5 ; Emoji # E1.0 [1] (🏅) sports medal
+1F3C6 ; Emoji # E0.6 [1] (🏆) trophy
+1F3C7 ; Emoji # E1.0 [1] (🏇) horse racing
+1F3C8 ; Emoji # E0.6 [1] (🏈) american football
+1F3C9 ; Emoji # E1.0 [1] (🏉) rugby football
+1F3CA ; Emoji # E0.6 [1] (🏊) person swimming
+1F3CB..1F3CE ; Emoji # E0.7 [4] (🏋️..🏎️) person lifting weights..racing car
+1F3CF..1F3D3 ; Emoji # E1.0 [5] (🏏..🏓) cricket game..ping pong
+1F3D4..1F3DF ; Emoji # E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium
+1F3E0..1F3E3 ; Emoji # E0.6 [4] (🏠..🏣) house..Japanese post office
+1F3E4 ; Emoji # E1.0 [1] (🏤) post office
+1F3E5..1F3F0 ; Emoji # E0.6 [12] (🏥..🏰) hospital..castle
+1F3F3 ; Emoji # E0.7 [1] (🏳️) white flag
+1F3F4 ; Emoji # E1.0 [1] (🏴) black flag
+1F3F5 ; Emoji # E0.7 [1] (🏵️) rosette
+1F3F7 ; Emoji # E0.7 [1] (🏷️) label
+1F3F8..1F407 ; Emoji # E1.0 [16] (🏸..🐇) badminton..rabbit
+1F408 ; Emoji # E0.7 [1] (🐈) cat
+1F409..1F40B ; Emoji # E1.0 [3] (🐉..🐋) dragon..whale
+1F40C..1F40E ; Emoji # E0.6 [3] (🐌..🐎) snail..horse
+1F40F..1F410 ; Emoji # E1.0 [2] (🐏..🐐) ram..goat
+1F411..1F412 ; Emoji # E0.6 [2] (🐑..🐒) ewe..monkey
+1F413 ; Emoji # E1.0 [1] (🐓) rooster
+1F414 ; Emoji # E0.6 [1] (🐔) chicken
+1F415 ; Emoji # E0.7 [1] (🐕) dog
+1F416 ; Emoji # E1.0 [1] (🐖) pig
+1F417..1F429 ; Emoji # E0.6 [19] (🐗..🐩) boar..poodle
+1F42A ; Emoji # E1.0 [1] (🐪) camel
+1F42B..1F43E ; Emoji # E0.6 [20] (🐫..🐾) two-hump camel..paw prints
+1F43F ; Emoji # E0.7 [1] (🐿️) chipmunk
+1F440 ; Emoji # E0.6 [1] (👀) eyes
+1F441 ; Emoji # E0.7 [1] (👁️) eye
+1F442..1F464 ; Emoji # E0.6 [35] (👂..👤) ear..bust in silhouette
+1F465 ; Emoji # E1.0 [1] (👥) busts in silhouette
+1F466..1F46B ; Emoji # E0.6 [6] (👦..👫) boy..woman and man holding hands
+1F46C..1F46D ; Emoji # E1.0 [2] (👬..👭) men holding hands..women holding hands
+1F46E..1F4AC ; Emoji # E0.6 [63] (👮..💬) police officer..speech balloon
+1F4AD ; Emoji # E1.0 [1] (💭) thought balloon
+1F4AE..1F4B5 ; Emoji # E0.6 [8] (💮..💵) white flower..dollar banknote
+1F4B6..1F4B7 ; Emoji # E1.0 [2] (💶..💷) euro banknote..pound banknote
+1F4B8..1F4EB ; Emoji # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Emoji # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Emoji # E0.6 [1] (📮) postbox
+1F4EF ; Emoji # E1.0 [1] (📯) postal horn
+1F4F0..1F4F4 ; Emoji # E0.6 [5] (📰..📴) newspaper..mobile phone off
+1F4F5 ; Emoji # E1.0 [1] (📵) no mobile phones
+1F4F6..1F4F7 ; Emoji # E0.6 [2] (📶..📷) antenna bars..camera
+1F4F8 ; Emoji # E1.0 [1] (📸) camera with flash
+1F4F9..1F4FC ; Emoji # E0.6 [4] (📹..📼) video camera..videocassette
+1F4FD ; Emoji # E0.7 [1] (📽️) film projector
+1F4FF..1F502 ; Emoji # E1.0 [4] (📿..🔂) prayer beads..repeat single button
+1F503 ; Emoji # E0.6 [1] (🔃) clockwise vertical arrows
+1F504..1F507 ; Emoji # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker
+1F508 ; Emoji # E0.7 [1] (🔈) speaker low volume
+1F509 ; Emoji # E1.0 [1] (🔉) speaker medium volume
+1F50A..1F514 ; Emoji # E0.6 [11] (🔊..🔔) speaker high volume..bell
+1F515 ; Emoji # E1.0 [1] (🔕) bell with slash
+1F516..1F52B ; Emoji # E0.6 [22] (🔖..🔫) bookmark..water pistol
+1F52C..1F52D ; Emoji # E1.0 [2] (🔬..🔭) microscope..telescope
+1F52E..1F53D ; Emoji # E0.6 [16] (🔮..🔽) crystal ball..downwards button
+1F549..1F54A ; Emoji # E0.7 [2] (🕉️..🕊️) om..dove
+1F54B..1F54E ; Emoji # E1.0 [4] (🕋..🕎) kaaba..menorah
+1F550..1F55B ; Emoji # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock
+1F55C..1F567 ; Emoji # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty
+1F56F..1F570 ; Emoji # E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock
+1F573..1F579 ; Emoji # E0.7 [7] (🕳️..🕹️) hole..joystick
+1F57A ; Emoji # E3.0 [1] (🕺) man dancing
+1F587 ; Emoji # E0.7 [1] (🖇️) linked paperclips
+1F58A..1F58D ; Emoji # E0.7 [4] (🖊️..🖍️) pen..crayon
+1F590 ; Emoji # E0.7 [1] (🖐️) hand with fingers splayed
+1F595..1F596 ; Emoji # E1.0 [2] (🖕..🖖) middle finger..vulcan salute
+1F5A4 ; Emoji # E3.0 [1] (🖤) black heart
+1F5A5 ; Emoji # E0.7 [1] (🖥️) desktop computer
+1F5A8 ; Emoji # E0.7 [1] (🖨️) printer
+1F5B1..1F5B2 ; Emoji # E0.7 [2] (🖱️..🖲️) computer mouse..trackball
+1F5BC ; Emoji # E0.7 [1] (🖼️) framed picture
+1F5C2..1F5C4 ; Emoji # E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet
+1F5D1..1F5D3 ; Emoji # E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar
+1F5DC..1F5DE ; Emoji # E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper
+1F5E1 ; Emoji # E0.7 [1] (🗡️) dagger
+1F5E3 ; Emoji # E0.7 [1] (🗣️) speaking head
+1F5E8 ; Emoji # E2.0 [1] (🗨️) left speech bubble
+1F5EF ; Emoji # E0.7 [1] (🗯️) right anger bubble
+1F5F3 ; Emoji # E0.7 [1] (🗳️) ballot box with ballot
+1F5FA ; Emoji # E0.7 [1] (🗺️) world map
+1F5FB..1F5FF ; Emoji # E0.6 [5] (🗻..🗿) mount fuji..moai
+1F600 ; Emoji # E1.0 [1] (😀) grinning face
+1F601..1F606 ; Emoji # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Emoji # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns
+1F609..1F60D ; Emoji # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes
+1F60E ; Emoji # E1.0 [1] (😎) smiling face with sunglasses
+1F60F ; Emoji # E0.6 [1] (😏) smirking face
+1F610 ; Emoji # E0.7 [1] (😐) neutral face
+1F611 ; Emoji # E1.0 [1] (😑) expressionless face
+1F612..1F614 ; Emoji # E0.6 [3] (😒..😔) unamused face..pensive face
+1F615 ; Emoji # E1.0 [1] (😕) confused face
+1F616 ; Emoji # E0.6 [1] (😖) confounded face
+1F617 ; Emoji # E1.0 [1] (😗) kissing face
+1F618 ; Emoji # E0.6 [1] (😘) face blowing a kiss
+1F619 ; Emoji # E1.0 [1] (😙) kissing face with smiling eyes
+1F61A ; Emoji # E0.6 [1] (😚) kissing face with closed eyes
+1F61B ; Emoji # E1.0 [1] (😛) face with tongue
+1F61C..1F61E ; Emoji # E0.6 [3] (😜..😞) winking face with tongue..disappointed face
+1F61F ; Emoji # E1.0 [1] (😟) worried face
+1F620..1F625 ; Emoji # E0.6 [6] (😠..😥) angry face..sad but relieved face
+1F626..1F627 ; Emoji # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face
+1F628..1F62B ; Emoji # E0.6 [4] (😨..😫) fearful face..tired face
+1F62C ; Emoji # E1.0 [1] (😬) grimacing face
+1F62D ; Emoji # E0.6 [1] (😭) loudly crying face
+1F62E..1F62F ; Emoji # E1.0 [2] (😮..😯) face with open mouth..hushed face
+1F630..1F633 ; Emoji # E0.6 [4] (😰..😳) anxious face with sweat..flushed face
+1F634 ; Emoji # E1.0 [1] (😴) sleeping face
+1F635 ; Emoji # E0.6 [1] (😵) face with crossed-out eyes
+1F636 ; Emoji # E1.0 [1] (😶) face without mouth
+1F637..1F640 ; Emoji # E0.6 [10] (😷..🙀) face with medical mask..weary cat
+1F641..1F644 ; Emoji # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Emoji # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands
+1F680 ; Emoji # E0.6 [1] (🚀) rocket
+1F681..1F682 ; Emoji # E1.0 [2] (🚁..🚂) helicopter..locomotive
+1F683..1F685 ; Emoji # E0.6 [3] (🚃..🚅) railway car..bullet train
+1F686 ; Emoji # E1.0 [1] (🚆) train
+1F687 ; Emoji # E0.6 [1] (🚇) metro
+1F688 ; Emoji # E1.0 [1] (🚈) light rail
+1F689 ; Emoji # E0.6 [1] (🚉) station
+1F68A..1F68B ; Emoji # E1.0 [2] (🚊..🚋) tram..tram car
+1F68C ; Emoji # E0.6 [1] (🚌) bus
+1F68D ; Emoji # E0.7 [1] (🚍) oncoming bus
+1F68E ; Emoji # E1.0 [1] (🚎) trolleybus
+1F68F ; Emoji # E0.6 [1] (🚏) bus stop
+1F690 ; Emoji # E1.0 [1] (🚐) minibus
+1F691..1F693 ; Emoji # E0.6 [3] (🚑..🚓) ambulance..police car
+1F694 ; Emoji # E0.7 [1] (🚔) oncoming police car
+1F695 ; Emoji # E0.6 [1] (🚕) taxi
+1F696 ; Emoji # E1.0 [1] (🚖) oncoming taxi
+1F697 ; Emoji # E0.6 [1] (🚗) automobile
+1F698 ; Emoji # E0.7 [1] (🚘) oncoming automobile
+1F699..1F69A ; Emoji # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Emoji # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway
+1F6A2 ; Emoji # E0.6 [1] (🚢) ship
+1F6A3 ; Emoji # E1.0 [1] (🚣) person rowing boat
+1F6A4..1F6A5 ; Emoji # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light
+1F6A6 ; Emoji # E1.0 [1] (🚦) vertical traffic light
+1F6A7..1F6AD ; Emoji # E0.6 [7] (🚧..🚭) construction..no smoking
+1F6AE..1F6B1 ; Emoji # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water
+1F6B2 ; Emoji # E0.6 [1] (🚲) bicycle
+1F6B3..1F6B5 ; Emoji # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking
+1F6B6 ; Emoji # E0.6 [1] (🚶) person walking
+1F6B7..1F6B8 ; Emoji # E1.0 [2] (🚷..🚸) no pedestrians..children crossing
+1F6B9..1F6BE ; Emoji # E0.6 [6] (🚹..🚾) men’s room..water closet
+1F6BF ; Emoji # E1.0 [1] (🚿) shower
+1F6C0 ; Emoji # E0.6 [1] (🛀) person taking bath
+1F6C1..1F6C5 ; Emoji # E1.0 [5] (🛁..🛅) bathtub..left luggage
+1F6CB ; Emoji # E0.7 [1] (🛋️) couch and lamp
+1F6CC ; Emoji # E1.0 [1] (🛌) person in bed
+1F6CD..1F6CF ; Emoji # E0.7 [3] (🛍️..🛏️) shopping bags..bed
+1F6D0 ; Emoji # E1.0 [1] (🛐) place of worship
+1F6D1..1F6D2 ; Emoji # E3.0 [2] (🛑..🛒) stop sign..shopping cart
+1F6D5 ; Emoji # E12.0 [1] (🛕) hindu temple
+1F6D6..1F6D7 ; Emoji # E13.0 [2] (🛖..🛗) hut..elevator
+1F6DC ; Emoji # E15.0 [1] (🛜) wireless
+1F6DD..1F6DF ; Emoji # E14.0 [3] (🛝..🛟) playground slide..ring buoy
+1F6E0..1F6E5 ; Emoji # E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat
+1F6E9 ; Emoji # E0.7 [1] (🛩️) small airplane
+1F6EB..1F6EC ; Emoji # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival
+1F6F0 ; Emoji # E0.7 [1] (🛰️) satellite
+1F6F3 ; Emoji # E0.7 [1] (🛳️) passenger ship
+1F6F4..1F6F6 ; Emoji # E3.0 [3] (🛴..🛶) kick scooter..canoe
+1F6F7..1F6F8 ; Emoji # E5.0 [2] (🛷..🛸) sled..flying saucer
+1F6F9 ; Emoji # E11.0 [1] (🛹) skateboard
+1F6FA ; Emoji # E12.0 [1] (🛺) auto rickshaw
+1F6FB..1F6FC ; Emoji # E13.0 [2] (🛻..🛼) pickup truck..roller skate
+1F7E0..1F7EB ; Emoji # E12.0 [12] (🟠..🟫) orange circle..brown square
+1F7F0 ; Emoji # E14.0 [1] (🟰) heavy equals sign
+1F90C ; Emoji # E13.0 [1] (🤌) pinched fingers
+1F90D..1F90F ; Emoji # E12.0 [3] (🤍..🤏) white heart..pinching hand
+1F910..1F918 ; Emoji # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
+1F919..1F91E ; Emoji # E3.0 [6] (🤙..🤞) call me hand..crossed fingers
+1F91F ; Emoji # E5.0 [1] (🤟) love-you gesture
+1F920..1F927 ; Emoji # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face
+1F928..1F92F ; Emoji # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
+1F930 ; Emoji # E3.0 [1] (🤰) pregnant woman
+1F931..1F932 ; Emoji # E5.0 [2] (🤱..🤲) breast-feeding..palms up together
+1F933..1F93A ; Emoji # E3.0 [8] (🤳..🤺) selfie..person fencing
+1F93C..1F93E ; Emoji # E3.0 [3] (🤼..🤾) people wrestling..person playing handball
+1F93F ; Emoji # E12.0 [1] (🤿) diving mask
+1F940..1F945 ; Emoji # E3.0 [6] (🥀..🥅) wilted flower..goal net
+1F947..1F94B ; Emoji # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
+1F94C ; Emoji # E5.0 [1] (🥌) curling stone
+1F94D..1F94F ; Emoji # E11.0 [3] (🥍..🥏) lacrosse..flying disc
+1F950..1F95E ; Emoji # E3.0 [15] (🥐..🥞) croissant..pancakes
+1F95F..1F96B ; Emoji # E5.0 [13] (🥟..🥫) dumpling..canned food
+1F96C..1F970 ; Emoji # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
+1F971 ; Emoji # E12.0 [1] (🥱) yawning face
+1F972 ; Emoji # E13.0 [1] (🥲) smiling face with tear
+1F973..1F976 ; Emoji # E11.0 [4] (🥳..🥶) partying face..cold face
+1F977..1F978 ; Emoji # E13.0 [2] (🥷..🥸) ninja..disguised face
+1F979 ; Emoji # E14.0 [1] (🥹) face holding back tears
+1F97A ; Emoji # E11.0 [1] (🥺) pleading face
+1F97B ; Emoji # E12.0 [1] (🥻) sari
+1F97C..1F97F ; Emoji # E11.0 [4] (🥼..🥿) lab coat..flat shoe
+1F980..1F984 ; Emoji # E1.0 [5] (🦀..🦄) crab..unicorn
+1F985..1F991 ; Emoji # E3.0 [13] (🦅..🦑) eagle..squid
+1F992..1F997 ; Emoji # E5.0 [6] (🦒..🦗) giraffe..cricket
+1F998..1F9A2 ; Emoji # E11.0 [11] (🦘..🦢) kangaroo..swan
+1F9A3..1F9A4 ; Emoji # E13.0 [2] (🦣..🦤) mammoth..dodo
+1F9A5..1F9AA ; Emoji # E12.0 [6] (🦥..🦪) sloth..oyster
+1F9AB..1F9AD ; Emoji # E13.0 [3] (🦫..🦭) beaver..seal
+1F9AE..1F9AF ; Emoji # E12.0 [2] (🦮..🦯) guide dog..white cane
+1F9B0..1F9B9 ; Emoji # E11.0 [10] (🦰..🦹) red hair..supervillain
+1F9BA..1F9BF ; Emoji # E12.0 [6] (🦺..🦿) safety vest..mechanical leg
+1F9C0 ; Emoji # E1.0 [1] (🧀) cheese wedge
+1F9C1..1F9C2 ; Emoji # E11.0 [2] (🧁..🧂) cupcake..salt
+1F9C3..1F9CA ; Emoji # E12.0 [8] (🧃..🧊) beverage box..ice
+1F9CB ; Emoji # E13.0 [1] (🧋) bubble tea
+1F9CC ; Emoji # E14.0 [1] (🧌) troll
+1F9CD..1F9CF ; Emoji # E12.0 [3] (🧍..🧏) person standing..deaf person
+1F9D0..1F9E6 ; Emoji # E5.0 [23] (🧐..🧦) face with monocle..socks
+1F9E7..1F9FF ; Emoji # E11.0 [25] (🧧..🧿) red envelope..nazar amulet
+1FA70..1FA73 ; Emoji # E12.0 [4] (🩰..🩳) ballet shoes..shorts
+1FA74 ; Emoji # E13.0 [1] (🩴) thong sandal
+1FA75..1FA77 ; Emoji # E15.0 [3] (🩵..🩷) light blue heart..pink heart
+1FA78..1FA7A ; Emoji # E12.0 [3] (🩸..🩺) drop of blood..stethoscope
+1FA7B..1FA7C ; Emoji # E14.0 [2] (🩻..🩼) x-ray..crutch
+1FA80..1FA82 ; Emoji # E12.0 [3] (🪀..🪂) yo-yo..parachute
+1FA83..1FA86 ; Emoji # E13.0 [4] (🪃..🪆) boomerang..nesting dolls
+1FA87..1FA88 ; Emoji # E15.0 [2] (🪇..🪈) maracas..flute
+1FA90..1FA95 ; Emoji # E12.0 [6] (🪐..🪕) ringed planet..banjo
+1FA96..1FAA8 ; Emoji # E13.0 [19] (🪖..🪨) military helmet..rock
+1FAA9..1FAAC ; Emoji # E14.0 [4] (🪩..🪬) mirror ball..hamsa
+1FAAD..1FAAF ; Emoji # E15.0 [3] (🪭..🪯) folding hand fan..khanda
+1FAB0..1FAB6 ; Emoji # E13.0 [7] (🪰..🪶) fly..feather
+1FAB7..1FABA ; Emoji # E14.0 [4] (🪷..🪺) lotus..nest with eggs
+1FABB..1FABD ; Emoji # E15.0 [3] (🪻..🪽) hyacinth..wing
+1FABF ; Emoji # E15.0 [1] (🪿) goose
+1FAC0..1FAC2 ; Emoji # E13.0 [3] (🫀..🫂) anatomical heart..people hugging
+1FAC3..1FAC5 ; Emoji # E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FACE..1FACF ; Emoji # E15.0 [2] (🫎..🫏) moose..donkey
+1FAD0..1FAD6 ; Emoji # E13.0 [7] (🫐..🫖) blueberries..teapot
+1FAD7..1FAD9 ; Emoji # E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FADA..1FADB ; Emoji # E15.0 [2] (🫚..🫛) ginger root..pea pod
+1FAE0..1FAE7 ; Emoji # E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAE8 ; Emoji # E15.0 [1] (🫨) shaking face
+1FAF0..1FAF6 ; Emoji # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8 ; Emoji # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 1424
+
+# ================================================
+
+# All omitted code points have Emoji_Presentation=No
+
+231A..231B ; Emoji_Presentation # E0.6 [2] (⌚..⌛) watch..hourglass done
+23E9..23EC ; Emoji_Presentation # E0.6 [4] (⏩..⏬) fast-forward button..fast down button
+23F0 ; Emoji_Presentation # E0.6 [1] (⏰) alarm clock
+23F3 ; Emoji_Presentation # E0.6 [1] (⏳) hourglass not done
+25FD..25FE ; Emoji_Presentation # E0.6 [2] (◽..◾) white medium-small square..black medium-small square
+2614..2615 ; Emoji_Presentation # E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage
+2648..2653 ; Emoji_Presentation # E0.6 [12] (♈..♓) Aries..Pisces
+267F ; Emoji_Presentation # E0.6 [1] (♿) wheelchair symbol
+2693 ; Emoji_Presentation # E0.6 [1] (⚓) anchor
+26A1 ; Emoji_Presentation # E0.6 [1] (⚡) high voltage
+26AA..26AB ; Emoji_Presentation # E0.6 [2] (⚪..⚫) white circle..black circle
+26BD..26BE ; Emoji_Presentation # E0.6 [2] (⚽..⚾) soccer ball..baseball
+26C4..26C5 ; Emoji_Presentation # E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud
+26CE ; Emoji_Presentation # E0.6 [1] (⛎) Ophiuchus
+26D4 ; Emoji_Presentation # E0.6 [1] (⛔) no entry
+26EA ; Emoji_Presentation # E0.6 [1] (⛪) church
+26F2..26F3 ; Emoji_Presentation # E0.6 [2] (⛲..⛳) fountain..flag in hole
+26F5 ; Emoji_Presentation # E0.6 [1] (⛵) sailboat
+26FA ; Emoji_Presentation # E0.6 [1] (⛺) tent
+26FD ; Emoji_Presentation # E0.6 [1] (⛽) fuel pump
+2705 ; Emoji_Presentation # E0.6 [1] (✅) check mark button
+270A..270B ; Emoji_Presentation # E0.6 [2] (✊..✋) raised fist..raised hand
+2728 ; Emoji_Presentation # E0.6 [1] (✨) sparkles
+274C ; Emoji_Presentation # E0.6 [1] (❌) cross mark
+274E ; Emoji_Presentation # E0.6 [1] (❎) cross mark button
+2753..2755 ; Emoji_Presentation # E0.6 [3] (❓..❕) red question mark..white exclamation mark
+2757 ; Emoji_Presentation # E0.6 [1] (❗) red exclamation mark
+2795..2797 ; Emoji_Presentation # E0.6 [3] (➕..➗) plus..divide
+27B0 ; Emoji_Presentation # E0.6 [1] (➰) curly loop
+27BF ; Emoji_Presentation # E1.0 [1] (➿) double curly loop
+2B1B..2B1C ; Emoji_Presentation # E0.6 [2] (⬛..⬜) black large square..white large square
+2B50 ; Emoji_Presentation # E0.6 [1] (⭐) star
+2B55 ; Emoji_Presentation # E0.6 [1] (⭕) hollow red circle
+1F004 ; Emoji_Presentation # E0.6 [1] (🀄) mahjong red dragon
+1F0CF ; Emoji_Presentation # E0.6 [1] (🃏) joker
+1F18E ; Emoji_Presentation # E0.6 [1] (🆎) AB button (blood type)
+1F191..1F19A ; Emoji_Presentation # E0.6 [10] (🆑..🆚) CL button..VS button
+1F1E6..1F1FF ; Emoji_Presentation # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
+1F201 ; Emoji_Presentation # E0.6 [1] (🈁) Japanese “here” button
+1F21A ; Emoji_Presentation # E0.6 [1] (🈚) Japanese “free of charge” button
+1F22F ; Emoji_Presentation # E0.6 [1] (🈯) Japanese “reserved” button
+1F232..1F236 ; Emoji_Presentation # E0.6 [5] (🈲..🈶) Japanese “prohibited” button..Japanese “not free of charge” button
+1F238..1F23A ; Emoji_Presentation # E0.6 [3] (🈸..🈺) Japanese “application” button..Japanese “open for business” button
+1F250..1F251 ; Emoji_Presentation # E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
+1F300..1F30C ; Emoji_Presentation # E0.6 [13] (🌀..🌌) cyclone..milky way
+1F30D..1F30E ; Emoji_Presentation # E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas
+1F30F ; Emoji_Presentation # E0.6 [1] (🌏) globe showing Asia-Australia
+1F310 ; Emoji_Presentation # E1.0 [1] (🌐) globe with meridians
+1F311 ; Emoji_Presentation # E0.6 [1] (🌑) new moon
+1F312 ; Emoji_Presentation # E1.0 [1] (🌒) waxing crescent moon
+1F313..1F315 ; Emoji_Presentation # E0.6 [3] (🌓..🌕) first quarter moon..full moon
+1F316..1F318 ; Emoji_Presentation # E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon
+1F319 ; Emoji_Presentation # E0.6 [1] (🌙) crescent moon
+1F31A ; Emoji_Presentation # E1.0 [1] (🌚) new moon face
+1F31B ; Emoji_Presentation # E0.6 [1] (🌛) first quarter moon face
+1F31C ; Emoji_Presentation # E0.7 [1] (🌜) last quarter moon face
+1F31D..1F31E ; Emoji_Presentation # E1.0 [2] (🌝..🌞) full moon face..sun with face
+1F31F..1F320 ; Emoji_Presentation # E0.6 [2] (🌟..🌠) glowing star..shooting star
+1F32D..1F32F ; Emoji_Presentation # E1.0 [3] (🌭..🌯) hot dog..burrito
+1F330..1F331 ; Emoji_Presentation # E0.6 [2] (🌰..🌱) chestnut..seedling
+1F332..1F333 ; Emoji_Presentation # E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree
+1F334..1F335 ; Emoji_Presentation # E0.6 [2] (🌴..🌵) palm tree..cactus
+1F337..1F34A ; Emoji_Presentation # E0.6 [20] (🌷..🍊) tulip..tangerine
+1F34B ; Emoji_Presentation # E1.0 [1] (🍋) lemon
+1F34C..1F34F ; Emoji_Presentation # E0.6 [4] (🍌..🍏) banana..green apple
+1F350 ; Emoji_Presentation # E1.0 [1] (🍐) pear
+1F351..1F37B ; Emoji_Presentation # E0.6 [43] (🍑..🍻) peach..clinking beer mugs
+1F37C ; Emoji_Presentation # E1.0 [1] (🍼) baby bottle
+1F37E..1F37F ; Emoji_Presentation # E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn
+1F380..1F393 ; Emoji_Presentation # E0.6 [20] (🎀..🎓) ribbon..graduation cap
+1F3A0..1F3C4 ; Emoji_Presentation # E0.6 [37] (🎠..🏄) carousel horse..person surfing
+1F3C5 ; Emoji_Presentation # E1.0 [1] (🏅) sports medal
+1F3C6 ; Emoji_Presentation # E0.6 [1] (🏆) trophy
+1F3C7 ; Emoji_Presentation # E1.0 [1] (🏇) horse racing
+1F3C8 ; Emoji_Presentation # E0.6 [1] (🏈) american football
+1F3C9 ; Emoji_Presentation # E1.0 [1] (🏉) rugby football
+1F3CA ; Emoji_Presentation # E0.6 [1] (🏊) person swimming
+1F3CF..1F3D3 ; Emoji_Presentation # E1.0 [5] (🏏..🏓) cricket game..ping pong
+1F3E0..1F3E3 ; Emoji_Presentation # E0.6 [4] (🏠..🏣) house..Japanese post office
+1F3E4 ; Emoji_Presentation # E1.0 [1] (🏤) post office
+1F3E5..1F3F0 ; Emoji_Presentation # E0.6 [12] (🏥..🏰) hospital..castle
+1F3F4 ; Emoji_Presentation # E1.0 [1] (🏴) black flag
+1F3F8..1F407 ; Emoji_Presentation # E1.0 [16] (🏸..🐇) badminton..rabbit
+1F408 ; Emoji_Presentation # E0.7 [1] (🐈) cat
+1F409..1F40B ; Emoji_Presentation # E1.0 [3] (🐉..🐋) dragon..whale
+1F40C..1F40E ; Emoji_Presentation # E0.6 [3] (🐌..🐎) snail..horse
+1F40F..1F410 ; Emoji_Presentation # E1.0 [2] (🐏..🐐) ram..goat
+1F411..1F412 ; Emoji_Presentation # E0.6 [2] (🐑..🐒) ewe..monkey
+1F413 ; Emoji_Presentation # E1.0 [1] (🐓) rooster
+1F414 ; Emoji_Presentation # E0.6 [1] (🐔) chicken
+1F415 ; Emoji_Presentation # E0.7 [1] (🐕) dog
+1F416 ; Emoji_Presentation # E1.0 [1] (🐖) pig
+1F417..1F429 ; Emoji_Presentation # E0.6 [19] (🐗..🐩) boar..poodle
+1F42A ; Emoji_Presentation # E1.0 [1] (🐪) camel
+1F42B..1F43E ; Emoji_Presentation # E0.6 [20] (🐫..🐾) two-hump camel..paw prints
+1F440 ; Emoji_Presentation # E0.6 [1] (👀) eyes
+1F442..1F464 ; Emoji_Presentation # E0.6 [35] (👂..👤) ear..bust in silhouette
+1F465 ; Emoji_Presentation # E1.0 [1] (👥) busts in silhouette
+1F466..1F46B ; Emoji_Presentation # E0.6 [6] (👦..👫) boy..woman and man holding hands
+1F46C..1F46D ; Emoji_Presentation # E1.0 [2] (👬..👭) men holding hands..women holding hands
+1F46E..1F4AC ; Emoji_Presentation # E0.6 [63] (👮..💬) police officer..speech balloon
+1F4AD ; Emoji_Presentation # E1.0 [1] (💭) thought balloon
+1F4AE..1F4B5 ; Emoji_Presentation # E0.6 [8] (💮..💵) white flower..dollar banknote
+1F4B6..1F4B7 ; Emoji_Presentation # E1.0 [2] (💶..💷) euro banknote..pound banknote
+1F4B8..1F4EB ; Emoji_Presentation # E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Emoji_Presentation # E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Emoji_Presentation # E0.6 [1] (📮) postbox
+1F4EF ; Emoji_Presentation # E1.0 [1] (📯) postal horn
+1F4F0..1F4F4 ; Emoji_Presentation # E0.6 [5] (📰..📴) newspaper..mobile phone off
+1F4F5 ; Emoji_Presentation # E1.0 [1] (📵) no mobile phones
+1F4F6..1F4F7 ; Emoji_Presentation # E0.6 [2] (📶..📷) antenna bars..camera
+1F4F8 ; Emoji_Presentation # E1.0 [1] (📸) camera with flash
+1F4F9..1F4FC ; Emoji_Presentation # E0.6 [4] (📹..📼) video camera..videocassette
+1F4FF..1F502 ; Emoji_Presentation # E1.0 [4] (📿..🔂) prayer beads..repeat single button
+1F503 ; Emoji_Presentation # E0.6 [1] (🔃) clockwise vertical arrows
+1F504..1F507 ; Emoji_Presentation # E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker
+1F508 ; Emoji_Presentation # E0.7 [1] (🔈) speaker low volume
+1F509 ; Emoji_Presentation # E1.0 [1] (🔉) speaker medium volume
+1F50A..1F514 ; Emoji_Presentation # E0.6 [11] (🔊..🔔) speaker high volume..bell
+1F515 ; Emoji_Presentation # E1.0 [1] (🔕) bell with slash
+1F516..1F52B ; Emoji_Presentation # E0.6 [22] (🔖..🔫) bookmark..water pistol
+1F52C..1F52D ; Emoji_Presentation # E1.0 [2] (🔬..🔭) microscope..telescope
+1F52E..1F53D ; Emoji_Presentation # E0.6 [16] (🔮..🔽) crystal ball..downwards button
+1F54B..1F54E ; Emoji_Presentation # E1.0 [4] (🕋..🕎) kaaba..menorah
+1F550..1F55B ; Emoji_Presentation # E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock
+1F55C..1F567 ; Emoji_Presentation # E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty
+1F57A ; Emoji_Presentation # E3.0 [1] (🕺) man dancing
+1F595..1F596 ; Emoji_Presentation # E1.0 [2] (🖕..🖖) middle finger..vulcan salute
+1F5A4 ; Emoji_Presentation # E3.0 [1] (🖤) black heart
+1F5FB..1F5FF ; Emoji_Presentation # E0.6 [5] (🗻..🗿) mount fuji..moai
+1F600 ; Emoji_Presentation # E1.0 [1] (😀) grinning face
+1F601..1F606 ; Emoji_Presentation # E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Emoji_Presentation # E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns
+1F609..1F60D ; Emoji_Presentation # E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes
+1F60E ; Emoji_Presentation # E1.0 [1] (😎) smiling face with sunglasses
+1F60F ; Emoji_Presentation # E0.6 [1] (😏) smirking face
+1F610 ; Emoji_Presentation # E0.7 [1] (😐) neutral face
+1F611 ; Emoji_Presentation # E1.0 [1] (😑) expressionless face
+1F612..1F614 ; Emoji_Presentation # E0.6 [3] (😒..😔) unamused face..pensive face
+1F615 ; Emoji_Presentation # E1.0 [1] (😕) confused face
+1F616 ; Emoji_Presentation # E0.6 [1] (😖) confounded face
+1F617 ; Emoji_Presentation # E1.0 [1] (😗) kissing face
+1F618 ; Emoji_Presentation # E0.6 [1] (😘) face blowing a kiss
+1F619 ; Emoji_Presentation # E1.0 [1] (😙) kissing face with smiling eyes
+1F61A ; Emoji_Presentation # E0.6 [1] (😚) kissing face with closed eyes
+1F61B ; Emoji_Presentation # E1.0 [1] (😛) face with tongue
+1F61C..1F61E ; Emoji_Presentation # E0.6 [3] (😜..😞) winking face with tongue..disappointed face
+1F61F ; Emoji_Presentation # E1.0 [1] (😟) worried face
+1F620..1F625 ; Emoji_Presentation # E0.6 [6] (😠..😥) angry face..sad but relieved face
+1F626..1F627 ; Emoji_Presentation # E1.0 [2] (😦..😧) frowning face with open mouth..anguished face
+1F628..1F62B ; Emoji_Presentation # E0.6 [4] (😨..😫) fearful face..tired face
+1F62C ; Emoji_Presentation # E1.0 [1] (😬) grimacing face
+1F62D ; Emoji_Presentation # E0.6 [1] (😭) loudly crying face
+1F62E..1F62F ; Emoji_Presentation # E1.0 [2] (😮..😯) face with open mouth..hushed face
+1F630..1F633 ; Emoji_Presentation # E0.6 [4] (😰..😳) anxious face with sweat..flushed face
+1F634 ; Emoji_Presentation # E1.0 [1] (😴) sleeping face
+1F635 ; Emoji_Presentation # E0.6 [1] (😵) face with crossed-out eyes
+1F636 ; Emoji_Presentation # E1.0 [1] (😶) face without mouth
+1F637..1F640 ; Emoji_Presentation # E0.6 [10] (😷..🙀) face with medical mask..weary cat
+1F641..1F644 ; Emoji_Presentation # E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Emoji_Presentation # E0.6 [11] (🙅..🙏) person gesturing NO..folded hands
+1F680 ; Emoji_Presentation # E0.6 [1] (🚀) rocket
+1F681..1F682 ; Emoji_Presentation # E1.0 [2] (🚁..🚂) helicopter..locomotive
+1F683..1F685 ; Emoji_Presentation # E0.6 [3] (🚃..🚅) railway car..bullet train
+1F686 ; Emoji_Presentation # E1.0 [1] (🚆) train
+1F687 ; Emoji_Presentation # E0.6 [1] (🚇) metro
+1F688 ; Emoji_Presentation # E1.0 [1] (🚈) light rail
+1F689 ; Emoji_Presentation # E0.6 [1] (🚉) station
+1F68A..1F68B ; Emoji_Presentation # E1.0 [2] (🚊..🚋) tram..tram car
+1F68C ; Emoji_Presentation # E0.6 [1] (🚌) bus
+1F68D ; Emoji_Presentation # E0.7 [1] (🚍) oncoming bus
+1F68E ; Emoji_Presentation # E1.0 [1] (🚎) trolleybus
+1F68F ; Emoji_Presentation # E0.6 [1] (🚏) bus stop
+1F690 ; Emoji_Presentation # E1.0 [1] (🚐) minibus
+1F691..1F693 ; Emoji_Presentation # E0.6 [3] (🚑..🚓) ambulance..police car
+1F694 ; Emoji_Presentation # E0.7 [1] (🚔) oncoming police car
+1F695 ; Emoji_Presentation # E0.6 [1] (🚕) taxi
+1F696 ; Emoji_Presentation # E1.0 [1] (🚖) oncoming taxi
+1F697 ; Emoji_Presentation # E0.6 [1] (🚗) automobile
+1F698 ; Emoji_Presentation # E0.7 [1] (🚘) oncoming automobile
+1F699..1F69A ; Emoji_Presentation # E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Emoji_Presentation # E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway
+1F6A2 ; Emoji_Presentation # E0.6 [1] (🚢) ship
+1F6A3 ; Emoji_Presentation # E1.0 [1] (🚣) person rowing boat
+1F6A4..1F6A5 ; Emoji_Presentation # E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light
+1F6A6 ; Emoji_Presentation # E1.0 [1] (🚦) vertical traffic light
+1F6A7..1F6AD ; Emoji_Presentation # E0.6 [7] (🚧..🚭) construction..no smoking
+1F6AE..1F6B1 ; Emoji_Presentation # E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water
+1F6B2 ; Emoji_Presentation # E0.6 [1] (🚲) bicycle
+1F6B3..1F6B5 ; Emoji_Presentation # E1.0 [3] (🚳..🚵) no bicycles..person mountain biking
+1F6B6 ; Emoji_Presentation # E0.6 [1] (🚶) person walking
+1F6B7..1F6B8 ; Emoji_Presentation # E1.0 [2] (🚷..🚸) no pedestrians..children crossing
+1F6B9..1F6BE ; Emoji_Presentation # E0.6 [6] (🚹..🚾) men’s room..water closet
+1F6BF ; Emoji_Presentation # E1.0 [1] (🚿) shower
+1F6C0 ; Emoji_Presentation # E0.6 [1] (🛀) person taking bath
+1F6C1..1F6C5 ; Emoji_Presentation # E1.0 [5] (🛁..🛅) bathtub..left luggage
+1F6CC ; Emoji_Presentation # E1.0 [1] (🛌) person in bed
+1F6D0 ; Emoji_Presentation # E1.0 [1] (🛐) place of worship
+1F6D1..1F6D2 ; Emoji_Presentation # E3.0 [2] (🛑..🛒) stop sign..shopping cart
+1F6D5 ; Emoji_Presentation # E12.0 [1] (🛕) hindu temple
+1F6D6..1F6D7 ; Emoji_Presentation # E13.0 [2] (🛖..🛗) hut..elevator
+1F6DC ; Emoji_Presentation # E15.0 [1] (🛜) wireless
+1F6DD..1F6DF ; Emoji_Presentation # E14.0 [3] (🛝..🛟) playground slide..ring buoy
+1F6EB..1F6EC ; Emoji_Presentation # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival
+1F6F4..1F6F6 ; Emoji_Presentation # E3.0 [3] (🛴..🛶) kick scooter..canoe
+1F6F7..1F6F8 ; Emoji_Presentation # E5.0 [2] (🛷..🛸) sled..flying saucer
+1F6F9 ; Emoji_Presentation # E11.0 [1] (🛹) skateboard
+1F6FA ; Emoji_Presentation # E12.0 [1] (🛺) auto rickshaw
+1F6FB..1F6FC ; Emoji_Presentation # E13.0 [2] (🛻..🛼) pickup truck..roller skate
+1F7E0..1F7EB ; Emoji_Presentation # E12.0 [12] (🟠..🟫) orange circle..brown square
+1F7F0 ; Emoji_Presentation # E14.0 [1] (🟰) heavy equals sign
+1F90C ; Emoji_Presentation # E13.0 [1] (🤌) pinched fingers
+1F90D..1F90F ; Emoji_Presentation # E12.0 [3] (🤍..🤏) white heart..pinching hand
+1F910..1F918 ; Emoji_Presentation # E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
+1F919..1F91E ; Emoji_Presentation # E3.0 [6] (🤙..🤞) call me hand..crossed fingers
+1F91F ; Emoji_Presentation # E5.0 [1] (🤟) love-you gesture
+1F920..1F927 ; Emoji_Presentation # E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face
+1F928..1F92F ; Emoji_Presentation # E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
+1F930 ; Emoji_Presentation # E3.0 [1] (🤰) pregnant woman
+1F931..1F932 ; Emoji_Presentation # E5.0 [2] (🤱..🤲) breast-feeding..palms up together
+1F933..1F93A ; Emoji_Presentation # E3.0 [8] (🤳..🤺) selfie..person fencing
+1F93C..1F93E ; Emoji_Presentation # E3.0 [3] (🤼..🤾) people wrestling..person playing handball
+1F93F ; Emoji_Presentation # E12.0 [1] (🤿) diving mask
+1F940..1F945 ; Emoji_Presentation # E3.0 [6] (🥀..🥅) wilted flower..goal net
+1F947..1F94B ; Emoji_Presentation # E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
+1F94C ; Emoji_Presentation # E5.0 [1] (🥌) curling stone
+1F94D..1F94F ; Emoji_Presentation # E11.0 [3] (🥍..🥏) lacrosse..flying disc
+1F950..1F95E ; Emoji_Presentation # E3.0 [15] (🥐..🥞) croissant..pancakes
+1F95F..1F96B ; Emoji_Presentation # E5.0 [13] (🥟..🥫) dumpling..canned food
+1F96C..1F970 ; Emoji_Presentation # E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
+1F971 ; Emoji_Presentation # E12.0 [1] (🥱) yawning face
+1F972 ; Emoji_Presentation # E13.0 [1] (🥲) smiling face with tear
+1F973..1F976 ; Emoji_Presentation # E11.0 [4] (🥳..🥶) partying face..cold face
+1F977..1F978 ; Emoji_Presentation # E13.0 [2] (🥷..🥸) ninja..disguised face
+1F979 ; Emoji_Presentation # E14.0 [1] (🥹) face holding back tears
+1F97A ; Emoji_Presentation # E11.0 [1] (🥺) pleading face
+1F97B ; Emoji_Presentation # E12.0 [1] (🥻) sari
+1F97C..1F97F ; Emoji_Presentation # E11.0 [4] (🥼..🥿) lab coat..flat shoe
+1F980..1F984 ; Emoji_Presentation # E1.0 [5] (🦀..🦄) crab..unicorn
+1F985..1F991 ; Emoji_Presentation # E3.0 [13] (🦅..🦑) eagle..squid
+1F992..1F997 ; Emoji_Presentation # E5.0 [6] (🦒..🦗) giraffe..cricket
+1F998..1F9A2 ; Emoji_Presentation # E11.0 [11] (🦘..🦢) kangaroo..swan
+1F9A3..1F9A4 ; Emoji_Presentation # E13.0 [2] (🦣..🦤) mammoth..dodo
+1F9A5..1F9AA ; Emoji_Presentation # E12.0 [6] (🦥..🦪) sloth..oyster
+1F9AB..1F9AD ; Emoji_Presentation # E13.0 [3] (🦫..🦭) beaver..seal
+1F9AE..1F9AF ; Emoji_Presentation # E12.0 [2] (🦮..🦯) guide dog..white cane
+1F9B0..1F9B9 ; Emoji_Presentation # E11.0 [10] (🦰..🦹) red hair..supervillain
+1F9BA..1F9BF ; Emoji_Presentation # E12.0 [6] (🦺..🦿) safety vest..mechanical leg
+1F9C0 ; Emoji_Presentation # E1.0 [1] (🧀) cheese wedge
+1F9C1..1F9C2 ; Emoji_Presentation # E11.0 [2] (🧁..🧂) cupcake..salt
+1F9C3..1F9CA ; Emoji_Presentation # E12.0 [8] (🧃..🧊) beverage box..ice
+1F9CB ; Emoji_Presentation # E13.0 [1] (🧋) bubble tea
+1F9CC ; Emoji_Presentation # E14.0 [1] (🧌) troll
+1F9CD..1F9CF ; Emoji_Presentation # E12.0 [3] (🧍..🧏) person standing..deaf person
+1F9D0..1F9E6 ; Emoji_Presentation # E5.0 [23] (🧐..🧦) face with monocle..socks
+1F9E7..1F9FF ; Emoji_Presentation # E11.0 [25] (🧧..🧿) red envelope..nazar amulet
+1FA70..1FA73 ; Emoji_Presentation # E12.0 [4] (🩰..🩳) ballet shoes..shorts
+1FA74 ; Emoji_Presentation # E13.0 [1] (🩴) thong sandal
+1FA75..1FA77 ; Emoji_Presentation # E15.0 [3] (🩵..🩷) light blue heart..pink heart
+1FA78..1FA7A ; Emoji_Presentation # E12.0 [3] (🩸..🩺) drop of blood..stethoscope
+1FA7B..1FA7C ; Emoji_Presentation # E14.0 [2] (🩻..🩼) x-ray..crutch
+1FA80..1FA82 ; Emoji_Presentation # E12.0 [3] (🪀..🪂) yo-yo..parachute
+1FA83..1FA86 ; Emoji_Presentation # E13.0 [4] (🪃..🪆) boomerang..nesting dolls
+1FA87..1FA88 ; Emoji_Presentation # E15.0 [2] (🪇..🪈) maracas..flute
+1FA90..1FA95 ; Emoji_Presentation # E12.0 [6] (🪐..🪕) ringed planet..banjo
+1FA96..1FAA8 ; Emoji_Presentation # E13.0 [19] (🪖..🪨) military helmet..rock
+1FAA9..1FAAC ; Emoji_Presentation # E14.0 [4] (🪩..🪬) mirror ball..hamsa
+1FAAD..1FAAF ; Emoji_Presentation # E15.0 [3] (🪭..🪯) folding hand fan..khanda
+1FAB0..1FAB6 ; Emoji_Presentation # E13.0 [7] (🪰..🪶) fly..feather
+1FAB7..1FABA ; Emoji_Presentation # E14.0 [4] (🪷..🪺) lotus..nest with eggs
+1FABB..1FABD ; Emoji_Presentation # E15.0 [3] (🪻..🪽) hyacinth..wing
+1FABF ; Emoji_Presentation # E15.0 [1] (🪿) goose
+1FAC0..1FAC2 ; Emoji_Presentation # E13.0 [3] (🫀..🫂) anatomical heart..people hugging
+1FAC3..1FAC5 ; Emoji_Presentation # E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FACE..1FACF ; Emoji_Presentation # E15.0 [2] (🫎..🫏) moose..donkey
+1FAD0..1FAD6 ; Emoji_Presentation # E13.0 [7] (🫐..🫖) blueberries..teapot
+1FAD7..1FAD9 ; Emoji_Presentation # E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FADA..1FADB ; Emoji_Presentation # E15.0 [2] (🫚..🫛) ginger root..pea pod
+1FAE0..1FAE7 ; Emoji_Presentation # E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAE8 ; Emoji_Presentation # E15.0 [1] (🫨) shaking face
+1FAF0..1FAF6 ; Emoji_Presentation # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8 ; Emoji_Presentation # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 1205
+
+# ================================================
+
+# All omitted code points have Emoji_Modifier=No
+
+1F3FB..1F3FF ; Emoji_Modifier # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone
+
+# Total elements: 5
+
+# ================================================
+
+# All omitted code points have Emoji_Modifier_Base=No
+
+261D ; Emoji_Modifier_Base # E0.6 [1] (☝️) index pointing up
+26F9 ; Emoji_Modifier_Base # E0.7 [1] (⛹️) person bouncing ball
+270A..270C ; Emoji_Modifier_Base # E0.6 [3] (✊..✌️) raised fist..victory hand
+270D ; Emoji_Modifier_Base # E0.7 [1] (✍️) writing hand
+1F385 ; Emoji_Modifier_Base # E0.6 [1] (🎅) Santa Claus
+1F3C2..1F3C4 ; Emoji_Modifier_Base # E0.6 [3] (🏂..🏄) snowboarder..person surfing
+1F3C7 ; Emoji_Modifier_Base # E1.0 [1] (🏇) horse racing
+1F3CA ; Emoji_Modifier_Base # E0.6 [1] (🏊) person swimming
+1F3CB..1F3CC ; Emoji_Modifier_Base # E0.7 [2] (🏋️..🏌️) person lifting weights..person golfing
+1F442..1F443 ; Emoji_Modifier_Base # E0.6 [2] (👂..👃) ear..nose
+1F446..1F450 ; Emoji_Modifier_Base # E0.6 [11] (👆..👐) backhand index pointing up..open hands
+1F466..1F46B ; Emoji_Modifier_Base # E0.6 [6] (👦..👫) boy..woman and man holding hands
+1F46C..1F46D ; Emoji_Modifier_Base # E1.0 [2] (👬..👭) men holding hands..women holding hands
+1F46E..1F478 ; Emoji_Modifier_Base # E0.6 [11] (👮..👸) police officer..princess
+1F47C ; Emoji_Modifier_Base # E0.6 [1] (👼) baby angel
+1F481..1F483 ; Emoji_Modifier_Base # E0.6 [3] (💁..💃) person tipping hand..woman dancing
+1F485..1F487 ; Emoji_Modifier_Base # E0.6 [3] (💅..💇) nail polish..person getting haircut
+1F48F ; Emoji_Modifier_Base # E0.6 [1] (💏) kiss
+1F491 ; Emoji_Modifier_Base # E0.6 [1] (💑) couple with heart
+1F4AA ; Emoji_Modifier_Base # E0.6 [1] (💪) flexed biceps
+1F574..1F575 ; Emoji_Modifier_Base # E0.7 [2] (🕴️..🕵️) person in suit levitating..detective
+1F57A ; Emoji_Modifier_Base # E3.0 [1] (🕺) man dancing
+1F590 ; Emoji_Modifier_Base # E0.7 [1] (🖐️) hand with fingers splayed
+1F595..1F596 ; Emoji_Modifier_Base # E1.0 [2] (🖕..🖖) middle finger..vulcan salute
+1F645..1F647 ; Emoji_Modifier_Base # E0.6 [3] (🙅..🙇) person gesturing NO..person bowing
+1F64B..1F64F ; Emoji_Modifier_Base # E0.6 [5] (🙋..🙏) person raising hand..folded hands
+1F6A3 ; Emoji_Modifier_Base # E1.0 [1] (🚣) person rowing boat
+1F6B4..1F6B5 ; Emoji_Modifier_Base # E1.0 [2] (🚴..🚵) person biking..person mountain biking
+1F6B6 ; Emoji_Modifier_Base # E0.6 [1] (🚶) person walking
+1F6C0 ; Emoji_Modifier_Base # E0.6 [1] (🛀) person taking bath
+1F6CC ; Emoji_Modifier_Base # E1.0 [1] (🛌) person in bed
+1F90C ; Emoji_Modifier_Base # E13.0 [1] (🤌) pinched fingers
+1F90F ; Emoji_Modifier_Base # E12.0 [1] (🤏) pinching hand
+1F918 ; Emoji_Modifier_Base # E1.0 [1] (🤘) sign of the horns
+1F919..1F91E ; Emoji_Modifier_Base # E3.0 [6] (🤙..🤞) call me hand..crossed fingers
+1F91F ; Emoji_Modifier_Base # E5.0 [1] (🤟) love-you gesture
+1F926 ; Emoji_Modifier_Base # E3.0 [1] (🤦) person facepalming
+1F930 ; Emoji_Modifier_Base # E3.0 [1] (🤰) pregnant woman
+1F931..1F932 ; Emoji_Modifier_Base # E5.0 [2] (🤱..🤲) breast-feeding..palms up together
+1F933..1F939 ; Emoji_Modifier_Base # E3.0 [7] (🤳..🤹) selfie..person juggling
+1F93C..1F93E ; Emoji_Modifier_Base # E3.0 [3] (🤼..🤾) people wrestling..person playing handball
+1F977 ; Emoji_Modifier_Base # E13.0 [1] (🥷) ninja
+1F9B5..1F9B6 ; Emoji_Modifier_Base # E11.0 [2] (🦵..🦶) leg..foot
+1F9B8..1F9B9 ; Emoji_Modifier_Base # E11.0 [2] (🦸..🦹) superhero..supervillain
+1F9BB ; Emoji_Modifier_Base # E12.0 [1] (🦻) ear with hearing aid
+1F9CD..1F9CF ; Emoji_Modifier_Base # E12.0 [3] (🧍..🧏) person standing..deaf person
+1F9D1..1F9DD ; Emoji_Modifier_Base # E5.0 [13] (🧑..🧝) person..elf
+1FAC3..1FAC5 ; Emoji_Modifier_Base # E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FAF0..1FAF6 ; Emoji_Modifier_Base # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8 ; Emoji_Modifier_Base # E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand
+
+# Total elements: 134
+
+# ================================================
+
+# All omitted code points have Emoji_Component=No
+
+0023 ; Emoji_Component # E0.0 [1] (#️) hash sign
+002A ; Emoji_Component # E0.0 [1] (*️) asterisk
+0030..0039 ; Emoji_Component # E0.0 [10] (0️..9️) digit zero..digit nine
+200D ; Emoji_Component # E0.0 [1] (‍) zero width joiner
+20E3 ; Emoji_Component # E0.0 [1] (⃣) combining enclosing keycap
+FE0F ; Emoji_Component # E0.0 [1] () VARIATION SELECTOR-16
+1F1E6..1F1FF ; Emoji_Component # E0.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
+1F3FB..1F3FF ; Emoji_Component # E1.0 [5] (🏻..🏿) light skin tone..dark skin tone
+1F9B0..1F9B3 ; Emoji_Component # E11.0 [4] (🦰..🦳) red hair..white hair
+E0020..E007F ; Emoji_Component # E0.0 [96] (󠀠..󠁿) tag space..cancel tag
+
+# Total elements: 146
+
+# ================================================
+
+# All omitted code points have Extended_Pictographic=No
+
+00A9 ; Extended_Pictographic# E0.6 [1] (©️) copyright
+00AE ; Extended_Pictographic# E0.6 [1] (®️) registered
+203C ; Extended_Pictographic# E0.6 [1] (‼️) double exclamation mark
+2049 ; Extended_Pictographic# E0.6 [1] (⁉️) exclamation question mark
+2122 ; Extended_Pictographic# E0.6 [1] (™️) trade mark
+2139 ; Extended_Pictographic# E0.6 [1] (ℹ️) information
+2194..2199 ; Extended_Pictographic# E0.6 [6] (↔️..↙️) left-right arrow..down-left arrow
+21A9..21AA ; Extended_Pictographic# E0.6 [2] (↩️..↪️) right arrow curving left..left arrow curving right
+231A..231B ; Extended_Pictographic# E0.6 [2] (⌚..⌛) watch..hourglass done
+2328 ; Extended_Pictographic# E1.0 [1] (⌨️) keyboard
+2388 ; Extended_Pictographic# E0.0 [1] (⎈) HELM SYMBOL
+23CF ; Extended_Pictographic# E1.0 [1] (⏏️) eject button
+23E9..23EC ; Extended_Pictographic# E0.6 [4] (⏩..⏬) fast-forward button..fast down button
+23ED..23EE ; Extended_Pictographic# E0.7 [2] (⏭️..⏮️) next track button..last track button
+23EF ; Extended_Pictographic# E1.0 [1] (⏯️) play or pause button
+23F0 ; Extended_Pictographic# E0.6 [1] (⏰) alarm clock
+23F1..23F2 ; Extended_Pictographic# E1.0 [2] (⏱️..⏲️) stopwatch..timer clock
+23F3 ; Extended_Pictographic# E0.6 [1] (⏳) hourglass not done
+23F8..23FA ; Extended_Pictographic# E0.7 [3] (⏸️..⏺️) pause button..record button
+24C2 ; Extended_Pictographic# E0.6 [1] (Ⓜ️) circled M
+25AA..25AB ; Extended_Pictographic# E0.6 [2] (▪️..▫️) black small square..white small square
+25B6 ; Extended_Pictographic# E0.6 [1] (▶️) play button
+25C0 ; Extended_Pictographic# E0.6 [1] (◀️) reverse button
+25FB..25FE ; Extended_Pictographic# E0.6 [4] (◻️..◾) white medium square..black medium-small square
+2600..2601 ; Extended_Pictographic# E0.6 [2] (☀️..☁️) sun..cloud
+2602..2603 ; Extended_Pictographic# E0.7 [2] (☂️..☃️) umbrella..snowman
+2604 ; Extended_Pictographic# E1.0 [1] (☄️) comet
+2605 ; Extended_Pictographic# E0.0 [1] (★) BLACK STAR
+2607..260D ; Extended_Pictographic# E0.0 [7] (☇..☍) LIGHTNING..OPPOSITION
+260E ; Extended_Pictographic# E0.6 [1] (☎️) telephone
+260F..2610 ; Extended_Pictographic# E0.0 [2] (☏..☐) WHITE TELEPHONE..BALLOT BOX
+2611 ; Extended_Pictographic# E0.6 [1] (☑️) check box with check
+2612 ; Extended_Pictographic# E0.0 [1] (☒) BALLOT BOX WITH X
+2614..2615 ; Extended_Pictographic# E0.6 [2] (☔..☕) umbrella with rain drops..hot beverage
+2616..2617 ; Extended_Pictographic# E0.0 [2] (☖..☗) WHITE SHOGI PIECE..BLACK SHOGI PIECE
+2618 ; Extended_Pictographic# E1.0 [1] (☘️) shamrock
+2619..261C ; Extended_Pictographic# E0.0 [4] (☙..☜) REVERSED ROTATED FLORAL HEART BULLET..WHITE LEFT POINTING INDEX
+261D ; Extended_Pictographic# E0.6 [1] (☝️) index pointing up
+261E..261F ; Extended_Pictographic# E0.0 [2] (☞..☟) WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX
+2620 ; Extended_Pictographic# E1.0 [1] (☠️) skull and crossbones
+2621 ; Extended_Pictographic# E0.0 [1] (☡) CAUTION SIGN
+2622..2623 ; Extended_Pictographic# E1.0 [2] (☢️..☣️) radioactive..biohazard
+2624..2625 ; Extended_Pictographic# E0.0 [2] (☤..☥) CADUCEUS..ANKH
+2626 ; Extended_Pictographic# E1.0 [1] (☦️) orthodox cross
+2627..2629 ; Extended_Pictographic# E0.0 [3] (☧..☩) CHI RHO..CROSS OF JERUSALEM
+262A ; Extended_Pictographic# E0.7 [1] (☪️) star and crescent
+262B..262D ; Extended_Pictographic# E0.0 [3] (☫..☭) FARSI SYMBOL..HAMMER AND SICKLE
+262E ; Extended_Pictographic# E1.0 [1] (☮️) peace symbol
+262F ; Extended_Pictographic# E0.7 [1] (☯️) yin yang
+2630..2637 ; Extended_Pictographic# E0.0 [8] (☰..☷) TRIGRAM FOR HEAVEN..TRIGRAM FOR EARTH
+2638..2639 ; Extended_Pictographic# E0.7 [2] (☸️..☹️) wheel of dharma..frowning face
+263A ; Extended_Pictographic# E0.6 [1] (☺️) smiling face
+263B..263F ; Extended_Pictographic# E0.0 [5] (☻..☿) BLACK SMILING FACE..MERCURY
+2640 ; Extended_Pictographic# E4.0 [1] (♀️) female sign
+2641 ; Extended_Pictographic# E0.0 [1] (♁) EARTH
+2642 ; Extended_Pictographic# E4.0 [1] (♂️) male sign
+2643..2647 ; Extended_Pictographic# E0.0 [5] (♃..♇) JUPITER..PLUTO
+2648..2653 ; Extended_Pictographic# E0.6 [12] (♈..♓) Aries..Pisces
+2654..265E ; Extended_Pictographic# E0.0 [11] (♔..♞) WHITE CHESS KING..BLACK CHESS KNIGHT
+265F ; Extended_Pictographic# E11.0 [1] (♟️) chess pawn
+2660 ; Extended_Pictographic# E0.6 [1] (♠️) spade suit
+2661..2662 ; Extended_Pictographic# E0.0 [2] (♡..♢) WHITE HEART SUIT..WHITE DIAMOND SUIT
+2663 ; Extended_Pictographic# E0.6 [1] (♣️) club suit
+2664 ; Extended_Pictographic# E0.0 [1] (♤) WHITE SPADE SUIT
+2665..2666 ; Extended_Pictographic# E0.6 [2] (♥️..♦️) heart suit..diamond suit
+2667 ; Extended_Pictographic# E0.0 [1] (♧) WHITE CLUB SUIT
+2668 ; Extended_Pictographic# E0.6 [1] (♨️) hot springs
+2669..267A ; Extended_Pictographic# E0.0 [18] (♩..♺) QUARTER NOTE..RECYCLING SYMBOL FOR GENERIC MATERIALS
+267B ; Extended_Pictographic# E0.6 [1] (♻️) recycling symbol
+267C..267D ; Extended_Pictographic# E0.0 [2] (♼..♽) RECYCLED PAPER SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL
+267E ; Extended_Pictographic# E11.0 [1] (♾️) infinity
+267F ; Extended_Pictographic# E0.6 [1] (♿) wheelchair symbol
+2680..2685 ; Extended_Pictographic# E0.0 [6] (⚀..⚅) DIE FACE-1..DIE FACE-6
+2690..2691 ; Extended_Pictographic# E0.0 [2] (⚐..⚑) WHITE FLAG..BLACK FLAG
+2692 ; Extended_Pictographic# E1.0 [1] (⚒️) hammer and pick
+2693 ; Extended_Pictographic# E0.6 [1] (⚓) anchor
+2694 ; Extended_Pictographic# E1.0 [1] (⚔️) crossed swords
+2695 ; Extended_Pictographic# E4.0 [1] (⚕️) medical symbol
+2696..2697 ; Extended_Pictographic# E1.0 [2] (⚖️..⚗️) balance scale..alembic
+2698 ; Extended_Pictographic# E0.0 [1] (⚘) FLOWER
+2699 ; Extended_Pictographic# E1.0 [1] (⚙️) gear
+269A ; Extended_Pictographic# E0.0 [1] (⚚) STAFF OF HERMES
+269B..269C ; Extended_Pictographic# E1.0 [2] (⚛️..⚜️) atom symbol..fleur-de-lis
+269D..269F ; Extended_Pictographic# E0.0 [3] (⚝..⚟) OUTLINED WHITE STAR..THREE LINES CONVERGING LEFT
+26A0..26A1 ; Extended_Pictographic# E0.6 [2] (⚠️..⚡) warning..high voltage
+26A2..26A6 ; Extended_Pictographic# E0.0 [5] (⚢..⚦) DOUBLED FEMALE SIGN..MALE WITH STROKE SIGN
+26A7 ; Extended_Pictographic# E13.0 [1] (⚧️) transgender symbol
+26A8..26A9 ; Extended_Pictographic# E0.0 [2] (⚨..⚩) VERTICAL MALE WITH STROKE SIGN..HORIZONTAL MALE WITH STROKE SIGN
+26AA..26AB ; Extended_Pictographic# E0.6 [2] (⚪..⚫) white circle..black circle
+26AC..26AF ; Extended_Pictographic# E0.0 [4] (⚬..⚯) MEDIUM SMALL WHITE CIRCLE..UNMARRIED PARTNERSHIP SYMBOL
+26B0..26B1 ; Extended_Pictographic# E1.0 [2] (⚰️..⚱️) coffin..funeral urn
+26B2..26BC ; Extended_Pictographic# E0.0 [11] (⚲..⚼) NEUTER..SESQUIQUADRATE
+26BD..26BE ; Extended_Pictographic# E0.6 [2] (⚽..⚾) soccer ball..baseball
+26BF..26C3 ; Extended_Pictographic# E0.0 [5] (⚿..⛃) SQUARED KEY..BLACK DRAUGHTS KING
+26C4..26C5 ; Extended_Pictographic# E0.6 [2] (⛄..⛅) snowman without snow..sun behind cloud
+26C6..26C7 ; Extended_Pictographic# E0.0 [2] (⛆..⛇) RAIN..BLACK SNOWMAN
+26C8 ; Extended_Pictographic# E0.7 [1] (⛈️) cloud with lightning and rain
+26C9..26CD ; Extended_Pictographic# E0.0 [5] (⛉..⛍) TURNED WHITE SHOGI PIECE..DISABLED CAR
+26CE ; Extended_Pictographic# E0.6 [1] (⛎) Ophiuchus
+26CF ; Extended_Pictographic# E0.7 [1] (⛏️) pick
+26D0 ; Extended_Pictographic# E0.0 [1] (⛐) CAR SLIDING
+26D1 ; Extended_Pictographic# E0.7 [1] (⛑️) rescue worker’s helmet
+26D2 ; Extended_Pictographic# E0.0 [1] (⛒) CIRCLED CROSSING LANES
+26D3 ; Extended_Pictographic# E0.7 [1] (⛓️) chains
+26D4 ; Extended_Pictographic# E0.6 [1] (⛔) no entry
+26D5..26E8 ; Extended_Pictographic# E0.0 [20] (⛕..⛨) ALTERNATE ONE-WAY LEFT WAY TRAFFIC..BLACK CROSS ON SHIELD
+26E9 ; Extended_Pictographic# E0.7 [1] (⛩️) shinto shrine
+26EA ; Extended_Pictographic# E0.6 [1] (⛪) church
+26EB..26EF ; Extended_Pictographic# E0.0 [5] (⛫..⛯) CASTLE..MAP SYMBOL FOR LIGHTHOUSE
+26F0..26F1 ; Extended_Pictographic# E0.7 [2] (⛰️..⛱️) mountain..umbrella on ground
+26F2..26F3 ; Extended_Pictographic# E0.6 [2] (⛲..⛳) fountain..flag in hole
+26F4 ; Extended_Pictographic# E0.7 [1] (⛴️) ferry
+26F5 ; Extended_Pictographic# E0.6 [1] (⛵) sailboat
+26F6 ; Extended_Pictographic# E0.0 [1] (⛶) SQUARE FOUR CORNERS
+26F7..26F9 ; Extended_Pictographic# E0.7 [3] (⛷️..⛹️) skier..person bouncing ball
+26FA ; Extended_Pictographic# E0.6 [1] (⛺) tent
+26FB..26FC ; Extended_Pictographic# E0.0 [2] (⛻..⛼) JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL
+26FD ; Extended_Pictographic# E0.6 [1] (⛽) fuel pump
+26FE..2701 ; Extended_Pictographic# E0.0 [4] (⛾..✁) CUP ON BLACK SQUARE..UPPER BLADE SCISSORS
+2702 ; Extended_Pictographic# E0.6 [1] (✂️) scissors
+2703..2704 ; Extended_Pictographic# E0.0 [2] (✃..✄) LOWER BLADE SCISSORS..WHITE SCISSORS
+2705 ; Extended_Pictographic# E0.6 [1] (✅) check mark button
+2708..270C ; Extended_Pictographic# E0.6 [5] (✈️..✌️) airplane..victory hand
+270D ; Extended_Pictographic# E0.7 [1] (✍️) writing hand
+270E ; Extended_Pictographic# E0.0 [1] (✎) LOWER RIGHT PENCIL
+270F ; Extended_Pictographic# E0.6 [1] (✏️) pencil
+2710..2711 ; Extended_Pictographic# E0.0 [2] (✐..✑) UPPER RIGHT PENCIL..WHITE NIB
+2712 ; Extended_Pictographic# E0.6 [1] (✒️) black nib
+2714 ; Extended_Pictographic# E0.6 [1] (✔️) check mark
+2716 ; Extended_Pictographic# E0.6 [1] (✖️) multiply
+271D ; Extended_Pictographic# E0.7 [1] (✝️) latin cross
+2721 ; Extended_Pictographic# E0.7 [1] (✡️) star of David
+2728 ; Extended_Pictographic# E0.6 [1] (✨) sparkles
+2733..2734 ; Extended_Pictographic# E0.6 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star
+2744 ; Extended_Pictographic# E0.6 [1] (❄️) snowflake
+2747 ; Extended_Pictographic# E0.6 [1] (❇️) sparkle
+274C ; Extended_Pictographic# E0.6 [1] (❌) cross mark
+274E ; Extended_Pictographic# E0.6 [1] (❎) cross mark button
+2753..2755 ; Extended_Pictographic# E0.6 [3] (❓..❕) red question mark..white exclamation mark
+2757 ; Extended_Pictographic# E0.6 [1] (❗) red exclamation mark
+2763 ; Extended_Pictographic# E1.0 [1] (❣️) heart exclamation
+2764 ; Extended_Pictographic# E0.6 [1] (❤️) red heart
+2765..2767 ; Extended_Pictographic# E0.0 [3] (❥..❧) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET
+2795..2797 ; Extended_Pictographic# E0.6 [3] (➕..➗) plus..divide
+27A1 ; Extended_Pictographic# E0.6 [1] (➡️) right arrow
+27B0 ; Extended_Pictographic# E0.6 [1] (➰) curly loop
+27BF ; Extended_Pictographic# E1.0 [1] (➿) double curly loop
+2934..2935 ; Extended_Pictographic# E0.6 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down
+2B05..2B07 ; Extended_Pictographic# E0.6 [3] (⬅️..⬇️) left arrow..down arrow
+2B1B..2B1C ; Extended_Pictographic# E0.6 [2] (⬛..⬜) black large square..white large square
+2B50 ; Extended_Pictographic# E0.6 [1] (⭐) star
+2B55 ; Extended_Pictographic# E0.6 [1] (⭕) hollow red circle
+3030 ; Extended_Pictographic# E0.6 [1] (〰️) wavy dash
+303D ; Extended_Pictographic# E0.6 [1] (〽️) part alternation mark
+3297 ; Extended_Pictographic# E0.6 [1] (㊗️) Japanese “congratulations” button
+3299 ; Extended_Pictographic# E0.6 [1] (㊙️) Japanese “secret” button
+1F000..1F003 ; Extended_Pictographic# E0.0 [4] (🀀..🀃) MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND
+1F004 ; Extended_Pictographic# E0.6 [1] (🀄) mahjong red dragon
+1F005..1F0CE ; Extended_Pictographic# E0.0 [202] (🀅..🃎) MAHJONG TILE GREEN DRAGON..PLAYING CARD KING OF DIAMONDS
+1F0CF ; Extended_Pictographic# E0.6 [1] (🃏) joker
+1F0D0..1F0FF ; Extended_Pictographic# E0.0 [48] (🃐..🃿) <reserved-1F0D0>..<reserved-1F0FF>
+1F10D..1F10F ; Extended_Pictographic# E0.0 [3] (🄍..🄏) CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH
+1F12F ; Extended_Pictographic# E0.0 [1] (🄯) COPYLEFT SYMBOL
+1F16C..1F16F ; Extended_Pictographic# E0.0 [4] (🅬..🅯) RAISED MR SIGN..CIRCLED HUMAN FIGURE
+1F170..1F171 ; Extended_Pictographic# E0.6 [2] (🅰️..🅱️) A button (blood type)..B button (blood type)
+1F17E..1F17F ; Extended_Pictographic# E0.6 [2] (🅾️..🅿️) O button (blood type)..P button
+1F18E ; Extended_Pictographic# E0.6 [1] (🆎) AB button (blood type)
+1F191..1F19A ; Extended_Pictographic# E0.6 [10] (🆑..🆚) CL button..VS button
+1F1AD..1F1E5 ; Extended_Pictographic# E0.0 [57] (🆭..🇥) MASK WORK SYMBOL..<reserved-1F1E5>
+1F201..1F202 ; Extended_Pictographic# E0.6 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button
+1F203..1F20F ; Extended_Pictographic# E0.0 [13] (🈃..🈏) <reserved-1F203>..<reserved-1F20F>
+1F21A ; Extended_Pictographic# E0.6 [1] (🈚) Japanese “free of charge” button
+1F22F ; Extended_Pictographic# E0.6 [1] (🈯) Japanese “reserved” button
+1F232..1F23A ; Extended_Pictographic# E0.6 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button
+1F23C..1F23F ; Extended_Pictographic# E0.0 [4] (🈼..🈿) <reserved-1F23C>..<reserved-1F23F>
+1F249..1F24F ; Extended_Pictographic# E0.0 [7] (🉉..🉏) <reserved-1F249>..<reserved-1F24F>
+1F250..1F251 ; Extended_Pictographic# E0.6 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
+1F252..1F2FF ; Extended_Pictographic# E0.0 [174] (🉒..🋿) <reserved-1F252>..<reserved-1F2FF>
+1F300..1F30C ; Extended_Pictographic# E0.6 [13] (🌀..🌌) cyclone..milky way
+1F30D..1F30E ; Extended_Pictographic# E0.7 [2] (🌍..🌎) globe showing Europe-Africa..globe showing Americas
+1F30F ; Extended_Pictographic# E0.6 [1] (🌏) globe showing Asia-Australia
+1F310 ; Extended_Pictographic# E1.0 [1] (🌐) globe with meridians
+1F311 ; Extended_Pictographic# E0.6 [1] (🌑) new moon
+1F312 ; Extended_Pictographic# E1.0 [1] (🌒) waxing crescent moon
+1F313..1F315 ; Extended_Pictographic# E0.6 [3] (🌓..🌕) first quarter moon..full moon
+1F316..1F318 ; Extended_Pictographic# E1.0 [3] (🌖..🌘) waning gibbous moon..waning crescent moon
+1F319 ; Extended_Pictographic# E0.6 [1] (🌙) crescent moon
+1F31A ; Extended_Pictographic# E1.0 [1] (🌚) new moon face
+1F31B ; Extended_Pictographic# E0.6 [1] (🌛) first quarter moon face
+1F31C ; Extended_Pictographic# E0.7 [1] (🌜) last quarter moon face
+1F31D..1F31E ; Extended_Pictographic# E1.0 [2] (🌝..🌞) full moon face..sun with face
+1F31F..1F320 ; Extended_Pictographic# E0.6 [2] (🌟..🌠) glowing star..shooting star
+1F321 ; Extended_Pictographic# E0.7 [1] (🌡️) thermometer
+1F322..1F323 ; Extended_Pictographic# E0.0 [2] (🌢..🌣) BLACK DROPLET..WHITE SUN
+1F324..1F32C ; Extended_Pictographic# E0.7 [9] (🌤️..🌬️) sun behind small cloud..wind face
+1F32D..1F32F ; Extended_Pictographic# E1.0 [3] (🌭..🌯) hot dog..burrito
+1F330..1F331 ; Extended_Pictographic# E0.6 [2] (🌰..🌱) chestnut..seedling
+1F332..1F333 ; Extended_Pictographic# E1.0 [2] (🌲..🌳) evergreen tree..deciduous tree
+1F334..1F335 ; Extended_Pictographic# E0.6 [2] (🌴..🌵) palm tree..cactus
+1F336 ; Extended_Pictographic# E0.7 [1] (🌶️) hot pepper
+1F337..1F34A ; Extended_Pictographic# E0.6 [20] (🌷..🍊) tulip..tangerine
+1F34B ; Extended_Pictographic# E1.0 [1] (🍋) lemon
+1F34C..1F34F ; Extended_Pictographic# E0.6 [4] (🍌..🍏) banana..green apple
+1F350 ; Extended_Pictographic# E1.0 [1] (🍐) pear
+1F351..1F37B ; Extended_Pictographic# E0.6 [43] (🍑..🍻) peach..clinking beer mugs
+1F37C ; Extended_Pictographic# E1.0 [1] (🍼) baby bottle
+1F37D ; Extended_Pictographic# E0.7 [1] (🍽️) fork and knife with plate
+1F37E..1F37F ; Extended_Pictographic# E1.0 [2] (🍾..🍿) bottle with popping cork..popcorn
+1F380..1F393 ; Extended_Pictographic# E0.6 [20] (🎀..🎓) ribbon..graduation cap
+1F394..1F395 ; Extended_Pictographic# E0.0 [2] (🎔..🎕) HEART WITH TIP ON THE LEFT..BOUQUET OF FLOWERS
+1F396..1F397 ; Extended_Pictographic# E0.7 [2] (🎖️..🎗️) military medal..reminder ribbon
+1F398 ; Extended_Pictographic# E0.0 [1] (🎘) MUSICAL KEYBOARD WITH JACKS
+1F399..1F39B ; Extended_Pictographic# E0.7 [3] (🎙️..🎛️) studio microphone..control knobs
+1F39C..1F39D ; Extended_Pictographic# E0.0 [2] (🎜..🎝) BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES
+1F39E..1F39F ; Extended_Pictographic# E0.7 [2] (🎞️..🎟️) film frames..admission tickets
+1F3A0..1F3C4 ; Extended_Pictographic# E0.6 [37] (🎠..🏄) carousel horse..person surfing
+1F3C5 ; Extended_Pictographic# E1.0 [1] (🏅) sports medal
+1F3C6 ; Extended_Pictographic# E0.6 [1] (🏆) trophy
+1F3C7 ; Extended_Pictographic# E1.0 [1] (🏇) horse racing
+1F3C8 ; Extended_Pictographic# E0.6 [1] (🏈) american football
+1F3C9 ; Extended_Pictographic# E1.0 [1] (🏉) rugby football
+1F3CA ; Extended_Pictographic# E0.6 [1] (🏊) person swimming
+1F3CB..1F3CE ; Extended_Pictographic# E0.7 [4] (🏋️..🏎️) person lifting weights..racing car
+1F3CF..1F3D3 ; Extended_Pictographic# E1.0 [5] (🏏..🏓) cricket game..ping pong
+1F3D4..1F3DF ; Extended_Pictographic# E0.7 [12] (🏔️..🏟️) snow-capped mountain..stadium
+1F3E0..1F3E3 ; Extended_Pictographic# E0.6 [4] (🏠..🏣) house..Japanese post office
+1F3E4 ; Extended_Pictographic# E1.0 [1] (🏤) post office
+1F3E5..1F3F0 ; Extended_Pictographic# E0.6 [12] (🏥..🏰) hospital..castle
+1F3F1..1F3F2 ; Extended_Pictographic# E0.0 [2] (🏱..🏲) WHITE PENNANT..BLACK PENNANT
+1F3F3 ; Extended_Pictographic# E0.7 [1] (🏳️) white flag
+1F3F4 ; Extended_Pictographic# E1.0 [1] (🏴) black flag
+1F3F5 ; Extended_Pictographic# E0.7 [1] (🏵️) rosette
+1F3F6 ; Extended_Pictographic# E0.0 [1] (🏶) BLACK ROSETTE
+1F3F7 ; Extended_Pictographic# E0.7 [1] (🏷️) label
+1F3F8..1F3FA ; Extended_Pictographic# E1.0 [3] (🏸..🏺) badminton..amphora
+1F400..1F407 ; Extended_Pictographic# E1.0 [8] (🐀..🐇) rat..rabbit
+1F408 ; Extended_Pictographic# E0.7 [1] (🐈) cat
+1F409..1F40B ; Extended_Pictographic# E1.0 [3] (🐉..🐋) dragon..whale
+1F40C..1F40E ; Extended_Pictographic# E0.6 [3] (🐌..🐎) snail..horse
+1F40F..1F410 ; Extended_Pictographic# E1.0 [2] (🐏..🐐) ram..goat
+1F411..1F412 ; Extended_Pictographic# E0.6 [2] (🐑..🐒) ewe..monkey
+1F413 ; Extended_Pictographic# E1.0 [1] (🐓) rooster
+1F414 ; Extended_Pictographic# E0.6 [1] (🐔) chicken
+1F415 ; Extended_Pictographic# E0.7 [1] (🐕) dog
+1F416 ; Extended_Pictographic# E1.0 [1] (🐖) pig
+1F417..1F429 ; Extended_Pictographic# E0.6 [19] (🐗..🐩) boar..poodle
+1F42A ; Extended_Pictographic# E1.0 [1] (🐪) camel
+1F42B..1F43E ; Extended_Pictographic# E0.6 [20] (🐫..🐾) two-hump camel..paw prints
+1F43F ; Extended_Pictographic# E0.7 [1] (🐿️) chipmunk
+1F440 ; Extended_Pictographic# E0.6 [1] (👀) eyes
+1F441 ; Extended_Pictographic# E0.7 [1] (👁️) eye
+1F442..1F464 ; Extended_Pictographic# E0.6 [35] (👂..👤) ear..bust in silhouette
+1F465 ; Extended_Pictographic# E1.0 [1] (👥) busts in silhouette
+1F466..1F46B ; Extended_Pictographic# E0.6 [6] (👦..👫) boy..woman and man holding hands
+1F46C..1F46D ; Extended_Pictographic# E1.0 [2] (👬..👭) men holding hands..women holding hands
+1F46E..1F4AC ; Extended_Pictographic# E0.6 [63] (👮..💬) police officer..speech balloon
+1F4AD ; Extended_Pictographic# E1.0 [1] (💭) thought balloon
+1F4AE..1F4B5 ; Extended_Pictographic# E0.6 [8] (💮..💵) white flower..dollar banknote
+1F4B6..1F4B7 ; Extended_Pictographic# E1.0 [2] (💶..💷) euro banknote..pound banknote
+1F4B8..1F4EB ; Extended_Pictographic# E0.6 [52] (💸..📫) money with wings..closed mailbox with raised flag
+1F4EC..1F4ED ; Extended_Pictographic# E0.7 [2] (📬..📭) open mailbox with raised flag..open mailbox with lowered flag
+1F4EE ; Extended_Pictographic# E0.6 [1] (📮) postbox
+1F4EF ; Extended_Pictographic# E1.0 [1] (📯) postal horn
+1F4F0..1F4F4 ; Extended_Pictographic# E0.6 [5] (📰..📴) newspaper..mobile phone off
+1F4F5 ; Extended_Pictographic# E1.0 [1] (📵) no mobile phones
+1F4F6..1F4F7 ; Extended_Pictographic# E0.6 [2] (📶..📷) antenna bars..camera
+1F4F8 ; Extended_Pictographic# E1.0 [1] (📸) camera with flash
+1F4F9..1F4FC ; Extended_Pictographic# E0.6 [4] (📹..📼) video camera..videocassette
+1F4FD ; Extended_Pictographic# E0.7 [1] (📽️) film projector
+1F4FE ; Extended_Pictographic# E0.0 [1] (📾) PORTABLE STEREO
+1F4FF..1F502 ; Extended_Pictographic# E1.0 [4] (📿..🔂) prayer beads..repeat single button
+1F503 ; Extended_Pictographic# E0.6 [1] (🔃) clockwise vertical arrows
+1F504..1F507 ; Extended_Pictographic# E1.0 [4] (🔄..🔇) counterclockwise arrows button..muted speaker
+1F508 ; Extended_Pictographic# E0.7 [1] (🔈) speaker low volume
+1F509 ; Extended_Pictographic# E1.0 [1] (🔉) speaker medium volume
+1F50A..1F514 ; Extended_Pictographic# E0.6 [11] (🔊..🔔) speaker high volume..bell
+1F515 ; Extended_Pictographic# E1.0 [1] (🔕) bell with slash
+1F516..1F52B ; Extended_Pictographic# E0.6 [22] (🔖..🔫) bookmark..water pistol
+1F52C..1F52D ; Extended_Pictographic# E1.0 [2] (🔬..🔭) microscope..telescope
+1F52E..1F53D ; Extended_Pictographic# E0.6 [16] (🔮..🔽) crystal ball..downwards button
+1F546..1F548 ; Extended_Pictographic# E0.0 [3] (🕆..🕈) WHITE LATIN CROSS..CELTIC CROSS
+1F549..1F54A ; Extended_Pictographic# E0.7 [2] (🕉️..🕊️) om..dove
+1F54B..1F54E ; Extended_Pictographic# E1.0 [4] (🕋..🕎) kaaba..menorah
+1F54F ; Extended_Pictographic# E0.0 [1] (🕏) BOWL OF HYGIEIA
+1F550..1F55B ; Extended_Pictographic# E0.6 [12] (🕐..🕛) one o’clock..twelve o’clock
+1F55C..1F567 ; Extended_Pictographic# E0.7 [12] (🕜..🕧) one-thirty..twelve-thirty
+1F568..1F56E ; Extended_Pictographic# E0.0 [7] (🕨..🕮) RIGHT SPEAKER..BOOK
+1F56F..1F570 ; Extended_Pictographic# E0.7 [2] (🕯️..🕰️) candle..mantelpiece clock
+1F571..1F572 ; Extended_Pictographic# E0.0 [2] (🕱..🕲) BLACK SKULL AND CROSSBONES..NO PIRACY
+1F573..1F579 ; Extended_Pictographic# E0.7 [7] (🕳️..🕹️) hole..joystick
+1F57A ; Extended_Pictographic# E3.0 [1] (🕺) man dancing
+1F57B..1F586 ; Extended_Pictographic# E0.0 [12] (🕻..🖆) LEFT HAND TELEPHONE RECEIVER..PEN OVER STAMPED ENVELOPE
+1F587 ; Extended_Pictographic# E0.7 [1] (🖇️) linked paperclips
+1F588..1F589 ; Extended_Pictographic# E0.0 [2] (🖈..🖉) BLACK PUSHPIN..LOWER LEFT PENCIL
+1F58A..1F58D ; Extended_Pictographic# E0.7 [4] (🖊️..🖍️) pen..crayon
+1F58E..1F58F ; Extended_Pictographic# E0.0 [2] (🖎..🖏) LEFT WRITING HAND..TURNED OK HAND SIGN
+1F590 ; Extended_Pictographic# E0.7 [1] (🖐️) hand with fingers splayed
+1F591..1F594 ; Extended_Pictographic# E0.0 [4] (🖑..🖔) REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND
+1F595..1F596 ; Extended_Pictographic# E1.0 [2] (🖕..🖖) middle finger..vulcan salute
+1F597..1F5A3 ; Extended_Pictographic# E0.0 [13] (🖗..🖣) WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX
+1F5A4 ; Extended_Pictographic# E3.0 [1] (🖤) black heart
+1F5A5 ; Extended_Pictographic# E0.7 [1] (🖥️) desktop computer
+1F5A6..1F5A7 ; Extended_Pictographic# E0.0 [2] (🖦..🖧) KEYBOARD AND MOUSE..THREE NETWORKED COMPUTERS
+1F5A8 ; Extended_Pictographic# E0.7 [1] (🖨️) printer
+1F5A9..1F5B0 ; Extended_Pictographic# E0.0 [8] (🖩..🖰) POCKET CALCULATOR..TWO BUTTON MOUSE
+1F5B1..1F5B2 ; Extended_Pictographic# E0.7 [2] (🖱️..🖲️) computer mouse..trackball
+1F5B3..1F5BB ; Extended_Pictographic# E0.0 [9] (🖳..🖻) OLD PERSONAL COMPUTER..DOCUMENT WITH PICTURE
+1F5BC ; Extended_Pictographic# E0.7 [1] (🖼️) framed picture
+1F5BD..1F5C1 ; Extended_Pictographic# E0.0 [5] (🖽..🗁) FRAME WITH TILES..OPEN FOLDER
+1F5C2..1F5C4 ; Extended_Pictographic# E0.7 [3] (🗂️..🗄️) card index dividers..file cabinet
+1F5C5..1F5D0 ; Extended_Pictographic# E0.0 [12] (🗅..🗐) EMPTY NOTE..PAGES
+1F5D1..1F5D3 ; Extended_Pictographic# E0.7 [3] (🗑️..🗓️) wastebasket..spiral calendar
+1F5D4..1F5DB ; Extended_Pictographic# E0.0 [8] (🗔..🗛) DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL
+1F5DC..1F5DE ; Extended_Pictographic# E0.7 [3] (🗜️..🗞️) clamp..rolled-up newspaper
+1F5DF..1F5E0 ; Extended_Pictographic# E0.0 [2] (🗟..🗠) PAGE WITH CIRCLED TEXT..STOCK CHART
+1F5E1 ; Extended_Pictographic# E0.7 [1] (🗡️) dagger
+1F5E2 ; Extended_Pictographic# E0.0 [1] (🗢) LIPS
+1F5E3 ; Extended_Pictographic# E0.7 [1] (🗣️) speaking head
+1F5E4..1F5E7 ; Extended_Pictographic# E0.0 [4] (🗤..🗧) THREE RAYS ABOVE..THREE RAYS RIGHT
+1F5E8 ; Extended_Pictographic# E2.0 [1] (🗨️) left speech bubble
+1F5E9..1F5EE ; Extended_Pictographic# E0.0 [6] (🗩..🗮) RIGHT SPEECH BUBBLE..LEFT ANGER BUBBLE
+1F5EF ; Extended_Pictographic# E0.7 [1] (🗯️) right anger bubble
+1F5F0..1F5F2 ; Extended_Pictographic# E0.0 [3] (🗰..🗲) MOOD BUBBLE..LIGHTNING MOOD
+1F5F3 ; Extended_Pictographic# E0.7 [1] (🗳️) ballot box with ballot
+1F5F4..1F5F9 ; Extended_Pictographic# E0.0 [6] (🗴..🗹) BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK
+1F5FA ; Extended_Pictographic# E0.7 [1] (🗺️) world map
+1F5FB..1F5FF ; Extended_Pictographic# E0.6 [5] (🗻..🗿) mount fuji..moai
+1F600 ; Extended_Pictographic# E1.0 [1] (😀) grinning face
+1F601..1F606 ; Extended_Pictographic# E0.6 [6] (😁..😆) beaming face with smiling eyes..grinning squinting face
+1F607..1F608 ; Extended_Pictographic# E1.0 [2] (😇..😈) smiling face with halo..smiling face with horns
+1F609..1F60D ; Extended_Pictographic# E0.6 [5] (😉..😍) winking face..smiling face with heart-eyes
+1F60E ; Extended_Pictographic# E1.0 [1] (😎) smiling face with sunglasses
+1F60F ; Extended_Pictographic# E0.6 [1] (😏) smirking face
+1F610 ; Extended_Pictographic# E0.7 [1] (😐) neutral face
+1F611 ; Extended_Pictographic# E1.0 [1] (😑) expressionless face
+1F612..1F614 ; Extended_Pictographic# E0.6 [3] (😒..😔) unamused face..pensive face
+1F615 ; Extended_Pictographic# E1.0 [1] (😕) confused face
+1F616 ; Extended_Pictographic# E0.6 [1] (😖) confounded face
+1F617 ; Extended_Pictographic# E1.0 [1] (😗) kissing face
+1F618 ; Extended_Pictographic# E0.6 [1] (😘) face blowing a kiss
+1F619 ; Extended_Pictographic# E1.0 [1] (😙) kissing face with smiling eyes
+1F61A ; Extended_Pictographic# E0.6 [1] (😚) kissing face with closed eyes
+1F61B ; Extended_Pictographic# E1.0 [1] (😛) face with tongue
+1F61C..1F61E ; Extended_Pictographic# E0.6 [3] (😜..😞) winking face with tongue..disappointed face
+1F61F ; Extended_Pictographic# E1.0 [1] (😟) worried face
+1F620..1F625 ; Extended_Pictographic# E0.6 [6] (😠..😥) angry face..sad but relieved face
+1F626..1F627 ; Extended_Pictographic# E1.0 [2] (😦..😧) frowning face with open mouth..anguished face
+1F628..1F62B ; Extended_Pictographic# E0.6 [4] (😨..😫) fearful face..tired face
+1F62C ; Extended_Pictographic# E1.0 [1] (😬) grimacing face
+1F62D ; Extended_Pictographic# E0.6 [1] (😭) loudly crying face
+1F62E..1F62F ; Extended_Pictographic# E1.0 [2] (😮..😯) face with open mouth..hushed face
+1F630..1F633 ; Extended_Pictographic# E0.6 [4] (😰..😳) anxious face with sweat..flushed face
+1F634 ; Extended_Pictographic# E1.0 [1] (😴) sleeping face
+1F635 ; Extended_Pictographic# E0.6 [1] (😵) face with crossed-out eyes
+1F636 ; Extended_Pictographic# E1.0 [1] (😶) face without mouth
+1F637..1F640 ; Extended_Pictographic# E0.6 [10] (😷..🙀) face with medical mask..weary cat
+1F641..1F644 ; Extended_Pictographic# E1.0 [4] (🙁..🙄) slightly frowning face..face with rolling eyes
+1F645..1F64F ; Extended_Pictographic# E0.6 [11] (🙅..🙏) person gesturing NO..folded hands
+1F680 ; Extended_Pictographic# E0.6 [1] (🚀) rocket
+1F681..1F682 ; Extended_Pictographic# E1.0 [2] (🚁..🚂) helicopter..locomotive
+1F683..1F685 ; Extended_Pictographic# E0.6 [3] (🚃..🚅) railway car..bullet train
+1F686 ; Extended_Pictographic# E1.0 [1] (🚆) train
+1F687 ; Extended_Pictographic# E0.6 [1] (🚇) metro
+1F688 ; Extended_Pictographic# E1.0 [1] (🚈) light rail
+1F689 ; Extended_Pictographic# E0.6 [1] (🚉) station
+1F68A..1F68B ; Extended_Pictographic# E1.0 [2] (🚊..🚋) tram..tram car
+1F68C ; Extended_Pictographic# E0.6 [1] (🚌) bus
+1F68D ; Extended_Pictographic# E0.7 [1] (🚍) oncoming bus
+1F68E ; Extended_Pictographic# E1.0 [1] (🚎) trolleybus
+1F68F ; Extended_Pictographic# E0.6 [1] (🚏) bus stop
+1F690 ; Extended_Pictographic# E1.0 [1] (🚐) minibus
+1F691..1F693 ; Extended_Pictographic# E0.6 [3] (🚑..🚓) ambulance..police car
+1F694 ; Extended_Pictographic# E0.7 [1] (🚔) oncoming police car
+1F695 ; Extended_Pictographic# E0.6 [1] (🚕) taxi
+1F696 ; Extended_Pictographic# E1.0 [1] (🚖) oncoming taxi
+1F697 ; Extended_Pictographic# E0.6 [1] (🚗) automobile
+1F698 ; Extended_Pictographic# E0.7 [1] (🚘) oncoming automobile
+1F699..1F69A ; Extended_Pictographic# E0.6 [2] (🚙..🚚) sport utility vehicle..delivery truck
+1F69B..1F6A1 ; Extended_Pictographic# E1.0 [7] (🚛..🚡) articulated lorry..aerial tramway
+1F6A2 ; Extended_Pictographic# E0.6 [1] (🚢) ship
+1F6A3 ; Extended_Pictographic# E1.0 [1] (🚣) person rowing boat
+1F6A4..1F6A5 ; Extended_Pictographic# E0.6 [2] (🚤..🚥) speedboat..horizontal traffic light
+1F6A6 ; Extended_Pictographic# E1.0 [1] (🚦) vertical traffic light
+1F6A7..1F6AD ; Extended_Pictographic# E0.6 [7] (🚧..🚭) construction..no smoking
+1F6AE..1F6B1 ; Extended_Pictographic# E1.0 [4] (🚮..🚱) litter in bin sign..non-potable water
+1F6B2 ; Extended_Pictographic# E0.6 [1] (🚲) bicycle
+1F6B3..1F6B5 ; Extended_Pictographic# E1.0 [3] (🚳..🚵) no bicycles..person mountain biking
+1F6B6 ; Extended_Pictographic# E0.6 [1] (🚶) person walking
+1F6B7..1F6B8 ; Extended_Pictographic# E1.0 [2] (🚷..🚸) no pedestrians..children crossing
+1F6B9..1F6BE ; Extended_Pictographic# E0.6 [6] (🚹..🚾) men’s room..water closet
+1F6BF ; Extended_Pictographic# E1.0 [1] (🚿) shower
+1F6C0 ; Extended_Pictographic# E0.6 [1] (🛀) person taking bath
+1F6C1..1F6C5 ; Extended_Pictographic# E1.0 [5] (🛁..🛅) bathtub..left luggage
+1F6C6..1F6CA ; Extended_Pictographic# E0.0 [5] (🛆..🛊) TRIANGLE WITH ROUNDED CORNERS..GIRLS SYMBOL
+1F6CB ; Extended_Pictographic# E0.7 [1] (🛋️) couch and lamp
+1F6CC ; Extended_Pictographic# E1.0 [1] (🛌) person in bed
+1F6CD..1F6CF ; Extended_Pictographic# E0.7 [3] (🛍️..🛏️) shopping bags..bed
+1F6D0 ; Extended_Pictographic# E1.0 [1] (🛐) place of worship
+1F6D1..1F6D2 ; Extended_Pictographic# E3.0 [2] (🛑..🛒) stop sign..shopping cart
+1F6D3..1F6D4 ; Extended_Pictographic# E0.0 [2] (🛓..🛔) STUPA..PAGODA
+1F6D5 ; Extended_Pictographic# E12.0 [1] (🛕) hindu temple
+1F6D6..1F6D7 ; Extended_Pictographic# E13.0 [2] (🛖..🛗) hut..elevator
+1F6D8..1F6DB ; Extended_Pictographic# E0.0 [4] (🛘..🛛) <reserved-1F6D8>..<reserved-1F6DB>
+1F6DC ; Extended_Pictographic# E15.0 [1] (🛜) wireless
+1F6DD..1F6DF ; Extended_Pictographic# E14.0 [3] (🛝..🛟) playground slide..ring buoy
+1F6E0..1F6E5 ; Extended_Pictographic# E0.7 [6] (🛠️..🛥️) hammer and wrench..motor boat
+1F6E6..1F6E8 ; Extended_Pictographic# E0.0 [3] (🛦..🛨) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE
+1F6E9 ; Extended_Pictographic# E0.7 [1] (🛩️) small airplane
+1F6EA ; Extended_Pictographic# E0.0 [1] (🛪) NORTHEAST-POINTING AIRPLANE
+1F6EB..1F6EC ; Extended_Pictographic# E1.0 [2] (🛫..🛬) airplane departure..airplane arrival
+1F6ED..1F6EF ; Extended_Pictographic# E0.0 [3] (🛭..🛯) <reserved-1F6ED>..<reserved-1F6EF>
+1F6F0 ; Extended_Pictographic# E0.7 [1] (🛰️) satellite
+1F6F1..1F6F2 ; Extended_Pictographic# E0.0 [2] (🛱..🛲) ONCOMING FIRE ENGINE..DIESEL LOCOMOTIVE
+1F6F3 ; Extended_Pictographic# E0.7 [1] (🛳️) passenger ship
+1F6F4..1F6F6 ; Extended_Pictographic# E3.0 [3] (🛴..🛶) kick scooter..canoe
+1F6F7..1F6F8 ; Extended_Pictographic# E5.0 [2] (🛷..🛸) sled..flying saucer
+1F6F9 ; Extended_Pictographic# E11.0 [1] (🛹) skateboard
+1F6FA ; Extended_Pictographic# E12.0 [1] (🛺) auto rickshaw
+1F6FB..1F6FC ; Extended_Pictographic# E13.0 [2] (🛻..🛼) pickup truck..roller skate
+1F6FD..1F6FF ; Extended_Pictographic# E0.0 [3] (🛽..🛿) <reserved-1F6FD>..<reserved-1F6FF>
+1F774..1F77F ; Extended_Pictographic# E0.0 [12] (🝴..🝿) LOT OF FORTUNE..ORCUS
+1F7D5..1F7DF ; Extended_Pictographic# E0.0 [11] (🟕..🟟) CIRCLED TRIANGLE..<reserved-1F7DF>
+1F7E0..1F7EB ; Extended_Pictographic# E12.0 [12] (🟠..🟫) orange circle..brown square
+1F7EC..1F7EF ; Extended_Pictographic# E0.0 [4] (🟬..🟯) <reserved-1F7EC>..<reserved-1F7EF>
+1F7F0 ; Extended_Pictographic# E14.0 [1] (🟰) heavy equals sign
+1F7F1..1F7FF ; Extended_Pictographic# E0.0 [15] (🟱..🟿) <reserved-1F7F1>..<reserved-1F7FF>
+1F80C..1F80F ; Extended_Pictographic# E0.0 [4] (🠌..🠏) <reserved-1F80C>..<reserved-1F80F>
+1F848..1F84F ; Extended_Pictographic# E0.0 [8] (🡈..🡏) <reserved-1F848>..<reserved-1F84F>
+1F85A..1F85F ; Extended_Pictographic# E0.0 [6] (🡚..🡟) <reserved-1F85A>..<reserved-1F85F>
+1F888..1F88F ; Extended_Pictographic# E0.0 [8] (🢈..🢏) <reserved-1F888>..<reserved-1F88F>
+1F8AE..1F8FF ; Extended_Pictographic# E0.0 [82] (🢮..🣿) <reserved-1F8AE>..<reserved-1F8FF>
+1F90C ; Extended_Pictographic# E13.0 [1] (🤌) pinched fingers
+1F90D..1F90F ; Extended_Pictographic# E12.0 [3] (🤍..🤏) white heart..pinching hand
+1F910..1F918 ; Extended_Pictographic# E1.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
+1F919..1F91E ; Extended_Pictographic# E3.0 [6] (🤙..🤞) call me hand..crossed fingers
+1F91F ; Extended_Pictographic# E5.0 [1] (🤟) love-you gesture
+1F920..1F927 ; Extended_Pictographic# E3.0 [8] (🤠..🤧) cowboy hat face..sneezing face
+1F928..1F92F ; Extended_Pictographic# E5.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
+1F930 ; Extended_Pictographic# E3.0 [1] (🤰) pregnant woman
+1F931..1F932 ; Extended_Pictographic# E5.0 [2] (🤱..🤲) breast-feeding..palms up together
+1F933..1F93A ; Extended_Pictographic# E3.0 [8] (🤳..🤺) selfie..person fencing
+1F93C..1F93E ; Extended_Pictographic# E3.0 [3] (🤼..🤾) people wrestling..person playing handball
+1F93F ; Extended_Pictographic# E12.0 [1] (🤿) diving mask
+1F940..1F945 ; Extended_Pictographic# E3.0 [6] (🥀..🥅) wilted flower..goal net
+1F947..1F94B ; Extended_Pictographic# E3.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
+1F94C ; Extended_Pictographic# E5.0 [1] (🥌) curling stone
+1F94D..1F94F ; Extended_Pictographic# E11.0 [3] (🥍..🥏) lacrosse..flying disc
+1F950..1F95E ; Extended_Pictographic# E3.0 [15] (🥐..🥞) croissant..pancakes
+1F95F..1F96B ; Extended_Pictographic# E5.0 [13] (🥟..🥫) dumpling..canned food
+1F96C..1F970 ; Extended_Pictographic# E11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
+1F971 ; Extended_Pictographic# E12.0 [1] (🥱) yawning face
+1F972 ; Extended_Pictographic# E13.0 [1] (🥲) smiling face with tear
+1F973..1F976 ; Extended_Pictographic# E11.0 [4] (🥳..🥶) partying face..cold face
+1F977..1F978 ; Extended_Pictographic# E13.0 [2] (🥷..🥸) ninja..disguised face
+1F979 ; Extended_Pictographic# E14.0 [1] (🥹) face holding back tears
+1F97A ; Extended_Pictographic# E11.0 [1] (🥺) pleading face
+1F97B ; Extended_Pictographic# E12.0 [1] (🥻) sari
+1F97C..1F97F ; Extended_Pictographic# E11.0 [4] (🥼..🥿) lab coat..flat shoe
+1F980..1F984 ; Extended_Pictographic# E1.0 [5] (🦀..🦄) crab..unicorn
+1F985..1F991 ; Extended_Pictographic# E3.0 [13] (🦅..🦑) eagle..squid
+1F992..1F997 ; Extended_Pictographic# E5.0 [6] (🦒..🦗) giraffe..cricket
+1F998..1F9A2 ; Extended_Pictographic# E11.0 [11] (🦘..🦢) kangaroo..swan
+1F9A3..1F9A4 ; Extended_Pictographic# E13.0 [2] (🦣..🦤) mammoth..dodo
+1F9A5..1F9AA ; Extended_Pictographic# E12.0 [6] (🦥..🦪) sloth..oyster
+1F9AB..1F9AD ; Extended_Pictographic# E13.0 [3] (🦫..🦭) beaver..seal
+1F9AE..1F9AF ; Extended_Pictographic# E12.0 [2] (🦮..🦯) guide dog..white cane
+1F9B0..1F9B9 ; Extended_Pictographic# E11.0 [10] (🦰..🦹) red hair..supervillain
+1F9BA..1F9BF ; Extended_Pictographic# E12.0 [6] (🦺..🦿) safety vest..mechanical leg
+1F9C0 ; Extended_Pictographic# E1.0 [1] (🧀) cheese wedge
+1F9C1..1F9C2 ; Extended_Pictographic# E11.0 [2] (🧁..🧂) cupcake..salt
+1F9C3..1F9CA ; Extended_Pictographic# E12.0 [8] (🧃..🧊) beverage box..ice
+1F9CB ; Extended_Pictographic# E13.0 [1] (🧋) bubble tea
+1F9CC ; Extended_Pictographic# E14.0 [1] (🧌) troll
+1F9CD..1F9CF ; Extended_Pictographic# E12.0 [3] (🧍..🧏) person standing..deaf person
+1F9D0..1F9E6 ; Extended_Pictographic# E5.0 [23] (🧐..🧦) face with monocle..socks
+1F9E7..1F9FF ; Extended_Pictographic# E11.0 [25] (🧧..🧿) red envelope..nazar amulet
+1FA00..1FA6F ; Extended_Pictographic# E0.0 [112] (🨀..🩯) NEUTRAL CHESS KING..<reserved-1FA6F>
+1FA70..1FA73 ; Extended_Pictographic# E12.0 [4] (🩰..🩳) ballet shoes..shorts
+1FA74 ; Extended_Pictographic# E13.0 [1] (🩴) thong sandal
+1FA75..1FA77 ; Extended_Pictographic# E15.0 [3] (🩵..🩷) light blue heart..pink heart
+1FA78..1FA7A ; Extended_Pictographic# E12.0 [3] (🩸..🩺) drop of blood..stethoscope
+1FA7B..1FA7C ; Extended_Pictographic# E14.0 [2] (🩻..🩼) x-ray..crutch
+1FA7D..1FA7F ; Extended_Pictographic# E0.0 [3] (🩽..🩿) <reserved-1FA7D>..<reserved-1FA7F>
+1FA80..1FA82 ; Extended_Pictographic# E12.0 [3] (🪀..🪂) yo-yo..parachute
+1FA83..1FA86 ; Extended_Pictographic# E13.0 [4] (🪃..🪆) boomerang..nesting dolls
+1FA87..1FA88 ; Extended_Pictographic# E15.0 [2] (🪇..🪈) maracas..flute
+1FA89..1FA8F ; Extended_Pictographic# E0.0 [7] (🪉..🪏) <reserved-1FA89>..<reserved-1FA8F>
+1FA90..1FA95 ; Extended_Pictographic# E12.0 [6] (🪐..🪕) ringed planet..banjo
+1FA96..1FAA8 ; Extended_Pictographic# E13.0 [19] (🪖..🪨) military helmet..rock
+1FAA9..1FAAC ; Extended_Pictographic# E14.0 [4] (🪩..🪬) mirror ball..hamsa
+1FAAD..1FAAF ; Extended_Pictographic# E15.0 [3] (🪭..🪯) folding hand fan..khanda
+1FAB0..1FAB6 ; Extended_Pictographic# E13.0 [7] (🪰..🪶) fly..feather
+1FAB7..1FABA ; Extended_Pictographic# E14.0 [4] (🪷..🪺) lotus..nest with eggs
+1FABB..1FABD ; Extended_Pictographic# E15.0 [3] (🪻..🪽) hyacinth..wing
+1FABE ; Extended_Pictographic# E0.0 [1] (🪾) <reserved-1FABE>
+1FABF ; Extended_Pictographic# E15.0 [1] (🪿) goose
+1FAC0..1FAC2 ; Extended_Pictographic# E13.0 [3] (🫀..🫂) anatomical heart..people hugging
+1FAC3..1FAC5 ; Extended_Pictographic# E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FAC6..1FACD ; Extended_Pictographic# E0.0 [8] (🫆..🫍) <reserved-1FAC6>..<reserved-1FACD>
+1FACE..1FACF ; Extended_Pictographic# E15.0 [2] (🫎..🫏) moose..donkey
+1FAD0..1FAD6 ; Extended_Pictographic# E13.0 [7] (🫐..🫖) blueberries..teapot
+1FAD7..1FAD9 ; Extended_Pictographic# E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FADA..1FADB ; Extended_Pictographic# E15.0 [2] (🫚..🫛) ginger root..pea pod
+1FADC..1FADF ; Extended_Pictographic# E0.0 [4] (🫜..🫟) <reserved-1FADC>..<reserved-1FADF>
+1FAE0..1FAE7 ; Extended_Pictographic# E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAE8 ; Extended_Pictographic# E15.0 [1] (🫨) shaking face
+1FAE9..1FAEF ; Extended_Pictographic# E0.0 [7] (🫩..🫯) <reserved-1FAE9>..<reserved-1FAEF>
+1FAF0..1FAF6 ; Extended_Pictographic# E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAF8 ; Extended_Pictographic# E15.0 [2] (🫷..🫸) leftwards pushing hand..rightwards pushing hand
+1FAF9..1FAFF ; Extended_Pictographic# E0.0 [7] (🫹..🫿) <reserved-1FAF9>..<reserved-1FAFF>
+1FC00..1FFFD ; Extended_Pictographic# E0.0[1022] (🰀..🿽) <reserved-1FC00>..<reserved-1FFFD>
+
+# Total elements: 3537
+
+#EOF
diff --git a/contrib/unicode/gen-box-drawing-chars.py b/contrib/unicode/gen-box-drawing-chars.py
index 9a55266..09a9d1d 100755
--- a/contrib/unicode/gen-box-drawing-chars.py
+++ b/contrib/unicode/gen-box-drawing-chars.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import unicodedata
diff --git a/contrib/unicode/gen-combining-chars.py b/contrib/unicode/gen-combining-chars.py
index fb5ef50..9f9365c 100755
--- a/contrib/unicode/gen-combining-chars.py
+++ b/contrib/unicode/gen-combining-chars.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
from pprint import pprint
import unicodedata
diff --git a/contrib/unicode/gen-printable-chars.py b/contrib/unicode/gen-printable-chars.py
index 7684c08..2d4ed4e 100755
--- a/contrib/unicode/gen-printable-chars.py
+++ b/contrib/unicode/gen-printable-chars.py
@@ -16,7 +16,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
from pprint import pprint
import unicodedata
diff --git a/contrib/unicode/gen_libstdcxx_unicode_data.py b/contrib/unicode/gen_libstdcxx_unicode_data.py
new file mode 100755
index 0000000..1449145
--- /dev/null
+++ b/contrib/unicode/gen_libstdcxx_unicode_data.py
@@ -0,0 +1,222 @@
+#!/usr/bin/env python3
+#
+# Script to generate tables for libstdc++ std::format width estimation.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 3, or (at your option) any later
+# version.
+#
+# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# To update the Libstdc++ static data in <bits/unicode-data.h> download the latest:
+# ftp://ftp.unicode.org/Public/UNIDATA/EastAsianWidth.txt
+# ftp://ftp.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
+# ftp://ftp.unicode.org/Public/UNIDATA/auxiliary/GraphemeBreakProperty.txt
+# ftp://ftp.unicode.org/Public/UNIDATA/emoji/emoji-data.txt
+# Then run this script and save the output to
+# ../../libstdc++-v3/include/bits/unicode-data.h
+
+import sys
+import re
+import math
+
+print("// Generated by contrib/unicode/gen_std_format_width.py, do not edit.\n")
+print("#ifndef _GLIBCXX_GET_UNICODE_DATA")
+print('# error "This is not a public header, do not include it directly"')
+print("#elif _GLIBCXX_GET_UNICODE_DATA != 150100")
+print('# error "Version mismatch for Unicode static data"')
+print("#endif\n")
+
+# Process a list and return a list of tuples (index, val) which are the elements
+# in the list that have a different val from the previous element.
+# e.g. find_edges([a, a, b, b, c, b, b, d]) is [(0,a), (2,b), (4,c), (5,b), (7,d)]
+# and find_edges([a, a, b, b, c, b, b, d], a) is [(2,b), (4,c), (5,b), (7,d)]
+def find_edges(vals, init = None):
+ edges = []
+ prev_val = init
+ for i, v in enumerate(vals):
+ if v != prev_val:
+ edges.append((i,v))
+ prev_val = v
+ return edges
+
+all_code_points = []
+
+# Process a code point value or range of code point values with given property.
+def process_code_points(code_points, val):
+ # Example arguments:
+ # 1100..115F, x
+ # 232A, y
+
+ r = code_points.split("..")
+ if len(r) == 1:
+ c = int(r[0], base=16)
+ all_code_points[c] = val
+ elif len(r) == 2:
+ begin = int(r[0], base=16)
+ end = int(r[1], base=16) + 1
+ all_code_points[begin:end] = [val] * (end - begin)
+ else:
+ raise ValueError
+
+# By default every code point has width 1. This is what the C++ standard says,
+# even though the Unicode standard says some code points have width 0.
+all_code_points = [1] * (1 + 0x10FFFF)
+
+# Extract all code points with East_Asian_Width=W or East_Asian_Width=F
+for line in open("EastAsianWidth.txt", "r"):
+ # Example lines:
+ # 3000 ; F
+ # 3001..3003 ; W
+ line = line.split("#")[0]
+ if re.match(r'^[\dA-Fa-f][^;]+;\s*[WF]\s*$', line):
+ process_code_points(line.split(";")[0], 2)
+
+# The C++ standard also gives width 2 to the following ranges:
+# U+4DC0 – U+4DFF (Yijing Hexagram Symbols)
+process_code_points("4DC0..4DFF", 2)
+# U+1F300 – U+1F5FF (Miscellaneous Symbols and Pictographs)
+process_code_points("1F300..1F5FF", 2)
+# U+1F900 – U+1F9FF (Supplemental Symbols and Pictographs)
+process_code_points("1F900..1F9FF", 2)
+
+# Create a list that only contains the code points that have a different width
+# to the previous code point.
+edges = find_edges(all_code_points, 1)
+
+# Table for std::__unicode::__format_width(char32_t)
+
+print(" // Table generated by contrib/unicode/gen_std_format_width.py,")
+print(" // from EastAsianWidth.txt from the Unicode standard.");
+print(" inline constexpr char32_t __width_edges[] = {", end="")
+for i, e in enumerate(edges):
+ if i % 8:
+ print(" ", end="")
+ else:
+ print("\n ", end="")
+ c,_ = e
+ print("{:#x},".format(c), end="")
+print("\n };\n")
+
+# By default every code point has Grapheme_Cluster_Break=Other.
+all_code_points = ["Other"] * (1 + 0x10FFFF)
+
+# Extract Grapheme_Cluster_Break property for all code points.
+for line in open("GraphemeBreakProperty.txt", "r"):
+ # Example lines:
+ # "0600..0605", "Prepend"
+ # "00AD", "Control"
+ line = line.split("#")[0]
+ if re.match(r'^[\dA-Fa-f][^;]+;', line):
+ code_points, grapheme_property = line.split(";")
+ process_code_points(code_points, grapheme_property.strip())
+
+edges = find_edges(all_code_points)
+gcb_props = {p:i+1 for i,p in enumerate(sorted(set([x[1] for x in edges])))}
+shift_bits = int(math.ceil(math.log2(len(gcb_props))))
+
+# Enum definition for std::__unicode::_Gcb_property
+
+print(" enum class _Gcb_property {")
+for p in gcb_props.items():
+ print(" _Gcb_{} = {},".format(p[0],p[1]))
+print(" };\n")
+
+# Tables for std::__unicode::_Grapheme_cluster_state
+
+print(" // Values generated by contrib/unicode/gen_std_format_width.py,")
+print(" // from GraphemeBreakProperty.txt from the Unicode standard.");
+print(" // Entries are (code_point << shift_bits) + property.")
+print(" inline constexpr int __gcb_shift_bits = {:#x};".format(shift_bits))
+print(" inline constexpr uint32_t __gcb_edges[] = {", end="")
+for i, e in enumerate(edges):
+ if i % 6:
+ print(" ", end="")
+ else:
+ print("\n ", end="")
+ c, p = e
+ x = (c << shift_bits) + gcb_props[p]
+ print("{0:#x},".format(x), end="")
+print("\n };\n")
+
+# By default every code point has Indic_Conjunct_Break=None.
+all_code_points = [None] * (1 + 0x10FFFF)
+
+# Extract Indic_Conjunct_Break property for all code points.
+for line in open("DerivedCoreProperties.txt", "r"):
+ # Example lines:
+ # 094D ; InCB; Linker
+ # 0B71 ; InCB; Consonant
+ # 0300..034E ; InCB; Extend
+ line = line.split("#")[0]
+ if re.match(r'^[\dA-Fa-f][^;]+; InCB;', line):
+ code_points, _, incb_property = line.split(";")
+ process_code_points(code_points, incb_property.strip())
+
+# Table for std::__unicode::__is_incb_linker
+# This table is tiny, so just contains the list of code points.
+print(" inline constexpr char32_t __incb_linkers[] = {\n ", end="")
+for i in [i for i,p in enumerate(all_code_points) if p == "Linker"]:
+ print(" 0x{:04x},".format(i), end="")
+ all_code_points[i] = None
+print("\n };\n")
+
+edges = find_edges(all_code_points)
+
+incb_props = {None:0, "Consonant":1, "Extend":2}
+print(" enum class _InCB { _Consonant = 1, _Extend = 2 };\n")
+# Table for std::__unicode::__incb_property
+print(" // Values generated by contrib/unicode/gen_std_format_width.py,")
+print(" // from DerivedCoreProperties.txt from the Unicode standard.");
+print(" // Entries are (code_point << 2) + property.")
+print(" inline constexpr uint32_t __incb_edges[] = {", end="")
+for i, e in enumerate(edges):
+ if i % 6:
+ print(" ", end="")
+ else:
+ print("\n ", end="")
+ c, p = e
+ x = (c << 2) + incb_props[p]
+ print("{0:#x},".format(x), end="")
+print("\n };\n")
+
+# By default every code point has Emoji=No.
+all_code_points = [False] * (1 + 0x10FFFF)
+
+# Extract Emoji=Extended_Pictographic for all code points.
+for line in open("emoji-data.txt", "r"):
+ # Example lines:
+ # 1100..115F ; Extended_Pictographic
+ # 232A ; Extended_Pictographic
+ line = line.split("#")[0]
+ if re.match(r'^[\dA-Fa-f][^;]+; Extended_Pictographic', line):
+ process_code_points(line.split(";")[0], True)
+
+edges = find_edges(all_code_points, False)
+
+# Table for std::__unicode::__is_extended_pictographic
+print(" // Table generated by contrib/unicode/gen_std_format_width.py,")
+print(" // from emoji-data.txt from the Unicode standard.");
+print(" inline constexpr char32_t __xpicto_edges[] = {", end="")
+for i, e in enumerate(edges):
+ if i % 8:
+ print(" ", end="")
+ else:
+ print("\n ", end="")
+ c,_ = e
+ print("{:#x},".format(c), end="")
+print("\n };\n")
+
+# <bits/unicode.h> gives an error if this macro is left defined.
+# Do this last, so that the generated output is not usable unless we reach here.
+print("#undef _GLIBCXX_GET_UNICODE_DATA")
diff --git a/contrib/unicode/gen_wcwidth.py b/contrib/unicode/gen_wcwidth.py
index 02b28bc..6628ea5 100755
--- a/contrib/unicode/gen_wcwidth.py
+++ b/contrib/unicode/gen_wcwidth.py
@@ -16,13 +16,13 @@
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
-# <http://www.gnu.org/licenses/>. */
+# <http://www.gnu.org/licenses/>.
import sys
import os
if len(sys.argv) != 2:
- print("usage: %s <unicode version>", file=sys.stderr)
+ print("usage: %s <unicode version>" % sys.argv[0], file=sys.stderr)
sys.exit(1)
unicode_version = sys.argv[1]
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4b0e6c6..3d43d6e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,599 @@
+2024-01-07 Roger Sayle <roger@nextmovesoftware.com>
+ Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/113231
+ * config/i386/i386-features.cc (compute_convert_gain): Include
+ the overhead of explicit load and store (movd) instructions when
+ converting non-store scalar operations with memory destinations.
+ Various indentation whitespace fixes.
+
+2024-01-07 Tamar Christina <tamar.christina@arm.com>
+
+ * config/arm/neon.md (cbranch<mode>4): New.
+
+2024-01-07 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * config/riscv/riscv-vsetvl.cc: replace std::max by MAX.
+
+2024-01-06 Jiahao Xu <xujiahao@loongson.cn>
+
+ * config/loongarch/lasx.md: Set the unused bits in operand[3] to 0.
+
+2024-01-06 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ PR target/113248
+ * config/riscv/riscv-vsetvl.cc (pre_vsetvl::fuse_local_vsetvl_info):
+ Update the MAX_SEW.
+
+2024-01-06 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * config/riscv/riscv-vector-costs.cc (loop_invariant_op_p): New function.
+ (variable_vectorized_p): Teach loop invariant.
+ (has_unexpected_spills_p): Ditto.
+
+2024-01-06 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * config/riscv/riscv-protos.h (whole_reg_to_reg_move_p): New function.
+ * config/riscv/riscv-v.cc (whole_reg_to_reg_move_p): Ditto.
+ * config/riscv/vector.md: Allow non-vlmax with len = NUNITS simplification.
+
+2024-01-05 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR target/113104
+ * doc/invoke.texi (aarch64-sve-compare-costs): Replace with...
+ (aarch64-vect-compare-costs): ...this.
+ * config/aarch64/aarch64.opt (-param=aarch64-sve-compare-costs=):
+ Replace with...
+ (-param=aarch64-vect-compare-costs=): ...this new param.
+ * config/aarch64/aarch64.cc (aarch64_override_options_internal):
+ Don't disable it when vectorizing for Advanced SIMD only.
+ (aarch64_autovectorize_vector_modes): Apply VECT_COMPARE_COSTS
+ whenever aarch64_vect_compare_costs is true.
+
+2024-01-05 Lulu Cheng <chenglulu@loongson.cn>
+
+ * config/loongarch/lasx.md (lasx_mxld_<lasxfmt_f>):
+ Modify the method of determining the memory offset of [x]vld/[x]vst.
+ (lasx_mxst_<lasxfmt_f>): Likewise.
+ * config/loongarch/loongarch.cc (loongarch_valid_offset_p): Delete.
+ (loongarch_address_insns): Likewise.
+ * config/loongarch/lsx.md (lsx_ld_<lsxfmt_f>): Likewise.
+ (lsx_st_<lsxfmt_f>): Likewise.
+ * config/loongarch/predicates.md (aq10b_operand): Likewise.
+ (aq10h_operand): Likewise.
+ (aq10w_operand): Likewise.
+ (aq10d_operand): Likewise.
+
+2024-01-05 Alex Coplan <alex.coplan@arm.com>
+
+ PR target/113217
+ * config/aarch64/aarch64-ldp-fusion.cc
+ (ldp_bb_info::try_fuse_pair): If the second access can throw,
+ narrow the move range to exactly that insn.
+
+2024-01-05 Ilya Leoshkevich <iii@linux.ibm.com>
+
+ * asan.cc (asan_function_start): Drop switch_to_section ().
+ (asan_emit_stack_protection): Set .LASANPC alignment.
+ * config/i386/i386.cc: Use assemble_function_label_raw ()
+ instead of ASM_OUTPUT_LABEL ().
+ * config/s390/s390.cc (s390_asm_output_function_label):
+ Likewise.
+ * defaults.h (ASM_OUTPUT_FUNCTION_LABEL): Likewise.
+ * final.cc (final_start_function_1): Drop
+ asan_function_start ().
+ * output.h (assemble_function_label_raw): New function.
+ * varasm.cc (assemble_function_label_raw): Likewise.
+
+2024-01-05 Ilya Leoshkevich <iii@linux.ibm.com>
+
+ * config/aarch64/aarch64.cc (aarch64_declare_function_name):
+ Use ASM_OUTPUT_FUNCTION_LABEL ().
+ * config/alpha/alpha.cc (alpha_start_function): Likewise.
+ * config/arm/aout.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
+ * config/arm/arm.cc (arm_asm_declare_function_name): Likewise.
+ * config/bfin/bfin.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
+ * config/c6x/c6x.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
+ * config/gcn/gcn.cc (gcn_hsa_declare_function_name): Likewise.
+ * config/h8300/h8300.h (ASM_DECLARE_FUNCTION_NAME): Likewise.
+ * config/ia64/ia64.cc (ia64_start_function): Likewise.
+ * config/mcore/mcore-elf.h (ASM_DECLARE_FUNCTION_NAME):
+ Likewise.
+ * config/microblaze/microblaze.cc (microblaze_function_prologue):
+ Likewise.
+ * config/mips/mips.cc (mips_start_unique_function): Return the
+ tree.
+ (mips_start_function_definition): Use
+ ASM_OUTPUT_FUNCTION_LABEL ().
+ (mips_finish_stub): Pass the tree to
+ mips_start_function_definition ().
+ (mips16_build_function_stub): Likewise.
+ (mips16_build_call_stub): Likewise.
+ (mips_output_function_prologue): Likewise.
+ * config/pa/pa.cc (pa_output_function_label): Use
+ ASM_OUTPUT_FUNCTION_LABEL ().
+ * config/riscv/riscv.cc (riscv_declare_function_name): Likewise.
+ * config/rs6000/rs6000.cc (rs6000_elf_declare_function_name):
+ Likewise.
+ (rs6000_xcoff_declare_function_name): Likewise.
+
+2024-01-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/113201
+ * tree-scalar-evolution.cc (final_value_replacement_loop): Don't call
+ replace_uses_by on SSA_NAME_OCCURS_IN_ABNORMAL_PHI rslt.
+
+2024-01-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/90693
+ * tree-ssa-math-opts.cc (match_single_bit_test): If
+ tree_expr_nonzero_p (arg), remember it in the second argument to
+ IFN_POPCOUNT or lower it as arg & (arg - 1) == 0 rather than
+ arg ^ (arg - 1) > arg - 1.
+ * internal-fn.cc (expand_POPCOUNT): If second argument to
+ IFN_POPCOUNT suggests arg is non-zero, try to expand it as
+ arg & (arg - 1) == 0 rather than arg ^ (arg - 1) > arg - 1.
+
+2024-01-05 Kito Cheng <kito.cheng@sifive.com>
+
+ * config/riscv/riscv-v.cc (expand_load_store):
+ Remove `value`.
+ (expand_cond_len_op): Ditto.
+ (expand_gather_scatter): Ditto.
+ (expand_lanes_load_store): Ditto.
+ (expand_fold_extract_last): Ditto.
+
+2024-01-05 Pan Li <pan2.li@intel.com>
+
+ Revert:
+ 2024-01-05 Feng Wang <wangfeng@eswincomputing.com>
+
+ * config/riscv/riscv-vector-builtins-bases.cc (class vandn):
+ Add new function_base for crypto vector.
+ (class bitmanip): Ditto.
+ (class b_reverse):Ditto.
+ (class vwsll): Ditto.
+ (class clmul): Ditto.
+ (class vg_nhab): Ditto.
+ (class crypto_vv):Ditto.
+ (class crypto_vi):Ditto.
+ (class vaeskf2_vsm3c):Ditto.
+ (class vsm3me): Ditto.
+ (BASE): Add BASE declaration for crypto vector.
+ * config/riscv/riscv-vector-builtins-bases.h: Ditto.
+ * config/riscv/riscv-vector-builtins-functions.def (REQUIRED_EXTENSIONS):
+ Add crypto vector intrinsic definition.
+ (vbrev): Ditto.
+ (vclz): Ditto.
+ (vctz): Ditto.
+ (vwsll): Ditto.
+ (vandn): Ditto.
+ (vbrev8): Ditto.
+ (vrev8): Ditto.
+ (vrol): Ditto.
+ (vror): Ditto.
+ (vclmul): Ditto.
+ (vclmulh): Ditto.
+ (vghsh): Ditto.
+ (vgmul): Ditto.
+ (vaesef): Ditto.
+ (vaesem): Ditto.
+ (vaesdf): Ditto.
+ (vaesdm): Ditto.
+ (vaesz): Ditto.
+ (vaeskf1): Ditto.
+ (vaeskf2): Ditto.
+ (vsha2ms): Ditto.
+ (vsha2ch): Ditto.
+ (vsha2cl): Ditto.
+ (vsm4k): Ditto.
+ (vsm4r): Ditto.
+ (vsm3me): Ditto.
+ (vsm3c): Ditto.
+ * config/riscv/riscv-vector-builtins-shapes.cc (struct crypto_vv_def):
+ Add new function_shape for crypto vector.
+ (struct crypto_vi_def): Ditto.
+ (struct crypto_vv_no_op_type_def): Ditto.
+ (SHAPE): Add SHAPE declaration of crypto vector.
+ * config/riscv/riscv-vector-builtins-shapes.h: Ditto.
+ * config/riscv/riscv-vector-builtins-types.def (DEF_RVV_CRYPTO_SEW32_OPS):
+ Add new data type for crypto vector.
+ (DEF_RVV_CRYPTO_SEW64_OPS): Ditto.
+ (vuint32mf2_t): Ditto.
+ (vuint32m1_t): Ditto.
+ (vuint32m2_t): Ditto.
+ (vuint32m4_t): Ditto.
+ (vuint32m8_t): Ditto.
+ (vuint64m1_t): Ditto.
+ (vuint64m2_t): Ditto.
+ (vuint64m4_t): Ditto.
+ (vuint64m8_t): Ditto.
+ * config/riscv/riscv-vector-builtins.cc (DEF_RVV_CRYPTO_SEW32_OPS):
+ Add new data struct for crypto vector.
+ (DEF_RVV_CRYPTO_SEW64_OPS): Ditto.
+ (registered_function::overloaded_hash): Processing size_t uimm for C overloaded func.
+ * config/riscv/riscv-vector-builtins.def (vi): Add vi OP_TYPE.
+
+2024-01-05 Feng Wang <wangfeng@eswincomputing.com>
+
+ * config/riscv/riscv-vector-builtins-bases.cc (class vandn):
+ Add new function_base for crypto vector.
+ (class bitmanip): Ditto.
+ (class b_reverse):Ditto.
+ (class vwsll): Ditto.
+ (class clmul): Ditto.
+ (class vg_nhab): Ditto.
+ (class crypto_vv):Ditto.
+ (class crypto_vi):Ditto.
+ (class vaeskf2_vsm3c):Ditto.
+ (class vsm3me): Ditto.
+ (BASE): Add BASE declaration for crypto vector.
+ * config/riscv/riscv-vector-builtins-bases.h: Ditto.
+ * config/riscv/riscv-vector-builtins-functions.def (REQUIRED_EXTENSIONS):
+ Add crypto vector intrinsic definition.
+ (vbrev): Ditto.
+ (vclz): Ditto.
+ (vctz): Ditto.
+ (vwsll): Ditto.
+ (vandn): Ditto.
+ (vbrev8): Ditto.
+ (vrev8): Ditto.
+ (vrol): Ditto.
+ (vror): Ditto.
+ (vclmul): Ditto.
+ (vclmulh): Ditto.
+ (vghsh): Ditto.
+ (vgmul): Ditto.
+ (vaesef): Ditto.
+ (vaesem): Ditto.
+ (vaesdf): Ditto.
+ (vaesdm): Ditto.
+ (vaesz): Ditto.
+ (vaeskf1): Ditto.
+ (vaeskf2): Ditto.
+ (vsha2ms): Ditto.
+ (vsha2ch): Ditto.
+ (vsha2cl): Ditto.
+ (vsm4k): Ditto.
+ (vsm4r): Ditto.
+ (vsm3me): Ditto.
+ (vsm3c): Ditto.
+ * config/riscv/riscv-vector-builtins-shapes.cc (struct crypto_vv_def):
+ Add new function_shape for crypto vector.
+ (struct crypto_vi_def): Ditto.
+ (struct crypto_vv_no_op_type_def): Ditto.
+ (SHAPE): Add SHAPE declaration of crypto vector.
+ * config/riscv/riscv-vector-builtins-shapes.h: Ditto.
+ * config/riscv/riscv-vector-builtins-types.def (DEF_RVV_CRYPTO_SEW32_OPS):
+ Add new data type for crypto vector.
+ (DEF_RVV_CRYPTO_SEW64_OPS): Ditto.
+ (vuint32mf2_t): Ditto.
+ (vuint32m1_t): Ditto.
+ (vuint32m2_t): Ditto.
+ (vuint32m4_t): Ditto.
+ (vuint32m8_t): Ditto.
+ (vuint64m1_t): Ditto.
+ (vuint64m2_t): Ditto.
+ (vuint64m4_t): Ditto.
+ (vuint64m8_t): Ditto.
+ * config/riscv/riscv-vector-builtins.cc (DEF_RVV_CRYPTO_SEW32_OPS):
+ Add new data struct for crypto vector.
+ (DEF_RVV_CRYPTO_SEW64_OPS): Ditto.
+ (registered_function::overloaded_hash): Processing size_t uimm for C overloaded func.
+ * config/riscv/riscv-vector-builtins.def (vi): Add vi OP_TYPE.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * config/riscv/riscv-vector-costs.cc (variable_vectorized_p): Teach vi variant.
+
+2024-01-04 Andrew Pinski <quic_apinski@quicinc.com>
+
+ PR tree-optimization/113186
+ * gimple-match-head.cc (gimple_bitwise_inverted_equal_p):
+ Match `^` with the `==` for 1bit integral types.
+ * match.pd (maybe_cmp): Allow for bit_xor for 1bit
+ integral types.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * toplev.cc (general_init): Pass lang_mask to urlifier.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * diagnostic.h (diagnostic_make_option_url_cb): Add lang_mask
+ param.
+ (diagnostic_context::make_option_url): Update for lang_mask param.
+ * gcc-urlifier.cc: Include "opts.h" and "options.h".
+ (gcc_urlifier::gcc_urlifier): Add lang_mask param.
+ (gcc_urlifier::m_lang_mask): New field.
+ (doc_urls): Make static.
+ (gcc_urlifier::get_url_for_quoted_text): Use label_text.
+ (gcc_urlifier::get_url_suffix_for_quoted_text): Use label_text.
+ Look for an option by name before trying a binary search in
+ doc_urls.
+ (gcc_urlifier::get_url_suffix_for_quoted_text): Use label_text.
+ (gcc_urlifier::get_url_suffix_for_option): New.
+ (make_gcc_urlifier): Add lang_mask param.
+ (selftest::gcc_urlifier_cc_tests): Update for above changes.
+ Verify that a URL is found for "-fpack-struct".
+ * gcc-urlifier.def: Drop options "--version" and "-fpack-struct".
+ * gcc-urlifier.h (make_gcc_urlifier): Add lang_mask param.
+ * gcc.cc (driver::global_initializations): Pass 0 for lang_mask
+ to make_gcc_urlifier.
+ * opts-diagnostic.h (get_option_url): Add lang_mask param.
+ * opts.cc (get_option_html_page): Remove special-casing for
+ analyzer and LTO.
+ (get_option_url_suffix): New.
+ (get_option_url): Reimplement.
+ (selftest::test_get_option_html_page): Rename to...
+ (selftest::test_get_option_url_suffix): ...this and update for
+ above changes.
+ (selftest::opts_cc_tests): Update for renaming.
+ * opts.h: Include "rich-location.h".
+ (get_option_url_suffix): New decl.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * Makefile.in (ALL_OPT_URL_FILES): New.
+ (GCC_OBJS): Add options-urls.o.
+ (OBJS): Likewise.
+ (OBJS-libcommon): Likewise.
+ (s-options): Depend on $(ALL_OPT_URL_FILES), and add this to
+ inputs to opt-gather.awk.
+ (options-urls.cc): New Makefile target.
+ * opt-functions.awk (url_suffix): New function.
+ (lang_url_suffix): New function.
+ * options-urls-cc-gen.awk: New file.
+ * opts.h (get_opt_url_suffix): New decl.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * params.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * common.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+ * config/aarch64/aarch64.opt.urls: Likewise.
+ * config/alpha/alpha.opt.urls: Likewise.
+ * config/alpha/elf.opt.urls: Likewise.
+ * config/arc/arc-tables.opt.urls: Likewise.
+ * config/arc/arc.opt.urls: Likewise.
+ * config/arm/arm-tables.opt.urls: Likewise.
+ * config/arm/arm.opt.urls: Likewise.
+ * config/arm/vxworks.opt.urls: Likewise.
+ * config/avr/avr.opt.urls: Likewise.
+ * config/bpf/bpf.opt.urls: Likewise.
+ * config/c6x/c6x-tables.opt.urls: Likewise.
+ * config/c6x/c6x.opt.urls: Likewise.
+ * config/cris/cris.opt.urls: Likewise.
+ * config/cris/elf.opt.urls: Likewise.
+ * config/csky/csky.opt.urls: Likewise.
+ * config/csky/csky_tables.opt.urls: Likewise.
+ * config/darwin.opt.urls: Likewise.
+ * config/dragonfly.opt.urls: Likewise.
+ * config/epiphany/epiphany.opt.urls: Likewise.
+ * config/fr30/fr30.opt.urls: Likewise.
+ * config/freebsd.opt.urls: Likewise.
+ * config/frv/frv.opt.urls: Likewise.
+ * config/ft32/ft32.opt.urls: Likewise.
+ * config/fused-madd.opt.urls: Likewise.
+ * config/g.opt.urls: Likewise.
+ * config/gcn/gcn.opt.urls: Likewise.
+ * config/gnu-user.opt.urls: Likewise.
+ * config/h8300/h8300.opt.urls: Likewise.
+ * config/hpux11.opt.urls: Likewise.
+ * config/i386/cygming.opt.urls: Likewise.
+ * config/i386/cygwin.opt.urls: Likewise.
+ * config/i386/djgpp.opt.urls: Likewise.
+ * config/i386/i386.opt.urls: Likewise.
+ * config/i386/mingw-w64.opt.urls: Likewise.
+ * config/i386/mingw.opt.urls: Likewise.
+ * config/i386/nto.opt.urls: Likewise.
+ * config/ia64/ia64.opt.urls: Likewise.
+ * config/ia64/ilp32.opt.urls: Likewise.
+ * config/ia64/vms.opt.urls: Likewise.
+ * config/iq2000/iq2000.opt.urls: Likewise.
+ * config/linux-android.opt.urls: Likewise.
+ * config/linux.opt.urls: Likewise.
+ * config/lm32/lm32.opt.urls: Likewise.
+ * config/loongarch/loongarch.opt.urls: Likewise.
+ * config/lynx.opt.urls: Likewise.
+ * config/m32c/m32c.opt.urls: Likewise.
+ * config/m32r/m32r.opt.urls: Likewise.
+ * config/m68k/ieee.opt.urls: Likewise.
+ * config/m68k/m68k-tables.opt.urls: Likewise.
+ * config/m68k/m68k.opt.urls: Likewise.
+ * config/m68k/uclinux.opt.urls: Likewise.
+ * config/mcore/mcore.opt.urls: Likewise.
+ * config/microblaze/microblaze.opt.urls: Likewise.
+ * config/mips/mips-tables.opt.urls: Likewise.
+ * config/mips/mips.opt.urls: Likewise.
+ * config/mips/sde.opt.urls: Likewise.
+ * config/mmix/mmix.opt.urls: Likewise.
+ * config/mn10300/mn10300.opt.urls: Likewise.
+ * config/moxie/moxie.opt.urls: Likewise.
+ * config/msp430/msp430.opt.urls: Likewise.
+ * config/nds32/nds32-elf.opt.urls: Likewise.
+ * config/nds32/nds32-linux.opt.urls: Likewise.
+ * config/nds32/nds32.opt.urls: Likewise.
+ * config/netbsd-elf.opt.urls: Likewise.
+ * config/netbsd.opt.urls: Likewise.
+ * config/nios2/elf.opt.urls: Likewise.
+ * config/nios2/nios2.opt.urls: Likewise.
+ * config/nvptx/nvptx-gen.opt.urls: Likewise.
+ * config/nvptx/nvptx.opt.urls: Likewise.
+ * config/openbsd.opt.urls: Likewise.
+ * config/or1k/elf.opt.urls: Likewise.
+ * config/or1k/or1k.opt.urls: Likewise.
+ * config/pa/pa-hpux.opt.urls: Likewise.
+ * config/pa/pa-hpux1010.opt.urls: Likewise.
+ * config/pa/pa-hpux1111.opt.urls: Likewise.
+ * config/pa/pa-hpux1131.opt.urls: Likewise.
+ * config/pa/pa.opt.urls: Likewise.
+ * config/pa/pa64-hpux.opt.urls: Likewise.
+ * config/pdp11/pdp11.opt.urls: Likewise.
+ * config/pru/pru.opt.urls: Likewise.
+ * config/riscv/riscv.opt.urls: Likewise.
+ * config/rl78/rl78.opt.urls: Likewise.
+ * config/rpath.opt.urls: Likewise.
+ * config/rs6000/476.opt.urls: Likewise.
+ * config/rs6000/aix64.opt.urls: Likewise.
+ * config/rs6000/darwin.opt.urls: Likewise.
+ * config/rs6000/linux64.opt.urls: Likewise.
+ * config/rs6000/rs6000-tables.opt.urls: Likewise.
+ * config/rs6000/rs6000.opt.urls: Likewise.
+ * config/rs6000/sysv4.opt.urls: Likewise.
+ * config/rtems.opt.urls: Likewise.
+ * config/rx/elf.opt.urls: Likewise.
+ * config/rx/rx.opt.urls: Likewise.
+ * config/s390/s390.opt.urls: Likewise.
+ * config/s390/tpf.opt.urls: Likewise.
+ * config/sh/sh.opt.urls: Likewise.
+ * config/sh/superh.opt.urls: Likewise.
+ * config/sol2.opt.urls: Likewise.
+ * config/sparc/long-double-switch.opt.urls: Likewise.
+ * config/sparc/sparc.opt.urls: Likewise.
+ * config/stormy16/stormy16.opt.urls: Likewise.
+ * config/v850/v850.opt.urls: Likewise.
+ * config/vax/elf.opt.urls: Likewise.
+ * config/vax/vax.opt.urls: Likewise.
+ * config/visium/visium.opt.urls: Likewise.
+ * config/vms/vms.opt.urls: Likewise.
+ * config/vxworks-smp.opt.urls: Likewise.
+ * config/vxworks.opt.urls: Likewise.
+ * config/xtensa/elf.opt.urls: Likewise.
+ * config/xtensa/uclinux.opt.urls: Likewise.
+ * config/xtensa/xtensa.opt.urls: Likewise.
+ * config/bfin/bfin.opt.urls: New file.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * Makefile.in (OPT_URLS_HTML_DEPS): New.
+ (regenerate-opt-urls): New target.
+ (regenerate-opt-urls-unit-test): New target.
+ * doc/options.texi (Option properties): Add UrlSuffix and
+ description of regenerate-opt-urls.py. Add LangUrlSuffix_*.
+ * doc/sourcebuild.texi (Anatomy of a Language Front End): Add
+ reference to regenerate-opt-urls.py's PER_LANGUAGE_OPTION_INDEXES
+ and Makefile.in's OPT_URLS_HTML_DEPS.
+ (Anatomy of a Target Back End): Add
+ reference to regenerate-opt-urls.py's TARGET_SPECIFIC_PAGES.
+ * regenerate-opt-urls.py: New file.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * diagnostic-format-sarif.cc
+ (sarif_builder::make_logical_location_object): Convert to...
+ (make_sarif_logical_location_object): ...this.
+ (sarif_builder::set_any_logical_locs_arr): Update for above
+ change.
+ (sarif_builder::make_thread_flow_location_object): Call
+ maybe_add_sarif_properties on each diagnostic_event.
+ * diagnostic-format-sarif.h (class logical_location): New forward
+ decl.
+ (make_sarif_logical_location_object): New decl.
+ * diagnostic-path.h (class sarif_object): New forward decl.
+ (diagnostic_event::maybe_add_sarif_properties): New vfunc.
+
+2024-01-04 Kuan-Lin Chen <rufus@andestech.com>
+ Patrick Lin <patrick@andestech.com>
+ Rufus Chen <rufus@andestech.com>
+ Monk Chiang <monk.chiang@sifive.com>
+
+ * config/riscv/riscv.cc (riscv_legitimize_move): Expand movfh
+ with Nan-boxing value.
+ * config/riscv/riscv.md (*movhf_softfloat_unspec): New pattern.
+
+2024-01-04 Roger Sayle <roger@nextmovesoftware.com>
+ Jeff Law <jlaw@ventanamicro.com>
+
+ PR rtl-optimization/104914
+ * expr.cc (expand_assignment): When target is SUBREG_PROMOTED_VAR_P
+ a sign or zero extension is only required if the modified field
+ overlaps the SUBREG's most significant bit. On MODE_REP_EXTENDED
+ targets, don't refer to the temporarily incorrectly extended value
+ using a SUBREG, but instead generate an explicit TRUNCATE rtx.
+
+2024-01-04 Pan Li <pan2.li@intel.com>
+
+ Revert:
+ 2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * config/riscv/riscv-vector-costs.cc (variable_vectorized_p): Teach vi variant.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * config/riscv/riscv-vector-costs.cc (variable_vectorized_p): Teach vi variant.
+
+2024-01-04 Kito Cheng <kito.cheng@sifive.com>
+
+ * config/riscv/riscv.cc (riscv_for_each_saved_reg): Adjust the
+ offset of fcsr.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * config/riscv/riscv-vector-costs.cc (variable_vectorized_p): New function.
+ (compute_nregs_for_mode): Refine LMUL.
+ (max_number_of_live_regs): Ditto.
+ (compute_estimated_lmul): Ditto.
+ (has_unexpected_spills_p): Ditto.
+
+2024-01-04 Li Wei <liwei@loongson.cn>
+
+ * config/loongarch/loongarch.cc (loongarch_is_odd_extraction):
+ Remove useless forward declaration.
+ (loongarch_is_even_extraction): Remove useless forward declaration.
+ (loongarch_try_expand_lsx_vshuf_const): Removed.
+ (loongarch_expand_vec_perm_const_1): Merged.
+ (loongarch_is_double_duplicate): Removed.
+ (loongarch_is_center_extraction): Ditto.
+ (loongarch_is_reversing_permutation): Ditto.
+ (loongarch_is_di_misalign_extract): Ditto.
+ (loongarch_is_si_misalign_extract): Ditto.
+ (loongarch_is_lasx_lowpart_extract): Ditto.
+ (loongarch_is_op_reverse_perm): Ditto.
+ (loongarch_is_single_op_perm): Ditto.
+ (loongarch_is_divisible_perm): Ditto.
+ (loongarch_is_triple_stride_extract): Ditto.
+ (loongarch_expand_vec_perm_const_2): Merged.
+ (loongarch_expand_vec_perm_const): New.
+ (loongarch_vectorize_vec_perm_const): Adjust.
+
+2024-01-04 Sandra Loosemore <sandra@codesourcery.com>
+
+ * omp-general.cc: Fix comment typos and misplaced/confusing
+ comments. Delete redundant include of omp-general.h.
+
+2024-01-04 YunQiang Su <syq@gcc.gnu.org>
+
+ PR rtl-optimization/104914
+ * config/mips/mips.md (insqisi_extended): New patterns.
+ (inshisi_extended): Ditto.
+
+2024-01-04 YunQiang Su <syq@gcc.gnu.org>
+
+ * config/mips/mips.cc (mips_insn_cost): New function.
+
+2024-01-04 YunQiang Su <syq@gcc.gnu.org>
+
+ * config/mips/mips.md (perf_ratio): New attribute.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ PR target/113206
+ PR target/113209
+ * config/riscv/riscv-vsetvl.cc (invalid_opt_bb_p): New function.
+ (pre_vsetvl::compute_lcm_local_properties): Disable earliest fusion on
+ blocks belong to infinite loop.
+ (pre_vsetvl::emit_vsetvl): Remove fake edges.
+ * config/riscv/t-riscv: Add a new include file.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * config/riscv/vector.md: Fix indent.
+
2024-01-03 Kwok Cheung Yeung <kcy@codesourcery.com>
* tree-core.h (enum omp_clause_code): Move OMP_CLAUSE_INDIRECT to before
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index e5d3623..bfc9285 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20240104
+20240108
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 0446fa0..9d96560 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * gcc-interface/lang.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
2024-01-03 Jakub Jelinek <jakub@redhat.com>
* gnat_ugn.texi: Bump @copying's copyright year.
diff --git a/gcc/analyzer/ChangeLog b/gcc/analyzer/ChangeLog
index e07878b..1cd5126 100644
--- a/gcc/analyzer/ChangeLog
+++ b/gcc/analyzer/ChangeLog
@@ -1,3 +1,36 @@
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * analyzer.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * checker-event.cc: Include "diagnostic-format-sarif.h" and
+ "tree-logical-location.h".
+ (checker_event::maybe_add_sarif_properties): New.
+ (superedge_event::maybe_add_sarif_properties): New.
+ (superedge_event::superedge_event): Add comment.
+ * checker-event.h (checker_event::maybe_add_sarif_properties): New
+ decl.
+ (superedge_event::maybe_add_sarif_properties): New decl.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ PR analyzer/112790
+ * checker-event.cc (class inlining_info): Move to...
+ * inlining-iterator.h (class inlining_info): ...here.
+ * sm-malloc.cc: Include "analyzer/inlining-iterator.h".
+ (maybe_complain_about_deref_before_check): Reject stmts that were
+ inlined from another function.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ PR analyzer/113222
+ * access-diagram.cc (valid_region_spatial_item::add_boundaries):
+ Handle TYPE_DOMAIN being null.
+ (valid_region_spatial_item::add_array_elements_to_table):
+ Likewise.
+
2023-12-16 David Malcolm <dmalcolm@redhat.com>
* analyzer.cc: Include "tree-pretty-print.h" and
diff --git a/gcc/asan.cc b/gcc/asan.cc
index 307d2fc..0fd7dd1 100644
--- a/gcc/asan.cc
+++ b/gcc/asan.cc
@@ -1481,10 +1481,7 @@ asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
void
asan_function_start (void)
{
- section *fnsec = function_section (current_function_decl);
- switch_to_section (fnsec);
- ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LASANPC",
- current_function_funcdef_no);
+ ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LASANPC", current_function_funcdef_no);
}
/* Return number of shadow bytes that are occupied by a local variable
@@ -2006,6 +2003,7 @@ asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
DECL_INITIAL (decl) = decl;
TREE_ASM_WRITTEN (decl) = 1;
TREE_ASM_WRITTEN (id) = 1;
+ DECL_ALIGN_RAW (decl) = DECL_ALIGN_RAW (current_function_decl);
emit_move_insn (mem, expand_normal (build_fold_addr_expr (decl)));
shadow_base = expand_binop (Pmode, lshr_optab, base,
gen_int_shift_amount (Pmode, ASAN_SHADOW_SHIFT),
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 09d0735..3f8c3d6 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,7 @@
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * c.opt.urls: New file, autogenerated by regenerate-opt-urls.py.
+
2023-12-21 Jakub Jelinek <jakub@redhat.com>
* c.opt (Walloc-size): Enable also for C++ and ObjC++.
diff --git a/gcc/config/aarch64/aarch64-ldp-fusion.cc b/gcc/config/aarch64/aarch64-ldp-fusion.cc
index 25f9b2d..2fe1b1d 100644
--- a/gcc/config/aarch64/aarch64-ldp-fusion.cc
+++ b/gcc/config/aarch64/aarch64-ldp-fusion.cc
@@ -2195,6 +2195,15 @@ ldp_bb_info::try_fuse_pair (bool load_p, unsigned access_size,
if (base->hazards[0])
range.last = base->hazards[0]->prev_nondebug_insn ();
+ // If the second insn can throw, narrow the move range to exactly that insn.
+ // This prevents us trying to move the second insn from the end of the BB.
+ if (cfun->can_throw_non_call_exceptions
+ && find_reg_note (insns[1]->rtl (), REG_EH_REGION, NULL_RTX))
+ {
+ gcc_assert (range.includes (insns[1]));
+ range = insn_range_info (insns[1]);
+ }
+
// Placement strategy: push loads down and pull stores up, this should
// help register pressure by reducing live ranges.
if (load_p)
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index d037683..a5a6b52 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -18223,12 +18223,6 @@ aarch64_override_options_internal (struct gcc_options *opts)
SET_OPTION_IF_UNSET (opts, &global_options_set,
param_sched_autopref_queue_depth, queue_depth);
- /* If using Advanced SIMD only for autovectorization disable SVE vector costs
- comparison. */
- if (aarch64_autovec_preference == 1)
- SET_OPTION_IF_UNSET (opts, &global_options_set,
- aarch64_sve_compare_costs, 0);
-
/* Set up parameters to be used in prefetching algorithm. Do not
override the defaults unless we are tuning for a core we have
researched values for. */
@@ -22138,12 +22132,7 @@ aarch64_autovectorize_vector_modes (vector_modes *modes, bool)
modes->safe_push (sve_modes[sve_i++]);
unsigned int flags = 0;
- /* Consider enabling VECT_COMPARE_COSTS for SVE, both so that we
- can compare SVE against Advanced SIMD and so that we can compare
- multiple SVE vectorization approaches against each other. There's
- not really any point doing this for Advanced SIMD only, since the
- first mode that works should always be the best. */
- if (TARGET_SVE && aarch64_sve_compare_costs)
+ if (aarch64_vect_compare_costs)
flags |= VECT_COMPARE_COSTS;
return flags;
}
@@ -24207,7 +24196,7 @@ aarch64_declare_function_name (FILE *stream, const char* name,
/* Don't forget the type directive for ELF. */
ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "function");
- ASM_OUTPUT_LABEL (stream, name);
+ ASM_OUTPUT_FUNCTION_LABEL (stream, name, fndecl);
cfun->machine->label_is_assembled = true;
}
diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
index 2abdc84..ceed5cd 100644
--- a/gcc/config/aarch64/aarch64.opt
+++ b/gcc/config/aarch64/aarch64.opt
@@ -332,9 +332,10 @@ moutline-atomics
Target Var(aarch64_flag_outline_atomics) Init(2) Save
Generate local calls to out-of-line atomic operations.
--param=aarch64-sve-compare-costs=
-Target Joined UInteger Var(aarch64_sve_compare_costs) Init(1) IntegerRange(0, 1) Param
-When vectorizing for SVE, consider using unpacked vectors for smaller elements and use the cost model to pick the cheapest approach. Also use the cost model to choose between SVE and Advanced SIMD vectorization.
+-param=aarch64-vect-compare-costs=
+Target Joined UInteger Var(aarch64_vect_compare_costs) Init(1) IntegerRange(0, 1) Param
+When vectorizing, consider using multiple different approaches and use
+the cost model to choose the cheapest one.
-param=aarch64-float-recp-precision=
Target Joined UInteger Var(aarch64_float_recp_precision) Init(1) IntegerRange(1, 5) Param
diff --git a/gcc/config/alpha/alpha.cc b/gcc/config/alpha/alpha.cc
index b540e4f..98df142 100644
--- a/gcc/config/alpha/alpha.cc
+++ b/gcc/config/alpha/alpha.cc
@@ -7986,8 +7986,7 @@ int num_source_filenames = 0;
/* Output the textual info surrounding the prologue. */
void
-alpha_start_function (FILE *file, const char *fnname,
- tree decl ATTRIBUTE_UNUSED)
+alpha_start_function (FILE *file, const char *fnname, tree decl)
{
unsigned long imask, fmask;
/* Complete stack size needed. */
@@ -8052,7 +8051,7 @@ alpha_start_function (FILE *file, const char *fnname,
if (TARGET_ABI_OPEN_VMS)
strcat (entry_label, "..en");
- ASM_OUTPUT_LABEL (file, entry_label);
+ ASM_OUTPUT_FUNCTION_LABEL (file, entry_label, decl);
inside_function = TRUE;
if (TARGET_ABI_OPEN_VMS)
diff --git a/gcc/config/arm/aout.h b/gcc/config/arm/aout.h
index b3f2dbd..db9e8dd 100644
--- a/gcc/config/arm/aout.h
+++ b/gcc/config/arm/aout.h
@@ -152,7 +152,7 @@
do \
{ \
ARM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL); \
- ASM_OUTPUT_LABEL (STREAM, NAME); \
+ ASM_OUTPUT_FUNCTION_LABEL (STREAM, NAME, DECL); \
} \
while (0)
#endif
diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
index a14b86a..e5a9444 100644
--- a/gcc/config/arm/arm.cc
+++ b/gcc/config/arm/arm.cc
@@ -21800,7 +21800,7 @@ arm_asm_declare_function_name (FILE *file, const char *name, tree decl)
ARM_DECLARE_FUNCTION_NAME (file, name, decl);
ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
ASM_DECLARE_RESULT (file, DECL_RESULT (decl));
- ASM_OUTPUT_LABEL (file, name);
+ ASM_OUTPUT_FUNCTION_LABEL (file, name, decl);
if (cmse_name)
ASM_OUTPUT_LABEL (file, cmse_name);
diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
index 91ca7e8..bb6e28f 100644
--- a/gcc/config/arm/neon.md
+++ b/gcc/config/arm/neon.md
@@ -408,6 +408,55 @@
[(set_attr "type" "neon_store1_one_lane<q>,neon_to_gp<q>")]
)
+;; Patterns comparing two vectors and conditionally jump.
+;; Avdanced SIMD lacks a vector != comparison, but this is a quite common
+;; operation. To not pay the penalty for inverting == we can map our any
+;; comparisons to all i.e. any(~x) => all(x).
+;;
+;; However unlike the AArch64 version, we can't optimize this further as the
+;; chain is too long for combine due to these being unspecs so it doesn't fold
+;; the operation to something simpler.
+(define_expand "cbranch<mode>4"
+ [(set (pc) (if_then_else
+ (match_operator 0 "expandable_comparison_operator"
+ [(match_operand:VDQI 1 "register_operand")
+ (match_operand:VDQI 2 "reg_or_zero_operand")])
+ (label_ref (match_operand 3 "" ""))
+ (pc)))]
+ "TARGET_NEON"
+{
+ rtx mask = operands[1];
+
+ /* If comparing against a non-zero vector we have to do a comparison first
+ so we can have a != 0 comparison with the result. */
+ if (operands[2] != CONST0_RTX (<MODE>mode))
+ {
+ mask = gen_reg_rtx (<MODE>mode);
+ emit_insn (gen_xor<mode>3 (mask, operands[1], operands[2]));
+ }
+
+ /* For 128-bit vectors we need an additional reductions. */
+ if (known_eq (128, GET_MODE_BITSIZE (<MODE>mode)))
+ {
+ /* Always reduce using a V4SI. */
+ rtx op1 = lowpart_subreg (V4SImode, mask, <MODE>mode);
+ mask = gen_reg_rtx (V2SImode);
+ rtx low = gen_reg_rtx (V2SImode);
+ rtx high = gen_reg_rtx (V2SImode);
+ emit_insn (gen_neon_vget_lowv4si (low, op1));
+ emit_insn (gen_neon_vget_highv4si (high, op1));
+ emit_insn (gen_neon_vpumaxv2si (mask, low, high));
+ }
+
+ rtx op1 = lowpart_subreg (V2SImode, mask, GET_MODE (mask));
+ emit_insn (gen_neon_vpumaxv2si (op1, op1, op1));
+
+ rtx val = gen_reg_rtx (SImode);
+ emit_move_insn (val, gen_lowpart (SImode, mask));
+ emit_jump_insn (gen_cbranch_cc (operands[0], val, const0_rtx, operands[3]));
+ DONE;
+})
+
;; This pattern is renamed from "vec_extract<mode><V_elem_l>" to
;; "neon_vec_extract<mode><V_elem_l>" and this pattern is called
;; by define_expand in vec-common.md file.
diff --git a/gcc/config/bfin/bfin.h b/gcc/config/bfin/bfin.h
index 7977ed7..e6ac8e3 100644
--- a/gcc/config/bfin/bfin.h
+++ b/gcc/config/bfin/bfin.h
@@ -995,14 +995,14 @@ typedef enum directives {
fputc ('\n',FILE); \
} while (0)
-#define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL) \
- do { \
- fputs (".type ", FILE); \
- assemble_name (FILE, NAME); \
- fputs (", STT_FUNC", FILE); \
- fputc (';',FILE); \
- fputc ('\n',FILE); \
- ASM_OUTPUT_LABEL(FILE, NAME); \
+#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
+ do { \
+ fputs (".type ", FILE); \
+ assemble_name (FILE, NAME); \
+ fputs (", STT_FUNC", FILE); \
+ fputc (';', FILE); \
+ fputc ('\n', FILE); \
+ ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL); \
} while (0)
#define ASM_OUTPUT_LABEL(FILE, NAME) \
diff --git a/gcc/config/c6x/c6x.h b/gcc/config/c6x/c6x.h
index f65420d..1b16ff5 100644
--- a/gcc/config/c6x/c6x.h
+++ b/gcc/config/c6x/c6x.h
@@ -459,7 +459,7 @@ struct GTY(()) machine_function
c6x_output_file_unwind (FILE); \
ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \
ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
- ASM_OUTPUT_LABEL (FILE, NAME); \
+ ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL); \
} \
while (0)
diff --git a/gcc/config/gcn/gcn.cc b/gcc/config/gcn/gcn.cc
index b8c107a..79d3a65 100644
--- a/gcc/config/gcn/gcn.cc
+++ b/gcc/config/gcn/gcn.cc
@@ -6555,7 +6555,7 @@ output_file_start (void)
comments that pass information to mkoffload. */
void
-gcn_hsa_declare_function_name (FILE *file, const char *name, tree)
+gcn_hsa_declare_function_name (FILE *file, const char *name, tree decl)
{
int sgpr, vgpr, avgpr;
bool xnack_enabled = TARGET_XNACK;
@@ -6716,8 +6716,7 @@ gcn_hsa_declare_function_name (FILE *file, const char *name, tree)
fputs ("\t.type\t", file);
assemble_name (file, name);
fputs (",@function\n", file);
- assemble_name (file, name);
- fputs (":\n", file);
+ ASM_OUTPUT_FUNCTION_LABEL (file, name, decl);
/* This comment is read by mkoffload. */
if (flag_openacc)
diff --git a/gcc/config/gcn/mkoffload.cc b/gcc/config/gcn/mkoffload.cc
index 3341c0d..5b7de00 100644
--- a/gcc/config/gcn/mkoffload.cc
+++ b/gcc/config/gcn/mkoffload.cc
@@ -84,6 +84,7 @@
== EF_AMDGPU_FEATURE_XNACK_ON_V4)
#define TEST_XNACK_OFF(VAR) ((VAR & EF_AMDGPU_FEATURE_XNACK_V4) \
== EF_AMDGPU_FEATURE_XNACK_OFF_V4)
+#define TEST_XNACK_UNSET(VAR) ((VAR & EF_AMDGPU_FEATURE_XNACK_V4) == 0)
#define SET_SRAM_ECC_ON(VAR) VAR = ((VAR & ~EF_AMDGPU_FEATURE_SRAMECC_V4) \
| EF_AMDGPU_FEATURE_SRAMECC_ON_V4)
@@ -122,8 +123,7 @@ static struct obstack files_to_cleanup;
enum offload_abi offload_abi = OFFLOAD_ABI_UNSET;
uint32_t elf_arch = EF_AMDGPU_MACH_AMDGCN_GFX803; // Default GPU architecture.
-uint32_t elf_flags =
- (EF_AMDGPU_FEATURE_XNACK_ANY_V4 | EF_AMDGPU_FEATURE_SRAMECC_ANY_V4);
+uint32_t elf_flags = EF_AMDGPU_FEATURE_SRAMECC_ANY_V4;
static int gcn_stack_size = 0; /* Zero means use default. */
@@ -471,26 +471,6 @@ copy_early_debug_info (const char *infile, const char *outfile)
return true;
}
-/* CDNA2 devices have twice as many VGPRs compared to older devices,
- but the AVGPRS are allocated from the same pool. */
-
-static int
-isa_has_combined_avgprs (int isa)
-{
- switch (isa)
- {
- case EF_AMDGPU_MACH_AMDGCN_GFX803:
- case EF_AMDGPU_MACH_AMDGCN_GFX900:
- case EF_AMDGPU_MACH_AMDGCN_GFX906:
- case EF_AMDGPU_MACH_AMDGCN_GFX908:
- case EF_AMDGPU_MACH_AMDGCN_GFX1030:
- return false;
- case EF_AMDGPU_MACH_AMDGCN_GFX90a:
- return true;
- }
- fatal_error (input_location, "unhandled ISA in isa_has_combined_avgprs");
-}
-
/* Parse an input assembler file, extract the offload tables etc.,
and output (1) the assembler code, minus the tables (which can contain
problematic relocations), and (2) a C file with the offload tables
@@ -516,7 +496,6 @@ process_asm (FILE *in, FILE *out, FILE *cfile)
{
int sgpr_count;
int vgpr_count;
- int avgpr_count;
char *kernel_name;
} regcount = { -1, -1, NULL };
@@ -564,12 +543,6 @@ process_asm (FILE *in, FILE *out, FILE *cfile)
gcc_assert (regcount.kernel_name);
break;
}
- else if (sscanf (buf, " .agpr_count: %d\n",
- &regcount.avgpr_count) == 1)
- {
- gcc_assert (regcount.kernel_name);
- break;
- }
break;
}
@@ -712,8 +685,6 @@ process_asm (FILE *in, FILE *out, FILE *cfile)
{
sgpr_count = regcounts[j].sgpr_count;
vgpr_count = regcounts[j].vgpr_count;
- if (isa_has_combined_avgprs (elf_arch))
- vgpr_count += regcounts[j].avgpr_count;
break;
}
@@ -1034,6 +1005,25 @@ main (int argc, char **argv)
gcc_unreachable ();
}
+ /* Disable XNACK mode on architectures where it doesn't work (well).
+ Set default to "any" otherwise. */
+ switch (elf_arch)
+ {
+ case EF_AMDGPU_MACH_AMDGCN_GFX803:
+ case EF_AMDGPU_MACH_AMDGCN_GFX900:
+ case EF_AMDGPU_MACH_AMDGCN_GFX906:
+ case EF_AMDGPU_MACH_AMDGCN_GFX908:
+ case EF_AMDGPU_MACH_AMDGCN_GFX1030:
+ SET_XNACK_OFF (elf_flags);
+ break;
+ case EF_AMDGPU_MACH_AMDGCN_GFX90a:
+ if (TEST_XNACK_UNSET (elf_flags))
+ SET_XNACK_ANY (elf_flags);
+ break;
+ default:
+ fatal_error (input_location, "unhandled architecture");
+ }
+
/* Build arguments for compiler pass. */
struct obstack cc_argv_obstack;
obstack_init (&cc_argv_obstack);
diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h
index aa94961..bb0bf74 100644
--- a/gcc/config/h8300/h8300.h
+++ b/gcc/config/h8300/h8300.h
@@ -650,7 +650,7 @@ struct cum_arg
#define GLOBAL_ASM_OP "\t.global "
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
- ASM_OUTPUT_LABEL (FILE, NAME)
+ ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL)
/* This is how to store into the string LABEL
the symbol_ref name of an internal numbered label where
diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index 4ae3e75..4020b27 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -563,183 +563,195 @@ general_scalar_chain::compute_convert_gain ()
else if (MEM_P (src) && REG_P (dst))
igain += m * ix86_cost->int_load[2] - ix86_cost->sse_load[sse_cost_idx];
else
- switch (GET_CODE (src))
- {
- case ASHIFT:
- case ASHIFTRT:
- case LSHIFTRT:
- if (m == 2)
- {
- if (INTVAL (XEXP (src, 1)) >= 32)
- igain += ix86_cost->add;
- /* Gain for extend highpart case. */
- else if (GET_CODE (XEXP (src, 0)) == ASHIFT)
- igain += ix86_cost->shift_const - ix86_cost->sse_op;
- else
- igain += ix86_cost->shift_const;
- }
+ {
+ /* For operations on memory operands, include the overhead
+ of explicit load and store instructions. */
+ if (MEM_P (dst))
+ igain += optimize_insn_for_size_p ()
+ ? -COSTS_N_BYTES (8)
+ : (m * (ix86_cost->int_load[2]
+ + ix86_cost->int_store[2])
+ - (ix86_cost->sse_load[sse_cost_idx] +
+ ix86_cost->sse_store[sse_cost_idx]));
- igain += ix86_cost->shift_const - ix86_cost->sse_op;
+ switch (GET_CODE (src))
+ {
+ case ASHIFT:
+ case ASHIFTRT:
+ case LSHIFTRT:
+ if (m == 2)
+ {
+ if (INTVAL (XEXP (src, 1)) >= 32)
+ igain += ix86_cost->add;
+ /* Gain for extend highpart case. */
+ else if (GET_CODE (XEXP (src, 0)) == ASHIFT)
+ igain += ix86_cost->shift_const - ix86_cost->sse_op;
+ else
+ igain += ix86_cost->shift_const;
+ }
- if (CONST_INT_P (XEXP (src, 0)))
- igain -= vector_const_cost (XEXP (src, 0));
- break;
+ igain += ix86_cost->shift_const - ix86_cost->sse_op;
- case ROTATE:
- case ROTATERT:
- igain += m * ix86_cost->shift_const;
- if (TARGET_AVX512VL)
- igain -= ix86_cost->sse_op;
- else if (smode == DImode)
- {
- int bits = INTVAL (XEXP (src, 1));
- if ((bits & 0x0f) == 0)
- igain -= ix86_cost->sse_op;
- else if ((bits & 0x07) == 0)
- igain -= 2 * ix86_cost->sse_op;
- else
- igain -= 3 * ix86_cost->sse_op;
- }
- else if (INTVAL (XEXP (src, 1)) == 16)
- igain -= ix86_cost->sse_op;
- else
- igain -= 2 * ix86_cost->sse_op;
- break;
-
- case AND:
- case IOR:
- case XOR:
- case PLUS:
- case MINUS:
- igain += m * ix86_cost->add - ix86_cost->sse_op;
- /* Additional gain for andnot for targets without BMI. */
- if (GET_CODE (XEXP (src, 0)) == NOT
- && !TARGET_BMI)
- igain += m * ix86_cost->add;
-
- if (CONST_INT_P (XEXP (src, 0)))
- igain -= vector_const_cost (XEXP (src, 0));
- if (CONST_INT_P (XEXP (src, 1)))
- igain -= vector_const_cost (XEXP (src, 1));
- if (MEM_P (XEXP (src, 1)))
- {
- if (optimize_insn_for_size_p ())
- igain -= COSTS_N_BYTES (m == 2 ? 3 : 5);
- else
- igain += m * ix86_cost->int_load[2]
- - ix86_cost->sse_load[sse_cost_idx];
- }
- break;
+ if (CONST_INT_P (XEXP (src, 0)))
+ igain -= vector_const_cost (XEXP (src, 0));
+ break;
- case NEG:
- case NOT:
- igain -= ix86_cost->sse_op + COSTS_N_INSNS (1);
+ case ROTATE:
+ case ROTATERT:
+ igain += m * ix86_cost->shift_const;
+ if (TARGET_AVX512VL)
+ igain -= ix86_cost->sse_op;
+ else if (smode == DImode)
+ {
+ int bits = INTVAL (XEXP (src, 1));
+ if ((bits & 0x0f) == 0)
+ igain -= ix86_cost->sse_op;
+ else if ((bits & 0x07) == 0)
+ igain -= 2 * ix86_cost->sse_op;
+ else
+ igain -= 3 * ix86_cost->sse_op;
+ }
+ else if (INTVAL (XEXP (src, 1)) == 16)
+ igain -= ix86_cost->sse_op;
+ else
+ igain -= 2 * ix86_cost->sse_op;
+ break;
- if (GET_CODE (XEXP (src, 0)) != ABS)
- {
+ case AND:
+ case IOR:
+ case XOR:
+ case PLUS:
+ case MINUS:
+ igain += m * ix86_cost->add - ix86_cost->sse_op;
+ /* Additional gain for andnot for targets without BMI. */
+ if (GET_CODE (XEXP (src, 0)) == NOT
+ && !TARGET_BMI)
igain += m * ix86_cost->add;
- break;
- }
- /* FALLTHRU */
-
- case ABS:
- case SMAX:
- case SMIN:
- case UMAX:
- case UMIN:
- /* We do not have any conditional move cost, estimate it as a
- reg-reg move. Comparisons are costed as adds. */
- igain += m * (COSTS_N_INSNS (2) + ix86_cost->add);
- /* Integer SSE ops are all costed the same. */
- igain -= ix86_cost->sse_op;
- break;
- case COMPARE:
- if (XEXP (src, 1) != const0_rtx)
- {
- /* cmp vs. pxor;pshufd;ptest. */
- igain += COSTS_N_INSNS (m - 3);
- }
- else if (GET_CODE (XEXP (src, 0)) != AND)
- {
- /* test vs. pshufd;ptest. */
- igain += COSTS_N_INSNS (m - 2);
- }
- else if (GET_CODE (XEXP (XEXP (src, 0), 0)) != NOT)
- {
- /* and;test vs. pshufd;ptest. */
- igain += COSTS_N_INSNS (2 * m - 2);
- }
- else if (TARGET_BMI)
- {
- /* andn;test vs. pandn;pshufd;ptest. */
- igain += COSTS_N_INSNS (2 * m - 3);
- }
- else
- {
- /* not;and;test vs. pandn;pshufd;ptest. */
- igain += COSTS_N_INSNS (3 * m - 3);
- }
- break;
+ if (CONST_INT_P (XEXP (src, 0)))
+ igain -= vector_const_cost (XEXP (src, 0));
+ if (CONST_INT_P (XEXP (src, 1)))
+ igain -= vector_const_cost (XEXP (src, 1));
+ if (MEM_P (XEXP (src, 1)))
+ {
+ if (optimize_insn_for_size_p ())
+ igain -= COSTS_N_BYTES (m == 2 ? 3 : 5);
+ else
+ igain += m * ix86_cost->int_load[2]
+ - ix86_cost->sse_load[sse_cost_idx];
+ }
+ break;
- case CONST_INT:
- if (REG_P (dst))
- {
- if (optimize_insn_for_size_p ())
- {
- /* xor (2 bytes) vs. xorps (3 bytes). */
- if (src == const0_rtx)
- igain -= COSTS_N_BYTES (1);
- /* movdi_internal vs. movv2di_internal. */
- /* => mov (5 bytes) vs. movaps (7 bytes). */
- else if (x86_64_immediate_operand (src, SImode))
- igain -= COSTS_N_BYTES (2);
- else
- /* ??? Larger immediate constants are placed in the
- constant pool, where the size benefit/impact of
- STV conversion is affected by whether and how
- often each constant pool entry is shared/reused.
- The value below is empirically derived from the
- CSiBE benchmark (and the optimal value may drift
- over time). */
- igain += COSTS_N_BYTES (0);
- }
- else
- {
- /* DImode can be immediate for TARGET_64BIT
- and SImode always. */
- igain += m * COSTS_N_INSNS (1);
- igain -= vector_const_cost (src);
- }
- }
- else if (MEM_P (dst))
- {
- igain += (m * ix86_cost->int_store[2]
- - ix86_cost->sse_store[sse_cost_idx]);
- igain -= vector_const_cost (src);
- }
- break;
+ case NEG:
+ case NOT:
+ igain -= ix86_cost->sse_op + COSTS_N_INSNS (1);
- case VEC_SELECT:
- if (XVECEXP (XEXP (src, 1), 0, 0) == const0_rtx)
- {
- // movd (4 bytes) replaced with movdqa (4 bytes).
- if (!optimize_insn_for_size_p ())
- igain += ix86_cost->sse_to_integer - ix86_cost->xmm_move;
- }
- else
- {
- // pshufd; movd replaced with pshufd.
- if (optimize_insn_for_size_p ())
- igain += COSTS_N_BYTES (4);
- else
- igain += ix86_cost->sse_to_integer;
- }
- break;
+ if (GET_CODE (XEXP (src, 0)) != ABS)
+ {
+ igain += m * ix86_cost->add;
+ break;
+ }
+ /* FALLTHRU */
+
+ case ABS:
+ case SMAX:
+ case SMIN:
+ case UMAX:
+ case UMIN:
+ /* We do not have any conditional move cost, estimate it as a
+ reg-reg move. Comparisons are costed as adds. */
+ igain += m * (COSTS_N_INSNS (2) + ix86_cost->add);
+ /* Integer SSE ops are all costed the same. */
+ igain -= ix86_cost->sse_op;
+ break;
- default:
- gcc_unreachable ();
- }
+ case COMPARE:
+ if (XEXP (src, 1) != const0_rtx)
+ {
+ /* cmp vs. pxor;pshufd;ptest. */
+ igain += COSTS_N_INSNS (m - 3);
+ }
+ else if (GET_CODE (XEXP (src, 0)) != AND)
+ {
+ /* test vs. pshufd;ptest. */
+ igain += COSTS_N_INSNS (m - 2);
+ }
+ else if (GET_CODE (XEXP (XEXP (src, 0), 0)) != NOT)
+ {
+ /* and;test vs. pshufd;ptest. */
+ igain += COSTS_N_INSNS (2 * m - 2);
+ }
+ else if (TARGET_BMI)
+ {
+ /* andn;test vs. pandn;pshufd;ptest. */
+ igain += COSTS_N_INSNS (2 * m - 3);
+ }
+ else
+ {
+ /* not;and;test vs. pandn;pshufd;ptest. */
+ igain += COSTS_N_INSNS (3 * m - 3);
+ }
+ break;
+
+ case CONST_INT:
+ if (REG_P (dst))
+ {
+ if (optimize_insn_for_size_p ())
+ {
+ /* xor (2 bytes) vs. xorps (3 bytes). */
+ if (src == const0_rtx)
+ igain -= COSTS_N_BYTES (1);
+ /* movdi_internal vs. movv2di_internal. */
+ /* => mov (5 bytes) vs. movaps (7 bytes). */
+ else if (x86_64_immediate_operand (src, SImode))
+ igain -= COSTS_N_BYTES (2);
+ else
+ /* ??? Larger immediate constants are placed in the
+ constant pool, where the size benefit/impact of
+ STV conversion is affected by whether and how
+ often each constant pool entry is shared/reused.
+ The value below is empirically derived from the
+ CSiBE benchmark (and the optimal value may drift
+ over time). */
+ igain += COSTS_N_BYTES (0);
+ }
+ else
+ {
+ /* DImode can be immediate for TARGET_64BIT
+ and SImode always. */
+ igain += m * COSTS_N_INSNS (1);
+ igain -= vector_const_cost (src);
+ }
+ }
+ else if (MEM_P (dst))
+ {
+ igain += (m * ix86_cost->int_store[2]
+ - ix86_cost->sse_store[sse_cost_idx]);
+ igain -= vector_const_cost (src);
+ }
+ break;
+
+ case VEC_SELECT:
+ if (XVECEXP (XEXP (src, 1), 0, 0) == const0_rtx)
+ {
+ // movd (4 bytes) replaced with movdqa (4 bytes).
+ if (!optimize_insn_for_size_p ())
+ igain += ix86_cost->sse_to_integer - ix86_cost->xmm_move;
+ }
+ else
+ {
+ // pshufd; movd replaced with pshufd.
+ if (optimize_insn_for_size_p ())
+ igain += COSTS_N_BYTES (4);
+ else
+ igain += ix86_cost->sse_to_integer;
+ }
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ }
if (igain != 0 && dump_file)
{
@@ -757,7 +769,7 @@ general_scalar_chain::compute_convert_gain ()
{
cost += n_sse_to_integer * ix86_cost->sse_to_integer;
/* ??? integer_to_sse but we only have that in the RA cost table.
- Assume sse_to_integer/integer_to_sse are the same which they
+ Assume sse_to_integer/integer_to_sse are the same which they
are at the moment. */
cost += n_integer_to_sse * ix86_cost->sse_to_integer;
}
@@ -3147,7 +3159,7 @@ remove_partial_avx_dependency (void)
insn = NEXT_INSN (insn);
}
if (insn == BB_HEAD (bb))
- set_insn = emit_insn_before (set, insn);
+ set_insn = emit_insn_before (set, insn);
else
set_insn = emit_insn_after (set,
insn ? PREV_INSN (insn) : BB_END (bb));
@@ -3321,7 +3333,7 @@ add_condition_to_bb (tree function_decl, tree version_decl,
predicate_chain = TREE_CHAIN (predicate_chain);
if (and_expr_var == NULL)
- and_expr_var = cond_var;
+ and_expr_var = cond_var;
else
{
gimple *assign_stmt;
@@ -3338,7 +3350,7 @@ add_condition_to_bb (tree function_decl, tree version_decl,
}
if_else_stmt = gimple_build_cond (GT_EXPR, and_expr_var,
- integer_zero_node,
+ integer_zero_node,
NULL_TREE, NULL_TREE);
gimple_set_block (if_else_stmt, DECL_INITIAL (function_decl));
gimple_set_bb (if_else_stmt, new_bb);
@@ -3435,10 +3447,10 @@ dispatch_function_versions (tree dispatch_decl,
tree predicate_chain = NULL_TREE;
unsigned int priority;
/* Get attribute string, parse it and find the right predicate decl.
- The predicate function could be a lengthy combination of many
+ The predicate function could be a lengthy combination of many
features, like arch-type and various isa-variants. */
priority = get_builtin_code_for_version (version_decl,
- &predicate_chain);
+ &predicate_chain);
if (predicate_chain == NULL_TREE)
continue;
@@ -3456,7 +3468,7 @@ dispatch_function_versions (tree dispatch_decl,
to execute, which one should be dispatched? In future, allow the user
to specify a dispatch priority next to the version. */
qsort (function_version_info, actual_versions,
- sizeof (struct _function_version_info), feature_compare);
+ sizeof (struct _function_version_info), feature_compare);
for (i = 0; i < actual_versions; ++i)
*empty_bb = add_condition_to_bb (dispatch_decl,
@@ -3573,7 +3585,7 @@ ix86_get_function_versions_dispatcher (void *decl)
{
if (is_function_default_version
(default_version_info->this_node->decl))
- break;
+ break;
default_version_info = default_version_info->next;
}
@@ -3586,7 +3598,7 @@ ix86_get_function_versions_dispatcher (void *decl)
{
default_version_info->prev->next = default_version_info->next;
if (default_version_info->next)
- default_version_info->next->prev = default_version_info->prev;
+ default_version_info->next->prev = default_version_info->prev;
first_v->prev = default_version_info;
default_version_info->next = first_v;
default_version_info->prev = NULL;
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index e3636e1..8010532 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -1640,7 +1640,7 @@ ix86_asm_output_function_label (FILE *out_file, const char *fname,
SUBTARGET_ASM_UNWIND_INIT (out_file);
#endif
- ASM_OUTPUT_LABEL (out_file, fname);
+ assemble_function_label_raw (out_file, fname);
/* Output magic byte marker, if hot-patch attribute is set. */
if (is_ms_hook)
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index 1bfff1e..a38e92b 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -1328,7 +1328,8 @@ Enable vectorization for scatter instruction.
mapxf
Target Mask(ISA2_APX_F) Var(ix86_isa_flags2) Save
-Support APX code generation.
+Support code generation for APX features, including EGPR, PUSH2POP2,
+NDD and PPX.
mapx-features=
Target Undocumented Joined Enum(apx_features) EnumSet Var(ix86_apx_features) Init(apx_none) Save
diff --git a/gcc/config/ia64/ia64.cc b/gcc/config/ia64/ia64.cc
index 5fb2a41..53a4444 100644
--- a/gcc/config/ia64/ia64.cc
+++ b/gcc/config/ia64/ia64.cc
@@ -3886,8 +3886,7 @@ ia64_expand_prologue (void)
/* Output the textual info surrounding the prologue. */
void
-ia64_start_function (FILE *file, const char *fnname,
- tree decl ATTRIBUTE_UNUSED)
+ia64_start_function (FILE *file, const char *fnname, tree decl)
{
#if TARGET_ABI_OPEN_VMS
vms_start_function (fnname);
@@ -3896,7 +3895,7 @@ ia64_start_function (FILE *file, const char *fnname,
fputs ("\t.proc ", file);
assemble_name (file, fnname);
fputc ('\n', file);
- ASM_OUTPUT_LABEL (file, fnname);
+ ASM_OUTPUT_FUNCTION_LABEL (file, fnname, decl);
}
/* Called after register allocation to add any instructions needed for the
diff --git a/gcc/config/loongarch/lasx.md b/gcc/config/loongarch/lasx.md
index 027021b..6c7e373 100644
--- a/gcc/config/loongarch/lasx.md
+++ b/gcc/config/loongarch/lasx.md
@@ -635,6 +635,8 @@
(set_attr "mode" "<MODE>")])
;; xvpermi.q
+;; Unused bits in operands[3] need be set to 0 to avoid
+;; causing undefined behavior on LA464.
(define_insn "lasx_xvpermi_q_<LASX:mode>"
[(set (match_operand:LASX 0 "register_operand" "=f")
(unspec:LASX
@@ -643,7 +645,12 @@
(match_operand 3 "const_uimm8_operand")]
UNSPEC_LASX_XVPERMI_Q))]
"ISA_HAS_LASX"
- "xvpermi.q\t%u0,%u2,%3"
+{
+ int mask = 0x33;
+ mask &= INTVAL (operands[3]);
+ operands[3] = GEN_INT (mask);
+ return "xvpermi.q\t%u0,%u2,%3";
+}
[(set_attr "type" "simd_splat")
(set_attr "mode" "<MODE>")])
@@ -846,32 +853,6 @@
DONE;
})
-;; Offset load
-(define_expand "lasx_mxld_<lasxfmt_f>"
- [(match_operand:LASX 0 "register_operand")
- (match_operand 1 "pmode_register_operand")
- (match_operand 2 "aq10<lasxfmt>_operand")]
- "ISA_HAS_LASX"
-{
- rtx addr = plus_constant (GET_MODE (operands[1]), operands[1],
- INTVAL (operands[2]));
- loongarch_emit_move (operands[0], gen_rtx_MEM (<MODE>mode, addr));
- DONE;
-})
-
-;; Offset store
-(define_expand "lasx_mxst_<lasxfmt_f>"
- [(match_operand:LASX 0 "register_operand")
- (match_operand 1 "pmode_register_operand")
- (match_operand 2 "aq10<lasxfmt>_operand")]
- "ISA_HAS_LASX"
-{
- rtx addr = plus_constant (GET_MODE (operands[1]), operands[1],
- INTVAL (operands[2]));
- loongarch_emit_move (gen_rtx_MEM (<MODE>mode, addr), operands[0]);
- DONE;
-})
-
;; LASX
(define_insn "add<mode>3"
[(set (match_operand:ILASX 0 "register_operand" "=f,f,f")
diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc
index 28d6413..ec376a7 100644
--- a/gcc/config/loongarch/loongarch.cc
+++ b/gcc/config/loongarch/loongarch.cc
@@ -2126,21 +2126,11 @@ loongarch_valid_offset_p (rtx x, machine_mode mode)
/* We may need to split multiword moves, so make sure that every word
is accessible. */
- if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
+ if (!(LSX_SUPPORTED_MODE_P (mode) || LASX_SUPPORTED_MODE_P (mode))
+ && GET_MODE_SIZE (mode) > UNITS_PER_WORD
&& !IMM12_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
return false;
- /* LSX LD.* and ST.* supports 10-bit signed offsets. */
- if (LSX_SUPPORTED_MODE_P (mode)
- && !loongarch_signed_immediate_p (INTVAL (x), 10,
- loongarch_ldst_scaled_shift (mode)))
- return false;
-
- /* LASX XVLD.B and XVST.B supports 10-bit signed offsets without shift. */
- if (LASX_SUPPORTED_MODE_P (mode)
- && !loongarch_signed_immediate_p (INTVAL (x), 10, 0))
- return false;
-
return true;
}
@@ -2376,9 +2366,8 @@ loongarch_address_insns (rtx x, machine_mode mode, bool might_split_p)
case ADDRESS_REG:
if (lsx_p)
{
- /* LSX LD.* and ST.* supports 10-bit signed offsets. */
- if (loongarch_signed_immediate_p (INTVAL (addr.offset), 10,
- loongarch_ldst_scaled_shift (mode)))
+ /* LSX LD.* and ST.* supports 12-bit signed offsets. */
+ if (IMM12_OPERAND (INTVAL (addr.offset)))
return 1;
else
return 0;
diff --git a/gcc/config/loongarch/lsx.md b/gcc/config/loongarch/lsx.md
index 76d33a3..91ce774 100644
--- a/gcc/config/loongarch/lsx.md
+++ b/gcc/config/loongarch/lsx.md
@@ -812,32 +812,6 @@
DONE;
})
-;; Offset load
-(define_expand "lsx_ld_<lsxfmt_f>"
- [(match_operand:LSX 0 "register_operand")
- (match_operand 1 "pmode_register_operand")
- (match_operand 2 "aq10<lsxfmt>_operand")]
- "ISA_HAS_LSX"
-{
- rtx addr = plus_constant (GET_MODE (operands[1]), operands[1],
- INTVAL (operands[2]));
- loongarch_emit_move (operands[0], gen_rtx_MEM (<MODE>mode, addr));
- DONE;
-})
-
-;; Offset store
-(define_expand "lsx_st_<lsxfmt_f>"
- [(match_operand:LSX 0 "register_operand")
- (match_operand 1 "pmode_register_operand")
- (match_operand 2 "aq10<lsxfmt>_operand")]
- "ISA_HAS_LSX"
-{
- rtx addr = plus_constant (GET_MODE (operands[1]), operands[1],
- INTVAL (operands[2]));
- loongarch_emit_move (gen_rtx_MEM (<MODE>mode, addr), operands[0]);
- DONE;
-})
-
;; Integer operations
(define_insn "add<mode>3"
[(set (match_operand:ILSX 0 "register_operand" "=f,f,f")
diff --git a/gcc/config/loongarch/predicates.md b/gcc/config/loongarch/predicates.md
index ba5336c..01aad8d 100644
--- a/gcc/config/loongarch/predicates.md
+++ b/gcc/config/loongarch/predicates.md
@@ -167,22 +167,6 @@
(and (match_code "const_int")
(match_test "loongarch_signed_immediate_p (INTVAL (op), 8, 3)")))
-(define_predicate "aq10b_operand"
- (and (match_code "const_int")
- (match_test "loongarch_signed_immediate_p (INTVAL (op), 10, 0)")))
-
-(define_predicate "aq10h_operand"
- (and (match_code "const_int")
- (match_test "loongarch_signed_immediate_p (INTVAL (op), 10, 1)")))
-
-(define_predicate "aq10w_operand"
- (and (match_code "const_int")
- (match_test "loongarch_signed_immediate_p (INTVAL (op), 10, 2)")))
-
-(define_predicate "aq10d_operand"
- (and (match_code "const_int")
- (match_test "loongarch_signed_immediate_p (INTVAL (op), 10, 3)")))
-
(define_predicate "aq12b_operand"
(and (match_code "const_int")
(match_test "loongarch_signed_immediate_p (INTVAL (op), 12, 0)")))
diff --git a/gcc/config/mcore/mcore-elf.h b/gcc/config/mcore/mcore-elf.h
index f89fe7c..6c522c7 100644
--- a/gcc/config/mcore/mcore-elf.h
+++ b/gcc/config/mcore/mcore-elf.h
@@ -51,7 +51,7 @@ along with GCC; see the file COPYING3. If not see
} \
ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \
ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
- ASM_OUTPUT_LABEL (FILE, NAME); \
+ ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL); \
} \
while (0)
diff --git a/gcc/config/microblaze/microblaze.cc b/gcc/config/microblaze/microblaze.cc
index e5aeb49..98ec611 100644
--- a/gcc/config/microblaze/microblaze.cc
+++ b/gcc/config/microblaze/microblaze.cc
@@ -2792,8 +2792,7 @@ microblaze_function_prologue (FILE * file)
ASM_OUTPUT_TYPE_DIRECTIVE (file, fnname, "function");
}
- assemble_name (file, fnname);
- fputs (":\n", file);
+ ASM_OUTPUT_FUNCTION_LABEL (file, fnname, current_function_decl);
if (interrupt_handler && strcmp (INTERRUPT_HANDLER_NAME, fnname))
fputs ("_interrupt_handler:\n", file);
diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc
index 46b7d9b..60b336e 100644
--- a/gcc/config/mips/mips.cc
+++ b/gcc/config/mips/mips.cc
@@ -7300,7 +7300,7 @@ mips_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
/* Declare a unique, locally-binding function called NAME, then start
its definition. */
-static void
+static tree
mips_start_unique_function (const char *name)
{
tree decl;
@@ -7322,13 +7322,15 @@ mips_start_unique_function (const char *name)
fputs ("\t.hidden\t", asm_out_file);
assemble_name (asm_out_file, name);
putc ('\n', asm_out_file);
+
+ return decl;
}
/* Start a definition of function NAME. MIPS16_P indicates whether the
function contains MIPS16 code. */
static void
-mips_start_function_definition (const char *name, bool mips16_p)
+mips_start_function_definition (const char *name, bool mips16_p, tree decl)
{
if (mips16_p)
fprintf (asm_out_file, "\t.set\tmips16\n");
@@ -7352,8 +7354,7 @@ mips_start_function_definition (const char *name, bool mips16_p)
ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, name, "function");
/* Start the definition proper. */
- assemble_name (asm_out_file, name);
- fputs (":\n", asm_out_file);
+ ASM_OUTPUT_FUNCTION_LABEL (asm_out_file, name, decl);
}
/* End a function definition started by mips_start_function_definition. */
@@ -7380,8 +7381,8 @@ mips_finish_stub (mips_one_only_stub **stub_ptr)
return;
const char *name = stub->get_name ();
- mips_start_unique_function (name);
- mips_start_function_definition (name, false);
+ tree decl = mips_start_unique_function (name);
+ mips_start_function_definition (name, false, decl);
stub->output_body ();
mips_end_function_definition (name);
delete stub;
@@ -7635,7 +7636,7 @@ mips16_build_function_stub (void)
/* Start the function definition. */
assemble_start_function (stubdecl, stubname);
- mips_start_function_definition (stubname, false);
+ mips_start_function_definition (stubname, false, stubdecl);
/* If generating pic2 code, either set up the global pointer or
switch to pic0. */
@@ -7895,7 +7896,7 @@ mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code)
/* Start the function definition. */
assemble_start_function (stubdecl, stubname);
- mips_start_function_definition (stubname, false);
+ mips_start_function_definition (stubname, false, stubdecl);
if (fp_ret_p)
{
@@ -12095,7 +12096,7 @@ mips_output_function_prologue (FILE *file)
assemble_start_function. This is needed so that the name used here
exactly matches the name used in ASM_DECLARE_FUNCTION_NAME. */
fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
- mips_start_function_definition (fnname, TARGET_MIPS16);
+ mips_start_function_definition (fnname, TARGET_MIPS16, current_function_decl);
/* Output MIPS-specific frame information. */
if (!flag_inhibit_size_directive)
diff --git a/gcc/config/pa/pa.cc b/gcc/config/pa/pa.cc
index 0b97a55..48a370c 100644
--- a/gcc/config/pa/pa.cc
+++ b/gcc/config/pa/pa.cc
@@ -3991,7 +3991,8 @@ pa_output_function_label (FILE *file)
/* The function's label and associated .PROC must never be
separated and must be output *after* any profiling declarations
to avoid changing spaces/subspaces within a procedure. */
- ASM_OUTPUT_LABEL (file, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
+ const char *name = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
+ ASM_OUTPUT_FUNCTION_LABEL (file, name, current_function_decl);
fputs ("\t.PROC\n", file);
/* pa_expand_prologue does the dirty work now. We just need
diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h
index 0f0337c..00a5b64 100644
--- a/gcc/config/riscv/riscv-protos.h
+++ b/gcc/config/riscv/riscv-protos.h
@@ -687,6 +687,7 @@ bool imm_avl_p (machine_mode);
bool can_be_broadcasted_p (rtx);
bool gather_scatter_valid_offset_p (machine_mode);
HOST_WIDE_INT estimated_poly_value (poly_int64, unsigned int);
+bool whole_reg_to_reg_move_p (rtx *, machine_mode, int);
}
/* We classify builtin types into two classes:
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index b7727b2..2491522 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -3780,7 +3780,6 @@ expand_select_vl (rtx *ops)
void
expand_load_store (rtx *ops, bool is_load)
{
- poly_int64 value;
rtx mask = ops[2];
rtx len = ops[3];
machine_mode mode = GET_MODE (ops[0]);
@@ -3849,7 +3848,6 @@ expand_cond_len_op (unsigned icode, insn_flags op_type, rtx *ops, rtx len)
rtx mask = ops[1];
machine_mode mode = GET_MODE (dest);
machine_mode mask_mode = GET_MODE (mask);
- poly_int64 value;
bool is_dummy_mask = rtx_equal_p (mask, CONSTM1_RTX (mask_mode));
bool is_vlmax_len = is_vlmax_len_p (mode, len);
@@ -4025,7 +4023,6 @@ expand_gather_scatter (rtx *ops, bool is_load)
scalar_mode inner_idx_mode = GET_MODE_INNER (idx_mode);
unsigned inner_offsize = GET_MODE_BITSIZE (inner_idx_mode);
poly_int64 nunits = GET_MODE_NUNITS (vec_mode);
- poly_int64 value;
bool is_vlmax = is_vlmax_len_p (vec_mode, len);
/* Extend the offset element to address width. */
@@ -4206,7 +4203,6 @@ prepare_ternary_operands (rtx *ops)
void
expand_lanes_load_store (rtx *ops, bool is_load)
{
- poly_int64 value;
rtx mask = ops[2];
rtx len = ops[3];
rtx addr = is_load ? XEXP (ops[1], 0) : XEXP (ops[0], 0);
@@ -4259,7 +4255,6 @@ expand_fold_extract_last (rtx *ops)
rtx else_label = gen_label_rtx ();
rtx end_label = gen_label_rtx ();
rtx len = ops[4];
- poly_int64 value;
machine_mode mode = GET_MODE (vect);
machine_mode mask_mode = GET_MODE (mask);
rtx compress_vect = gen_reg_rtx (mode);
@@ -5122,4 +5117,27 @@ estimated_poly_value (poly_int64 val, unsigned int kind)
return val.coeffs[0] + val.coeffs[1] * over_min_vlen / TARGET_MIN_VLEN;
}
+/* Return true it is whole register-register move. */
+bool
+whole_reg_to_reg_move_p (rtx *ops, machine_mode mode, int avl_type_index)
+{
+ /* An operation is a whole-register move if either
+ (1) Its vlmax operand equals VLMAX
+ (2) Its vl operand equals the number of units of its mode. */
+ if (register_operand (ops[0], mode)
+ && register_operand (ops[3], mode)
+ && satisfies_constraint_vu (ops[2])
+ && satisfies_constraint_Wc1 (ops[1]))
+ {
+ if (INTVAL (ops[avl_type_index]) == VLMAX)
+ return true;
+ /* AVL propagation PASS will transform FIXED-VLMAX with NUNITS < 32
+ into NON-VLMAX with LEN = NUNITS. */
+ else if (CONST_INT_P (ops[4])
+ && known_eq (INTVAL (ops[4]), GET_MODE_NUNITS (mode)))
+ return true;
+ }
+ return false;
+}
+
} // namespace riscv_vector
diff --git a/gcc/config/riscv/riscv-vector-costs.cc b/gcc/config/riscv/riscv-vector-costs.cc
index 21f8a81..3bae581 100644
--- a/gcc/config/riscv/riscv-vector-costs.cc
+++ b/gcc/config/riscv/riscv-vector-costs.cc
@@ -230,9 +230,24 @@ get_biggest_mode (machine_mode mode1, machine_mode mode2)
return mode1_size >= mode2_size ? mode1 : mode2;
}
+/* Return true if OP is invariant. */
+
+static bool
+loop_invariant_op_p (class loop *loop,
+ tree op)
+{
+ if (is_gimple_constant (op))
+ return true;
+ if (SSA_NAME_IS_DEFAULT_DEF (op)
+ || !flow_bb_inside_loop_p (loop, gimple_bb (SSA_NAME_DEF_STMT (op))))
+ return true;
+ return gimple_uid (SSA_NAME_DEF_STMT (op)) & 1;
+}
+
/* Return true if the variable should be counted into liveness. */
static bool
-variable_vectorized_p (stmt_vec_info stmt_info, tree var, bool lhs_p)
+variable_vectorized_p (class loop *loop, stmt_vec_info stmt_info, tree var,
+ bool lhs_p)
{
if (!var)
return false;
@@ -255,6 +270,35 @@ variable_vectorized_p (stmt_vec_info stmt_info, tree var, bool lhs_p)
return false;
}
}
+ else if (is_gimple_assign (stmt))
+ {
+ tree_code tcode = gimple_assign_rhs_code (stmt);
+ /* vi variant doesn't need to allocate such statement.
+ E.g. tmp_15 = _4 + 1; will be transformed into vadd.vi
+ so the INTEGER_CST '1' doesn't need a vector register. */
+ switch (tcode)
+ {
+ case PLUS_EXPR:
+ case BIT_IOR_EXPR:
+ case BIT_XOR_EXPR:
+ case BIT_AND_EXPR:
+ return TREE_CODE (var) != INTEGER_CST
+ || !tree_fits_shwi_p (var)
+ || !IN_RANGE (tree_to_shwi (var), -16, 15);
+ case MINUS_EXPR:
+ return TREE_CODE (var) != INTEGER_CST
+ || !tree_fits_shwi_p (var)
+ || !IN_RANGE (tree_to_shwi (var), -16, 15)
+ || gimple_assign_rhs1 (stmt) != var;
+ case LSHIFT_EXPR:
+ case RSHIFT_EXPR:
+ return gimple_assign_rhs2 (stmt) != var
+ || !loop_invariant_op_p (loop, var);
+ default:
+ break;
+ }
+ }
+
if (lhs_p)
return is_gimple_reg (var)
&& (!POINTER_TYPE_P (TREE_TYPE (var))
@@ -287,10 +331,12 @@ variable_vectorized_p (stmt_vec_info stmt_info, tree var, bool lhs_p)
The live range of SSA 2 is [0, 4] in bb 3. */
static machine_mode
compute_local_live_ranges (
+ loop_vec_info loop_vinfo,
const hash_map<basic_block, vec<stmt_point>> &program_points_per_bb,
hash_map<basic_block, hash_map<tree, pair>> &live_ranges_per_bb)
{
machine_mode biggest_mode = QImode;
+ class loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
if (!program_points_per_bb.is_empty ())
{
auto_vec<tree> visited_vars;
@@ -314,7 +360,8 @@ compute_local_live_ranges (
unsigned int point = program_point.point;
gimple *stmt = program_point.stmt;
tree lhs = gimple_get_lhs (stmt);
- if (variable_vectorized_p (program_point.stmt_info, lhs, true))
+ if (variable_vectorized_p (loop, program_point.stmt_info, lhs,
+ true))
{
biggest_mode = get_biggest_mode (biggest_mode,
TYPE_MODE (TREE_TYPE (lhs)));
@@ -331,14 +378,7 @@ compute_local_live_ranges (
for (i = 0; i < gimple_num_args (stmt); i++)
{
tree var = gimple_arg (stmt, i);
- /* Both IMM and REG are included since a VECTOR_CST may be
- potentially held in a vector register. However, it's not
- accurate, since a PLUS_EXPR can be vectorized into vadd.vi
- if IMM is -16 ~ 15.
-
- TODO: We may elide the cases that the unnecessary IMM in
- the future. */
- if (variable_vectorized_p (program_point.stmt_info, var,
+ if (variable_vectorized_p (loop, program_point.stmt_info, var,
false))
{
biggest_mode
@@ -763,7 +803,8 @@ has_unexpected_spills_p (loop_vec_info loop_vinfo)
/* Compute local live ranges. */
hash_map<basic_block, hash_map<tree, pair>> live_ranges_per_bb;
machine_mode biggest_mode
- = compute_local_live_ranges (program_points_per_bb, live_ranges_per_bb);
+ = compute_local_live_ranges (loop_vinfo, program_points_per_bb,
+ live_ranges_per_bb);
/* Update live ranges according to PHI. */
update_local_live_ranges (loop_vinfo, program_points_per_bb,
diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc
index 3a2ea9a..df7ed14 100644
--- a/gcc/config/riscv/riscv-vsetvl.cc
+++ b/gcc/config/riscv/riscv-vsetvl.cc
@@ -1668,7 +1668,7 @@ private:
}
inline void use_max_sew (vsetvl_info &prev, const vsetvl_info &next)
{
- auto max_sew = std::max (prev.get_sew (), next.get_sew ());
+ int max_sew = MAX (prev.get_sew (), next.get_sew ());
prev.set_sew (max_sew);
use_min_of_max_sew (prev, next);
}
@@ -1702,7 +1702,7 @@ private:
inline void use_max_sew_and_lmul_with_prev_ratio (vsetvl_info &prev,
const vsetvl_info &next)
{
- auto max_sew = std::max (prev.get_sew (), next.get_sew ());
+ int max_sew = MAX (prev.get_sew (), next.get_sew ());
prev.set_vlmul (calculate_vlmul (max_sew, prev.get_ratio ()));
prev.set_sew (max_sew);
}
@@ -2876,6 +2876,23 @@ pre_vsetvl::fuse_local_vsetvl_info ()
curr_info.dump (dump_file, " ");
fprintf (dump_file, "\n");
}
+ /* Even though prev_info is available with curr_info,
+ we need to update the MAX_SEW of prev_info since
+ we don't check MAX_SEW in available_p check.
+
+ prev_info:
+ Demand fields: demand_ratio_and_ge_sew demand_avl
+ SEW=16, VLMUL=mf4, RATIO=64, MAX_SEW=64
+
+ curr_info:
+ Demand fields: demand_ge_sew demand_non_zero_avl
+ SEW=16, VLMUL=m1, RATIO=16, MAX_SEW=32
+
+ In the example above, prev_info is available with
+ curr_info, we need to update prev_info MAX_SEW from
+ 64 into 32. */
+ prev_info.set_max_sew (
+ MIN (prev_info.get_max_sew (), curr_info.get_max_sew ()));
if (!curr_info.vl_used_by_non_rvv_insn_p ()
&& vsetvl_insn_p (curr_info.get_insn ()->rtl ()))
m_delete_list.safe_push (curr_info);
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 6bd2236..32183d6 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -8519,7 +8519,7 @@ riscv_declare_function_name (FILE *stream, const char *name, tree fndecl)
{
riscv_asm_output_variant_cc (stream, fndecl, name);
ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "function");
- ASM_OUTPUT_LABEL (stream, name);
+ ASM_OUTPUT_FUNCTION_LABEL (stream, name, fndecl);
if (DECL_FUNCTION_SPECIFIC_TARGET (fndecl))
{
fprintf (stream, "\t.option push\n");
diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index 3d2c1c3..24b7b43 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -864,9 +864,9 @@
vnclip,vicmp,vfalu,vfmul,vfminmax,vfdiv,vfwalu,vfwmul,\
vfsgnj,vfcmp,vslideup,vslidedown,vislide1up,\
vislide1down,vfslide1up,vfslide1down,vgather,viwmuladd,vfwmuladd,\
- vlsegds,vlsegdux,vlsegdox,vandn,vrol,vror,vwsll")
+ vlsegds,vlsegdux,vlsegdox,vandn,vrol,vror,vclmul,vclmulh,vwsll")
(const_int 8)
- (eq_attr "type" "vstux,vstox,vssegts,vssegtux,vssegtox,vclmul,vclmulh")
+ (eq_attr "type" "vstux,vstox,vssegts,vssegtux,vssegtox")
(const_int 5)
(eq_attr "type" "vimuladd,vfmuladd")
@@ -1724,10 +1724,7 @@
vse<sew>.v\t%3,%0%p1
vmv.v.v\t%0,%3
vmv.v.v\t%0,%3"
- "&& register_operand (operands[0], <MODE>mode)
- && register_operand (operands[3], <MODE>mode)
- && satisfies_constraint_vu (operands[2])
- && INTVAL (operands[7]) == riscv_vector::VLMAX"
+ "&& riscv_vector::whole_reg_to_reg_move_p (operands, <MODE>mode, 7)"
[(set (match_dup 0) (match_dup 3))]
""
[(set_attr "type" "vlde,vlde,vlde,vste,vimov,vimov")
@@ -1776,9 +1773,7 @@
vmmv.m\t%0,%3
vmclr.m\t%0
vmset.m\t%0"
- "&& register_operand (operands[0], <MODE>mode)
- && register_operand (operands[3], <MODE>mode)
- && INTVAL (operands[5]) == riscv_vector::VLMAX"
+ "&& riscv_vector::whole_reg_to_reg_move_p (operands, <MODE>mode, 5)"
[(set (match_dup 0) (match_dup 3))]
""
[(set_attr "type" "vldm,vstm,vmalu,vmalu,vmalu")
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 7aeed6f..94fbf46 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -21419,7 +21419,7 @@ rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
fputs ("\t.long 0\n", file);
fprintf (file, "\t.previous\n");
}
- ASM_OUTPUT_LABEL (file, name);
+ ASM_OUTPUT_FUNCTION_LABEL (file, name, decl);
}
static void rs6000_elf_file_end (void) ATTRIBUTE_UNUSED;
@@ -21992,7 +21992,7 @@ rs6000_xcoff_declare_function_name (FILE *file, const char *name, tree decl)
assemble_name (file, buffer);
fputs (TARGET_32BIT ? "\n" : ",3\n", file);
- ASM_OUTPUT_LABEL (file, buffer);
+ ASM_OUTPUT_FUNCTION_LABEL (file, buffer, decl);
symtab_node::get (decl)->call_for_symbol_and_aliases (rs6000_declare_alias,
&data, true);
diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc
index 116fdc6..748ad9c 100644
--- a/gcc/config/s390/s390.cc
+++ b/gcc/config/s390/s390.cc
@@ -8323,7 +8323,7 @@ s390_asm_output_function_label (FILE *out_file, const char *fname,
asm_fprintf (out_file, "\t# fn:%s wd%d\n", fname,
s390_warn_dynamicstack_p);
}
- ASM_OUTPUT_LABEL (out_file, fname);
+ assemble_function_label_raw (out_file, fname);
if (hw_after > 0)
asm_fprintf (out_file,
"\t# post-label NOPs for hotpatch (%d halfwords)\n",
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8bc7b09..945ac62 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,25 @@
+2024-01-07 Nathaniel Shead <nathanieloshead@gmail.com>
+
+ * module.cc (trees_out::write_var_def): Only write initializers
+ in header modules.
+
+2024-01-07 Nathaniel Shead <nathanieloshead@gmail.com>
+
+ PR c++/109679
+ * module.cc (depset::hash::add_binding_entity): Don't skip names
+ in the GMF if they've been exported with a using declaration.
+
+2024-01-07 Nathaniel Shead <nathanieloshead@gmail.com>
+
+ PR c++/110808
+ * parser.cc (cp_parser_module_name): Rewrite to handle
+ module-names and module-partitions independently.
+ (cp_parser_module_partition): New function.
+ (cp_parser_module_declaration): Parse module partitions
+ explicitly. Don't change state if parsing module decl failed.
+ (cp_parser_import_declaration): Handle different kinds of
+ import-declarations locally.
+
2024-01-03 Patrick Palka <ppalka@redhat.com>
PR c++/113064
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index a947616..9bb6d26 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -11707,7 +11707,8 @@ trees_out::write_var_def (tree decl)
{
tree dyn_init = NULL_TREE;
- if (DECL_NONTRIVIALLY_INITIALIZED_P (decl))
+ /* We only need to write initializers in header modules. */
+ if (header_module_p () && DECL_NONTRIVIALLY_INITIALIZED_P (decl))
{
dyn_init = value_member (decl,
CP_DECL_THREAD_LOCAL_P (decl)
@@ -12832,8 +12833,10 @@ depset::hash::add_binding_entity (tree decl, WMB_Flags flags, void *data_)
else if (TREE_CODE (inner) == TEMPLATE_DECL)
inner = DECL_TEMPLATE_RESULT (inner);
- if (!DECL_LANG_SPECIFIC (inner) || !DECL_MODULE_PURVIEW_P (inner))
- /* Ignore global module fragment entities. */
+ if ((!DECL_LANG_SPECIFIC (inner) || !DECL_MODULE_PURVIEW_P (inner))
+ && !(flags & (WMB_Using | WMB_Export)))
+ /* Ignore global module fragment entities unless explicitly
+ exported with a using declaration. */
return false;
if (VAR_OR_FUNCTION_DECL_P (inner)
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 37536fa..bc1683b 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -14894,58 +14894,64 @@ cp_parser_already_scoped_statement (cp_parser* parser, bool *if_p,
/* Modules */
-/* Parse a module-name,
- identifier
- module-name . identifier
- header-name
+/* Parse a module-name or module-partition.
- Returns a pointer to module object, NULL. */
+ module-name:
+ module-name-qualifier [opt] identifier
-static module_state *
-cp_parser_module_name (cp_parser *parser)
-{
- cp_token *token = cp_lexer_peek_token (parser->lexer);
- if (token->type == CPP_HEADER_NAME)
- {
- cp_lexer_consume_token (parser->lexer);
+ module-partition:
+ : module-name-qualifier [opt] identifier
- return get_module (token->u.value);
- }
+ module-name-qualifier:
+ identifier .
+ module-name-qualifier identifier .
- module_state *parent = NULL;
- bool partitioned = false;
- if (token->type == CPP_COLON && named_module_p ())
- {
- partitioned = true;
- cp_lexer_consume_token (parser->lexer);
- }
+ Returns a pointer to the module object, or NULL on failure.
+ For PARTITION_P, PARENT is the module this is a partition of. */
+
+static module_state *
+cp_parser_module_name (cp_parser *parser, bool partition_p = false,
+ module_state *parent = NULL)
+{
+ if (partition_p
+ && cp_lexer_consume_token (parser->lexer)->type != CPP_COLON)
+ return NULL;
for (;;)
{
if (cp_lexer_peek_token (parser->lexer)->type != CPP_NAME)
{
- cp_parser_error (parser, "expected module-name");
- break;
+ if (partition_p)
+ cp_parser_error (parser, "expected module-partition");
+ else
+ cp_parser_error (parser, "expected module-name");
+ return NULL;
}
tree name = cp_lexer_consume_token (parser->lexer)->u.value;
- parent = get_module (name, parent, partitioned);
- token = cp_lexer_peek_token (parser->lexer);
- if (!partitioned && token->type == CPP_COLON)
- partitioned = true;
- else if (token->type != CPP_DOT)
+ parent = get_module (name, parent, partition_p);
+ if (cp_lexer_peek_token (parser->lexer)->type != CPP_DOT)
break;
cp_lexer_consume_token (parser->lexer);
- }
+ }
return parent;
}
+/* Parse a module-partition. Defers to cp_parser_module_name. */
+
+static module_state *
+cp_parser_module_partition (cp_parser *parser, module_state *parent = NULL)
+{
+ return cp_parser_module_name (parser, /*partition_p=*/true, parent);
+}
+
/* Named module-declaration
__module ; PRAGMA_EOL
- __module private ; PRAGMA_EOL (unimplemented)
- [__export] __module module-name attr-spec-seq-opt ; PRAGMA_EOL
+ __module : private ; PRAGMA_EOL (unimplemented)
+ [__export] __module module-name module-partition [opt]
+ attr-spec-seq-opt ; PRAGMA_EOL
*/
static module_parse
@@ -15003,9 +15009,12 @@ cp_parser_module_declaration (cp_parser *parser, module_parse mp_state,
else
{
module_state *mod = cp_parser_module_name (parser);
+ if (mod && cp_lexer_peek_token (parser->lexer)->type == CPP_COLON)
+ mod = cp_parser_module_partition (parser, mod);
tree attrs = cp_parser_attributes_opt (parser);
- mp_state = MP_PURVIEW_IMPORTS;
+ if (mod)
+ mp_state = MP_PURVIEW_IMPORTS;
if (!mod || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
goto skip_eol;
@@ -15017,7 +15026,10 @@ cp_parser_module_declaration (cp_parser *parser, module_parse mp_state,
}
/* Import-declaration
- [__export] __import module-name attr-spec-seq-opt ; PRAGMA_EOL */
+ __import module-name attr-spec-seq-opt ; PRAGMA_EOL
+ __import module-partition attr-spec-seq-opt ; PRAGMA_EOL
+ __import header-name attr-spec-seq-opt ; PRAGMA_EOL
+*/
static void
cp_parser_import_declaration (cp_parser *parser, module_parse mp_state,
@@ -15045,7 +15057,27 @@ cp_parser_import_declaration (cp_parser *parser, module_parse mp_state,
}
else
{
- module_state *mod = cp_parser_module_name (parser);
+ module_state *mod = NULL;
+ cp_token *next = cp_lexer_peek_token (parser->lexer);
+ if (next->type == CPP_HEADER_NAME)
+ {
+ cp_lexer_consume_token (parser->lexer);
+ mod = get_module (next->u.value);
+ }
+ else if (next->type == CPP_COLON)
+ {
+ /* An import specifying a module-partition shall only appear after the
+ module-declaration in a module unit: [module.import]/4. */
+ if (named_module_p ()
+ && (mp_state == MP_PURVIEW_IMPORTS
+ || mp_state == MP_PRIVATE_IMPORTS))
+ mod = cp_parser_module_partition (parser);
+ else
+ error_at (next->location, "import specifying a module-partition"
+ " must appear after a named module-declaration");
+ }
+ else
+ mod = cp_parser_module_name (parser);
tree attrs = cp_parser_attributes_opt (parser);
if (!mod || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog
index 20365ea..0741a35 100644
--- a/gcc/d/ChangeLog
+++ b/gcc/d/ChangeLog
@@ -1,3 +1,8 @@
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * lang.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
2024-01-03 Jakub Jelinek <jakub@redhat.com>
* gdc.texi: Bump @copyrights-d year.
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 71c6a69..92f3e07 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -150,7 +150,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#ifndef ASM_OUTPUT_FUNCTION_LABEL
#define ASM_OUTPUT_FUNCTION_LABEL(FILE, NAME, DECL) \
- ASM_OUTPUT_LABEL ((FILE), (NAME))
+ assemble_function_label_raw ((FILE), (NAME))
#endif
/* Output the definition of a compiler-generated label named NAME. */
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 9e61ba9..84eef41 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -7344,6 +7344,12 @@ Enable/disable the generation of the SM4 instructions.
@itemx no-usermsr
Enable/disable the generation of the USER_MSR instructions.
+@cindex @code{target("apxf")} function attribute, x86
+@item apxf
+@itemx no-apxf
+Enable/disable the generation of the APX features, including
+EGPR, PUSH2POP2, NDD and PPX.
+
@cindex @code{target("avx10.1")} function attribute, x86
@item avx10.1
@itemx no-avx10.1
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index d7158385..68d1f36 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -16778,14 +16778,23 @@ With @option{--param=openacc-privatization=noisy}, do diagnose.
The following choices of @var{name} are available on AArch64 targets:
@table @gcctabopt
-@item aarch64-sve-compare-costs
-When vectorizing for SVE, consider using ``unpacked'' vectors for
-smaller elements and use the cost model to pick the cheapest approach.
-Also use the cost model to choose between SVE and Advanced SIMD vectorization.
-
-Using unpacked vectors includes storing smaller elements in larger
-containers and accessing elements with extending loads and truncating
-stores.
+@item aarch64-vect-compare-costs
+When vectorizing, consider using multiple different approaches and use
+the cost model to choose the cheapest one. This includes:
+
+@itemize
+@item
+Trying both SVE and Advanced SIMD, when SVE is available.
+
+@item
+Trying to use 64-bit Advanced SIMD vectors for the smallest data elements,
+rather than using 128-bit vectors for everything.
+
+@item
+Trying to use ``unpacked'' SVE vectors for smaller elements. This includes
+storing smaller elements in larger containers and accessing elements with
+extending loads and truncating stores.
+@end itemize
@item aarch64-float-recp-precision
The number of Newton iterations for calculating the reciprocal for float type.
diff --git a/gcc/final.cc b/gcc/final.cc
index 638e5c1..eb9e065 100644
--- a/gcc/final.cc
+++ b/gcc/final.cc
@@ -1686,9 +1686,6 @@ final_start_function_1 (rtx_insn **firstp, FILE *file, int *seen,
high_block_linenum = high_function_linenum = last_linenum;
- if (flag_sanitize & SANITIZE_ADDRESS)
- asan_function_start ();
-
rtx_insn *first = *firstp;
if (in_initial_view_p (first))
{
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 6c2f890..22a5110 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,15 @@
+2024-01-06 Harald Anlauf <anlauf@gmx.de>
+ José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ PR fortran/96724
+ * iresolve.cc (gfc_resolve_repeat): Force conversion to
+ gfc_charlen_int_kind before call to gfc_multiply.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * lang.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
2024-01-03 Harald Anlauf <anlauf@gmx.de>
* trans-types.cc (gfc_get_nodesc_array_type): Clear used gmp
diff --git a/gcc/fortran/iresolve.cc b/gcc/fortran/iresolve.cc
index 5bb0bbc..c961cdb 100644
--- a/gcc/fortran/iresolve.cc
+++ b/gcc/fortran/iresolve.cc
@@ -2363,7 +2363,15 @@ gfc_resolve_repeat (gfc_expr *f, gfc_expr *string,
}
if (tmp)
- f->ts.u.cl->length = gfc_multiply (tmp, gfc_copy_expr (ncopies));
+ {
+ /* Force-convert to gfc_charlen_int_kind before gfc_multiply. */
+ gfc_expr *e = gfc_copy_expr (ncopies);
+ gfc_typespec ts = tmp->ts;
+ ts.kind = gfc_charlen_int_kind;
+ gfc_convert_type_warn (e, &ts, 2, 0);
+ gfc_convert_type_warn (tmp, &ts, 2, 0);
+ f->ts.u.cl->length = gfc_multiply (tmp, e);
+ }
}
diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc
index bcc2d63..5f8a1a1 100644
--- a/gcc/gimple-match-head.cc
+++ b/gcc/gimple-match-head.cc
@@ -333,9 +333,23 @@ gimple_bitwise_inverted_equal_p (tree expr1, tree expr2, bool &wascmp, tree (*va
if (!operand_equal_p (op11, op21))
return false;
wascmp = true;
- if (invert_tree_comparison (gimple_assign_rhs_code (a1),
- HONOR_NANS (op10))
- == gimple_assign_rhs_code (a2))
+ tree_code ac1 = gimple_assign_rhs_code (a1);
+ tree_code ac2 = gimple_assign_rhs_code (a2);
+ /* Match `^` against `==` but this should only
+ happen when the type is a 1bit precision integer. */
+ if (ac1 == BIT_XOR_EXPR)
+ {
+ tree type = TREE_TYPE (newexpr1);
+ gcc_assert (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) == 1);
+ return ac2 == EQ_EXPR;
+ }
+ if (ac2 == BIT_XOR_EXPR)
+ {
+ tree type = TREE_TYPE (newexpr1);
+ gcc_assert (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) == 1);
+ return ac1 == EQ_EXPR;
+ }
+ if (invert_tree_comparison (ac1, HONOR_NANS (op10)) == ac2)
return true;
return false;
}
diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog
index 9edc3fa..4ad6d4b 100644
--- a/gcc/go/ChangeLog
+++ b/gcc/go/ChangeLog
@@ -1,3 +1,8 @@
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * lang.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
2024-01-03 Jakub Jelinek <jakub@redhat.com>
* gccgo.texi: Bump @copyrights-go year.
diff --git a/gcc/internal-fn.cc b/gcc/internal-fn.cc
index 80efd2f..a07f25f 100644
--- a/gcc/internal-fn.cc
+++ b/gcc/internal-fn.cc
@@ -5118,10 +5118,13 @@ expand_POPCOUNT (internal_fn fn, gcall *stmt)
/* If .POPCOUNT call has 2 arguments, match_single_bit_test marked it
because the result is only used in an equality comparison against 1.
Use rtx costs in that case to determine if .POPCOUNT (arg) == 1
- or (arg ^ (arg - 1)) > arg - 1 is cheaper. */
+ or (arg ^ (arg - 1)) > arg - 1 is cheaper.
+ If .POPCOUNT second argument is 0, we additionally know that arg
+ is non-zero, so use arg & (arg - 1) == 0 instead. */
bool speed_p = optimize_insn_for_speed_p ();
tree lhs = gimple_call_lhs (stmt);
tree arg = gimple_call_arg (stmt, 0);
+ bool nonzero_arg = integer_zerop (gimple_call_arg (stmt, 1));
tree type = TREE_TYPE (arg);
machine_mode mode = TYPE_MODE (type);
do_pending_stack_adjust ();
@@ -5147,11 +5150,15 @@ expand_POPCOUNT (internal_fn fn, gcall *stmt)
1, OPTAB_DIRECT);
if (argm1 == NULL_RTX)
goto fail;
- rtx argxorargm1 = expand_simple_binop (mode, XOR, op0, argm1, NULL_RTX,
- 1, OPTAB_DIRECT);
+ rtx argxorargm1 = expand_simple_binop (mode, nonzero_arg ? AND : XOR, op0,
+ argm1, NULL_RTX, 1, OPTAB_DIRECT);
if (argxorargm1 == NULL_RTX)
goto fail;
- rtx cmp = emit_store_flag (NULL_RTX, GTU, argxorargm1, argm1, mode, 1, 1);
+ rtx cmp;
+ if (nonzero_arg)
+ cmp = emit_store_flag (NULL_RTX, EQ, argxorargm1, const0_rtx, mode, 1, 1);
+ else
+ cmp = emit_store_flag (NULL_RTX, GTU, argxorargm1, argm1, mode, 1, 1);
if (cmp == NULL_RTX)
goto fail;
rtx_insn *cmp_insns = get_insns ();
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 2f18a00..a0ee55a 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,8 @@
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * lang.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
2023-12-05 Richard Sandiford <richard.sandiford@arm.com>
* lto-lang.cc (lto_gnu_attribute_table): Add extra braces to work
diff --git a/gcc/m2/ChangeLog b/gcc/m2/ChangeLog
index bd8d2e9..938f530 100644
--- a/gcc/m2/ChangeLog
+++ b/gcc/m2/ChangeLog
@@ -1,3 +1,8 @@
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * lang.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
2023-12-15 Gaius Mulley <gaiusmod2@gmail.com>
PR modula2/112946
diff --git a/gcc/match.pd b/gcc/match.pd
index 87e2fab..7b4b15a 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -182,6 +182,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(convert (cmp@0 @1 @2))
(if (tree_nop_conversion_p (type, TREE_TYPE (@0)))))
)
+/* `a ^ b` is another form of `a != b` when the type
+ is a 1bit precission integer. */
+(match (maybe_cmp @0)
+ (bit_xor@0 @1 @2)
+ (if (INTEGRAL_TYPE_P (type)
+ && TYPE_PRECISION (type) == 1)))
#endif
/* Transform likes of (char) ABS_EXPR <(int) x> into (char) ABSU_EXPR <x>
diff --git a/gcc/options-urls-cc-gen.awk b/gcc/options-urls-cc-gen.awk
index e021e7c..a293323 100644
--- a/gcc/options-urls-cc-gen.awk
+++ b/gcc/options-urls-cc-gen.awk
@@ -1,4 +1,4 @@
-# Copyright (C) 2023 Free Software Foundation, Inc.
+# Copyright (C) 2023-2024 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
diff --git a/gcc/output.h b/gcc/output.h
index bb28f19..c8fe1d2 100644
--- a/gcc/output.h
+++ b/gcc/output.h
@@ -178,6 +178,10 @@ extern void assemble_asm (tree);
/* Get the function's name from a decl, as described by its RTL. */
extern const char *get_fnname_from_decl (tree);
+/* Output function label, possibly with accompanying metadata. No additional
+ code or data is output after the label. */
+extern void assemble_function_label_raw (FILE *, const char *);
+
/* Output assembler code for the constant pool of a function and associated
with defining the name of the function. DECL describes the function.
NAME is the function's name. For the constant pool, we use the current
diff --git a/gcc/regenerate-opt-urls.py b/gcc/regenerate-opt-urls.py
index edce265..50f1fa0 100755
--- a/gcc/regenerate-opt-urls.py
+++ b/gcc/regenerate-opt-urls.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-# Copyright (C) 2023 Free Software Foundation, Inc.
+# Copyright (C) 2023-2024 Free Software Foundation, Inc.
#
# Script to regenerate FOO.opt.urls files for each FOO.opt in the
# source tree.
diff --git a/gcc/rust/ChangeLog b/gcc/rust/ChangeLog
index 0687592..65a4b1c 100644
--- a/gcc/rust/ChangeLog
+++ b/gcc/rust/ChangeLog
@@ -1,3 +1,8 @@
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * lang.opt.urls: New file, autogenerated by
+ regenerate-opt-urls.py.
+
2023-12-14 Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Thomas Schwinge <thomas@codesourcery.com>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index da5593a..a0ed82b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,434 @@
+2024-01-07 Georg-Johann Lay <avr@gjlay.de>
+
+ * gcc.target/avr/lra-cpymem_qi.c: Remove duplicate -mmcu=.
+ * gcc.target/avr/lra-elim.c: Same.
+ * gcc.target/avr/pr112830.c: Skip for Reduced Tiny.
+ * gcc.target/avr/pr46779-1.c: Same.
+ * gcc.target/avr/pr46779-2.c: Same.
+ * gcc.target/avr/pr86869.c: Skip for Reduced Tiny and add -std=gnu99
+ for GNU-C due to address spaces.
+ * gcc.target/avr/pr89270.c: Same.
+ * gcc.target/avr/torture/builtins-2-flash.c: Only test address
+ space __flash1 if we have it.
+ * gcc.target/avr/torture/addr-space-1-1.c: Same.
+ * gcc.target/avr/torture/addr-space-2-1.c: Same.
+
+2024-01-07 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ * gfortran.dg/dtio_25.f90: Update.
+ * gfortran.dg/namelist_57.f90: Update.
+ * gfortran.dg/namelist_65.f90: Update.
+
+2024-01-07 Roger Sayle <roger@nextmovesoftware.com>
+ Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/113231
+ * gcc.target/i386/pr113231.c: New test case.
+
+2024-01-07 Tamar Christina <tamar.christina@arm.com>
+
+ * gcc.dg/vect/vect-early-break_2.c: Skip Arm.
+ * gcc.dg/vect/vect-early-break_7.c: Likewise.
+ * gcc.dg/vect/vect-early-break_75.c: Likewise.
+ * gcc.dg/vect/vect-early-break_77.c: Likewise.
+ * gcc.dg/vect/vect-early-break_82.c: Likewise.
+ * gcc.dg/vect/vect-early-break_88.c: Likewise.
+ * lib/target-supports.exp (add_options_for_vect_early_break,
+ check_effective_target_vect_early_break_hw,
+ check_effective_target_vect_early_break): Support AArch32.
+ * gcc.target/arm/vect-early-break-cbranch.c: New test.
+
+2024-01-07 Jeff Law <jlaw@ventanamicro.com>
+
+ * gcc.dg/tree-ssa/phi-opt-25b.c: Remove extraneous "short".
+
+2024-01-07 Georg-Johann Lay <avr@gjlay.de>
+
+ PR testsuite/52641
+ * gcc.dg/torture/pr110838.c: Use proper shift offset to get MSB or int.
+ * gcc.dg/torture/pr112282.c: Use at least 32 bits for :20 bit-fields.
+ * gcc.dg/tree-ssa/bitcmp-5.c: Use integral type with 32 bits or more.
+ * gcc.dg/tree-ssa/bitcmp-6.c: Same.
+ * gcc.dg/tree-ssa/cltz-complement-max.c: Same.
+ * gcc.dg/tree-ssa/cltz-max.c: Same.
+ * gcc.dg/tree-ssa/if-to-switch-8.c: Use literals that fit int.
+ * gcc.dg/tree-ssa/if-to-switch-9.c [avr]: Set case-values-threshold=3.
+ * gcc.dg/tree-ssa/negneg-3.c: Discriminate [not] large_double.
+ * gcc.dg/tree-ssa/phi-opt-25b.c: Use types of correct widths for
+ __builtin_bswapN.
+ * gcc.dg/tree-ssa/pr55177-1.c: Same.
+ * gcc.dg/tree-ssa/popcount-max.c: Use int32_t where required.
+ * gcc.dg/tree-ssa/pr111583-1.c: Use intptr_t as needed.
+ * gcc.dg/tree-ssa/pr111583-2.c: Same.
+
+2024-01-07 Georg-Johann Lay <avr@gjlay.de>
+
+ PR testsuite/52641
+ * gcc.dg/memchr-3.c [avr]: Anticipate -Wbuiltin-declaration-mismatch.
+ * gcc.dg/pr103207.c: Use __INT32_TYPE__ instead of int.
+ * gcc.dg/pr103451.c [void* != long]: Anticipate -Wpointer-to-int-cast.
+ * gcc.dg/pr110496.c [void* != long]: Anticipate -Wint-to-pointer-cast.
+ * gcc.dg/pr109977.c: Use __SIZEOF_DOUBLE__ instead of 8.
+ * gcc.dg/pr110506-2.c: Use __UINT32_TYPE__ for uint32_t.
+ * gcc.dg/pr110582.c: Require int32plus.
+ * gcc.dg/pr111039.c: [sizeof(int) < 4]: Use __INT32_TYPE__.
+ * gcc.dg/pr111599.c: Same.
+ * gcc.dg/builtin-dynamic-object-size-0.c: Require size20plus.
+ * gcc.dg/builtin-object-size-1.c [avr]: Skip tests with strndup.
+ * gcc.dg/builtin-object-size-2.c: Same.
+ * gcc.dg/builtin-object-size-3.c: Same.
+ * gcc.dg/builtin-object-size-4.c: Same.
+ * gcc.dg/pr111070.c: Use __UINTPTR_TYPE__ instead of unsigned long.
+ * gcc.dg/debug/btf/btf-pr106773.c: Same.
+ * gcc.dg/debug/btf/btf-bitfields-2.c: [sizeof(int) < 4]: Use
+ __UINT32_TYPE__.
+
+2024-01-07 Georg-Johann Lay <avr@gjlay.de>
+
+ PR testsuite/52641
+ * gcc.c-torture/compile/attr-complex-method-2.c [target=avr]: Check
+ for "divsc3" as double = float per default.
+ * gcc.c-torture/compile/pr106537-1.c: Use __INTPTR_TYPE__ instead of
+ hard-coded "long".
+ * gcc.c-torture/compile/pr106537-2.c: Same.
+ * gcc.c-torture/compile/pr106537-3.c: Same.
+ * gcc.c-torture/execute/20230630-3.c: Use __INT32_TYPE__ for bit-field
+ wider than 16 bits.
+ * gcc.c-torture/execute/20230630-4.c: Same.
+ * gcc.c-torture/execute/pr109938.c: Require int32plus.
+ * gcc.c-torture/execute/pr109986.c: Same.
+ * gcc.dg/fold-ior-4.c: Same.
+ * gcc.dg/fold-ior-5.c: Same
+ * gcc.dg/fold-parity-5.c: Same.
+ * gcc.dg/fold-popcount-5.c: Same.
+ * gcc.dg/builtin-bswap-13.c [sizeof(int) < 4]: Use __INT32_TYPE__
+ instead of int.
+ * gcc.dg/builtin-bswap-14.c: Use __INT32_TYPE__ instead of int where
+ required by code.
+ * gcc.dg/c23-constexpr-9.c: Require large_double.
+ * gcc.dg/c23-nullptr-1.c [target=avr]: xfail.
+ * gcc.dg/loop-unswitch-10.c: Require size32plus.
+ * gcc.dg/loop-unswitch-14.c: Same.
+ * gcc.dg/loop-unswitch-11.c: Require int32.
+ * gcc.dg/pr101836.c: Use __SIZEOF_INT instead of hard-coded 4.
+ * gcc.dg/pr101836_1.c: Same.
+ * gcc.dg/pr101836_2.c: Same.
+ * gcc.dg/pr101836_3.c: Same.
+
+2024-01-07 Nathaniel Shead <nathanieloshead@gmail.com>
+
+ * g++.dg/modules/init-5_a.C: New test.
+ * g++.dg/modules/init-5_b.C: New test.
+
+2024-01-07 Nathaniel Shead <nathanieloshead@gmail.com>
+
+ PR c++/109679
+ * g++.dg/modules/using-11.h: New test.
+ * g++.dg/modules/using-11_a.C: New test.
+ * g++.dg/modules/using-11_b.C: New test.
+
+2024-01-07 Nathaniel Shead <nathanieloshead@gmail.com>
+
+ PR c++/110808
+ * g++.dg/modules/part-hdr-1_c.C: Fix syntax.
+ * g++.dg/modules/part-mac-1_c.C: Likewise.
+ * g++.dg/modules/mod-invalid-1.C: New test.
+ * g++.dg/modules/part-8_a.C: New test.
+ * g++.dg/modules/part-8_b.C: New test.
+ * g++.dg/modules/part-8_c.C: New test.
+
+2024-01-06 Harald Anlauf <anlauf@gmx.de>
+ José Rui Faustino de Sousa <jrfsousa@gmail.com>
+
+ PR fortran/96724
+ * gfortran.dg/repeat_8.f90: New test.
+
+2024-01-06 Jiahao Xu <xujiahao@loongson.cn>
+
+ * gcc.target/loongarch/vector/lasx/lasx-xvpremi.c: Removed.
+ * gcc.target/loongarch/vector/lasx/lasx-xvpermi_q.c: New test.
+
+2024-01-06 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ PR target/113248
+ * gcc.target/riscv/rvv/vsetvl/pr113248.c: New test.
+
+2024-01-06 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-12.c: New test.
+ * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-14.c: New test.
+
+2024-01-06 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * gcc.target/riscv/rvv/base/vf_avl-4.c: New test.
+
+2024-01-05 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR target/113104
+ * gcc.target/aarch64/pr113104.c: New test.
+ * gcc.target/aarch64/sve/cond_arith_1.c: Update for new parameter
+ names.
+ * gcc.target/aarch64/sve/cond_arith_1_run.c: Likewise.
+ * gcc.target/aarch64/sve/cond_arith_3.c: Likewise.
+ * gcc.target/aarch64/sve/cond_arith_3_run.c: Likewise.
+ * gcc.target/aarch64/sve/gather_load_6.c: Likewise.
+ * gcc.target/aarch64/sve/gather_load_7.c: Likewise.
+ * gcc.target/aarch64/sve/load_const_offset_2.c: Likewise.
+ * gcc.target/aarch64/sve/load_const_offset_3.c: Likewise.
+ * gcc.target/aarch64/sve/mask_gather_load_6.c: Likewise.
+ * gcc.target/aarch64/sve/mask_gather_load_7.c: Likewise.
+ * gcc.target/aarch64/sve/mask_load_slp_1.c: Likewise.
+ * gcc.target/aarch64/sve/mask_struct_load_1.c: Likewise.
+ * gcc.target/aarch64/sve/mask_struct_load_2.c: Likewise.
+ * gcc.target/aarch64/sve/mask_struct_load_3.c: Likewise.
+ * gcc.target/aarch64/sve/mask_struct_load_4.c: Likewise.
+ * gcc.target/aarch64/sve/mask_struct_store_1.c: Likewise.
+ * gcc.target/aarch64/sve/mask_struct_store_1_run.c: Likewise.
+ * gcc.target/aarch64/sve/mask_struct_store_2.c: Likewise.
+ * gcc.target/aarch64/sve/mask_struct_store_2_run.c: Likewise.
+ * gcc.target/aarch64/sve/pack_1.c: Likewise.
+ * gcc.target/aarch64/sve/reduc_4.c: Likewise.
+ * gcc.target/aarch64/sve/scatter_store_6.c: Likewise.
+ * gcc.target/aarch64/sve/scatter_store_7.c: Likewise.
+ * gcc.target/aarch64/sve/strided_load_3.c: Likewise.
+ * gcc.target/aarch64/sve/strided_store_3.c: Likewise.
+ * gcc.target/aarch64/sve/unpack_fcvt_signed_1.c: Likewise.
+ * gcc.target/aarch64/sve/unpack_fcvt_unsigned_1.c: Likewise.
+ * gcc.target/aarch64/sve/unpack_signed_1.c: Likewise.
+ * gcc.target/aarch64/sve/unpack_unsigned_1.c: Likewise.
+ * gcc.target/aarch64/sve/unpack_unsigned_1_run.c: Likewise.
+ * gcc.target/aarch64/sve/vcond_11.c: Likewise.
+ * gcc.target/aarch64/sve/vcond_11_run.c: Likewise.
+
+2024-01-05 Lulu Cheng <chenglulu@loongson.cn>
+
+ * gcc.target/loongarch/vect-ld-st-imm12.c: New test.
+
+2024-01-05 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * gcc.dg/fma-3.c: The intermediate file corresponding to the
+ function does not produce the corresponding FNMA symbol, so the test
+ rules should be skipped when testing.
+ * gcc.dg/fma-4.c: The intermediate file corresponding to the
+ function does not produce the corresponding FNMS symbol, so skip the
+ test rules when testing.
+ * gcc.dg/fma-6.c: The cause is the same as fma-3.c.
+ * gcc.dg/fma-7.c: The cause is the same as fma-4.c
+
+2024-01-05 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * gcc.dg/vect/bb-slp-pattern-1.c: If you are testing on the
+ LoongArch architecture, you need to add the "-mlasx" compilation
+ option to generate vectorized code.
+ * gcc.dg/vect/slp-widen-mult-half.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-const-s16.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-const-u16.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-half-u8.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-half.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-u16.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-u8-s16-s32.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-u8-u32.c: Dito.
+ * gcc.dg/vect/vect-widen-mult-u8.c: Dito.
+
+2024-01-05 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * gfortran.dg/vect/pr60510.f: Delete the default behavior of the
+ program.
+
+2024-01-05 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * gfortran.dg/bind_c_array_params_2.f90: Add code test rules to
+ support testing of the loongArch architecture.
+
+2024-01-05 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * gcc.dg/vect/vect-82.c: Add the LoongArch architecture to the
+ object detection framework.
+ * gcc.dg/vect/vect-83.c: Dito.
+
+2024-01-05 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * gcc.dg/vect/vect-bic-bitmask-12.c: Change the default
+ setting of assembly to compile.
+ * gcc.dg/vect/vect-bic-bitmask-23.c: Dito.
+
+2024-01-05 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * lib/target-supports.exp: Add LoongArch to the list of supported
+ targets.
+
+2024-01-05 Alex Coplan <alex.coplan@arm.com>
+
+ PR target/113217
+ * g++.dg/pr113217.C: New test.
+
+2024-01-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/113201
+ * gcc.c-torture/compile/pr113201.c: New test.
+
+2024-01-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/90693
+ * gcc.target/i386/pr90693-2.c: New test.
+
+2024-01-05 Kito Cheng <kito.cheng@sifive.com>
+
+ * gcc.target/riscv/rvv/autovec/partial/single_rgroup-2.h:
+ Fix the check condition.
+
+2024-01-05 Kito Cheng <kito.cheng@sifive.com>
+
+ * gcc.target/riscv/rvv/autovec/binop/shift-scalar-template.h:
+ Use __builtin_abort instead of assert.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmax-1.c: Drop math.h.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmax-2.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmax-3.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmax-4.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmin-1.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmin-2.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmin-3.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmin-4.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-1.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-2.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-3.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-4.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-1.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-2.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-3.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-4.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/partial/single_rgroup-2.h: Use
+ __builtin_abort instead of assert.
+ * gcc.target/riscv/rvv/autovec/pr112694-1.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/partial/single_rgroup-3.h: Ditto.
+ * gcc.target/riscv/rvv/autovec/unop/abs-template.h: Drop stdlib.h.
+ * gcc.target/riscv/rvv/autovec/unop/vneg-template.h: Ditto.
+ * gcc.target/riscv/rvv/autovec/unop/vnot-template.h: Ditto.
+
+2024-01-05 Pan Li <pan2.li@intel.com>
+
+ Revert:
+ 2024-01-05 Feng Wang <wangfeng@eswincomputing.com>
+
+ * gcc.target/riscv/rvv/base/zvbb-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvbb_vandn_vx_constraint.c: New test.
+ * gcc.target/riscv/rvv/base/zvbc-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvbc_vx_constraint-1.c: New test.
+ * gcc.target/riscv/rvv/base/zvbc_vx_constraint-2.c: New test.
+ * gcc.target/riscv/rvv/base/zvkg-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvkned-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvknha-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvknhb-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvksed-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvksh-intrinsic.c: New test.
+ * gcc.target/riscv/zvkb.c: New test.
+
+2024-01-05 Feng Wang <wangfeng@eswincomputing.com>
+
+ * gcc.target/riscv/rvv/base/zvbb-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvbb_vandn_vx_constraint.c: New test.
+ * gcc.target/riscv/rvv/base/zvbc-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvbc_vx_constraint-1.c: New test.
+ * gcc.target/riscv/rvv/base/zvbc_vx_constraint-2.c: New test.
+ * gcc.target/riscv/rvv/base/zvkg-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvkned-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvknha-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvknhb-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvksed-intrinsic.c: New test.
+ * gcc.target/riscv/rvv/base/zvksh-intrinsic.c: New test.
+ * gcc.target/riscv/zvkb.c: New test.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c: New test.
+
+2024-01-04 Andrew Pinski <quic_apinski@quicinc.com>
+
+ PR tree-optimization/113186
+ * gcc.dg/tree-ssa/bitops-bool-1.c: New test.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ * lib/gcc-dg.exp: Set TERM to xterm.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ PR analyzer/112790
+ * c-c++-common/analyzer/deref-before-check-pr112790.c: New test.
+
+2024-01-04 David Malcolm <dmalcolm@redhat.com>
+
+ PR analyzer/113222
+ * gcc.dg/analyzer/out-of-bounds-diagram-pr113222.c: New test.
+
+2024-01-04 Kuan-Lin Chen <rufus@andestech.com>
+ Patrick Lin <patrick@andestech.com>
+ Rufus Chen <rufus@andestech.com>
+ Monk Chiang <monk.chiang@sifive.com>
+
+ * gcc.target/riscv/_Float16-nanboxing.c: New test.
+
+2024-01-04 Pan Li <pan2.li@intel.com>
+
+ Revert:
+ 2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c: New test.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c: New test.
+
+2024-01-04 Kito Cheng <kito.cheng@sifive.com>
+
+ * gcc.target/riscv/interrupt-misaligned.c: New.
+
+2024-01-04 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * gcc.dg/vect/slp-26.c: Add loongarch.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-11.c: New test.
+
+2024-01-04 chenxiaolong <chenxiaolong@loongson.cn>
+
+ * gcc.target/loongarch/vector/lasx/lasx-xvstelm.c:Add compile
+ option "-fno-vect-cost-model" to dg-options.
+
+2024-01-04 YunQiang Su <syq@gcc.gnu.org>
+
+ * gcc.c-torture/compile/mipscop-1.c: Include stdio.h.
+ * gcc.c-torture/compile/mipscop-2.c: Ditto.
+ * gcc.c-torture/compile/mipscop-3.c: Ditto.
+ * gcc.c-torture/compile/mipscop-4.c: Ditto.
+
+2024-01-04 YunQiang Su <syq@gcc.gnu.org>
+
+ * gcc.target/mips/pr104914.c: New test.
+
+2024-01-04 YunQiang Su <syq@gcc.gnu.org>
+
+ * gcc.target/mips/data-sym-multi-pool.c: Skip Os or -O0.
+
+2024-01-04 Juzhe-Zhong <juzhe.zhong@rivai.ai>
+
+ PR target/113206
+ PR target/113209
+ * gcc.target/riscv/rvv/vsetvl/avl_single-23.c: Adapt test.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_call-1.c: Robostify test.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_call-2.c: Ditto.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_call-3.c: Ditto.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_conflict-5.c: Ditto.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_single_vtype-1.c: Ditto.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_single_vtype-2.c: Ditto.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_single_vtype-3.c: Ditto.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_single_vtype-4.c: Ditto.
+ * gcc.target/riscv/rvv/vsetvl/vlmax_single_vtype-5.c: Ditto.
+ * gcc.target/riscv/rvv/autovec/pr113206-1.c: New test.
+ * gcc.target/riscv/rvv/autovec/pr113206-2.c: New test.
+ * gcc.target/riscv/rvv/autovec/pr113209.c: New test.
+
2024-01-03 Patrick Palka <ppalka@redhat.com>
PR c++/113064
diff --git a/gcc/testsuite/g++.dg/modules/init-5_a.C b/gcc/testsuite/g++.dg/modules/init-5_a.C
new file mode 100644
index 0000000..466b120
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/init-5_a.C
@@ -0,0 +1,9 @@
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi M }
+
+export module M;
+
+export struct A {
+ static int f() { return -1; }
+ static inline int x = f();
+};
diff --git a/gcc/testsuite/g++.dg/modules/init-5_b.C b/gcc/testsuite/g++.dg/modules/init-5_b.C
new file mode 100644
index 0000000..40973cc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/init-5_b.C
@@ -0,0 +1,10 @@
+// { dg-module-do run }
+// { dg-additional-options "-fmodules-ts" }
+
+import M;
+
+int main() {
+ const int& x = A::x;
+ if (x != -1)
+ __builtin_abort();
+}
diff --git a/gcc/testsuite/g++.dg/modules/mod-invalid-1.C b/gcc/testsuite/g++.dg/modules/mod-invalid-1.C
new file mode 100644
index 0000000..fadaba0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/mod-invalid-1.C
@@ -0,0 +1,7 @@
+// { dg-additional-options "-fmodules-ts" }
+
+module;
+
+module :foo; // { dg-error "expected module-name" }
+
+import :foo; // { dg-error "import specifying a module-partition must appear after a named module-declaration" }
diff --git a/gcc/testsuite/g++.dg/modules/part-8_a.C b/gcc/testsuite/g++.dg/modules/part-8_a.C
new file mode 100644
index 0000000..09f956f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/part-8_a.C
@@ -0,0 +1,6 @@
+// PR c++/110808
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi group:tres }
+
+export module group:tres;
+int mul() { return 0; }
diff --git a/gcc/testsuite/g++.dg/modules/part-8_b.C b/gcc/testsuite/g++.dg/modules/part-8_b.C
new file mode 100644
index 0000000..1ade029
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/part-8_b.C
@@ -0,0 +1,6 @@
+// PR c++/110808
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi group }
+
+export module group;
+export import :tres;
diff --git a/gcc/testsuite/g++.dg/modules/part-8_c.C b/gcc/testsuite/g++.dg/modules/part-8_c.C
new file mode 100644
index 0000000..2351f28
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/part-8_c.C
@@ -0,0 +1,8 @@
+// PR c++/110808
+// { dg-additional-options "-fmodules-ts" }
+
+import group:tres; // { dg-error "expected .;." }
+
+int main() {
+ return mul(); // { dg-error "not declared" }
+}
diff --git a/gcc/testsuite/g++.dg/modules/part-hdr-1_c.C b/gcc/testsuite/g++.dg/modules/part-hdr-1_c.C
index 78a53d2..db57adc 100644
--- a/gcc/testsuite/g++.dg/modules/part-hdr-1_c.C
+++ b/gcc/testsuite/g++.dg/modules/part-hdr-1_c.C
@@ -2,4 +2,4 @@
// { dg-module-cmi {mod} }
export module mod;
-import mod:impl;
+import :impl;
diff --git a/gcc/testsuite/g++.dg/modules/part-mac-1_c.C b/gcc/testsuite/g++.dg/modules/part-mac-1_c.C
index 78a53d2..db57adc 100644
--- a/gcc/testsuite/g++.dg/modules/part-mac-1_c.C
+++ b/gcc/testsuite/g++.dg/modules/part-mac-1_c.C
@@ -2,4 +2,4 @@
// { dg-module-cmi {mod} }
export module mod;
-import mod:impl;
+import :impl;
diff --git a/gcc/testsuite/g++.dg/modules/using-11.h b/gcc/testsuite/g++.dg/modules/using-11.h
new file mode 100644
index 0000000..64c1b0c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-11.h
@@ -0,0 +1,2 @@
+// PR c++/109679
+inline int foo() { return 42; }
diff --git a/gcc/testsuite/g++.dg/modules/using-11_a.C b/gcc/testsuite/g++.dg/modules/using-11_a.C
new file mode 100644
index 0000000..b846bc7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-11_a.C
@@ -0,0 +1,9 @@
+// PR c++/109679
+// { dg-additional-options "-fmodules-ts" }
+// { dg-module-cmi M }
+
+module;
+#include "using-11.h"
+
+export module M;
+export using ::foo;
diff --git a/gcc/testsuite/g++.dg/modules/using-11_b.C b/gcc/testsuite/g++.dg/modules/using-11_b.C
new file mode 100644
index 0000000..736a48c9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/using-11_b.C
@@ -0,0 +1,8 @@
+// PR c++/109679
+// { dg-module-do link }
+// { dg-additional-options "-fmodules-ts" }
+
+import M;
+int main() {
+ return foo();
+}
diff --git a/gcc/testsuite/g++.dg/pr113217.C b/gcc/testsuite/g++.dg/pr113217.C
new file mode 100644
index 0000000..ec86154
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr113217.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-O -g -fnon-call-exceptions" }
+struct _Vector_base {
+ int _M_end_of_storage;
+};
+struct vector : _Vector_base {
+ vector() : _Vector_base() {}
+ ~vector();
+};
+struct LoadGraph {
+ LoadGraph();
+ vector colors;
+ vector data_block;
+};
+LoadGraph::LoadGraph() {}
diff --git a/gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c b/gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c
index 0c5311e..dc28e2c 100644
--- a/gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c
+++ b/gcc/testsuite/gcc.c-torture/compile/attr-complex-method-2.c
@@ -8,4 +8,5 @@ void do_div (_Complex double *a, _Complex double *b)
*a = *b / (4.0 - 5.0fi);
}
-/* { dg-final { scan-tree-dump "__(?:gnu_)?divdc3" "optimized" } } */
+/* { dg-final { scan-tree-dump "__(?:gnu_)?divdc3" "optimized" { target { ! { avr-*-* } } } } } */
+/* { dg-final { scan-tree-dump "__(?:gnu_)?divsc3" "optimized" { target { avr-*-* } } } } */
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr106537-1.c b/gcc/testsuite/gcc.c-torture/compile/pr106537-1.c
index b67b609..a53fe2e 100644
--- a/gcc/testsuite/gcc.c-torture/compile/pr106537-1.c
+++ b/gcc/testsuite/gcc.c-torture/compile/pr106537-1.c
@@ -3,7 +3,7 @@
This testcase checks that warn_compare_distinct_pointer_types is enabled by
default. */
-typedef int __u32;
+typedef __INT32_TYPE__ __u32;
struct xdp_md
{
@@ -13,8 +13,8 @@ struct xdp_md
int xdp_context (struct xdp_md *xdp)
{
- void *data = (void *)(long)xdp->data;
- __u32 *metadata = (void *)(long)xdp->data_meta;
+ void *data = (void *)(__INTPTR_TYPE__)xdp->data;
+ __u32 *metadata = (void *)(__INTPTR_TYPE__)xdp->data_meta;
__u32 ret;
if (metadata + 1 > data) /* { dg-warning "comparison of distinct pointer types" } */
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr106537-2.c b/gcc/testsuite/gcc.c-torture/compile/pr106537-2.c
index d4223c2..d5a2afa 100644
--- a/gcc/testsuite/gcc.c-torture/compile/pr106537-2.c
+++ b/gcc/testsuite/gcc.c-torture/compile/pr106537-2.c
@@ -1,7 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-Wcompare-distinct-pointer-types" } */
-typedef int __u32;
+typedef __INT32_TYPE__ __u32;
struct xdp_md
{
@@ -11,8 +11,8 @@ struct xdp_md
int xdp_context (struct xdp_md *xdp)
{
- void *data = (void *)(long)xdp->data;
- __u32 *metadata = (void *)(long)xdp->data_meta;
+ void *data = (void *)(__INTPTR_TYPE__)xdp->data;
+ __u32 *metadata = (void *)(__INTPTR_TYPE__)xdp->data_meta;
__u32 ret;
if (metadata + 1 > data) /* { dg-warning "comparison of distinct pointer types" } */
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr106537-3.c b/gcc/testsuite/gcc.c-torture/compile/pr106537-3.c
index 73c9b25..13876ea 100644
--- a/gcc/testsuite/gcc.c-torture/compile/pr106537-3.c
+++ b/gcc/testsuite/gcc.c-torture/compile/pr106537-3.c
@@ -1,7 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-O0 -Wno-compare-distinct-pointer-types" } */
-typedef int __u32;
+typedef __INT32_TYPE__ __u32;
struct xdp_md
{
@@ -11,8 +11,8 @@ struct xdp_md
int xdp_context (struct xdp_md *xdp)
{
- void *data = (void *)(long)xdp->data;
- __u32 *metadata = (void *)(long)xdp->data_meta;
+ void *data = (void *)(__INTPTR_TYPE__)xdp->data;
+ __u32 *metadata = (void *)(__INTPTR_TYPE__)xdp->data_meta;
__u32 ret;
if (metadata + 1 > data) /* There shouldn't be a warning here. */
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr113201.c b/gcc/testsuite/gcc.c-torture/compile/pr113201.c
new file mode 100644
index 0000000..72ec761
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr113201.c
@@ -0,0 +1,15 @@
+/* PR tree-optimization/113201 */
+
+void foo (void) __attribute__((returns_twice));
+void bar (void);
+
+int
+baz (void)
+{
+ int x = 42;
+ foo ();
+ while (--x)
+ ;
+ bar ();
+ return x;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20230630-3.c b/gcc/testsuite/gcc.c-torture/execute/20230630-3.c
index fc106c9..735cb9b 100644
--- a/gcc/testsuite/gcc.c-torture/execute/20230630-3.c
+++ b/gcc/testsuite/gcc.c-torture/execute/20230630-3.c
@@ -1,5 +1,5 @@
struct S {
- int i : 24;
+ __INT32_TYPE__ i : 24;
char c1 : 1;
char c2 : 1;
char c3 : 1;
diff --git a/gcc/testsuite/gcc.c-torture/execute/20230630-4.c b/gcc/testsuite/gcc.c-torture/execute/20230630-4.c
index df33c18..e300cd4 100644
--- a/gcc/testsuite/gcc.c-torture/execute/20230630-4.c
+++ b/gcc/testsuite/gcc.c-torture/execute/20230630-4.c
@@ -5,7 +5,7 @@
#endif
struct S {
- int i : 24;
+ __INT32_TYPE__ i : 24;
char c1 : 1;
char c2 : 1;
char c3 : 1;
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr109938.c b/gcc/testsuite/gcc.c-torture/execute/pr109938.c
index a65d13b..668d4ca 100644
--- a/gcc/testsuite/gcc.c-torture/execute/pr109938.c
+++ b/gcc/testsuite/gcc.c-torture/execute/pr109938.c
@@ -1,3 +1,4 @@
+/* { dg-require-effective-target int32plus } */
/* PR tree-opt/109938 */
#include "../../gcc.dg/tree-ssa/pr109938.c"
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr109986.c b/gcc/testsuite/gcc.c-torture/execute/pr109986.c
index 00ee988..c4c9645 100644
--- a/gcc/testsuite/gcc.c-torture/execute/pr109986.c
+++ b/gcc/testsuite/gcc.c-torture/execute/pr109986.c
@@ -1,3 +1,4 @@
+/* { dg-require-effective-target int32plus } */
/* PR middle-end/109986 */
#include "../../gcc.dg/tree-ssa/pr109986.c"
diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-13.c b/gcc/testsuite/gcc.dg/builtin-bswap-13.c
index 6dc4c15..4f5bc97 100644
--- a/gcc/testsuite/gcc.dg/builtin-bswap-13.c
+++ b/gcc/testsuite/gcc.dg/builtin-bswap-13.c
@@ -1,6 +1,10 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
+#if __SIZEOF_INT__ < 4
+#define int __INT32_TYPE__
+#endif
+
int test_s32_0_1(int x) { return __builtin_bswap32(x) & 1; }
int test_s32_0_2(int x) { return __builtin_bswap32(x) & 2; }
int test_s32_0_240(int x) { return __builtin_bswap32(x) & 240; }
diff --git a/gcc/testsuite/gcc.dg/builtin-bswap-14.c b/gcc/testsuite/gcc.dg/builtin-bswap-14.c
index 62711d8..0abf466 100644
--- a/gcc/testsuite/gcc.dg/builtin-bswap-14.c
+++ b/gcc/testsuite/gcc.dg/builtin-bswap-14.c
@@ -5,11 +5,11 @@ extern void abort (void);
__attribute__ ((noinline, noclone))
-static int rt32 (int x, int y, int z) {
+static __INT32_TYPE__ rt32 (__INT32_TYPE__ x, int y, __INT32_TYPE__ z) {
return (__builtin_bswap32(x) >> y) & z;
}
#define TEST32(X,Y,Z) if(((__builtin_bswap32(X)>>Y)&Z)!=rt32(X,Y,Z)) abort()
-void test32(int x)
+void test32(__INT32_TYPE__ x)
{
TEST32(x,0,1);
TEST32(x,0,255);
diff --git a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
index 07e3da6..c3ac623 100644
--- a/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
+++ b/gcc/testsuite/gcc.dg/builtin-dynamic-object-size-0.c
@@ -1,5 +1,6 @@
/* { dg-do run } */
/* { dg-options "-O2" } */
+/* { dg-require-effective-target size20plus } */
#include "builtin-object-size-common.h"
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-1.c b/gcc/testsuite/gcc.dg/builtin-object-size-1.c
index db32580..64c4bc4 100644
--- a/gcc/testsuite/gcc.dg/builtin-object-size-1.c
+++ b/gcc/testsuite/gcc.dg/builtin-object-size-1.c
@@ -621,6 +621,7 @@ test10 (void)
}
}
+#ifndef __AVR__ /* avr has no strndup */
/* Tests for strdup/strndup. */
size_t
__attribute__ ((noinline))
@@ -708,6 +709,7 @@ test11 (void)
FAIL ();
free (res);
}
+#endif /* avr */
int
main (void)
@@ -724,6 +726,8 @@ main (void)
test8 ();
test9 (1);
test10 ();
+#ifndef __AVR__ /* avr has no strndup */
test11 ();
+#endif
DONE ();
}
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-2.c b/gcc/testsuite/gcc.dg/builtin-object-size-2.c
index 4c71b1f..da10b6b 100644
--- a/gcc/testsuite/gcc.dg/builtin-object-size-2.c
+++ b/gcc/testsuite/gcc.dg/builtin-object-size-2.c
@@ -536,6 +536,7 @@ test8 (unsigned cond)
#endif
}
+#ifndef __AVR__ /* avr has no strndup */
/* Tests for strdup/strndup. */
size_t
__attribute__ ((noinline))
@@ -623,6 +624,7 @@ test9 (void)
FAIL ();
free (res);
}
+#endif /* avr */
int
main (void)
@@ -637,6 +639,8 @@ main (void)
test6 ();
test7 ();
test8 (1);
+#ifndef __AVR__ /* avr has no strndup */
test9 ();
+#endif
DONE ();
}
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-3.c b/gcc/testsuite/gcc.dg/builtin-object-size-3.c
index 3d907ef..f23873b 100644
--- a/gcc/testsuite/gcc.dg/builtin-object-size-3.c
+++ b/gcc/testsuite/gcc.dg/builtin-object-size-3.c
@@ -628,6 +628,7 @@ test10 (void)
}
}
+#ifndef __AVR__ /* avr has no strndup */
/* Tests for strdup/strndup. */
size_t
__attribute__ ((noinline))
@@ -716,6 +717,7 @@ test11 (void)
FAIL ();
free (res);
}
+#endif /* avr */
int
main (void)
@@ -732,6 +734,8 @@ main (void)
test8 ();
test9 (1);
test10 ();
+#ifndef __AVR__ /* avr has no strndup */
test11 ();
+#endif
DONE ();
}
diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-4.c b/gcc/testsuite/gcc.dg/builtin-object-size-4.c
index c9af074..dcb042f 100644
--- a/gcc/testsuite/gcc.dg/builtin-object-size-4.c
+++ b/gcc/testsuite/gcc.dg/builtin-object-size-4.c
@@ -509,6 +509,7 @@ test8 (unsigned cond)
#endif
}
+#ifndef __AVR__ /* avr has no strndup */
/* Tests for strdup/strndup. */
size_t
__attribute__ ((noinline))
@@ -596,6 +597,7 @@ test9 (void)
FAIL ();
free (res);
}
+#endif /* avr */
int
main (void)
@@ -610,6 +612,8 @@ main (void)
test6 ();
test7 ();
test8 (1);
+#ifndef __AVR__ /* avr has no strndup */
test9 ();
+#endif
DONE ();
}
diff --git a/gcc/testsuite/gcc.dg/c23-constexpr-9.c b/gcc/testsuite/gcc.dg/c23-constexpr-9.c
index 1370583..8dadb18 100644
--- a/gcc/testsuite/gcc.dg/c23-constexpr-9.c
+++ b/gcc/testsuite/gcc.dg/c23-constexpr-9.c
@@ -3,6 +3,7 @@
/* { dg-options "-std=c23 -pedantic-errors" } */
/* { dg-add-options ieee } */
/* { dg-require-effective-target inff } */
+/* { dg-require-effective-target large_double } */
/* A conversion from signaling NaN to quiet NaN in a different format or type
is not valid for constexpr. */
diff --git a/gcc/testsuite/gcc.dg/c23-nullptr-1.c b/gcc/testsuite/gcc.dg/c23-nullptr-1.c
index a1b9dea..00ca7bd 100644
--- a/gcc/testsuite/gcc.dg/c23-nullptr-1.c
+++ b/gcc/testsuite/gcc.dg/c23-nullptr-1.c
@@ -2,6 +2,7 @@
/* { dg-do run } */
// { dg-require-effective-target thread_fence }
/* { dg-options "-std=c23 -pedantic-errors -Wall -Wextra -Wno-unused-variable" } */
+/* { dg-xfail-if "__atomic not supported" { "avr-*-*" } } */
#include <stdarg.h>
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
index 03c323a..2ec00dc 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-bitfields-2.c
@@ -18,6 +18,10 @@
/* Only 2 members. */
/* { dg-final { scan-assembler-times "MEMBER" 2 } } */
+#if __SIZEOF_INT__ < 4
+#define unsigned __UINT32_TYPE__
+#endif
+
struct foo
{
unsigned a : 31;
diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c b/gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c
index f90fa77..940f129 100644
--- a/gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c
+++ b/gcc/testsuite/gcc.dg/debug/btf/btf-pr106773.c
@@ -17,8 +17,8 @@
extern const void foo __attribute__((weak)) __attribute__((section (".ksyms")));
extern const void bar __attribute__((weak)) __attribute__((section (".ksyms")));
-unsigned long func () {
- unsigned long x = (unsigned long) &foo;
+__UINTPTR_TYPE__ func () {
+ __UINTPTR_TYPE__ x = (__UINTPTR_TYPE__) &foo;
return x;
}
diff --git a/gcc/testsuite/gcc.dg/fma-3.c b/gcc/testsuite/gcc.dg/fma-3.c
index 699aa2c..6649b54 100644
--- a/gcc/testsuite/gcc.dg/fma-3.c
+++ b/gcc/testsuite/gcc.dg/fma-3.c
@@ -12,4 +12,4 @@ f2 (double a, double b, double c)
return c - a * b;
}
-/* { dg-final { scan-tree-dump-times { = \.FNMA \(} 2 "widening_mul" { target scalar_all_fma } } } */
+/* { dg-final { scan-tree-dump-times { = \.FNMA \(} 2 "widening_mul" { target { scalar_all_fma && { ! loongarch*-*-* } } } } } */
diff --git a/gcc/testsuite/gcc.dg/fma-4.c b/gcc/testsuite/gcc.dg/fma-4.c
index bff928f..f1701c1 100644
--- a/gcc/testsuite/gcc.dg/fma-4.c
+++ b/gcc/testsuite/gcc.dg/fma-4.c
@@ -12,4 +12,4 @@ f2 (double a, double b, double c)
return -(a * b) - c;
}
-/* { dg-final { scan-tree-dump-times { = \.FNMS \(} 2 "widening_mul" { target scalar_all_fma } } } */
+/* { dg-final { scan-tree-dump-times { = \.FNMS \(} 2 "widening_mul" { target { scalar_all_fma && { ! loongarch*-*-* } } } } } */
diff --git a/gcc/testsuite/gcc.dg/fma-6.c b/gcc/testsuite/gcc.dg/fma-6.c
index 87258ce..9e49b62 100644
--- a/gcc/testsuite/gcc.dg/fma-6.c
+++ b/gcc/testsuite/gcc.dg/fma-6.c
@@ -64,4 +64,4 @@ f10 (double a, double b, double c)
return -__builtin_fma (a, b, -c);
}
-/* { dg-final { scan-tree-dump-times { = \.FNMA \(} 14 "optimized" { target scalar_all_fma } } } */
+/* { dg-final { scan-tree-dump-times { = \.FNMA \(} 14 "optimized" { target { scalar_all_fma && { ! loongarch*-*-* } } } } } */
diff --git a/gcc/testsuite/gcc.dg/fma-7.c b/gcc/testsuite/gcc.dg/fma-7.c
index f409cc8..86aacad 100644
--- a/gcc/testsuite/gcc.dg/fma-7.c
+++ b/gcc/testsuite/gcc.dg/fma-7.c
@@ -64,4 +64,4 @@ f10 (double a, double b, double c)
return -__builtin_fma (a, b, c);
}
-/* { dg-final { scan-tree-dump-times { = \.FNMS \(} 14 "optimized" { target scalar_all_fma } } } */
+/* { dg-final { scan-tree-dump-times { = \.FNMS \(} 14 "optimized" { target { scalar_all_fma && { ! loongarch*-*-* } } } } } */
diff --git a/gcc/testsuite/gcc.dg/fold-ior-4.c b/gcc/testsuite/gcc.dg/fold-ior-4.c
index 8f7213e..17a2a4d 100644
--- a/gcc/testsuite/gcc.dg/fold-ior-4.c
+++ b/gcc/testsuite/gcc.dg/fold-ior-4.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-require-effective-target int32plus } */
unsigned int test_ior(unsigned char i)
{
diff --git a/gcc/testsuite/gcc.dg/fold-ior-5.c b/gcc/testsuite/gcc.dg/fold-ior-5.c
index 8de5697..8352fdd 100644
--- a/gcc/testsuite/gcc.dg/fold-ior-5.c
+++ b/gcc/testsuite/gcc.dg/fold-ior-5.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-require-effective-target int32plus } */
unsigned int test_ior(unsigned char i)
{
diff --git a/gcc/testsuite/gcc.dg/fold-parity-5.c b/gcc/testsuite/gcc.dg/fold-parity-5.c
index 69d3a6a..e30cd2f 100644
--- a/gcc/testsuite/gcc.dg/fold-parity-5.c
+++ b/gcc/testsuite/gcc.dg/fold-parity-5.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-require-effective-target int32plus } */
int test_and4(unsigned int a)
{
diff --git a/gcc/testsuite/gcc.dg/fold-popcount-5.c b/gcc/testsuite/gcc.dg/fold-popcount-5.c
index 943726f..4963a4d 100644
--- a/gcc/testsuite/gcc.dg/fold-popcount-5.c
+++ b/gcc/testsuite/gcc.dg/fold-popcount-5.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
+/* { dg-require-effective-target int32plus } */
int test_and4(unsigned int a)
{
diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-10.c b/gcc/testsuite/gcc.dg/loop-unswitch-10.c
index 395167e..20f5d87 100644
--- a/gcc/testsuite/gcc.dg/loop-unswitch-10.c
+++ b/gcc/testsuite/gcc.dg/loop-unswitch-10.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-optimized" } */
+/* { dg-require-effective-target size32plus } */
int
__attribute__((noipa))
diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-11.c b/gcc/testsuite/gcc.dg/loop-unswitch-11.c
index 422a942..e9441316 100644
--- a/gcc/testsuite/gcc.dg/loop-unswitch-11.c
+++ b/gcc/testsuite/gcc.dg/loop-unswitch-11.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-optimized" } */
+/* { dg-require-effective-target int32 } */
int
foo(double *a, double *b, double *c, double *d, double *r, int size, int order)
diff --git a/gcc/testsuite/gcc.dg/loop-unswitch-14.c b/gcc/testsuite/gcc.dg/loop-unswitch-14.c
index d9d3168..e1225f6 100644
--- a/gcc/testsuite/gcc.dg/loop-unswitch-14.c
+++ b/gcc/testsuite/gcc.dg/loop-unswitch-14.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -funswitch-loops -fdump-tree-unswitch-optimized --param=max-unswitch-insns=1000" } */
+/* { dg-require-effective-target size32plus } */
int
__attribute__((noipa))
diff --git a/gcc/testsuite/gcc.dg/memchr-3.c b/gcc/testsuite/gcc.dg/memchr-3.c
index 9c73265..9a35735 100644
--- a/gcc/testsuite/gcc.dg/memchr-3.c
+++ b/gcc/testsuite/gcc.dg/memchr-3.c
@@ -6,7 +6,7 @@
typedef __INT8_TYPE__ int8_t;
typedef __INT32_TYPE__ int32_t;
-extern void* memchr (const void*, int, long); /* { dg-warning "-Wbuiltin-declaration-mismatch" "" { target llp64 } } */
+extern void* memchr (const void*, int, long); /* { dg-warning "-Wbuiltin-declaration-mismatch" "" { target { llp64 || avr-*-* } } } */
struct SX
{
diff --git a/gcc/testsuite/gcc.dg/pr101836.c b/gcc/testsuite/gcc.dg/pr101836.c
index 096196d..75349a8 100644
--- a/gcc/testsuite/gcc.dg/pr101836.c
+++ b/gcc/testsuite/gcc.dg/pr101836.c
@@ -46,8 +46,8 @@ void __attribute__((__noinline__)) stuff(
struct trailing_array_3 *trailing_0,
struct trailing_array_4 *trailing_flex)
{
- expect(__builtin_object_size(normal->c, 1), 16);
- expect(__builtin_object_size(trailing_1->c, 1), 4);
+ expect(__builtin_object_size(normal->c, 1), 4 * __SIZEOF_INT__);
+ expect(__builtin_object_size(trailing_1->c, 1), __SIZEOF_INT__);
expect(__builtin_object_size(trailing_0->c, 1), 0);
expect(__builtin_object_size(trailing_flex->c, 1), -1);
}
diff --git a/gcc/testsuite/gcc.dg/pr101836_1.c b/gcc/testsuite/gcc.dg/pr101836_1.c
index e2931ce..19e6320 100644
--- a/gcc/testsuite/gcc.dg/pr101836_1.c
+++ b/gcc/testsuite/gcc.dg/pr101836_1.c
@@ -46,8 +46,8 @@ void __attribute__((__noinline__)) stuff(
struct trailing_array_3 *trailing_0,
struct trailing_array_4 *trailing_flex)
{
- expect(__builtin_object_size(normal->c, 1), 16);
- expect(__builtin_object_size(trailing_1->c, 1), 4);
+ expect(__builtin_object_size(normal->c, 1), 4 * __SIZEOF_INT__);
+ expect(__builtin_object_size(trailing_1->c, 1), __SIZEOF_INT__);
expect(__builtin_object_size(trailing_0->c, 1), 0);
expect(__builtin_object_size(trailing_flex->c, 1), -1);
}
diff --git a/gcc/testsuite/gcc.dg/pr101836_2.c b/gcc/testsuite/gcc.dg/pr101836_2.c
index 7897418..09079e6 100644
--- a/gcc/testsuite/gcc.dg/pr101836_2.c
+++ b/gcc/testsuite/gcc.dg/pr101836_2.c
@@ -46,8 +46,8 @@ void __attribute__((__noinline__)) stuff(
struct trailing_array_3 *trailing_0,
struct trailing_array_4 *trailing_flex)
{
- expect(__builtin_object_size(normal->c, 1), 16);
- expect(__builtin_object_size(trailing_1->c, 1), 4);
+ expect(__builtin_object_size(normal->c, 1), 4 * __SIZEOF_INT__);
+ expect(__builtin_object_size(trailing_1->c, 1), __SIZEOF_INT__);
expect(__builtin_object_size(trailing_0->c, 1), -1);
expect(__builtin_object_size(trailing_flex->c, 1), -1);
}
diff --git a/gcc/testsuite/gcc.dg/pr101836_3.c b/gcc/testsuite/gcc.dg/pr101836_3.c
index 0e69388..63f50f7 100644
--- a/gcc/testsuite/gcc.dg/pr101836_3.c
+++ b/gcc/testsuite/gcc.dg/pr101836_3.c
@@ -46,7 +46,7 @@ void __attribute__((__noinline__)) stuff(
struct trailing_array_3 *trailing_0,
struct trailing_array_4 *trailing_flex)
{
- expect(__builtin_object_size(normal->c, 1), 16);
+ expect(__builtin_object_size(normal->c, 1), 4 * __SIZEOF_INT__);
expect(__builtin_object_size(trailing_1->c, 1), -1);
expect(__builtin_object_size(trailing_0->c, 1), -1);
expect(__builtin_object_size(trailing_flex->c, 1), -1);
diff --git a/gcc/testsuite/gcc.dg/pr103207.c b/gcc/testsuite/gcc.dg/pr103207.c
index 69c0f55..b3043f4 100644
--- a/gcc/testsuite/gcc.dg/pr103207.c
+++ b/gcc/testsuite/gcc.dg/pr103207.c
@@ -1,7 +1,7 @@
// { dg-do compile }
// { dg-options "-O2 --param case-values-threshold=1 -w" }
-int f (int i)
+int f (__INT32_TYPE__ i)
{
switch (i) {
case 2147483647:
diff --git a/gcc/testsuite/gcc.dg/pr103451.c b/gcc/testsuite/gcc.dg/pr103451.c
index db724aa..6fa84b4 100644
--- a/gcc/testsuite/gcc.dg/pr103451.c
+++ b/gcc/testsuite/gcc.dg/pr103451.c
@@ -13,7 +13,7 @@ void func_10(long li_8)
void func_9_s_8(void)
{
- func_10((long) func_9_s_8);
+ func_10((long) func_9_s_8); /* { dg-warning "-Wpointer-to-int-cast" "" { target { ! ptr_eq_long } } } */
}
// { dg-final { scan-tree-dump " / 0" "optimized" } }
diff --git a/gcc/testsuite/gcc.dg/pr109977.c b/gcc/testsuite/gcc.dg/pr109977.c
index 03d9a33..c0be161 100644
--- a/gcc/testsuite/gcc.dg/pr109977.c
+++ b/gcc/testsuite/gcc.dg/pr109977.c
@@ -2,8 +2,8 @@
/* { dg-do compile } */
/* { dg-options "-Og" } */
-typedef double __attribute__((__vector_size__ (8))) V;
-typedef double __attribute__((__vector_size__ (16))) W;
+typedef double __attribute__((__vector_size__ (__SIZEOF_DOUBLE__))) V;
+typedef double __attribute__((__vector_size__ (__SIZEOF_DOUBLE__*2))) W;
V v;
int i;
extern void bar (void *);
diff --git a/gcc/testsuite/gcc.dg/pr110496.c b/gcc/testsuite/gcc.dg/pr110496.c
index 3c3d12f..5a168fd 100644
--- a/gcc/testsuite/gcc.dg/pr110496.c
+++ b/gcc/testsuite/gcc.dg/pr110496.c
@@ -7,7 +7,7 @@ int f_MV0__x;
void f() {
unsigned char *rptr;
unsigned char valbuf[6];
- rptr = (unsigned char *)contents;
+ rptr = (unsigned char *)contents; /* { dg-warning "-Wint-to-pointer-cast" "" { target { ! ptr_eq_long } } } */
if (decide())
do {
__builtin_memcpy(valbuf, &f_MV0__x, sizeof(int));
diff --git a/gcc/testsuite/gcc.dg/pr110506-2.c b/gcc/testsuite/gcc.dg/pr110506-2.c
index aabca0fa..4bc9089 100644
--- a/gcc/testsuite/gcc.dg/pr110506-2.c
+++ b/gcc/testsuite/gcc.dg/pr110506-2.c
@@ -1,7 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-O2" } */
-typedef unsigned uint32_t;
+typedef __UINT32_TYPE__ uint32_t;
typedef uint32_t uint32x4 __attribute__((vector_size(16)));
typedef struct {
uint32x4 b, d;
diff --git a/gcc/testsuite/gcc.dg/pr110582.c b/gcc/testsuite/gcc.dg/pr110582.c
index ae0650d..6607cf5 100644
--- a/gcc/testsuite/gcc.dg/pr110582.c
+++ b/gcc/testsuite/gcc.dg/pr110582.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-vrp2" } */
+/* { dg-require-effective-target int32plus } */
int a, b;
int main() {
diff --git a/gcc/testsuite/gcc.dg/pr111039.c b/gcc/testsuite/gcc.dg/pr111039.c
index bec9983..a64c46c 100644
--- a/gcc/testsuite/gcc.dg/pr111039.c
+++ b/gcc/testsuite/gcc.dg/pr111039.c
@@ -1,6 +1,10 @@
/* { dg-do compile } */
/* { dg-options "-O" } */
+#if __SIZEOF_INT__ < 4
+#define int __INT32_TYPE__
+#endif
+
int _setjmp ();
void abcd ();
void abcde ();
diff --git a/gcc/testsuite/gcc.dg/pr111070.c b/gcc/testsuite/gcc.dg/pr111070.c
index 1ebc7ad..1de3a36 100644
--- a/gcc/testsuite/gcc.dg/pr111070.c
+++ b/gcc/testsuite/gcc.dg/pr111070.c
@@ -12,9 +12,9 @@ char d_ary[1] = {1};
int main ()
{
- if (((unsigned long)&c_ary[0] & 7) != 0)
+ if (((__UINTPTR_TYPE__)&c_ary[0] & 7) != 0)
return 1;
- if (((unsigned long)&d_ary[0] & 7) != 0)
+ if (((__UINTPTR_TYPE__)&d_ary[0] & 7) != 0)
return 1;
return 0;
}
diff --git a/gcc/testsuite/gcc.dg/pr111599.c b/gcc/testsuite/gcc.dg/pr111599.c
index 25880b7..e2f2542 100644
--- a/gcc/testsuite/gcc.dg/pr111599.c
+++ b/gcc/testsuite/gcc.dg/pr111599.c
@@ -1,6 +1,10 @@
/* { dg-do compile } */
/* { dg-options "-O3 -fno-inline-functions-called-once -fno-inline-small-functions -fno-tree-dce -fno-tree-forwprop -fno-tree-fre" } */
+#if __SIZEOF_INT__ < 4
+#define int __INT32_TYPE__
+#endif
+
int h(void);
void l(int);
void func_56(int p_57, unsigned p_58) {
diff --git a/gcc/testsuite/gcc.dg/torture/pr110838.c b/gcc/testsuite/gcc.dg/torture/pr110838.c
index f039bd6..ae2874b 100644
--- a/gcc/testsuite/gcc.dg/torture/pr110838.c
+++ b/gcc/testsuite/gcc.dg/torture/pr110838.c
@@ -5,10 +5,12 @@ typedef __UINT8_TYPE__ uint8_t;
typedef __INT8_TYPE__ int8_t;
typedef uint8_t pixel;
+#define MSB (__CHAR_BIT__ * __SIZEOF_INT__ - 1)
+
/* get the sign of input variable (TODO: this is a dup, make common) */
static inline int8_t signOf(int x)
{
- return (x >> 31) | ((int)((((uint32_t)-x)) >> 31));
+ return (x >> MSB) | ((int)((((uint32_t)-x)) >> MSB));
}
__attribute__((noipa))
diff --git a/gcc/testsuite/gcc.dg/torture/pr112282.c b/gcc/testsuite/gcc.dg/torture/pr112282.c
index 6190b90..cfe364f 100644
--- a/gcc/testsuite/gcc.dg/torture/pr112282.c
+++ b/gcc/testsuite/gcc.dg/torture/pr112282.c
@@ -1,5 +1,11 @@
/* { dg-do run } */
+#if __SIZEOF_INT__ < 4
+#define Xint __INT32_TYPE__
+#else
+#define Xint int
+#endif
+
int printf(const char *, ...);
void abort ();
/* We need an abort that isn't noreturn. */
@@ -10,8 +16,8 @@ void __attribute__((noipa)) my_abort ()
int a, g, h, i, v, w = 2, x, y, ab, ac, ad, ae, af, ag;
static int f, j, m, n, p, r, u, aa;
struct b {
- int c : 20;
- int d : 20;
+ Xint c : 20;
+ Xint d : 20;
int e : 10;
};
static struct b l, o, q = {3, 3, 5};
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bitcmp-5.c b/gcc/testsuite/gcc.dg/tree-ssa/bitcmp-5.c
index a6be142..8def5ad 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/bitcmp-5.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bitcmp-5.c
@@ -6,6 +6,9 @@
of `(a & b) CMP a` and `(a | b) CMP a`
which can be optimized to 1. */
+#if __SIZEOF_INT__ < 4
+#define int __INT32_TYPE__
+#endif
/* For `&`, the non-negativeness of b is not taken into account. */
int f_and_le(int len) {
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bitcmp-6.c b/gcc/testsuite/gcc.dg/tree-ssa/bitcmp-6.c
index a86a19f..cea3774 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/bitcmp-6.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bitcmp-6.c
@@ -6,6 +6,10 @@
of `(a & b) CMP a` and `(a | b) CMP a`
which can be optimized to 0. */
+#if __SIZEOF_INT__ < 4
+#define int __INT32_TYPE__
+#endif
+
/* For `&`, the non-negativeness of b is not taken into account. */
int f_and_gt(int len) {
len &= 0xfffff;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bitops-bool-1.c b/gcc/testsuite/gcc.dg/tree-ssa/bitops-bool-1.c
new file mode 100644
index 0000000..8b43afb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/bitops-bool-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized -fdump-tree-forwprop1" } */
+/* PR tree-optimized/113186 */
+
+_Bool f(_Bool a, _Bool c)
+{
+ _Bool b = (a^c);
+ _Bool d = (a^!c);
+ return b & d;
+}
+
+/* This function should be optimized to return 0; */
+/* { dg-final { scan-tree-dump "return 0" "optimized" } } */
+/* { dg-final { scan-tree-dump "return 0" "forwprop1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cltz-complement-max.c b/gcc/testsuite/gcc.dg/tree-ssa/cltz-complement-max.c
index 1a29ca5..7b3599a 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cltz-complement-max.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cltz-complement-max.c
@@ -3,6 +3,10 @@
#define PREC (__CHAR_BIT__)
+#if __SIZEOF_INT__ < 4
+#define int __INT32_TYPE__
+#endif
+
int clz_complement_count1 (unsigned char b) {
int c = 0;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cltz-max.c b/gcc/testsuite/gcc.dg/tree-ssa/cltz-max.c
index a6bea3d..78b0d01 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cltz-max.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cltz-max.c
@@ -3,6 +3,10 @@
#define PREC (__CHAR_BIT__)
+#if __SIZEOF_INT__ < 4
+#define int __INT32_TYPE__
+#endif
+
int clz_count1 (unsigned char b) {
int c = 0;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c
index f4d06fe..36cb74b 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c
@@ -20,7 +20,7 @@ int foo(int a, int b)
else if (a == 10)
global2 = 12345;
else if (a == 1)
- global2 = 123456;
+ global2 = 23456;
}
}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-9.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-9.c
index e67198b..ce6dc34 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-9.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-9.c
@@ -1,6 +1,7 @@
/* PR tree-optimization/88702 */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-iftoswitch-optimized" } */
+/* { dg-additional-options "--param=case-values-threshold=3" { target { avr-*-* } } } */
int IsHTMLWhitespace(int aChar) {
return aChar == 0x0009 || aChar == 0x000A ||
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/negneg-3.c b/gcc/testsuite/gcc.dg/tree-ssa/negneg-3.c
index 9deb9f6..9603145 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/negneg-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/negneg-3.c
@@ -12,4 +12,5 @@ DEF(0, unsigned, long long)
DEF(1, unsigned, unsigned long long)
DEF(2, double, float)
-/* { dg-final { scan-tree-dump-times "negate_expr" 6 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "negate_expr" 6 "optimized" { target { large_double } } } } */
+/* { dg-final { scan-tree-dump-times "negate_expr" 4 "optimized" { target { ! large_double } } } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-25b.c b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-25b.c
index 0fd9b00..5d55736 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-25b.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-25b.c
@@ -5,17 +5,17 @@
/* Test to make sure unrelated arguments and comparisons
don't get optimized incorrectly. */
-unsigned short test_bswap16(unsigned short x, unsigned short y)
+__UINT16_TYPE__ test_bswap16(__UINT16_TYPE__ x, __UINT16_TYPE__ y)
{
return x ? __builtin_bswap16(y) : 0;
}
-unsigned int test_bswap32(unsigned int x, unsigned int y)
+__UINT32_TYPE__ test_bswap32(__UINT32_TYPE__ x, __UINT32_TYPE__ y)
{
return x ? __builtin_bswap32(y) : 0;
}
-unsigned long long test_bswap64(unsigned long long x, unsigned long long y)
+__UINT64_TYPE__ test_bswap64(__UINT64_TYPE__ x, __UINT64_TYPE__ y)
{
return x ? __builtin_bswap64(y) : 0;
}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/popcount-max.c b/gcc/testsuite/gcc.dg/tree-ssa/popcount-max.c
index ca7204c..8f01262 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/popcount-max.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/popcount-max.c
@@ -3,7 +3,7 @@
#define PREC (__CHAR_BIT__)
-int count1 (unsigned char b) {
+__INT32_TYPE__ count1 (unsigned char b) {
int c = 0;
while (b) {
@@ -16,7 +16,7 @@ int count1 (unsigned char b) {
return 34567;
}
-int count2 (unsigned char b) {
+__INT32_TYPE__ count2 (unsigned char b) {
int c = 0;
while (b) {
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr111583-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr111583-1.c
index 1dd8dbc..0dda1a7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr111583-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr111583-1.c
@@ -12,7 +12,7 @@ int main()
a = 1;
for (; a; a++) {
{
- long b = j, d = h;
+ __INTPTR_TYPE__ b = j, d = h;
int c = 0;
while (d--)
*(char *)b++ = c;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr111583-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr111583-2.c
index 0ee2185..68d2811 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr111583-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr111583-2.c
@@ -18,7 +18,7 @@ static short m(unsigned k) {
const unsigned short *n[65];
g = &n[4];
k || l();
- long a = k;
+ __INTPTR_TYPE__ a = k;
char i = 0;
unsigned long j = k;
while (j--)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr55177-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr55177-1.c
index de1a264..2630707 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr55177-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr55177-1.c
@@ -1,10 +1,10 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
-extern int x;
+extern __INT32_TYPE__ x;
void foo(void)
{
- int a = __builtin_bswap32(x);
+ __INT32_TYPE__ a = __builtin_bswap32(x);
a &= 0x5a5b5c5d;
x = __builtin_bswap32(a);
}
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c
index a3ff0f5..5ae9922 100644
--- a/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-* } } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-12.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-12.c
new file mode 100644
index 0000000..0cb492e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-12.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -ftree-vectorize --param riscv-autovec-lmul=dynamic -fdump-tree-vect-details" } */
+
+void
+f (int *restrict a, int *restrict b, int *restrict c, int *restrict d,
+ int *restrict x, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] >> x[i];
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i] >> x[i];
+ }
+}
+
+void
+f2 (int *restrict a, int *restrict b, int *restrict c, int *restrict d,
+ int *restrict x, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] << x[i];
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i] >> x[i];
+ }
+}
+
+/* { dg-final { scan-assembler-times {e32,m4} 2 } } */
+/* { dg-final { scan-assembler-not {csrr} } } */
+/* { dg-final { scan-assembler-not {jr} } } */
+/* { dg-final { scan-assembler-not {e32,m8} } } */
+/* { dg-final { scan-assembler-not {e32,m2} } } */
+/* { dg-final { scan-assembler-not {e32,m1} } } */
+/* { dg-final { scan-assembler-times {ret} 2 } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 2 "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c
new file mode 100644
index 0000000..baef4e3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-13.c
@@ -0,0 +1,74 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -ftree-vectorize --param riscv-autovec-lmul=dynamic -fdump-tree-vect-details" } */
+
+void
+f (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] + 15;
+ int tmp2 = tmp + b[i];
+ c[i] = tmp2 + b[i];
+ d[i] = tmp + tmp2 + b[i];
+ }
+}
+
+void
+f2 (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = 15 - b[i];
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i];
+ }
+}
+
+void
+f3 (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] & 15;
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i];
+ }
+}
+
+void
+f4 (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] | 15;
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i];
+ }
+}
+
+void
+f5 (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] ^ 15;
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i];
+ }
+}
+
+/* { dg-final { scan-assembler-times {e32,m8} 5 } } */
+/* { dg-final { scan-assembler-not {csrr} } } */
+/* { dg-final { scan-assembler-not {jr} } } */
+/* { dg-final { scan-assembler-not {e32,m4} } } */
+/* { dg-final { scan-assembler-not {e32,m2} } } */
+/* { dg-final { scan-assembler-not {e32,m1} } } */
+/* { dg-final { scan-assembler-times {ret} 5 } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 5 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 5 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 5 "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-14.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-14.c
new file mode 100644
index 0000000..0d42c3b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-14.c
@@ -0,0 +1,64 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -ftree-vectorize --param riscv-autovec-lmul=dynamic -fdump-tree-vect-details" } */
+
+void
+f (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int x,
+ int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] >> x;
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i] >> x;
+ }
+}
+
+void
+f2 (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int x,
+ int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] << x;
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i] >> x;
+ }
+}
+
+void
+f3 (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] >> 17;
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i] >> 17;
+ }
+}
+
+void
+f4 (int *restrict a, int *restrict b, int *restrict c, int *restrict d, int n)
+{
+ for (int i = 0; i < n; i++)
+ {
+ int tmp = b[i] << 17;
+ int tmp2 = tmp * b[i];
+ c[i] = tmp2 * b[i];
+ d[i] = tmp * tmp2 * b[i] >> 17;
+ }
+}
+
+/* { dg-final { scan-assembler-times {e32,m8} 4 } } */
+/* { dg-final { scan-assembler-not {csrr} } } */
+/* { dg-final { scan-assembler-not {jr} } } */
+/* { dg-final { scan-assembler-not {e32,m4} } } */
+/* { dg-final { scan-assembler-not {e32,m2} } } */
+/* { dg-final { scan-assembler-not {e32,m1} } } */
+/* { dg-final { scan-assembler-times {ret} 4 } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 4 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 4 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 4 "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c b/gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c
index 72811eb..b69ade3 100644
--- a/gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c
+++ b/gcc/testsuite/gcc.dg/vect/slp-widen-mult-half.c
@@ -1,6 +1,7 @@
/* Disabling epilogues until we find a better way to deal with scans. */
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-* } } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-82.c b/gcc/testsuite/gcc.dg/vect/vect-82.c
index 4b2d5a8..5c761e9 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-82.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-82.c
@@ -1,4 +1,4 @@
-/* { dg-skip-if "powerpc and integer vectorization only" { ! { powerpc*-*-* && vect_int } } } */
+/* { dg-skip-if "powerpc/loongarch and integer vectorization only" { ! { { powerpc*-*-* || loongarch*-*-* } && vect_int } } } */
/* { dg-additional-options "-fdump-tree-optimized-details-blocks" } */
#include <stdarg.h>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-83.c b/gcc/testsuite/gcc.dg/vect/vect-83.c
index 1a173da..7fe1b05 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-83.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-83.c
@@ -1,4 +1,4 @@
-/* { dg-skip-if "powerpc and integer vectorization only" { ! { powerpc*-*-* && vect_int } } } */
+/* { dg-skip-if "powerpc/loongarch and integer vectorization only" { ! { { powerpc*-*-* || loongarch*-*-* } && vect_int } } } */
/* { dg-additional-options "-fdump-tree-optimized-details-blocks" } */
#include <stdarg.h>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-12.c b/gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-12.c
index 36ec5a8..213e4c2 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-12.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-12.c
@@ -1,5 +1,5 @@
/* { dg-skip-if "missing optab for vectorization" { sparc*-*-* } } */
-/* { dg-do assemble } */
+/* { dg-do compile } */
/* { dg-additional-options "-O3 -fdump-tree-dce -w" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-23.c b/gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-23.c
index 5b4c3b6..5dceb4b 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-23.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-bic-bitmask-23.c
@@ -1,5 +1,5 @@
/* { dg-skip-if "missing optab for vectorization" { sparc*-*-* } } */
-/* { dg-do assemble } */
+/* { dg-do compile } */
/* { dg-additional-options "-O1 -fdump-tree-dce -w" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c
index 5c32bf9..dec0b49 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_2.c
@@ -5,7 +5,7 @@
/* { dg-additional-options "-Ofast" } */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */
#include <complex.h>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c
index 8c86c50..d218a06 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_7.c
@@ -5,7 +5,7 @@
/* { dg-additional-options "-Ofast" } */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */
#include <complex.h>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c
index ed27f86..9dcc337 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_75.c
@@ -3,7 +3,7 @@
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-O3" } */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-*" } } } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "x86_64-*-* i?86-*-* arm*-*-*" } } } } */
#include <limits.h>
#include <assert.h>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c
index 225106a..9fa7e69 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_77.c
@@ -3,7 +3,7 @@
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-O3" } */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c
index 0e9b2d8..7cd21d3 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_82.c
@@ -5,7 +5,7 @@
/* { dg-additional-options "-Ofast" } */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */
#include <complex.h>
diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c b/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c
index b392dd4..59ed57c 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_88.c
@@ -3,7 +3,7 @@
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-Ofast --param vect-partial-vector-usage=2" } */
-/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target { ! "arm*-*-*" } } } } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c
index dfbb217..53c9b84 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-s16.c
@@ -2,6 +2,7 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-fno-ipa-icf" } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c
index c2ad58f..e9db828 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-const-u16.c
@@ -2,6 +2,7 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-fno-ipa-icf" } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c
index bfdcbaa..607f317 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half-u8.c
@@ -2,6 +2,7 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
/* { dg-additional-options "-fno-ipa-icf" } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c
index e46b0cc..cd13d82 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-half.c
@@ -1,6 +1,7 @@
/* Disabling epilogues until we find a better way to deal with scans. */
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c
index 14411ef..258d253 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u16.c
@@ -1,6 +1,7 @@
/* Disabling epilogues until we find a better way to deal with scans. */
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c
index f40def5..3baafca 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-s16-s32.c
@@ -1,6 +1,7 @@
/* Disabling epilogues until we find a better way to deal with scans. */
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c
index 6386639..bcfbe19 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8-u32.c
@@ -1,5 +1,6 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-* } } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c
index 78ad74b..e3bf13b 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-mult-u8.c
@@ -1,5 +1,6 @@
/* { dg-additional-options "--param vect-epilogues-nomask=0" } */
/* { dg-require-effective-target vect_int } */
+/* { dg-additional-options "-mlasx" { target loongarch*-*-*} } */
#include <stdarg.h>
#include "tree-vect.h"
diff --git a/gcc/testsuite/gcc.target/aarch64/pr113104.c b/gcc/testsuite/gcc.target/aarch64/pr113104.c
new file mode 100644
index 0000000..ff666184
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr113104.c
@@ -0,0 +1,25 @@
+/* { dg-options "-O3" } */
+
+#pragma GCC target "+nosve"
+
+int test(unsigned array[4][4]);
+
+int foo(unsigned short *a, unsigned long n)
+{
+ unsigned array[4][4];
+
+ for (unsigned i = 0; i < 4; i++, a += n)
+ {
+ array[i][0] = a[0] << 6;
+ array[i][1] = a[1] << 6;
+ array[i][2] = a[2] << 6;
+ array[i][3] = a[3] << 6;
+ }
+
+ return test(array);
+}
+
+/* { dg-final { scan-assembler-times {\tushll\t} 4 } } */
+/* { dg-final { scan-assembler-not {\tzip.\t} } } */
+/* { dg-final { scan-assembler-not {\tins\t} } } */
+/* { dg-final { scan-assembler-not {\tshl\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1.c b/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1.c
index d831e9c..2989f0c 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1_run.c b/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1_run.c
index 5808e0a..4689e28 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1_run.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_1_run.c
@@ -1,5 +1,5 @@
/* { dg-do run { target aarch64_sve_hw } } */
-/* { dg-options "-O2 -ftree-vectorize --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --param aarch64-vect-compare-costs=0" } */
#include "cond_arith_1.c"
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3.c b/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3.c
index 068e0b6..ec0723a 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3_run.c b/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3_run.c
index d258004..f4dbcd0 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3_run.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/cond_arith_3_run.c
@@ -1,5 +1,5 @@
/* { dg-do run { target aarch64_sve_hw } } */
-/* { dg-options "-O2 -ftree-vectorize --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --param aarch64-vect-compare-costs=0" } */
#include "cond_arith_3.c"
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/gather_load_6.c b/gcc/testsuite/gcc.target/aarch64/sve/gather_load_6.c
index 6fdd16b..b99b90b 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/gather_load_6.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/gather_load_6.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize -fwrapv --save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -fwrapv --save-temps --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/gather_load_7.c b/gcc/testsuite/gcc.target/aarch64/sve/gather_load_7.c
index 5a3f3e7..27eee8f 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/gather_load_7.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/gather_load_7.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize --save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --save-temps --param aarch64-vect-compare-costs=0" } */
#define INDEX16 uint16_t
#define INDEX32 uint32_t
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_2.c b/gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_2.c
index 0aab81b..7aec596 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_2.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_2.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize -save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -save-temps --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_3.c b/gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_3.c
index 5b306f7..7493208 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_3.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/load_const_offset_3.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize -save-temps -msve-vector-bits=256 --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -save-temps -msve-vector-bits=256 --param aarch64-vect-compare-costs=0" } */
#include "load_const_offset_2.c"
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_6.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_6.c
index a735e61..7f56a33 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_6.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_6.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --save-temps --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_7.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_7.c
index 687716e..c31fae3 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_7.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_gather_load_7.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --save-temps --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_load_slp_1.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_load_slp_1.c
index a38b92d..8a243ba 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_load_slp_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_load_slp_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c
index 450fbb8..44d443c 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c
index 499abd7..8d15989 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c
index a5ce071..31f3da5 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_3.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c
index bdfea96..b1d8063 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_load_4.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c
index 39fae68..77df7b0 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1_run.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1_run.c
index 2764d75..47b4cfb 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1_run.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_1_run.c
@@ -1,5 +1,5 @@
/* { dg-do run { target aarch64_sve_hw } } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
#include "mask_struct_store_1.c"
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c
index 0fe9b99..7ae3916 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2_run.c b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2_run.c
index 54cfaec..7469950 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2_run.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/mask_struct_store_2_run.c
@@ -1,5 +1,5 @@
/* { dg-do run { target aarch64_sve_hw } } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
#include "mask_struct_store_2.c"
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pack_1.c b/gcc/testsuite/gcc.target/aarch64/sve/pack_1.c
index 7c7bfdd..428e699 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/pack_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/pack_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/reduc_4.c b/gcc/testsuite/gcc.target/aarch64/sve/reduc_4.c
index b0260c9..8015908 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/reduc_4.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/reduc_4.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math --param aarch64-vect-compare-costs=0" } */
double
f (double *restrict a, double *restrict b, int *lookup)
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/scatter_store_6.c b/gcc/testsuite/gcc.target/aarch64/sve/scatter_store_6.c
index a9c37c4..9e7fb7d 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/scatter_store_6.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/scatter_store_6.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize -fwrapv --save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -fwrapv --save-temps --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/scatter_store_7.c b/gcc/testsuite/gcc.target/aarch64/sve/scatter_store_7.c
index 147eadc..d3a88ff 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/scatter_store_7.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/scatter_store_7.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize --save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --save-temps --param aarch64-vect-compare-costs=0" } */
#define INDEX16 uint16_t
#define INDEX32 uint32_t
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/strided_load_3.c b/gcc/testsuite/gcc.target/aarch64/sve/strided_load_3.c
index 2e7cd98..d8e3604 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/strided_load_3.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/strided_load_3.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize --save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --save-temps --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/strided_store_3.c b/gcc/testsuite/gcc.target/aarch64/sve/strided_store_3.c
index 335f99b..dc79fec 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/strided_store_3.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/strided_store_3.c
@@ -1,5 +1,5 @@
/* { dg-do assemble { target aarch64_asm_sve_ok } } */
-/* { dg-options "-O2 -ftree-vectorize --save-temps --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --save-temps --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_signed_1.c b/gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_signed_1.c
index 4c5e886..ccade4d 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_signed_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_signed_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -fno-inline --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -fno-inline --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_unsigned_1.c b/gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_unsigned_1.c
index 3ff2bd1..8911461 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_unsigned_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/unpack_fcvt_unsigned_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/unpack_signed_1.c b/gcc/testsuite/gcc.target/aarch64/sve/unpack_signed_1.c
index ecb6e99..d9e4414 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/unpack_signed_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/unpack_signed_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -fno-inline --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -fno-inline --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1.c b/gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1.c
index c4a022b..ef16346 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -fno-inline --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -fno-inline --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1_run.c b/gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1_run.c
index 6ee7e92..c541ea77 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1_run.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/unpack_unsigned_1_run.c
@@ -1,5 +1,5 @@
/* { dg-do run { target aarch64_sve_hw } } */
-/* { dg-options "-O2 -ftree-vectorize -fno-inline --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -fno-inline --param aarch64-vect-compare-costs=0" } */
#include "unpack_unsigned_1.c"
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vcond_11.c b/gcc/testsuite/gcc.target/aarch64/sve/vcond_11.c
index 4efcf3a..66c7664 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/vcond_11.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/vcond_11.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -march=armv8-a+sve --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -march=armv8-a+sve --param aarch64-vect-compare-costs=0" } */
#include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/vcond_11_run.c b/gcc/testsuite/gcc.target/aarch64/sve/vcond_11_run.c
index 4cbe4a6..60bb154 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/vcond_11_run.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/vcond_11_run.c
@@ -1,5 +1,5 @@
/* { dg-do run { target aarch64_sve_hw } } */
-/* { dg-options "-O2 -ftree-vectorize -march=armv8-a+sve --param aarch64-sve-compare-costs=0" } */
+/* { dg-options "-O2 -ftree-vectorize -march=armv8-a+sve --param aarch64-vect-compare-costs=0" } */
#include "vcond_11.c"
diff --git a/gcc/testsuite/gcc.target/arm/vect-early-break-cbranch.c b/gcc/testsuite/gcc.target/arm/vect-early-break-cbranch.c
new file mode 100644
index 0000000..f57bbd8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/vect-early-break-cbranch.c
@@ -0,0 +1,138 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_early_break } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-require-effective-target arm32 } */
+/* { dg-options "-O3 -march=armv8-a+simd -mfpu=auto -mfloat-abi=hard -fno-schedule-insns -fno-reorder-blocks -fno-schedule-insns2" } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
+
+#define N 640
+int a[N] = {0};
+int b[N] = {0};
+
+/*
+** f1:
+** ...
+** vcgt.s32 q[0-9]+, q[0-9]+, #0
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vmov r[0-9]+, s[0-9]+ @ int
+** cmp r[0-9]+, #0
+** bne \.L[0-9]+
+** ...
+*/
+void f1 ()
+{
+ for (int i = 0; i < N; i++)
+ {
+ b[i] += a[i];
+ if (a[i] > 0)
+ break;
+ }
+}
+
+/*
+** f2:
+** ...
+** vcge.s32 q[0-9]+, q[0-9]+, #0
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vmov r[0-9]+, s[0-9]+ @ int
+** cmp r[0-9]+, #0
+** bne \.L[0-9]+
+** ...
+*/
+void f2 ()
+{
+ for (int i = 0; i < N; i++)
+ {
+ b[i] += a[i];
+ if (a[i] >= 0)
+ break;
+ }
+}
+
+/*
+** f3:
+** ...
+** vceq.i32 q[0-9]+, q[0-9]+, #0
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vmov r[0-9]+, s[0-9]+ @ int
+** cmp r[0-9]+, #0
+** bne \.L[0-9]+
+** ...
+*/
+void f3 ()
+{
+ for (int i = 0; i < N; i++)
+ {
+ b[i] += a[i];
+ if (a[i] == 0)
+ break;
+ }
+}
+
+/*
+** f4:
+** ...
+** vceq.i32 q[0-9]+, q[0-9]+, #0
+** vmvn q[0-9]+, q[0-9]+
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vmov r[0-9]+, s[0-9]+ @ int
+** cmp r[0-9]+, #0
+** bne \.L[0-9]+
+** ...
+*/
+void f4 ()
+{
+ for (int i = 0; i < N; i++)
+ {
+ b[i] += a[i];
+ if (a[i] != 0)
+ break;
+ }
+}
+
+/*
+** f5:
+** ...
+** vclt.s32 q[0-9]+, q[0-9]+, #0
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vmov r[0-9]+, s[0-9]+ @ int
+** cmp r[0-9]+, #0
+** bne \.L[0-9]+
+** ...
+*/
+void f5 ()
+{
+ for (int i = 0; i < N; i++)
+ {
+ b[i] += a[i];
+ if (a[i] < 0)
+ break;
+ }
+}
+
+/*
+** f6:
+** ...
+** vcle.s32 q[0-9]+, q[0-9]+, #0
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vpmax.u32 d[0-9]+, d[0-9]+, d[0-9]+
+** vmov r[0-9]+, s[0-9]+ @ int
+** cmp r[0-9]+, #0
+** bne \.L[0-9]+
+** ...
+*/
+void f6 ()
+{
+ for (int i = 0; i < N; i++)
+ {
+ b[i] += a[i];
+ if (a[i] <= 0)
+ break;
+ }
+}
+
diff --git a/gcc/testsuite/gcc.target/avr/lra-cpymem_qi.c b/gcc/testsuite/gcc.target/avr/lra-cpymem_qi.c
index fdffb44..31cf200 100644
--- a/gcc/testsuite/gcc.target/avr/lra-cpymem_qi.c
+++ b/gcc/testsuite/gcc.target/avr/lra-cpymem_qi.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-mmcu=avr51 -Os" } */
+/* { dg-options "-Os" } */
#include <stdbool.h>
diff --git a/gcc/testsuite/gcc.target/avr/lra-elim.c b/gcc/testsuite/gcc.target/avr/lra-elim.c
index d5086a7..8d5dbf8 100644
--- a/gcc/testsuite/gcc.target/avr/lra-elim.c
+++ b/gcc/testsuite/gcc.target/avr/lra-elim.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-mmcu=avr25 -Os" } */
+/* { dg-options "-Os" } */
typedef int HItype __attribute__ ((mode (HI)));
HItype
diff --git a/gcc/testsuite/gcc.target/avr/pr112830.c b/gcc/testsuite/gcc.target/avr/pr112830.c
index c305dae..dd70dd0 100644
--- a/gcc/testsuite/gcc.target/avr/pr112830.c
+++ b/gcc/testsuite/gcc.target/avr/pr112830.c
@@ -1,4 +1,4 @@
-/* { dg-do compile } */
+/* { dg-do compile { target { ! avr_tiny } } } */
/* { dg-options "" } */
typedef __SIZE_TYPE__ size_t;
diff --git a/gcc/testsuite/gcc.target/avr/pr46779-1.c b/gcc/testsuite/gcc.target/avr/pr46779-1.c
index 24522f1..e3e0b29 100644
--- a/gcc/testsuite/gcc.target/avr/pr46779-1.c
+++ b/gcc/testsuite/gcc.target/avr/pr46779-1.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target { ! avr_tiny } } } */
/* { dg-options "-Os -fsplit-wide-types" } */
/* This testcase should uncover bugs like
diff --git a/gcc/testsuite/gcc.target/avr/pr46779-2.c b/gcc/testsuite/gcc.target/avr/pr46779-2.c
index 682070b..557cc74 100644
--- a/gcc/testsuite/gcc.target/avr/pr46779-2.c
+++ b/gcc/testsuite/gcc.target/avr/pr46779-2.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target { ! avr_tiny } } } */
/* { dg-options "-Os -fno-split-wide-types" } */
/* This testcase should uncover bugs like
diff --git a/gcc/testsuite/gcc.target/avr/pr86869.c b/gcc/testsuite/gcc.target/avr/pr86869.c
index fbfb378..a5de4cc 100644
--- a/gcc/testsuite/gcc.target/avr/pr86869.c
+++ b/gcc/testsuite/gcc.target/avr/pr86869.c
@@ -1,4 +1,5 @@
-/* { dg-do compile } */
+/* { dg-do compile { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -w" } */
struct S {
char y[2];
diff --git a/gcc/testsuite/gcc.target/avr/pr89270.c b/gcc/testsuite/gcc.target/avr/pr89270.c
index 2b6e4a8..5b43218 100644
--- a/gcc/testsuite/gcc.target/avr/pr89270.c
+++ b/gcc/testsuite/gcc.target/avr/pr89270.c
@@ -1,4 +1,5 @@
-/* { dg-do compile } */
+/* { dg-do compile { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99" } */
void test()
{
diff --git a/gcc/testsuite/gcc.target/avr/torture/addr-space-1-1.c b/gcc/testsuite/gcc.target/avr/torture/addr-space-1-1.c
index e90bdcb..4812f67 100644
--- a/gcc/testsuite/gcc.target/avr/torture/addr-space-1-1.c
+++ b/gcc/testsuite/gcc.target/avr/torture/addr-space-1-1.c
@@ -1,6 +1,10 @@
/* { dg-options "-std=gnu99 -Tavr51-flash1.x" } */
/* { dg-do run { target { ! avr_tiny } } } */
+#ifdef __FLASH1
#define __as __flash1
+#else
+#define __as __flash
+#endif
#include "addr-space-1.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/addr-space-2-1.c b/gcc/testsuite/gcc.target/avr/torture/addr-space-2-1.c
index 327124a..d5fcf0a 100644
--- a/gcc/testsuite/gcc.target/avr/torture/addr-space-2-1.c
+++ b/gcc/testsuite/gcc.target/avr/torture/addr-space-2-1.c
@@ -1,6 +1,10 @@
/* { dg-options "-std=gnu99 -Tavr51-flash1.x" } */
/* { dg-do run { target { ! avr_tiny } } } */
+#ifdef __FLASH1
#define __as __flash1
+#else
+#define __as __flash
+#endif
#include "addr-space-2.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/builtins-2-flash.c b/gcc/testsuite/gcc.target/avr/torture/builtins-2-flash.c
index 318551d..11dba67 100644
--- a/gcc/testsuite/gcc.target/avr/torture/builtins-2-flash.c
+++ b/gcc/testsuite/gcc.target/avr/torture/builtins-2-flash.c
@@ -4,7 +4,9 @@
#include <stdlib.h>
const __flash char c0 = 1;
+#ifdef __FLASH1
const __flash1 char c1 = 1;
+#endif
int main (void)
{
@@ -14,9 +16,11 @@ int main (void)
if (__builtin_avr_flash_segment (p) != 0)
abort();
+#ifdef __FLASH1
p = &c1;
if (__builtin_avr_flash_segment (p) != 1)
abort();
+#endif
if (__builtin_avr_flash_segment ("p") != -1)
abort();
diff --git a/gcc/testsuite/gcc.target/i386/pr113231.c b/gcc/testsuite/gcc.target/i386/pr113231.c
new file mode 100644
index 0000000..f9dcd9a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr113231.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+void foo(int *i) { *i *= 2; }
+void bar(int *i) { *i <<= 2; }
+void baz(int *i) { *i >>= 2; }
+
+/* { dg-final { scan-assembler-not "movd" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr90693-2.c b/gcc/testsuite/gcc.target/i386/pr90693-2.c
new file mode 100644
index 0000000..3cfeccb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr90693-2.c
@@ -0,0 +1,33 @@
+/* PR tree-optimization/90693 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mno-abm -mno-popcnt -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-not "POPCOUNT \\\(" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "__builtin_popcount(ll)? \\\(" "optimized" } } */
+
+int
+foo (unsigned int x)
+{
+ if (x == 0)
+ __builtin_unreachable ();
+ return __builtin_popcount (x) == 1;
+}
+
+int
+bar (unsigned int x)
+{
+ return (x & (x - 1)) == 0;
+}
+
+int
+baz (unsigned long long x)
+{
+ if (x == 0)
+ __builtin_unreachable ();
+ return __builtin_popcountll (x) == 1;
+}
+
+int
+qux (unsigned long long x)
+{
+ return (x & (x - 1)) == 0;
+}
diff --git a/gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c b/gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c
new file mode 100644
index 0000000..bfc208e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/vect-ld-st-imm12.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-march=loongarch64 -mabi=lp64d -mlasx -O2" } */
+/* { dg-final { scan-assembler-not "addi.d" } } */
+
+extern short a[1000];
+extern short b[1000];
+extern short c[1000];
+
+void
+test (void)
+{
+ for (int i = 501; i < 517; i++)
+ ((int *)(c + 1))[i] = ((int *)(a + 1))[i] + ((int *)(b + 1))[i];
+}
+
diff --git a/gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-xvpermi_q.c b/gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-xvpermi_q.c
new file mode 100644
index 0000000..dbc29d2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-xvpermi_q.c
@@ -0,0 +1,64 @@
+/* { dg-options "-mlasx -w -fno-strict-aliasing" } */
+#include "../simd_correctness_check.h"
+#include <lasxintrin.h>
+
+int
+main ()
+{
+ __m256i __m256i_op0, __m256i_op1, __m256i_op2, __m256i_out, __m256i_result;
+ __m256 __m256_op0, __m256_op1, __m256_op2, __m256_out, __m256_result;
+ __m256d __m256d_op0, __m256d_op1, __m256d_op2, __m256d_out, __m256d_result;
+
+ int int_op0, int_op1, int_op2, int_out, int_result, i = 1, fail;
+ long int long_op0, long_op1, long_op2, lont_out, lont_result;
+ long int long_int_out, long_int_result;
+ unsigned int unsigned_int_out, unsigned_int_result;
+ unsigned long int unsigned_long_int_out, unsigned_long_int_result;
+
+ *((unsigned long*)& __m256i_op0[3]) = 0x7fe37fe3001d001d;
+ *((unsigned long*)& __m256i_op0[2]) = 0x7fff7fff7fff0000;
+ *((unsigned long*)& __m256i_op0[1]) = 0x7fe37fe3001d001d;
+ *((unsigned long*)& __m256i_op0[0]) = 0x7fff7fff7fff0000;
+ *((unsigned long*)& __m256i_op1[3]) = 0x7575757575757575;
+ *((unsigned long*)& __m256i_op1[2]) = 0x7575757575757575;
+ *((unsigned long*)& __m256i_op1[1]) = 0x7575757575757575;
+ *((unsigned long*)& __m256i_op1[0]) = 0x7575757575757575;
+ *((unsigned long*)& __m256i_result[3]) = 0x7fe37fe3001d001d;
+ *((unsigned long*)& __m256i_result[2]) = 0x7fff7fff7fff0000;
+ *((unsigned long*)& __m256i_result[1]) = 0x7fe37fe3001d001d;
+ *((unsigned long*)& __m256i_result[0]) = 0x7fff7fff7fff0000;
+ __m256i_out = __lasx_xvpermi_q (__m256i_op0, __m256i_op1, 0x2a);
+ ASSERTEQ_64 (__LINE__, __m256i_result, __m256i_out);
+
+ *((unsigned long*)& __m256i_op0[3]) = 0x0000000000000000;
+ *((unsigned long*)& __m256i_op0[2]) = 0x000000000019001c;
+ *((unsigned long*)& __m256i_op0[1]) = 0x0000000000000000;
+ *((unsigned long*)& __m256i_op0[0]) = 0x000000000019001c;
+ *((unsigned long*)& __m256i_op1[3]) = 0x0000000000000000;
+ *((unsigned long*)& __m256i_op1[2]) = 0x00000000000001fe;
+ *((unsigned long*)& __m256i_op1[1]) = 0x0000000000000000;
+ *((unsigned long*)& __m256i_op1[0]) = 0x00000000000001fe;
+ *((unsigned long*)& __m256i_result[3]) = 0x0000000000000000;
+ *((unsigned long*)& __m256i_result[2]) = 0x000000000019001c;
+ *((unsigned long*)& __m256i_result[1]) = 0x0000000000000000;
+ *((unsigned long*)& __m256i_result[0]) = 0x00000000000001fe;
+ __m256i_out = __lasx_xvpermi_q (__m256i_op0, __m256i_op1, 0xb9);
+ ASSERTEQ_64 (__LINE__, __m256i_result, __m256i_out);
+
+ *((unsigned long*)& __m256i_op0[3]) = 0x00ff00ff00ff00ff;
+ *((unsigned long*)& __m256i_op0[2]) = 0x00ff00ff00ff00ff;
+ *((unsigned long*)& __m256i_op0[1]) = 0x00ff00ff00ff00ff;
+ *((unsigned long*)& __m256i_op0[0]) = 0x00ff00ff00ff00ff;
+ *((unsigned long*)& __m256i_op1[3]) = 0xffffffffffffffff;
+ *((unsigned long*)& __m256i_op1[2]) = 0xffff0000ffff0000;
+ *((unsigned long*)& __m256i_op1[1]) = 0xffffffffffffffff;
+ *((unsigned long*)& __m256i_op1[0]) = 0xffff0000ffff0000;
+ *((unsigned long*)& __m256i_result[3]) = 0xffffffffffffffff;
+ *((unsigned long*)& __m256i_result[2]) = 0xffff0000ffff0000;
+ *((unsigned long*)& __m256i_result[1]) = 0x00ff00ff00ff00ff;
+ *((unsigned long*)& __m256i_result[0]) = 0x00ff00ff00ff00ff;
+ __m256i_out = __lasx_xvpermi_q (__m256i_op0, __m256i_op1, 0xca);
+ ASSERTEQ_64 (__LINE__, __m256i_result, __m256i_out);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-xvpremi.c b/gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-xvpremi.c
deleted file mode 100644
index e9fc1d7..0000000
--- a/gcc/testsuite/gcc.target/loongarch/vector/lasx/lasx-xvpremi.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* { dg-options "-mlasx -w -fno-strict-aliasing" } */
-#include "../simd_correctness_check.h"
-#include <lasxintrin.h>
-
-int
-main ()
-{
- __m256i __m256i_op0, __m256i_op1, __m256i_op2, __m256i_out, __m256i_result;
- __m256 __m256_op0, __m256_op1, __m256_op2, __m256_out, __m256_result;
- __m256d __m256d_op0, __m256d_op1, __m256d_op2, __m256d_out, __m256d_result;
-
- int int_op0, int_op1, int_op2, int_out, int_result, i = 1, fail;
- long int long_op0, long_op1, long_op2, lont_out, lont_result;
- long int long_int_out, long_int_result;
- unsigned int unsigned_int_out, unsigned_int_result;
- unsigned long int unsigned_long_int_out, unsigned_long_int_result;
-
- return 0;
-}
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-scalar-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-scalar-template.h
index 8d1cefd..2cf645a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-scalar-template.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/shift-scalar-template.h
@@ -3,7 +3,6 @@
/* { dg-additional-options "-std=c99 --param=riscv-autovec-preference=scalable -fno-vect-cost-model --save-temps" } */
#include <stdint-gcc.h>
-#include <assert.h>
#define SHIFTL(TYPE,VAL) \
__attribute__ ((noipa)) \
@@ -64,7 +63,7 @@ TEST_ALL()
a##TYPE##VAL[i] = 2; \
vsll_##TYPE_##VAL (a##TYPE##VAL, SZ); \
for (int i = 0; i < SZ; i++) \
- assert (a##TYPE##VAL[i] == (2ll << VAL));
+ if (a##TYPE##VAL[i] != (2ll << VAL)) __builtin_abort ();
__attribute__((noipa))
void vsllvx (uint32_t *dst, int val, int n)
@@ -79,7 +78,7 @@ void vsllvx (uint32_t *dst, int val, int n)
a[i] = 2; \
vsllvx (a, 17, SZ); \
for (int i = 0; i < SZ; i++) \
- assert (a[i] == (2 << 17));
+ if (a[i] != (2 << 17)) __builtin_abort ();
int main ()
{
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-1.c
index 25c35cf..fedee13 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-1.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#ifndef FN
#define FN(X) __builtin_fmax##X
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-2.c
index 17f8623..76f69e4 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-2.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-2.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#ifndef FN
#define FN(X) __builtin_fmax##X
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-3.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-3.c
index 9a29b52..bb8d1ae 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-3.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#ifndef FN
#define FN(X) __builtin_fmax##X
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-4.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-4.c
index cba6cdf..e4bb383 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax-4.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#ifndef FN
#define FN(X) __builtin_fmax##X
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-1.c
index c6929a7..1afa2f2 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-1.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#ifndef FN
#define FN(X) __builtin_fmax##X
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-2.c
index b8a1841..23762b7 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-2.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-2.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#ifndef FN
#define FN(X) __builtin_fmax##X
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-3.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-3.c
index af06f11..1837fda 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-3.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#ifndef FN
#define FN(X) __builtin_fmax##X
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-4.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-4.c
index e6a5a76..766e42c 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmax_zvfh-4.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#ifndef FN
#define FN(X) __builtin_fmax##X
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-1.c
index 2c8fbfb..59b22db 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-1.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#define FN(X) __builtin_fmin##X
#include "cond_fmax-1.c"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-2.c
index fe04554..500c4bc 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-2.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-2.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#define FN(X) __builtin_fmin##X
#include "cond_fmax-2.c"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-3.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-3.c
index e76361c..85b9238 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-3.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#define FN(X) __builtin_fmin##X
#include "cond_fmax-3.c"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-4.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-4.c
index 9399a40..5ec7fd7 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin-4.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#define FN(X) __builtin_fmin##X
#include "cond_fmax-4.c"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-1.c
index 77bc6e7..a839dc3 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-1.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#define FN(X) __builtin_fmin##X
#include "cond_fmax_zvfh-1.c"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-2.c
index 8e330af..7a3fca2 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-2.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-2.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#define FN(X) __builtin_fmin##X
#include "cond_fmax_zvfh-2.c"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-3.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-3.c
index 5caeac9..ed04936 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-3.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#define FN(X) __builtin_fmin##X
#include "cond_fmax_zvfh-3.c"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-4.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-4.c
index 8281dc6..3ba72d2 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_fmin_zvfh-4.c
@@ -2,7 +2,6 @@
/* { dg-additional-options "-march=rv32gcv_zvfh -mabi=ilp32d --param=riscv-autovec-preference=scalable -fno-vect-cost-model -fno-signaling-nans" } */
#include <stdint-gcc.h>
-#include <math.h>
#define FN(X) __builtin_fmin##X
#include "cond_fmax_zvfh-4.c"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-2.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-2.h
index a94f3eb..f30b3e2 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-2.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-2.h
@@ -1,4 +1,3 @@
-#include <assert.h>
#include <stdint-gcc.h>
#define N 777
@@ -25,9 +24,13 @@
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond_##TYPE[i] && i < 8) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define TEST_ALL(T) \
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-3.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-3.h
index e60e0b1..dfe48d6 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-3.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/single_rgroup-3.h
@@ -1,4 +1,3 @@
-#include <assert.h>
#include <stdint-gcc.h>
#define N 777
@@ -22,9 +21,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 5) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_2(TYPE) \
@@ -34,9 +37,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 17) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_3(TYPE) \
@@ -46,9 +53,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 32) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_4(TYPE) \
@@ -58,9 +69,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 128) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_5(TYPE) \
@@ -70,9 +85,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 177) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_6(TYPE) \
@@ -82,9 +101,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 255) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_7(TYPE) \
@@ -94,9 +117,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 333) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_8(TYPE) \
@@ -106,9 +133,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 512) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_9(TYPE) \
@@ -118,9 +149,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 637) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define run_10(TYPE) \
@@ -130,9 +165,13 @@ int cond[N] = {0};
for (unsigned int i = 0; i < N; i++) \
{ \
if (cond[i] && i < 777) \
- assert (b_##TYPE[i] == a_##TYPE[i]); \
+ { \
+ if (b_##TYPE[i] != a_##TYPE[i]) __builtin_abort(); \
+ } \
else \
- assert (b_##TYPE[i] == 0); \
+ { \
+ if (b_##TYPE[i] != 0) __builtin_abort(); \
+ } \
}
#define TEST_ALL(T) \
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112694-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112694-1.c
index 8c7f7a9..f50df65 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112694-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr112694-1.c
@@ -16,8 +16,6 @@
TEST_ALL()
-#include <assert.h>
-
#define SZ 512
#define RUN(TYPE, VAL) \
@@ -30,7 +28,7 @@ TEST_ALL()
} \
vmul_##TYPE (a##TYPE, a##TYPE, b##TYPE, SZ); \
for (int i = 0; i < SZ; i++) \
- assert (a##TYPE[i] == 2 * VAL);
+ if (a##TYPE[i] != 2 * VAL) __builtin_abort ();
#define RUN_ALL() \
RUN(_Float16, 4) \
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/abs-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/abs-template.h
index 08bd5b3..851515e 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/abs-template.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/abs-template.h
@@ -1,4 +1,3 @@
-#include <stdlib.h>
#include <stdint-gcc.h>
#define TEST_TYPE(TYPE) \
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vneg-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vneg-template.h
index 892d9d7..e4e5e71 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vneg-template.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vneg-template.h
@@ -1,4 +1,3 @@
-#include <stdlib.h>
#include <stdint-gcc.h>
#define TEST_TYPE(TYPE) \
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vnot-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vnot-template.h
index 747375e..1eedcc0 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vnot-template.h
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/vnot-template.h
@@ -1,4 +1,3 @@
-#include <stdlib.h>
#include <stdint-gcc.h>
#define TEST_TYPE(TYPE) \
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/vf_avl-4.c b/gcc/testsuite/gcc.target/riscv/rvv/base/vf_avl-4.c
new file mode 100644
index 0000000..1b4bfd9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/vf_avl-4.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d --param riscv-autovec-preference=fixed-vlmax" } */
+
+#include "riscv_vector.h"
+void
+f (float x, float y, void *out)
+{
+ float f[4] = { x, x, x, y };
+ vfloat32m1_t v = __riscv_vle32_v_f32m1 (f, 4);
+ __riscv_vse32_v_f32m1 (out, v, 4);
+}
+
+/* { dg-final { scan-assembler-not {vmv} } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/pr113248.c b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/pr113248.c
new file mode 100644
index 0000000..b3b5061
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/pr113248.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-mtune=generic-ooo --param=riscv-autovec-preference=scalable -march=rv32gc_zve64f_zvfh -mabi=ilp32d -O3" } */
+
+#include "riscv_vector.h"
+
+void foo(_Float16 y, int64_t *i64p)
+{
+ vint64m1_t vx =__riscv_vle64_v_i64m1 (i64p, 1);
+ vx = __riscv_vadd_vv_i64m1 (vx, vx, 1);
+ vfloat16m1_t vy =__riscv_vfmv_s_f_f16m1 (y, 1);
+ asm volatile ("# use %0 %1" : : "vr"(vx), "vr" (vy));
+}
+
+/* { dg-final { scan-assembler-times {vsetivli\s+zero,\s*1,\s*e16,\s*mf4,\s*t[au],\s*m[au]} 1 } } */
+/* { dg-final { scan-assembler-times {vsetvli\s+zero,\s*zero,\s*e64,\s*m1,\s*t[au],\s*m[au]} 1 } } */
diff --git a/gcc/testsuite/gfortran.dg/bind_c_array_params_2.f90 b/gcc/testsuite/gfortran.dg/bind_c_array_params_2.f90
index 0825efc..aa6a37b 100644
--- a/gcc/testsuite/gfortran.dg/bind_c_array_params_2.f90
+++ b/gcc/testsuite/gfortran.dg/bind_c_array_params_2.f90
@@ -2,6 +2,7 @@
! { dg-options "-std=f2008ts -fdump-tree-original" }
! { dg-additional-options "-mno-explicit-relocs" { target alpha*-*-* } }
! { dg-additional-options "-mno-relax-pic-calls" { target mips*-*-* } }
+! { dg-additional-options "-fplt -mcmodel=normal" { target loongarch*-*-* } }
!
! Check that assumed-shape variables are correctly passed to BIND(C)
! as defined in TS 29913
@@ -16,7 +17,8 @@ integer :: aa(4,4)
call test(aa)
end
-! { dg-final { scan-assembler-times "\[ \t\]\[$,_0-9\]*myBindC" 1 { target { ! { hppa*-*-* s390*-*-* *-*-cygwin* amdgcn*-*-* powerpc-ibm-aix* *-*-ming* } } } } }
+! { dg-final { scan-assembler-times "\[ \t\]\[$,_0-9\]*myBindC" 1 { target { ! { hppa*-*-* s390*-*-* *-*-cygwin* amdgcn*-*-* powerpc-ibm-aix* *-*-ming* loongarch*-*-* } } } } }
+! { dg-final { scan-assembler-times "bl\t%plt\\(myBindC\\)" 1 { target loongarch*-*-* } } }
! { dg-final { scan-assembler-times "myBindC,%r2" 1 { target { hppa*-*-* } } } }
! { dg-final { scan-assembler-times "call\tmyBindC" 1 { target { *-*-cygwin* *-*-ming* } } } }
! { dg-final { scan-assembler-times "brasl\t%r\[0-9\]*,myBindC" 1 { target { s390*-*-* } } } }
diff --git a/gcc/testsuite/gfortran.dg/dtio_25.f90 b/gcc/testsuite/gfortran.dg/dtio_25.f90
index 8ca0848..1de7dc0 100644
--- a/gcc/testsuite/gfortran.dg/dtio_25.f90
+++ b/gcc/testsuite/gfortran.dg/dtio_25.f90
@@ -50,7 +50,7 @@ program p
namelist /nml/ x
x = t('a', 5)
write (buffer, nml)
- if (buffer.ne.'&NML X=a, 5 /') STOP 1
+ if (buffer.ne.' &NML X=a, 5 /') STOP 1
x = t('x', 0)
read (buffer, nml)
if (x%c.ne.'a'.or. x%k.ne.5) STOP 2
diff --git a/gcc/testsuite/gfortran.dg/namelist_57.f90 b/gcc/testsuite/gfortran.dg/namelist_57.f90
index a72b866..8f4c4ed 100644
--- a/gcc/testsuite/gfortran.dg/namelist_57.f90
+++ b/gcc/testsuite/gfortran.dg/namelist_57.f90
@@ -6,7 +6,7 @@
n = 123
line = ""
write(line,nml=stuff)
- if (line(1) .ne. "&STUFF") STOP 1
+ if (line(1) .ne. " &STUFF") STOP 1
if (line(2) .ne. " N=123 ,") STOP 2
if (line(3) .ne. " /") STOP 3
end
diff --git a/gcc/testsuite/gfortran.dg/namelist_65.f90 b/gcc/testsuite/gfortran.dg/namelist_65.f90
index 2ca67f2..424c722 100644
--- a/gcc/testsuite/gfortran.dg/namelist_65.f90
+++ b/gcc/testsuite/gfortran.dg/namelist_65.f90
@@ -13,7 +13,7 @@ do i=1,len(out)
enddo
write(out,nl1)
-if (out(1).ne."&NL1") STOP 1
+if (out(1).ne." &NL1") STOP 1
if (out(2).ne." A= 1.00000000 ,") STOP 2
if (out(3).ne." B= 2.00000000 ,") STOP 3
if (out(4).ne." C= 3.00000000 ,") STOP 4
diff --git a/gcc/testsuite/gfortran.dg/repeat_8.f90 b/gcc/testsuite/gfortran.dg/repeat_8.f90
new file mode 100644
index 0000000..9dd379a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/repeat_8.f90
@@ -0,0 +1,123 @@
+! { dg-do compile }
+! { dg-additional-options "-Wconversion-extra" }
+!
+! Test fix for PR fortran/96724
+!
+! Contributed by José Rui Faustino de Sousa
+
+program repeat_p
+ use, intrinsic :: iso_fortran_env, only: int8, int16, int32, int64
+ implicit none
+
+ integer, parameter :: n = 20
+ integer, parameter :: ucs4 = selected_char_kind ('ISO_10646')
+
+ integer(kind=int8), parameter :: p08 = int(n, kind=int8)
+ integer(kind=int16), parameter :: p16 = int(n, kind=int16)
+ integer(kind=int16), parameter :: p32 = int(n, kind=int32)
+ integer(kind=int16), parameter :: p64 = int(n, kind=int64)
+
+ integer(kind=int8) :: i08
+ integer(kind=int16) :: i16
+ integer(kind=int32) :: i32
+ integer(kind=int64) :: i64
+
+ character(len=n,kind=1) :: c
+ character(len=n,kind=ucs4) :: d
+
+ i08 = p08
+ c = repeat('X', 20_int8)
+ c = repeat('X', i08)
+ c = repeat('X', p08)
+ c = repeat('X', len08(c))
+ d = repeat(ucs4_'X', 20_int8)
+ d = repeat(ucs4_'X', i08)
+ d = repeat(ucs4_'X', p08)
+ d = repeat(ucs4_'X', len08(c))
+ i16 = p16
+ c = repeat('X', 20_int16)
+ c = repeat('X', i16)
+ c = repeat('X', p16)
+ c = repeat('X', len16(c))
+ d = repeat(ucs4_'X', 20_int16)
+ d = repeat(ucs4_'X', i16)
+ d = repeat(ucs4_'X', p16)
+ d = repeat(ucs4_'X', len16(c))
+ i32 = p32
+ c = repeat('X', 20_int32)
+ c = repeat('X', i32)
+ c = repeat('X', p32)
+ c = repeat('X', len32(c))
+ d = repeat(ucs4_'X', 20_int32)
+ d = repeat(ucs4_'X', i32)
+ d = repeat(ucs4_'X', p32)
+ d = repeat(ucs4_'X', len32(c))
+ i64 = p64
+ c = repeat('X', 20_int64)
+ c = repeat('X', i64)
+ c = repeat('X', p64)
+ c = repeat('X', len64(c))
+ d = repeat(ucs4_'X', 20_int64)
+ d = repeat(ucs4_'X', i64)
+ d = repeat(ucs4_'X', p64)
+ d = repeat(ucs4_'X', len64(c))
+
+contains
+
+ function len08(x) result(l)
+ character(len=*), intent(in) :: x
+ integer(kind=int8) :: l
+
+ l = int(len(x), kind=int8)
+ end function len08
+
+ function len16(x) result(l)
+ character(len=*), intent(in) :: x
+ integer(kind=int16) :: l
+
+ l = int(len(x), kind=int16)
+ end function len16
+
+ function len32(x) result(l)
+ character(len=*), intent(in) :: x
+ integer(kind=int32) :: l
+
+ l = int(len(x), kind=int32)
+ end function len32
+
+ function len64(x) result(l)
+ character(len=*), intent(in) :: x
+ integer(kind=int64) :: l
+
+ l = int(len(x), kind=int64)
+ end function len64
+
+ function ulen08(x) result(l)
+ character(len=*,kind=ucs4), intent(in) :: x
+ integer(kind=int8) :: l
+
+ l = int(len(x), kind=int8)
+ end function ulen08
+
+ function ulen16(x) result(l)
+ character(len=*,kind=ucs4), intent(in) :: x
+ integer(kind=int16) :: l
+
+ l = int(len(x), kind=int16)
+ end function ulen16
+
+ function ulen32(x) result(l)
+ character(len=*,kind=ucs4), intent(in) :: x
+ integer(kind=int32) :: l
+
+ l = int(len(x), kind=int32)
+ end function ulen32
+
+ function ulen64(x) result(l)
+ character(len=*,kind=ucs4), intent(in) :: x
+ integer(kind=int64) :: l
+
+ l = int(len(x), kind=int64)
+ end function ulen64
+
+end program repeat_p
diff --git a/gcc/testsuite/gfortran.dg/vect/pr60510.f b/gcc/testsuite/gfortran.dg/vect/pr60510.f
index 6cae82a..d4fd42a 100644
--- a/gcc/testsuite/gfortran.dg/vect/pr60510.f
+++ b/gcc/testsuite/gfortran.dg/vect/pr60510.f
@@ -1,4 +1,3 @@
-! { dg-do run }
! { dg-require-effective-target vect_double }
! { dg-require-effective-target vect_intdouble_cvt }
! { dg-additional-options "-fno-inline -ffast-math" }
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 1b4a3fb..b27c30b 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -3815,7 +3815,11 @@ proc add_options_for_bfloat16 { flags } {
# (fma, fms, fnma, and fnms) for both float and double.
proc check_effective_target_scalar_all_fma { } {
- return [istarget aarch64*-*-*]
+ if { [istarget aarch64*-*-*]
+ || [istarget loongarch*-*-*]} {
+ return 1
+ }
+ return 0
}
# Return 1 if the target supports compiling fixed-point,
@@ -4051,6 +4055,8 @@ proc check_effective_target_vect_int { } {
&& [check_effective_target_s390_vx])
|| ([istarget riscv*-*-*]
&& [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx])
}}]
}
@@ -4063,6 +4069,7 @@ proc check_effective_target_vect_early_break { } {
return [check_cached_effective_target_indexed vect_early_break {
expr {
[istarget aarch64*-*-*]
+ || [check_effective_target_arm_v8_neon_ok]
|| [check_effective_target_sse4]
}}]
}
@@ -4076,6 +4083,7 @@ proc check_effective_target_vect_early_break_hw { } {
return [check_cached_effective_target_indexed vect_early_break_hw {
expr {
[istarget aarch64*-*-*]
+ || [check_effective_target_arm_v8_neon_hw]
|| [check_sse4_hw_available]
}}]
}
@@ -4085,6 +4093,11 @@ proc add_options_for_vect_early_break { flags } {
return "$flags"
}
+ if { [check_effective_target_arm_v8_neon_ok] } {
+ global et_arm_v8_neon_flags
+ return "$flags $et_arm_v8_neon_flags -march=armv8-a"
+ }
+
if { [check_effective_target_sse4] } {
return "$flags -msse4.1"
}
@@ -4218,7 +4231,9 @@ proc check_effective_target_vect_intfloat_cvt { } {
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vxe2])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports signed double->int conversion
@@ -4239,7 +4254,9 @@ proc check_effective_target_vect_doubleint_cvt { } {
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports signed int->double conversion
@@ -4260,7 +4277,9 @@ proc check_effective_target_vect_intdouble_cvt { } {
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
#Return 1 if we're supporting __int128 for target, 0 otherwise.
@@ -4293,7 +4312,9 @@ proc check_effective_target_vect_uintfloat_cvt { } {
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vxe2])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
@@ -4312,7 +4333,9 @@ proc check_effective_target_vect_floatint_cvt { } {
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vxe2])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports unsigned float->int conversion
@@ -4329,7 +4352,9 @@ proc check_effective_target_vect_floatuint_cvt { } {
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vxe2])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports vector integer char -> long long extend optab
@@ -4338,7 +4363,9 @@ proc check_effective_target_vect_floatuint_cvt { } {
proc check_effective_target_vect_ext_char_longlong { } {
return [check_cached_effective_target_indexed vect_ext_char_longlong {
expr { ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if peeling for alignment might be profitable on the target
@@ -7462,7 +7489,9 @@ proc check_effective_target_vect_shift { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports hardware vector shift by register operation.
@@ -7474,6 +7503,8 @@ proc check_effective_target_vect_var_shift { } {
|| [istarget aarch64*-*-*]
|| ([istarget riscv*-*-*]
&& [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx])
}}]
}
@@ -7490,7 +7521,9 @@ proc check_effective_target_whole_vector_shift { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) } {
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) } {
set answer 1
} else {
set answer 0
@@ -7507,6 +7540,7 @@ proc check_effective_target_vect_bswap { } {
expr { ([istarget aarch64*-*-*]
|| [is-effective-target arm_neon]
|| [istarget amdgcn-*-*])
+ || [istarget loongarch*-*-*]
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx]) }}]
}
@@ -7520,7 +7554,9 @@ proc check_effective_target_vect_bool_cmp { } {
|| [istarget aarch64*-*-*]
|| [is-effective-target arm_neon]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports addition of char vectors for at least
@@ -7543,6 +7579,8 @@ proc check_effective_target_vect_char_add { } {
&& [check_effective_target_s390_vx])
|| ([istarget riscv*-*-*]
&& [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx])
}}]
}
@@ -7559,7 +7597,9 @@ proc check_effective_target_vect_shift_char { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports hardware vectors of long, 0 otherwise.
@@ -7580,7 +7620,9 @@ proc check_effective_target_vect_long { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) } {
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) } {
set answer 1
} else {
set answer 0
@@ -7610,7 +7652,9 @@ proc check_effective_target_vect_float { } {
&& [check_effective_target_s390_vxe])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports hardware vectors of float without
@@ -7641,7 +7685,9 @@ proc check_effective_target_vect_double { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v])} }]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports conditional addition, subtraction,
@@ -7669,7 +7715,9 @@ proc check_effective_target_vect_long_long { } {
&& [check_effective_target_has_arch_pwr8])
|| [istarget aarch64*-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v])}}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx])}}]
}
@@ -7724,7 +7772,9 @@ proc check_effective_target_vect_perm { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if, for some VF:
@@ -7819,7 +7869,9 @@ proc check_effective_target_vect_perm_byte { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports SLP permutation of 3 vectors when each
@@ -7850,7 +7902,9 @@ proc check_effective_target_vect_perm_short { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports SLP permutation of 3 vectors when each
@@ -7898,6 +7952,7 @@ proc check_effective_target_vect_widen_sum_hi_to_si { } {
expr { [check_effective_target_vect_unpack]
|| [istarget powerpc*-*-*]
|| [istarget ia64-*-*]
+ || [istarget loongarch*-*-*]
|| [istarget riscv*-*-*] }}]
}
@@ -7913,7 +7968,8 @@ proc check_effective_target_vect_widen_sum_qi_to_hi { } {
expr { [check_effective_target_vect_unpack]
|| [is-effective-target arm_neon]
|| [istarget ia64-*-*]
- || [istarget riscv*-*-*] }}]
+ || [istarget riscv*-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target plus current options supports a vector
@@ -7924,6 +7980,7 @@ proc check_effective_target_vect_widen_sum_qi_to_hi { } {
proc check_effective_target_vect_widen_sum_qi_to_si { } {
return [check_cached_effective_target_indexed vect_widen_sum_qi_to_si {
expr { [istarget powerpc*-*-*]
+ || [istarget loongarch*-*-*]
|| [istarget riscv*-*-*] }}]
}
@@ -7944,6 +8001,7 @@ proc check_effective_target_vect_widen_mult_qi_to_hi { } {
|| ([istarget aarch64*-*-*]
&& ![check_effective_target_aarch64_sve])
|| [is-effective-target arm_neon]
+ || [is-effective-target loongarch*-*-*]
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx]))
|| [istarget amdgcn-*-*] }}]
@@ -7968,6 +8026,7 @@ proc check_effective_target_vect_widen_mult_hi_to_si { } {
&& ![check_effective_target_aarch64_sve])
|| [istarget i?86-*-*] || [istarget x86_64-*-*]
|| [is-effective-target arm_neon]
+ || [is-effective-target loongarch*-*-*]
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx]))
|| [istarget amdgcn-*-*] }}]
@@ -7985,6 +8044,7 @@ proc check_effective_target_vect_widen_mult_qi_to_hi_pattern { } {
&& [check_effective_target_arm_little_endian])
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx])
+ || [istarget loongarch*-*-*]
|| [istarget amdgcn-*-*] }}]
}
@@ -7997,6 +8057,7 @@ proc check_effective_target_vect_widen_mult_hi_to_si_pattern { } {
return [check_cached_effective_target_indexed vect_widen_mult_hi_to_si_pattern {
expr { [istarget powerpc*-*-*]
|| [istarget ia64-*-*]
+ || [istarget loongarch*-*-*]
|| [istarget i?86-*-*] || [istarget x86_64-*-*]
|| ([is-effective-target arm_neon]
&& [check_effective_target_arm_little_endian])
@@ -8014,6 +8075,7 @@ proc check_effective_target_vect_widen_mult_si_to_di_pattern { } {
return [check_cached_effective_target_indexed vect_widen_mult_si_to_di_pattern {
expr { [istarget ia64-*-*]
|| [istarget i?86-*-*] || [istarget x86_64-*-*]
+ || [istarget loongarch*-*-*]
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx]) }}]
}
@@ -8041,7 +8103,9 @@ proc check_effective_target_vect_sdot_qi { } {
|| ([istarget mips*-*-*]
&& [et-is-effective-target mips_msa])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target plus current options supports a vector
@@ -8058,7 +8122,9 @@ proc check_effective_target_vect_udot_qi { } {
|| ([istarget mips*-*-*]
&& [et-is-effective-target mips_msa])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target plus current options supports a vector
@@ -8087,7 +8153,9 @@ proc check_effective_target_vect_sdot_hi { } {
|| ([istarget mips*-*-*]
&& [et-is-effective-target mips_msa])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target plus current options supports a vector
@@ -8101,7 +8169,9 @@ proc check_effective_target_vect_udot_hi { } {
|| ([istarget mips*-*-*]
&& [et-is-effective-target mips_msa])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target plus current options supports a vector
@@ -8118,7 +8188,9 @@ proc check_effective_target_vect_usad_char { } {
|| ([istarget powerpc*-*-*]
&& [check_p9vector_hw_available])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target plus current options supports both signed
@@ -8128,7 +8200,9 @@ proc check_effective_target_vect_avg_qi {} {
return [expr { ([istarget aarch64*-*-*]
&& ![check_effective_target_aarch64_sve1_only])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }]
}
# Return 1 if the target plus current options supports both signed
@@ -8167,7 +8241,9 @@ proc check_effective_target_vect_pack_trunc { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn*-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target plus current options supports a vector
@@ -8189,7 +8265,9 @@ proc check_effective_target_vect_unpack { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn*-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target plus current options does not guarantee
@@ -8230,7 +8308,8 @@ proc check_effective_target_vect_hw_misalign { } {
|| ([istarget mips*-*-*] && [et-is-effective-target mips_msa])
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx])
- || ([istarget riscv*-*-*]) } {
+ || ([istarget riscv*-*-*])
+ || ([istarget loongarch*-*-*]) } {
return 1
}
if { [istarget arm*-*-*]
@@ -8849,7 +8928,8 @@ proc check_effective_target_vect_gather_load_ifn { } {
proc check_effective_target_vect_scatter_store { } {
return [expr { [check_effective_target_aarch64_sve]
|| [istarget amdgcn*-*-*]
- || [check_effective_target_riscv_v] }]
+ || [check_effective_target_riscv_v]
+ || [check_effective_target_loongarch_sx] }]
}
# Return 1 if the target supports vector conditional operations, 0 otherwise.
@@ -8868,7 +8948,9 @@ proc check_effective_target_vect_condition { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports vector conditional operations where
@@ -8887,7 +8969,9 @@ proc check_effective_target_vect_cond_mixed { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports vector char multiplication, 0 otherwise.
@@ -8905,7 +8989,9 @@ proc check_effective_target_vect_char_mult { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports vector short multiplication, 0 otherwise.
@@ -8924,7 +9010,9 @@ proc check_effective_target_vect_short_mult { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports vector int multiplication, 0 otherwise.
@@ -8942,7 +9030,9 @@ proc check_effective_target_vect_int_mult { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports 64 bit hardware vector
@@ -8961,7 +9051,9 @@ proc check_effective_target_vect_long_mult { } {
|| ([istarget mips*-*-*]
&& [et-is-effective-target mips_msa])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) } {
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) } {
set answer 1
} else {
set answer 0
@@ -8999,7 +9091,9 @@ proc check_effective_target_vect_extract_even_odd { } {
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports vector interleaving, 0 otherwise.
@@ -9017,7 +9111,9 @@ proc check_effective_target_vect_interleave { } {
|| ([istarget s390*-*-*]
&& [check_effective_target_s390_vx])
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
foreach N {2 3 4 5 6 7 8} {
@@ -9142,7 +9238,9 @@ proc check_effective_target_vect_call_copysignf { } {
|| [istarget aarch64*-*-*]
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports hardware square root instructions.
@@ -9181,7 +9279,9 @@ proc check_effective_target_vect_call_sqrtf { } {
&& [check_effective_target_s390_vx])
|| [istarget amdgcn-*-*]
|| ([istarget riscv*-*-*]
- && [check_effective_target_riscv_v]) }}]
+ && [check_effective_target_riscv_v])
+ || ([istarget loongarch*-*-*]
+ && [check_effective_target_loongarch_sx]) }}]
}
# Return 1 if the target supports vector lrint calls.
@@ -9190,7 +9290,8 @@ proc check_effective_target_vect_call_lrint { } {
set et_vect_call_lrint 0
if { (([istarget i?86-*-*] || [istarget x86_64-*-*])
&& [check_effective_target_ilp32])
- || [istarget amdgcn-*-*] } {
+ || [istarget amdgcn-*-*]
+ || [istarget loongarch*-*-*] } {
set et_vect_call_lrint 1
}
@@ -9203,7 +9304,8 @@ proc check_effective_target_vect_call_lrint { } {
proc check_effective_target_vect_call_btrunc { } {
return [check_cached_effective_target_indexed vect_call_btrunc {
expr { [istarget aarch64*-*-*]
- || [istarget amdgcn-*-*] }}]
+ || [istarget amdgcn-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports vector btruncf calls.
@@ -9211,7 +9313,8 @@ proc check_effective_target_vect_call_btrunc { } {
proc check_effective_target_vect_call_btruncf { } {
return [check_cached_effective_target_indexed vect_call_btruncf {
expr { [istarget aarch64*-*-*]
- || [istarget amdgcn-*-*] }}]
+ || [istarget amdgcn-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports vector ceil calls.
@@ -9219,7 +9322,8 @@ proc check_effective_target_vect_call_btruncf { } {
proc check_effective_target_vect_call_ceil { } {
return [check_cached_effective_target_indexed vect_call_ceil {
expr { [istarget aarch64*-*-*]
- || [istarget amdgcn-*-*] }}]
+ || [istarget amdgcn-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports vector ceilf calls.
@@ -9227,7 +9331,8 @@ proc check_effective_target_vect_call_ceil { } {
proc check_effective_target_vect_call_ceilf { } {
return [check_cached_effective_target_indexed vect_call_ceilf {
expr { [istarget aarch64*-*-*]
- || [istarget amdgcn-*-*] }}]
+ || [istarget amdgcn-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports vector floor calls.
@@ -9235,7 +9340,8 @@ proc check_effective_target_vect_call_ceilf { } {
proc check_effective_target_vect_call_floor { } {
return [check_cached_effective_target_indexed vect_call_floor {
expr { [istarget aarch64*-*-*]
- || [istarget amdgcn-*-*] }}]
+ || [istarget amdgcn-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports vector floorf calls.
@@ -9243,21 +9349,24 @@ proc check_effective_target_vect_call_floor { } {
proc check_effective_target_vect_call_floorf { } {
return [check_cached_effective_target_indexed vect_call_floorf {
expr { [istarget aarch64*-*-*]
- || [istarget amdgcn-*-*] }}]
+ || [istarget amdgcn-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports vector lceil calls.
proc check_effective_target_vect_call_lceil { } {
return [check_cached_effective_target_indexed vect_call_lceil {
- expr { [istarget aarch64*-*-*] }}]
+ expr { [istarget aarch64*-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports vector lfloor calls.
proc check_effective_target_vect_call_lfloor { } {
return [check_cached_effective_target_indexed vect_call_lfloor {
- expr { [istarget aarch64*-*-*] }}]
+ expr { [istarget aarch64*-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports vector nearbyint calls.
@@ -9294,6 +9403,7 @@ proc check_effective_target_vect_logical_reduc { } {
return [expr { [check_effective_target_aarch64_sve]
|| [istarget amdgcn-*-*]
|| [check_effective_target_riscv_v]
+ || [check_effective_target_loongarch_sx]
|| [istarget i?86-*-*] || [istarget x86_64-*-*]}]
}
@@ -9311,7 +9421,8 @@ proc check_effective_target_section_anchors { } {
return [check_cached_effective_target section_anchors {
expr { [istarget powerpc*-*-*]
|| [istarget arm*-*-*]
- || [istarget aarch64*-*-*] }}]
+ || [istarget aarch64*-*-*]
+ || [istarget loongarch*-*-*] }}]
}
# Return 1 if the target supports atomic operations on "int_128" values.
@@ -11623,8 +11734,10 @@ proc check_vect_support_and_set_flags { } {
set dg-do-what-default compile
}
} elseif [istarget loongarch*-*-*] {
- lappend DEFAULT_VECTCFLAGS "-mdouble-float" "-mlasx"
- if [check_effective_target_loongarch_asx_hw] {
+ # Set the default vectorization option to "-mlsx" due to the problem
+ # of non-aligned memory access when using 256-bit vectorization.
+ lappend DEFAULT_VECTCFLAGS "-mdouble-float" "-mlsx"
+ if [check_effective_target_loongarch_sx_hw] {
set dg-do-what-default run
} else {
set dg-do-what-default compile
@@ -12190,7 +12303,8 @@ proc check_effective_target_builtin_eh_return { } {
proc check_effective_target_vect_max_reduc { } {
if { [istarget aarch64*-*-*] || [is-effective-target arm_neon]
- || [check_effective_target_riscv_v] } {
+ || [check_effective_target_riscv_v]
+ || [check_effective_target_loongarch_sx] } {
return 1
}
return 0
@@ -13205,7 +13319,7 @@ proc check_effective_target_loongarch_sx { } {
#if !defined(__loongarch_sx)
#error "LSX not defined"
#endif
- }]
+ } "-mlsx"]
}
proc check_effective_target_loongarch_sx_hw { } {
@@ -13225,7 +13339,7 @@ proc check_effective_target_loongarch_asx { } {
#if !defined(__loongarch_asx)
#error "LASX not defined"
#endif
- }]
+ } "-mlasx"]
}
proc check_effective_target_loongarch_asx_hw { } {
diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc
index 481ce7c..25e3130 100644
--- a/gcc/tree-scalar-evolution.cc
+++ b/gcc/tree-scalar-evolution.cc
@@ -3881,7 +3881,7 @@ final_value_replacement_loop (class loop *loop)
/* Propagate constants immediately, but leave an unused initialization
around to avoid invalidating the SCEV cache. */
- if (CONSTANT_CLASS_P (def))
+ if (CONSTANT_CLASS_P (def) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rslt))
replace_uses_by (rslt, def);
/* Create the replacement statements. */
diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
index 05d3b92..2db26e4 100644
--- a/gcc/tree-ssa-math-opts.cc
+++ b/gcc/tree-ssa-math-opts.cc
@@ -5194,12 +5194,14 @@ match_single_bit_test (gimple_stmt_iterator *gsi, gimple *stmt)
tree type = TREE_TYPE (arg);
if (!INTEGRAL_TYPE_P (type))
return;
+ bool nonzero_arg = tree_expr_nonzero_p (arg);
if (direct_internal_fn_supported_p (IFN_POPCOUNT, type, OPTIMIZE_FOR_BOTH))
{
/* Tell expand_POPCOUNT the popcount result is only used in equality
comparison with one, so that it can decide based on rtx costs. */
gimple *g = gimple_build_call_internal (IFN_POPCOUNT, 2, arg,
- integer_one_node);
+ nonzero_arg ? integer_zero_node
+ : integer_one_node);
gimple_call_set_lhs (g, gimple_call_lhs (call));
gimple_stmt_iterator gsi2 = gsi_for_stmt (call);
gsi_replace (&gsi2, g, true);
@@ -5209,19 +5211,29 @@ match_single_bit_test (gimple_stmt_iterator *gsi, gimple *stmt)
gimple *g = gimple_build_assign (argm1, PLUS_EXPR, arg,
build_int_cst (type, -1));
gsi_insert_before (gsi, g, GSI_SAME_STMT);
- g = gimple_build_assign (make_ssa_name (type), BIT_XOR_EXPR, arg, argm1);
+ g = gimple_build_assign (make_ssa_name (type),
+ nonzero_arg ? BIT_AND_EXPR : BIT_XOR_EXPR,
+ arg, argm1);
gsi_insert_before (gsi, g, GSI_SAME_STMT);
+ tree_code cmpcode;
+ if (nonzero_arg)
+ {
+ argm1 = build_zero_cst (type);
+ cmpcode = code;
+ }
+ else
+ cmpcode = code == EQ_EXPR ? GT_EXPR : LE_EXPR;
if (gcond *cond = dyn_cast <gcond *> (stmt))
{
gimple_cond_set_lhs (cond, gimple_assign_lhs (g));
gimple_cond_set_rhs (cond, argm1);
- gimple_cond_set_code (cond, code == EQ_EXPR ? GT_EXPR : LE_EXPR);
+ gimple_cond_set_code (cond, cmpcode);
}
else
{
gimple_assign_set_rhs1 (stmt, gimple_assign_lhs (g));
gimple_assign_set_rhs2 (stmt, argm1);
- gimple_assign_set_rhs_code (stmt, code == EQ_EXPR ? GT_EXPR : LE_EXPR);
+ gimple_assign_set_rhs_code (stmt, cmpcode);
}
update_stmt (stmt);
gimple_stmt_iterator gsi2 = gsi_for_stmt (call);
diff --git a/gcc/varasm.cc b/gcc/varasm.cc
index 29ac8b1..25c1e05 100644
--- a/gcc/varasm.cc
+++ b/gcc/varasm.cc
@@ -61,6 +61,7 @@ along with GCC; see the file COPYING3. If not see
#include "alloc-pool.h"
#include "toplev.h"
#include "opts.h"
+#include "asan.h"
/* The (assembler) name of the first globally-visible object output. */
extern GTY(()) const char *first_global_object_name;
@@ -1835,6 +1836,19 @@ get_fnname_from_decl (tree decl)
return XSTR (x, 0);
}
+/* Output function label, possibly with accompanying metadata. No additional
+ code or data is output after the label. */
+
+void
+assemble_function_label_raw (FILE *file, const char *name)
+{
+ ASM_OUTPUT_LABEL (file, name);
+ if ((flag_sanitize & SANITIZE_ADDRESS)
+ /* Notify ASAN only about the first function label. */
+ && (in_cold_section_p == first_function_block_is_cold))
+ asan_function_start ();
+}
+
/* Output assembler code for the constant pool of a function and associated
with defining the name of the function. DECL describes the function.
NAME is the function's name. For the constant pool, we use the current
diff --git a/libbacktrace/Makefile.in b/libbacktrace/Makefile.in
index 889144a..0eaf4af 100644
--- a/libbacktrace/Makefile.in
+++ b/libbacktrace/Makefile.in
@@ -15,7 +15,7 @@
@SET_MAKE@
# Makefile.am -- Backtrace Makefile.
-# Copyright (C) 2012-2023 Free Software Foundation, Inc.
+# Copyright (C) 2012-2024 Free Software Foundation, Inc.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 8c9d2d7..cb0eab11 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,10 @@
+2024-01-04 Raiki Tamura <tamaron1203@gmail.com>
+
+ * charset.cc (cpp_check_xid_property): New.
+ * include/cpplib.h
+ (cpp_check_xid_property): New.
+ (enum cpp_xid_property): New.
+
2023-12-13 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/112956
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index dc0c0df..7858f71 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,7 @@
+2024-01-07 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ * io/write.c (namelist_write): If internal_unit precede with space.
+
Copyright (C) 2024 Free Software Foundation, Inc.
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c
index a0401fe..49beaee 100644
--- a/libgfortran/io/write.c
+++ b/libgfortran/io/write.c
@@ -2466,6 +2466,8 @@ namelist_write (st_parameter_dt *dtp)
dtp->u.p.nml_delim = '\0';
}
+ if (is_internal_unit (dtp))
+ write_character (dtp, " ", 1, 1, NODELIM);
write_character (dtp, "&", 1, 1, NODELIM);
/* Write namelist name in upper case - f95 std. */
diff --git a/libgm2/ChangeLog b/libgm2/ChangeLog
index 803e914..bac9a80 100644
--- a/libgm2/ChangeLog
+++ b/libgm2/ChangeLog
@@ -1,3 +1,7 @@
+2024-01-05 Gaius Mulley <gaiusmod2@gmail.com>
+
+ * libm2iso/RTco.cc (initialized): Use bool instead of int.
+
2023-12-22 Christophe Lyon <christophe.lyon@linaro.org>
* Makefile.am: Allow overriding EXEPCT.
diff --git a/libgm2/libm2iso/RTco.cc b/libgm2/libm2iso/RTco.cc
index 17e8010..190c897 100644
--- a/libgm2/libm2iso/RTco.cc
+++ b/libgm2/libm2iso/RTco.cc
@@ -96,7 +96,7 @@ static threadSem **semArray = NULL;
/* These are used to lock the above module data structures. */
static __gthread_mutex_t lock; /* This is the only mutex for
the whole module. */
-static int initialized = false;
+static bool initialized = false;
extern "C" int EXPORT(init) (void);
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index d0d9674..eccc898 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,16 @@
+2024-01-06 Tobias Burnus <tobias@codesourcery.com>
+
+ * libgomp.texi (OpenMP Technical Report 12): Fix a typo.
+ (Device Memory Routines): Fix OpenMP 5.1 spec refs; add
+ omp_target_is_accessible.
+ (Environment Display Routine): Uncomment and add
+ omp_display_env description.
+ (OMP_DISPLAY_ENV): Update wording, add 'see also'.
+
+2024-01-06 Mark Wielaard <mark@klomp.org>
+
+ * configure: Regenerate.
+
2024-01-03 Jakub Jelinek <jakub@redhat.com>
* libgomp.texi: Bump @copying's copyright year.
diff --git a/libgomp/Makefile.in b/libgomp/Makefile.in
index 56a6bea..11480d6 100644
--- a/libgomp/Makefile.in
+++ b/libgomp/Makefile.in
@@ -16,7 +16,7 @@
# Plugins for offload execution, Makefile.am fragment.
#
-# Copyright (C) 2014-2023 Free Software Foundation, Inc.
+# Copyright (C) 2014-2024 Free Software Foundation, Inc.
#
# Contributed by Mentor Embedded.
#
diff --git a/libgomp/configure b/libgomp/configure
index c69a13c..b3646c9 100755
--- a/libgomp/configure
+++ b/libgomp/configure
@@ -15159,7 +15159,7 @@ _ACEOF
# Plugins for offload execution, configure.ac fragment. -*- mode: autoconf -*-
#
-# Copyright (C) 2014-2023 Free Software Foundation, Inc.
+# Copyright (C) 2014-2024 Free Software Foundation, Inc.
#
# Contributed by Mentor Embedded.
#
diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi
index c727850..30f69ee 100644
--- a/libgomp/libgomp.texi
+++ b/libgomp/libgomp.texi
@@ -501,7 +501,7 @@ Technical Report (TR) 12 is the second preview for OpenMP 6.0.
modifiers of the @code{init} clause
@tab N @tab
@item @code{interop} clause to @code{dispatch} @tab N @tab
-@item @code{message} and @code{severity} calauses to @code{parallel} directive
+@item @code{message} and @code{severity} clauses to @code{parallel} directive
@tab N @tab
@item @code{self} clause to @code{requires} directive @tab N @tab
@item @code{no_openmp_constructs} assumptions clause @tab N @tab
@@ -570,7 +570,7 @@ specification in version 5.2.
@c * Interoperability Routines::
* Memory Management Routines::
@c * Tool Control Routine::
-@c * Environment Display Routine::
+* Environment Display Routine::
@end menu
@@ -1719,7 +1719,7 @@ pointers on devices. They have C linkage and do not throw exceptions.
* omp_target_alloc:: Allocate device memory
* omp_target_free:: Free device memory
* omp_target_is_present:: Check whether storage is mapped
-@c * omp_target_is_accessible:: <fixme>
+* omp_target_is_accessible:: Check whether memory is device accessible
@c * omp_target_memcpy:: <fixme>
@c * omp_target_memcpy_rect:: <fixme>
@c * omp_target_memcpy_async:: <fixme>
@@ -1768,7 +1768,7 @@ is not supported.
@ref{omp_target_free}, @ref{omp_target_associate_ptr}
@item @emph{Reference}:
-@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 18.8.1
+@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.1
@end table
@@ -1802,7 +1802,7 @@ is not supported.
@ref{omp_target_alloc}, @ref{omp_target_disassociate_ptr}
@item @emph{Reference}:
-@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 18.8.2
+@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.2
@end table
@@ -1813,7 +1813,7 @@ is not supported.
@item @emph{Description}:
This routine tests whether storage, identified by the host pointer @var{ptr}
is mapped to the device specified by @var{device_num}. If so, it returns
-@emph{true} and otherwise @emph{false}.
+a nonzero value and otherwise zero.
In GCC, this includes self mapping such that @code{omp_target_is_present}
returns @emph{true} when @var{device_num} specifies the host or when the host
@@ -1848,7 +1848,53 @@ is not supported.
@ref{omp_target_associate_ptr}
@item @emph{Reference}:
-@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 18.8.3
+@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.3
+@end table
+
+
+
+@node omp_target_is_accessible
+@subsection @code{omp_target_is_accessible} -- Check whether memory is device accessible
+@table @asis
+@item @emph{Description}:
+This routine tests whether memory, starting at the address given by @var{ptr}
+and extending @var{size} bytes, is accessibly on the device specified by
+@var{device_num}. If so, it returns a nonzero value and otherwise zero.
+
+The address given by @var{ptr} is interpreted to be in the address space of
+the device and @var{size} must be positive.
+
+Note that GCC's current implementation assumes that @var{ptr} is a valid host
+pointer. Therefore, all addresses given by @var{ptr} are assumed to be
+accessible on the initial device. And, to err on the safe side, this memory
+is only available on a non-host device that can access all host memory
+([uniform] shared memory access).
+
+Running this routine in a @code{target} region except on the initial device
+is not supported.
+
+@item @emph{C/C++}
+@multitable @columnfractions .20 .80
+@item @emph{Prototype}: @tab @code{int omp_target_is_accessible(const void *ptr,}
+@item @tab @code{ size_t size,}
+@item @tab @code{ int device_num)}
+@end multitable
+
+@item @emph{Fortran}:
+@multitable @columnfractions .20 .80
+@item @emph{Interface}: @tab @code{integer(c_int) function omp_target_is_accessible(ptr, &}
+@item @tab @code{ size, device_num) bind(C)}
+@item @tab @code{use, intrinsic :: iso_c_binding, only: c_ptr, c_size_t, c_int}
+@item @tab @code{type(c_ptr), value :: ptr}
+@item @tab @code{integer(c_size_t), value :: size}
+@item @tab @code{integer(c_int), value :: device_num}
+@end multitable
+
+@item @emph{See also}:
+@ref{omp_target_associate_ptr}
+
+@item @emph{Reference}:
+@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.4
@end table
@@ -1911,7 +1957,7 @@ is not supported.
@ref{omp_target_alloc}
@item @emph{Reference}:
-@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 18.8.9
+@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.9
@end table
@@ -1957,7 +2003,7 @@ is not supported.
@ref{omp_target_associate_ptr}
@item @emph{Reference}:
-@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 18.8.10
+@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.10
@end table
@@ -1997,7 +2043,7 @@ is not supported.
@ref{omp_target_associate_ptr}
@item @emph{Reference}:
-@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 18.8.11
+@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.8.11
@end table
@@ -2919,18 +2965,90 @@ was already deallocated or when the used allocator has already been destroyed.
@c @node Tool Control Routine
+@c @section Tool Control Routine
@c
@c FIXME
-@c @node Environment Display Routine
-@c @section Environment Display Routine
-@c
-@c Routine to display the OpenMP number and the initial value of ICVs.
-@c It has C linkage and do not throw exceptions.
-@c
-@c menu
-@c * omp_display_env:: <fixme>
-@c end menu
+@node Environment Display Routine
+@section Environment Display Routine
+
+Routine to display the OpenMP version number and the initial value of ICVs.
+It has C linkage and does not throw exceptions.
+
+@menu
+* omp_display_env:: print the initial ICV values
+@end menu
+
+@node omp_display_env
+@subsection @code{omp_display_env} -- print the initial ICV values
+@table @asis
+@item @emph{Description}:
+Each time this routine is invoked, the OpenMP version number and initial value
+of internal control variables (ICVs) is printed on @code{stderr}. The displayed
+values are those at startup after evaluating the environment variables; later
+calls to API routines or clauses used in enclosing constructs do not affect
+the output.
+
+If the @var{verbose} argument is @code{false}, only the OpenMP version and
+standard OpenMP ICVs are shown; if it is @code{true}, additionally, the
+GCC-specific ICVs are shown.
+
+The output consists of multiple lines and starts with
+@samp{OPENMP DISPLAY ENVIRONMENT BEGIN} followed by the name-value lines and
+ends with @samp{OPENMP DISPLAY ENVIRONMENT END}. The @var{name} is followed by
+an equal sign and the @var{value} is enclosed in single quotes.
+
+The first line has as @var{name} either @samp{_OPENMP} or @samp{openmp_version}
+and shows as value the supported OpenMP version number (4-digit year, 2-digit
+month) of the implementation, matching the value of the @code{_OPENMP} macro
+and, in Fortran, the named constant @code{openmp_version}.
+
+In each of the succeeding lines, the @var{name} matches the environment-variable
+name of an ICV and shows its value. Those line are might be prefixed by pair of
+brackets and a space, where the brackets enclose a comma-separated list of
+devices to which the ICV-value combination applies to; the value can either be a
+numeric device number or an abstract name denoting all devices (@code{all}), the
+initial host device (@code{host}) or all devices but the host (@code{device}).
+Note that the same ICV might be printed multiple times for multiple devices,
+even if all have the same value.
+
+The effect when invoked from within a @code{target} region is unspecified.
+
+@item @emph{C/C++}:
+@multitable @columnfractions .20 .80
+@item @emph{Prototype}: @tab @code{void omp_display_env(int verbose)}
+@end multitable
+
+@item @emph{Fortran}:
+@multitable @columnfractions .20 .80
+@item @emph{Interface}: @tab @code{subroutine omp_display_env(vebose)}
+@item @tab @code{logical, intent(in) :: verbose}
+@end multitable
+
+@item @emph{Example}:
+Note that the GCC-specific ICVs, such as the shown @code{GOMP_SPINCOUNT},
+are only printed when @var{varbose} set to @code{true}.
+
+@smallexample
+OPENMP DISPLAY ENVIRONMENT BEGIN
+ _OPENMP = '201511'
+ [host] OMP_DYNAMIC = 'FALSE'
+ [host] OMP_NESTED = 'FALSE'
+ [all] OMP_CANCELLATION = 'FALSE'
+ ...
+ [host] GOMP_SPINCOUNT = '300000'
+OPENMP DISPLAY ENVIRONMENT END
+@end smallexample
+
+
+@item @emph{See also}:
+@ref{OMP_DISPLAY_ENV}, @ref{Environment Variables},
+@ref{Implementation-defined ICV Initialization}
+
+@item @emph{Reference}:
+@uref{https://www.openmp.org, OpenMP specification v5.1}, Section 3.15
+@end table
+
@c ---------------------------------------------------------------------
@c OpenMP Environment Variables
@@ -3182,12 +3300,15 @@ any change occurs.
@item @emph{ICV:} none
@item @emph{Scope:} not applicable
@item @emph{Description}:
-If set to @code{TRUE}, the OpenMP version number and the values
-associated with the OpenMP environment variables are printed to @code{stderr}.
-If set to @code{VERBOSE}, it additionally shows the value of the environment
-variables which are GNU extensions. If undefined or set to @code{FALSE},
-this information is not shown.
+If set to @code{TRUE}, the runtime displays the same information to
+@code{stderr} as shown by the @code{omp_display_env} routine invoked with
+@var{verbose} argument set to @code{false}. If set to @code{VERBOSE}, the same
+information is shown as invoking the routine with @var{verbose} set to
+@code{true}. If unset or set to @code{FALSE}, this information is not shown.
+The result for any other value is unspecified.
+@item @emph{See also}:
+@ref{omp_display_env}
@item @emph{Reference}:
@uref{https://www.openmp.org, OpenMP specification v4.5}, Section 4.12
diff --git a/libphobos/Makefile.in b/libphobos/Makefile.in
index eef750b..3a33b86 100644
--- a/libphobos/Makefile.in
+++ b/libphobos/Makefile.in
@@ -15,7 +15,7 @@
@SET_MAKE@
# Makefile for the toplevel directory of the D Standard library.
-# Copyright (C) 2006-2023 Free Software Foundation, Inc.
+# Copyright (C) 2006-2024 Free Software Foundation, Inc.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/libphobos/libdruntime/Makefile.in b/libphobos/libdruntime/Makefile.in
index f52bf36..9c29e20 100644
--- a/libphobos/libdruntime/Makefile.in
+++ b/libphobos/libdruntime/Makefile.in
@@ -15,7 +15,7 @@
@SET_MAKE@
# Makefile for the D runtime library.
-# Copyright (C) 2012-2023 Free Software Foundation, Inc.
+# Copyright (C) 2012-2024 Free Software Foundation, Inc.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 768b9e7..9cbd55a 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,80 @@
+2024-01-07 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/112997
+ * libsupc++/unwind-cxx.h (__cxa_call_terminate): Change first
+ parameter to void*.
+
+2024-01-07 Jonathan Wakely <jwakely@redhat.com>
+
+ * testsuite/20_util/variant/87619.cc: Remove dg-timeout-factor.
+
+2024-01-07 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/std/type_traits (is_trivially_destructible_v): Use
+ built-in directly when concepts are supported.
+ * testsuite/20_util/is_trivially_destructible/value_v.cc: New
+ test.
+
+2024-01-06 Gwenole Beauchesne <gb.devel@gmail.com>
+
+ * testsuite/tr1/8_c_compatibility/cinttypes/functions.cc: Use
+ nonnull arguments to strtoimax() and wcstoimax() functions.
+
+2024-01-05 Jonathan Wakely <jwakely@redhat.com>
+
+ * src/c++17/fs_path.cc (path::_List::reserve): Limit maximum
+ size and check for overflows in arithmetic.
+ (path::operator/=(const path&)): Remove redundant exponential
+ growth calculation.
+
+2024-01-05 Martin Küttler <martin.kuettler@kernkonzept.com>
+
+ * src/c++17/fs_path.cc (path::_List::reserve): Avoid
+ floating-point arithmetic.
+
+2024-01-05 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/113241
+ * include/std/type_traits (is_convertible_v): Guard use of
+ built-in with preprocessor check.
+
+2024-01-05 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/113200
+ * include/bits/char_traits.h (__gnu_cxx::char_traits::move): Use
+ __builtin_constant_p to check for unrelated pointers that cannot
+ be compared during constant evaluation.
+ * testsuite/21_strings/char_traits/requirements/113200.cc: New
+ test.
+
+2024-01-05 Cassio Neri <cassio.neri@gmail.com>
+
+ * include/std/chrono: Fix + and - for months and weekdays.
+ * testsuite/std/time/month/1.cc: Add constexpr tests against overflow.
+ * testsuite/std/time/month/2.cc: New test for extreme values.
+ * testsuite/std/time/weekday/1.cc: Add constexpr tests against overflow.
+ * testsuite/std/time/weekday/2.cc: New test for extreme values.
+
+2024-01-05 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/113099
+ * include/bits/locale_classes.tcc (__try_use_facet): Use
+ if-constexpr for C++11 and up.
+
+2024-01-05 Ken Matsui <kmatsui@gcc.gnu.org>
+
+ * include/std/type_traits: Use _GLIBCXX_USE_BUILTIN_TRAIT.
+
+2024-01-04 Arsen Arsenović <arsen@aarsen.me>
+
+ * include/std/generator (_Subyield_state::_M_jump_in): Fix typo
+ reported by Will Hawkins <hawkinsw@obs.cr>.
+
+2024-01-04 Arsen Arsenović <arsen@aarsen.me>
+
+ * include/std/generator (_Stateless_alloc): Rename typename _A
+ to _All.
+
2024-01-03 Patrick Palka <ppalka@redhat.com>
PR testsuite/113175
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index d44a399..c6d6a24 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -161,6 +161,8 @@ bits_freestanding = \
${bits_srcdir}/stl_uninitialized.h \
${bits_srcdir}/version.h \
${bits_srcdir}/string_view.tcc \
+ ${bits_srcdir}/unicode.h \
+ ${bits_srcdir}/unicode-data.h \
${bits_srcdir}/uniform_int_dist.h \
${bits_srcdir}/unique_ptr.h \
${bits_srcdir}/uses_allocator.h \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index 4fa4a25..36bb9b0 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -516,6 +516,8 @@ bits_freestanding = \
${bits_srcdir}/stl_uninitialized.h \
${bits_srcdir}/version.h \
${bits_srcdir}/string_view.tcc \
+ ${bits_srcdir}/unicode.h \
+ ${bits_srcdir}/unicode-data.h \
${bits_srcdir}/uniform_int_dist.h \
${bits_srcdir}/unique_ptr.h \
${bits_srcdir}/uses_allocator.h \
diff --git a/libstdc++-v3/include/bits/char_traits.h b/libstdc++-v3/include/bits/char_traits.h
index 018eac2..3074e9b 100644
--- a/libstdc++-v3/include/bits/char_traits.h
+++ b/libstdc++-v3/include/bits/char_traits.h
@@ -227,19 +227,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#if __cplusplus >= 202002L
if (std::__is_constant_evaluated())
{
- if (__s1 == __s2) // unlikely, but saves a lot of work
- return __s1;
- const auto __end = __s2 + __n - 1;
- bool __overlap = false;
- for (std::size_t __i = 0; __i < __n - 1; ++__i)
- {
- if (__s1 + __i == __end)
- {
- __overlap = true;
- break;
- }
- }
- if (__overlap)
+ // Use __builtin_constant_p to avoid comparing unrelated pointers.
+ if (__builtin_constant_p(__s2 < __s1)
+ && __s1 > __s2 && __s1 < (__s2 + __n))
{
do
{
diff --git a/libstdc++-v3/include/bits/chrono_io.h b/libstdc++-v3/include/bits/chrono_io.h
index c304516..ec2ae9d5 100644
--- a/libstdc++-v3/include/bits/chrono_io.h
+++ b/libstdc++-v3/include/bits/chrono_io.h
@@ -2273,7 +2273,8 @@ namespace __detail
_Str __s = _GLIBCXX_WIDEN("{:02d} is not a valid day");
if (__d.ok())
__s = __s.substr(0, 6);
- __os << std::vformat(__s, make_format_args<_Ctx>((unsigned)__d));
+ auto __u = (unsigned)__d;
+ __os << std::vformat(__s, make_format_args<_Ctx>(__u));
return __os;
}
@@ -2302,8 +2303,10 @@ namespace __detail
__os << std::vformat(__os.getloc(), __s.substr(0, 6),
make_format_args<_Ctx>(__m));
else
- __os << std::vformat(__s.substr(6),
- make_format_args<_Ctx>((unsigned)__m));
+ {
+ auto __u = (unsigned)__m;
+ __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__u));
+ }
return __os;
}
@@ -2364,8 +2367,10 @@ namespace __detail
__os << std::vformat(__os.getloc(), __s.substr(0, 6),
make_format_args<_Ctx>(__wd));
else
- __os << std::vformat(__s.substr(6),
- make_format_args<_Ctx>(__wd.c_encoding()));
+ {
+ auto __c = __wd.c_encoding();
+ __os << std::vformat(__s.substr(6), make_format_args<_Ctx>(__c));
+ }
return __os;
}
diff --git a/libstdc++-v3/include/bits/locale_classes.tcc b/libstdc++-v3/include/bits/locale_classes.tcc
index 2a6176f..6309758 100644
--- a/libstdc++-v3/include/bits/locale_classes.tcc
+++ b/libstdc++-v3/include/bits/locale_classes.tcc
@@ -87,6 +87,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__s2.data(), __s2.data() + __s2.length()) < 0);
}
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions"
template<typename _Facet>
inline const _Facet*
__try_use_facet(const locale& __loc) _GLIBCXX_NOTHROW
@@ -97,7 +99,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// We know these standard facets are always installed in every locale
// so dynamic_cast always succeeds, just use static_cast instead.
#define _GLIBCXX_STD_FACET(...) \
- if _GLIBCXX17_CONSTEXPR (__is_same(_Facet, __VA_ARGS__)) \
+ if _GLIBCXX_CONSTEXPR (__is_same(_Facet, __VA_ARGS__)) \
return static_cast<const _Facet*>(__facets[__i])
_GLIBCXX_STD_FACET(ctype<char>);
@@ -145,6 +147,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return static_cast<const _Facet*>(__facets[__i]);
#endif
}
+#pragma GCC diagnostic pop
/**
* @brief Test for the presence of a facet.
diff --git a/libstdc++-v3/include/bits/unicode-data.h b/libstdc++-v3/include/bits/unicode-data.h
new file mode 100644
index 0000000..c0c7e7d
--- /dev/null
+++ b/libstdc++-v3/include/bits/unicode-data.h
@@ -0,0 +1,449 @@
+// Generated by contrib/unicode/gen_std_format_width.py, do not edit.
+
+#ifndef _GLIBCXX_GET_UNICODE_DATA
+# error "This is not a public header, do not include it directly"
+#elif _GLIBCXX_GET_UNICODE_DATA != 150100
+# error "Version mismatch for Unicode static data"
+#endif
+
+ // Table generated by contrib/unicode/gen_std_format_width.py,
+ // from EastAsianWidth.txt from the Unicode standard.
+ inline constexpr char32_t __width_edges[] = {
+ 0x1100, 0x1160, 0x231a, 0x231c, 0x2329, 0x232b, 0x23e9, 0x23ed,
+ 0x23f0, 0x23f1, 0x23f3, 0x23f4, 0x25fd, 0x25ff, 0x2614, 0x2616,
+ 0x2648, 0x2654, 0x267f, 0x2680, 0x2693, 0x2694, 0x26a1, 0x26a2,
+ 0x26aa, 0x26ac, 0x26bd, 0x26bf, 0x26c4, 0x26c6, 0x26ce, 0x26cf,
+ 0x26d4, 0x26d5, 0x26ea, 0x26eb, 0x26f2, 0x26f4, 0x26f5, 0x26f6,
+ 0x26fa, 0x26fb, 0x26fd, 0x26fe, 0x2705, 0x2706, 0x270a, 0x270c,
+ 0x2728, 0x2729, 0x274c, 0x274d, 0x274e, 0x274f, 0x2753, 0x2756,
+ 0x2757, 0x2758, 0x2795, 0x2798, 0x27b0, 0x27b1, 0x27bf, 0x27c0,
+ 0x2b1b, 0x2b1d, 0x2b50, 0x2b51, 0x2b55, 0x2b56, 0x2e80, 0x2e9a,
+ 0x2e9b, 0x2ef4, 0x2f00, 0x2fd6, 0x2ff0, 0x303f, 0x3041, 0x3097,
+ 0x3099, 0x3100, 0x3105, 0x3130, 0x3131, 0x318f, 0x3190, 0x31e4,
+ 0x31ef, 0x321f, 0x3220, 0x3248, 0x3250, 0xa48d, 0xa490, 0xa4c7,
+ 0xa960, 0xa97d, 0xac00, 0xd7a4, 0xf900, 0xfb00, 0xfe10, 0xfe1a,
+ 0xfe30, 0xfe53, 0xfe54, 0xfe67, 0xfe68, 0xfe6c, 0xff01, 0xff61,
+ 0xffe0, 0xffe7, 0x16fe0, 0x16fe5, 0x16ff0, 0x16ff2, 0x17000, 0x187f8,
+ 0x18800, 0x18cd6, 0x18d00, 0x18d09, 0x1aff0, 0x1aff4, 0x1aff5, 0x1affc,
+ 0x1affd, 0x1afff, 0x1b000, 0x1b123, 0x1b132, 0x1b133, 0x1b150, 0x1b153,
+ 0x1b155, 0x1b156, 0x1b164, 0x1b168, 0x1b170, 0x1b2fc, 0x1f004, 0x1f005,
+ 0x1f0cf, 0x1f0d0, 0x1f18e, 0x1f18f, 0x1f191, 0x1f19b, 0x1f200, 0x1f203,
+ 0x1f210, 0x1f23c, 0x1f240, 0x1f249, 0x1f250, 0x1f252, 0x1f260, 0x1f266,
+ 0x1f300, 0x1f650, 0x1f680, 0x1f6c6, 0x1f6cc, 0x1f6cd, 0x1f6d0, 0x1f6d3,
+ 0x1f6d5, 0x1f6d8, 0x1f6dc, 0x1f6e0, 0x1f6eb, 0x1f6ed, 0x1f6f4, 0x1f6fd,
+ 0x1f7e0, 0x1f7ec, 0x1f7f0, 0x1f7f1, 0x1f900, 0x1fa00, 0x1fa70, 0x1fa7d,
+ 0x1fa80, 0x1fa89, 0x1fa90, 0x1fabe, 0x1fabf, 0x1fac6, 0x1face, 0x1fadc,
+ 0x1fae0, 0x1fae9, 0x1faf0, 0x1faf9, 0x20000, 0x2fffe, 0x30000, 0x3fffe,
+ };
+
+ enum class _Gcb_property {
+ _Gcb_CR = 1,
+ _Gcb_Control = 2,
+ _Gcb_Extend = 3,
+ _Gcb_L = 4,
+ _Gcb_LF = 5,
+ _Gcb_LV = 6,
+ _Gcb_LVT = 7,
+ _Gcb_Other = 8,
+ _Gcb_Prepend = 9,
+ _Gcb_Regional_Indicator = 10,
+ _Gcb_SpacingMark = 11,
+ _Gcb_T = 12,
+ _Gcb_V = 13,
+ _Gcb_ZWJ = 14,
+ };
+
+ // Values generated by contrib/unicode/gen_std_format_width.py,
+ // from GraphemeBreakProperty.txt from the Unicode standard.
+ // Entries are (code_point << shift_bits) + property.
+ inline constexpr int __gcb_shift_bits = 0x4;
+ inline constexpr uint32_t __gcb_edges[] = {
+ 0x2, 0xa5, 0xb2, 0xd1, 0xe2, 0x208,
+ 0x7f2, 0xa08, 0xad2, 0xae8, 0x3003, 0x3708,
+ 0x4833, 0x48a8, 0x5913, 0x5be8, 0x5bf3, 0x5c08,
+ 0x5c13, 0x5c38, 0x5c43, 0x5c68, 0x5c73, 0x5c88,
+ 0x6009, 0x6068, 0x6103, 0x61b8, 0x61c2, 0x61d8,
+ 0x64b3, 0x6608, 0x6703, 0x6718, 0x6d63, 0x6dd9,
+ 0x6de8, 0x6df3, 0x6e58, 0x6e73, 0x6e98, 0x6ea3,
+ 0x6ee8, 0x70f9, 0x7108, 0x7113, 0x7128, 0x7303,
+ 0x74b8, 0x7a63, 0x7b18, 0x7eb3, 0x7f48, 0x7fd3,
+ 0x7fe8, 0x8163, 0x81a8, 0x81b3, 0x8248, 0x8253,
+ 0x8288, 0x8293, 0x82e8, 0x8593, 0x85c8, 0x8909,
+ 0x8928, 0x8983, 0x8a08, 0x8ca3, 0x8e29, 0x8e33,
+ 0x903b, 0x9048, 0x93a3, 0x93bb, 0x93c3, 0x93d8,
+ 0x93eb, 0x9413, 0x949b, 0x94d3, 0x94eb, 0x9508,
+ 0x9513, 0x9588, 0x9623, 0x9648, 0x9813, 0x982b,
+ 0x9848, 0x9bc3, 0x9bd8, 0x9be3, 0x9bfb, 0x9c13,
+ 0x9c58, 0x9c7b, 0x9c98, 0x9cbb, 0x9cd3, 0x9ce8,
+ 0x9d73, 0x9d88, 0x9e23, 0x9e48, 0x9fe3, 0x9ff8,
+ 0xa013, 0xa03b, 0xa048, 0xa3c3, 0xa3d8, 0xa3eb,
+ 0xa413, 0xa438, 0xa473, 0xa498, 0xa4b3, 0xa4e8,
+ 0xa513, 0xa528, 0xa703, 0xa728, 0xa753, 0xa768,
+ 0xa813, 0xa83b, 0xa848, 0xabc3, 0xabd8, 0xabeb,
+ 0xac13, 0xac68, 0xac73, 0xac9b, 0xaca8, 0xacbb,
+ 0xacd3, 0xace8, 0xae23, 0xae48, 0xafa3, 0xb008,
+ 0xb013, 0xb02b, 0xb048, 0xb3c3, 0xb3d8, 0xb3e3,
+ 0xb40b, 0xb413, 0xb458, 0xb47b, 0xb498, 0xb4bb,
+ 0xb4d3, 0xb4e8, 0xb553, 0xb588, 0xb623, 0xb648,
+ 0xb823, 0xb838, 0xbbe3, 0xbbfb, 0xbc03, 0xbc1b,
+ 0xbc38, 0xbc6b, 0xbc98, 0xbcab, 0xbcd3, 0xbce8,
+ 0xbd73, 0xbd88, 0xc003, 0xc01b, 0xc043, 0xc058,
+ 0xc3c3, 0xc3d8, 0xc3e3, 0xc41b, 0xc458, 0xc463,
+ 0xc498, 0xc4a3, 0xc4e8, 0xc553, 0xc578, 0xc623,
+ 0xc648, 0xc813, 0xc82b, 0xc848, 0xcbc3, 0xcbd8,
+ 0xcbeb, 0xcbf3, 0xcc0b, 0xcc23, 0xcc3b, 0xcc58,
+ 0xcc63, 0xcc7b, 0xcc98, 0xccab, 0xccc3, 0xcce8,
+ 0xcd53, 0xcd78, 0xce23, 0xce48, 0xcf3b, 0xcf48,
+ 0xd003, 0xd02b, 0xd048, 0xd3b3, 0xd3d8, 0xd3e3,
+ 0xd3fb, 0xd413, 0xd458, 0xd46b, 0xd498, 0xd4ab,
+ 0xd4d3, 0xd4e9, 0xd4f8, 0xd573, 0xd588, 0xd623,
+ 0xd648, 0xd813, 0xd82b, 0xd848, 0xdca3, 0xdcb8,
+ 0xdcf3, 0xdd0b, 0xdd23, 0xdd58, 0xdd63, 0xdd78,
+ 0xdd8b, 0xddf3, 0xde08, 0xdf2b, 0xdf48, 0xe313,
+ 0xe328, 0xe33b, 0xe343, 0xe3b8, 0xe473, 0xe4f8,
+ 0xeb13, 0xeb28, 0xeb3b, 0xeb43, 0xebd8, 0xec83,
+ 0xecf8, 0xf183, 0xf1a8, 0xf353, 0xf368, 0xf373,
+ 0xf388, 0xf393, 0xf3a8, 0xf3eb, 0xf408, 0xf713,
+ 0xf7fb, 0xf803, 0xf858, 0xf863, 0xf888, 0xf8d3,
+ 0xf988, 0xf993, 0xfbd8, 0xfc63, 0xfc78, 0x102d3,
+ 0x1031b, 0x10323, 0x10388, 0x10393, 0x103bb, 0x103d3,
+ 0x103f8, 0x1056b, 0x10583, 0x105a8, 0x105e3, 0x10618,
+ 0x10713, 0x10758, 0x10823, 0x10838, 0x1084b, 0x10853,
+ 0x10878, 0x108d3, 0x108e8, 0x109d3, 0x109e8, 0x11004,
+ 0x1160d, 0x11a8c, 0x12008, 0x135d3, 0x13608, 0x17123,
+ 0x1715b, 0x17168, 0x17323, 0x1734b, 0x17358, 0x17523,
+ 0x17548, 0x17723, 0x17748, 0x17b43, 0x17b6b, 0x17b73,
+ 0x17beb, 0x17c63, 0x17c7b, 0x17c93, 0x17d48, 0x17dd3,
+ 0x17de8, 0x180b3, 0x180e2, 0x180f3, 0x18108, 0x18853,
+ 0x18878, 0x18a93, 0x18aa8, 0x19203, 0x1923b, 0x19273,
+ 0x1929b, 0x192c8, 0x1930b, 0x19323, 0x1933b, 0x19393,
+ 0x193c8, 0x1a173, 0x1a19b, 0x1a1b3, 0x1a1c8, 0x1a55b,
+ 0x1a563, 0x1a57b, 0x1a583, 0x1a5f8, 0x1a603, 0x1a618,
+ 0x1a623, 0x1a638, 0x1a653, 0x1a6db, 0x1a733, 0x1a7d8,
+ 0x1a7f3, 0x1a808, 0x1ab03, 0x1acf8, 0x1b003, 0x1b04b,
+ 0x1b058, 0x1b343, 0x1b3bb, 0x1b3c3, 0x1b3db, 0x1b423,
+ 0x1b43b, 0x1b458, 0x1b6b3, 0x1b748, 0x1b803, 0x1b82b,
+ 0x1b838, 0x1ba1b, 0x1ba23, 0x1ba6b, 0x1ba83, 0x1baab,
+ 0x1bab3, 0x1bae8, 0x1be63, 0x1be7b, 0x1be83, 0x1beab,
+ 0x1bed3, 0x1beeb, 0x1bef3, 0x1bf2b, 0x1bf48, 0x1c24b,
+ 0x1c2c3, 0x1c34b, 0x1c363, 0x1c388, 0x1cd03, 0x1cd38,
+ 0x1cd43, 0x1ce1b, 0x1ce23, 0x1ce98, 0x1ced3, 0x1cee8,
+ 0x1cf43, 0x1cf58, 0x1cf7b, 0x1cf83, 0x1cfa8, 0x1dc03,
+ 0x1e008, 0x200b2, 0x200c3, 0x200de, 0x200e2, 0x20108,
+ 0x20282, 0x202f8, 0x20602, 0x20708, 0x20d03, 0x20f18,
+ 0x2cef3, 0x2cf28, 0x2d7f3, 0x2d808, 0x2de03, 0x2e008,
+ 0x302a3, 0x30308, 0x30993, 0x309b8, 0xa66f3, 0xa6738,
+ 0xa6743, 0xa67e8, 0xa69e3, 0xa6a08, 0xa6f03, 0xa6f28,
+ 0xa8023, 0xa8038, 0xa8063, 0xa8078, 0xa80b3, 0xa80c8,
+ 0xa823b, 0xa8253, 0xa827b, 0xa8288, 0xa82c3, 0xa82d8,
+ 0xa880b, 0xa8828, 0xa8b4b, 0xa8c43, 0xa8c68, 0xa8e03,
+ 0xa8f28, 0xa8ff3, 0xa9008, 0xa9263, 0xa92e8, 0xa9473,
+ 0xa952b, 0xa9548, 0xa9604, 0xa97d8, 0xa9803, 0xa983b,
+ 0xa9848, 0xa9b33, 0xa9b4b, 0xa9b63, 0xa9bab, 0xa9bc3,
+ 0xa9beb, 0xa9c18, 0xa9e53, 0xa9e68, 0xaa293, 0xaa2fb,
+ 0xaa313, 0xaa33b, 0xaa353, 0xaa378, 0xaa433, 0xaa448,
+ 0xaa4c3, 0xaa4db, 0xaa4e8, 0xaa7c3, 0xaa7d8, 0xaab03,
+ 0xaab18, 0xaab23, 0xaab58, 0xaab73, 0xaab98, 0xaabe3,
+ 0xaac08, 0xaac13, 0xaac28, 0xaaebb, 0xaaec3, 0xaaeeb,
+ 0xaaf08, 0xaaf5b, 0xaaf63, 0xaaf78, 0xabe3b, 0xabe53,
+ 0xabe6b, 0xabe83, 0xabe9b, 0xabeb8, 0xabecb, 0xabed3,
+ 0xabee8, 0xac006, 0xac017, 0xac1c6, 0xac1d7, 0xac386,
+ 0xac397, 0xac546, 0xac557, 0xac706, 0xac717, 0xac8c6,
+ 0xac8d7, 0xaca86, 0xaca97, 0xacc46, 0xacc57, 0xace06,
+ 0xace17, 0xacfc6, 0xacfd7, 0xad186, 0xad197, 0xad346,
+ 0xad357, 0xad506, 0xad517, 0xad6c6, 0xad6d7, 0xad886,
+ 0xad897, 0xada46, 0xada57, 0xadc06, 0xadc17, 0xaddc6,
+ 0xaddd7, 0xadf86, 0xadf97, 0xae146, 0xae157, 0xae306,
+ 0xae317, 0xae4c6, 0xae4d7, 0xae686, 0xae697, 0xae846,
+ 0xae857, 0xaea06, 0xaea17, 0xaebc6, 0xaebd7, 0xaed86,
+ 0xaed97, 0xaef46, 0xaef57, 0xaf106, 0xaf117, 0xaf2c6,
+ 0xaf2d7, 0xaf486, 0xaf497, 0xaf646, 0xaf657, 0xaf806,
+ 0xaf817, 0xaf9c6, 0xaf9d7, 0xafb86, 0xafb97, 0xafd46,
+ 0xafd57, 0xaff06, 0xaff17, 0xb00c6, 0xb00d7, 0xb0286,
+ 0xb0297, 0xb0446, 0xb0457, 0xb0606, 0xb0617, 0xb07c6,
+ 0xb07d7, 0xb0986, 0xb0997, 0xb0b46, 0xb0b57, 0xb0d06,
+ 0xb0d17, 0xb0ec6, 0xb0ed7, 0xb1086, 0xb1097, 0xb1246,
+ 0xb1257, 0xb1406, 0xb1417, 0xb15c6, 0xb15d7, 0xb1786,
+ 0xb1797, 0xb1946, 0xb1957, 0xb1b06, 0xb1b17, 0xb1cc6,
+ 0xb1cd7, 0xb1e86, 0xb1e97, 0xb2046, 0xb2057, 0xb2206,
+ 0xb2217, 0xb23c6, 0xb23d7, 0xb2586, 0xb2597, 0xb2746,
+ 0xb2757, 0xb2906, 0xb2917, 0xb2ac6, 0xb2ad7, 0xb2c86,
+ 0xb2c97, 0xb2e46, 0xb2e57, 0xb3006, 0xb3017, 0xb31c6,
+ 0xb31d7, 0xb3386, 0xb3397, 0xb3546, 0xb3557, 0xb3706,
+ 0xb3717, 0xb38c6, 0xb38d7, 0xb3a86, 0xb3a97, 0xb3c46,
+ 0xb3c57, 0xb3e06, 0xb3e17, 0xb3fc6, 0xb3fd7, 0xb4186,
+ 0xb4197, 0xb4346, 0xb4357, 0xb4506, 0xb4517, 0xb46c6,
+ 0xb46d7, 0xb4886, 0xb4897, 0xb4a46, 0xb4a57, 0xb4c06,
+ 0xb4c17, 0xb4dc6, 0xb4dd7, 0xb4f86, 0xb4f97, 0xb5146,
+ 0xb5157, 0xb5306, 0xb5317, 0xb54c6, 0xb54d7, 0xb5686,
+ 0xb5697, 0xb5846, 0xb5857, 0xb5a06, 0xb5a17, 0xb5bc6,
+ 0xb5bd7, 0xb5d86, 0xb5d97, 0xb5f46, 0xb5f57, 0xb6106,
+ 0xb6117, 0xb62c6, 0xb62d7, 0xb6486, 0xb6497, 0xb6646,
+ 0xb6657, 0xb6806, 0xb6817, 0xb69c6, 0xb69d7, 0xb6b86,
+ 0xb6b97, 0xb6d46, 0xb6d57, 0xb6f06, 0xb6f17, 0xb70c6,
+ 0xb70d7, 0xb7286, 0xb7297, 0xb7446, 0xb7457, 0xb7606,
+ 0xb7617, 0xb77c6, 0xb77d7, 0xb7986, 0xb7997, 0xb7b46,
+ 0xb7b57, 0xb7d06, 0xb7d17, 0xb7ec6, 0xb7ed7, 0xb8086,
+ 0xb8097, 0xb8246, 0xb8257, 0xb8406, 0xb8417, 0xb85c6,
+ 0xb85d7, 0xb8786, 0xb8797, 0xb8946, 0xb8957, 0xb8b06,
+ 0xb8b17, 0xb8cc6, 0xb8cd7, 0xb8e86, 0xb8e97, 0xb9046,
+ 0xb9057, 0xb9206, 0xb9217, 0xb93c6, 0xb93d7, 0xb9586,
+ 0xb9597, 0xb9746, 0xb9757, 0xb9906, 0xb9917, 0xb9ac6,
+ 0xb9ad7, 0xb9c86, 0xb9c97, 0xb9e46, 0xb9e57, 0xba006,
+ 0xba017, 0xba1c6, 0xba1d7, 0xba386, 0xba397, 0xba546,
+ 0xba557, 0xba706, 0xba717, 0xba8c6, 0xba8d7, 0xbaa86,
+ 0xbaa97, 0xbac46, 0xbac57, 0xbae06, 0xbae17, 0xbafc6,
+ 0xbafd7, 0xbb186, 0xbb197, 0xbb346, 0xbb357, 0xbb506,
+ 0xbb517, 0xbb6c6, 0xbb6d7, 0xbb886, 0xbb897, 0xbba46,
+ 0xbba57, 0xbbc06, 0xbbc17, 0xbbdc6, 0xbbdd7, 0xbbf86,
+ 0xbbf97, 0xbc146, 0xbc157, 0xbc306, 0xbc317, 0xbc4c6,
+ 0xbc4d7, 0xbc686, 0xbc697, 0xbc846, 0xbc857, 0xbca06,
+ 0xbca17, 0xbcbc6, 0xbcbd7, 0xbcd86, 0xbcd97, 0xbcf46,
+ 0xbcf57, 0xbd106, 0xbd117, 0xbd2c6, 0xbd2d7, 0xbd486,
+ 0xbd497, 0xbd646, 0xbd657, 0xbd806, 0xbd817, 0xbd9c6,
+ 0xbd9d7, 0xbdb86, 0xbdb97, 0xbdd46, 0xbdd57, 0xbdf06,
+ 0xbdf17, 0xbe0c6, 0xbe0d7, 0xbe286, 0xbe297, 0xbe446,
+ 0xbe457, 0xbe606, 0xbe617, 0xbe7c6, 0xbe7d7, 0xbe986,
+ 0xbe997, 0xbeb46, 0xbeb57, 0xbed06, 0xbed17, 0xbeec6,
+ 0xbeed7, 0xbf086, 0xbf097, 0xbf246, 0xbf257, 0xbf406,
+ 0xbf417, 0xbf5c6, 0xbf5d7, 0xbf786, 0xbf797, 0xbf946,
+ 0xbf957, 0xbfb06, 0xbfb17, 0xbfcc6, 0xbfcd7, 0xbfe86,
+ 0xbfe97, 0xc0046, 0xc0057, 0xc0206, 0xc0217, 0xc03c6,
+ 0xc03d7, 0xc0586, 0xc0597, 0xc0746, 0xc0757, 0xc0906,
+ 0xc0917, 0xc0ac6, 0xc0ad7, 0xc0c86, 0xc0c97, 0xc0e46,
+ 0xc0e57, 0xc1006, 0xc1017, 0xc11c6, 0xc11d7, 0xc1386,
+ 0xc1397, 0xc1546, 0xc1557, 0xc1706, 0xc1717, 0xc18c6,
+ 0xc18d7, 0xc1a86, 0xc1a97, 0xc1c46, 0xc1c57, 0xc1e06,
+ 0xc1e17, 0xc1fc6, 0xc1fd7, 0xc2186, 0xc2197, 0xc2346,
+ 0xc2357, 0xc2506, 0xc2517, 0xc26c6, 0xc26d7, 0xc2886,
+ 0xc2897, 0xc2a46, 0xc2a57, 0xc2c06, 0xc2c17, 0xc2dc6,
+ 0xc2dd7, 0xc2f86, 0xc2f97, 0xc3146, 0xc3157, 0xc3306,
+ 0xc3317, 0xc34c6, 0xc34d7, 0xc3686, 0xc3697, 0xc3846,
+ 0xc3857, 0xc3a06, 0xc3a17, 0xc3bc6, 0xc3bd7, 0xc3d86,
+ 0xc3d97, 0xc3f46, 0xc3f57, 0xc4106, 0xc4117, 0xc42c6,
+ 0xc42d7, 0xc4486, 0xc4497, 0xc4646, 0xc4657, 0xc4806,
+ 0xc4817, 0xc49c6, 0xc49d7, 0xc4b86, 0xc4b97, 0xc4d46,
+ 0xc4d57, 0xc4f06, 0xc4f17, 0xc50c6, 0xc50d7, 0xc5286,
+ 0xc5297, 0xc5446, 0xc5457, 0xc5606, 0xc5617, 0xc57c6,
+ 0xc57d7, 0xc5986, 0xc5997, 0xc5b46, 0xc5b57, 0xc5d06,
+ 0xc5d17, 0xc5ec6, 0xc5ed7, 0xc6086, 0xc6097, 0xc6246,
+ 0xc6257, 0xc6406, 0xc6417, 0xc65c6, 0xc65d7, 0xc6786,
+ 0xc6797, 0xc6946, 0xc6957, 0xc6b06, 0xc6b17, 0xc6cc6,
+ 0xc6cd7, 0xc6e86, 0xc6e97, 0xc7046, 0xc7057, 0xc7206,
+ 0xc7217, 0xc73c6, 0xc73d7, 0xc7586, 0xc7597, 0xc7746,
+ 0xc7757, 0xc7906, 0xc7917, 0xc7ac6, 0xc7ad7, 0xc7c86,
+ 0xc7c97, 0xc7e46, 0xc7e57, 0xc8006, 0xc8017, 0xc81c6,
+ 0xc81d7, 0xc8386, 0xc8397, 0xc8546, 0xc8557, 0xc8706,
+ 0xc8717, 0xc88c6, 0xc88d7, 0xc8a86, 0xc8a97, 0xc8c46,
+ 0xc8c57, 0xc8e06, 0xc8e17, 0xc8fc6, 0xc8fd7, 0xc9186,
+ 0xc9197, 0xc9346, 0xc9357, 0xc9506, 0xc9517, 0xc96c6,
+ 0xc96d7, 0xc9886, 0xc9897, 0xc9a46, 0xc9a57, 0xc9c06,
+ 0xc9c17, 0xc9dc6, 0xc9dd7, 0xc9f86, 0xc9f97, 0xca146,
+ 0xca157, 0xca306, 0xca317, 0xca4c6, 0xca4d7, 0xca686,
+ 0xca697, 0xca846, 0xca857, 0xcaa06, 0xcaa17, 0xcabc6,
+ 0xcabd7, 0xcad86, 0xcad97, 0xcaf46, 0xcaf57, 0xcb106,
+ 0xcb117, 0xcb2c6, 0xcb2d7, 0xcb486, 0xcb497, 0xcb646,
+ 0xcb657, 0xcb806, 0xcb817, 0xcb9c6, 0xcb9d7, 0xcbb86,
+ 0xcbb97, 0xcbd46, 0xcbd57, 0xcbf06, 0xcbf17, 0xcc0c6,
+ 0xcc0d7, 0xcc286, 0xcc297, 0xcc446, 0xcc457, 0xcc606,
+ 0xcc617, 0xcc7c6, 0xcc7d7, 0xcc986, 0xcc997, 0xccb46,
+ 0xccb57, 0xccd06, 0xccd17, 0xccec6, 0xcced7, 0xcd086,
+ 0xcd097, 0xcd246, 0xcd257, 0xcd406, 0xcd417, 0xcd5c6,
+ 0xcd5d7, 0xcd786, 0xcd797, 0xcd946, 0xcd957, 0xcdb06,
+ 0xcdb17, 0xcdcc6, 0xcdcd7, 0xcde86, 0xcde97, 0xce046,
+ 0xce057, 0xce206, 0xce217, 0xce3c6, 0xce3d7, 0xce586,
+ 0xce597, 0xce746, 0xce757, 0xce906, 0xce917, 0xceac6,
+ 0xcead7, 0xcec86, 0xcec97, 0xcee46, 0xcee57, 0xcf006,
+ 0xcf017, 0xcf1c6, 0xcf1d7, 0xcf386, 0xcf397, 0xcf546,
+ 0xcf557, 0xcf706, 0xcf717, 0xcf8c6, 0xcf8d7, 0xcfa86,
+ 0xcfa97, 0xcfc46, 0xcfc57, 0xcfe06, 0xcfe17, 0xcffc6,
+ 0xcffd7, 0xd0186, 0xd0197, 0xd0346, 0xd0357, 0xd0506,
+ 0xd0517, 0xd06c6, 0xd06d7, 0xd0886, 0xd0897, 0xd0a46,
+ 0xd0a57, 0xd0c06, 0xd0c17, 0xd0dc6, 0xd0dd7, 0xd0f86,
+ 0xd0f97, 0xd1146, 0xd1157, 0xd1306, 0xd1317, 0xd14c6,
+ 0xd14d7, 0xd1686, 0xd1697, 0xd1846, 0xd1857, 0xd1a06,
+ 0xd1a17, 0xd1bc6, 0xd1bd7, 0xd1d86, 0xd1d97, 0xd1f46,
+ 0xd1f57, 0xd2106, 0xd2117, 0xd22c6, 0xd22d7, 0xd2486,
+ 0xd2497, 0xd2646, 0xd2657, 0xd2806, 0xd2817, 0xd29c6,
+ 0xd29d7, 0xd2b86, 0xd2b97, 0xd2d46, 0xd2d57, 0xd2f06,
+ 0xd2f17, 0xd30c6, 0xd30d7, 0xd3286, 0xd3297, 0xd3446,
+ 0xd3457, 0xd3606, 0xd3617, 0xd37c6, 0xd37d7, 0xd3986,
+ 0xd3997, 0xd3b46, 0xd3b57, 0xd3d06, 0xd3d17, 0xd3ec6,
+ 0xd3ed7, 0xd4086, 0xd4097, 0xd4246, 0xd4257, 0xd4406,
+ 0xd4417, 0xd45c6, 0xd45d7, 0xd4786, 0xd4797, 0xd4946,
+ 0xd4957, 0xd4b06, 0xd4b17, 0xd4cc6, 0xd4cd7, 0xd4e86,
+ 0xd4e97, 0xd5046, 0xd5057, 0xd5206, 0xd5217, 0xd53c6,
+ 0xd53d7, 0xd5586, 0xd5597, 0xd5746, 0xd5757, 0xd5906,
+ 0xd5917, 0xd5ac6, 0xd5ad7, 0xd5c86, 0xd5c97, 0xd5e46,
+ 0xd5e57, 0xd6006, 0xd6017, 0xd61c6, 0xd61d7, 0xd6386,
+ 0xd6397, 0xd6546, 0xd6557, 0xd6706, 0xd6717, 0xd68c6,
+ 0xd68d7, 0xd6a86, 0xd6a97, 0xd6c46, 0xd6c57, 0xd6e06,
+ 0xd6e17, 0xd6fc6, 0xd6fd7, 0xd7186, 0xd7197, 0xd7346,
+ 0xd7357, 0xd7506, 0xd7517, 0xd76c6, 0xd76d7, 0xd7886,
+ 0xd7897, 0xd7a48, 0xd7b0d, 0xd7c78, 0xd7cbc, 0xd7fc8,
+ 0xfb1e3, 0xfb1f8, 0xfe003, 0xfe108, 0xfe203, 0xfe308,
+ 0xfeff2, 0xff008, 0xff9e3, 0xffa08, 0xfff02, 0xfffc8,
+ 0x101fd3, 0x101fe8, 0x102e03, 0x102e18, 0x103763, 0x1037b8,
+ 0x10a013, 0x10a048, 0x10a053, 0x10a078, 0x10a0c3, 0x10a108,
+ 0x10a383, 0x10a3b8, 0x10a3f3, 0x10a408, 0x10ae53, 0x10ae78,
+ 0x10d243, 0x10d288, 0x10eab3, 0x10ead8, 0x10efd3, 0x10f008,
+ 0x10f463, 0x10f518, 0x10f823, 0x10f868, 0x11000b, 0x110013,
+ 0x11002b, 0x110038, 0x110383, 0x110478, 0x110703, 0x110718,
+ 0x110733, 0x110758, 0x1107f3, 0x11082b, 0x110838, 0x110b0b,
+ 0x110b33, 0x110b7b, 0x110b93, 0x110bb8, 0x110bd9, 0x110be8,
+ 0x110c23, 0x110c38, 0x110cd9, 0x110ce8, 0x111003, 0x111038,
+ 0x111273, 0x1112cb, 0x1112d3, 0x111358, 0x11145b, 0x111478,
+ 0x111733, 0x111748, 0x111803, 0x11182b, 0x111838, 0x111b3b,
+ 0x111b63, 0x111bfb, 0x111c18, 0x111c29, 0x111c48, 0x111c93,
+ 0x111cd8, 0x111ceb, 0x111cf3, 0x111d08, 0x1122cb, 0x1122f3,
+ 0x11232b, 0x112343, 0x11235b, 0x112363, 0x112388, 0x1123e3,
+ 0x1123f8, 0x112413, 0x112428, 0x112df3, 0x112e0b, 0x112e33,
+ 0x112eb8, 0x113003, 0x11302b, 0x113048, 0x1133b3, 0x1133d8,
+ 0x1133e3, 0x1133fb, 0x113403, 0x11341b, 0x113458, 0x11347b,
+ 0x113498, 0x1134bb, 0x1134e8, 0x113573, 0x113588, 0x11362b,
+ 0x113648, 0x113663, 0x1136d8, 0x113703, 0x113758, 0x11435b,
+ 0x114383, 0x11440b, 0x114423, 0x11445b, 0x114463, 0x114478,
+ 0x1145e3, 0x1145f8, 0x114b03, 0x114b1b, 0x114b33, 0x114b9b,
+ 0x114ba3, 0x114bbb, 0x114bd3, 0x114beb, 0x114bf3, 0x114c1b,
+ 0x114c23, 0x114c48, 0x115af3, 0x115b0b, 0x115b23, 0x115b68,
+ 0x115b8b, 0x115bc3, 0x115beb, 0x115bf3, 0x115c18, 0x115dc3,
+ 0x115de8, 0x11630b, 0x116333, 0x1163bb, 0x1163d3, 0x1163eb,
+ 0x1163f3, 0x116418, 0x116ab3, 0x116acb, 0x116ad3, 0x116aeb,
+ 0x116b03, 0x116b6b, 0x116b73, 0x116b88, 0x1171d3, 0x117208,
+ 0x117223, 0x11726b, 0x117273, 0x1172c8, 0x1182cb, 0x1182f3,
+ 0x11838b, 0x118393, 0x1183b8, 0x119303, 0x11931b, 0x119368,
+ 0x11937b, 0x119398, 0x1193b3, 0x1193db, 0x1193e3, 0x1193f9,
+ 0x11940b, 0x119419, 0x11942b, 0x119433, 0x119448, 0x119d1b,
+ 0x119d43, 0x119d88, 0x119da3, 0x119dcb, 0x119e03, 0x119e18,
+ 0x119e4b, 0x119e58, 0x11a013, 0x11a0b8, 0x11a333, 0x11a39b,
+ 0x11a3a9, 0x11a3b3, 0x11a3f8, 0x11a473, 0x11a488, 0x11a513,
+ 0x11a57b, 0x11a593, 0x11a5c8, 0x11a849, 0x11a8a3, 0x11a97b,
+ 0x11a983, 0x11a9a8, 0x11c2fb, 0x11c303, 0x11c378, 0x11c383,
+ 0x11c3eb, 0x11c3f3, 0x11c408, 0x11c923, 0x11ca88, 0x11ca9b,
+ 0x11caa3, 0x11cb1b, 0x11cb23, 0x11cb4b, 0x11cb53, 0x11cb78,
+ 0x11d313, 0x11d378, 0x11d3a3, 0x11d3b8, 0x11d3c3, 0x11d3e8,
+ 0x11d3f3, 0x11d469, 0x11d473, 0x11d488, 0x11d8ab, 0x11d8f8,
+ 0x11d903, 0x11d928, 0x11d93b, 0x11d953, 0x11d96b, 0x11d973,
+ 0x11d988, 0x11ef33, 0x11ef5b, 0x11ef78, 0x11f003, 0x11f029,
+ 0x11f03b, 0x11f048, 0x11f34b, 0x11f363, 0x11f3b8, 0x11f3eb,
+ 0x11f403, 0x11f41b, 0x11f423, 0x11f438, 0x134302, 0x134403,
+ 0x134418, 0x134473, 0x134568, 0x16af03, 0x16af58, 0x16b303,
+ 0x16b378, 0x16f4f3, 0x16f508, 0x16f51b, 0x16f888, 0x16f8f3,
+ 0x16f938, 0x16fe43, 0x16fe58, 0x16ff0b, 0x16ff28, 0x1bc9d3,
+ 0x1bc9f8, 0x1bca02, 0x1bca48, 0x1cf003, 0x1cf2e8, 0x1cf303,
+ 0x1cf478, 0x1d1653, 0x1d166b, 0x1d1673, 0x1d16a8, 0x1d16db,
+ 0x1d16e3, 0x1d1732, 0x1d17b3, 0x1d1838, 0x1d1853, 0x1d18c8,
+ 0x1d1aa3, 0x1d1ae8, 0x1d2423, 0x1d2458, 0x1da003, 0x1da378,
+ 0x1da3b3, 0x1da6d8, 0x1da753, 0x1da768, 0x1da843, 0x1da858,
+ 0x1da9b3, 0x1daa08, 0x1daa13, 0x1dab08, 0x1e0003, 0x1e0078,
+ 0x1e0083, 0x1e0198, 0x1e01b3, 0x1e0228, 0x1e0233, 0x1e0258,
+ 0x1e0263, 0x1e02b8, 0x1e08f3, 0x1e0908, 0x1e1303, 0x1e1378,
+ 0x1e2ae3, 0x1e2af8, 0x1e2ec3, 0x1e2f08, 0x1e4ec3, 0x1e4f08,
+ 0x1e8d03, 0x1e8d78, 0x1e9443, 0x1e94b8, 0x1f1e6a, 0x1f2008,
+ 0x1f3fb3, 0x1f4008, 0xe00002, 0xe00203, 0xe00802, 0xe01003,
+ 0xe01f02, 0xe10008,
+ };
+
+ inline constexpr char32_t __incb_linkers[] = {
+ 0x094d, 0x09cd, 0x0acd, 0x0b4d, 0x0c4d, 0x0d4d,
+ };
+
+ enum class _InCB { _Consonant = 1, _Extend = 2 };
+
+ // Values generated by contrib/unicode/gen_std_format_width.py,
+ // from DerivedCoreProperties.txt from the Unicode standard.
+ // Entries are (code_point << 2) + property.
+ inline constexpr uint32_t __incb_edges[] = {
+ 0xc02, 0xd3c, 0xd42, 0xdc0, 0x120e, 0x1220,
+ 0x1646, 0x16f8, 0x16fe, 0x1700, 0x1706, 0x170c,
+ 0x1712, 0x1718, 0x171e, 0x1720, 0x1842, 0x186c,
+ 0x192e, 0x1980, 0x19c2, 0x19c4, 0x1b5a, 0x1b74,
+ 0x1b7e, 0x1b94, 0x1b9e, 0x1ba4, 0x1baa, 0x1bb8,
+ 0x1c46, 0x1c48, 0x1cc2, 0x1d2c, 0x1fae, 0x1fd0,
+ 0x1ff6, 0x1ff8, 0x205a, 0x2068, 0x206e, 0x2090,
+ 0x2096, 0x20a0, 0x20a6, 0x20b8, 0x2166, 0x2170,
+ 0x2262, 0x2280, 0x232a, 0x2388, 0x238e, 0x2400,
+ 0x2455, 0x24e8, 0x24f2, 0x24f4, 0x2546, 0x2554,
+ 0x2561, 0x2580, 0x25e1, 0x2600, 0x2655, 0x26a4,
+ 0x26a9, 0x26c4, 0x26c9, 0x26cc, 0x26d9, 0x26e8,
+ 0x26f2, 0x26f4, 0x2771, 0x2778, 0x277d, 0x2780,
+ 0x27c1, 0x27c8, 0x27fa, 0x27fc, 0x28f2, 0x28f4,
+ 0x2a55, 0x2aa4, 0x2aa9, 0x2ac4, 0x2ac9, 0x2ad0,
+ 0x2ad5, 0x2ae8, 0x2af2, 0x2af4, 0x2be5, 0x2be8,
+ 0x2c55, 0x2ca4, 0x2ca9, 0x2cc4, 0x2cc9, 0x2cd0,
+ 0x2cd5, 0x2ce8, 0x2cf2, 0x2cf4, 0x2d71, 0x2d78,
+ 0x2d7d, 0x2d80, 0x2dc5, 0x2dc8, 0x3055, 0x30a4,
+ 0x30a9, 0x30e8, 0x30f2, 0x30f4, 0x3156, 0x315c,
+ 0x3161, 0x316c, 0x32f2, 0x32f4, 0x3455, 0x34ee,
+ 0x34f4, 0x38e2, 0x38ec, 0x3922, 0x3930, 0x3ae2,
+ 0x3aec, 0x3b22, 0x3b30, 0x3c62, 0x3c68, 0x3cd6,
+ 0x3cd8, 0x3cde, 0x3ce0, 0x3ce6, 0x3ce8, 0x3dc6,
+ 0x3dcc, 0x3dd2, 0x3dd4, 0x3dea, 0x3df8, 0x3e02,
+ 0x3e04, 0x3e0a, 0x3e14, 0x3e1a, 0x3e20, 0x3f1a,
+ 0x3f1c, 0x40de, 0x40e0, 0x40e6, 0x40ec, 0x4236,
+ 0x4238, 0x4d76, 0x4d80, 0x5c52, 0x5c54, 0x5f4a,
+ 0x5f4c, 0x5f76, 0x5f78, 0x62a6, 0x62a8, 0x64e6,
+ 0x64f0, 0x685e, 0x6864, 0x6982, 0x6984, 0x69d6,
+ 0x69f4, 0x69fe, 0x6a00, 0x6ac2, 0x6af8, 0x6afe,
+ 0x6b3c, 0x6cd2, 0x6cd4, 0x6dae, 0x6dd0, 0x6eae,
+ 0x6eb0, 0x6f9a, 0x6f9c, 0x70de, 0x70e0, 0x7342,
+ 0x734c, 0x7352, 0x7384, 0x738a, 0x73a4, 0x73b6,
+ 0x73b8, 0x73d2, 0x73d4, 0x73e2, 0x73e8, 0x7702,
+ 0x7800, 0x8036, 0x8038, 0x8342, 0x8374, 0x8386,
+ 0x8388, 0x8396, 0x83c4, 0xb3be, 0xb3c8, 0xb5fe,
+ 0xb600, 0xb782, 0xb800, 0xc0aa, 0xc0c0, 0xc266,
+ 0xc26c, 0x299be, 0x299c0, 0x299d2, 0x299f8, 0x29a7a,
+ 0x29a80, 0x29bc2, 0x29bc8, 0x2a0b2, 0x2a0b4, 0x2a382,
+ 0x2a3c8, 0x2a4ae, 0x2a4b8, 0x2a6ce, 0x2a6d0, 0x2aac2,
+ 0x2aac4, 0x2aaca, 0x2aad4, 0x2aade, 0x2aae4, 0x2aafa,
+ 0x2ab00, 0x2ab06, 0x2ab08, 0x2abda, 0x2abdc, 0x2afb6,
+ 0x2afb8, 0x3ec7a, 0x3ec7c, 0x3f882, 0x3f8c0, 0x407f6,
+ 0x407f8, 0x40b82, 0x40b84, 0x40dda, 0x40dec, 0x42836,
+ 0x42838, 0x4283e, 0x42840, 0x428e2, 0x428ec, 0x428fe,
+ 0x42900, 0x42b96, 0x42b9c, 0x43492, 0x434a0, 0x43aae,
+ 0x43ab4, 0x43bf6, 0x43c00, 0x43d1a, 0x43d44, 0x43e0a,
+ 0x43e18, 0x441c2, 0x441c4, 0x441fe, 0x44200, 0x442ea,
+ 0x442ec, 0x44402, 0x4440c, 0x444ce, 0x444d4, 0x445ce,
+ 0x445d0, 0x4472a, 0x4472c, 0x448da, 0x448dc, 0x44ba6,
+ 0x44bac, 0x44cee, 0x44cf4, 0x44d9a, 0x44db4, 0x44dc2,
+ 0x44dd4, 0x4511a, 0x4511c, 0x4517a, 0x4517c, 0x4530e,
+ 0x45310, 0x45702, 0x45704, 0x45ade, 0x45ae0, 0x45cae,
+ 0x45cb0, 0x460ea, 0x460ec, 0x464fa, 0x464fc, 0x4650e,
+ 0x46510, 0x468d2, 0x468d4, 0x4691e, 0x46920, 0x46a66,
+ 0x46a68, 0x4750a, 0x4750c, 0x47512, 0x47518, 0x4765e,
+ 0x47660, 0x47d0a, 0x47d0c, 0x5abc2, 0x5abd4, 0x5acc2,
+ 0x5acdc, 0x6f27a, 0x6f27c, 0x74596, 0x74598, 0x7459e,
+ 0x745a8, 0x745ba, 0x745cc, 0x745ee, 0x7460c, 0x74616,
+ 0x74630, 0x746aa, 0x746b8, 0x7490a, 0x74914, 0x78002,
+ 0x7801c, 0x78022, 0x78064, 0x7806e, 0x78088, 0x7808e,
+ 0x78094, 0x7809a, 0x780ac, 0x7823e, 0x78240, 0x784c2,
+ 0x784dc, 0x78aba, 0x78abc, 0x78bb2, 0x78bc0, 0x793b2,
+ 0x793c0, 0x7a342, 0x7a35c, 0x7a512, 0x7a52c,
+ };
+
+ // Table generated by contrib/unicode/gen_std_format_width.py,
+ // from emoji-data.txt from the Unicode standard.
+ inline constexpr char32_t __xpicto_edges[] = {
+ 0xa9, 0xaa, 0xae, 0xaf, 0x203c, 0x203d, 0x2049, 0x204a,
+ 0x2122, 0x2123, 0x2139, 0x213a, 0x2194, 0x219a, 0x21a9, 0x21ab,
+ 0x231a, 0x231c, 0x2328, 0x2329, 0x2388, 0x2389, 0x23cf, 0x23d0,
+ 0x23e9, 0x23f4, 0x23f8, 0x23fb, 0x24c2, 0x24c3, 0x25aa, 0x25ac,
+ 0x25b6, 0x25b7, 0x25c0, 0x25c1, 0x25fb, 0x25ff, 0x2600, 0x2606,
+ 0x2607, 0x2613, 0x2614, 0x2686, 0x2690, 0x2706, 0x2708, 0x2713,
+ 0x2714, 0x2715, 0x2716, 0x2717, 0x271d, 0x271e, 0x2721, 0x2722,
+ 0x2728, 0x2729, 0x2733, 0x2735, 0x2744, 0x2745, 0x2747, 0x2748,
+ 0x274c, 0x274d, 0x274e, 0x274f, 0x2753, 0x2756, 0x2757, 0x2758,
+ 0x2763, 0x2768, 0x2795, 0x2798, 0x27a1, 0x27a2, 0x27b0, 0x27b1,
+ 0x27bf, 0x27c0, 0x2934, 0x2936, 0x2b05, 0x2b08, 0x2b1b, 0x2b1d,
+ 0x2b50, 0x2b51, 0x2b55, 0x2b56, 0x3030, 0x3031, 0x303d, 0x303e,
+ 0x3297, 0x3298, 0x3299, 0x329a, 0x1f000, 0x1f100, 0x1f10d, 0x1f110,
+ 0x1f12f, 0x1f130, 0x1f16c, 0x1f172, 0x1f17e, 0x1f180, 0x1f18e, 0x1f18f,
+ 0x1f191, 0x1f19b, 0x1f1ad, 0x1f1e6, 0x1f201, 0x1f210, 0x1f21a, 0x1f21b,
+ 0x1f22f, 0x1f230, 0x1f232, 0x1f23b, 0x1f23c, 0x1f240, 0x1f249, 0x1f3fb,
+ 0x1f400, 0x1f53e, 0x1f546, 0x1f650, 0x1f680, 0x1f700, 0x1f774, 0x1f780,
+ 0x1f7d5, 0x1f800, 0x1f80c, 0x1f810, 0x1f848, 0x1f850, 0x1f85a, 0x1f860,
+ 0x1f888, 0x1f890, 0x1f8ae, 0x1f900, 0x1f90c, 0x1f93b, 0x1f93c, 0x1f946,
+ 0x1f947, 0x1fb00, 0x1fc00, 0x1fffe,
+ };
+
+#undef _GLIBCXX_GET_UNICODE_DATA
diff --git a/libstdc++-v3/include/bits/unicode.h b/libstdc++-v3/include/bits/unicode.h
new file mode 100644
index 0000000..66f8399
--- /dev/null
+++ b/libstdc++-v3/include/bits/unicode.h
@@ -0,0 +1,1065 @@
+// Unicode utilities -*- C++ -*-
+
+// Copyright The GNU Toolchain Authors.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file include/bits/unicode.h
+ * This is an internal header file, included by other library headers.
+ * Do not attempt to use it directly. @headername{format}
+ */
+
+#ifndef _GLIBCXX_UNICODE_H
+#define _GLIBCXX_UNICODE_H 1
+
+#if __cplusplus >= 202002L
+#include <array>
+#include <bit>
+#include <cstdint>
+#include <bits/stl_algo.h>
+#include <bits/stl_iterator.h>
+#include <bits/ranges_base.h>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+namespace __unicode
+{
+ // A Unicode code point that is not a high or low surrogate.
+ constexpr bool
+ __is_scalar_value(char32_t __c)
+ {
+ if (__c < 0xD800) [[likely]]
+ return true;
+ return 0xDFFF < __c && __c <= 0x10FFFF;
+ }
+
+ // A code point that can be encoded in a single code unit of type _CharT.
+ template<typename _CharT>
+ constexpr bool
+ __is_single_code_unit(char32_t __c)
+ {
+ if constexpr (__gnu_cxx::__int_traits<_CharT>::__max <= 0xFF)
+ return __c < 0x7F; // ASCII character
+ else
+ return __c < __gnu_cxx::__int_traits<_CharT>::__max
+ && __is_scalar_value(__c);
+ }
+
+ // Based on https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2728r6.html#add-the-transcoding-iterator-template
+
+ struct _Repl
+ {
+ constexpr char32_t
+ operator()() const noexcept
+ { return 0xFFFD; }
+ };
+
+ struct _Null_sentinel_t
+ {
+ template<input_iterator _It>
+ requires default_initializable<iter_value_t<_It>>
+ && equality_comparable_with<iter_reference_t<_It>, iter_value_t<_It>>
+ friend constexpr auto
+ operator==(_It __it, _Null_sentinel_t)
+ { return *__it == iter_value_t<_It>{}; }
+ };
+
+ inline constexpr _Null_sentinel_t __null_sentinel;
+
+ template<typename _FromFmt, typename _ToFmt,
+ input_iterator _Iter, sentinel_for<_Iter> _Sent = _Iter,
+ typename _ErrorHandler = _Repl>
+ requires convertible_to<iter_value_t<_Iter>, _FromFmt>
+ class _Utf_iterator
+ {
+ static_assert(forward_iterator<_Iter> || noexcept(_ErrorHandler()()));
+
+ public:
+ using value_type = _ToFmt;
+ using difference_type = iter_difference_t<_Iter>;
+ using reference = value_type;
+ using iterator_concept
+ = std::__detail::__clamp_iter_cat<__iter_category_t<_Iter>,
+ bidirectional_iterator_tag>;
+
+ constexpr _Utf_iterator() = default;
+
+ constexpr
+ _Utf_iterator(_Iter __first, _Iter __it, _Sent __last)
+ requires bidirectional_iterator<_Iter>
+ : _M_first_and_curr{__first, __it}, _M_last(__last)
+ {
+ if (_M_curr() != _M_last)
+ _M_read();
+ else
+ _M_buf = {};
+ }
+
+ constexpr
+ _Utf_iterator(_Iter __it, _Sent __last)
+ requires (!bidirectional_iterator<_Iter>)
+ : _M_first_and_curr{__it}, _M_last(__last)
+ {
+ if (_M_curr() != _M_last)
+ _M_read();
+ else
+ _M_buf = {};
+ }
+
+ template<class _Iter2, class _Sent2>
+ requires convertible_to<_Iter2, _Iter> && convertible_to<_Sent2, _Sent>
+ constexpr
+ _Utf_iterator(const _Utf_iterator<_FromFmt, _ToFmt, _Iter2, _Sent2,
+ _ErrorHandler>& __other)
+ : _M_buf(__other._M_buf), _M_first_and_curr(__other._M_first_and_curr),
+ _M_buf_index(__other._M_buf_index), _M_buf_last(__other._M_buf_last),
+ _M_last(__other._M_last)
+ { }
+
+ [[nodiscard]]
+ constexpr _Iter
+ begin() const requires bidirectional_iterator<_Iter>
+ { return _M_first(); }
+
+ [[nodiscard]]
+ constexpr _Sent
+ end() const { return _M_last; }
+
+ [[nodiscard]]
+ constexpr _Iter
+ base() const requires forward_iterator<_Iter>
+ { return _M_curr(); }
+
+ [[nodiscard]]
+ constexpr value_type
+ operator*() const { return _M_buf[_M_buf_index]; }
+
+ constexpr _Utf_iterator&
+ operator++()
+ {
+ if (_M_buf_index + 1 == _M_buf_last && _M_curr() != _M_last)
+ {
+ if constexpr (forward_iterator<_Iter>)
+ std::advance(_M_curr(), _M_to_increment);
+ if (_M_curr() == _M_last)
+ _M_buf_index = 0;
+ else
+ _M_read();
+ }
+ else if (_M_buf_index + 1 <= _M_buf_last)
+ ++_M_buf_index;
+ return *this;
+ }
+
+ constexpr _Utf_iterator
+ operator++(int)
+ {
+ auto __tmp = *this;
+ ++*this;
+ return __tmp;
+ }
+
+ constexpr _Utf_iterator&
+ operator--() requires bidirectional_iterator<_Iter>
+ {
+ if (!_M_buf_index && _M_curr() != _M_first())
+ _M_read_reverse();
+ else if (_M_buf_index)
+ --_M_buf_index;
+ return *this;
+ }
+
+ constexpr _Utf_iterator
+ operator--(int)
+ {
+ auto __tmp = *this;
+ --*this;
+ return __tmp;
+ }
+
+ [[nodiscard]]
+ friend constexpr bool
+ operator==(_Utf_iterator __lhs, _Utf_iterator __rhs)
+ requires forward_iterator<_Iter> || requires (_Iter __i) { __i != __i; }
+ {
+ if constexpr (forward_iterator<_Iter>)
+ return __lhs._M_curr() == __rhs._M_curr()
+ && __lhs._M_buf_index == __rhs._M_buf_index;
+ else if (__lhs._M_curr() != __rhs._M_curr())
+ return false;
+ else if (__lhs._M_buf_index == __rhs._M_buf_index
+ && __lhs._M_buf_last == __rhs._M_buf_last)
+ return true;
+ else
+ return __lhs._M_buf_index == __lhs._M_buf_last
+ && __rhs._M_buf_index == __rhs._M_buf_last;
+ }
+
+ [[nodiscard]]
+ friend constexpr bool
+ operator==(_Utf_iterator __lhs, _Sent __rhs)
+ {
+ if constexpr (forward_iterator<_Iter>)
+ return __lhs._M_curr() == __rhs;
+ else
+ return __lhs._M_curr() == __rhs
+ && __lhs._M_buf_index == __lhs._M_buf_last;
+ }
+
+ private:
+ constexpr void
+ _M_read()
+ {
+ if constexpr (sizeof(_FromFmt) == sizeof(uint8_t))
+ _M_read_utf8();
+ else if constexpr (sizeof(_FromFmt) == sizeof(uint16_t))
+ _M_read_utf16();
+ else
+ {
+ static_assert(sizeof(_FromFmt) == sizeof(uint32_t));
+ _M_read_utf32();
+ }
+ }
+
+ constexpr void
+ _M_read_reverse(); // TODO
+
+ template<typename>
+ struct _Guard
+ {
+ _Guard(void*, _Iter&) { }
+ };
+
+ template<typename _It> requires forward_iterator<_It>
+ struct _Guard<_It>
+ {
+ constexpr ~_Guard() { _M_this->_M_curr() = std::move(_M_orig); }
+ _Utf_iterator* _M_this;
+ _It _M_orig;
+ };
+
+ constexpr void
+ _M_read_utf8()
+ {
+ _Guard<_Iter> __g{this, _M_curr()};
+ char32_t __c{};
+ uint8_t __u = *_M_curr()++;
+ const uint8_t __lo_bound = 0x80, __hi_bound = 0xBF;
+ uint8_t __to_incr = 1;
+
+ if (__u <= 0x7F) [[likely]] // 0x00 to 0x7F
+ __c = __u;
+ else if (__u < 0xC2) [[unlikely]]
+ __c = _S_error();
+ else if (_M_curr() == _M_last) [[unlikely]]
+ __c = _S_error();
+ else if (__u <= 0xDF) // 0xC2 to 0xDF
+ {
+ __c = __u & 0x1F;
+ __u = *_M_curr();
+
+ if (__u < __lo_bound || __u > __hi_bound) [[unlikely]]
+ __c = _S_error();
+ else
+ {
+ __c = (__c << 6) | (__u & 0x3F);
+ ++_M_curr();
+ ++__to_incr;
+ }
+ }
+ else if (__u <= 0xEF) // 0xE0 to 0xEF
+ {
+ const uint8_t __lo_bound_2 = __u == 0xE0 ? 0xA0 : __lo_bound;
+ const uint8_t __hi_bound_2 = __u == 0xED ? 0x9F : __hi_bound;
+
+ __c = __u & 0x0F;
+ __u = *_M_curr();
+
+ if (__u < __lo_bound_2 || __u > __hi_bound_2) [[unlikely]]
+ __c = _S_error();
+ else if (++_M_curr() == _M_last) [[unlikely]]
+ __c = _S_error();
+ else
+ {
+ ++__to_incr;
+ __c = (__c << 6) | (__u & 0x3F);
+ __u = *_M_curr();
+
+ if (__u < __lo_bound || __u > __hi_bound) [[unlikely]]
+ __c = _S_error();
+ else
+ {
+ __c = (__c << 6) | (__u & 0x3F);
+ ++_M_curr();
+ ++__to_incr;
+ }
+ }
+ }
+ else if (__u <= 0xF4) // 0xF0 to 0xF4
+ {
+ const uint8_t __lo_bound_2 = __u == 0xF0 ? 0x90 : __lo_bound;
+ const uint8_t __hi_bound_2 = __u == 0xF4 ? 0x8F : __hi_bound;
+
+ __c = __u & 0x07;
+ __u = *_M_curr();
+
+ if (__u < __lo_bound_2 || __u > __hi_bound_2) [[unlikely]]
+ __c = _S_error();
+ else if (++_M_curr() == _M_last) [[unlikely]]
+ __c = _S_error();
+ else
+ {
+ ++__to_incr;
+ __c = (__c << 6) | (__u & 0x3F);
+ __u = *_M_curr();
+
+ if (__u < __lo_bound || __u > __hi_bound) [[unlikely]]
+ __c = _S_error();
+ else if (++_M_curr() == _M_last) [[unlikely]]
+ __c = _S_error();
+ else
+ {
+ ++__to_incr;
+ __c = (__c << 6) | (__u & 0x3F);
+ __u = *_M_curr();
+
+ if (__u < __lo_bound || __u > __hi_bound) [[unlikely]]
+ __c = _S_error();
+ else
+ {
+ __c = (__c << 6) | (__u & 0x3F);
+ ++_M_curr();
+ ++__to_incr;
+ }
+ }
+ }
+ }
+ else [[unlikely]]
+ __c = _S_error();
+
+ _M_update(__c, __to_incr);
+ }
+
+ constexpr void
+ _M_read_utf16()
+ {
+ _Guard<_Iter> __g{this, _M_curr()};
+ char32_t __c{};
+ uint16_t __u = *_M_curr()++;
+ uint8_t __to_incr = 1;
+
+ if (__u < 0xD800 || __u > 0xDFFF) [[likely]]
+ __c = __u;
+ else if (__u < 0xDC00 && _M_curr() != _M_last)
+ {
+ uint16_t __u2 = *_M_curr();
+ if (__u2 < 0xDC00 || __u2 > 0xDFFF) [[unlikely]]
+ __c = _S_error();
+ else
+ {
+ ++_M_curr();
+ __to_incr = 2;
+ uint32_t __x = (__u & 0x3F) << 10 | __u2 & 0x3FF;
+ uint32_t __w = (__u >> 6) & 0x1F;
+ __c = (__w + 1) << 16 | __x;
+ }
+ }
+ else
+ __c = _S_error();
+
+ _M_update(__c, __to_incr);
+ }
+
+ constexpr void
+ _M_read_utf32()
+ {
+ _Guard<_Iter> __g{this, _M_curr()};
+ char32_t __c = *_M_curr()++;
+ if (!__is_scalar_value(__c)) [[unlikely]]
+ __c = _S_error();
+ _M_update(__c, 1);
+ }
+
+ // Encode the code point __c as one or more code units in _M_buf.
+ constexpr void
+ _M_update(char32_t __c, uint8_t __to_incr)
+ {
+ _M_to_increment = __to_incr;
+ _M_buf_index = 0;
+ if constexpr (sizeof(_ToFmt) == sizeof(uint32_t))
+ {
+ _M_buf[0] = __c;
+ _M_buf_last = 1;
+ }
+ else if constexpr (sizeof(_ToFmt) == sizeof(uint16_t))
+ {
+ if (__is_single_code_unit<_ToFmt>(__c))
+ {
+ _M_buf[0] = __c;
+ _M_buf[1] = 0;
+ _M_buf_last = 1;
+ }
+ else
+ {
+ // From http://www.unicode.org/faq/utf_bom.html#utf16-4
+ const char32_t __lead_offset = 0xD800 - (0x10000 >> 10);
+ char16_t __lead = __lead_offset + (__c >> 10);
+ char16_t __trail = 0xDC00 + (__c & 0x3FF);
+ _M_buf[0] = __lead;
+ _M_buf[1] = __trail;
+ _M_buf_last = 2;
+ }
+ }
+ else
+ {
+ static_assert(sizeof(_ToFmt) == 1);
+ int __bits = std::bit_width((uint32_t)__c);
+ if (__bits <= 7) [[likely]]
+ {
+ _M_buf[0] = __c;
+ _M_buf[1] = _M_buf[2] = _M_buf[3] = 0;
+ _M_buf_last = 1;
+ }
+ else if (__bits <= 11)
+ {
+ _M_buf[0] = 0xC0 | (__c >> 6);
+ _M_buf[1] = 0x80 | (__c & 0x3F);
+ _M_buf[2] = _M_buf[3] = 0;
+ _M_buf_last = 2;
+ }
+ else if (__bits <= 16)
+ {
+ _M_buf[0] = 0xE0 | (__c >> 12);
+ _M_buf[1] = 0x80 | ((__c >> 6) & 0x3F);
+ _M_buf[2] = 0x80 | (__c & 0x3F);
+ _M_buf[3] = 0;
+ _M_buf_last = 3;
+ }
+ else
+ {
+ _M_buf[0] = 0xF0 | ((__c >> 18) & 0x07);
+ _M_buf[1] = 0x80 | ((__c >> 12) & 0x3F);
+ _M_buf[2] = 0x80 | ((__c >> 6) & 0x3F);
+ _M_buf[3] = 0x80 | (__c & 0x3F);
+ _M_buf_last = 4;
+ }
+ }
+ }
+
+ constexpr char32_t
+ _S_error()
+ {
+ char32_t __c = _ErrorHandler()();
+ __glibcxx_assert(__is_scalar_value(__c));
+ return __c;
+ }
+
+ constexpr _Iter
+ _M_first() const requires bidirectional_iterator<_Iter>
+ { return _M_first_and_curr._M_first; }
+
+ constexpr _Iter&
+ _M_curr() { return _M_first_and_curr._M_curr; }
+
+ constexpr _Iter
+ _M_curr() const { return _M_first_and_curr._M_curr; }
+
+ array<value_type, 4 / sizeof(_ToFmt)> _M_buf;
+
+ template<typename _It>
+ struct _First_and_curr
+ {
+ _First_and_curr() = default;
+
+ constexpr
+ _First_and_curr(_It __curr) : _M_curr(__curr) { }
+
+ template<convertible_to<_It> _It2>
+ constexpr
+ _First_and_curr(const _First_and_curr<_It2>& __other)
+ : _M_curr(__other._M_curr) { }
+
+ _It _M_curr;
+ };
+
+ template<typename _It> requires bidirectional_iterator<_It>
+ struct _First_and_curr<_It>
+ {
+ _First_and_curr() = default;
+
+ constexpr
+ _First_and_curr(_It __first, _It __curr)
+ : _M_first(__first), _M_curr(__curr) { }
+
+ template<convertible_to<_It> _It2>
+ constexpr
+ _First_and_curr(const _First_and_curr<_It2>& __other)
+ : _M_first(__other._M_first), _M_curr(__other._M_curr) { }
+
+ _It _M_first;
+ _It _M_curr;
+ };
+
+ _First_and_curr<_Iter> _M_first_and_curr;
+
+ uint8_t _M_buf_index = 0;
+ uint8_t _M_buf_last = 0;
+ uint8_t _M_to_increment = 0;
+
+ [[no_unique_address]] _Sent _M_last;
+
+ template<typename _FromFmt2, typename _ToFmt2,
+ input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
+ typename _ErrHandler>
+ requires convertible_to<iter_value_t<_Iter2>, _FromFmt2>
+ friend class _Utf_iterator;
+ };
+
+ template<typename _ToFormat, ranges::input_range _Range>
+ class _Utf_view
+ : public ranges::view_interface<_Utf_view<_ToFormat, _Range>>
+ {
+ using _Iterator = _Utf_iterator<ranges::range_value_t<_Range>,
+ _ToFormat, ranges::iterator_t<_Range>,
+ ranges::sentinel_t<_Range>>;
+
+ template<typename _Iter, typename _Sent>
+ constexpr auto
+ _M_begin(_Iter __first, _Sent __last)
+ {
+ if constexpr (bidirectional_iterator<_Iter>)
+ return _Iterator(__first, __first, __last);
+ else
+ return _Iterator(__first, __last);
+ }
+
+ template<typename _Iter, typename _Sent>
+ constexpr auto
+ _M_end(_Iter __first, _Sent __last)
+ {
+ if constexpr (!is_same_v<_Iter, _Sent>)
+ return __last;
+ else if constexpr (bidirectional_iterator<_Iter>)
+ return _Iterator(__first, __last, __last);
+ else
+ return _Iterator(__last, __last);
+ }
+
+ _Range _M_base;
+
+ public:
+ constexpr explicit
+ _Utf_view(_Range&& __r) : _M_base(std::forward<_Range>(__r)) { }
+
+ constexpr auto begin()
+ { return _M_begin(ranges::begin(_M_base), ranges::end(_M_base)); }
+
+ constexpr auto end()
+ { return _M_end(ranges::begin(_M_base), ranges::end(_M_base)); }
+
+ constexpr bool empty() const { return ranges::empty(_M_base); }
+ };
+
+ template<typename _View>
+ using _Utf8_view = _Utf_view<char8_t, _View>;
+ template<typename _View>
+ using _Utf16_view = _Utf_view<char16_t, _View>;
+ template<typename _View>
+ using _Utf32_view = _Utf_view<char32_t, _View>;
+
+inline namespace __v15_1_0
+{
+#define _GLIBCXX_GET_UNICODE_DATA 150100
+#include "unicode-data.h"
+#ifdef _GLIBCXX_GET_UNICODE_DATA
+# error "Invalid unicode data"
+#endif
+
+ // The field width of a code point.
+ constexpr int
+ __field_width(char32_t __c) noexcept
+ {
+ if (__c < __width_edges[0]) [[likely]]
+ return 1;
+
+ auto* __p = std::upper_bound(__width_edges, std::end(__width_edges), __c);
+ return (__p - __width_edges) % 2 + 1;
+ }
+
+ constexpr _Gcb_property
+ __grapheme_cluster_break_property(char32_t __c) noexcept
+ {
+ constexpr uint32_t __mask = (1 << __gcb_shift_bits) - 1;
+ auto* __end = std::end(__gcb_edges);
+ auto* __p = std::lower_bound(__gcb_edges, __end,
+ (__c << __gcb_shift_bits) | __mask);
+ return _Gcb_property(__p[-1] & __mask);
+ }
+
+ constexpr bool
+ __is_incb_linker(char32_t __c) noexcept
+ {
+ const auto __end = std::end(__incb_linkers);
+ // Array is small enough that linear search is faster than binary search.
+ return std::find(__incb_linkers, __end, __c) != __end;
+ }
+
+ constexpr _InCB
+ __incb_property(char32_t __c) noexcept
+ {
+ constexpr uint32_t __mask = 0x3;
+ auto* __end = std::end(__incb_edges);
+ auto* __p = std::lower_bound(__incb_edges, __end, (__c << 2) | __mask);
+ return _InCB(__p[-1] & __mask);
+ }
+
+ constexpr bool
+ __is_extended_pictographic(char32_t __c)
+ {
+ if (__c < __xpicto_edges[0]) [[likely]]
+ return 1;
+
+ auto* __p = std::upper_bound(__xpicto_edges, std::end(__xpicto_edges), __c);
+ return (__p - __xpicto_edges) % 2 + 1;
+ }
+
+ struct _Grapheme_cluster_iterator_base
+ {
+ char32_t _M_c; // First code point in the cluster.
+ _Gcb_property _M_prop; // GCB property of _M_c.
+ enum class _XPicto : unsigned char { _Init, _Zwj, _Matched, _Failed };
+ _XPicto _M_xpicto_seq_state = _XPicto::_Init;
+ unsigned char _M_RI_count = 0;
+ bool _M_incb_linker_seen = false;
+
+ constexpr void
+ _M_reset(char32_t __c, _Gcb_property __p)
+ {
+ _M_c = __c;
+ _M_prop = __p;
+ _M_xpicto_seq_state = _XPicto::_Init;
+ _M_RI_count = 0;
+ _M_incb_linker_seen = false;
+ }
+
+ constexpr void
+ _M_update_xpicto_seq_state(char32_t __c, _Gcb_property __p)
+ {
+ if (_M_xpicto_seq_state == _XPicto::_Failed)
+ return;
+
+ auto __next_state = _XPicto::_Failed;
+ if (_M_xpicto_seq_state != _XPicto::_Zwj) // i.e. Init or Matched
+ {
+ if (__p == _Gcb_property::_Gcb_ZWJ)
+ {
+ if (_M_xpicto_seq_state == _XPicto::_Matched)
+ __next_state = _XPicto::_Zwj;
+ // We check _M_c here so that we do the lookup at most once,
+ // and only for clusters containing at least one ZWJ.
+ else if (__is_extended_pictographic(_M_c))
+ __next_state = _XPicto::_Zwj;
+ }
+ else if (__p == _Gcb_property::_Gcb_Extend)
+ __next_state = _M_xpicto_seq_state; // no change
+ }
+ else // Zwj
+ {
+ // This assumes that all \p{Extended_Pictographic} emoji have
+ // Grapheme_Cluster_Break=Other.
+ if (__p == _Gcb_property::_Gcb_Other
+ && __is_extended_pictographic(__c))
+ __next_state = _XPicto::_Matched;
+ }
+ _M_xpicto_seq_state = __next_state;
+ }
+
+ constexpr void
+ _M_update_ri_count(_Gcb_property __p)
+ {
+ if (__p == _Gcb_property::_Gcb_Regional_Indicator)
+ ++_M_RI_count;
+ else
+ _M_RI_count = 0;
+ }
+
+ constexpr void
+ _M_update_incb_state(char32_t __c, _Gcb_property)
+ {
+ if (__is_incb_linker(__c))
+ _M_incb_linker_seen = true;
+ }
+ };
+
+ // Split a range into extended grapheme clusters.
+ template<ranges::forward_range _View>
+ class _Grapheme_cluster_view
+ : public ranges::view_interface<_Grapheme_cluster_view<_View>>
+ {
+ public:
+
+ constexpr
+ _Grapheme_cluster_view(const _View& __v)
+ : _M_begin(_Utf32_view(__v).begin())
+ { }
+
+ constexpr auto begin() const { return _M_begin; }
+ constexpr auto end() const { return _M_begin.end(); }
+
+ private:
+ struct _Iterator : private _Grapheme_cluster_iterator_base
+ {
+ private:
+ // Iterator over the underlying code points.
+ using _U32_iterator = ranges::iterator_t<_Utf32_view<_View>>;
+
+ public:
+ // TODO: Change value_type to be subrange<_U32_iterator> instead?
+ // That would be the whole cluster, not just the first code point.
+ // Would need to change type of _M_start to _U32_iterator, so that
+ // operator* just does return value_type{_M_start, _M_next}.
+ // Alternatively, value_type could be _Utf32_view<iterator_t<_View>>.
+ using value_type = char32_t;
+ using iterator_concept = forward_iterator_tag;
+
+ constexpr
+ _Iterator(_U32_iterator __i)
+ : _M_start(__i.base()), _M_next(__i)
+ {
+ if (_M_start != __i.end())
+ {
+ _M_c = *__i;
+ _M_prop = __grapheme_cluster_break_property(_M_c);
+ operator++(); // Finds the end of the first cluster.
+ }
+ }
+
+ // The first code point of the current extended grapheme cluster.
+ constexpr value_type
+ operator*() const
+ { return _M_c; }
+
+ constexpr auto
+ operator->() const
+ { return &_M_c; }
+
+ // Move to the next extended grapheme cluster.
+ constexpr _Iterator&
+ operator++()
+ {
+ const auto __end = _M_next.end();
+ if (_M_next != __end)
+ {
+ auto __p_prev = _M_prop;
+ auto __it = _M_next;
+ while (++__it != __end)
+ {
+ char32_t __c = *__it;
+ auto __p = __grapheme_cluster_break_property(*__it);
+ _M_update_xpicto_seq_state(__c, __p);
+ _M_update_ri_count(__p);
+ _M_update_incb_state(__c, __p);
+ if (_M_is_break(__p_prev, __p, __it))
+ {
+ // Found a grapheme cluster break
+ _M_reset(__c, __p);
+ break;
+ }
+ __p_prev = __p;
+ }
+ _M_start = _M_next.base();
+ _M_next = __it;
+ }
+ else
+ _M_start = __end;
+ return *this;
+ }
+
+ constexpr _Iterator
+ operator++(int)
+ {
+ auto __tmp = *this;
+ ++this;
+ return __tmp;
+ }
+
+ constexpr bool
+ operator==(const _Iterator& __i) const
+ { return _M_start == __i._M_start; }
+
+ // This supports iter != iter.end()
+ constexpr bool
+ operator==(const ranges::sentinel_t<_View>& __i) const
+ { return _M_start == __i; }
+
+ // Iterator to the start of the current cluster.
+ constexpr auto base() const { return _M_start; }
+
+ // The end of the underlying view (not the end of the current cluster!)
+ constexpr auto end() const { return _M_next.end(); }
+
+ // Field width of the first code point in the cluster.
+ constexpr int
+ width() const noexcept
+ { return __field_width(_M_c); }
+
+ private:
+ ranges::iterator_t<_View> _M_start;
+ _U32_iterator _M_next;
+
+ // Implement the Grapheme Cluster Boundary Rules from Unicode Annex #29
+ // http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules
+ // This implements the rules from TR29 revision 43 in Unicode 15.1.0.
+ // Return true if there is a break between code point with property p1
+ // and code point with property p2.
+ constexpr bool
+ _M_is_break(_Gcb_property __p1, _Gcb_property __p2,
+ _U32_iterator __curr) const
+ {
+ using enum _Gcb_property;
+
+ if (__p1 == _Gcb_Control || __p1 == _Gcb_LF)
+ return true; // Break after Control or LF.
+
+ if (__p1 == _Gcb_CR)
+ return __p2 != _Gcb_LF; // Do not break between a CR and LF.
+
+ // Rule GB5
+ if (__p2 == _Gcb_Control || __p2 == _Gcb_CR || __p2 == _Gcb_LF)
+ return true; // Break before Control, CR or LF.
+
+ // Rule GB6
+ if (__p1 == _Gcb_L)
+ switch (__p2)
+ {
+ case _Gcb_L:
+ case _Gcb_V:
+ case _Gcb_LV:
+ case _Gcb_LVT:
+ return false; // Do not break Hangul syllable sequences.
+ default:
+ return true;
+ }
+
+ // Rule GB7
+ if (__p1 == _Gcb_LV || __p1 == _Gcb_V)
+ switch (__p2)
+ {
+ case _Gcb_V:
+ case _Gcb_T:
+ return false; // Do not break Hangul syllable sequences.
+ default:
+ return true;
+ }
+
+ // Rule GB8
+ if (__p1 == _Gcb_LVT || __p1 == _Gcb_T)
+ return __p2 != _Gcb_T; // Do not break Hangul syllable sequences.
+
+ // Rule GB9
+ if (__p2 == _Gcb_Extend || __p2 == _Gcb_ZWJ)
+ return false; // Do not break before extending characters or ZWJ.
+
+ // The following GB9x rules only apply to extended grapheme clusters,
+ // which is what the C++ standard uses (not legacy grapheme clusters).
+
+ // Rule GB9a
+ if (__p2 == _Gcb_SpacingMark)
+ return false; // Do not break before SpacingMarks,
+ // Rule GB9b
+ if (__p1 == _Gcb_Prepend)
+ return false; // or after Prepend characters.
+
+ // Rule GB9c (Unicode 15.1.0)
+ // Do not break within certain combinations with
+ // Indic_Conjunct_Break (InCB)=Linker.
+ if (_M_incb_linker_seen
+ && __incb_property(*_M_start) == _InCB::_Consonant
+ && __incb_property(*__curr) == _InCB::_Consonant)
+ {
+ // Match [_M_start, __curr] against regular expression
+ // Consonant ([Extend Linker]* Linker [Extend Linker]* Consonant)+
+ bool __have_linker = false;
+ auto __it = _M_start;
+ while (++__it != __curr)
+ {
+ if (__is_incb_linker(*__it))
+ __have_linker = true;
+ else
+ {
+ auto __incb = __incb_property(*__it);
+ if (__incb == _InCB::_Consonant)
+ __have_linker = false;
+ else if (__incb != _InCB::_Extend)
+ break;
+ }
+ }
+ if (__it == __curr && __have_linker)
+ return false;
+ }
+
+ // Rule GB11
+ // Do not break within emoji modifier sequences
+ // or emoji zwj sequences.
+ if (__p1 == _Gcb_ZWJ && _M_xpicto_seq_state == _XPicto::_Matched)
+ return false;
+
+ // Rules GB12 and GB13
+ // Do not break within emoji flag sequences. That is, do not break
+ // between regional indicator (RI) symbols if there is an odd number
+ // of RI characters before the break point.
+ if (__p1 == _Gcb_property::_Gcb_Regional_Indicator && __p1 == __p2)
+ return (_M_RI_count & 1) == 0;
+
+ // Rule GB999
+ return true; // Otherwise, break everywhere.
+ }
+ };
+
+ _Iterator _M_begin;
+ };
+
+} // namespace __v15_1_0
+
+ // Return the field width of a string.
+ template<typename _CharT>
+ constexpr size_t
+ __field_width(basic_string_view<_CharT> __s)
+ {
+ if (__s.empty()) [[unlikely]]
+ return 0;
+ _Grapheme_cluster_view __gc(__s);
+ auto __it = __gc.begin();
+ const auto __end = __gc.end();
+ size_t __n = __it.width();
+ while (++__it != __end)
+ __n += __it.width();
+ return __n;
+ }
+
+ // Truncate a string to at most `__max` field width units, and return the
+ // resulting field width.
+ template<typename _CharT>
+ constexpr size_t
+ __truncate(basic_string_view<_CharT>& __s, size_t __max)
+ {
+ if (__s.empty()) [[unlikely]]
+ return 0;
+
+ _Grapheme_cluster_view __gc(__s);
+ auto __it = __gc.begin();
+ const auto __end = __gc.end();
+ size_t __n = __it.width();
+ if (__n > __max)
+ {
+ __s = {};
+ return 0;
+ }
+ while (++__it != __end)
+ {
+ size_t __n2 = __n + __it.width();
+ if (__n2 > __max)
+ {
+ __s = basic_string_view<_CharT>(__s.begin(), __it.base());
+ return __n;
+ }
+ __n = __n2;
+ }
+ return __n;
+ }
+
+ template<typename _CharT>
+ consteval bool
+ __literal_encoding_is_unicode()
+ {
+ if constexpr (is_same_v<_CharT, char8_t>)
+ return true;
+ else if constexpr (is_same_v<_CharT, char16_t>)
+ return true;
+ else if constexpr (is_same_v<_CharT, char32_t>)
+ return true;
+
+ const char* __enc = "";
+
+#ifdef __GNUC_EXECUTION_CHARSET_NAME
+ auto __remove_iso10646_prefix = [](const char* __s) {
+ // GNU iconv allows "ISO-10646/" prefix (case-insensitive).
+ if (__s[0] == 'I' || __s[0] == 'i')
+ if (__s[1] == 'S' || __s[1] == 's')
+ if (__s[2] == 'O' || __s[2] == 'o')
+ if (string_view(__s + 3).starts_with("-10646/"))
+ return __s + 10;
+ return __s;
+ };
+
+ if constexpr (is_same_v<_CharT, char>)
+ __enc = __remove_iso10646_prefix(__GNUC_EXECUTION_CHARSET_NAME);
+# if defined _GLIBCXX_USE_WCHAR_T && defined __GNUC_WIDE_EXECUTION_CHARSET_NAME
+ else
+ __enc = __remove_iso10646_prefix(__GNUC_WIDE_EXECUTION_CHARSET_NAME);
+# endif
+
+ if ((__enc[0] == 'U' || __enc[0] == 'u')
+ && (__enc[1] == 'T' || __enc[1] == 't')
+ && (__enc[2] == 'F' || __enc[2] == 'f'))
+ {
+ __enc += 3;
+ if (__enc[0] == '-')
+ ++__enc;
+ if (__enc[0] == '8')
+ return __enc[1] == '\0' || string_view(__enc + 1) == "//";
+ else if constexpr (!is_same_v<_CharT, char>)
+ {
+ string_view __s(__enc);
+ if (__s.ends_with("//"))
+ __s.remove_suffix(2);
+ return __s == "16" || __s == "32";
+ }
+ }
+#elif defined __clang_literal_encoding__
+ if constexpr (is_same_v<_CharT, char>)
+ __enc = __clang_literal_encoding__;
+# if defined _GLIBCXX_USE_WCHAR_T && defined __clang_wide_literal_encoding__
+ else
+ __enc = __clang_wide_literal_encoding__;
+# endif
+ // Clang accepts "-fexec-charset=utf-8" but the macro is still uppercase.
+ string_view __s(__enc);
+ if (__s == "UTF-8")
+ return true;
+ else if constexpr (!is_same_v<_CharT, char>)
+ return __s == "UTF-16" || __s == "UTF-32";
+#endif
+
+ return false;
+ }
+
+ consteval bool
+ __literal_encoding_is_utf8()
+ { return __literal_encoding_is_unicode<char>(); }
+
+} // namespace __unicode
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace std
+#endif // C++20
+#endif // _GLIBCXX_UNICODE_H
diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def
index fa30414..7c7ba06 100644
--- a/libstdc++-v3/include/bits/version.def
+++ b/libstdc++-v3/include/bits/version.def
@@ -1166,6 +1166,15 @@ ftms = {
};
};
+ftms = {
+ name = format_uchar;
+ values = {
+ v = 202311;
+ cxxmin = 20;
+ hosted = yes;
+ };
+};
+
// FIXME: #define __glibcxx_execution 201902L
ftms = {
diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h
index 1e1da11..65d5164 100644
--- a/libstdc++-v3/include/bits/version.h
+++ b/libstdc++-v3/include/bits/version.h
@@ -1422,7 +1422,18 @@
#endif /* !defined(__cpp_lib_format) && defined(__glibcxx_want_format) */
#undef __glibcxx_want_format
-// from version.def line 1172
+// from version.def line 1170
+#if !defined(__cpp_lib_format_uchar)
+# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
+# define __glibcxx_format_uchar 202311L
+# if defined(__glibcxx_want_all) || defined(__glibcxx_want_format_uchar)
+# define __cpp_lib_format_uchar 202311L
+# endif
+# endif
+#endif /* !defined(__cpp_lib_format_uchar) && defined(__glibcxx_want_format_uchar) */
+#undef __glibcxx_want_format_uchar
+
+// from version.def line 1181
#if !defined(__cpp_lib_constexpr_complex)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
# define __glibcxx_constexpr_complex 201711L
@@ -1433,7 +1444,7 @@
#endif /* !defined(__cpp_lib_constexpr_complex) && defined(__glibcxx_want_constexpr_complex) */
#undef __glibcxx_want_constexpr_complex
-// from version.def line 1181
+// from version.def line 1190
#if !defined(__cpp_lib_constexpr_dynamic_alloc)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
# define __glibcxx_constexpr_dynamic_alloc 201907L
@@ -1444,7 +1455,7 @@
#endif /* !defined(__cpp_lib_constexpr_dynamic_alloc) && defined(__glibcxx_want_constexpr_dynamic_alloc) */
#undef __glibcxx_want_constexpr_dynamic_alloc
-// from version.def line 1190
+// from version.def line 1199
#if !defined(__cpp_lib_constexpr_string)
# if (__cplusplus >= 202002L) && _GLIBCXX_USE_CXX11_ABI && _GLIBCXX_HOSTED && (defined(__glibcxx_is_constant_evaluated))
# define __glibcxx_constexpr_string 201907L
@@ -1465,7 +1476,7 @@
#endif /* !defined(__cpp_lib_constexpr_string) && defined(__glibcxx_want_constexpr_string) */
#undef __glibcxx_want_constexpr_string
-// from version.def line 1214
+// from version.def line 1223
#if !defined(__cpp_lib_constexpr_vector)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
# define __glibcxx_constexpr_vector 201907L
@@ -1476,7 +1487,7 @@
#endif /* !defined(__cpp_lib_constexpr_vector) && defined(__glibcxx_want_constexpr_vector) */
#undef __glibcxx_want_constexpr_vector
-// from version.def line 1223
+// from version.def line 1232
#if !defined(__cpp_lib_erase_if)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
# define __glibcxx_erase_if 202002L
@@ -1487,7 +1498,7 @@
#endif /* !defined(__cpp_lib_erase_if) && defined(__glibcxx_want_erase_if) */
#undef __glibcxx_want_erase_if
-// from version.def line 1232
+// from version.def line 1241
#if !defined(__cpp_lib_generic_unordered_lookup)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
# define __glibcxx_generic_unordered_lookup 201811L
@@ -1498,7 +1509,7 @@
#endif /* !defined(__cpp_lib_generic_unordered_lookup) && defined(__glibcxx_want_generic_unordered_lookup) */
#undef __glibcxx_want_generic_unordered_lookup
-// from version.def line 1241
+// from version.def line 1250
#if !defined(__cpp_lib_jthread)
# if (__cplusplus >= 202002L) && defined(_GLIBCXX_HAS_GTHREADS) && _GLIBCXX_HOSTED
# define __glibcxx_jthread 201911L
@@ -1509,7 +1520,7 @@
#endif /* !defined(__cpp_lib_jthread) && defined(__glibcxx_want_jthread) */
#undef __glibcxx_want_jthread
-// from version.def line 1251
+// from version.def line 1260
#if !defined(__cpp_lib_latch)
# if (__cplusplus >= 202002L) && (__glibcxx_atomic_wait)
# define __glibcxx_latch 201907L
@@ -1520,7 +1531,7 @@
#endif /* !defined(__cpp_lib_latch) && defined(__glibcxx_want_latch) */
#undef __glibcxx_want_latch
-// from version.def line 1260
+// from version.def line 1269
#if !defined(__cpp_lib_list_remove_return_type)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
# define __glibcxx_list_remove_return_type 201806L
@@ -1531,7 +1542,7 @@
#endif /* !defined(__cpp_lib_list_remove_return_type) && defined(__glibcxx_want_list_remove_return_type) */
#undef __glibcxx_want_list_remove_return_type
-// from version.def line 1269
+// from version.def line 1278
#if !defined(__cpp_lib_polymorphic_allocator)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
# define __glibcxx_polymorphic_allocator 201902L
@@ -1542,7 +1553,7 @@
#endif /* !defined(__cpp_lib_polymorphic_allocator) && defined(__glibcxx_want_polymorphic_allocator) */
#undef __glibcxx_want_polymorphic_allocator
-// from version.def line 1278
+// from version.def line 1287
#if !defined(__cpp_lib_move_iterator_concept)
# if (__cplusplus >= 202002L) && (__glibcxx_concepts)
# define __glibcxx_move_iterator_concept 202207L
@@ -1553,7 +1564,7 @@
#endif /* !defined(__cpp_lib_move_iterator_concept) && defined(__glibcxx_want_move_iterator_concept) */
#undef __glibcxx_want_move_iterator_concept
-// from version.def line 1288
+// from version.def line 1297
#if !defined(__cpp_lib_semaphore)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED && (__glibcxx_atomic_wait || _GLIBCXX_HAVE_POSIX_SEMAPHORE)
# define __glibcxx_semaphore 201907L
@@ -1564,7 +1575,7 @@
#endif /* !defined(__cpp_lib_semaphore) && defined(__glibcxx_want_semaphore) */
#undef __glibcxx_want_semaphore
-// from version.def line 1298
+// from version.def line 1307
#if !defined(__cpp_lib_smart_ptr_for_overwrite)
# if (__cplusplus >= 202002L) && _GLIBCXX_HOSTED
# define __glibcxx_smart_ptr_for_overwrite 202002L
@@ -1575,7 +1586,7 @@
#endif /* !defined(__cpp_lib_smart_ptr_for_overwrite) && defined(__glibcxx_want_smart_ptr_for_overwrite) */
#undef __glibcxx_want_smart_ptr_for_overwrite
-// from version.def line 1307
+// from version.def line 1316
#if !defined(__cpp_lib_syncbuf)
# if (__cplusplus >= 202002L) && _GLIBCXX_USE_CXX11_ABI && _GLIBCXX_HOSTED
# define __glibcxx_syncbuf 201803L
@@ -1586,7 +1597,7 @@
#endif /* !defined(__cpp_lib_syncbuf) && defined(__glibcxx_want_syncbuf) */
#undef __glibcxx_want_syncbuf
-// from version.def line 1317
+// from version.def line 1326
#if !defined(__cpp_lib_byteswap)
# if (__cplusplus >= 202100L)
# define __glibcxx_byteswap 202110L
@@ -1597,7 +1608,7 @@
#endif /* !defined(__cpp_lib_byteswap) && defined(__glibcxx_want_byteswap) */
#undef __glibcxx_want_byteswap
-// from version.def line 1325
+// from version.def line 1334
#if !defined(__cpp_lib_constexpr_charconv)
# if (__cplusplus >= 202100L)
# define __glibcxx_constexpr_charconv 202207L
@@ -1608,7 +1619,7 @@
#endif /* !defined(__cpp_lib_constexpr_charconv) && defined(__glibcxx_want_constexpr_charconv) */
#undef __glibcxx_want_constexpr_charconv
-// from version.def line 1333
+// from version.def line 1342
#if !defined(__cpp_lib_constexpr_typeinfo)
# if (__cplusplus >= 202100L)
# define __glibcxx_constexpr_typeinfo 202106L
@@ -1619,7 +1630,7 @@
#endif /* !defined(__cpp_lib_constexpr_typeinfo) && defined(__glibcxx_want_constexpr_typeinfo) */
#undef __glibcxx_want_constexpr_typeinfo
-// from version.def line 1341
+// from version.def line 1350
#if !defined(__cpp_lib_expected)
# if (__cplusplus >= 202100L) && (__cpp_concepts >= 202002L)
# define __glibcxx_expected 202211L
@@ -1630,7 +1641,7 @@
#endif /* !defined(__cpp_lib_expected) && defined(__glibcxx_want_expected) */
#undef __glibcxx_want_expected
-// from version.def line 1350
+// from version.def line 1359
#if !defined(__cpp_lib_freestanding_algorithm)
# if (__cplusplus >= 202100L)
# define __glibcxx_freestanding_algorithm 202311L
@@ -1641,7 +1652,7 @@
#endif /* !defined(__cpp_lib_freestanding_algorithm) && defined(__glibcxx_want_freestanding_algorithm) */
#undef __glibcxx_want_freestanding_algorithm
-// from version.def line 1359
+// from version.def line 1368
#if !defined(__cpp_lib_freestanding_array)
# if (__cplusplus >= 202100L)
# define __glibcxx_freestanding_array 202311L
@@ -1652,7 +1663,7 @@
#endif /* !defined(__cpp_lib_freestanding_array) && defined(__glibcxx_want_freestanding_array) */
#undef __glibcxx_want_freestanding_array
-// from version.def line 1368
+// from version.def line 1377
#if !defined(__cpp_lib_freestanding_cstring)
# if (__cplusplus >= 202100L)
# define __glibcxx_freestanding_cstring 202311L
@@ -1663,7 +1674,7 @@
#endif /* !defined(__cpp_lib_freestanding_cstring) && defined(__glibcxx_want_freestanding_cstring) */
#undef __glibcxx_want_freestanding_cstring
-// from version.def line 1377
+// from version.def line 1386
#if !defined(__cpp_lib_freestanding_expected)
# if (__cplusplus >= 202100L) && (__cpp_lib_expected)
# define __glibcxx_freestanding_expected 202311L
@@ -1674,7 +1685,7 @@
#endif /* !defined(__cpp_lib_freestanding_expected) && defined(__glibcxx_want_freestanding_expected) */
#undef __glibcxx_want_freestanding_expected
-// from version.def line 1387
+// from version.def line 1396
#if !defined(__cpp_lib_freestanding_optional)
# if (__cplusplus >= 202100L)
# define __glibcxx_freestanding_optional 202311L
@@ -1685,7 +1696,7 @@
#endif /* !defined(__cpp_lib_freestanding_optional) && defined(__glibcxx_want_freestanding_optional) */
#undef __glibcxx_want_freestanding_optional
-// from version.def line 1396
+// from version.def line 1405
#if !defined(__cpp_lib_freestanding_string_view)
# if (__cplusplus >= 202100L)
# define __glibcxx_freestanding_string_view 202311L
@@ -1696,7 +1707,7 @@
#endif /* !defined(__cpp_lib_freestanding_string_view) && defined(__glibcxx_want_freestanding_string_view) */
#undef __glibcxx_want_freestanding_string_view
-// from version.def line 1405
+// from version.def line 1414
#if !defined(__cpp_lib_freestanding_variant)
# if (__cplusplus >= 202100L)
# define __glibcxx_freestanding_variant 202311L
@@ -1707,7 +1718,7 @@
#endif /* !defined(__cpp_lib_freestanding_variant) && defined(__glibcxx_want_freestanding_variant) */
#undef __glibcxx_want_freestanding_variant
-// from version.def line 1414
+// from version.def line 1423
#if !defined(__cpp_lib_invoke_r)
# if (__cplusplus >= 202100L)
# define __glibcxx_invoke_r 202106L
@@ -1718,7 +1729,7 @@
#endif /* !defined(__cpp_lib_invoke_r) && defined(__glibcxx_want_invoke_r) */
#undef __glibcxx_want_invoke_r
-// from version.def line 1422
+// from version.def line 1431
#if !defined(__cpp_lib_is_scoped_enum)
# if (__cplusplus >= 202100L)
# define __glibcxx_is_scoped_enum 202011L
@@ -1729,7 +1740,7 @@
#endif /* !defined(__cpp_lib_is_scoped_enum) && defined(__glibcxx_want_is_scoped_enum) */
#undef __glibcxx_want_is_scoped_enum
-// from version.def line 1430
+// from version.def line 1439
#if !defined(__cpp_lib_reference_from_temporary)
# if (__cplusplus >= 202100L) && (__has_builtin(__reference_constructs_from_temporary) && __has_builtin(__reference_converts_from_temporary))
# define __glibcxx_reference_from_temporary 202202L
@@ -1740,7 +1751,7 @@
#endif /* !defined(__cpp_lib_reference_from_temporary) && defined(__glibcxx_want_reference_from_temporary) */
#undef __glibcxx_want_reference_from_temporary
-// from version.def line 1450
+// from version.def line 1459
#if !defined(__cpp_lib_ranges_to_container)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
# define __glibcxx_ranges_to_container 202202L
@@ -1751,7 +1762,7 @@
#endif /* !defined(__cpp_lib_ranges_to_container) && defined(__glibcxx_want_ranges_to_container) */
#undef __glibcxx_want_ranges_to_container
-// from version.def line 1459
+// from version.def line 1468
#if !defined(__cpp_lib_ranges_zip)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_zip 202110L
@@ -1762,7 +1773,7 @@
#endif /* !defined(__cpp_lib_ranges_zip) && defined(__glibcxx_want_ranges_zip) */
#undef __glibcxx_want_ranges_zip
-// from version.def line 1467
+// from version.def line 1476
#if !defined(__cpp_lib_ranges_chunk)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_chunk 202202L
@@ -1773,7 +1784,7 @@
#endif /* !defined(__cpp_lib_ranges_chunk) && defined(__glibcxx_want_ranges_chunk) */
#undef __glibcxx_want_ranges_chunk
-// from version.def line 1475
+// from version.def line 1484
#if !defined(__cpp_lib_ranges_slide)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_slide 202202L
@@ -1784,7 +1795,7 @@
#endif /* !defined(__cpp_lib_ranges_slide) && defined(__glibcxx_want_ranges_slide) */
#undef __glibcxx_want_ranges_slide
-// from version.def line 1483
+// from version.def line 1492
#if !defined(__cpp_lib_ranges_chunk_by)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_chunk_by 202202L
@@ -1795,7 +1806,7 @@
#endif /* !defined(__cpp_lib_ranges_chunk_by) && defined(__glibcxx_want_ranges_chunk_by) */
#undef __glibcxx_want_ranges_chunk_by
-// from version.def line 1491
+// from version.def line 1500
#if !defined(__cpp_lib_ranges_join_with)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_join_with 202202L
@@ -1806,7 +1817,7 @@
#endif /* !defined(__cpp_lib_ranges_join_with) && defined(__glibcxx_want_ranges_join_with) */
#undef __glibcxx_want_ranges_join_with
-// from version.def line 1499
+// from version.def line 1508
#if !defined(__cpp_lib_ranges_repeat)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_repeat 202207L
@@ -1817,7 +1828,7 @@
#endif /* !defined(__cpp_lib_ranges_repeat) && defined(__glibcxx_want_ranges_repeat) */
#undef __glibcxx_want_ranges_repeat
-// from version.def line 1507
+// from version.def line 1516
#if !defined(__cpp_lib_ranges_stride)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_stride 202207L
@@ -1828,7 +1839,7 @@
#endif /* !defined(__cpp_lib_ranges_stride) && defined(__glibcxx_want_ranges_stride) */
#undef __glibcxx_want_ranges_stride
-// from version.def line 1515
+// from version.def line 1524
#if !defined(__cpp_lib_ranges_cartesian_product)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_cartesian_product 202207L
@@ -1839,7 +1850,7 @@
#endif /* !defined(__cpp_lib_ranges_cartesian_product) && defined(__glibcxx_want_ranges_cartesian_product) */
#undef __glibcxx_want_ranges_cartesian_product
-// from version.def line 1523
+// from version.def line 1532
#if !defined(__cpp_lib_ranges_as_rvalue)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_as_rvalue 202207L
@@ -1850,7 +1861,7 @@
#endif /* !defined(__cpp_lib_ranges_as_rvalue) && defined(__glibcxx_want_ranges_as_rvalue) */
#undef __glibcxx_want_ranges_as_rvalue
-// from version.def line 1531
+// from version.def line 1540
#if !defined(__cpp_lib_ranges_as_const)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_as_const 202207L
@@ -1861,7 +1872,7 @@
#endif /* !defined(__cpp_lib_ranges_as_const) && defined(__glibcxx_want_ranges_as_const) */
#undef __glibcxx_want_ranges_as_const
-// from version.def line 1539
+// from version.def line 1548
#if !defined(__cpp_lib_ranges_enumerate)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_enumerate 202302L
@@ -1872,7 +1883,7 @@
#endif /* !defined(__cpp_lib_ranges_enumerate) && defined(__glibcxx_want_ranges_enumerate) */
#undef __glibcxx_want_ranges_enumerate
-// from version.def line 1547
+// from version.def line 1556
#if !defined(__cpp_lib_ranges_fold)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_fold 202207L
@@ -1883,7 +1894,7 @@
#endif /* !defined(__cpp_lib_ranges_fold) && defined(__glibcxx_want_ranges_fold) */
#undef __glibcxx_want_ranges_fold
-// from version.def line 1555
+// from version.def line 1564
#if !defined(__cpp_lib_ranges_contains)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_contains 202207L
@@ -1894,7 +1905,7 @@
#endif /* !defined(__cpp_lib_ranges_contains) && defined(__glibcxx_want_ranges_contains) */
#undef __glibcxx_want_ranges_contains
-// from version.def line 1563
+// from version.def line 1572
#if !defined(__cpp_lib_ranges_iota)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_iota 202202L
@@ -1905,7 +1916,7 @@
#endif /* !defined(__cpp_lib_ranges_iota) && defined(__glibcxx_want_ranges_iota) */
#undef __glibcxx_want_ranges_iota
-// from version.def line 1571
+// from version.def line 1580
#if !defined(__cpp_lib_ranges_find_last)
# if (__cplusplus >= 202100L)
# define __glibcxx_ranges_find_last 202207L
@@ -1916,7 +1927,7 @@
#endif /* !defined(__cpp_lib_ranges_find_last) && defined(__glibcxx_want_ranges_find_last) */
#undef __glibcxx_want_ranges_find_last
-// from version.def line 1579
+// from version.def line 1588
#if !defined(__cpp_lib_constexpr_bitset)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED && (__cpp_constexpr_dynamic_alloc)
# define __glibcxx_constexpr_bitset 202202L
@@ -1927,7 +1938,7 @@
#endif /* !defined(__cpp_lib_constexpr_bitset) && defined(__glibcxx_want_constexpr_bitset) */
#undef __glibcxx_want_constexpr_bitset
-// from version.def line 1589
+// from version.def line 1598
#if !defined(__cpp_lib_stdatomic_h)
# if (__cplusplus >= 202100L)
# define __glibcxx_stdatomic_h 202011L
@@ -1938,7 +1949,7 @@
#endif /* !defined(__cpp_lib_stdatomic_h) && defined(__glibcxx_want_stdatomic_h) */
#undef __glibcxx_want_stdatomic_h
-// from version.def line 1597
+// from version.def line 1606
#if !defined(__cpp_lib_adaptor_iterator_pair_constructor)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
# define __glibcxx_adaptor_iterator_pair_constructor 202106L
@@ -1949,7 +1960,7 @@
#endif /* !defined(__cpp_lib_adaptor_iterator_pair_constructor) && defined(__glibcxx_want_adaptor_iterator_pair_constructor) */
#undef __glibcxx_want_adaptor_iterator_pair_constructor
-// from version.def line 1606
+// from version.def line 1615
#if !defined(__cpp_lib_formatters)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
# define __glibcxx_formatters 202302L
@@ -1960,7 +1971,7 @@
#endif /* !defined(__cpp_lib_formatters) && defined(__glibcxx_want_formatters) */
#undef __glibcxx_want_formatters
-// from version.def line 1615
+// from version.def line 1624
#if !defined(__cpp_lib_forward_like)
# if (__cplusplus >= 202100L)
# define __glibcxx_forward_like 202207L
@@ -1971,7 +1982,7 @@
#endif /* !defined(__cpp_lib_forward_like) && defined(__glibcxx_want_forward_like) */
#undef __glibcxx_want_forward_like
-// from version.def line 1623
+// from version.def line 1632
#if !defined(__cpp_lib_ios_noreplace)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
# define __glibcxx_ios_noreplace 202207L
@@ -1982,7 +1993,7 @@
#endif /* !defined(__cpp_lib_ios_noreplace) && defined(__glibcxx_want_ios_noreplace) */
#undef __glibcxx_want_ios_noreplace
-// from version.def line 1632
+// from version.def line 1641
#if !defined(__cpp_lib_move_only_function)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
# define __glibcxx_move_only_function 202110L
@@ -1993,7 +2004,7 @@
#endif /* !defined(__cpp_lib_move_only_function) && defined(__glibcxx_want_move_only_function) */
#undef __glibcxx_want_move_only_function
-// from version.def line 1641
+// from version.def line 1650
#if !defined(__cpp_lib_out_ptr)
# if (__cplusplus >= 202100L)
# define __glibcxx_out_ptr 202311L
@@ -2004,7 +2015,7 @@
#endif /* !defined(__cpp_lib_out_ptr) && defined(__glibcxx_want_out_ptr) */
#undef __glibcxx_want_out_ptr
-// from version.def line 1649
+// from version.def line 1658
#if !defined(__cpp_lib_print)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
# define __glibcxx_print 202211L
@@ -2015,7 +2026,7 @@
#endif /* !defined(__cpp_lib_print) && defined(__glibcxx_want_print) */
#undef __glibcxx_want_print
-// from version.def line 1658
+// from version.def line 1667
#if !defined(__cpp_lib_spanstream)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED && (__glibcxx_span)
# define __glibcxx_spanstream 202106L
@@ -2026,7 +2037,7 @@
#endif /* !defined(__cpp_lib_spanstream) && defined(__glibcxx_want_spanstream) */
#undef __glibcxx_want_spanstream
-// from version.def line 1668
+// from version.def line 1677
#if !defined(__cpp_lib_stacktrace)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED && (_GLIBCXX_HAVE_STACKTRACE)
# define __glibcxx_stacktrace 202011L
@@ -2037,7 +2048,7 @@
#endif /* !defined(__cpp_lib_stacktrace) && defined(__glibcxx_want_stacktrace) */
#undef __glibcxx_want_stacktrace
-// from version.def line 1678
+// from version.def line 1687
#if !defined(__cpp_lib_string_contains)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
# define __glibcxx_string_contains 202011L
@@ -2048,7 +2059,7 @@
#endif /* !defined(__cpp_lib_string_contains) && defined(__glibcxx_want_string_contains) */
#undef __glibcxx_want_string_contains
-// from version.def line 1687
+// from version.def line 1696
#if !defined(__cpp_lib_string_resize_and_overwrite)
# if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
# define __glibcxx_string_resize_and_overwrite 202110L
@@ -2059,7 +2070,7 @@
#endif /* !defined(__cpp_lib_string_resize_and_overwrite) && defined(__glibcxx_want_string_resize_and_overwrite) */
#undef __glibcxx_want_string_resize_and_overwrite
-// from version.def line 1696
+// from version.def line 1705
#if !defined(__cpp_lib_to_underlying)
# if (__cplusplus >= 202100L)
# define __glibcxx_to_underlying 202102L
@@ -2070,7 +2081,7 @@
#endif /* !defined(__cpp_lib_to_underlying) && defined(__glibcxx_want_to_underlying) */
#undef __glibcxx_want_to_underlying
-// from version.def line 1704
+// from version.def line 1713
#if !defined(__cpp_lib_unreachable)
# if (__cplusplus >= 202100L)
# define __glibcxx_unreachable 202202L
@@ -2081,7 +2092,7 @@
#endif /* !defined(__cpp_lib_unreachable) && defined(__glibcxx_want_unreachable) */
#undef __glibcxx_want_unreachable
-// from version.def line 1712
+// from version.def line 1721
#if !defined(__cpp_lib_fstream_native_handle)
# if (__cplusplus > 202302L) && _GLIBCXX_HOSTED
# define __glibcxx_fstream_native_handle 202306L
@@ -2092,7 +2103,7 @@
#endif /* !defined(__cpp_lib_fstream_native_handle) && defined(__glibcxx_want_fstream_native_handle) */
#undef __glibcxx_want_fstream_native_handle
-// from version.def line 1721
+// from version.def line 1730
#if !defined(__cpp_lib_ratio)
# if (__cplusplus > 202302L)
# define __glibcxx_ratio 202306L
@@ -2103,7 +2114,7 @@
#endif /* !defined(__cpp_lib_ratio) && defined(__glibcxx_want_ratio) */
#undef __glibcxx_want_ratio
-// from version.def line 1729
+// from version.def line 1738
#if !defined(__cpp_lib_saturation_arithmetic)
# if (__cplusplus > 202302L)
# define __glibcxx_saturation_arithmetic 202311L
@@ -2114,7 +2125,7 @@
#endif /* !defined(__cpp_lib_saturation_arithmetic) && defined(__glibcxx_want_saturation_arithmetic) */
#undef __glibcxx_want_saturation_arithmetic
-// from version.def line 1737
+// from version.def line 1746
#if !defined(__cpp_lib_to_string)
# if (__cplusplus > 202302L) && _GLIBCXX_HOSTED && (__glibcxx_to_chars)
# define __glibcxx_to_string 202306L
@@ -2125,9 +2136,9 @@
#endif /* !defined(__cpp_lib_to_string) && defined(__glibcxx_want_to_string) */
#undef __glibcxx_want_to_string
-// from version.def line 1637
+// from version.def line 1756
#if !defined(__cpp_lib_generator)
-# if (__cplusplus >= 202302L) && (__glibcxx_coroutine)
+# if (__cplusplus >= 202100L) && (__glibcxx_coroutine)
# define __glibcxx_generator 202207L
# if defined(__glibcxx_want_all) || defined(__glibcxx_want_generator)
# define __cpp_lib_generator 202207L
diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono
index b3ad2a0..a59af34 100644
--- a/libstdc++-v3/include/std/chrono
+++ b/libstdc++-v3/include/std/chrono
@@ -501,18 +501,47 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
namespace __detail
{
- // Compute the remainder of the Euclidean division of __n divided by __d.
- // Euclidean division truncates toward negative infinity and always
- // produces a remainder in the range of [0,__d-1] (whereas standard
- // division truncates toward zero and yields a nonpositive remainder
- // for negative __n).
+ // Helper to __add_modulo and __sub_modulo.
+ template <unsigned __d, typename _Tp>
+ consteval auto
+ __modulo_offset()
+ {
+ using _Up = make_unsigned_t<_Tp>;
+ auto constexpr __a = _Up(-1) - _Up(255 + __d - 2);
+ auto constexpr __b = _Up(__d * (__a / __d) - 1);
+ // Notice: b <= a - 1 <= _Up(-1) - (255 + d - 1) and b % d = d - 1.
+ return _Up(-1) - __b; // >= 255 + d - 1
+ }
+
+ // Compute the remainder of the Euclidean division of __x + __y divided by
+ // __d without overflowing. Typically, __x <= 255 + d - 1 is sum of
+ // weekday/month with a shift in [0, d - 1] and __y is a duration count.
+ template <unsigned __d, typename _Tp>
+ constexpr unsigned
+ __add_modulo(unsigned __x, _Tp __y)
+ {
+ using _Up = make_unsigned_t<_Tp>;
+ // For __y >= 0, _Up(__y) has the same mathematical value as __y and
+ // this function simply returns (__x + _Up(__y)) % d. Typically, this
+ // doesn't overflow since the range of _Up contains many more positive
+ // values than _Tp's. For __y < 0, _Up(__y) has a mathematical value in
+ // the upper-half range of _Up so that adding a positive value to it
+ // might overflow. Moreover, most likely, _Up(__y) != __y mod d. To
+ // fix both issues we subtract from _Up(__y) an __offset >=
+ // 255 + d - 1 to make room for the addition to __x and shift the modulo
+ // to the correct value.
+ auto const __offset = __y >= 0 ? _Up(0) : __modulo_offset<__d, _Tp>();
+ return (__x + _Up(__y) - __offset) % __d;
+ }
+
+ // Similar to __add_modulo but for __x - __y.
+ template <unsigned __d, typename _Tp>
constexpr unsigned
- __modulo(long long __n, unsigned __d)
+ __sub_modulo(unsigned __x, _Tp __y)
{
- if (__n >= 0)
- return __n % __d;
- else
- return (__d + (__n % __d)) % __d;
+ using _Up = make_unsigned_t<_Tp>;
+ auto const __offset = __y <= 0 ? _Up(0) : __modulo_offset<__d, _Tp>();
+ return (__x - _Up(__y) - __offset) % __d;
}
inline constexpr unsigned __days_per_month[12]
@@ -704,8 +733,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
friend constexpr month
operator+(const month& __x, const months& __y) noexcept
{
- auto __n = static_cast<long long>(unsigned{__x}) + (__y.count() - 1);
- return month{__detail::__modulo(__n, 12) + 1};
+ // modulo(x + (y - 1), 12) = modulo(x + (y - 1) + 12, 12)
+ // = modulo((x + 11) + y , 12)
+ return month{1 + __detail::__add_modulo<12>(
+ unsigned{__x} + 11, __y.count())};
}
friend constexpr month
@@ -714,7 +745,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
friend constexpr month
operator-(const month& __x, const months& __y) noexcept
- { return __x + -__y; }
+ {
+ // modulo(x + (-y - 1), 12) = modulo(x + (-y - 1) + 12, 12)
+ // = modulo((x + 11) - y , 12)
+ return month{1 + __detail::__sub_modulo<12>(
+ unsigned{__x} + 11, __y.count())};
+ }
friend constexpr months
operator-(const month& __x, const month& __y) noexcept
@@ -934,15 +970,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static constexpr weekday
_S_from_days(const days& __d)
{
- using _Rep = days::rep;
- using _URep = make_unsigned_t<_Rep>;
- const auto __n = __d.count();
- const auto __m = static_cast<_URep>(__n);
-
- // 1970-01-01 (__n = 0, __m = 0 ) -> Thursday (4)
- // 1969-31-12 (__n = -1, __m = _URep(-1)) -> Wednesday (3)
- const auto __offset = __n >= 0 ? _URep(4) : 3 - _URep(-1) % 7 - 7;
- return weekday((__m + __offset) % 7);
+ return weekday{__detail::__add_modulo<7>(4, __d.count())};
}
public:
@@ -1032,8 +1060,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
friend constexpr weekday
operator+(const weekday& __x, const days& __y) noexcept
{
- auto __n = static_cast<long long>(__x._M_wd) + __y.count();
- return weekday{__detail::__modulo(__n, 7)};
+ return weekday{__detail::__add_modulo<7>(__x._M_wd, __y.count())};
}
friend constexpr weekday
@@ -1042,7 +1069,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
friend constexpr weekday
operator-(const weekday& __x, const days& __y) noexcept
- { return __x + -__y; }
+ {
+ return weekday{__detail::__sub_modulo<7>(__x._M_wd, __y.count())};
+ }
friend constexpr days
operator-(const weekday& __x, const weekday& __y) noexcept
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index 1110ba4..b3b5a0b 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -35,6 +35,7 @@
#define __glibcxx_want_format
#define __glibcxx_want_format_ranges
+#define __glibcxx_want_format_uchar
#include <bits/version.h>
#ifdef __cpp_lib_format // C++ >= 20 && HOSTED
@@ -50,9 +51,11 @@
#include <string>
#include <variant> // monostate (TODO: move to bits/utility.h?)
#include <bits/ranges_base.h> // input_range, range_reference_t
+#include <bits/ranges_util.h> // subrange
#include <bits/ranges_algobase.h> // ranges::copy
#include <bits/stl_iterator.h> // back_insert_iterator
#include <bits/stl_pair.h> // __is_pair
+#include <bits/unicode.h> // __is_scalar_value, _Utf_view, etc.
#include <bits/utility.h> // tuple_size_v
#include <ext/numeric_traits.h> // __int_traits
@@ -78,6 +81,9 @@ namespace __format
template<typename _CharT>
using __format_context = basic_format_context<_Sink_iter<_CharT>, _CharT>;
+
+ template<typename _CharT>
+ struct _Runtime_format_string { basic_string_view<_CharT> _M_str; };
} // namespace __format
/// @endcond
@@ -113,6 +119,11 @@ namespace __format
basic_format_string(const _Tp& __s);
[[__gnu__::__always_inline__]]
+ basic_format_string(__format::_Runtime_format_string<_CharT>&& __s)
+ : _M_str(__s._M_str)
+ { }
+
+ [[__gnu__::__always_inline__]]
constexpr basic_string_view<_CharT>
get() const noexcept
{ return _M_str; }
@@ -130,6 +141,20 @@ namespace __format
= basic_format_string<wchar_t, type_identity_t<_Args>...>;
#endif
+#if __cplusplus > 202302L
+ [[__gnu__::__always_inline__]]
+ inline __format::_Runtime_format_string<char>
+ runtime_format(string_view __fmt)
+ { return {__fmt}; }
+
+#ifdef _GLIBCXX_USE_WCHAR_T
+ [[__gnu__::__always_inline__]]
+ inline __format::_Runtime_format_string<wchar_t>
+ runtime_format(wstring_view __fmt)
+ { return {__fmt}; }
+#endif
+#endif // C++26
+
// [format.formatter], formatter
/// The primary template of std::formatter is disabled.
@@ -346,44 +371,6 @@ namespace __format
_WP_from_arg // Use a formatting argument for width/prec.
};
- consteval bool
- __literal_encoding_is_utf8()
- {
-#ifdef __GNUC_EXECUTION_CHARSET_NAME
- const char* __enc = __GNUC_EXECUTION_CHARSET_NAME;
- // GNU iconv allows "ISO-10646/" prefix (case-insensitive).
- if (__enc[0] == 'I' || __enc[0] == 'i')
- {
- if ((__enc[1] == 'S' || __enc[1] == 's')
- && (__enc[2] == 'O' || __enc[2] == 'o'))
- {
- __enc += 3;
- if (string_view(__enc).starts_with("-10646/"))
- __enc += 7;
- else
- return false;
- }
- else
- return false;
- }
-
- if ((__enc[0] == 'U' || __enc[0] == 'u')
- && (__enc[1] == 'T' || __enc[1] == 't')
- && (__enc[2] == 'F' || __enc[2] == 'f'))
- {
- __enc += 3;
- if (__enc[0] == '-')
- ++__enc;
- if (__enc[0] == '8')
- return __enc[1] == '\0' || string_view(__enc + 1) == "//";
- }
-#elif defined __clang_literal_encoding__
- // Clang accepts "-fexec-charset=utf-8" but the macro is still uppercase.
- return string_view(__clang_literal_encoding__) == "UTF-8";
-#endif
- return false;
- }
-
template<typename _Context>
size_t
__int_from_arg(const basic_format_arg<_Context>& __arg);
@@ -407,7 +394,7 @@ namespace __format
_Pres_type _M_type : 4;
unsigned short _M_width;
unsigned short _M_prec;
- _CharT _M_fill = ' ';
+ char32_t _M_fill = ' ';
using iterator = typename basic_string_view<_CharT>::iterator;
@@ -429,17 +416,32 @@ namespace __format
{
if (*__first != '{')
{
- // TODO: accept any UCS scalar value as fill character.
- // If narrow source encoding is UTF-8 then accept multibyte char.
- if (__last - __first >= 2)
+ using namespace __unicode;
+ if constexpr (__literal_encoding_is_unicode<_CharT>())
{
- if (_Align __align = _S_align(__first[1]))
+ // Accept any UCS scalar value as fill character.
+ _Utf32_view __uv(ranges::subrange(__first, __last));
+ if (!__uv.empty())
{
- _M_fill = *__first;
- _M_align = __align;
- return __first + 2;
+ auto __beg = __uv.begin();
+ char32_t __c = *__beg++;
+ if (__is_scalar_value(__c))
+ if (auto __next = __beg.base(); __next != __last)
+ if (_Align __align = _S_align(*__next))
+ {
+ _M_fill = __c;
+ _M_align = __align;
+ return ++__next;
+ }
}
}
+ else if (__last - __first >= 2)
+ if (_Align __align = _S_align(__first[1]))
+ {
+ _M_fill = *__first;
+ _M_align = __align;
+ return __first + 2;
+ }
if (_Align __align = _S_align(__first[0]))
{
@@ -646,7 +648,7 @@ namespace __format
template<typename _Out, typename _CharT>
_Out
__write_padded(_Out __out, basic_string_view<_CharT> __str,
- _Align __align, size_t __nfill, _CharT __fill_char)
+ _Align __align, size_t __nfill, char32_t __fill_char)
{
const size_t __buflen = 0x20;
_CharT __padding_chars[__buflen];
@@ -684,12 +686,30 @@ namespace __format
__r = __nfill;
__max = __r;
}
+
+ using namespace __unicode;
+ if constexpr (__literal_encoding_is_unicode<_CharT>())
+ if (!__is_single_code_unit<_CharT>(__fill_char)) [[unlikely]]
+ {
+ // Encode fill char as multiple code units of type _CharT.
+ const char32_t __arr[1]{ __fill_char };
+ _Utf_view<_CharT, const char32_t(&)[1]> __v(__arr);
+ basic_string<_CharT> __padstr(__v.begin(), __v.end());
+ __padding = __padstr;
+ while (__l-- > 0)
+ __out = __format::__write(std::move(__out), __padding);
+ __out = __format::__write(std::move(__out), __str);
+ while (__r-- > 0)
+ __out = __format::__write(std::move(__out), __padding);
+ return __out;
+ }
+
if (__max < __buflen)
__padding.remove_suffix(__buflen - __max);
else
__max = __buflen;
- char_traits<_CharT>::assign(__padding_chars, __max, __fill_char);
+ char_traits<_CharT>::assign(__padding_chars, __max, __fill_char);
__pad(__l, __out);
__out = __format::__write(std::move(__out), __str);
__pad(__r, __out);
@@ -870,16 +890,21 @@ namespace __format
&& _M_spec._M_prec_kind == _WP_none)
return __format::__write(__fc.out(), __s);
- size_t __estimated_width = __s.size(); // TODO: Unicode-aware estim.
-
- if (_M_spec._M_prec_kind != _WP_none)
+ size_t __estimated_width;
+ if constexpr (__unicode::__literal_encoding_is_unicode<_CharT>())
{
- size_t __prec = _M_spec._M_get_precision(__fc);
- if (__estimated_width > __prec)
+ if (_M_spec._M_prec_kind != _WP_none)
{
- __s = __s.substr(0, __prec); // TODO: do not split code points
- __estimated_width = __prec;
+ size_t __prec = _M_spec._M_get_precision(__fc);
+ __estimated_width = __unicode::__truncate(__s, __prec);
}
+ else
+ __estimated_width = __unicode::__field_width(__s);
+ }
+ else
+ {
+ __s = __s.substr(0, _M_spec._M_get_precision(__fc));
+ __estimated_width = __s.size();
}
return __format::__write_padded_as_spec(__s, __estimated_width,
@@ -1221,7 +1246,7 @@ namespace __format
if (__width <= __str.size())
return __format::__write(__fc.out(), __str);
- _CharT __fill_char = _M_spec._M_fill;
+ char32_t __fill_char = _M_spec._M_fill;
_Align __align = _M_spec._M_align;
size_t __nfill = __width - __str.size();
@@ -1686,7 +1711,7 @@ namespace __format
if (__width <= __str.size())
return __format::__write(__fc.out(), __str);
- _CharT __fill_char = _M_spec._M_fill;
+ char32_t __fill_char = _M_spec._M_fill;
_Align __align = _M_spec._M_align;
size_t __nfill = __width - __str.size();
@@ -1804,7 +1829,8 @@ namespace __format
typename basic_format_context<_Out, _CharT>::iterator
format(_CharT __u, basic_format_context<_Out, _CharT>& __fc) const
{
- if (_M_f._M_spec._M_type == __format::_Pres_none)
+ if (_M_f._M_spec._M_type == __format::_Pres_none
+ || _M_f._M_spec._M_type == __format::_Pres_c)
return _M_f._M_format_character(__u, __fc);
else if (_M_f._M_spec._M_type == __format::_Pres_esc)
{
@@ -1812,7 +1838,7 @@ namespace __format
return __fc.out();
}
else
- return _M_f.format(__u, __fc);
+ return _M_f.format(static_cast<make_unsigned_t<_CharT>>(__u), __fc);
}
#if __cpp_lib_format_ranges
@@ -1842,7 +1868,8 @@ namespace __format
typename basic_format_context<_Out, wchar_t>::iterator
format(char __u, basic_format_context<_Out, wchar_t>& __fc) const
{
- if (_M_f._M_spec._M_type == __format::_Pres_none)
+ if (_M_f._M_spec._M_type == __format::_Pres_none
+ || _M_f._M_spec._M_type == __format::_Pres_c)
return _M_f._M_format_character(__u, __fc);
else if (_M_f._M_spec._M_type == __format::_Pres_esc)
{
@@ -1850,7 +1877,7 @@ namespace __format
return __fc.out();
}
else
- return _M_f.format(__u, __fc);
+ return _M_f.format(static_cast<unsigned char>(__u), __fc);
}
#if __cpp_lib_format_ranges
@@ -3399,13 +3426,16 @@ namespace __format
using _Td = _Normalize<_Tp>;
if constexpr (is_same_v<_Td, basic_string_view<_CharT>>)
_M_set(_Td{__v.data(), __v.size()});
+ else if constexpr (is_same_v<remove_const_t<_Tp>, char>
+ && is_same_v<_CharT, wchar_t>)
+ _M_set(static_cast<_Td>(static_cast<unsigned char>(__v)));
else
_M_set(static_cast<_Td>(__v));
}
template<typename _Ctx, typename... _Argz>
friend auto
- make_format_args(_Argz&&...) noexcept;
+ make_format_args(_Argz&...) noexcept;
template<typename _Visitor, typename _Ctx>
friend decltype(auto)
@@ -3575,7 +3605,7 @@ namespace __format
template<typename _Ctx, typename... _Args>
friend auto
- make_format_args(_Args&&...) noexcept;
+ make_format_args(_Args&...) noexcept;
// An array of _Arg_t enums corresponding to _Args...
template<typename... _Args>
@@ -3613,7 +3643,7 @@ namespace __format
template<typename _Context, typename... _Args>
auto
- make_format_args(_Args&&... __fmt_args) noexcept;
+ make_format_args(_Args&... __fmt_args) noexcept;
// An array of type-erased formatting arguments.
template<typename _Context, typename... _Args>
@@ -3629,7 +3659,7 @@ namespace __format
#else
std::
#endif
- make_format_args(_Argz&&...) noexcept;
+ make_format_args(_Argz&...) noexcept;
// For a sufficiently small number of arguments we only store values.
// basic_format_args can get the types from the _Args pack.
@@ -3703,11 +3733,11 @@ namespace __format
template<typename _Context = format_context, typename... _Args>
[[nodiscard,__gnu__::__always_inline__]]
inline auto
- make_format_args(_Args&&... __fmt_args) noexcept
+ make_format_args(_Args&... __fmt_args) noexcept
{
using _Fmt_arg = basic_format_arg<_Context>;
using _Store = __format::_Arg_store<_Context, typename _Fmt_arg::template
- _Normalize<remove_reference_t<_Args>>...>;
+ _Normalize<_Args>...>;
return _Store(__fmt_args...);
}
@@ -3716,7 +3746,7 @@ namespace __format
template<typename... _Args>
[[nodiscard,__gnu__::__always_inline__]]
inline auto
- make_wformat_args(_Args&&... __args) noexcept
+ make_wformat_args(_Args&... __args) noexcept
{ return std::make_format_args<wformat_context>(__args...); }
#endif
@@ -4232,7 +4262,7 @@ namespace __format
format_to(_Out __out, format_string<_Args...> __fmt, _Args&&... __args)
{
return std::vformat_to(std::move(__out), __fmt.get(),
- std::make_format_args(std::forward<_Args>(__args)...));
+ std::make_format_args(__args...));
}
#ifdef _GLIBCXX_USE_WCHAR_T
@@ -4242,7 +4272,7 @@ namespace __format
format_to(_Out __out, wformat_string<_Args...> __fmt, _Args&&... __args)
{
return std::vformat_to(std::move(__out), __fmt.get(),
- std::make_wformat_args(std::forward<_Args>(__args)...));
+ std::make_wformat_args(__args...));
}
#endif
@@ -4253,7 +4283,7 @@ namespace __format
_Args&&... __args)
{
return std::vformat_to(std::move(__out), __loc, __fmt.get(),
- std::make_format_args(std::forward<_Args>(__args)...));
+ std::make_format_args(__args...));
}
#ifdef _GLIBCXX_USE_WCHAR_T
@@ -4264,7 +4294,7 @@ namespace __format
_Args&&... __args)
{
return std::vformat_to(std::move(__out), __loc, __fmt.get(),
- std::make_wformat_args(std::forward<_Args>(__args)...));
+ std::make_wformat_args(__args...));
}
#endif
@@ -4371,7 +4401,7 @@ namespace __format
{
__format::_Counting_sink<char> __buf;
std::vformat_to(__buf.out(), __fmt.get(),
- std::make_format_args(std::forward<_Args>(__args)...));
+ std::make_format_args(__args...));
return __buf.count();
}
@@ -4383,7 +4413,7 @@ namespace __format
{
__format::_Counting_sink<wchar_t> __buf;
std::vformat_to(__buf.out(), __fmt.get(),
- std::make_wformat_args(std::forward<_Args>(__args)...));
+ std::make_wformat_args(__args...));
return __buf.count();
}
#endif
@@ -4396,7 +4426,7 @@ namespace __format
{
__format::_Counting_sink<char> __buf;
std::vformat_to(__buf.out(), __loc, __fmt.get(),
- std::make_format_args(std::forward<_Args>(__args)...));
+ std::make_format_args(__args...));
return __buf.count();
}
@@ -4409,7 +4439,7 @@ namespace __format
{
__format::_Counting_sink<wchar_t> __buf;
std::vformat_to(__buf.out(), __loc, __fmt.get(),
- std::make_wformat_args(std::forward<_Args>(__args)...));
+ std::make_wformat_args(__args...));
return __buf.count();
}
#endif
diff --git a/libstdc++-v3/include/std/generator b/libstdc++-v3/include/std/generator
index e1c1ad5..e7ef5dd 100644
--- a/libstdc++-v3/include/std/generator
+++ b/libstdc++-v3/include/std/generator
@@ -269,7 +269,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
__glibcxx_assert(&__new.promise()._M_nest == this);
__glibcxx_assert(this->_M_is_bottom());
- // We're bottom. We're also top of top is unset (note that this is
+ // We're bottom. We're also top if top is unset (note that this is
// not true if something was added to the coro stack and then popped,
// but in that case we can't possibly be yielded from, as it would
// require rerunning begin()).
@@ -405,9 +405,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
};
- template<typename _A>
- concept _Stateless_alloc = (allocator_traits<_A>::is_always_equal::value
- && default_initializable<_A>);
+ template<typename _All>
+ concept _Stateless_alloc = (allocator_traits<_All>::is_always_equal::value
+ && default_initializable<_All>);
template<typename _Alloc>
class _Promise_alloc
diff --git a/libstdc++-v3/include/std/ostream b/libstdc++-v3/include/std/ostream
index a4ef92c..7d501d6 100644
--- a/libstdc++-v3/include/std/ostream
+++ b/libstdc++-v3/include/std/ostream
@@ -981,8 +981,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline void
print(ostream& __os, format_string<_Args...> __fmt, _Args&&... __args)
{
- auto __fmtargs = std::make_format_args(std::forward<_Args>(__args)...);
- if constexpr (__format::__literal_encoding_is_utf8())
+ auto __fmtargs = std::make_format_args(__args...);
+ if constexpr (__unicode::__literal_encoding_is_utf8())
std::vprint_unicode(__os, __fmt.get(), __fmtargs);
else
std::vprint_nonunicode(__os, __fmt.get(), __fmtargs);
diff --git a/libstdc++-v3/include/std/print b/libstdc++-v3/include/std/print
index bb02961..492f333 100644
--- a/libstdc++-v3/include/std/print
+++ b/libstdc++-v3/include/std/print
@@ -103,8 +103,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline void
print(FILE* __stream, format_string<_Args...> __fmt, _Args&&... __args)
{
- auto __fmtargs = std::make_format_args(std::forward<_Args>(__args)...);
- if constexpr (__format::__literal_encoding_is_utf8())
+ auto __fmtargs = std::make_format_args(__args...);
+ if constexpr (__unicode::__literal_encoding_is_utf8())
std::vprint_unicode(__stream, __fmt.get(), __fmtargs);
else
std::vprint_nonunicode(__stream, __fmt.get(), __fmtargs);
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index 217cfac..1cec082 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -1481,7 +1481,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
: public __bool_constant<__is_base_of(_Base, _Derived)>
{ };
-#if __has_builtin(__is_convertible)
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_convertible)
template<typename _From, typename _To>
struct is_convertible
: public __bool_constant<__is_convertible(_From, _To)>
@@ -1531,7 +1531,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#ifdef __cpp_lib_is_nothrow_convertible // C++ >= 20
-#if __has_builtin(__is_nothrow_convertible)
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_nothrow_convertible)
/// is_nothrow_convertible_v
template<typename _From, typename _To>
inline constexpr bool is_nothrow_convertible_v
@@ -1606,7 +1606,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ using type = _Tp; };
/// remove_cv
-#if __has_builtin(__remove_cv)
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__remove_cv)
template<typename _Tp>
struct remove_cv
{ using type = __remove_cv(_Tp); };
@@ -1672,7 +1672,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Reference transformations.
/// remove_reference
-#if __has_builtin(__remove_reference)
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__remove_reference)
template<typename _Tp>
struct remove_reference
{ using type = __remove_reference(_Tp); };
@@ -3410,9 +3410,28 @@ template <typename _Tp>
inline constexpr bool is_trivially_move_assignable_v
= __is_trivially_assignable(__add_lval_ref_t<_Tp>,
__add_rval_ref_t<_Tp>);
+
+#if __cpp_concepts
+template <typename _Tp>
+ inline constexpr bool is_trivially_destructible_v = false;
+
+template <typename _Tp>
+ requires (!is_reference_v<_Tp>) && requires (_Tp& __t) { __t.~_Tp(); }
+ inline constexpr bool is_trivially_destructible_v<_Tp>
+ = __has_trivial_destructor(_Tp);
+template <typename _Tp>
+ inline constexpr bool is_trivially_destructible_v<_Tp&> = true;
+template <typename _Tp>
+ inline constexpr bool is_trivially_destructible_v<_Tp&&> = true;
+template <typename _Tp, size_t _Nm>
+ inline constexpr bool is_trivially_destructible_v<_Tp[_Nm]>
+ = is_trivially_destructible_v<_Tp>;
+#else
template <typename _Tp>
inline constexpr bool is_trivially_destructible_v =
is_trivially_destructible<_Tp>::value;
+#endif
+
template <typename _Tp, typename... _Args>
inline constexpr bool is_nothrow_constructible_v
= __is_nothrow_constructible(_Tp, _Args...);
@@ -3477,8 +3496,13 @@ template <typename _Tp>
#endif
template <typename _Base, typename _Derived>
inline constexpr bool is_base_of_v = __is_base_of(_Base, _Derived);
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_convertible)
template <typename _From, typename _To>
inline constexpr bool is_convertible_v = __is_convertible(_From, _To);
+#else
+template <typename _From, typename _To>
+ inline constexpr bool is_convertible_v = is_convertible<_From, _To>::value;
+#endif
template<typename _Fn, typename... _Args>
inline constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value;
template<typename _Fn, typename... _Args>
@@ -3537,7 +3561,7 @@ template<typename _Ret, typename _Fn, typename... _Args>
* @{
*/
#ifdef __cpp_lib_remove_cvref // C++ >= 20
-# if __has_builtin(__remove_cvref)
+# if _GLIBCXX_USE_BUILTIN_TRAIT(__remove_cvref)
template<typename _Tp>
struct remove_cvref
{ using type = __remove_cvref(_Tp); };
diff --git a/libstdc++-v3/libsupc++/unwind-cxx.h b/libstdc++-v3/libsupc++/unwind-cxx.h
index f7eef0d..abc8b80 100644
--- a/libstdc++-v3/libsupc++/unwind-cxx.h
+++ b/libstdc++-v3/libsupc++/unwind-cxx.h
@@ -167,7 +167,7 @@ struct __cxa_eh_globals
// throws, and if bad_exception needs to be thrown. Called from the
// compiler.
extern "C" void __cxa_call_unexpected (void *) __attribute__((__noreturn__));
-extern "C" void __cxa_call_terminate (_Unwind_Exception*) throw ()
+extern "C" void __cxa_call_terminate (void*) throw ()
__attribute__((__noreturn__));
#ifdef __ARM_EABI_UNWINDER__
diff --git a/libstdc++-v3/src/c++17/fs_path.cc b/libstdc++-v3/src/c++17/fs_path.cc
index 4e41b89..d33b8d9 100644
--- a/libstdc++-v3/src/c++17/fs_path.cc
+++ b/libstdc++-v3/src/c++17/fs_path.cc
@@ -35,6 +35,7 @@
#include <algorithm>
#include <array>
#include <bits/stl_uninitialized.h>
+#include <ext/numeric_traits.h> // __gnu_cxx::__int_traits
namespace fs = std::filesystem;
using fs::path;
@@ -447,10 +448,30 @@ path::_List::reserve(int newcap, bool exact = false)
if (curcap < newcap)
{
- if (!exact && newcap < int(1.5 * curcap))
- newcap = 1.5 * curcap;
+ if (!exact)
+ {
+ const int nextcap = curcap + curcap / 2;
+ if (newcap < nextcap)
+ newcap = nextcap;
+ }
+
+ using __gnu_cxx::__int_traits;
+ // Nobody should need paths with this many components.
+ if (newcap >= __int_traits<int>::__max / 4)
+ std::__throw_bad_alloc();
- void* p = ::operator new(sizeof(_Impl) + newcap * sizeof(value_type));
+ size_t bytes;
+ if constexpr (__int_traits<int>::__max >= __int_traits<size_t>::__max)
+ {
+ size_t components;
+ if (__builtin_mul_overflow(newcap, sizeof(value_type), &components)
+ || __builtin_add_overflow(sizeof(_Impl), components, &bytes))
+ std::__throw_bad_alloc();
+ }
+ else // This won't overflow, even for 20-bit size_t on msp430.
+ bytes = sizeof(_Impl) + newcap * sizeof(value_type);
+
+ void* p = ::operator new(bytes);
std::unique_ptr<_Impl, _Impl_deleter> newptr(::new(p) _Impl{newcap});
const int cursize = curptr ? curptr->size() : 0;
if (cursize)
@@ -587,13 +608,6 @@ path::operator/=(const path& __p)
++capacity; // Need to insert root-directory after root-name
#endif
- if (orig_type == _Type::_Multi)
- {
- const int curcap = _M_cmpts._M_impl->capacity();
- if (capacity > curcap)
- capacity = std::max(capacity, (int) (curcap * 1.5));
- }
-
_M_pathname.reserve(_M_pathname.length() + sep.length()
+ __p._M_pathname.length());
diff --git a/libstdc++-v3/src/c++23/print.cc b/libstdc++-v3/src/c++23/print.cc
index be9762b..aceca6f 100644
--- a/libstdc++-v3/src/c++23/print.cc
+++ b/libstdc++-v3/src/c++23/print.cc
@@ -162,7 +162,7 @@ namespace
}
continue;
}
- else if (byte < 0xC2)
+ else if (byte < 0xC2) [[unlikely]]
{
if constexpr (transcode)
out.push_back(0xFFFD);
diff --git a/libstdc++-v3/src/libbacktrace/Makefile.in b/libstdc++-v3/src/libbacktrace/Makefile.in
index ce80d24..b5713b0 100644
--- a/libstdc++-v3/src/libbacktrace/Makefile.in
+++ b/libstdc++-v3/src/libbacktrace/Makefile.in
@@ -15,7 +15,7 @@
@SET_MAKE@
# Makefile.am -- Backtrace in libstdc++ Makefile.
-# Copyright (C) 2012-2023 Free Software Foundation, Inc.
+# Copyright (C) 2012-2024 Free Software Foundation, Inc.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
diff --git a/libstdc++-v3/testsuite/20_util/duration/io.cc b/libstdc++-v3/testsuite/20_util/duration/io.cc
index 0582c007..e141baf 100644
--- a/libstdc++-v3/testsuite/20_util/duration/io.cc
+++ b/libstdc++-v3/testsuite/20_util/duration/io.cc
@@ -82,7 +82,8 @@ test_format()
char fmt[] = { '{', ':', '%', c, '}' };
try
{
- (void) std::vformat(std::string_view(fmt, 5), std::make_format_args(1s));
+ auto s = 1s;
+ (void) std::vformat(std::string_view(fmt, 5), std::make_format_args(s));
// The call above should throw for any conversion-spec not in my_specs:
VERIFY(my_specs.find(c) != my_specs.npos);
}
diff --git a/libstdc++-v3/testsuite/20_util/is_trivially_destructible/value_v.cc b/libstdc++-v3/testsuite/20_util/is_trivially_destructible/value_v.cc
new file mode 100644
index 0000000..7db098a
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_trivially_destructible/value_v.cc
@@ -0,0 +1,40 @@
+// { dg-do compile { target c++17 } }
+#include <type_traits>
+#include <testsuite_tr1.h>
+
+template<typename T>
+constexpr void test_cv()
+{
+ static_assert(std::is_trivially_destructible_v<const T>
+ == std::is_trivially_destructible_v<T>);
+ static_assert(std::is_trivially_destructible_v<volatile T>
+ == std::is_trivially_destructible_v<T>);
+ static_assert(std::is_trivially_destructible_v<const volatile T>
+ == std::is_trivially_destructible_v<T>);
+}
+
+template<typename T, bool Expected>
+void test()
+{
+ static_assert(std::is_trivially_destructible_v<T> == Expected);
+ test_cv<T>();
+}
+
+void test01()
+{
+ using namespace __gnu_test;
+
+ test<int, true>();
+ test<int&, true>();
+ test<int&&, true>();
+ test<int[1], true>();
+ test<TType, true>();
+ test<TType[1], true>();
+ test<PODType, true>();
+ test<PODType[1], true>();
+ test<NType, false>();
+ test<SLType, false>();
+ test<int(), false>();
+ test<void, false>();
+ test<int[], false>();
+}
diff --git a/libstdc++-v3/testsuite/20_util/variant/87619.cc b/libstdc++-v3/testsuite/20_util/variant/87619.cc
index 2c2fc50..45418e1 100644
--- a/libstdc++-v3/testsuite/20_util/variant/87619.cc
+++ b/libstdc++-v3/testsuite/20_util/variant/87619.cc
@@ -16,8 +16,6 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile { target c++17 } }
-// FIXME: Need increased timeout due to PR c++/102780
-// { dg-timeout-factor 2 { target c++20 } }
#include <variant>
#include <utility>
diff --git a/libstdc++-v3/testsuite/21_strings/char_traits/requirements/113200.cc b/libstdc++-v3/testsuite/21_strings/char_traits/requirements/113200.cc
new file mode 100644
index 0000000..0fe765d
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/char_traits/requirements/113200.cc
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++20 } }
+
+// PR libstdc++/113200
+// char_traits::move is not constexpr when the argument is a string literal
+
+#include <string_view>
+
+template<std::size_t N> struct S
+{
+ char data_[ N ];
+
+ constexpr S( char const* p ): data_{}
+ {
+ std::char_traits<char>::move( data_, p, N );
+ }
+};
+
+template<std::size_t N> S( char const(&)[N] ) -> S<N>;
+
+constexpr S s( "test" );
diff --git a/libstdc++-v3/testsuite/ext/unicode/view.cc b/libstdc++-v3/testsuite/ext/unicode/view.cc
new file mode 100644
index 0000000..eaab5c7
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/unicode/view.cc
@@ -0,0 +1,102 @@
+// { dg-do run { target c++20 } }
+#include <format>
+#include <string_view>
+#include <ranges>
+#include <testsuite_hooks.h>
+
+namespace uc = std::__unicode;
+using namespace std::string_view_literals;
+
+constexpr void
+test_utf8_to_utf8()
+{
+ const std::u8string_view s8 = u8"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡";
+ uc::_Utf8_view v(s8);
+ VERIFY( std::ranges::distance(v) == s8.size() );
+ VERIFY( std::ranges::equal(v, s8) );
+}
+
+constexpr void
+test_utf8_to_utf16()
+{
+ const std::u8string_view s8 = u8"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡";
+ const std::u16string_view s16 = u"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡";
+ uc::_Utf16_view v(s8);
+ VERIFY( std::ranges::distance(v) == s16.size() );
+ VERIFY( std::ranges::equal(v, s16) );
+}
+
+constexpr void
+test_utf8_to_utf32()
+{
+ const auto s8 = u8"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡"sv;
+ const auto s32 = U"£🇬🇧 €🇪🇺 æбçδé ♠♥♦♣ 🤡"sv;
+ uc::_Utf32_view v(s8);
+ VERIFY( std::ranges::distance(v) == s32.size() );
+ VERIFY( std::ranges::equal(v, s32) );
+}
+
+constexpr void
+test_illformed_utf8()
+{
+ uc::_Utf32_view v("\xa3 10.99 \xee \xdd"sv);
+ VERIFY( std::ranges::equal(v, U"\uFFFD 10.99 \uFFFD \uFFFD"sv) );
+
+ uc::_Utf16_view v2(" \xf8\x80\x80\x80 "sv);
+ VERIFY( std::ranges::distance(v2) == 6 );
+ VERIFY( std::ranges::equal(v2, U" \uFFFD\uFFFD\uFFFD\uFFFD "sv) );
+
+ // Examples of U+FFFD substitution from Unicode standard.
+ uc::_Utf8_view v3("\xc0\xaf\xe0\x80\xbf\xf0\x81\x82\x41"sv); // Table 3-8
+ VERIFY( std::ranges::equal(v3, u8"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\x41"sv) );
+ uc::_Utf8_view v4("\xed\xa0\x80\xed\xbf\xbf\xed\xaf\x41"sv); // Table 3-9
+ VERIFY( std::ranges::equal(v4, u8"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\x41"sv) );
+ uc::_Utf8_view v5("\xf4\x91\x92\x93\xff\x41\x80\xbf\x42"sv); // Table 3-10
+ VERIFY( std::ranges::equal(v5, u8"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\x41\uFFFD\uFFFD\x42"sv) );
+ uc::_Utf8_view v6("\xe1\x80\xe2\xf0\x91\x92\xf1\xbf\x41"sv); // Table 3-11
+ VERIFY( std::ranges::equal(v6, u8"\uFFFD\uFFFD\uFFFD\uFFFD\x41"sv) );
+}
+
+constexpr void
+test_illformed_utf16()
+{
+ std::u16string_view s = u"\N{CLOWN FACE}";
+ std::u16string_view r = u"\uFFFD";
+ VERIFY( std::ranges::equal(uc::_Utf16_view(s.substr(0, 1)), r) );
+ VERIFY( std::ranges::equal(uc::_Utf16_view(s.substr(1, 1)), r) );
+ std::array s2{ s[0], s[0] };
+ VERIFY( std::ranges::equal(uc::_Utf16_view(s2), u"\uFFFD\uFFFD"sv) );
+ std::array s3{ s[0], s[0], s[1] };
+ VERIFY( std::ranges::equal(uc::_Utf16_view(s3), u"\uFFFD\N{CLOWN FACE}"sv) );
+ std::array s4{ s[1], s[0] };
+ VERIFY( std::ranges::equal(uc::_Utf16_view(s4), u"\uFFFD\uFFFD"sv) );
+ std::array s5{ s[1], s[0], s[1] };
+ VERIFY( std::ranges::equal(uc::_Utf16_view(s5), u"\uFFFD\N{CLOWN FACE}"sv) );
+}
+
+constexpr void
+test_illformed_utf32()
+{
+ std::u32string_view s = U"\x110000";
+ VERIFY( std::ranges::equal(uc::_Utf32_view(s), U"\uFFFD"sv) );
+ s = U"\xFFFFFF";
+ VERIFY( std::ranges::equal(uc::_Utf32_view(s), U"\uFFFD"sv) );
+ s = U"\xFFFFFFF0";
+ VERIFY( std::ranges::equal(uc::_Utf32_view(s), U"\uFFFD"sv) );
+}
+
+int main()
+{
+ auto run_tests = []{
+ test_utf8_to_utf8();
+ test_utf8_to_utf16();
+ test_utf8_to_utf32();
+ test_illformed_utf8();
+ test_illformed_utf16();
+ test_illformed_utf32();
+ return true;
+ };
+
+ VERIFY( run_tests() );
+ static_assert( run_tests() );
+}
diff --git a/libstdc++-v3/testsuite/std/format/arguments/args.cc b/libstdc++-v3/testsuite/std/format/arguments/args.cc
index a45f3fb..eba129f 100644
--- a/libstdc++-v3/testsuite/std/format/arguments/args.cc
+++ b/libstdc++-v3/testsuite/std/format/arguments/args.cc
@@ -46,7 +46,12 @@ struct std::formatter<E> : std::formatter<int>
void
test_args()
{
- auto store = std::make_format_args(false, 1, '2', 3.4);
+ bool b = false;
+ int i = 1;
+ char c = '2';
+ double d = 3.4;
+
+ auto store = std::make_format_args(b, i, c, d);
std::format_args args = store;
VERIFY(equals(args.get(0), false));
VERIFY(equals(args.get(1), 1));
@@ -54,7 +59,11 @@ test_args()
VERIFY(equals(args.get(3), 3.4));
VERIFY(!args.get(4));
- auto cstore = std::make_format_args<std::format_context>(5L, 6ULL, 7.8f);
+ long l = 5L;
+ unsigned long long ull = 6ULL;
+ float f = 7.8f;
+
+ auto cstore = std::make_format_args<std::format_context>(l, ull, f);
std::format_args cargs = cstore;
if constexpr (sizeof(long) == sizeof(int))
VERIFY(equals(cargs.get(0), 5));
@@ -64,14 +73,17 @@ test_args()
VERIFY(equals(cargs.get(2), 7.8f));
VERIFY(!cargs.get(3));
- VERIFY(equals(std::format_args(std::make_format_args(std::string("tenfour"))).get(0), std::string_view("tenfour")));
+ std::string s = "tenfour";
+ VERIFY(equals(std::format_args(std::make_format_args(s)).get(0), std::string_view("tenfour")));
+ char nine = '9';
+ wchar_t ten = L'X';
// This needs to be on the stack so that testing pointer equality works.
wchar_t eleven[] = L"eleven";
- // This needs to be on the stack so that the wstring_view doesn't dangle.
+ long double twelve13 = 12.13L;
std::wstring tenfour = L"tenfour";
- auto wstore = std::make_wformat_args('9', L'X', eleven, 12.13L, tenfour);
+ auto wstore = std::make_wformat_args(nine, ten, eleven, twelve13, tenfour);
std::wformat_args wargs = wstore;
VERIFY(equals(wargs.get(0), static_cast<wchar_t>('9')));
VERIFY(equals(wargs.get(1), L'X'));
@@ -80,7 +92,9 @@ test_args()
VERIFY(equals(wargs.get(4), std::wstring_view(tenfour)));
VERIFY(!wargs.get(5));
- auto another_store = std::make_format_args(nullptr, E::ByGum);
+ std::nullptr_t null;
+ E eebygum = E::ByGum;
+ auto another_store = std::make_format_args(null, eebygum);
args = another_store;
VERIFY(equals(args.get(0), static_cast<const void*>(nullptr)));
using handle = std::basic_format_arg<std::format_context>::handle;
diff --git a/libstdc++-v3/testsuite/std/format/arguments/args_neg.cc b/libstdc++-v3/testsuite/std/format/arguments/args_neg.cc
new file mode 100644
index 0000000..16ac304
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/format/arguments/args_neg.cc
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++20 } }
+
+// P2905R2 Runtime format strings
+
+#include <format>
+
+std::string rval() { return "path/etic/experience"; }
+
+void f()
+{
+ (void)std::make_format_args(rval()); // { dg-error "cannot bind non-const lvalue reference" }
+}
diff --git a/libstdc++-v3/testsuite/std/format/arguments/lwg3810.cc b/libstdc++-v3/testsuite/std/format/arguments/lwg3810.cc
index f89f402..8a9f9ed 100644
--- a/libstdc++-v3/testsuite/std/format/arguments/lwg3810.cc
+++ b/libstdc++-v3/testsuite/std/format/arguments/lwg3810.cc
@@ -4,7 +4,11 @@
#include <format>
-auto args_store = std::make_format_args(1,2,3);
+int x = 1;
+long y = 2;
+short z = 3;
+
+auto args_store = std::make_format_args(x, y, z);
std::basic_format_args args = args_store;
static_assert(std::is_same_v<decltype(args), std::format_args>);
@@ -20,5 +24,5 @@ test_ctad()
using SomeContext = std::wformat_context;
// foo(make_format_args<SomeContext>(...)); // won't work
- foo(basic_format_args(make_format_args<SomeContext>(1, 2, 3))); // should work
+ foo(basic_format_args(make_format_args<SomeContext>(x, y, z))); // should work
}
diff --git a/libstdc++-v3/testsuite/std/format/functions/format.cc b/libstdc++-v3/testsuite/std/format/functions/format.cc
index b3b4f06..63702ed 100644
--- a/libstdc++-v3/testsuite/std/format/functions/format.cc
+++ b/libstdc++-v3/testsuite/std/format/functions/format.cc
@@ -1,3 +1,4 @@
+// { dg-options "-fexec-charset=UTF-8" }
// { dg-do run { target c++20 } }
// { dg-add-options no_pch }
@@ -9,6 +10,12 @@
# error "Feature test macro for std::format has wrong value in <format>"
#endif
+#ifndef __cpp_lib_format_uchar
+# error "Feature test macro for formatting chars as integers is missing in <format>"
+#elif __cpp_lib_format_uchar < 202311L
+# error "Feature test macro for formatting chars as integers has wrong value in <format>"
+#endif
+
#undef __cpp_lib_format
#include <version>
#ifndef __cpp_lib_format
@@ -17,6 +24,12 @@
# error "Feature test macro for std::format has wrong value in <version>"
#endif
+#ifndef __cpp_lib_format_uchar
+# error "Feature test macro for formatting chars as integers is missing in <version>"
+#elif __cpp_lib_format_uchar < 202311L
+# error "Feature test macro for formatting chars as integers has wrong value in <version>"
+#endif
+
#include <string>
#include <limits>
#include <cstdint>
@@ -85,6 +98,18 @@ test_std_examples()
VERIFY(s5 == " 120");
string s6 = format("{:6}", true);
VERIFY(s6 == "true ");
+ string s7 = format("{:*<6.3}", "123456");
+ VERIFY( s7 == "123***" );
+ string s8 = format("{:02}", 1234);
+ VERIFY( s8 == "1234" );
+ string s9 = format("{:*<}", "12");
+ VERIFY( s9 == "12" );
+ string sA = format("{:*<6}", "12345678");
+ VERIFY( sA == "12345678" );
+ string sB = format("{:🤡^6}", "x");
+ VERIFY( sB == "🤡🤡x🤡🤡🤡" );
+ string sC = format("{:*^6}", "🤡🤡🤡");
+ VERIFY( sC == "🤡🤡🤡" );
}
// sign
@@ -242,14 +267,16 @@ test_width()
}
try {
- auto args = std::make_format_args(false, true);
+ bool no = false, yes = true;
+ auto args = std::make_format_args(no, yes);
s = std::vformat("DR 3720: restrict type of width arg-id {0:{1}}", args);
VERIFY(false);
} catch (const std::format_error&) {
}
try {
- auto args = std::make_format_args('?', '!');
+ char wat = '?', bang = '!';
+ auto args = std::make_format_args(wat, bang);
s = std::vformat("DR 3720: restrict type of width arg-id {0:{1}}", args);
VERIFY(false);
} catch (const std::format_error&) {
@@ -274,13 +301,16 @@ test_char()
VERIFY( s == "0023 0077" );
s = std::format("{:b} {:B} {:#b} {:#B}", '\xff', '\xa0', '\x17', '\x3f');
- if constexpr (std::is_unsigned_v<char>)
- VERIFY( s == "11111111 10100000 0b10111 0B111111" );
- else
- VERIFY( s == "-1 -1100000 0b10111 0B111111" );
+ VERIFY( s == "11111111 10100000 0b10111 0B111111" );
s = std::format("{:x} {:#x} {:#X}", '\x12', '\x34', '\x45');
VERIFY( s == "12 0x34 0X45" );
+
+ // P2909R4 Fix formatting of code units as integers (Dude, where’s my char?)
+ // char and wchar_t should be converted to unsigned when formatting them
+ // with an integer presentation type.
+ s = std::format("{0:b} {0:B} {0:d} {0:o} {0:x} {0:X}", '\xf0');
+ VERIFY( s == "11110000 11110000 240 360 f0 F0" );
}
void
@@ -313,6 +343,10 @@ test_wchar()
s = std::format(L"{0:#b} {0:#B} {0:#x} {0:#X}", 99);
VERIFY( s == L"0b1100011 0B1100011 0x63 0X63" );
+
+ // P2909R4 Fix formatting of code units as integers (Dude, where’s my char?)
+ s = std::format(L"{:d} {:d}", wchar_t(-1), char(-1));
+ VERIFY( s.find('-') == std::wstring::npos );
}
void
@@ -439,6 +473,59 @@ test_bool()
VERIFY( s == "0 0x1 0X0" );
}
+void
+test_unicode()
+{
+ // Similar to sC example in test_std_examples, but not from the standard.
+ // Verify that the character "🤡" has estimated field width 2,
+ // rather than estimated field width equal to strlen("🤡"), which would be 4.
+ std::string sC = std::format("{:*<3}", "🤡");
+ VERIFY( sC == "🤡*" );
+
+ // Verify that "£" has estimated field width 1, not strlen("£") == 2.
+ std::string sL = std::format("{:*<3}", "£");
+ VERIFY( sL == "£**" );
+
+ // Verify that precision is measured in field width units (column positions)
+ // not bytes. The result should contain complete Unicode characters, not be
+ // truncated in the middle of a multibyte UTF-8 sequence. The string "£" has
+ // field width 1 despite being 2 bytes, and the string "🤡" has field width 2
+ // and so cannot be formatted into a replacement field using .1 precision.
+ std::string sP = std::format("{:1.1} {:*<1.1}", "£", "🤡");
+ VERIFY( sP == "£ *" );
+ sP = std::format("{:*<2.1} {:*<2.1}", "£", "🤡");
+ VERIFY( sP == "£* **" );
+
+ // Verify field width handling for extended grapheme clusters,
+ // and that a cluster gets output as a single item, not truncated.
+ std::string sG = std::format("{:*>2.1}", "\u006f\u0302\u0323!");
+ VERIFY( sG == "*\u006f\u0302\u0323" );
+
+ // Examples from P1868R2
+ // https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1868r2.html
+ const char* inputs[][2] = {
+ {"\x41", " \u0041"},
+ {"\xC3\x81", " \u00c1"},
+ {"\x41\xCC\x81", " \u0041\u0301"},
+ {"\xc4\xb2", " \u0132"},
+ {"\xce\x94", " \u0394"},
+ {"\xd0\xa9", " \u0429"},
+ {"\xd7\x90", " \u05D0"},
+ {"\xd8\xb4", " \u0634"},
+ {"\xe3\x80\x89", " \u3009"},
+ {"\xe7\x95\x8c", " \u754C"},
+ {"\xf0\x9f\xa6\x84", " \U0001F984"},
+ {"\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d"
+ "\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa6",
+ " \U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466" }
+ };
+ for (auto& input : inputs)
+ {
+ std::string sA = std::format("{:>5}", input[0]);
+ VERIFY( sA == input[1] );
+ }
+}
+
int main()
{
test_no_args();
@@ -453,4 +540,5 @@ int main()
test_p1652r1();
test_pointer();
test_bool();
+ test_unicode();
}
diff --git a/libstdc++-v3/testsuite/std/format/functions/vformat_to.cc b/libstdc++-v3/testsuite/std/format/functions/vformat_to.cc
index fe0367f..2be3d6f 100644
--- a/libstdc++-v3/testsuite/std/format/functions/vformat_to.cc
+++ b/libstdc++-v3/testsuite/std/format/functions/vformat_to.cc
@@ -29,17 +29,22 @@ private:
void
test_move_only()
{
+ const char arg1[] = "matte";
+ int arg2 = '!';
+
std::string str;
move_only_iterator<char> mo(std::back_inserter(str));
auto res = std::vformat_to(std::move(mo), "for{:.3} that{:c}",
- std::make_format_args("matte", (int)'!'));
+ std::make_format_args(arg1, arg2));
static_assert(std::is_same_v<decltype(res), decltype(mo)>);
VERIFY( str == "format that!" );
+ const wchar_t warg1[] = L"matte";
+ long warg2 = L'!';
std::wstring wstr;
move_only_iterator<wchar_t> wmo(std::back_inserter(wstr));
auto wres = std::vformat_to(std::move(wmo), L"for{:.3} that{:c}",
- std::make_wformat_args(L"matte", (long)L'!'));
+ std::make_wformat_args(warg1, warg2));
static_assert(std::is_same_v<decltype(wres), decltype(wmo)>);
VERIFY( wstr == L"format that!" );
}
diff --git a/libstdc++-v3/testsuite/std/format/runtime_format.cc b/libstdc++-v3/testsuite/std/format/runtime_format.cc
new file mode 100644
index 0000000..174334c
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/format/runtime_format.cc
@@ -0,0 +1,37 @@
+// { dg-do run { target c++26 } }
+
+#include <format>
+#include <testsuite_hooks.h>
+
+void
+test_char()
+{
+ std::string fmt = "{}";
+ auto s = std::format(std::runtime_format(fmt), 123);
+ VERIFY( s == "123" );
+}
+
+void
+test_wchar()
+{
+ std::wstring fmt = L"{:#o}";
+ auto s = std::format(std::runtime_format(fmt), 456);
+ VERIFY( s == L"0710" );
+}
+
+void
+test_internal_api()
+{
+ // Using _Runtime_format_string directly works even in C++20 mode.
+ // This can be used internally by libstdc++.
+ std::string fmt = "{:#x}";
+ auto s = std::format(std::__format::_Runtime_format_string<char>(fmt), 789);
+ VERIFY( s == "0x315" );
+}
+
+int main()
+{
+ test_char();
+ test_wchar();
+ test_internal_api();
+}
diff --git a/libstdc++-v3/testsuite/std/format/string.cc b/libstdc++-v3/testsuite/std/format/string.cc
index 40aaeba..ddb3c56 100644
--- a/libstdc++-v3/testsuite/std/format/string.cc
+++ b/libstdc++-v3/testsuite/std/format/string.cc
@@ -149,8 +149,9 @@ void
test_pr110862()
{
try {
+ int i = 1;
// PR libstdc++/110862 out-of-bounds read on invalid format string
- (void) std::vformat("{0:{0}", std::make_format_args(1));
+ (void) std::vformat("{0:{0}", std::make_format_args(i));
VERIFY( false );
} catch (const std::format_error& e) {
std::string_view what = e.what();
@@ -162,9 +163,11 @@ void
test_pr110974()
{
try {
+ double d = 1.0;
+ int i = 1;
// PR libstdc++/110974 out of bounds read on invalid format string "{:{}."
std::string_view fmt{"{:{}.0", 5}; // "0" is not part of the format string.
- (void) std::vformat(fmt, std::make_format_args(1.0, 1));
+ (void) std::vformat(fmt, std::make_format_args(d, i));
VERIFY( false );
} catch (const std::format_error& e) {
std::string_view what = e.what();
diff --git a/libstdc++-v3/testsuite/std/time/day/io.cc b/libstdc++-v3/testsuite/std/time/day/io.cc
index 3454657..36ce7ec 100644
--- a/libstdc++-v3/testsuite/std/time/day/io.cc
+++ b/libstdc++-v3/testsuite/std/time/day/io.cc
@@ -51,8 +51,8 @@ test_format()
char fmt[] = { '{', ':', '%', c, '}' };
try
{
- (void) std::vformat(std::string_view(fmt, 5),
- std::make_format_args(day(1)));
+ day d(1);
+ (void) std::vformat(std::string_view(fmt, 5), std::make_format_args(d));
// The call above should throw for any conversion-spec not in my_specs:
VERIFY(my_specs.find(c) != my_specs.npos);
}
diff --git a/libstdc++-v3/testsuite/std/time/month/1.cc b/libstdc++-v3/testsuite/std/time/month/1.cc
index 0f8ce55..0caf0f1 100644
--- a/libstdc++-v3/testsuite/std/time/month/1.cc
+++ b/libstdc++-v3/testsuite/std/time/month/1.cc
@@ -20,6 +20,7 @@
// Class template day [time.cal.month]
#include <chrono>
+#include <limits>
constexpr void
constexpr_month()
@@ -34,6 +35,24 @@ constexpr_month()
dm += months{3};
dm -= months{3};
+ // Test for UB (overflow).
+ {
+ using rep = months::rep;
+ using std::numeric_limits;
+
+ auto constexpr months_min = months{numeric_limits<rep>::min()};
+ auto constexpr month_000_plus_months_min = month{ 0 } + months_min;
+ auto constexpr month_255_plus_months_min = month{255} + months_min;
+ auto constexpr month_000_minus_months_min = month{ 0 } - months_min;
+ auto constexpr month_255_minus_months_min = month{255} - months_min;
+
+ auto constexpr months_max = months{numeric_limits<rep>::max()};
+ auto constexpr month_000_plus_months_max = month{ 0 } + months_max;
+ auto constexpr month_255_plus_months_max = month{255} + months_max;
+ auto constexpr month_000_minus_months_max = month{ 0 } - months_max;
+ auto constexpr month_255_minus_months_max = month{255} - months_max;
+ }
+
static_assert(February + months{11} == January);
static_assert(January + months{1200} == January);
static_assert(January + months{1201} == February);
diff --git a/libstdc++-v3/testsuite/std/time/month/2.cc b/libstdc++-v3/testsuite/std/time/month/2.cc
new file mode 100644
index 0000000..3bcefa6
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/time/month/2.cc
@@ -0,0 +1,32 @@
+// { dg-do run { target c++20 } }
+
+// Class month [time.cal.month]
+
+#include <chrono>
+#include <limits>
+#include <testsuite_hooks.h>
+
+using namespace std::chrono;
+
+void test_extreme_values(months extreme)
+{
+ auto const count = extreme.count();
+ auto const safe = count < 0 ? count + 12 : count;
+ auto const mod = safe - 12 * ((safe < 0 ? safe - 11 : safe) / 12);
+
+ for (unsigned m = 0; m < 256; ++m)
+ {
+ auto const month_plus_extreme = month{m} + extreme;
+ VERIFY(unsigned{month_plus_extreme } == (m + 11 + mod) % 12 + 1);
+
+ auto const month_minus_extreme = month{m} - extreme;
+ VERIFY(unsigned{month_minus_extreme} == (m + 11 - mod) % 12 + 1);
+ }
+}
+
+int main()
+{
+ test_extreme_values(months{std::numeric_limits<months::rep>::max()});
+ test_extreme_values(months{std::numeric_limits<months::rep>::min()});
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/std/time/month/io.cc b/libstdc++-v3/testsuite/std/time/month/io.cc
index 7e80a53..99ec073 100644
--- a/libstdc++-v3/testsuite/std/time/month/io.cc
+++ b/libstdc++-v3/testsuite/std/time/month/io.cc
@@ -74,8 +74,8 @@ test_format()
char fmt[] = { '{', ':', '%', c, '}' };
try
{
- (void) std::vformat(std::string_view(fmt, 5),
- std::make_format_args(month(1)));
+ month m(1);
+ (void) std::vformat(std::string_view(fmt, 5), std::make_format_args(m));
// The call above should throw for any conversion-spec not in my_specs:
VERIFY(my_specs.find(c) != my_specs.npos);
}
diff --git a/libstdc++-v3/testsuite/std/time/weekday/1.cc b/libstdc++-v3/testsuite/std/time/weekday/1.cc
index bb24a36..758999d 100644
--- a/libstdc++-v3/testsuite/std/time/weekday/1.cc
+++ b/libstdc++-v3/testsuite/std/time/weekday/1.cc
@@ -42,8 +42,20 @@ constexpr_weekday()
{
using rep = days::rep;
using std::numeric_limits;
- constexpr weekday max{sys_days{days{numeric_limits<rep>::max()}}};
- constexpr weekday min{sys_days{days{numeric_limits<rep>::min()}}};
+
+ auto constexpr days_min = days{numeric_limits<rep>::min()};
+ auto constexpr weekday_from_sysdays_min = weekday{sys_days{days_min}};
+ auto constexpr weekday_000_plus_days_min = weekday{ 0 } + days_min;
+ auto constexpr weekday_255_plus_days_min = weekday{255} + days_min;
+ auto constexpr weekday_000_minus_days_min = weekday{ 0 } - days_min;
+ auto constexpr weekday_255_minus_days_min = weekday{255} - days_min;
+
+ auto constexpr days_max = days{numeric_limits<rep>::max()};
+ auto constexpr weekday_from_sysdays_max = weekday{sys_days{days_max}};
+ auto constexpr weekday_000_plus_days_max = weekday{ 0 } + days_max;
+ auto constexpr weekday_255_plus_days_max = weekday{255} + days_max;
+ auto constexpr weekday_000_minus_days_max = weekday{ 0 } - days_max;
+ auto constexpr weekday_255_minus_days_max = weekday{255} - days_max;
}
static_assert(weekday{sys_days{1900y/January/1}} == Monday);
diff --git a/libstdc++-v3/testsuite/std/time/weekday/2.cc b/libstdc++-v3/testsuite/std/time/weekday/2.cc
new file mode 100644
index 0000000..9247093
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/time/weekday/2.cc
@@ -0,0 +1,32 @@
+// { dg-do run { target c++20 } }
+
+// Class weekday [time.cal.wd]
+
+#include <chrono>
+#include <limits>
+#include <testsuite_hooks.h>
+
+using namespace std::chrono;
+
+void test_extreme_values(days extreme)
+{
+ auto const count = extreme.count();
+ auto const safe = count < 0 ? count + 7 : count;
+ auto const mod = safe - 7 * ((safe < 0 ? safe - 6 : safe) / 7);
+
+ for (unsigned d = 0; d < 254; ++d)
+ {
+ auto const weekday_plus_extreme = weekday{d} + extreme;
+ VERIFY(weekday_plus_extreme.c_encoding() == (d + mod) % 7);
+
+ auto const weekday_minus_extreme = weekday{d} - extreme;
+ VERIFY(weekday_minus_extreme.c_encoding() == (d + 7 - mod) % 7);
+ }
+}
+
+int main()
+{
+ test_extreme_values(days{std::numeric_limits<days::rep>::max()});
+ test_extreme_values(days{std::numeric_limits<days::rep>::min()});
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/std/time/weekday/io.cc b/libstdc++-v3/testsuite/std/time/weekday/io.cc
index 5ed9028..a56cdae 100644
--- a/libstdc++-v3/testsuite/std/time/weekday/io.cc
+++ b/libstdc++-v3/testsuite/std/time/weekday/io.cc
@@ -77,8 +77,8 @@ test_format()
char fmt[] = { '{', ':', '%', c, '}' };
try
{
- (void) std::vformat(std::string_view(fmt, 5),
- std::make_format_args(weekday(1)));
+ weekday wd(1);
+ (void) std::vformat(std::string_view(fmt, 5), std::make_format_args(wd));
// The call above should throw for any conversion-spec not in my_specs:
VERIFY(my_specs.find(c) != my_specs.npos);
}
diff --git a/libstdc++-v3/testsuite/std/time/year/io.cc b/libstdc++-v3/testsuite/std/time/year/io.cc
index a6683ae..bcaa57f 100644
--- a/libstdc++-v3/testsuite/std/time/year/io.cc
+++ b/libstdc++-v3/testsuite/std/time/year/io.cc
@@ -68,8 +68,8 @@ test_format()
char fmt[] = { '{', ':', '%', c, '}' };
try
{
- (void) std::vformat(std::string_view(fmt, 5),
- std::make_format_args(year(2022)));
+ year y = 2022y;
+ (void) std::vformat(std::string_view(fmt, 5), std::make_format_args(y));
// The call above should throw for any conversion-spec not in my_specs:
VERIFY(my_specs.find(c) != my_specs.npos);
}
diff --git a/libstdc++-v3/testsuite/std/time/year_month_day/io.cc b/libstdc++-v3/testsuite/std/time/year_month_day/io.cc
index 15c5a9f..cb82ef3 100644
--- a/libstdc++-v3/testsuite/std/time/year_month_day/io.cc
+++ b/libstdc++-v3/testsuite/std/time/year_month_day/io.cc
@@ -97,8 +97,8 @@ test_format()
char fmt[] = { '{', ':', '%', c, '}' };
try
{
- (void) std::vformat(std::string_view(fmt, 5),
- std::make_format_args(2022y/December/19));
+ year_month_day ymd = 2022y/December/19;
+ (void) std::vformat(std::string_view(fmt, 5), std::make_format_args(ymd));
// The call above should throw for any conversion-spec not in my_specs:
VERIFY(my_specs.find(c) != my_specs.npos);
}
diff --git a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cinttypes/functions.cc b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cinttypes/functions.cc
index e9eec57..b9a34d0 100644
--- a/libstdc++-v3/testsuite/tr1/8_c_compatibility/cinttypes/functions.cc
+++ b/libstdc++-v3/testsuite/tr1/8_c_compatibility/cinttypes/functions.cc
@@ -29,10 +29,10 @@ void test01()
#if _GLIBCXX_USE_C99_INTTYPES_TR1
std::tr1::intmax_t i = 0, numer = 0, denom = 0, base = 0;
- const char* s = 0;
+ const char* s = "0";
char** endptr = 0;
#if defined(_GLIBCXX_USE_WCHAR_T) && _GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1
- const wchar_t* ws = 0;
+ const wchar_t* ws = L"0";
wchar_t** wendptr = 0;
#endif