LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::bitcast_expression[abi:cxx11](spirv_cross::SPIRType::BaseType, unsigned int)
std::string CompilerGLSL::bitcast_expression(SPIRType::BaseType target_type, uint32_t arg)
{
	auto expr = to_expression(arg);
	auto &src_type = expression_type(arg);
	if (src_type.basetype != target_type)
	{
		auto target = src_type;
		target.basetype = target_type;
		expr = join(bitcast_glsl_op(target, src_type), "(", expr, ")");
	}

	return expr;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x118, %rsp            # imm = 0x118
movl %ecx, %r15d
movl %edx, %ebp
movq %rsi, %r14
movq %rdi, %rbx
movl %ecx, %edx
callq 0x345e6
movq %r14, %rdi
movl %r15d, %esi
callq 0x12aba
movq %rax, %r15
cmpl %ebp, 0xc(%rax)
je 0x40a91
leaq 0x40(%rsp), %rdi
movq %r15, %rsi
callq 0x1f216
leaq 0x40(%rsp), %rdx
movl %ebp, 0xc(%rdx)
movq (%r14), %rax
movq %rsp, %rdi
movq %r14, %rsi
movq %r15, %rcx
callq *0x168(%rax)
leaq 0x832fd(%rip), %rdx     # 0xc3ca1
leaq 0x7b07a(%rip), %r8      # 0xbba25
leaq 0x20(%rsp), %rdi
movq %rsp, %rsi
movq %rbx, %rcx
callq 0x55c9c
leaq 0x20(%rsp), %r14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x6310
movq (%r14), %rdi
leaq 0x30(%rsp), %rax
cmpq %rax, %rdi
je 0x409e5
movq 0x30(%rsp), %rsi
incq %rsi
callq 0x6260
leaq 0x10(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x40a00
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
leaq 0xbc9a9(%rip), %rax     # 0xfd3b0
addq $0x10, %rax
leaq 0xe0(%rsp), %r14
movq %rax, -0xa0(%r14)
movq %r14, %rdi
callq 0xdeb6
movq -0x38(%r14), %rdi
testq %rdi, %rdi
je 0x40a3b
movq 0xb8(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
movq 0x78(%rsp), %rdi
testq %rdi, %rdi
je 0x40a7a
movq 0x98(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
xorl %eax, %eax
movq %rax, 0x78(%rsp)
movl %eax, 0x80(%rsp)
movq %rax, 0x88(%rsp)
movl %eax, 0x90(%rsp)
movq %rax, 0x98(%rsp)
movq 0x60(%rsp), %rdi
testq %rdi, %rdi
je 0x40a91
movq 0x70(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
movq %rbx, %rax
addq $0x118, %rsp            # imm = 0x118
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %r14
leaq 0x10(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x40ac5
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x40ac5
movq %rax, %r14
leaq 0x40(%rsp), %rdi
callq 0x1c438
jmp 0x40ad6
jmp 0x40ad3
movq %rax, %r14
movq (%rbx), %rdi
addq $0x10, %rbx
cmpq %rbx, %rdi
je 0x40aed
movq (%rbx), %rsi
incq %rsi
callq 0x6260
movq %r14, %rdi
callq 0x64a0
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::to_array_size[abi:cxx11](spirv_cross::SPIRType const&, unsigned int)
string CompilerGLSL::to_array_size(const SPIRType &type, uint32_t index)
{
	assert(type.array.size() == type.array_size_literal.size());

	// Tessellation control shaders must have either gl_MaxPatchVertices or unsized arrays for input arrays.
	// Opt for unsized as it's the more "correct" variant to use.
	if (type.storage == StorageClassInput && get_entry_point().model == ExecutionModelTessellationControl)
		return "";

	auto &size = type.array[index];
	if (!type.array_size_literal[index])
		return to_expression(size);
	else if (size)
		return convert_to_string(size);
	else if (!backend.flexible_member_array_supported)
	{
		// For runtime-sized arrays, we can work around
		// lack of standard support for this by simply having
		// a single element array.
		//
		// Runtime length arrays must always be the last element
		// in an interface block.
		return "1";
	}
	else
		return "";
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movl %ecx, %r15d
movq %rdx, %r12
movq 0x28(%rdx), %rax
movq 0x48(%rdx), %rcx
subq 0x20(%rdx), %rax
sarq $0x2, %rax
movl 0x50(%rdx), %edx
subq 0x38(%r12), %rcx
leaq (%rdx,%rcx,8), %rcx
cmpq %rcx, %rax
jne 0x4220c
movq %rsi, %r14
movq %rdi, %rbx
cmpl $0x1, 0x64(%r12)
jne 0x4212c
movq %r14, %rdi
callq 0x16254
cmpl $0x1, 0xb8(%rax)
jne 0x4212c
leaq 0x10(%rbx), %rax
movq %rax, (%rbx)
jmp 0x421bb
movl %r15d, %eax
movq 0x20(%r12), %rcx
movq 0x38(%r12), %rdx
movl %r15d, %esi
shrl $0x6, %esi
movq (%rdx,%rsi,8), %rdx
btq %r15, %rdx
movl (%rcx,%rax,4), %ebp
jae 0x4219b
testl %ebp, %ebp
je 0x421aa
movl $0x1, %eax
cmpl $0xa, %ebp
jb 0x421e0
movl $0x4, %eax
movl $0xd1b71759, %ecx       # imm = 0xD1B71759
movl %ebp, %edx
cmpl $0x63, %edx
jbe 0x421d9
cmpl $0x3e7, %edx            # imm = 0x3E7
jbe 0x421de
cmpl $0x2710, %edx           # imm = 0x2710
jb 0x421e0
movl %edx, %esi
imulq %rcx, %rsi
shrq $0x2d, %rsi
addl $0x4, %eax
cmpl $0x1869f, %edx          # imm = 0x1869F
movl %esi, %edx
ja 0x4216a
addl $-0x3, %eax
jmp 0x421e0
movq %rbx, %rdi
movq %r14, %rsi
movl %ebp, %edx
callq 0x345e6
jmp 0x42200
leaq 0x10(%rbx), %rax
cmpb $0x0, 0x622(%r14)
movq %rax, (%rbx)
je 0x421c9
movq $0x0, 0x8(%rbx)
movb $0x0, 0x10(%rbx)
jmp 0x42200
movw $0x31, 0x10(%rbx)
movq $0x1, 0x8(%rbx)
jmp 0x42200
addl $-0x2, %eax
jmp 0x421e0
decl %eax
movl %eax, %esi
leaq 0x10(%rbx), %rax
movq %rax, (%rbx)
movq %rbx, %rdi
xorl %edx, %edx
callq 0x62f0
movq (%rbx), %rdi
movl 0x8(%rbx), %esi
movl %ebp, %edx
callq 0x21251
movq %rbx, %rax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
leaq 0x793c5(%rip), %rdi     # 0xbb5d8
leaq 0x75b3e(%rip), %rsi     # 0xb7d58
leaq 0x79447(%rip), %rcx     # 0xbb668
movl $0x214a, %edx           # imm = 0x214A
callq 0x61b0
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::variable_decl_function_local[abi:cxx11](spirv_cross::SPIRVariable&)
string CompilerGLSL::variable_decl_function_local(SPIRVariable &var)
{
	// These variables are always function local,
	// so make sure we emit the variable without storage qualifiers.
	// Some backends will inject custom variables locally in a function
	// with a storage qualifier which is not function-local.
	auto old_storage = var.storage;
	var.storage = StorageClassFunction;
	auto expr = variable_decl(var);
	var.storage = old_storage;
	return expr;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
movq %rdx, %rbx
movq %rdi, %r14
movl 0x10(%rdx), %ebp
movl $0x7, 0x10(%rdx)
callq 0x2ce16
movl %ebp, 0x10(%rbx)
movq %r14, %rax
popq %rbx
popq %r14
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::end_scope()
void CompilerGLSL::end_scope()
{
	if (!indent)
		SPIRV_CROSS_THROW("Popping empty indent stack.");
	indent--;
	statement("}");
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x28, %rsp
movl 0x638(%rdi), %eax
testl %eax, %eax
je 0x435bc
decl %eax
movl %eax, 0x638(%rdi)
leaq 0x75bec(%rip), %rsi     # 0xb9199
addq $0x28, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
jmp 0x5a5fc
movl $0x10, %edi
callq 0x6140
movq %rax, %rbx
leaq 0x18(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0x78610(%rip), %rsi     # 0xbbbe9
leaq 0x78624(%rip), %rdx     # 0xbbc04
leaq 0x8(%rsp), %rdi
callq 0x7c64
movb $0x1, %bpl
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x6320
leaq 0xb9797(%rip), %rax     # 0xfcd98
addq $0x10, %rax
movq %rax, (%rbx)
xorl %ebp, %ebp
leaq 0xb976f(%rip), %rsi     # 0xfcd80
movq 0xba9c0(%rip), %rdx     # 0xfdfd8
movq %rbx, %rdi
callq 0x6470
movq %rax, %r14
movq 0x8(%rsp), %rdi
cmpq %r15, %rdi
je 0x43642
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x43642
movq %rax, %r14
movb $0x1, %bpl
testb %bpl, %bpl
je 0x4364f
movq %rbx, %rdi
callq 0x6200
movq %r14, %rdi
callq 0x64a0
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::args_will_forward(unsigned int, unsigned int const*, unsigned int, bool)
bool CompilerGLSL::args_will_forward(uint32_t id, const uint32_t *args, uint32_t num_args, bool pure)
{
	if (forced_temporaries.find(id) != end(forced_temporaries))
		return false;

	for (uint32_t i = 0; i < num_args; i++)
		if (!should_forward(args[i]))
			return false;

	// We need to forward globals as well.
	if (!pure)
	{
		for (auto global : global_variables)
			if (!should_forward(global))
				return false;
		for (auto aliased : aliased_variables)
			if (!should_forward(aliased))
				return false;
	}

	return true;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movl %r8d, %ebp
movl %ecx, %r15d
movq %rdx, %r14
movq %rdi, %rbx
movl %esi, %eax
movq 0x228(%rdi), %rdi
movq 0x230(%rbx), %r8
xorl %r10d, %r10d
xorl %edx, %edx
divq %r8
movq (%rdi,%rdx,8), %rax
testq %rax, %rax
je 0x441d1
movq (%rax), %r9
movq %rax, %r10
cmpl %esi, 0x8(%r9)
je 0x441d1
movq %rdx, %rcx
movq %r9, %r11
movq (%r9), %r9
testq %r9, %r9
je 0x441ce
movl 0x8(%r9), %edi
movq %rdi, %rax
xorl %edx, %edx
divq %r8
movl $0x0, %r10d
cmpq %rcx, %rdx
jne 0x441d1
movq %r11, %r10
cmpl %esi, %edi
jne 0x441a3
jmp 0x441d1
xorl %r10d, %r10d
testq %r10, %r10
je 0x441e0
cmpq $0x0, (%r10)
jne 0x442ce
testl %r15d, %r15d
setne %r12b
je 0x4422b
movl (%r14), %esi
movq %rbx, %rdi
callq 0x39e96
testb %al, %al
je 0x44222
movl %r15d, %r15d
leaq -0x1(%r15), %r13
xorl %r12d, %r12d
cmpq %r12, %r13
je 0x4422b
movl 0x4(%r14,%r12,4), %esi
movq %rbx, %rdi
callq 0x39e96
incq %r12
testb %al, %al
jne 0x44202
cmpq %r15, %r12
setb %r12b
testb %r12b, %r12b
jne 0x442ce
testb %bpl, %bpl
jne 0x442ca
movq 0x118(%rbx), %r14
movq 0x120(%rbx), %r15
cmpq %r15, %r14
sete %bpl
je 0x4427f
movl (%r14), %esi
movq %rbx, %rdi
callq 0x39e96
testb %al, %al
je 0x4427a
addq $0x4, %r14
cmpq %r15, %r14
sete %bpl
je 0x4427f
movl (%r14), %esi
movq %rbx, %rdi
callq 0x39e96
addq $0x4, %r14
testb %al, %al
jne 0x4425e
testb %bpl, %bpl
je 0x442ce
movq 0x130(%rbx), %r14
movq 0x138(%rbx), %r15
cmpq %r15, %r14
sete %bpl
je 0x442ca
movl (%r14), %esi
movq %rbx, %rdi
callq 0x39e96
testb %al, %al
je 0x442c5
addq $0x4, %r14
cmpq %r15, %r14
sete %bpl
je 0x442ca
movl (%r14), %esi
movq %rbx, %rdi
callq 0x39e96
addq $0x4, %r14
testb %al, %al
jne 0x442a9
testb %bpl, %bpl
je 0x442ce
movb $0x1, %al
jmp 0x442d0
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::register_impure_function_call()
void CompilerGLSL::register_impure_function_call()
{
	// Impure functions can modify globals and aliased variables, so invalidate them as well.
	for (auto global : global_variables)
		flush_dependees(get<SPIRVariable>(global));
	for (auto aliased : aliased_variables)
		flush_dependees(get<SPIRVariable>(aliased));
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq 0x118(%rdi), %r14
movq 0x120(%rdi), %r15
cmpq %r15, %r14
je 0x44317
movl (%r14), %esi
movq %rbx, %rdi
callq 0xb40a
movq %rbx, %rdi
movq %rax, %rsi
callq 0x12f40
addq $0x4, %r14
jmp 0x442f6
movq 0x130(%rbx), %r14
movq 0x138(%rbx), %r15
cmpq %r15, %r14
je 0x44346
movl (%r14), %esi
movq %rbx, %rdi
callq 0xb40a
movq %rbx, %rdi
movq %rax, %rsi
callq 0x12f40
addq $0x4, %r14
jmp 0x44325
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::flush_variable_declaration(unsigned int)
void CompilerGLSL::flush_variable_declaration(uint32_t id)
{
	auto *var = maybe_get<SPIRVariable>(id);
	if (var && var->deferred_declaration)
	{
		statement(variable_decl_function_local(*var), ";");
		var->deferred_declaration = false;
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x28, %rsp
movq %rdi, %r14
callq 0xc7f4
testq %rax, %rax
je 0x443bd
movq %rax, %rbx
cmpb $0x1, 0x59(%rax)
jne 0x443bd
movl 0x10(%rbx), %ebp
movl $0x7, 0x10(%rbx)
leaq 0x8(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
movq %rbx, %rdx
callq 0x2ce16
movl %ebp, 0x10(%rbx)
leaq 0x7b756(%rip), %rdx     # 0xbfae9
movq %r14, %rdi
movq %r15, %rsi
callq 0xaa50
leaq 0x18(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x443b9
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
movb $0x0, 0x59(%rbx)
addq $0x28, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq 0x18(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x443e6
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
movq %rbx, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::emit_block_instructions(spirv_cross::SPIRBlock&)
void CompilerGLSL::emit_block_instructions(SPIRBlock &block)
{
	current_emitting_block = &block;
	for (auto &op : block.ops)
		emit_instruction(op);
	current_emitting_block = nullptr;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq %rsi, 0x410(%rdi)
movq 0x38(%rsi), %r14
movq 0x40(%rsi), %r15
cmpq %r15, %r14
je 0x44b22
movq (%rbx), %rax
movq %rbx, %rdi
movq %r14, %rsi
callq *0x48(%rax)
addq $0xc, %r14
jmp 0x44b0b
movq $0x0, 0x410(%rbx)
popq %rbx
popq %r14
popq %r15
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::append_global_func_args(spirv_cross::SPIRFunction const&, unsigned int, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>&)
void CompilerGLSL::append_global_func_args(const SPIRFunction &func, uint32_t index, vector<string> &arglist)
{
	auto &args = func.arguments;
	uint32_t arg_cnt = uint32_t(args.size());
	for (uint32_t arg_idx = index; arg_idx < arg_cnt; arg_idx++)
	{
		auto &arg = args[arg_idx];
		assert(arg.alias_global_variable);

		// If the underlying variable needs to be declared
		// (ie. a local variable with deferred declaration), do so now.
		uint32_t var_id = get<SPIRVariable>(arg.id).basevariable;
		if (var_id)
			flush_variable_declaration(var_id);

		arglist.push_back(to_func_call_arg(arg.id));
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rcx, (%rsp)
movq 0x20(%rsi), %rcx
subq 0x18(%rsi), %rcx
sarq $0x2, %rcx
movabsq $-0x3333333333333333, %rax # imm = 0xCCCCCCCCCCCCCCCD
imulq %rcx, %rax
cmpl %edx, %eax
jbe 0x4b90f
movq %rsi, %r14
movq %rdi, %r15
movl %edx, %ecx
movl %eax, %ebp
leaq (%rcx,%rcx,4), %rax
leaq 0x4(,%rax,4), %r13
subq %rcx, %rbp
leaq 0x8(%rsp), %r12
movq 0x18(%r14), %rbx
cmpb $0x0, 0xc(%rbx,%r13)
je 0x4b91e
movl (%rbx,%r13), %esi
movq %r15, %rdi
callq 0xb40a
movl 0x1c(%rax), %esi
testl %esi, %esi
je 0x4b8cb
movq %r15, %rdi
callq 0x4434c
movl (%rbx,%r13), %edx
movq (%r15), %rax
movq %r12, %rdi
movq %r15, %rsi
callq *0xd0(%rax)
movq (%rsp), %rdi
movq %r12, %rsi
callq 0xebe6
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x4b906
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
addq $0x14, %r13
decq %rbp
jne 0x4b8a4
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x6fbce(%rip), %rdi     # 0xbb4f3
leaq 0x6c42c(%rip), %rsi     # 0xb7d58
leaq 0x6fbda(%rip), %rcx     # 0xbb50d
movl $0x2013, %edx           # imm = 0x2013
callq 0x61b0
movq %rax, %rbx
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x4b95c
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
movq %rbx, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::check_function_call_constraints(unsigned int const*, unsigned int)
void CompilerGLSL::check_function_call_constraints(const uint32_t *args, uint32_t length)
{
	// If our variable is remapped, and we rely on type-remapping information as
	// well, then we cannot pass the variable as a function parameter.
	// Fixing this is non-trivial without stamping out variants of the same function,
	// so for now warn about this and suggest workarounds instead.
	for (uint32_t i = 0; i < length; i++)
	{
		auto *var = maybe_get<SPIRVariable>(args[i]);
		if (!var || !var->remapped_variable)
			continue;

		auto &type = get<SPIRType>(var->basetype);
		if (type.basetype == SPIRType::Image && type.image.dim == DimSubpassData)
		{
			SPIRV_CROSS_THROW("Tried passing a remapped subpassInput variable to a function. "
			                  "This will not work correctly because type-remapping information is lost. "
			                  "To workaround, please consider not passing the subpass input as a function parameter, "
			                  "or use in/out variables instead which do not need type remapping information.");
		}
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x20, %rsp
testl %edx, %edx
je 0x4b9b9
movq %rsi, %rbx
movq %rdi, %r14
movl %edx, %r15d
xorl %r12d, %r12d
movl (%rbx,%r12,4), %esi
movq %r14, %rdi
callq 0xc7f4
testq %rax, %rax
je 0x4b9b1
cmpb $0x1, 0x5b(%rax)
jne 0x4b9b1
movl 0xc(%rax), %esi
movq %r14, %rdi
callq 0xa426
cmpl $0xd, 0xc(%rax)
jne 0x4b9b1
cmpl $0x6, 0x84(%rax)
je 0x4b9c6
incq %r12
cmpq %r12, %r15
jne 0x4b980
addq $0x20, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
movl $0x10, %edi
callq 0x6140
movq %rax, %rbx
leaq 0x10(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0x70225(%rip), %rsi     # 0xbbc08
leaq 0x70348(%rip), %rdx     # 0xbbd32
movq %rsp, %rdi
callq 0x7c64
movb $0x1, %bpl
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x6320
leaq 0xb1391(%rip), %rax     # 0xfcd98
addq $0x10, %rax
movq %rax, (%rbx)
xorl %ebp, %ebp
leaq 0xb1369(%rip), %rsi     # 0xfcd80
movq 0xb25ba(%rip), %rdx     # 0xfdfd8
movq %rbx, %rdi
callq 0x6470
movq %rax, %r14
movq (%rsp), %rdi
cmpq %r15, %rdi
je 0x4ba47
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x4ba47
movq %rax, %r14
movb $0x1, %bpl
testb %bpl, %bpl
je 0x4ba54
movq %rbx, %rdi
callq 0x6200
movq %r14, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::check_atomic_image(unsigned int)
bool CompilerGLSL::check_atomic_image(uint32_t id)
{
	auto &type = expression_type(id);
	if (type.storage == StorageClassImage)
	{
		if (options.es && options.version < 320)
			require_extension_internal("GL_OES_shader_image_atomic");

		auto *var = maybe_get_backing_variable(id);
		if (var)
		{
			auto &flags = ir.meta.at(var->self).decoration.decoration_flags;
			if (flags.get(DecorationNonWritable) || flags.get(DecorationNonReadable))
			{
				flags.clear(DecorationNonWritable);
				flags.clear(DecorationNonReadable);
				force_recompile = true;
			}
		}
		return true;
	}
	else
		return false;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x20, %rsp
movl %esi, %ebp
movq %rdi, %rbx
callq 0x12aba
movl 0x64(%rax), %r15d
cmpl $0xb, %r15d
jne 0x4bb39
cmpb $0x1, 0x43c(%rbx)
jne 0x4bad9
cmpl $0x13f, 0x438(%rbx)     # imm = 0x13F
ja 0x4bad9
leaq 0x10(%rsp), %r12
movq %r12, -0x10(%r12)
leaq 0x6fe81(%rip), %rsi     # 0xbb927
leaq 0x6fe94(%rip), %rdx     # 0xbb941
movq %rsp, %r14
movq %r14, %rdi
callq 0x7c64
movq %rbx, %rdi
movq %r14, %rsi
callq 0x26a0a
movq (%rsp), %rdi
cmpq %r12, %rdi
je 0x4bad9
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
movq %rbx, %rdi
movl %ebp, %esi
callq 0x12cda
testq %rax, %rax
je 0x4bb39
movl 0x8(%rax), %esi
movq 0x38(%rbx), %rax
movq 0x40(%rbx), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
movabsq $-0x7063e7063e7063e7, %rdx # imm = 0x8F9C18F9C18F9C19
imulq %rcx, %rdx
cmpq %rsi, %rdx
jbe 0x4bb4d
imulq $0x148, %rsi, %rdx      # imm = 0x148
movq 0x60(%rax,%rdx), %rcx
testl $0x3000000, %ecx        # imm = 0x3000000
je 0x4bb39
addq %rdx, %rax
addq $0x60, %rax
andq $-0x3000001, %rcx       # imm = 0xFCFFFFFF
movq %rcx, (%rax)
movb $0x1, 0x1d0(%rbx)
cmpl $0xb, %r15d
sete %al
addq $0x20, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
leaq 0x695c5(%rip), %rdi     # 0xb5119
xorl %eax, %eax
callq 0x63d0
movq %rax, %rbx
movq (%rsp), %rdi
cmpq %r12, %rdi
je 0x4bb74
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
movq %rbx, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::get_next_instruction_in_block(spirv_cross::Instruction const&)
const Instruction *CompilerGLSL::get_next_instruction_in_block(const Instruction &instr)
{
	// FIXME: This is kind of hacky. There should be a cleaner way.
	auto offset = uint32_t(&instr - current_emitting_block->ops.data());
	if ((offset + 1) < current_emitting_block->ops.size())
		return &current_emitting_block->ops[offset + 1];
	else
		return nullptr;
}

// Assembly:
movq 0x410(%rdi), %rax
movq 0x38(%rax), %rcx
movq 0x40(%rax), %rax
subq %rcx, %rsi
shrq $0x2, %rsi
imull $0xaaaaaaab, %esi, %edx # imm = 0xAAAAAAAB
incl %edx
subq %rcx, %rax
sarq $0x2, %rax
movabsq $-0x5555555555555555, %rsi # imm = 0xAAAAAAAAAAAAAAAB
imulq %rax, %rsi
xorl %eax, %eax
cmpq %rsi, %rdx
leaq (%rdx,%rdx,2), %rdx
leaq (%rcx,%rdx,4), %rcx
cmovbq %rcx, %rax
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::is_non_native_row_major_matrix(unsigned int)
bool CompilerGLSL::is_non_native_row_major_matrix(uint32_t id)
{
	// Natively supported row-major matrices do not need to be converted.
	// Legacy targets do not support row major.
	if (backend.native_row_major_matrix && !is_legacy())
		return false;

	// Non-matrix or column-major matrix types do not need to be converted.
	if (!ir.meta[id].decoration.decoration_flags.get(DecorationRowMajor))
		return false;

	// Only square row-major matrices can be converted at this time.
	// Converting non-square matrices will require defining custom GLSL function that
	// swaps matrix elements while retaining the original dimensional form of the matrix.
	const auto type = expression_type(id);
	if (type.columns != type.vecsize)
		SPIRV_CROSS_THROW("Row-major matrices must be square on this platform.");

	return true;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0xf8, %rsp
cmpb $0x1, 0x628(%rdi)
jne 0x4bd16
cmpb $0x0, 0x43c(%rdi)
movl $0x12b, %eax            # imm = 0x12B
movl $0x81, %ecx
cmovnel %eax, %ecx
cmpl %ecx, 0x438(%rdi)
ja 0x4bd2a
movl %esi, %eax
movq 0x38(%rdi), %rcx
imulq $0x148, %rax, %rax      # imm = 0x148
testb $0x10, 0x60(%rcx,%rax)
jne 0x4bd31
xorl %eax, %eax
jmp 0x4bdd6
callq 0x12aba
leaq 0x20(%rsp), %rbx
movq %rbx, %rdi
movq %rax, %rsi
callq 0x1f216
movl 0x18(%rbx), %eax
cmpl 0x14(%rbx), %eax
jne 0x4bde4
leaq 0xb1657(%rip), %rax     # 0xfd3b0
addq $0x10, %rax
leaq 0xc0(%rsp), %rbx
movq %rax, -0xa0(%rbx)
movq %rbx, %rdi
callq 0xdeb6
movq -0x38(%rbx), %rdi
testq %rdi, %rdi
je 0x4bd8d
movq 0x98(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
movq 0x58(%rsp), %rdi
testq %rdi, %rdi
je 0x4bdbd
movq 0x78(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
xorl %eax, %eax
movq %rax, 0x58(%rsp)
movl %eax, 0x60(%rsp)
movq %rax, 0x68(%rsp)
movl %eax, 0x70(%rsp)
movq %rax, 0x78(%rsp)
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x4bdd4
movq 0x50(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
movb $0x1, %al
addq $0xf8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
movl $0x10, %edi
callq 0x6140
movq %rax, %rbx
leaq 0x10(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0x6f779(%rip), %rsi     # 0xbb57a
leaq 0x6f7a5(%rip), %rdx     # 0xbb5ad
movq %rsp, %rdi
callq 0x7c64
movb $0x1, %bpl
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x6320
leaq 0xb0f73(%rip), %rax     # 0xfcd98
addq $0x10, %rax
movq %rax, (%rbx)
xorl %ebp, %ebp
leaq 0xb0f4b(%rip), %rsi     # 0xfcd80
movq 0xb219c(%rip), %rdx     # 0xfdfd8
movq %rbx, %rdi
callq 0x6470
movq %rax, %r14
movq (%rsp), %rdi
cmpq %r15, %rdi
je 0x4be65
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x4be65
movq %rax, %r14
movb $0x1, %bpl
testb %bpl, %bpl
je 0x4be72
movq %rbx, %rdi
callq 0x6200
leaq 0x20(%rsp), %rdi
callq 0x1c438
movq %r14, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::member_is_non_native_row_major_matrix(spirv_cross::SPIRType const&, unsigned int)
bool CompilerGLSL::member_is_non_native_row_major_matrix(const SPIRType &type, uint32_t index)
{
	// Natively supported row-major matrices do not need to be converted.
	if (backend.native_row_major_matrix && !is_legacy())
		return false;

	// Non-matrix or column-major matrix types do not need to be converted.
	if (!combined_decoration_for_member(type, index).get(DecorationRowMajor))
		return false;

	// Only square row-major matrices can be converted at this time.
	// Converting non-square matrices will require defining custom GLSL function that
	// swaps matrix elements while retaining the original dimensional form of the matrix.
	const auto mbr_type = get<SPIRType>(type.member_types[index]);
	if (mbr_type.columns != mbr_type.vecsize)
		SPIRV_CROSS_THROW("Row-major matrices must be square on this platform.");

	return true;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0xf8, %rsp
movl %edx, %ebp
movq %rsi, %r14
movq %rdi, %rbx
cmpb $0x1, 0x628(%rdi)
jne 0x4bebe
cmpb $0x0, 0x43c(%rbx)
movl $0x12b, %eax            # imm = 0x12B
movl $0x81, %ecx
cmovnel %eax, %ecx
cmpl %ecx, 0x438(%rbx)
ja 0x4bee6
leaq 0x20(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
movq %r14, %rdx
movl %ebp, %ecx
callq 0x1b67c
movb (%r15), %r15b
leaq 0x28(%rsp), %rdi
callq 0xd5b0
testb $0x10, %r15b
jne 0x4beed
xorl %eax, %eax
jmp 0x4bf9e
movl %ebp, %eax
movq 0x68(%r14), %rcx
movl (%rcx,%rax,4), %esi
movq %rbx, %rdi
callq 0xa426
leaq 0x20(%rsp), %rbx
movq %rbx, %rdi
movq %rax, %rsi
callq 0x1f216
movl 0x18(%rbx), %eax
cmpl 0x14(%rbx), %eax
jne 0x4bfac
leaq 0xb148f(%rip), %rax     # 0xfd3b0
addq $0x10, %rax
leaq 0xc0(%rsp), %rbx
movq %rax, -0xa0(%rbx)
movq %rbx, %rdi
callq 0xdeb6
movq -0x38(%rbx), %rdi
testq %rdi, %rdi
je 0x4bf55
movq 0x98(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
movq 0x58(%rsp), %rdi
testq %rdi, %rdi
je 0x4bf85
movq 0x78(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
xorl %eax, %eax
movq %rax, 0x58(%rsp)
movl %eax, 0x60(%rsp)
movq %rax, 0x68(%rsp)
movl %eax, 0x70(%rsp)
movq %rax, 0x78(%rsp)
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x4bf9c
movq 0x50(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
movb $0x1, %al
addq $0xf8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
movl $0x10, %edi
callq 0x6140
movq %rax, %rbx
leaq 0x10(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0x6f5b1(%rip), %rsi     # 0xbb57a
leaq 0x6f5dd(%rip), %rdx     # 0xbb5ad
movq %rsp, %rdi
callq 0x7c64
movb $0x1, %bpl
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x6320
leaq 0xb0dab(%rip), %rax     # 0xfcd98
addq $0x10, %rax
movq %rax, (%rbx)
xorl %ebp, %ebp
leaq 0xb0d83(%rip), %rsi     # 0xfcd80
movq 0xb1fd4(%rip), %rdx     # 0xfdfd8
movq %rbx, %rdi
callq 0x6470
movq %rax, %r14
movq (%rsp), %rdi
cmpq %r15, %rdi
je 0x4c02d
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x4c02d
movq %rax, %r14
movb $0x1, %bpl
testb %bpl, %bpl
je 0x4c03a
movq %rbx, %rdi
callq 0x6200
leaq 0x20(%rsp), %rdi
callq 0x1c438
movq %r14, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::argument_decl[abi:cxx11](spirv_cross::SPIRFunction::Parameter const&)
string CompilerGLSL::argument_decl(const SPIRFunction::Parameter &arg)
{
	// glslangValidator seems to make all arguments pointer no matter what which is rather bizarre ...
	auto &type = expression_type(arg.id);
	const char *direction = "";

	if (type.pointer)
	{
		if (arg.write_count && arg.read_count)
			direction = "inout ";
		else if (arg.write_count)
			direction = "out ";
	}

	return join(direction, to_qualifiers_glsl(arg.id), variable_decl(type, to_name(arg.id), arg.id));
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x68, %rsp
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
movl 0x4(%rdx), %esi
movq %r14, %rdi
callq 0x12aba
movq %rax, %r12
leaq 0x691b2(%rip), %rax     # 0xb58af
movq %rax, (%rsp)
cmpb $0x1, 0x60(%r12)
jne 0x4c730
movl 0xc(%r15), %eax
testl %eax, %eax
je 0x4c721
cmpl $0x0, 0x8(%r15)
je 0x4c721
leaq 0x6eeb2(%rip), %rax     # 0xbb5d1
jmp 0x4c72c
testl %eax, %eax
je 0x4c730
leaq 0x6eea7(%rip), %rax     # 0xbb5d3
movq %rax, (%rsp)
movl 0x4(%r15), %edx
movq (%r14), %rax
leaq 0x48(%rsp), %rdi
movq %r14, %rsi
callq *0x128(%rax)
movl 0x4(%r15), %edx
movq (%r14), %rax
leaq 0x8(%rsp), %rdi
movq %r14, %rsi
movl $0x1, %ecx
callq *0x38(%rax)
movl 0x4(%r15), %r8d
movq (%r14), %rax
leaq 0x28(%rsp), %rdi
leaq 0x8(%rsp), %rcx
movq %r14, %rsi
movq %r12, %rdx
callq *0xc8(%rax)
movq %rsp, %rsi
leaq 0x48(%rsp), %rdx
leaq 0x28(%rsp), %rcx
movq %rbx, %rdi
callq 0x588fb
leaq 0x38(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x4c7a9
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x6260
leaq 0x18(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x4c7c4
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
leaq 0x58(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x4c7df
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x6260
movq %rbx, %rax
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
movq %rax, %rbx
leaq 0x38(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x4c811
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x4c811
movq %rax, %rbx
leaq 0x18(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x4c831
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x4c831
movq %rax, %rbx
leaq 0x58(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x4c84c
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x6260
movq %rbx, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::to_pls_qualifiers_glsl(spirv_cross::SPIRVariable const&)
const char *CompilerGLSL::to_pls_qualifiers_glsl(const SPIRVariable &variable)
{
	auto flags = ir.meta[variable.self].decoration.decoration_flags;
	if (flags.get(DecorationRelaxedPrecision))
		return "mediump ";
	else
		return "highp ";
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x48, %rsp
movl 0x8(%rsi), %eax
movq 0x38(%rdi), %rcx
imulq $0x148, %rax, %rax      # imm = 0x148
leaq (%rcx,%rax), %rsi
addq $0x68, %rsi
movq -0x8(%rsi), %rax
leaq 0x10(%rsp), %rbx
movq %rax, -0x8(%rbx)
xorl %eax, %eax
movq %rax, (%rbx)
movq 0x8(%rsi), %rcx
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movq 0x18(%rsi), %rcx
movq %rcx, 0x18(%rbx)
movups 0x20(%rsi), %xmm0
movups %xmm0, 0x20(%rbx)
movq %rax, 0x30(%rbx)
movq %rsp, %rdx
movq %rbx, (%rdx)
movq %rbx, %rdi
callq 0xd402
testb $0x1, -0x8(%rbx)
leaq 0x6ecf4(%rip), %rax     # 0xbb5c2
leaq 0x6ece4(%rip), %r14     # 0xbb5b9
cmoveq %rax, %r14
movq %rbx, %rdi
callq 0xd5b0
movq %r14, %rax
addq $0x48, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::emit_fixup()
void CompilerGLSL::emit_fixup()
{
	auto &execution = get_entry_point();
	if (execution.model == ExecutionModelVertex)
	{
		if (options.vertex.fixup_clipspace)
		{
			const char *suffix = backend.float_literal_suffix ? "f" : "";
			statement("gl_Position.z = 2.0", suffix, " * gl_Position.z - gl_Position.w;");
		}

		if (options.vertex.flip_vert_y)
			statement("gl_Position.y = -gl_Position.y;");
	}
}

// Assembly:
pushq %rbx
subq $0x10, %rsp
movq %rdi, %rbx
callq 0x16254
cmpl $0x0, 0xb8(%rax)
jne 0x4ebfe
cmpb $0x1, 0x442(%rbx)
jne 0x4ebe6
leaq 0x690ae(%rip), %rax     # 0xb7c64
leaq 0x66cf2(%rip), %rcx     # 0xb58af
cmpb $0x0, 0x600(%rbx)
cmovneq %rax, %rcx
leaq 0x8(%rsp), %rdx
movq %rcx, (%rdx)
leaq 0x6cd6b(%rip), %rsi     # 0xbb942
leaq 0x6cd78(%rip), %rcx     # 0xbb956
movq %rbx, %rdi
callq 0x58ee2
cmpb $0x1, 0x443(%rbx)
jne 0x4ebfe
leaq 0x6cd82(%rip), %rsi     # 0xbb978
movq %rbx, %rdi
callq 0x58fec
addq $0x10, %rsp
popq %rbx
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::flush_phi_required(unsigned int, unsigned int)
bool CompilerGLSL::flush_phi_required(uint32_t from, uint32_t to)
{
	auto &child = get<SPIRBlock>(to);
	for (auto &phi : child.phi_variables)
		if (phi.parent == from)
			return true;
	return false;
}

// Assembly:
pushq %rbx
movl %esi, %ebx
movl %edx, %esi
callq 0x78fe
movq 0x50(%rax), %rdx
movq 0x58(%rax), %rcx
cmpq %rcx, %rdx
setne %al
je 0x4ec3b
cmpl %ebx, 0x4(%rdx)
je 0x4ec3b
addq $0xc, %rdx
cmpq %rcx, %rdx
setne %al
je 0x4ec3b
leaq 0xc(%rdx), %rsi
cmpl %ebx, 0x4(%rdx)
movq %rsi, %rdx
jne 0x4ec27
popq %rbx
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::flush_phi(unsigned int, unsigned int)
void CompilerGLSL::flush_phi(uint32_t from, uint32_t to)
{
	auto &child = get<SPIRBlock>(to);

	for (auto &phi : child.phi_variables)
	{
		if (phi.parent == from)
		{
			auto &var = get<SPIRVariable>(phi.function_variable);

			// A Phi variable might be a loop variable, so flush to static expression.
			if (var.loop_variable && !var.loop_variable_enable)
				var.static_expression = phi.local_variable;
			else
			{
				flush_variable_declaration(phi.function_variable);

				// This might be called in continue block, so make sure we
				// use this to emit ESSL 1.0 compliant increments/decrements.
				auto lhs = to_expression(phi.function_variable);
				auto rhs = to_expression(phi.local_variable);
				if (!optimize_read_modify_write(get<SPIRType>(var.basetype), lhs, rhs))
					statement(lhs, " = ", rhs, ";");
			}

			register_write(phi.function_variable);
		}
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movl %esi, %ebx
movq %rdi, %r14
movl %edx, %esi
callq 0x78fe
movq 0x50(%rax), %rbp
movq 0x58(%rax), %r15
cmpq %r15, %rbp
je 0x4ed59
leaq 0x28(%rsp), %r12
cmpl %ebx, 0x4(%rbp)
jne 0x4ed4c
movl 0x8(%rbp), %esi
movq %r14, %rdi
callq 0xb40a
movq %rax, %r13
cmpb $0x1, 0x64(%rax)
jne 0x4ec96
cmpb $0x0, 0x65(%r13)
je 0x4ed3a
movl 0x8(%rbp), %esi
movq %r14, %rdi
callq 0x4434c
movl 0x8(%rbp), %edx
leaq 0x8(%rsp), %rdi
movq %r14, %rsi
callq 0x345e6
movl (%rbp), %edx
movq %r12, %rdi
movq %r14, %rsi
callq 0x345e6
movl 0xc(%r13), %esi
movq %r14, %rdi
callq 0xa426
movq %r14, %rdi
movq %rax, %rsi
leaq 0x8(%rsp), %rdx
movq %r12, %rcx
callq 0x44958
testb %al, %al
jne 0x4ed00
movq %r14, %rdi
leaq 0x8(%rsp), %rsi
leaq 0x70d61(%rip), %rdx     # 0xbfa52
movq %r12, %rcx
leaq 0x70dee(%rip), %r8      # 0xbfae9
callq 0x561de
movq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
cmpq %rax, %rdi
je 0x4ed1c
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x6260
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x4ed41
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x4ed41
movl (%rbp), %eax
movl %eax, 0x3c(%r13)
movl 0x8(%rbp), %esi
movq %r14, %rdi
callq 0x12e52
addq $0xc, %rbp
cmpq %r15, %rbp
jne 0x4ec6e
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
jmp 0x4ed8c
movq %rax, %rbx
movq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
cmpq %rax, %rdi
je 0x4ed8c
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x6260
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x4eda8
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
movq %rbx, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::propagate_loop_dominators(spirv_cross::SPIRBlock const&)
void CompilerGLSL::propagate_loop_dominators(const SPIRBlock &block)
{
	// Propagate down the loop dominator block, so that dominated blocks can back trace.
	if (block.merge == SPIRBlock::MergeLoop || block.loop_dominator)
	{
		uint32_t dominator = block.merge == SPIRBlock::MergeLoop ? block.self : block.loop_dominator;

		auto set_dominator = [this](uint32_t self, uint32_t new_dominator) {
			auto &dominated_block = this->get<SPIRBlock>(self);

			// If we already have a loop dominator, we're trying to break out to merge targets
			// which should not update the loop dominator.
			if (!dominated_block.loop_dominator)
				dominated_block.loop_dominator = new_dominator;
		};

		// After merging a loop, we inherit the loop dominator always.
		if (block.merge_block)
			set_dominator(block.merge_block, block.loop_dominator);

		if (block.true_block)
			set_dominator(block.true_block, dominator);
		if (block.false_block)
			set_dominator(block.false_block, dominator);
		if (block.next_block)
			set_dominator(block.next_block, dominator);
		if (block.default_block)
			set_dominator(block.default_block, dominator);

		for (auto &c : block.cases)
			set_dominator(c.block, dominator);

		// In older glslang output continue_block can be == loop header.
		if (block.continue_block && block.continue_block != block.self)
			set_dominator(block.continue_block, dominator);
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movl 0x10(%rsi), %eax
movl 0xb4(%rsi), %r15d
cmpl $0x1, %eax
setne %cl
testl %r15d, %r15d
sete %dl
testb %dl, %cl
jne 0x4f506
movq %rsi, %r14
movq %rdi, %rbx
leaq 0xb4(%rsi), %rcx
leaq 0x8(%rsi), %rdx
cmpl $0x1, %eax
cmoveq %rdx, %rcx
movl (%rcx), %ebp
movl 0x1c(%rsi), %esi
testl %esi, %esi
je 0x4f431
movq %rbx, %rdi
callq 0x78fe
cmpl $0x0, 0xb4(%rax)
jne 0x4f431
movl %r15d, 0xb4(%rax)
movl 0x2c(%r14), %esi
testl %esi, %esi
je 0x4f450
movq %rbx, %rdi
callq 0x78fe
cmpl $0x0, 0xb4(%rax)
jne 0x4f450
movl %ebp, 0xb4(%rax)
movl 0x30(%r14), %esi
testl %esi, %esi
je 0x4f46f
movq %rbx, %rdi
callq 0x78fe
cmpl $0x0, 0xb4(%rax)
jne 0x4f46f
movl %ebp, 0xb4(%rax)
movl 0x18(%r14), %esi
testl %esi, %esi
je 0x4f48e
movq %rbx, %rdi
callq 0x78fe
cmpl $0x0, 0xb4(%rax)
jne 0x4f48e
movl %ebp, 0xb4(%rax)
movl 0x34(%r14), %esi
testl %esi, %esi
je 0x4f4ad
movq %rbx, %rdi
callq 0x78fe
cmpl $0x0, 0xb4(%rax)
jne 0x4f4ad
movl %ebp, 0xb4(%rax)
movq 0x98(%r14), %r15
movq 0xa0(%r14), %r12
cmpq %r12, %r15
je 0x4f4e1
movl 0x4(%r15), %esi
movq %rbx, %rdi
callq 0x78fe
cmpl $0x0, 0xb4(%rax)
jne 0x4f4db
movl %ebp, 0xb4(%rax)
addq $0x8, %r15
jmp 0x4f4bb
movl 0x20(%r14), %esi
testl %esi, %esi
je 0x4f506
cmpl 0x8(%r14), %esi
je 0x4f506
movq %rbx, %rdi
callq 0x78fe
cmpl $0x0, 0xb4(%rax)
jne 0x4f506
movl %ebp, 0xb4(%rax)
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::flush_undeclared_variables(spirv_cross::SPIRBlock&)
void CompilerGLSL::flush_undeclared_variables(SPIRBlock &block)
{
	// Enforce declaration order for regression testing purposes.
	sort(begin(block.dominated_variables), end(block.dominated_variables));

	for (auto &v : block.dominated_variables)
	{
		auto &var = get<SPIRVariable>(v);
		if (var.deferred_declaration)
			statement(variable_decl(var), ";");
		var.deferred_declaration = false;
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movq 0xb8(%rsi), %r15
movq 0xc0(%rsi), %r12
cmpq %r12, %r15
je 0x50454
movq %r12, %rax
subq %r15, %rax
sarq $0x2, %rax
bsrq %rax, %rdx
xorl $0x3f, %edx
addl %edx, %edx
xorq $0x7e, %rdx
movq %r15, %rdi
movq %r12, %rsi
callq 0x21b53
movq %r15, %rdi
movq %r12, %rsi
callq 0x21c36
movq 0xb8(%r14), %r13
movq 0xc0(%r14), %rbp
cmpq %rbp, %r13
je 0x504cf
leaq 0x8(%rsp), %r14
leaq 0x6f676(%rip), %r15     # 0xbfae9
movl (%r13), %esi
movq %rbx, %rdi
callq 0xb40a
movq %rax, %r12
cmpb $0x1, 0x59(%rax)
jne 0x504c0
movq %r14, %rdi
movq %rbx, %rsi
movq %r12, %rdx
callq 0x2ce16
movq %rbx, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0xaa50
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x504c0
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
movb $0x0, 0x59(%r12)
addq $0x4, %r13
cmpq %rbp, %r13
jne 0x50473
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x504fd
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
movq %rbx, %rdi
callq 0x64a0
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::bitcast_from_builtin_load(unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, spirv_cross::SPIRType const&)
void CompilerGLSL::bitcast_from_builtin_load(uint32_t source_id, std::string &expr,
                                             const spirv_cross::SPIRType &expr_type)
{
	auto *var = maybe_get_backing_variable(source_id);
	if (var)
		source_id = var->self;

	// Only interested in standalone builtin variables.
	if (!has_decoration(source_id, DecorationBuiltIn))
		return;

	auto builtin = static_cast<BuiltIn>(get_decoration(source_id, DecorationBuiltIn));
	auto expected_type = expr_type.basetype;

	// TODO: Fill in for more builtins.
	switch (builtin)
	{
	case BuiltInLayer:
	case BuiltInPrimitiveId:
	case BuiltInViewportIndex:
	case BuiltInInstanceId:
	case BuiltInInstanceIndex:
	case BuiltInVertexId:
	case BuiltInVertexIndex:
	case BuiltInSampleId:
	case BuiltInBaseVertex:
	case BuiltInBaseInstance:
	case BuiltInDrawIndex:
		expected_type = SPIRType::Int;
		break;

	case BuiltInGlobalInvocationId:
	case BuiltInLocalInvocationId:
	case BuiltInWorkgroupId:
	case BuiltInLocalInvocationIndex:
	case BuiltInWorkgroupSize:
	case BuiltInNumWorkgroups:
		expected_type = SPIRType::UInt;
		break;

	default:
		break;
	}

	if (expected_type != expr_type.basetype)
		expr = bitcast_expression(expr_type, expected_type, expr);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x20, %rsp
movq %rcx, %r14
movq %rdx, %rbx
movl %esi, %ebp
movq %rdi, %r15
callq 0x12cda
testq %rax, %rax
je 0x508f4
movl 0x8(%rax), %ebp
movq %r15, %rdi
movl %ebp, %esi
movl $0xb, %edx
callq 0x1299a
testb %al, %al
je 0x50996
movq %r15, %rdi
movl %ebp, %esi
movl $0xb, %edx
callq 0x14ff6
movl 0xc(%r14), %edx
cmpl $0x2b, %eax
ja 0x50947
movl %eax, %ecx
movabsq $0xc00000406e0, %rsi    # imm = 0xC00000406E0
btq %rcx, %rsi
jb 0x50953
movl $0x3f000000, %esi       # imm = 0x3F000000
btq %rcx, %rsi
jae 0x50947
movl $0x5, %ecx
jmp 0x50958
addl $0xffffeeb8, %eax       # imm = 0xFFFFEEB8
movl %edx, %ecx
cmpl $0x3, %eax
jae 0x50958
movl $0x4, %ecx
cmpl %edx, %ecx
je 0x50996
movq %rsp, %r12
movq %r12, %rdi
movq %r15, %rsi
movq %r14, %rdx
movq %rbx, %r8
callq 0x3e3d8
movq %rbx, %rdi
movq %r12, %rsi
callq 0x6310
movq (%r12), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x50996
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
addq $0x20, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_glsl.cpp
// Function: spirv_cross::CompilerGLSL::bitcast_to_builtin_store(unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, spirv_cross::SPIRType const&)
void CompilerGLSL::bitcast_to_builtin_store(uint32_t target_id, std::string &expr,
                                            const spirv_cross::SPIRType &expr_type)
{
	// Only interested in standalone builtin variables.
	if (!has_decoration(target_id, DecorationBuiltIn))
		return;

	auto builtin = static_cast<BuiltIn>(get_decoration(target_id, DecorationBuiltIn));
	auto expected_type = expr_type.basetype;

	// TODO: Fill in for more builtins.
	switch (builtin)
	{
	case BuiltInLayer:
	case BuiltInPrimitiveId:
	case BuiltInViewportIndex:
		expected_type = SPIRType::Int;
		break;

	default:
		break;
	}

	if (expected_type != expr_type.basetype)
	{
		auto type = expr_type;
		type.basetype = expected_type;
		expr = bitcast_expression(type, expr_type.basetype, expr);
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x100, %rsp            # imm = 0x100
movq %rcx, %r15
movq %rdx, %rbx
movl %esi, %ebp
movq %rdi, %r14
movl $0xb, %edx
callq 0x1299a
testb %al, %al
je 0x50ae1
movq %r14, %rdi
movl %ebp, %esi
movl $0xb, %edx
callq 0x14ff6
movl 0xc(%r15), %ecx
movl %ecx, %ebp
cmpl $0xa, %eax
ja 0x509fb
movl $0x680, %edx            # imm = 0x680
btl %eax, %edx
movl %ecx, %ebp
jae 0x509fb
movl $0x4, %ebp
cmpl %ecx, %ebp
je 0x50ae1
leaq 0x28(%rsp), %r12
movq %r12, %rdi
movq %r15, %rsi
callq 0x1f216
movl %ebp, 0xc(%r12)
movl 0xc(%r15), %ecx
leaq 0x8(%rsp), %rdi
movq %r14, %rsi
movq %r12, %rdx
movq %rbx, %r8
callq 0x3e3d8
leaq 0x8(%rsp), %r14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x6310
movq (%r14), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x50a59
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
leaq 0xac950(%rip), %rax     # 0xfd3b0
addq $0x10, %rax
leaq 0xc8(%rsp), %rbx
movq %rax, -0xa0(%rbx)
movq %rbx, %rdi
callq 0xdeb6
movq -0x38(%rbx), %rdi
testq %rdi, %rdi
je 0x50a94
movq 0xa0(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
movq 0x60(%rsp), %rdi
testq %rdi, %rdi
je 0x50aca
movq 0x80(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
xorl %eax, %eax
movq %rax, 0x60(%rsp)
movl %eax, 0x68(%rsp)
movq %rax, 0x70(%rsp)
movl %eax, 0x78(%rsp)
movq %rax, 0x80(%rsp)
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0x50ae1
movq 0x58(%rsp), %rsi
subq %rdi, %rsi
callq 0x6260
addq $0x100, %rsp            # imm = 0x100
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq 0x28(%rsp), %rdi
callq 0x1c438
movq %rbx, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_common.hpp
// Function: spirv_cross::merge(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>> const&)
inline std::string merge(const std::vector<std::string> &list)
{
	std::string s;
	for (auto &elem : list)
	{
		s += elem;
		if (&elem != &list.back())
			s += ", ";
	}
	return s;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
leaq 0x10(%rdi), %r12
movq %r12, (%rdi)
movq $0x0, 0x8(%rdi)
movb $0x0, 0x10(%rdi)
movq (%rsi), %r13
movq 0x8(%rsi), %rbp
cmpq %rbp, %r13
je 0x51cda
movq %rsi, %r14
leaq 0x69412(%rip), %r15     # 0xbb0bb
movq (%r13), %rsi
movq 0x8(%r13), %rdx
movq %rbx, %rdi
callq 0x60b0
movq 0x8(%r14), %rax
addq $-0x20, %rax
cmpq %rax, %r13
je 0x51cd1
movq %rbx, %rdi
movq %r15, %rsi
callq 0x64e0
addq $0x20, %r13
cmpq %rbp, %r13
jne 0x51ca9
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %r14
movq (%rbx), %rdi
cmpq %r12, %rdi
je 0x51d03
movq (%r12), %rsi
incq %rsi
callq 0x6260
movq %r14, %rdi
callq 0x64a0
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_hlsl.cpp
// Function: spirv_cross::CompilerHLSL::emit_header()
void CompilerHLSL::emit_header()
{
	for (auto &header : header_lines)
		statement(header);

	if (header_lines.size() > 0)
	{
		statement("");
	}
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq 0x738(%rdi), %r14
movq 0x740(%rdi), %r15
cmpq %r15, %r14
je 0x6435e
movq %rbx, %rdi
movq %r14, %rsi
callq 0xb674
addq $0x20, %r14
jmp 0x64348
movq 0x740(%rbx), %rax
cmpq 0x738(%rbx), %rax
je 0x64382
leaq 0x5153a(%rip), %rsi     # 0xb58af
movq %rbx, %rdi
popq %rbx
popq %r14
popq %r15
jmp 0xa700
popq %rbx
popq %r14
popq %r15
retq