[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Gcc ICE on compiling chromium 68 [arm64 armhf]



reassign 901290 gcc-6
notfound 901290 68.0.3440.7-1
found 6.4.0-17
thanks

Compiling chrome 68 with results an gcc ICE. This affects both arm64[1] and
armhf[2]. Filing against gcc-6 as this what buildd used, but this affects 
other versions too:

+-------+-------+-------+-------+
|       | gcc-6 | gcc-7 | gcc-8 |
+-------+-------+-------+-------+
| armhf | ICE   | ICE   | ICE   |
| arm64 | ICE   | works | works |
+-------+-------+-------+-------+

gcc-6 -MMD -MF obj/skia/skcms/Transform.o.d -DV8_DEPRECATION_WARNINGS -DUSE_UDEV -DUSE_AURA=1 -DUSE_GLIB=1 -DUSE_NSS_CERTS=1 -DUSE_X11=1 -DNO_TCMALLOC -DFULL_SAFE_BROWSING -DSAFE_BROWSING_CSD -DSAFE_BROWSING_DB_LOCAL -DCHROMIUM_BUILD -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D_FORTIFY_SOURCE=2 -DNDEBUG -DNVALGRIND -DDYNAMIC_ANNOTATIONS_ENABLED=0 -I../.. -Igen -I../../third_party/skia/third_party/skcms -w -std=c11 -fno-strict-aliasing --param=ssp-buffer-size=4 -fstack-protector -Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__= -funwind-tables -fPIC -pipe -pthread -march=armv7-a -mfloat-abi=hard -mtune=generic-armv7-a -mfpu=vfpv3-d16 -mthumb -Wall -Wno-psabi -Wno-unused-local-typedefs -Wno-maybe-uninitialized -Wno-deprecated-declarations -fno-delete-null-pointer-checks -Wno-comments -Wno-missing-field-initializers -Wno-unused-parameter -Os -fno-ident -fdata-sections -ffunction-sections -fno-omit-frame-pointer -g0 -fvisibility=hidden -std=gnu11 -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -fdebug-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -c ../../third_party/skia/third_party/skcms/src/Transform.c -o obj/skia/skcms/Transform.o
In file included from ../../third_party/skia/third_party/skcms/src/Transform.c:176:0:
../../third_party/skia/third_party/skcms/src/Transform_inl.h: In function 'exec_ops':
../../third_party/skia/third_party/skcms/src/Transform_inl.h:159:20: internal compiler error: in store_constructor, at expr.c:6565
     *rgba = (*rgba & 0x00ff00ff00ff00ff) << 8
             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-6/README.Bugs> for instructions.
Preprocessed source stored into /tmp/ccLLjPon.out file, please attach this to your bugreport.

[1] https://buildd.debian.org/status/fetch.php?pkg=chromium-browser&arch=arm64&ver=68.0.3440.7-1&stamp=1528688783&raw=1
[2] https://buildd.debian.org/status/fetch.php?pkg=chromium-browser&arch=armhf&ver=68.0.3440.7-1&stamp=1528694705&raw=1
// === BEGIN GCC DUMP ===
// Target: arm-linux-gnueabihf
// Configured with: ../src/configure -v --with-pkgversion='Debian 6.4.0-17' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-as=/usr/bin/arm-linux-gnueabihf-as --with-ld=/usr/bin/arm-linux-gnueabihf-ld --program-suffix=-6 --program-prefix=arm-linux-gnueabihf- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
// Thread model: posix
// gcc version 6.4.0 20180424 (Debian 6.4.0-17) 
// 
// In file included from ../../third_party/skia/third_party/skcms/src/Transform.c:176:0:
// ../../third_party/skia/third_party/skcms/src/Transform_inl.h: In function 'exec_ops':
// ../../third_party/skia/third_party/skcms/src/Transform_inl.h:159:20: internal compiler error: in store_constructor, at expr.c:6565
//      *rgba = (*rgba & 0x00ff00ff00ff00ff) << 8
//              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
// Please submit a full bug report,
// with preprocessed source if appropriate.
// See <file:///usr/share/doc/gcc-6/README.Bugs> for instructions.

// /usr/lib/gcc/arm-linux-gnueabihf/6/cc1 -quiet -I ../.. -I gen -I ../../third_party/skia/third_party/skcms -imultilib . -imultiarch arm-linux-gnueabihf -MMD obj/skia/skcms/Transform.d -MF obj/skia/skcms/Transform.o.d -MQ obj/skia/skcms/Transform.o -D_REENTRANT -D V8_DEPRECATION_WARNINGS -D USE_UDEV -D USE_AURA=1 -D USE_GLIB=1 -D USE_NSS_CERTS=1 -D USE_X11=1 -D NO_TCMALLOC -D FULL_SAFE_BROWSING -D SAFE_BROWSING_CSD -D SAFE_BROWSING_DB_LOCAL -D CHROMIUM_BUILD -D _FILE_OFFSET_BITS=64 -D _LARGEFILE_SOURCE -D _LARGEFILE64_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D _FORTIFY_SOURCE=2 -D NDEBUG -D NVALGRIND -D DYNAMIC_ANNOTATIONS_ENABLED=0 -D __DATE__= -D __TIME__= -D __TIMESTAMP__= -D _FORTIFY_SOURCE=2 ../../third_party/skia/third_party/skcms/src/Transform.c -quiet -dumpbase Transform.c -march=armv7-a -mfloat-abi=hard -mtune=generic-armv7-a -mfpu=vfpv3-d16 -mthumb -mtls-dialect=gnu -auxbase-strip obj/skia/skcms/Transform.o -g0 -g -Os -O2 -Wno-builtin-macro-redefined -Wall -Wno-psabi -Wno-unused-local-typedefs -Wno-maybe-uninitialized -Wno-deprecated-declarations -Wno-comment -Wno-missing-field-initializers -Wno-unused-parameter -Wdate-time -Wformat=1 -Werror=format-security -w -std=c11 -std=gnu11 -fno-strict-aliasing -fstack-protector -funwind-tables -fPIC -fno-delete-null-pointer-checks -fno-ident -fdata-sections -ffunction-sections -fno-omit-frame-pointer -fvisibility=hidden -fdebug-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong --param ssp-buffer-size=4 -o - -frandom-seed=0 -fdump-noaddr

# 1 "../../third_party/skia/third_party/skcms/src/Transform.c"
# 1 "/<<PKGBUILDDIR>>/out/Release//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "../../third_party/skia/third_party/skcms/src/Transform.c"







# 1 "../../third_party/skia/third_party/skcms/src/../skcms.h" 1







       







# 1 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stdbool.h" 1 3 4
# 17 "../../third_party/skia/third_party/skcms/src/../skcms.h" 2
# 1 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h" 1 3 4
# 149 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h" 3 4

# 149 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h" 3 4
typedef int ptrdiff_t;
# 216 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h" 3 4
typedef unsigned int size_t;
# 328 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h" 3 4
typedef unsigned int wchar_t;
# 426 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h" 3 4
typedef struct {
  long long __max_align_ll __attribute__((__aligned__(__alignof__(long long))));
  long double __max_align_ld __attribute__((__aligned__(__alignof__(long double))));
} max_align_t;
# 18 "../../third_party/skia/third_party/skcms/src/../skcms.h" 2
# 1 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stdint.h" 1 3 4
# 9 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stdint.h" 3 4
# 1 "/usr/include/stdint.h" 1 3 4
# 26 "/usr/include/stdint.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/libc-header-start.h" 1 3 4
# 33 "/usr/include/arm-linux-gnueabihf/bits/libc-header-start.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 424 "/usr/include/features.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/sys/cdefs.h" 1 3 4
# 427 "/usr/include/arm-linux-gnueabihf/sys/cdefs.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/wordsize.h" 1 3 4
# 428 "/usr/include/arm-linux-gnueabihf/sys/cdefs.h" 2 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/long-double.h" 1 3 4
# 429 "/usr/include/arm-linux-gnueabihf/sys/cdefs.h" 2 3 4
# 425 "/usr/include/features.h" 2 3 4
# 448 "/usr/include/features.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/gnu/stubs.h" 1 3 4
# 10 "/usr/include/arm-linux-gnueabihf/gnu/stubs.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/gnu/stubs-hard.h" 1 3 4
# 11 "/usr/include/arm-linux-gnueabihf/gnu/stubs.h" 2 3 4
# 449 "/usr/include/features.h" 2 3 4
# 34 "/usr/include/arm-linux-gnueabihf/bits/libc-header-start.h" 2 3 4
# 27 "/usr/include/stdint.h" 2 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/types.h" 1 3 4
# 27 "/usr/include/arm-linux-gnueabihf/bits/types.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/wordsize.h" 1 3 4
# 28 "/usr/include/arm-linux-gnueabihf/bits/types.h" 2 3 4


typedef unsigned char __u_char;
typedef unsigned short int __u_short;
typedef unsigned int __u_int;
typedef unsigned long int __u_long;


typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;




__extension__ typedef signed long long int __int64_t;
__extension__ typedef unsigned long long int __uint64_t;







__extension__ typedef long long int __quad_t;
__extension__ typedef unsigned long long int __u_quad_t;







__extension__ typedef long long int __intmax_t;
__extension__ typedef unsigned long long int __uintmax_t;
# 130 "/usr/include/arm-linux-gnueabihf/bits/types.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/typesizes.h" 1 3 4
# 131 "/usr/include/arm-linux-gnueabihf/bits/types.h" 2 3 4


__extension__ typedef __u_quad_t __dev_t;
__extension__ typedef unsigned int __uid_t;
__extension__ typedef unsigned int __gid_t;
__extension__ typedef unsigned long int __ino_t;
__extension__ typedef __u_quad_t __ino64_t;
__extension__ typedef unsigned int __mode_t;
__extension__ typedef unsigned int __nlink_t;
__extension__ typedef long int __off_t;
__extension__ typedef __quad_t __off64_t;
__extension__ typedef int __pid_t;
__extension__ typedef struct { int __val[2]; } __fsid_t;
__extension__ typedef long int __clock_t;
__extension__ typedef unsigned long int __rlim_t;
__extension__ typedef __u_quad_t __rlim64_t;
__extension__ typedef unsigned int __id_t;
__extension__ typedef long int __time_t;
__extension__ typedef unsigned int __useconds_t;
__extension__ typedef long int __suseconds_t;

__extension__ typedef int __daddr_t;
__extension__ typedef int __key_t;


__extension__ typedef int __clockid_t;


__extension__ typedef void * __timer_t;


__extension__ typedef long int __blksize_t;




__extension__ typedef long int __blkcnt_t;
__extension__ typedef __quad_t __blkcnt64_t;


__extension__ typedef unsigned long int __fsblkcnt_t;
__extension__ typedef __u_quad_t __fsblkcnt64_t;


__extension__ typedef unsigned long int __fsfilcnt_t;
__extension__ typedef __u_quad_t __fsfilcnt64_t;


__extension__ typedef int __fsword_t;

__extension__ typedef int __ssize_t;


__extension__ typedef long int __syscall_slong_t;

__extension__ typedef unsigned long int __syscall_ulong_t;



typedef __off64_t __loff_t;
typedef char *__caddr_t;


__extension__ typedef int __intptr_t;


__extension__ typedef unsigned int __socklen_t;




typedef int __sig_atomic_t;
# 28 "/usr/include/stdint.h" 2 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/wchar.h" 1 3 4
# 29 "/usr/include/stdint.h" 2 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/wordsize.h" 1 3 4
# 30 "/usr/include/stdint.h" 2 3 4




# 1 "/usr/include/arm-linux-gnueabihf/bits/stdint-intn.h" 1 3 4
# 24 "/usr/include/arm-linux-gnueabihf/bits/stdint-intn.h" 3 4
typedef __int8_t int8_t;
typedef __int16_t int16_t;
typedef __int32_t int32_t;
typedef __int64_t int64_t;
# 35 "/usr/include/stdint.h" 2 3 4


# 1 "/usr/include/arm-linux-gnueabihf/bits/stdint-uintn.h" 1 3 4
# 24 "/usr/include/arm-linux-gnueabihf/bits/stdint-uintn.h" 3 4
typedef __uint8_t uint8_t;
typedef __uint16_t uint16_t;
typedef __uint32_t uint32_t;
typedef __uint64_t uint64_t;
# 38 "/usr/include/stdint.h" 2 3 4





typedef signed char int_least8_t;
typedef short int int_least16_t;
typedef int int_least32_t;



__extension__
typedef long long int int_least64_t;



typedef unsigned char uint_least8_t;
typedef unsigned short int uint_least16_t;
typedef unsigned int uint_least32_t;



__extension__
typedef unsigned long long int uint_least64_t;






typedef signed char int_fast8_t;





typedef int int_fast16_t;
typedef int int_fast32_t;
__extension__
typedef long long int int_fast64_t;



typedef unsigned char uint_fast8_t;





typedef unsigned int uint_fast16_t;
typedef unsigned int uint_fast32_t;
__extension__
typedef unsigned long long int uint_fast64_t;
# 103 "/usr/include/stdint.h" 3 4
typedef int intptr_t;


typedef unsigned int uintptr_t;




typedef __intmax_t intmax_t;
typedef __uintmax_t uintmax_t;
# 10 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stdint.h" 2 3 4
# 19 "../../third_party/skia/third_party/skcms/src/../skcms.h" 2
# 1 "/usr/include/string.h" 1 3 4
# 26 "/usr/include/string.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/libc-header-start.h" 1 3 4
# 27 "/usr/include/string.h" 2 3 4






# 1 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h" 1 3 4
# 34 "/usr/include/string.h" 2 3 4
# 42 "/usr/include/string.h" 3 4
extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
       size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));


extern void *memmove (void *__dest, const void *__src, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));





extern void *memccpy (void *__restrict __dest, const void *__restrict __src,
        int __c, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));




extern void *memset (void *__s, int __c, size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));


extern int memcmp (const void *__s1, const void *__s2, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 90 "/usr/include/string.h" 3 4
extern void *memchr (const void *__s, int __c, size_t __n)
      __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 121 "/usr/include/string.h" 3 4
extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));

extern char *strncpy (char *__restrict __dest,
        const char *__restrict __src, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));


extern char *strcat (char *__restrict __dest, const char *__restrict __src)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));

extern char *strncat (char *__restrict __dest, const char *__restrict __src,
        size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));


extern int strcmp (const char *__s1, const char *__s2)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));

extern int strncmp (const char *__s1, const char *__s2, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));


extern int strcoll (const char *__s1, const char *__s2)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));

extern size_t strxfrm (char *__restrict __dest,
         const char *__restrict __src, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));



# 1 "/usr/include/arm-linux-gnueabihf/bits/types/locale_t.h" 1 3 4
# 22 "/usr/include/arm-linux-gnueabihf/bits/types/locale_t.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/types/__locale_t.h" 1 3 4
# 28 "/usr/include/arm-linux-gnueabihf/bits/types/__locale_t.h" 3 4
struct __locale_struct
{

  struct __locale_data *__locales[13];


  const unsigned short int *__ctype_b;
  const int *__ctype_tolower;
  const int *__ctype_toupper;


  const char *__names[13];
};

typedef struct __locale_struct *__locale_t;
# 23 "/usr/include/arm-linux-gnueabihf/bits/types/locale_t.h" 2 3 4

typedef __locale_t locale_t;
# 153 "/usr/include/string.h" 2 3 4


extern int strcoll_l (const char *__s1, const char *__s2, locale_t __l)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3)));


extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n,
    locale_t __l) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 4)));





extern char *strdup (const char *__s)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1)));






extern char *strndup (const char *__string, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) __attribute__ ((__nonnull__ (1)));
# 225 "/usr/include/string.h" 3 4
extern char *strchr (const char *__s, int __c)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 252 "/usr/include/string.h" 3 4
extern char *strrchr (const char *__s, int __c)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 272 "/usr/include/string.h" 3 4
extern size_t strcspn (const char *__s, const char *__reject)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));


extern size_t strspn (const char *__s, const char *__accept)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 302 "/usr/include/string.h" 3 4
extern char *strpbrk (const char *__s, const char *__accept)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));
# 329 "/usr/include/string.h" 3 4
extern char *strstr (const char *__haystack, const char *__needle)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));




extern char *strtok (char *__restrict __s, const char *__restrict __delim)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2)));



extern char *__strtok_r (char *__restrict __s,
    const char *__restrict __delim,
    char **__restrict __save_ptr)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 3)));

extern char *strtok_r (char *__restrict __s, const char *__restrict __delim,
         char **__restrict __save_ptr)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 3)));
# 384 "/usr/include/string.h" 3 4
extern size_t strlen (const char *__s)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));




extern size_t strnlen (const char *__string, size_t __maxlen)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));




extern char *strerror (int __errnum) __attribute__ ((__nothrow__ , __leaf__));
# 409 "/usr/include/string.h" 3 4
extern int strerror_r (int __errnum, char *__buf, size_t __buflen) __asm__ ("" "__xpg_strerror_r") __attribute__ ((__nothrow__ , __leaf__))

                        __attribute__ ((__nonnull__ (2)));
# 427 "/usr/include/string.h" 3 4
extern char *strerror_l (int __errnum, locale_t __l) __attribute__ ((__nothrow__ , __leaf__));



# 1 "/usr/include/strings.h" 1 3 4
# 23 "/usr/include/strings.h" 3 4
# 1 "/usr/lib/gcc/arm-linux-gnueabihf/6/include/stddef.h" 1 3 4
# 24 "/usr/include/strings.h" 2 3 4










extern int bcmp (const void *__s1, const void *__s2, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));


extern void bcopy (const void *__src, void *__dest, size_t __n)
  __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));


extern void bzero (void *__s, size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
# 68 "/usr/include/strings.h" 3 4
extern char *index (const char *__s, int __c)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
# 96 "/usr/include/strings.h" 3 4
extern char *rindex (const char *__s, int __c)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));






extern int ffs (int __i) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));





extern int ffsl (long int __l) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));
__extension__ extern int ffsll (long long int __ll)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__const__));



extern int strcasecmp (const char *__s1, const char *__s2)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));


extern int strncasecmp (const char *__s1, const char *__s2, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2)));






extern int strcasecmp_l (const char *__s1, const char *__s2, locale_t __loc)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 3)));



extern int strncasecmp_l (const char *__s1, const char *__s2,
     size_t __n, locale_t __loc)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1, 2, 4)));








# 1 "/usr/include/arm-linux-gnueabihf/bits/strings_fortified.h" 1 3 4
# 22 "/usr/include/arm-linux-gnueabihf/bits/strings_fortified.h" 3 4
extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) void
__attribute__ ((__nothrow__ , __leaf__)) bcopy (const void *__src, void *__dest, size_t __len)
{
  (void) __builtin___memmove_chk (__dest, __src, __len, __builtin_object_size (__dest, 0));
}

extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) void
__attribute__ ((__nothrow__ , __leaf__)) bzero (void *__dest, size_t __len)
{
  (void) __builtin___memset_chk (__dest, '\0', __len, __builtin_object_size (__dest, 0));
}
# 145 "/usr/include/strings.h" 2 3 4
# 432 "/usr/include/string.h" 2 3 4



extern void explicit_bzero (void *__s, size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));



extern char *strsep (char **__restrict __stringp,
       const char *__restrict __delim)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));




extern char *strsignal (int __sig) __attribute__ ((__nothrow__ , __leaf__));


extern char *__stpcpy (char *__restrict __dest, const char *__restrict __src)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
extern char *stpcpy (char *__restrict __dest, const char *__restrict __src)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));



extern char *__stpncpy (char *__restrict __dest,
   const char *__restrict __src, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
extern char *stpncpy (char *__restrict __dest,
        const char *__restrict __src, size_t __n)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2)));
# 494 "/usr/include/string.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/string_fortified.h" 1 3 4
# 30 "/usr/include/arm-linux-gnueabihf/bits/string_fortified.h" 3 4
extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) void *
__attribute__ ((__nothrow__ , __leaf__)) memcpy (void *__restrict __dest, const void *__restrict __src, size_t __len)

{
  return __builtin___memcpy_chk (__dest, __src, __len, __builtin_object_size (__dest, 0));
}

extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) void *
__attribute__ ((__nothrow__ , __leaf__)) memmove (void *__dest, const void *__src, size_t __len)
{
  return __builtin___memmove_chk (__dest, __src, __len, __builtin_object_size (__dest, 0));
}
# 58 "/usr/include/arm-linux-gnueabihf/bits/string_fortified.h" 3 4
extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) void *
__attribute__ ((__nothrow__ , __leaf__)) memset (void *__dest, int __ch, size_t __len)
{
# 71 "/usr/include/arm-linux-gnueabihf/bits/string_fortified.h" 3 4
  return __builtin___memset_chk (__dest, __ch, __len, __builtin_object_size (__dest, 0));
}




void __explicit_bzero_chk (void *__dest, size_t __len, size_t __destlen)
  __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));

extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) void
__attribute__ ((__nothrow__ , __leaf__)) explicit_bzero (void *__dest, size_t __len)
{
  __explicit_bzero_chk (__dest, __len, __builtin_object_size (__dest, 0));
}


extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) char *
__attribute__ ((__nothrow__ , __leaf__)) strcpy (char *__restrict __dest, const char *__restrict __src)
{
  return __builtin___strcpy_chk (__dest, __src, __builtin_object_size (__dest, 2 > 1));
}
# 102 "/usr/include/arm-linux-gnueabihf/bits/string_fortified.h" 3 4
extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) char *
__attribute__ ((__nothrow__ , __leaf__)) strncpy (char *__restrict __dest, const char *__restrict __src, size_t __len)

{
  return __builtin___strncpy_chk (__dest, __src, __len, __builtin_object_size (__dest, 2 > 1));
}


extern char *__stpncpy_chk (char *__dest, const char *__src, size_t __n,
       size_t __destlen) __attribute__ ((__nothrow__ , __leaf__));
extern char *__stpncpy_alias (char *__dest, const char *__src, size_t __n) __asm__ ("" "stpncpy") __attribute__ ((__nothrow__ , __leaf__))
                                 ;

extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) char *
__attribute__ ((__nothrow__ , __leaf__)) stpncpy (char *__dest, const char *__src, size_t __n)
{
  if (__builtin_object_size (__dest, 2 > 1) != (size_t) -1
      && (!__builtin_constant_p (__n) || __n > __builtin_object_size (__dest, 2 > 1)))
    return __stpncpy_chk (__dest, __src, __n, __builtin_object_size (__dest, 2 > 1));
  return __stpncpy_alias (__dest, __src, __n);
}


extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) char *
__attribute__ ((__nothrow__ , __leaf__)) strcat (char *__restrict __dest, const char *__restrict __src)
{
  return __builtin___strcat_chk (__dest, __src, __builtin_object_size (__dest, 2 > 1));
}


extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) __attribute__ ((__artificial__)) char *
__attribute__ ((__nothrow__ , __leaf__)) strncat (char *__restrict __dest, const char *__restrict __src, size_t __len)

{
  return __builtin___strncat_chk (__dest, __src, __len, __builtin_object_size (__dest, 2 > 1));
}
# 495 "/usr/include/string.h" 2 3 4




# 20 "../../third_party/skia/third_party/skcms/src/../skcms.h" 2







# 26 "../../third_party/skia/third_party/skcms/src/../skcms.h"
typedef struct skcms_Matrix3x3 {
    float vals[3][3];
} skcms_Matrix3x3;


typedef struct skcms_Matrix3x4 {
    float vals[3][4];
} skcms_Matrix3x4;
# 42 "../../third_party/skia/third_party/skcms/src/../skcms.h"
typedef struct skcms_TransferFunction {
    float g, a,b,c,d,e,f;
} skcms_TransferFunction;


typedef union skcms_Curve {
    struct {
        uint32_t alias_of_table_entries;
        skcms_TransferFunction parametric;
    };
    struct {
        uint32_t table_entries;
        const uint8_t* table_8;
        const uint8_t* table_16;
    };
} skcms_Curve;

typedef struct skcms_A2B {



    uint32_t input_channels;
    skcms_Curve input_curves[4];
    uint8_t grid_points[4];
    const uint8_t* grid_8;
    const uint8_t* grid_16;




    uint32_t matrix_channels;
    skcms_Curve matrix_curves[3];
    skcms_Matrix3x4 matrix;


    uint32_t output_channels;
    skcms_Curve output_curves[3];
} skcms_A2B;

typedef struct skcms_ICCProfile {
    const uint8_t* buffer;

    uint32_t size;
    uint32_t data_color_space;
    uint32_t pcs;
    uint32_t tag_count;





    
# 93 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
   _Bool 
# 93 "../../third_party/skia/third_party/skcms/src/../skcms.h"
                          has_trc;
    skcms_Curve trc[3];



    
# 98 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
   _Bool 
# 98 "../../third_party/skia/third_party/skcms/src/../skcms.h"
                          has_toXYZD50;
    skcms_Matrix3x3 toXYZD50;



    
# 103 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
   _Bool 
# 103 "../../third_party/skia/third_party/skcms/src/../skcms.h"
                          has_A2B;
    skcms_A2B A2B;
} skcms_ICCProfile;


 const skcms_ICCProfile* skcms_sRGB_profile(void);

 const skcms_ICCProfile* skcms_XYZD50_profile(void);

 const skcms_TransferFunction* skcms_sRGB_TransferFunction(void);
 const skcms_TransferFunction* skcms_sRGB_Inverse_TransferFunction(void);
 const skcms_TransferFunction* skcms_Identity_TransferFunction(void);




 
# 119 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 119 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_ApproximatelyEqualProfiles(const skcms_ICCProfile* A,
                                                const skcms_ICCProfile* B);




 
# 125 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 125 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_AreApproximateInverses(const skcms_Curve* curve,
                                            const skcms_TransferFunction* inv_tf);




 
# 131 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 131 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_TRCs_AreApproximateInverse(const skcms_ICCProfile* profile,
                                                const skcms_TransferFunction* inv_tf);




 
# 137 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 137 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_Parse(const void*, size_t, skcms_ICCProfile*);


static inline void skcms_OptimizeForSpeed(skcms_ICCProfile* p) { (void)p; }

 
# 142 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 142 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_ApproximateCurve(const skcms_Curve* curve,
                                      skcms_TransferFunction* approx,
                                      float* max_error);

typedef struct skcms_ICCTag {
    uint32_t signature;
    uint32_t type;
    uint32_t size;
    const uint8_t* buf;
} skcms_ICCTag;

 void skcms_GetTagByIndex (const skcms_ICCProfile*, uint32_t idx, skcms_ICCTag*);
 
# 154 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 154 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_GetTagBySignature(const skcms_ICCProfile*, uint32_t sig, skcms_ICCTag*);


enum {

    skcms_Signature_CMYK = 0x434D594B,
    skcms_Signature_Gray = 0x47524159,
    skcms_Signature_RGB = 0x52474220,


    skcms_Signature_Lab = 0x4C616220,
    skcms_Signature_XYZ = 0x58595A20,
};

typedef enum skcms_PixelFormat {
    skcms_PixelFormat_RGB_565,
    skcms_PixelFormat_BGR_565,

    skcms_PixelFormat_RGB_888,
    skcms_PixelFormat_BGR_888,
    skcms_PixelFormat_RGBA_8888,
    skcms_PixelFormat_BGRA_8888,

    skcms_PixelFormat_RGBA_1010102,
    skcms_PixelFormat_BGRA_1010102,

    skcms_PixelFormat_RGB_161616,
    skcms_PixelFormat_BGR_161616,
    skcms_PixelFormat_RGBA_16161616,
    skcms_PixelFormat_BGRA_16161616,

    skcms_PixelFormat_RGB_hhh,
    skcms_PixelFormat_BGR_hhh,
    skcms_PixelFormat_RGBA_hhhh,
    skcms_PixelFormat_BGRA_hhhh,

    skcms_PixelFormat_RGB_fff,
    skcms_PixelFormat_BGR_fff,
    skcms_PixelFormat_RGBA_ffff,
    skcms_PixelFormat_BGRA_ffff,
} skcms_PixelFormat;
# 208 "../../third_party/skia/third_party/skcms/src/../skcms.h"
typedef enum skcms_AlphaFormat {
    skcms_AlphaFormat_Opaque,

    skcms_AlphaFormat_Unpremul,

    skcms_AlphaFormat_PremulAsEncoded,

    skcms_AlphaFormat_PremulLinear,

} skcms_AlphaFormat;



 
# 221 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 221 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_Transform(const void* src,
                               skcms_PixelFormat srcFmt,
                               skcms_AlphaFormat srcAlpha,
                               const skcms_ICCProfile* srcProfile,
                               void* dst,
                               skcms_PixelFormat dstFmt,
                               skcms_AlphaFormat dstAlpha,
                               const skcms_ICCProfile* dstProfile,
                               size_t npixels);




 
# 234 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 234 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_MakeUsableAsDestination(skcms_ICCProfile* profile);





 
# 240 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 240 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_MakeUsableAsDestinationWithSingleCurve(skcms_ICCProfile* profile);

 
# 242 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
         _Bool 
# 242 "../../third_party/skia/third_party/skcms/src/../skcms.h"
              skcms_PrimariesToXYZD50(float rx, float ry,
                                       float gx, float gy,
                                       float bx, float by,
                                       float wx, float wy,
                                       skcms_Matrix3x3* toXYZD50);


static inline void skcms_Init(skcms_ICCProfile* p) {
    memset(p, 0, sizeof(*p));
    p->data_color_space = skcms_Signature_RGB;
    p->pcs = skcms_Signature_XYZ;
}

static inline void skcms_SetTransferFunction(skcms_ICCProfile* p,
                                             const skcms_TransferFunction* tf) {
    p->has_trc = 
# 257 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
                1
# 257 "../../third_party/skia/third_party/skcms/src/../skcms.h"
                    ;
    for (int i = 0; i < 3; ++i) {
        p->trc[i].table_entries = 0;
        p->trc[i].parametric = *tf;
    }
}

static inline void skcms_SetXYZD50(skcms_ICCProfile* p, const skcms_Matrix3x3* m) {
    p->has_toXYZD50 = 
# 265 "../../third_party/skia/third_party/skcms/src/../skcms.h" 3 4
                     1
# 265 "../../third_party/skia/third_party/skcms/src/../skcms.h"
                         ;
    p->toXYZD50 = *m;
}
# 9 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 1 "../../third_party/skia/third_party/skcms/src/Curve.h" 1







       




float skcms_eval_curve(const skcms_Curve*, float x);

float skcms_MaxRoundtripError(const skcms_Curve* curve, const skcms_TransferFunction* inv_tf);
# 10 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 1 "../../third_party/skia/third_party/skcms/src/LinearAlgebra.h" 1







       



typedef struct { float vals[3]; } skcms_Vector3;



# 15 "../../third_party/skia/third_party/skcms/src/LinearAlgebra.h" 3 4
_Bool 
# 15 "../../third_party/skia/third_party/skcms/src/LinearAlgebra.h"
    skcms_Matrix3x3_invert(const skcms_Matrix3x3*, skcms_Matrix3x3*);
skcms_Matrix3x3 skcms_Matrix3x3_concat(const skcms_Matrix3x3* A, const skcms_Matrix3x3* B);

skcms_Vector3 skcms_MV_mul(const skcms_Matrix3x3*, const skcms_Vector3*);
# 11 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 1 "../../third_party/skia/third_party/skcms/src/Macros.h" 1







       
# 12 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 1 "../../third_party/skia/third_party/skcms/src/PortableMath.h" 1







       

static const union {
    uint32_t bits;
    float f;
} inf_ = { 0x7f800000 };



static inline float floorf_(float x) {
    float roundtrip = (float)((int)x);
    return roundtrip > x ? roundtrip - 1 : roundtrip;
}

static inline float fmaxf_(float x, float y) { return x > y ? x : y; }
static inline float fminf_(float x, float y) { return x < y ? x : y; }
static inline float fabsf_(float x) { return x < 0 ? -x : x; }

float log2f_(float);
float exp2f_(float);
float powf_(float, float);

static inline 
# 30 "../../third_party/skia/third_party/skcms/src/PortableMath.h" 3 4
             _Bool 
# 30 "../../third_party/skia/third_party/skcms/src/PortableMath.h"
                  isfinitef_(float x) { return 0 == x*0; }
# 13 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 1 "../../third_party/skia/third_party/skcms/src/TransferFunction.h" 1







       






# 14 "../../third_party/skia/third_party/skcms/src/TransferFunction.h" 3 4
_Bool 
# 14 "../../third_party/skia/third_party/skcms/src/TransferFunction.h"
    skcms_TransferFunction_isValid(const skcms_TransferFunction*);

float skcms_TransferFunction_eval(const skcms_TransferFunction*, float);


# 18 "../../third_party/skia/third_party/skcms/src/TransferFunction.h" 3 4
_Bool 
# 18 "../../third_party/skia/third_party/skcms/src/TransferFunction.h"
    skcms_TransferFunction_invert(const skcms_TransferFunction*, skcms_TransferFunction*);



int skcms_fit_linear(const skcms_Curve*, int N, float tol, float* c, float* d, float* f);
# 14 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 1 "../../third_party/skia/third_party/skcms/src/Transform.h" 1
# 10 "../../third_party/skia/third_party/skcms/src/Transform.h"
       
# 60 "../../third_party/skia/third_party/skcms/src/Transform.h"
typedef enum {

    Op_noop, Op_load_565, Op_load_888, Op_load_8888, Op_load_1010102, Op_load_161616, Op_load_16161616, Op_load_hhh, Op_load_hhhh, Op_load_fff, Op_load_ffff, Op_swap_rb, Op_clamp, Op_invert, Op_force_opaque, Op_premul, Op_unpremul, Op_matrix_3x3, Op_matrix_3x4, Op_lab_to_xyz, Op_tf_r, Op_tf_g, Op_tf_b, Op_tf_a, Op_table_8_r, Op_table_8_g, Op_table_8_b, Op_table_8_a, Op_table_16_r, Op_table_16_g, Op_table_16_b, Op_table_16_a, Op_clut_3D_8, Op_clut_3D_16, Op_clut_4D_8, Op_clut_4D_16, Op_store_565, Op_store_888, Op_store_8888, Op_store_1010102, Op_store_161616, Op_store_16161616, Op_store_hhh, Op_store_hhhh, Op_store_fff, Op_store_ffff,

} Op;
# 15 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 1 "/usr/include/assert.h" 1 3 4
# 16 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 1 "/usr/lib/gcc/arm-linux-gnueabihf/6/include-fixed/limits.h" 1 3 4
# 34 "/usr/lib/gcc/arm-linux-gnueabihf/6/include-fixed/limits.h" 3 4
# 1 "/usr/lib/gcc/arm-linux-gnueabihf/6/include-fixed/syslimits.h" 1 3 4






# 1 "/usr/lib/gcc/arm-linux-gnueabihf/6/include-fixed/limits.h" 1 3 4
# 168 "/usr/lib/gcc/arm-linux-gnueabihf/6/include-fixed/limits.h" 3 4
# 1 "/usr/include/limits.h" 1 3 4
# 26 "/usr/include/limits.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/libc-header-start.h" 1 3 4
# 27 "/usr/include/limits.h" 2 3 4
# 183 "/usr/include/limits.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/posix1_lim.h" 1 3 4
# 160 "/usr/include/arm-linux-gnueabihf/bits/posix1_lim.h" 3 4
# 1 "/usr/include/arm-linux-gnueabihf/bits/local_lim.h" 1 3 4
# 38 "/usr/include/arm-linux-gnueabihf/bits/local_lim.h" 3 4
# 1 "/usr/include/linux/limits.h" 1 3 4
# 39 "/usr/include/arm-linux-gnueabihf/bits/local_lim.h" 2 3 4
# 161 "/usr/include/arm-linux-gnueabihf/bits/posix1_lim.h" 2 3 4
# 184 "/usr/include/limits.h" 2 3 4



# 1 "/usr/include/arm-linux-gnueabihf/bits/posix2_lim.h" 1 3 4
# 188 "/usr/include/limits.h" 2 3 4
# 169 "/usr/lib/gcc/arm-linux-gnueabihf/6/include-fixed/limits.h" 2 3 4
# 8 "/usr/lib/gcc/arm-linux-gnueabihf/6/include-fixed/syslimits.h" 2 3 4
# 35 "/usr/lib/gcc/arm-linux-gnueabihf/6/include-fixed/limits.h" 2 3 4
# 17 "../../third_party/skia/third_party/skcms/src/Transform.c" 2



extern 
# 20 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
      _Bool 
# 20 "../../third_party/skia/third_party/skcms/src/Transform.c"
           g_skcms_dump_profile;

# 21 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
_Bool 
# 21 "../../third_party/skia/third_party/skcms/src/Transform.c"
    g_skcms_dump_profile = 
# 21 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                           0
# 21 "../../third_party/skia/third_party/skcms/src/Transform.c"
                                ;
# 71 "../../third_party/skia/third_party/skcms/src/Transform.c"
    static inline Op profile_next_op(Op op) {
        (void)g_skcms_dump_profile;
        return op;
    }
# 99 "../../third_party/skia/third_party/skcms/src/Transform.c"
    typedef float __attribute__((vector_size(16))) Fx4;
    typedef int32_t __attribute__((vector_size(16))) I32x4;
    typedef uint64_t __attribute__((vector_size(32))) U64x4;
    typedef uint32_t __attribute__((vector_size(16))) U32x4;
    typedef uint16_t __attribute__((vector_size( 8))) U16x4;
    typedef uint8_t __attribute__((vector_size( 4))) U8x4;

    typedef float __attribute__((vector_size(32))) Fx8;
    typedef int32_t __attribute__((vector_size(32))) I32x8;
    typedef uint64_t __attribute__((vector_size(64))) U64x8;
    typedef uint32_t __attribute__((vector_size(32))) U32x8;
    typedef uint16_t __attribute__((vector_size(16))) U16x8;
    typedef uint8_t __attribute__((vector_size( 8))) U8x8;

    typedef float __attribute__((vector_size( 64))) Fx16;
    typedef int32_t __attribute__((vector_size( 64))) I32x16;
    typedef uint64_t __attribute__((vector_size(128))) U64x16;
    typedef uint32_t __attribute__((vector_size( 64))) U32x16;
    typedef uint16_t __attribute__((vector_size( 32))) U16x16;
    typedef uint8_t __attribute__((vector_size( 16))) U8x16;
# 176 "../../third_party/skia/third_party/skcms/src/Transform.c"
# 1 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 1
# 88 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
static inline __attribute__((always_inline)) I32x4 to_fixed_(Fx4 f) { return (I32x4){(f + 0.5f)[0],(f + 0.5f)[1],(f + 0.5f)[2],(f + 0.5f)[3]}; }
# 117 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
    static inline __attribute__((always_inline)) Fx4 F_from_Half_(U16x4 half) {
        U32x4 wide = (U32x4){(half)[0],(half)[1],(half)[2],(half)[3]};

        U32x4 s = wide & 0x8000,
            em = wide ^ s;


        U32x4 norm_bits = (s<<16) + (em<<13) + ((127-15)<<23);
        Fx4 norm;
        __builtin_memcpy(&norm, &norm_bits, sizeof(norm));


        return (Fx4)( ((em < 0x0400) & (I32x4)((Fx4){0,0,0,0})) | (~(em < 0x0400) & (I32x4)(norm)) );
    }

    static inline __attribute__((always_inline)) U16x4 Half_from_F_(Fx4 f) {

        U32x4 sem;
        __builtin_memcpy(&sem, &f, sizeof(sem));

        U32x4 s = sem & 0x80000000,
            em = sem ^ s;


        return (U16x4){((U32x4)( ((em < 0x38800000) & (I32x4)((U32x4)(Fx4){0,0,0,0})) | (~(em < 0x38800000) & (I32x4)((s>>16) + (em>>13) - ((127-15)<<10))) ))[0],((U32x4)( ((em < 0x38800000) & (I32x4)((U32x4)(Fx4){0,0,0,0})) | (~(em < 0x38800000) & (I32x4)((s>>16) + (em>>13) - ((127-15)<<10))) ))[1],((U32x4)( ((em < 0x38800000) & (I32x4)((U32x4)(Fx4){0,0,0,0})) | (~(em < 0x38800000) & (I32x4)((s>>16) + (em>>13) - ((127-15)<<10))) ))[2],((U32x4)( ((em < 0x38800000) & (I32x4)((U32x4)(Fx4){0,0,0,0})) | (~(em < 0x38800000) & (I32x4)((s>>16) + (em>>13) - ((127-15)<<10))) ))[3]}
                                                                                                 ;
    }
# 158 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
static inline __attribute__((always_inline)) void swap_endian_16x4_(U64x4* rgba) {
    *rgba = (*rgba & 0x00ff00ff00ff00ff) << 8
          | (*rgba & 0xff00ff00ff00ff00) >> 8;
}






    static inline __attribute__((always_inline)) Fx4 min__(Fx4 x, Fx4 y) { return (Fx4)( ((x > y) & (I32x4)(y)) | (~(x > y) & (I32x4)(x)) ); }
    static inline __attribute__((always_inline)) Fx4 max__(Fx4 x, Fx4 y) { return (Fx4)( ((x < y) & (I32x4)(y)) | (~(x < y) & (I32x4)(x)) ); }





static inline __attribute__((always_inline)) Fx4 floor__(Fx4 x) {
# 188 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
    Fx4 roundtrip = (Fx4){((I32x4){(x)[0],(x)[1],(x)[2],(x)[3]})[0],((I32x4){(x)[0],(x)[1],(x)[2],(x)[3]})[1],((I32x4){(x)[0],(x)[1],(x)[2],(x)[3]})[2],((I32x4){(x)[0],(x)[1],(x)[2],(x)[3]})[3]};

    return roundtrip - (Fx4)( ((roundtrip > x) & (I32x4)((Fx4){1,1,1,1})) | (~(roundtrip > x) & (I32x4)((Fx4){0,0,0,0})) );




}


static inline __attribute__((always_inline)) Fx4 approx_log2_(Fx4 x) {

    I32x4 bits;
    __builtin_memcpy(&bits, &x, sizeof(bits));

    Fx4 e = (Fx4){(bits)[0],(bits)[1],(bits)[2],(bits)[3]} * (1.0f / (1<<23));


    I32x4 m_bits = (bits & 0x007fffff) | 0x3f000000;
    Fx4 m;
    __builtin_memcpy(&m, &m_bits, sizeof(m));

    return e - 124.225514990f
             - 1.498030302f*m
             - 1.725879990f/(0.3520887068f + m);
}


static inline __attribute__((always_inline)) Fx4 approx_exp2_(Fx4 x) {
    Fx4 fract = x - floor__(x);

    I32x4 bits = (I32x4){((1.0f * (1<<23)) * (x + 121.274057500f - 1.490129070f*fract + 27.728023300f/(4.84252568f - fract)))[0],((1.0f * (1<<23)) * (x + 121.274057500f - 1.490129070f*fract + 27.728023300f/(4.84252568f - fract)))[1],((1.0f * (1<<23)) * (x + 121.274057500f - 1.490129070f*fract + 27.728023300f/(4.84252568f - fract)))[2],((1.0f * (1<<23)) * (x + 121.274057500f - 1.490129070f*fract + 27.728023300f/(4.84252568f - fract)))[3]}

                                                                                       ;
    __builtin_memcpy(&x, &bits, sizeof(x));
    return x;
}


static inline __attribute__((always_inline)) Fx4 approx_pow_(Fx4 x, float y) {
# 237 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
    return (Fx4)( (((x == (Fx4){0,0,0,0}) | (x == (Fx4){1,1,1,1})) & (I32x4)(x)) | (~((x == (Fx4){0,0,0,0}) | (x == (Fx4){1,1,1,1})) & (I32x4)(approx_exp2_(approx_log2_(x) * y))) )
                                                                                  ;

}



static inline __attribute__((always_inline)) Fx4 apply_transfer_function_(const skcms_TransferFunction* tf, Fx4 x) {
    Fx4 sign = (Fx4)( ((x < 0) & (I32x4)(-(Fx4){1,1,1,1})) | (~(x < 0) & (I32x4)((Fx4){1,1,1,1})) );
    x *= sign;

    Fx4 linear = tf->c*x + tf->f;
    Fx4 nonlinear = approx_pow_(tf->a*x + tf->b, tf->g) + tf->e;

    return sign * (Fx4)( ((x < tf->d) & (I32x4)(linear)) | (~(x < tf->d) & (I32x4)(nonlinear)) );
}
# 298 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
static inline __attribute__((always_inline)) U8x4 gather_8_(const uint8_t* p, I32x4 ix) {



    U8x4 v = { p[ix[0]], p[ix[1]], p[ix[2]], p[ix[3]] };
# 312 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
    return v;
}



static inline __attribute__((always_inline)) uint16_t load_16_(const uint8_t* p, int ix) {
    uint16_t v;
    __builtin_memcpy(&v, p + 2*ix, 2);
    return v;
}


static inline __attribute__((always_inline)) U16x4 gather_16_(const uint8_t* p, I32x4 ix) {



    U16x4 v = { load_16_(p,ix[0]), load_16_(p,ix[1]), load_16_(p,ix[2]), load_16_(p,ix[3]) };
# 338 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
    return v;
}




    static inline __attribute__((always_inline)) uint32_t load_24_32_(const uint8_t* p, int ix) {
        uint32_t v;
        __builtin_memcpy(&v, p + 3*ix, 4);
        return v;
    }
    static inline __attribute__((always_inline)) uint64_t load_48_64_(const uint8_t* p, int ix) {
        uint64_t v;
        __builtin_memcpy(&v, p + 6*ix, 8);
        return v;
    }




static inline __attribute__((always_inline)) U32x4 gather_24_(const uint8_t* p, I32x4 ix) {


    p -= 1;





    U32x4 v = { load_24_32_(p,ix[0]), load_24_32_(p,ix[1]), load_24_32_(p,ix[2]), load_24_32_(p,ix[3]) };
# 392 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
    return v >> 8;
}
# 451 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
static inline __attribute__((always_inline)) Fx4 F_from_U8_(U8x4 v) {
    return (Fx4){(v)[0],(v)[1],(v)[2],(v)[3]} * (1/255.0f);
}


static inline __attribute__((always_inline)) Fx4 F_from_U16_BE_(U16x4 v) {


    v = (U16x4)( ((v<<8)|(v>>8)) & 0xffff );
    return (Fx4){(v)[0],(v)[1],(v)[2],(v)[3]} * (1/65535.0f);
}


static inline __attribute__((always_inline)) Fx4 minus_1_ulp_(Fx4 v) {
    I32x4 bits;
    __builtin_memcpy(&bits, &v, sizeof(bits));
    bits = bits - 1;
    __builtin_memcpy(&v, &bits, sizeof(bits));
    return v;
}


static inline __attribute__((always_inline)) Fx4 table_8_(const skcms_Curve* curve, Fx4 v) {

    Fx4 ix = max__((Fx4){0,0,0,0}, min__(v, (Fx4){1,1,1,1})) * (float)(curve->table_entries - 1);


    I32x4 lo = (I32x4){(ix)[0],(ix)[1],(ix)[2],(ix)[3]},
        hi = (I32x4){(minus_1_ulp_(ix+1.0f))[0],(minus_1_ulp_(ix+1.0f))[1],(minus_1_ulp_(ix+1.0f))[2],(minus_1_ulp_(ix+1.0f))[3]};
    Fx4 t = ix - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]};





    Fx4 l = F_from_U8_(gather_8_(curve->table_8, lo)),
      h = F_from_U8_(gather_8_(curve->table_8, hi));
    return l + (h-l)*t;
}

static inline __attribute__((always_inline)) Fx4 table_16_(const skcms_Curve* curve, Fx4 v) {

    Fx4 ix = max__((Fx4){0,0,0,0}, min__(v, (Fx4){1,1,1,1})) * (float)(curve->table_entries - 1);

    I32x4 lo = (I32x4){(ix)[0],(ix)[1],(ix)[2],(ix)[3]},
        hi = (I32x4){(minus_1_ulp_(ix+1.0f))[0],(minus_1_ulp_(ix+1.0f))[1],(minus_1_ulp_(ix+1.0f))[2],(minus_1_ulp_(ix+1.0f))[3]};
    Fx4 t = ix - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]};



    Fx4 l = F_from_U16_BE_(gather_16_(curve->table_16, lo)),
      h = F_from_U16_BE_(gather_16_(curve->table_16, hi));
    return l + (h-l)*t;
}


static inline __attribute__((always_inline)) void clut_0_8_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) {
    U32x4 rgb = gather_24_(a2b->grid_8, ix);

    *r = (Fx4){((rgb >> 0) & 0xff)[0],((rgb >> 0) & 0xff)[1],((rgb >> 0) & 0xff)[2],((rgb >> 0) & 0xff)[3]} * (1/255.0f);
    *g = (Fx4){((rgb >> 8) & 0xff)[0],((rgb >> 8) & 0xff)[1],((rgb >> 8) & 0xff)[2],((rgb >> 8) & 0xff)[3]} * (1/255.0f);
    *b = (Fx4){((rgb >> 16) & 0xff)[0],((rgb >> 16) & 0xff)[1],((rgb >> 16) & 0xff)[2],((rgb >> 16) & 0xff)[3]} * (1/255.0f);

    (void)a;
    (void)stride;
}
static inline __attribute__((always_inline)) void clut_0_16_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) {


        *r = F_from_U16_BE_(gather_16_(a2b->grid_16, 3*ix+0));
        *g = F_from_U16_BE_(gather_16_(a2b->grid_16, 3*ix+1));
        *b = F_from_U16_BE_(gather_16_(a2b->grid_16, 3*ix+2));
# 533 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
    (void)a;
    (void)stride;
}
# 571 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
static inline void clut_1_8_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) { I32x4 limit = (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]}; limit += a2b->grid_points[1 -1]; const Fx4* srcs[] = { r,g,b,&a }; Fx4 src = *srcs[1 -1]; Fx4 x = max__((Fx4){0,0,0,0}, min__(src, (Fx4){1,1,1,1})) * (Fx4){(limit - 1)[0],(limit - 1)[1],(limit - 1)[2],(limit - 1)[3]}; I32x4 lo = (I32x4){(x)[0],(x)[1],(x)[2],(x)[3]}, hi = (I32x4){(minus_1_ulp_(x+1.0f))[0],(minus_1_ulp_(x+1.0f))[1],(minus_1_ulp_(x+1.0f))[2],(minus_1_ulp_(x+1.0f))[3]}; Fx4 lr = *r, lg = *g, lb = *b, hr = *r, hg = *g, hb = *b; clut_0_8_(a2b, stride*lo + ix, stride*limit, &lr,&lg,&lb,a); clut_0_8_(a2b, stride*hi + ix, stride*limit, &hr,&hg,&hb,a); Fx4 t = x - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]}; *r = lr + (hr-lr)*t; *g = lg + (hg-lg)*t; *b = lb + (hb-lb)*t; }
static inline void clut_2_8_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) { I32x4 limit = (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]}; limit += a2b->grid_points[2 -1]; const Fx4* srcs[] = { r,g,b,&a }; Fx4 src = *srcs[2 -1]; Fx4 x = max__((Fx4){0,0,0,0}, min__(src, (Fx4){1,1,1,1})) * (Fx4){(limit - 1)[0],(limit - 1)[1],(limit - 1)[2],(limit - 1)[3]}; I32x4 lo = (I32x4){(x)[0],(x)[1],(x)[2],(x)[3]}, hi = (I32x4){(minus_1_ulp_(x+1.0f))[0],(minus_1_ulp_(x+1.0f))[1],(minus_1_ulp_(x+1.0f))[2],(minus_1_ulp_(x+1.0f))[3]}; Fx4 lr = *r, lg = *g, lb = *b, hr = *r, hg = *g, hb = *b; clut_1_8_(a2b, stride*lo + ix, stride*limit, &lr,&lg,&lb,a); clut_1_8_(a2b, stride*hi + ix, stride*limit, &hr,&hg,&hb,a); Fx4 t = x - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]}; *r = lr + (hr-lr)*t; *g = lg + (hg-lg)*t; *b = lb + (hb-lb)*t; }
static inline void clut_3_8_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) { I32x4 limit = (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]}; limit += a2b->grid_points[3 -1]; const Fx4* srcs[] = { r,g,b,&a }; Fx4 src = *srcs[3 -1]; Fx4 x = max__((Fx4){0,0,0,0}, min__(src, (Fx4){1,1,1,1})) * (Fx4){(limit - 1)[0],(limit - 1)[1],(limit - 1)[2],(limit - 1)[3]}; I32x4 lo = (I32x4){(x)[0],(x)[1],(x)[2],(x)[3]}, hi = (I32x4){(minus_1_ulp_(x+1.0f))[0],(minus_1_ulp_(x+1.0f))[1],(minus_1_ulp_(x+1.0f))[2],(minus_1_ulp_(x+1.0f))[3]}; Fx4 lr = *r, lg = *g, lb = *b, hr = *r, hg = *g, hb = *b; clut_2_8_(a2b, stride*lo + ix, stride*limit, &lr,&lg,&lb,a); clut_2_8_(a2b, stride*hi + ix, stride*limit, &hr,&hg,&hb,a); Fx4 t = x - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]}; *r = lr + (hr-lr)*t; *g = lg + (hg-lg)*t; *b = lb + (hb-lb)*t; }
static inline void clut_4_8_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) { I32x4 limit = (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]}; limit += a2b->grid_points[4 -1]; const Fx4* srcs[] = { r,g,b,&a }; Fx4 src = *srcs[4 -1]; Fx4 x = max__((Fx4){0,0,0,0}, min__(src, (Fx4){1,1,1,1})) * (Fx4){(limit - 1)[0],(limit - 1)[1],(limit - 1)[2],(limit - 1)[3]}; I32x4 lo = (I32x4){(x)[0],(x)[1],(x)[2],(x)[3]}, hi = (I32x4){(minus_1_ulp_(x+1.0f))[0],(minus_1_ulp_(x+1.0f))[1],(minus_1_ulp_(x+1.0f))[2],(minus_1_ulp_(x+1.0f))[3]}; Fx4 lr = *r, lg = *g, lb = *b, hr = *r, hg = *g, hb = *b; clut_3_8_(a2b, stride*lo + ix, stride*limit, &lr,&lg,&lb,a); clut_3_8_(a2b, stride*hi + ix, stride*limit, &hr,&hg,&hb,a); Fx4 t = x - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]}; *r = lr + (hr-lr)*t; *g = lg + (hg-lg)*t; *b = lb + (hb-lb)*t; }

static inline void clut_1_16_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) { I32x4 limit = (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]}; limit += a2b->grid_points[1 -1]; const Fx4* srcs[] = { r,g,b,&a }; Fx4 src = *srcs[1 -1]; Fx4 x = max__((Fx4){0,0,0,0}, min__(src, (Fx4){1,1,1,1})) * (Fx4){(limit - 1)[0],(limit - 1)[1],(limit - 1)[2],(limit - 1)[3]}; I32x4 lo = (I32x4){(x)[0],(x)[1],(x)[2],(x)[3]}, hi = (I32x4){(minus_1_ulp_(x+1.0f))[0],(minus_1_ulp_(x+1.0f))[1],(minus_1_ulp_(x+1.0f))[2],(minus_1_ulp_(x+1.0f))[3]}; Fx4 lr = *r, lg = *g, lb = *b, hr = *r, hg = *g, hb = *b; clut_0_16_(a2b, stride*lo + ix, stride*limit, &lr,&lg,&lb,a); clut_0_16_(a2b, stride*hi + ix, stride*limit, &hr,&hg,&hb,a); Fx4 t = x - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]}; *r = lr + (hr-lr)*t; *g = lg + (hg-lg)*t; *b = lb + (hb-lb)*t; }
static inline void clut_2_16_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) { I32x4 limit = (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]}; limit += a2b->grid_points[2 -1]; const Fx4* srcs[] = { r,g,b,&a }; Fx4 src = *srcs[2 -1]; Fx4 x = max__((Fx4){0,0,0,0}, min__(src, (Fx4){1,1,1,1})) * (Fx4){(limit - 1)[0],(limit - 1)[1],(limit - 1)[2],(limit - 1)[3]}; I32x4 lo = (I32x4){(x)[0],(x)[1],(x)[2],(x)[3]}, hi = (I32x4){(minus_1_ulp_(x+1.0f))[0],(minus_1_ulp_(x+1.0f))[1],(minus_1_ulp_(x+1.0f))[2],(minus_1_ulp_(x+1.0f))[3]}; Fx4 lr = *r, lg = *g, lb = *b, hr = *r, hg = *g, hb = *b; clut_1_16_(a2b, stride*lo + ix, stride*limit, &lr,&lg,&lb,a); clut_1_16_(a2b, stride*hi + ix, stride*limit, &hr,&hg,&hb,a); Fx4 t = x - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]}; *r = lr + (hr-lr)*t; *g = lg + (hg-lg)*t; *b = lb + (hb-lb)*t; }
static inline void clut_3_16_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) { I32x4 limit = (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]}; limit += a2b->grid_points[3 -1]; const Fx4* srcs[] = { r,g,b,&a }; Fx4 src = *srcs[3 -1]; Fx4 x = max__((Fx4){0,0,0,0}, min__(src, (Fx4){1,1,1,1})) * (Fx4){(limit - 1)[0],(limit - 1)[1],(limit - 1)[2],(limit - 1)[3]}; I32x4 lo = (I32x4){(x)[0],(x)[1],(x)[2],(x)[3]}, hi = (I32x4){(minus_1_ulp_(x+1.0f))[0],(minus_1_ulp_(x+1.0f))[1],(minus_1_ulp_(x+1.0f))[2],(minus_1_ulp_(x+1.0f))[3]}; Fx4 lr = *r, lg = *g, lb = *b, hr = *r, hg = *g, hb = *b; clut_2_16_(a2b, stride*lo + ix, stride*limit, &lr,&lg,&lb,a); clut_2_16_(a2b, stride*hi + ix, stride*limit, &hr,&hg,&hb,a); Fx4 t = x - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]}; *r = lr + (hr-lr)*t; *g = lg + (hg-lg)*t; *b = lb + (hb-lb)*t; }
static inline void clut_4_16_(const skcms_A2B* a2b, I32x4 ix, I32x4 stride, Fx4* r, Fx4* g, Fx4* b, Fx4 a) { I32x4 limit = (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]}; limit += a2b->grid_points[4 -1]; const Fx4* srcs[] = { r,g,b,&a }; Fx4 src = *srcs[4 -1]; Fx4 x = max__((Fx4){0,0,0,0}, min__(src, (Fx4){1,1,1,1})) * (Fx4){(limit - 1)[0],(limit - 1)[1],(limit - 1)[2],(limit - 1)[3]}; I32x4 lo = (I32x4){(x)[0],(x)[1],(x)[2],(x)[3]}, hi = (I32x4){(minus_1_ulp_(x+1.0f))[0],(minus_1_ulp_(x+1.0f))[1],(minus_1_ulp_(x+1.0f))[2],(minus_1_ulp_(x+1.0f))[3]}; Fx4 lr = *r, lg = *g, lb = *b, hr = *r, hg = *g, hb = *b; clut_3_16_(a2b, stride*lo + ix, stride*limit, &lr,&lg,&lb,a); clut_3_16_(a2b, stride*hi + ix, stride*limit, &hr,&hg,&hb,a); Fx4 t = x - (Fx4){(lo)[0],(lo)[1],(lo)[2],(lo)[3]}; *r = lr + (hr-lr)*t; *g = lg + (hg-lg)*t; *b = lb + (hb-lb)*t; }


static void exec_ops(const Op* ops, const void** args,
                         const char* src, char* dst, int i) {
    Fx4 r = (Fx4){0,0,0,0}, g = (Fx4){0,0,0,0}, b = (Fx4){0,0,0,0}, a = (Fx4){0,0,0,0};
    while (
# 585 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
          1
# 585 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
              ) {
        switch (profile_next_op(*ops++)) {
            case Op_noop: break;

            case Op_load_565:{
                U16x4 rgb;
                __builtin_memcpy(&rgb, src + 2*i, 2*4);

                r = (Fx4){(rgb & (31<< 0))[0],(rgb & (31<< 0))[1],(rgb & (31<< 0))[2],(rgb & (31<< 0))[3]} * (1.0f / (31<< 0));
                g = (Fx4){(rgb & (63<< 5))[0],(rgb & (63<< 5))[1],(rgb & (63<< 5))[2],(rgb & (63<< 5))[3]} * (1.0f / (63<< 5));
                b = (Fx4){(rgb & (31<<11))[0],(rgb & (31<<11))[1],(rgb & (31<<11))[2],(rgb & (31<<11))[3]} * (1.0f / (31<<11));
                a = (Fx4){1,1,1,1};
            } break;

            case Op_load_888:{
                const uint8_t* rgb = (const uint8_t*)(src + 3*i);
# 618 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                r = (Fx4){((U32x4){(rgb+0)[0], (rgb+0)[3], (rgb+0)[6], (rgb+0)[ 9]})[0],((U32x4){(rgb+0)[0], (rgb+0)[3], (rgb+0)[6], (rgb+0)[ 9]})[1],((U32x4){(rgb+0)[0], (rgb+0)[3], (rgb+0)[6], (rgb+0)[ 9]})[2],((U32x4){(rgb+0)[0], (rgb+0)[3], (rgb+0)[6], (rgb+0)[ 9]})[3]} * (1/255.0f);
                g = (Fx4){((U32x4){(rgb+1)[0], (rgb+1)[3], (rgb+1)[6], (rgb+1)[ 9]})[0],((U32x4){(rgb+1)[0], (rgb+1)[3], (rgb+1)[6], (rgb+1)[ 9]})[1],((U32x4){(rgb+1)[0], (rgb+1)[3], (rgb+1)[6], (rgb+1)[ 9]})[2],((U32x4){(rgb+1)[0], (rgb+1)[3], (rgb+1)[6], (rgb+1)[ 9]})[3]} * (1/255.0f);
                b = (Fx4){((U32x4){(rgb+2)[0], (rgb+2)[3], (rgb+2)[6], (rgb+2)[ 9]})[0],((U32x4){(rgb+2)[0], (rgb+2)[3], (rgb+2)[6], (rgb+2)[ 9]})[1],((U32x4){(rgb+2)[0], (rgb+2)[3], (rgb+2)[6], (rgb+2)[ 9]})[2],((U32x4){(rgb+2)[0], (rgb+2)[3], (rgb+2)[6], (rgb+2)[ 9]})[3]} * (1/255.0f);

                a = (Fx4){1,1,1,1};
            } break;

            case Op_load_8888:{
                U32x4 rgba;
                __builtin_memcpy(&rgba, src + 4*i, 4*4);

                r = (Fx4){((rgba >> 0) & 0xff)[0],((rgba >> 0) & 0xff)[1],((rgba >> 0) & 0xff)[2],((rgba >> 0) & 0xff)[3]} * (1/255.0f);
                g = (Fx4){((rgba >> 8) & 0xff)[0],((rgba >> 8) & 0xff)[1],((rgba >> 8) & 0xff)[2],((rgba >> 8) & 0xff)[3]} * (1/255.0f);
                b = (Fx4){((rgba >> 16) & 0xff)[0],((rgba >> 16) & 0xff)[1],((rgba >> 16) & 0xff)[2],((rgba >> 16) & 0xff)[3]} * (1/255.0f);
                a = (Fx4){((rgba >> 24) & 0xff)[0],((rgba >> 24) & 0xff)[1],((rgba >> 24) & 0xff)[2],((rgba >> 24) & 0xff)[3]} * (1/255.0f);
            } break;

            case Op_load_1010102:{
                U32x4 rgba;
                __builtin_memcpy(&rgba, src + 4*i, 4*4);

                r = (Fx4){((rgba >> 0) & 0x3ff)[0],((rgba >> 0) & 0x3ff)[1],((rgba >> 0) & 0x3ff)[2],((rgba >> 0) & 0x3ff)[3]} * (1/1023.0f);
                g = (Fx4){((rgba >> 10) & 0x3ff)[0],((rgba >> 10) & 0x3ff)[1],((rgba >> 10) & 0x3ff)[2],((rgba >> 10) & 0x3ff)[3]} * (1/1023.0f);
                b = (Fx4){((rgba >> 20) & 0x3ff)[0],((rgba >> 20) & 0x3ff)[1],((rgba >> 20) & 0x3ff)[2],((rgba >> 20) & 0x3ff)[3]} * (1/1023.0f);
                a = (Fx4){((rgba >> 30) & 0x3)[0],((rgba >> 30) & 0x3)[1],((rgba >> 30) & 0x3)[2],((rgba >> 30) & 0x3)[3]} * (1/ 3.0f);
            } break;

            case Op_load_161616:{
                uintptr_t ptr = (uintptr_t)(src + 6*i);
                
# 647 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 647 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                const uint16_t* rgb = (const uint16_t*)ptr;






                U32x4 R = (U32x4){(rgb+0)[0], (rgb+0)[3], (rgb+0)[6], (rgb+0)[ 9]},
                    G = (U32x4){(rgb+1)[0], (rgb+1)[3], (rgb+1)[6], (rgb+1)[ 9]},
                    B = (U32x4){(rgb+2)[0], (rgb+2)[3], (rgb+2)[6], (rgb+2)[ 9]};

                r = (Fx4){((R & 0x00ff)<<8 | (R & 0xff00)>>8)[0],((R & 0x00ff)<<8 | (R & 0xff00)>>8)[1],((R & 0x00ff)<<8 | (R & 0xff00)>>8)[2],((R & 0x00ff)<<8 | (R & 0xff00)>>8)[3]} * (1/65535.0f);
                g = (Fx4){((G & 0x00ff)<<8 | (G & 0xff00)>>8)[0],((G & 0x00ff)<<8 | (G & 0xff00)>>8)[1],((G & 0x00ff)<<8 | (G & 0xff00)>>8)[2],((G & 0x00ff)<<8 | (G & 0xff00)>>8)[3]} * (1/65535.0f);
                b = (Fx4){((B & 0x00ff)<<8 | (B & 0xff00)>>8)[0],((B & 0x00ff)<<8 | (B & 0xff00)>>8)[1],((B & 0x00ff)<<8 | (B & 0xff00)>>8)[2],((B & 0x00ff)<<8 | (B & 0xff00)>>8)[3]} * (1/65535.0f);

                a = (Fx4){1,1,1,1};
            } break;

            case Op_load_16161616:{
                uintptr_t ptr = (uintptr_t)(src + 8*i);
                
# 668 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 668 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                const uint16_t* rgba = (const uint16_t*)ptr;







                U64x4 px;
                __builtin_memcpy(&px, rgba, 8*4);

                swap_endian_16x4_(&px);
                r = (Fx4){((px >> 0) & 0xffff)[0],((px >> 0) & 0xffff)[1],((px >> 0) & 0xffff)[2],((px >> 0) & 0xffff)[3]} * (1/65535.0f);
                g = (Fx4){((px >> 16) & 0xffff)[0],((px >> 16) & 0xffff)[1],((px >> 16) & 0xffff)[2],((px >> 16) & 0xffff)[3]} * (1/65535.0f);
                b = (Fx4){((px >> 32) & 0xffff)[0],((px >> 32) & 0xffff)[1],((px >> 32) & 0xffff)[2],((px >> 32) & 0xffff)[3]} * (1/65535.0f);
                a = (Fx4){((px >> 48) & 0xffff)[0],((px >> 48) & 0xffff)[1],((px >> 48) & 0xffff)[2],((px >> 48) & 0xffff)[3]} * (1/65535.0f);

            } break;

            case Op_load_hhh:{
                uintptr_t ptr = (uintptr_t)(src + 6*i);
                
# 690 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 690 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                const uint16_t* rgb = (const uint16_t*)ptr;






                U16x4 R = (U16x4){(rgb+0)[0], (rgb+0)[3], (rgb+0)[6], (rgb+0)[ 9]},
                    G = (U16x4){(rgb+1)[0], (rgb+1)[3], (rgb+1)[6], (rgb+1)[ 9]},
                    B = (U16x4){(rgb+2)[0], (rgb+2)[3], (rgb+2)[6], (rgb+2)[ 9]};

                r = F_from_Half_(R);
                g = F_from_Half_(G);
                b = F_from_Half_(B);
                a = (Fx4){1,1,1,1};
            } break;

            case Op_load_hhhh:{
                uintptr_t ptr = (uintptr_t)(src + 8*i);
                
# 710 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 710 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                const uint16_t* rgba = (const uint16_t*)ptr;







                U64x4 px;
                __builtin_memcpy(&px, rgba, 8*4);
                U16x4 R = (U16x4){((px >> 0) & 0xffff)[0],((px >> 0) & 0xffff)[1],((px >> 0) & 0xffff)[2],((px >> 0) & 0xffff)[3]},
                    G = (U16x4){((px >> 16) & 0xffff)[0],((px >> 16) & 0xffff)[1],((px >> 16) & 0xffff)[2],((px >> 16) & 0xffff)[3]},
                    B = (U16x4){((px >> 32) & 0xffff)[0],((px >> 32) & 0xffff)[1],((px >> 32) & 0xffff)[2],((px >> 32) & 0xffff)[3]},
                    A = (U16x4){((px >> 48) & 0xffff)[0],((px >> 48) & 0xffff)[1],((px >> 48) & 0xffff)[2],((px >> 48) & 0xffff)[3]};

                r = F_from_Half_(R);
                g = F_from_Half_(G);
                b = F_from_Half_(B);
                a = F_from_Half_(A);
            } break;

            case Op_load_fff:{
                uintptr_t ptr = (uintptr_t)(src + 12*i);
                
# 734 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 734 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                const float* rgb = (const float*)ptr;






                r = (Fx4){(rgb+0)[0], (rgb+0)[3], (rgb+0)[6], (rgb+0)[ 9]};
                g = (Fx4){(rgb+1)[0], (rgb+1)[3], (rgb+1)[6], (rgb+1)[ 9]};
                b = (Fx4){(rgb+2)[0], (rgb+2)[3], (rgb+2)[6], (rgb+2)[ 9]};

                a = (Fx4){1,1,1,1};
            } break;

            case Op_load_ffff:{
                uintptr_t ptr = (uintptr_t)(src + 16*i);
                
# 751 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 751 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                const float* rgba = (const float*)ptr;







                r = (Fx4){(rgba+0)[0], (rgba+0)[4], (rgba+0)[8], (rgba+0)[12]};;
                g = (Fx4){(rgba+1)[0], (rgba+1)[4], (rgba+1)[8], (rgba+1)[12]};;
                b = (Fx4){(rgba+2)[0], (rgba+2)[4], (rgba+2)[8], (rgba+2)[12]};;
                a = (Fx4){(rgba+3)[0], (rgba+3)[4], (rgba+3)[8], (rgba+3)[12]};;

            } break;

            case Op_swap_rb:{
                Fx4 t = r;
                r = b;
                b = t;
            } break;

            case Op_clamp:{
                r = max__((Fx4){0,0,0,0}, min__(r, (Fx4){1,1,1,1}));
                g = max__((Fx4){0,0,0,0}, min__(g, (Fx4){1,1,1,1}));
                b = max__((Fx4){0,0,0,0}, min__(b, (Fx4){1,1,1,1}));
                a = max__((Fx4){0,0,0,0}, min__(a, (Fx4){1,1,1,1}));
            } break;

            case Op_invert:{
                r = (Fx4){1,1,1,1} - r;
                g = (Fx4){1,1,1,1} - g;
                b = (Fx4){1,1,1,1} - b;
                a = (Fx4){1,1,1,1} - a;
            } break;

            case Op_force_opaque:{
                a = (Fx4){1,1,1,1};
            } break;

            case Op_premul:{
                r *= a;
                g *= a;
                b *= a;
            } break;

            case Op_unpremul:{
                Fx4 scale = (Fx4)( (((Fx4){1,1,1,1} / a < inf_.f) & (I32x4)((Fx4){1,1,1,1} / a)) | (~((Fx4){1,1,1,1} / a < inf_.f) & (I32x4)((Fx4){0,0,0,0})) );
                r *= scale;
                g *= scale;
                b *= scale;
            } break;

            case Op_matrix_3x3:{
                const skcms_Matrix3x3* matrix = *args++;
                const float* m = &matrix->vals[0][0];

                Fx4 R = m[0]*r + m[1]*g + m[2]*b,
                  G = m[3]*r + m[4]*g + m[5]*b,
                  B = m[6]*r + m[7]*g + m[8]*b;

                r = R;
                g = G;
                b = B;
            } break;

            case Op_matrix_3x4:{
                const skcms_Matrix3x4* matrix = *args++;
                const float* m = &matrix->vals[0][0];

                Fx4 R = m[0]*r + m[1]*g + m[ 2]*b + m[ 3],
                  G = m[4]*r + m[5]*g + m[ 6]*b + m[ 7],
                  B = m[8]*r + m[9]*g + m[10]*b + m[11];

                r = R;
                g = G;
                b = B;
            } break;

            case Op_lab_to_xyz:{

                Fx4 L = r * 100.0f,
                  A = g * 255.0f - 128.0f,
                  B = b * 255.0f - 128.0f;


                Fx4 Y = (L + 16.0f) * (1/116.0f),
                  X = Y + A*(1/500.0f),
                  Z = Y - B*(1/200.0f);

                X = (Fx4)( ((X*X*X > 0.008856f) & (I32x4)(X*X*X)) | (~(X*X*X > 0.008856f) & (I32x4)((X - (16/116.0f)) * (1/7.787f))) );
                Y = (Fx4)( ((Y*Y*Y > 0.008856f) & (I32x4)(Y*Y*Y)) | (~(Y*Y*Y > 0.008856f) & (I32x4)((Y - (16/116.0f)) * (1/7.787f))) );
                Z = (Fx4)( ((Z*Z*Z > 0.008856f) & (I32x4)(Z*Z*Z)) | (~(Z*Z*Z > 0.008856f) & (I32x4)((Z - (16/116.0f)) * (1/7.787f))) );


                r = X * 0.9642f;
                g = Y ;
                b = Z * 0.8249f;
            } break;

            case Op_tf_r:{ r = apply_transfer_function_(*args++, r); } break;
            case Op_tf_g:{ g = apply_transfer_function_(*args++, g); } break;
            case Op_tf_b:{ b = apply_transfer_function_(*args++, b); } break;
            case Op_tf_a:{ a = apply_transfer_function_(*args++, a); } break;

            case Op_table_8_r: { r = table_8_(*args++, r); } break;
            case Op_table_8_g: { g = table_8_(*args++, g); } break;
            case Op_table_8_b: { b = table_8_(*args++, b); } break;
            case Op_table_8_a: { a = table_8_(*args++, a); } break;

            case Op_table_16_r:{ r = table_16_(*args++, r); } break;
            case Op_table_16_g:{ g = table_16_(*args++, g); } break;
            case Op_table_16_b:{ b = table_16_(*args++, b); } break;
            case Op_table_16_a:{ a = table_16_(*args++, a); } break;

            case Op_clut_3D_8:{
                const skcms_A2B* a2b = *args++;
                clut_3_8_(a2b, (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]},(I32x4){((Fx4){1,1,1,1})[0],((Fx4){1,1,1,1})[1],((Fx4){1,1,1,1})[2],((Fx4){1,1,1,1})[3]}, &r,&g,&b,a);
            } break;

            case Op_clut_3D_16:{
                const skcms_A2B* a2b = *args++;
                clut_3_16_(a2b, (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]},(I32x4){((Fx4){1,1,1,1})[0],((Fx4){1,1,1,1})[1],((Fx4){1,1,1,1})[2],((Fx4){1,1,1,1})[3]}, &r,&g,&b,a);
            } break;

            case Op_clut_4D_8:{
                const skcms_A2B* a2b = *args++;
                clut_4_8_(a2b, (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]},(I32x4){((Fx4){1,1,1,1})[0],((Fx4){1,1,1,1})[1],((Fx4){1,1,1,1})[2],((Fx4){1,1,1,1})[3]}, &r,&g,&b,a);

                a = (Fx4){1,1,1,1};
            } break;

            case Op_clut_4D_16:{
                const skcms_A2B* a2b = *args++;
                clut_4_16_(a2b, (I32x4){((Fx4){0,0,0,0})[0],((Fx4){0,0,0,0})[1],((Fx4){0,0,0,0})[2],((Fx4){0,0,0,0})[3]},(I32x4){((Fx4){1,1,1,1})[0],((Fx4){1,1,1,1})[1],((Fx4){1,1,1,1})[2],((Fx4){1,1,1,1})[3]}, &r,&g,&b,a);

                a = (Fx4){1,1,1,1};
            } break;



            case Op_store_565: {
                U16x4 rgb = (U16x4){(to_fixed_(r * 31) << 0)[0],(to_fixed_(r * 31) << 0)[1],(to_fixed_(r * 31) << 0)[2],(to_fixed_(r * 31) << 0)[3]}
                        | (U16x4){(to_fixed_(g * 63) << 5)[0],(to_fixed_(g * 63) << 5)[1],(to_fixed_(g * 63) << 5)[2],(to_fixed_(g * 63) << 5)[3]}
                        | (U16x4){(to_fixed_(b * 31) << 11)[0],(to_fixed_(b * 31) << 11)[1],(to_fixed_(b * 31) << 11)[2],(to_fixed_(b * 31) << 11)[3]};
                __builtin_memcpy(dst + 2*i, &rgb, 2*4);
            } return;

            case Op_store_888: {
                uint8_t* rgb = (uint8_t*)dst + 3*i;
# 915 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                (rgb+0)[0] = ((U8x4){(to_fixed_(r * 255))[0],(to_fixed_(r * 255))[1],(to_fixed_(r * 255))[2],(to_fixed_(r * 255))[3]})[0]; (rgb+0)[3] = ((U8x4){(to_fixed_(r * 255))[0],(to_fixed_(r * 255))[1],(to_fixed_(r * 255))[2],(to_fixed_(r * 255))[3]})[1]; (rgb+0)[6] = ((U8x4){(to_fixed_(r * 255))[0],(to_fixed_(r * 255))[1],(to_fixed_(r * 255))[2],(to_fixed_(r * 255))[3]})[2]; (rgb+0)[ 9] = ((U8x4){(to_fixed_(r * 255))[0],(to_fixed_(r * 255))[1],(to_fixed_(r * 255))[2],(to_fixed_(r * 255))[3]})[3];
                (rgb+1)[0] = ((U8x4){(to_fixed_(g * 255))[0],(to_fixed_(g * 255))[1],(to_fixed_(g * 255))[2],(to_fixed_(g * 255))[3]})[0]; (rgb+1)[3] = ((U8x4){(to_fixed_(g * 255))[0],(to_fixed_(g * 255))[1],(to_fixed_(g * 255))[2],(to_fixed_(g * 255))[3]})[1]; (rgb+1)[6] = ((U8x4){(to_fixed_(g * 255))[0],(to_fixed_(g * 255))[1],(to_fixed_(g * 255))[2],(to_fixed_(g * 255))[3]})[2]; (rgb+1)[ 9] = ((U8x4){(to_fixed_(g * 255))[0],(to_fixed_(g * 255))[1],(to_fixed_(g * 255))[2],(to_fixed_(g * 255))[3]})[3];
                (rgb+2)[0] = ((U8x4){(to_fixed_(b * 255))[0],(to_fixed_(b * 255))[1],(to_fixed_(b * 255))[2],(to_fixed_(b * 255))[3]})[0]; (rgb+2)[3] = ((U8x4){(to_fixed_(b * 255))[0],(to_fixed_(b * 255))[1],(to_fixed_(b * 255))[2],(to_fixed_(b * 255))[3]})[1]; (rgb+2)[6] = ((U8x4){(to_fixed_(b * 255))[0],(to_fixed_(b * 255))[1],(to_fixed_(b * 255))[2],(to_fixed_(b * 255))[3]})[2]; (rgb+2)[ 9] = ((U8x4){(to_fixed_(b * 255))[0],(to_fixed_(b * 255))[1],(to_fixed_(b * 255))[2],(to_fixed_(b * 255))[3]})[3];

            } return;

            case Op_store_8888: {
                U32x4 rgba = (U32x4){(to_fixed_(r * 255) << 0)[0],(to_fixed_(r * 255) << 0)[1],(to_fixed_(r * 255) << 0)[2],(to_fixed_(r * 255) << 0)[3]}
                         | (U32x4){(to_fixed_(g * 255) << 8)[0],(to_fixed_(g * 255) << 8)[1],(to_fixed_(g * 255) << 8)[2],(to_fixed_(g * 255) << 8)[3]}
                         | (U32x4){(to_fixed_(b * 255) << 16)[0],(to_fixed_(b * 255) << 16)[1],(to_fixed_(b * 255) << 16)[2],(to_fixed_(b * 255) << 16)[3]}
                         | (U32x4){(to_fixed_(a * 255) << 24)[0],(to_fixed_(a * 255) << 24)[1],(to_fixed_(a * 255) << 24)[2],(to_fixed_(a * 255) << 24)[3]};
                __builtin_memcpy(dst + 4*i, &rgba, 4*4);
            } return;

            case Op_store_1010102: {
                U32x4 rgba = (U32x4){(to_fixed_(r * 1023) << 0)[0],(to_fixed_(r * 1023) << 0)[1],(to_fixed_(r * 1023) << 0)[2],(to_fixed_(r * 1023) << 0)[3]}
                         | (U32x4){(to_fixed_(g * 1023) << 10)[0],(to_fixed_(g * 1023) << 10)[1],(to_fixed_(g * 1023) << 10)[2],(to_fixed_(g * 1023) << 10)[3]}
                         | (U32x4){(to_fixed_(b * 1023) << 20)[0],(to_fixed_(b * 1023) << 20)[1],(to_fixed_(b * 1023) << 20)[2],(to_fixed_(b * 1023) << 20)[3]}
                         | (U32x4){(to_fixed_(a * 3) << 30)[0],(to_fixed_(a * 3) << 30)[1],(to_fixed_(a * 3) << 30)[2],(to_fixed_(a * 3) << 30)[3]};
                __builtin_memcpy(dst + 4*i, &rgba, 4*4);
            } return;

            case Op_store_161616: {
                uintptr_t ptr = (uintptr_t)(dst + 6*i);
                
# 939 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 939 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                uint16_t* rgb = (uint16_t*)ptr;
# 949 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                I32x4 R = to_fixed_(r * 65535),
                    G = to_fixed_(g * 65535),
                    B = to_fixed_(b * 65535);
                (rgb+0)[0] = ((U16x4){((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[0],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[1],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[2],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[3]})[0]; (rgb+0)[3] = ((U16x4){((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[0],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[1],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[2],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[3]})[1]; (rgb+0)[6] = ((U16x4){((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[0],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[1],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[2],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[3]})[2]; (rgb+0)[ 9] = ((U16x4){((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[0],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[1],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[2],((R & 0x00ff) << 8 | (R & 0xff00) >> 8)[3]})[3];
                (rgb+1)[0] = ((U16x4){((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[0],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[1],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[2],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[3]})[0]; (rgb+1)[3] = ((U16x4){((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[0],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[1],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[2],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[3]})[1]; (rgb+1)[6] = ((U16x4){((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[0],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[1],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[2],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[3]})[2]; (rgb+1)[ 9] = ((U16x4){((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[0],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[1],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[2],((G & 0x00ff) << 8 | (G & 0xff00) >> 8)[3]})[3];
                (rgb+2)[0] = ((U16x4){((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[0],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[1],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[2],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[3]})[0]; (rgb+2)[3] = ((U16x4){((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[0],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[1],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[2],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[3]})[1]; (rgb+2)[6] = ((U16x4){((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[0],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[1],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[2],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[3]})[2]; (rgb+2)[ 9] = ((U16x4){((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[0],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[1],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[2],((B & 0x00ff) << 8 | (B & 0xff00) >> 8)[3]})[3];


            } return;

            case Op_store_16161616: {
                uintptr_t ptr = (uintptr_t)(dst + 8*i);
                
# 961 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 961 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                uint16_t* rgba = (uint16_t*)ptr;
# 972 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                U64x4 px = (U64x4){(to_fixed_(r * 65535))[0],(to_fixed_(r * 65535))[1],(to_fixed_(r * 65535))[2],(to_fixed_(r * 65535))[3]} << 0
                       | (U64x4){(to_fixed_(g * 65535))[0],(to_fixed_(g * 65535))[1],(to_fixed_(g * 65535))[2],(to_fixed_(g * 65535))[3]} << 16
                       | (U64x4){(to_fixed_(b * 65535))[0],(to_fixed_(b * 65535))[1],(to_fixed_(b * 65535))[2],(to_fixed_(b * 65535))[3]} << 32
                       | (U64x4){(to_fixed_(a * 65535))[0],(to_fixed_(a * 65535))[1],(to_fixed_(a * 65535))[2],(to_fixed_(a * 65535))[3]} << 48;
                swap_endian_16x4_(&px);
                __builtin_memcpy(rgba, &px, 8*4);

            } return;

            case Op_store_hhh: {
                uintptr_t ptr = (uintptr_t)(dst + 6*i);
                
# 983 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 983 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                uint16_t* rgb = (uint16_t*)ptr;

                U16x4 R = Half_from_F_(r),
                    G = Half_from_F_(g),
                    B = Half_from_F_(b);
# 997 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                (rgb+0)[0] = (R)[0]; (rgb+0)[3] = (R)[1]; (rgb+0)[6] = (R)[2]; (rgb+0)[ 9] = (R)[3];
                (rgb+1)[0] = (G)[0]; (rgb+1)[3] = (G)[1]; (rgb+1)[6] = (G)[2]; (rgb+1)[ 9] = (G)[3];
                (rgb+2)[0] = (B)[0]; (rgb+2)[3] = (B)[1]; (rgb+2)[6] = (B)[2]; (rgb+2)[ 9] = (B)[3];

            } return;

            case Op_store_hhhh: {
                uintptr_t ptr = (uintptr_t)(dst + 8*i);
                
# 1005 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 1005 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                uint16_t* rgba = (uint16_t*)ptr;

                U16x4 R = Half_from_F_(r),
                    G = Half_from_F_(g),
                    B = Half_from_F_(b),
                    A = Half_from_F_(a);
# 1021 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                U64x4 px = (U64x4){(R)[0],(R)[1],(R)[2],(R)[3]} << 0
                       | (U64x4){(G)[0],(G)[1],(G)[2],(G)[3]} << 16
                       | (U64x4){(B)[0],(B)[1],(B)[2],(B)[3]} << 32
                       | (U64x4){(A)[0],(A)[1],(A)[2],(A)[3]} << 48;
                __builtin_memcpy(rgba, &px, 8*4);


            } return;

            case Op_store_fff: {
                uintptr_t ptr = (uintptr_t)(dst + 12*i);
                
# 1032 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 1032 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                float* rgb = (float*)ptr;
# 1042 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                (rgb+0)[0] = (r)[0]; (rgb+0)[3] = (r)[1]; (rgb+0)[6] = (r)[2]; (rgb+0)[ 9] = (r)[3];
                (rgb+1)[0] = (g)[0]; (rgb+1)[3] = (g)[1]; (rgb+1)[6] = (g)[2]; (rgb+1)[ 9] = (g)[3];
                (rgb+2)[0] = (b)[0]; (rgb+2)[3] = (b)[1]; (rgb+2)[6] = (b)[2]; (rgb+2)[ 9] = (b)[3];

            } return;

            case Op_store_ffff: {
                uintptr_t ptr = (uintptr_t)(dst + 16*i);
                
# 1050 "../../third_party/skia/third_party/skcms/src/Transform_inl.h" 3 4
               ((void) (0))
# 1050 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                                       ;
                float* rgba = (float*)ptr;
# 1061 "../../third_party/skia/third_party/skcms/src/Transform_inl.h"
                (rgba+0)[0] = (r)[0]; (rgba+0)[4] = (r)[1]; (rgba+0)[8] = (r)[2]; (rgba+0)[12] = (r)[3];
                (rgba+1)[0] = (g)[0]; (rgba+1)[4] = (g)[1]; (rgba+1)[8] = (g)[2]; (rgba+1)[12] = (g)[3];
                (rgba+2)[0] = (b)[0]; (rgba+2)[4] = (b)[1]; (rgba+2)[8] = (b)[2]; (rgba+2)[12] = (b)[3];
                (rgba+3)[0] = (a)[0]; (rgba+3)[4] = (a)[1]; (rgba+3)[8] = (a)[2]; (rgba+3)[12] = (a)[3];

            } return;
        }
    }
}


static void run_program(const Op* program, const void** arguments,
                           const char* src, char* dst, int n,
                           const size_t src_bpp, const size_t dst_bpp) {
    int i = 0;
    while (n >= 4) {
        exec_ops(program, arguments, src, dst, i);
        i += 4;
        n -= 4;
    }
    if (n > 0) {
        char tmp_src[4*4*4] = {0},
             tmp_dst[4*4*4] = {0};

        memcpy(tmp_src, (const char*)src + (size_t)i*src_bpp, (size_t)n*src_bpp);
        exec_ops(program, arguments, tmp_src, tmp_dst, 0);
        memcpy((char*)dst + (size_t)i*dst_bpp, tmp_dst, (size_t)n*dst_bpp);
    }
}
# 177 "../../third_party/skia/third_party/skcms/src/Transform.c" 2
# 314 "../../third_party/skia/third_party/skcms/src/Transform.c"
static 
# 314 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
      _Bool 
# 314 "../../third_party/skia/third_party/skcms/src/Transform.c"
           is_identity_tf(const skcms_TransferFunction* tf) {
    return tf->g == 1 && tf->a == 1
        && tf->b == 0 && tf->c == 0 && tf->d == 0 && tf->e == 0 && tf->f == 0;
}

typedef struct {
    Op op;
    const void* arg;
} OpAndArg;

static OpAndArg select_curve_op(const skcms_Curve* curve, int channel) {
    static const struct { Op parametric, table_8, table_16; } ops[] = {
        { Op_tf_r, Op_table_8_r, Op_table_16_r },
        { Op_tf_g, Op_table_8_g, Op_table_16_g },
        { Op_tf_b, Op_table_8_b, Op_table_16_b },
        { Op_tf_a, Op_table_8_a, Op_table_16_a },
    };

    if (curve->table_entries == 0) {
        return is_identity_tf(&curve->parametric)
            ? (OpAndArg){ Op_noop, 
# 334 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                                  ((void *)0) 
# 334 "../../third_party/skia/third_party/skcms/src/Transform.c"
                                       }
            : (OpAndArg){ ops[channel].parametric, &curve->parametric };
    } else if (curve->table_8) {
        return (OpAndArg){ ops[channel].table_8, curve };
    } else if (curve->table_16) {
        return (OpAndArg){ ops[channel].table_16, curve };
    }

    
# 342 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
   ((void) (0))
# 342 "../../third_party/skia/third_party/skcms/src/Transform.c"
                ;
    return (OpAndArg){Op_noop,
# 343 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                             ((void *)0)
# 343 "../../third_party/skia/third_party/skcms/src/Transform.c"
                                 };
}

static size_t bytes_per_pixel(skcms_PixelFormat fmt) {
    switch (fmt >> 1) {
        case skcms_PixelFormat_RGB_565 >> 1: return 2;
        case skcms_PixelFormat_RGB_888 >> 1: return 3;
        case skcms_PixelFormat_RGBA_8888 >> 1: return 4;
        case skcms_PixelFormat_RGBA_1010102 >> 1: return 4;
        case skcms_PixelFormat_RGB_161616 >> 1: return 6;
        case skcms_PixelFormat_RGBA_16161616 >> 1: return 8;
        case skcms_PixelFormat_RGB_hhh >> 1: return 6;
        case skcms_PixelFormat_RGBA_hhhh >> 1: return 8;
        case skcms_PixelFormat_RGB_fff >> 1: return 12;
        case skcms_PixelFormat_RGBA_ffff >> 1: return 16;
    }
    
# 359 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
   ((void) (0))
# 359 "../../third_party/skia/third_party/skcms/src/Transform.c"
                ;
    return 0;
}

static 
# 363 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
      _Bool 
# 363 "../../third_party/skia/third_party/skcms/src/Transform.c"
           prep_for_destination(const skcms_ICCProfile* profile,
                                 skcms_Matrix3x3* fromXYZD50,
                                 skcms_TransferFunction* invR,
                                 skcms_TransferFunction* invG,
                                 skcms_TransferFunction* invB) {


    return profile->has_trc
        && profile->has_toXYZD50
        && profile->trc[0].table_entries == 0
        && profile->trc[1].table_entries == 0
        && profile->trc[2].table_entries == 0
        && skcms_TransferFunction_invert(&profile->trc[0].parametric, invR)
        && skcms_TransferFunction_invert(&profile->trc[1].parametric, invG)
        && skcms_TransferFunction_invert(&profile->trc[2].parametric, invB)
        && skcms_Matrix3x3_invert(&profile->toXYZD50, fromXYZD50);
}


# 381 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
_Bool 
# 381 "../../third_party/skia/third_party/skcms/src/Transform.c"
    skcms_Transform(const void* src,
                     skcms_PixelFormat srcFmt,
                     skcms_AlphaFormat srcAlpha,
                     const skcms_ICCProfile* srcProfile,
                     void* dst,
                     skcms_PixelFormat dstFmt,
                     skcms_AlphaFormat dstAlpha,
                     const skcms_ICCProfile* dstProfile,
                     size_t nz) {
    const size_t dst_bpp = bytes_per_pixel(dstFmt),
                 src_bpp = bytes_per_pixel(srcFmt);

    if (nz * dst_bpp > 0x7fffffff || nz * src_bpp > 0x7fffffff) {
        return 
# 394 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
              0
# 394 "../../third_party/skia/third_party/skcms/src/Transform.c"
                   ;
    }
    int n = (int)nz;


    if (!dstProfile != !srcProfile) {
        return 
# 400 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
              0
# 400 "../../third_party/skia/third_party/skcms/src/Transform.c"
                   ;
    }


    if (dst == src && (dstFmt >> 1) != (srcFmt >> 1)) {
        return 
# 405 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
              0
# 405 "../../third_party/skia/third_party/skcms/src/Transform.c"
                   ;
    }



    Op program [32];
    const void* arguments[32];

    Op* ops = program;
    const void** args = arguments;

    skcms_TransferFunction inv_dst_tf_r, inv_dst_tf_g, inv_dst_tf_b;
    skcms_Matrix3x3 from_xyz;

    switch (srcFmt >> 1) {
        default: return 
# 420 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                       0
# 420 "../../third_party/skia/third_party/skcms/src/Transform.c"
                            ;
        case skcms_PixelFormat_RGB_565 >> 1: *ops++ = Op_load_565; break;
        case skcms_PixelFormat_RGB_888 >> 1: *ops++ = Op_load_888; break;
        case skcms_PixelFormat_RGBA_8888 >> 1: *ops++ = Op_load_8888; break;
        case skcms_PixelFormat_RGBA_1010102 >> 1: *ops++ = Op_load_1010102; break;
        case skcms_PixelFormat_RGB_161616 >> 1: *ops++ = Op_load_161616; break;
        case skcms_PixelFormat_RGBA_16161616 >> 1: *ops++ = Op_load_16161616; break;
        case skcms_PixelFormat_RGB_hhh >> 1: *ops++ = Op_load_hhh; break;
        case skcms_PixelFormat_RGBA_hhhh >> 1: *ops++ = Op_load_hhhh; break;
        case skcms_PixelFormat_RGB_fff >> 1: *ops++ = Op_load_fff; break;
        case skcms_PixelFormat_RGBA_ffff >> 1: *ops++ = Op_load_ffff; break;
    }
    if (srcFmt & 1) {
        *ops++ = Op_swap_rb;
    }

    if (srcProfile->data_color_space == skcms_Signature_CMYK) {


        *ops++ = Op_invert;

        srcAlpha = skcms_AlphaFormat_Unpremul;
    }

    if (srcAlpha == skcms_AlphaFormat_Opaque) {
        *ops++ = Op_force_opaque;
    } else if (srcAlpha == skcms_AlphaFormat_PremulAsEncoded) {
        *ops++ = Op_unpremul;
    }



    if (dstProfile != srcProfile ||
        srcAlpha == skcms_AlphaFormat_PremulLinear ||
        dstAlpha == skcms_AlphaFormat_PremulLinear) {

        if (!prep_for_destination(dstProfile,
                                  &from_xyz, &inv_dst_tf_r, &inv_dst_tf_b, &inv_dst_tf_g)) {
            return 
# 458 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                  0
# 458 "../../third_party/skia/third_party/skcms/src/Transform.c"
                       ;
        }

        if (srcProfile->has_A2B) {
            if (srcProfile->A2B.input_channels) {
                for (int i = 0; i < (int)srcProfile->A2B.input_channels; i++) {
                    OpAndArg oa = select_curve_op(&srcProfile->A2B.input_curves[i], i);
                    if (oa.op != Op_noop) {
                        *ops++ = oa.op;
                        *args++ = oa.arg;
                    }
                }
                switch (srcProfile->A2B.input_channels) {
                    case 3: *ops++ = srcProfile->A2B.grid_8 ? Op_clut_3D_8 : Op_clut_3D_16; break;
                    case 4: *ops++ = srcProfile->A2B.grid_8 ? Op_clut_4D_8 : Op_clut_4D_16; break;
                    default: return 
# 473 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                                   0
# 473 "../../third_party/skia/third_party/skcms/src/Transform.c"
                                        ;
                }
                *args++ = &srcProfile->A2B;
            }

            if (srcProfile->A2B.matrix_channels == 3) {
                for (int i = 0; i < 3; i++) {
                    OpAndArg oa = select_curve_op(&srcProfile->A2B.matrix_curves[i], i);
                    if (oa.op != Op_noop) {
                        *ops++ = oa.op;
                        *args++ = oa.arg;
                    }
                }

                static const skcms_Matrix3x4 I = {{
                    {1,0,0,0},
                    {0,1,0,0},
                    {0,0,1,0},
                }};
                if (0 != memcmp(&I, &srcProfile->A2B.matrix, sizeof(I))) {
                    *ops++ = Op_matrix_3x4;
                    *args++ = &srcProfile->A2B.matrix;
                }
            }

            if (srcProfile->A2B.output_channels == 3) {
                for (int i = 0; i < 3; i++) {
                    OpAndArg oa = select_curve_op(&srcProfile->A2B.output_curves[i], i);
                    if (oa.op != Op_noop) {
                        *ops++ = oa.op;
                        *args++ = oa.arg;
                    }
                }
            }

            if (srcProfile->pcs == skcms_Signature_Lab) {
                *ops++ = Op_lab_to_xyz;
            }

        } else if (srcProfile->has_trc && srcProfile->has_toXYZD50) {
            for (int i = 0; i < 3; i++) {
                OpAndArg oa = select_curve_op(&srcProfile->trc[i], i);
                if (oa.op != Op_noop) {
                    *ops++ = oa.op;
                    *args++ = oa.arg;
                }
            }
        } else {
            return 
# 521 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                  0
# 521 "../../third_party/skia/third_party/skcms/src/Transform.c"
                       ;
        }




        if (srcAlpha == skcms_AlphaFormat_PremulLinear) {
            *ops++ = Op_unpremul;
        }





        
# 535 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
       ((void) (0))
# 535 "../../third_party/skia/third_party/skcms/src/Transform.c"
                                                               ;
        static const skcms_Matrix3x3 I = {{
            { 1.0f, 0.0f, 0.0f },
            { 0.0f, 1.0f, 0.0f },
            { 0.0f, 0.0f, 1.0f },
        }};
        const skcms_Matrix3x3* to_xyz = srcProfile->has_A2B ? &I : &srcProfile->toXYZD50;



        if (0 != memcmp(&dstProfile->toXYZD50, to_xyz, sizeof(skcms_Matrix3x3))) {


            from_xyz = skcms_Matrix3x3_concat(&from_xyz, to_xyz);
            *ops++ = Op_matrix_3x3;
            *args++ = &from_xyz;
        }

        if (dstAlpha == skcms_AlphaFormat_PremulLinear) {
            *ops++ = Op_premul;
        }


        if (!is_identity_tf(&inv_dst_tf_r)) { *ops++ = Op_tf_r; *args++ = &inv_dst_tf_r; }
        if (!is_identity_tf(&inv_dst_tf_g)) { *ops++ = Op_tf_g; *args++ = &inv_dst_tf_g; }
        if (!is_identity_tf(&inv_dst_tf_b)) { *ops++ = Op_tf_b; *args++ = &inv_dst_tf_b; }
    }

    if (dstAlpha == skcms_AlphaFormat_Opaque) {
        *ops++ = Op_force_opaque;
    } else if (dstAlpha == skcms_AlphaFormat_PremulAsEncoded) {
        *ops++ = Op_premul;
    }
    if (dstFmt & 1) {
        *ops++ = Op_swap_rb;
    }
    if (dstFmt < skcms_PixelFormat_RGB_hhh) {
        *ops++ = Op_clamp;
    }
    switch (dstFmt >> 1) {
        default: return 
# 575 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                       0
# 575 "../../third_party/skia/third_party/skcms/src/Transform.c"
                            ;
        case skcms_PixelFormat_RGB_565 >> 1: *ops++ = Op_store_565; break;
        case skcms_PixelFormat_RGB_888 >> 1: *ops++ = Op_store_888; break;
        case skcms_PixelFormat_RGBA_8888 >> 1: *ops++ = Op_store_8888; break;
        case skcms_PixelFormat_RGBA_1010102 >> 1: *ops++ = Op_store_1010102; break;
        case skcms_PixelFormat_RGB_161616 >> 1: *ops++ = Op_store_161616; break;
        case skcms_PixelFormat_RGBA_16161616 >> 1: *ops++ = Op_store_16161616; break;
        case skcms_PixelFormat_RGB_hhh >> 1: *ops++ = Op_store_hhh; break;
        case skcms_PixelFormat_RGBA_hhhh >> 1: *ops++ = Op_store_hhhh; break;
        case skcms_PixelFormat_RGB_fff >> 1: *ops++ = Op_store_fff; break;
        case skcms_PixelFormat_RGBA_ffff >> 1: *ops++ = Op_store_ffff; break;
    }

    void (*run)(const Op*, const void**, const char*, char*, int, size_t,size_t) = run_program;





    run(program, arguments, src, dst, n, src_bpp,dst_bpp);
    return 
# 595 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
          1
# 595 "../../third_party/skia/third_party/skcms/src/Transform.c"
              ;
}

static void assert_usable_as_destination(const skcms_ICCProfile* profile) {

    (void)profile;





}


# 608 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
_Bool 
# 608 "../../third_party/skia/third_party/skcms/src/Transform.c"
    skcms_MakeUsableAsDestination(skcms_ICCProfile* profile) {
    skcms_Matrix3x3 fromXYZD50;
    if (!profile->has_trc || !profile->has_toXYZD50
        || !skcms_Matrix3x3_invert(&profile->toXYZD50, &fromXYZD50)) {
        return 
# 612 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
              0
# 612 "../../third_party/skia/third_party/skcms/src/Transform.c"
                   ;
    }

    skcms_TransferFunction tf[3];
    for (int i = 0; i < 3; i++) {
        skcms_TransferFunction inv;
        if (profile->trc[i].table_entries == 0
            && skcms_TransferFunction_invert(&profile->trc[i].parametric, &inv)) {
            tf[i] = profile->trc[i].parametric;
            continue;
        }

        float max_error;

        if (!skcms_ApproximateCurve(&profile->trc[i], &tf[i], &max_error)) {
            return 
# 627 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
                  0
# 627 "../../third_party/skia/third_party/skcms/src/Transform.c"
                       ;
        }
    }

    for (int i = 0; i < 3; ++i) {
        profile->trc[i].table_entries = 0;
        profile->trc[i].parametric = tf[i];
    }

    assert_usable_as_destination(profile);
    return 
# 637 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
          1
# 637 "../../third_party/skia/third_party/skcms/src/Transform.c"
              ;
}


# 640 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
_Bool 
# 640 "../../third_party/skia/third_party/skcms/src/Transform.c"
    skcms_MakeUsableAsDestinationWithSingleCurve(skcms_ICCProfile* profile) {

    skcms_ICCProfile result = *profile;
    if (!skcms_MakeUsableAsDestination(&result)) {
        return 
# 644 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
              0
# 644 "../../third_party/skia/third_party/skcms/src/Transform.c"
                   ;
    }

    int best_tf = 0;
    float min_max_error = inf_.f;
    for (int i = 0; i < 3; i++) {
        skcms_TransferFunction inv;
        skcms_TransferFunction_invert(&result.trc[i].parametric, &inv);

        float err = 0;
        for (int j = 0; j < 3; ++j) {
            err = fmaxf_(err, skcms_MaxRoundtripError(&profile->trc[j], &inv));
        }
        if (min_max_error > err) {
            min_max_error = err;
            best_tf = i;
        }
    }

    for (int i = 0; i < 3; i++) {
        result.trc[i].parametric = result.trc[best_tf].parametric;
    }

    *profile = result;
    assert_usable_as_destination(profile);
    return 
# 669 "../../third_party/skia/third_party/skcms/src/Transform.c" 3 4
          1
# 669 "../../third_party/skia/third_party/skcms/src/Transform.c"
              ;
}

Reply to: