// File: /workspace/github_cpp_makefile_star2_O2/jliesch[P]ofxget/pugixml/pugixml.cpp
// Function: pugi::impl::(anonymous namespace)::utf32_writer::value_type pugi::impl::(anonymous namespace)::utf8_decoder::process<pugi::impl::(anonymous namespace)::utf32_writer>(unsigned char const*, unsigned long, pugi::impl::(anonymous namespace)::utf32_writer::value_type, pugi::impl::(anonymous namespace)::utf32_writer)
static inline typename Traits::value_type process(const uint8_t* data, size_t size, typename Traits::value_type result, Traits)
		{
			const uint8_t utf8_byte_mask = 0x3f;

			while (size)
			{
				uint8_t lead = *data;

				// 0xxxxxxx -> U+0000..U+007F
				if (lead < 0x80)
				{
					result = Traits::low(result, lead);
					data += 1;
					size -= 1;

					// process aligned single-byte (ascii) blocks
					if ((reinterpret_cast<uintptr_t>(data) & 3) == 0)
					{
						// round-trip through void* to silence 'cast increases required alignment of target type' warnings
						while (size >= 4 && (*static_cast<const uint32_t*>(static_cast<const void*>(data)) & 0x80808080) == 0)
						{
							result = Traits::low(result, data[0]);
							result = Traits::low(result, data[1]);
							result = Traits::low(result, data[2]);
							result = Traits::low(result, data[3]);
							data += 4;
							size -= 4;
						}
					}
				}
				// 110xxxxx -> U+0080..U+07FF
				else if (static_cast<unsigned int>(lead - 0xC0) < 0x20 && size >= 2 && (data[1] & 0xc0) == 0x80)
				{
					result = Traits::low(result, ((lead & ~0xC0) << 6) | (data[1] & utf8_byte_mask));
					data += 2;
					size -= 2;
				}
				// 1110xxxx -> U+0800-U+FFFF
				else if (static_cast<unsigned int>(lead - 0xE0) < 0x10 && size >= 3 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80)
				{
					result = Traits::low(result, ((lead & ~0xE0) << 12) | ((data[1] & utf8_byte_mask) << 6) | (data[2] & utf8_byte_mask));
					data += 3;
					size -= 3;
				}
				// 11110xxx -> U+10000..U+10FFFF
				else if (static_cast<unsigned int>(lead - 0xF0) < 0x08 && size >= 4 && (data[1] & 0xc0) == 0x80 && (data[2] & 0xc0) == 0x80 && (data[3] & 0xc0) == 0x80)
				{
					result = Traits::high(result, ((lead & ~0xF0) << 18) | ((data[1] & utf8_byte_mask) << 12) | ((data[2] & utf8_byte_mask) << 6) | (data[3] & utf8_byte_mask));
					data += 4;
					size -= 4;
				}
				// 10xxxxxx or 11111xxx -> invalid
				else
				{
					data += 1;
					size -= 1;
				}
			}

			return result;
		}

// Assembly:
pushq %rbp
pushq %rbx
movq %rdx, %rax
movabsq $0x3, %rcx
movq %rdi, %rdx
movq %rcx, %r9
xorl %r8d, %r8d
leaq (%rsi,%r8), %r10
movq %r10, %r11
subq $0x1, %r11
jb 0x25564
movzbl -0x3(%rdx,%r9), %edi
testb %dil, %dil
jns 0x2545d
testq %r11, %r11
je 0x253bb
movl %edi, %r11d
andl $-0x20, %r11d
cmpl $0xc0, %r11d
jne 0x253bb
movzbl -0x2(%rdx,%r9), %r11d
movl %r11d, %ebx
andl $-0x40, %ebx
cmpl $0x80, %ebx
je 0x254c9
cmpq $0x3, %r10
jb 0x253fc
movl %edi, %r11d
andl $-0x10, %r11d
cmpl $0xe0, %r11d
jne 0x253fc
movzbl -0x2(%rdx,%r9), %r11d
movl %r11d, %ebx
andl $-0x40, %ebx
cmpl $0x80, %ebx
jne 0x253fc
movzbl -0x1(%rdx,%r9), %ebx
movl %ebx, %ebp
andl $-0x40, %ebp
cmpl $0x80, %ebp
je 0x254f3
cmpq $0x4, %r10
jb 0x25452
movl %edi, %r10d
andl $-0x8, %r10d
cmpl $0xf0, %r10d
jne 0x25452
movzbl -0x2(%rdx,%r9), %r10d
movl %r10d, %r11d
andl $-0x40, %r11d
cmpl $0x80, %r11d
jne 0x25452
movzbl -0x1(%rdx,%r9), %r11d
movl %r11d, %ebx
andl $-0x40, %ebx
cmpl $0x80, %ebx
jne 0x25452
movzbl (%rdx,%r9), %ebx
movl %ebx, %ebp
andl $-0x40, %ebp
cmpl $0x80, %ebp
je 0x25526
decq %r8
incq %r9
jmp 0x2536e
movl %edi, (%rax)
addq $0x4, %rax
movq %rdx, %rdi
subq %r8, %rdi
incq %rdi
addq %r8, %rsi
decq %rsi
cmpq $0x4, %rsi
jb 0x25365
subl %r8d, %edx
incl %edx
andl $0x3, %edx
jne 0x25365
movl (%rdi), %edx
testl $0x80808080, %edx       # imm = 0x80808080
jne 0x25365
andl $0x7f, %edx
movl %edx, (%rax)
movzbl 0x1(%rdi), %edx
movl %edx, 0x4(%rax)
movzbl 0x2(%rdi), %edx
movl %edx, 0x8(%rax)
movzbl 0x3(%rdi), %edx
movl %edx, 0xc(%rax)
addq $0x10, %rax
addq $0x4, %rdi
addq $-0x4, %rsi
cmpq $0x3, %rsi
ja 0x2548a
jmp 0x25365
andl $0x1f, %edi
shll $0x6, %edi
andl $0x3f, %r11d
orl %edi, %r11d
movl %r11d, (%rax)
addq $0x4, %rax
subq %r8, %rdx
addq $0x2, %rdx
addq %r8, %rsi
addq $-0x2, %rsi
movq %rdx, %rdi
jmp 0x25365
shll $0xc, %edi
movzwl %di, %edi
andl $0x3f, %r11d
shll $0x6, %r11d
orl %edi, %r11d
andl $0x3f, %ebx
orl %r11d, %ebx
movl %ebx, (%rax)
addq $0x4, %rax
subq %r8, %rdx
addq $0x3, %rdx
addq %r8, %rsi
addq $-0x3, %rsi
movq %rdx, %rdi
jmp 0x25365
andl $0x7, %edi
shll $0x12, %edi
andl $0x3f, %r10d
shll $0xc, %r10d
orl %edi, %r10d
andl $0x3f, %r11d
shll $0x6, %r11d
orl %r10d, %r11d
andl $0x3f, %ebx
orl %r11d, %ebx
movl %ebx, (%rax)
addq $0x4, %rax
subq %r8, %rdx
addq $0x4, %rdx
addq %r8, %rsi
addq $-0x4, %rsi
movq %rdx, %rdi
jmp 0x25365
popq %rbx
popq %rbp
retq