// File: /workspace/github_c_makefile_star2_O1/lucvoo[P]sparse-dev/compile-i386.c
// Function: x86_expression
static struct storage *x86_expression(struct expression *expr)
{
	if (!expr)
		return NULL;

	if (!expr->ctype) {
		struct position *pos = &expr->pos;
		printf("\tno type at %s:%d:%d\n",
			stream_name(pos->stream),
			pos->line, pos->pos);
		return NULL;
	}

	switch (expr->type) {
	default:
		return NULL;
	case EXPR_CALL:
		return x86_call_expression(expr);

	case EXPR_ASSIGNMENT:
		return x86_assignment(expr);

	case EXPR_COMPARE:
		return emit_compare(expr);
	case EXPR_BINOP:
	case EXPR_COMMA:
	case EXPR_LOGICAL:
		return emit_binop(expr);
	case EXPR_PREOP:
		return x86_preop(expr);
	case EXPR_POSTOP:
		return emit_postop(expr);
	case EXPR_SYMBOL:
		return emit_symbol_expr_init(expr->symbol);
	case EXPR_DEREF:
	case EXPR_SIZEOF:
	case EXPR_ALIGNOF:
		warning(expr->pos, "invalid expression after evaluation");
		return NULL;
	case EXPR_CAST:
	case EXPR_FORCE_CAST:
	case EXPR_IMPLIED_CAST:
		return emit_cast_expr(expr);
	case EXPR_VALUE:
		return emit_value(expr);
	case EXPR_STRING:
		return emit_string_expr(expr);
	case EXPR_INITIALIZER:
		x86_initializer_expr(expr, expr->ctype);
		return NULL;
	case EXPR_SELECT:
		return emit_select_expr(expr);
	case EXPR_CONDITIONAL:
		return emit_conditional_expr(expr);
	case EXPR_STATEMENT:
		return x86_statement_expr(expr);
	case EXPR_LABEL:
		return x86_label_expr(expr);

	// None of these should exist as direct expressions: they are only
	// valid as sub-expressions of initializers.
	case EXPR_POS:
		warning(expr->pos, "unable to show plain initializer position expression");
		return NULL;
	case EXPR_IDENTIFIER:
		warning(expr->pos, "unable to show identifier expression");
		return NULL;
	case EXPR_INDEX:
		warning(expr->pos, "unable to show index expression");
		return NULL;
	case EXPR_TYPE:
		warning(expr->pos, "unable to show type expression");
		return NULL;
	case EXPR_FVALUE:
		warning(expr->pos, "floating point support is not implemented");
		return NULL;
	}
	return NULL;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
testq %rdi, %rdi
je 0x4207e
movq %rdi, %rbx
movq 0x10(%rdi), %rsi
testq %rsi, %rsi
je 0x41e9f
movzbl (%rbx), %eax
xorl %r12d, %r12d
decl %eax
cmpl $0x1b, %eax
ja 0x420c9
leaq 0xdb52(%rip), %rcx      # 0x4f8e0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x20(%rbx), %rdi
callq 0x41d4f
movq %rax, %r13
movq 0x28(%rbx), %rdi
callq 0x41d4f
movq %rax, %r15
movl 0x4(%rbx), %edi
cmpl $0x2f, %edi
je 0x41dc0
cmpl $0x25, %edi
jne 0x420db
movl $0x4, %edi
callq 0x42575
movq %rax, %r12
leaq 0xe472(%rip), %rdi      # 0x50246
xorl %eax, %eax
callq 0x4291c
leaq 0x29b6e(%rip), %rdi     # 0x6b950
movl $0x1, %esi
callq 0x42afa
movq $0x2, 0x8(%r12)
leaq 0x29a04(%rip), %rbp     # 0x6b800
movq %r12, %rdi
movq %rbp, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x4263e
movq 0x10(%rbx), %rax
movl 0x50(%rax), %eax
leal 0x7(%rax), %edi
testl %eax, %eax
cmovnsl %eax, %edi
sarl $0x3, %edi
callq 0x427bd
movq %rax, %r12
leaq 0x299a4(%rip), %r14     # 0x6b7d0
movq %r13, %rdi
movq %r14, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x4263e
leaq 0x29f86(%rip), %rsi     # 0x6bdc8
movq %r15, %rdi
callq 0x429d7
movq %rax, %r15
leaq 0x81e7(%rip), %rdi      # 0x4a03b
movq %rax, %rsi
movq %r14, %rdx
xorl %ecx, %ecx
callq 0x4259e
movq %r15, %rdi
callq 0x42a58
cmpl $0x25, 0x4(%rbx)
cmoveq %rbp, %r14
movq %r14, %rdi
movq %r12, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x4263e
leaq 0x29ac9(%rip), %rdi     # 0x6b950
callq 0x42a58
leaq 0xe3c0(%rip), %rdi      # 0x50253
xorl %eax, %eax
callq 0x4291c
jmp 0x420c9
movl 0x8(%rbx), %edi
shrl $0x6, %edi
andl $0x3fff, %edi           # imm = 0x3FFF
callq 0x21cd4
movq 0x8(%rbx), %rcx
movq %rcx, %rdx
shrq $0x20, %rdx
andl $0x7fffffff, %edx       # imm = 0x7FFFFFFF
shrl $0x16, %ecx
leaq 0x7259(%rip), %rdi      # 0x49124
xorl %r12d, %r12d
movq %rax, %rsi
xorl %eax, %eax
callq 0xe110
jmp 0x420c9
movq 0x8(%rbx), %rdi
leaq 0x7252(%rip), %rsi      # 0x4913a
jmp 0x420bf
movq 0x28(%rbx), %rdi
callq 0x41d4f
movq %rax, %r12
movq 0x20(%rbx), %r14
movq 0x28(%rbx), %rax
movq 0x10(%rax), %rdx
movl 0x50(%r14), %r15d
cmpl %r15d, 0x50(%rdx)
jge 0x420c9
leaq 0x298b6(%rip), %rbx     # 0x6b7d0
leaq 0xe3c4(%rip), %rcx      # 0x502e5
movq %r12, %rdi
movq %rbx, %rsi
callq 0x4263e
leal 0x7(%r15), %edi
testl %r15d, %r15d
cmovnsl %r15d, %edi
sarl $0x3, %edi
callq 0x427bd
movq %rax, %r12
leaq 0xe3aa(%rip), %rcx      # 0x502f3
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x4263e
jmp 0x420c9
movq 0x8(%rbx), %rdi
leaq 0xe0b4(%rip), %rsi      # 0x5001b
jmp 0x420bf
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x4359d
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x42f93
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x43180
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x4371d
movq 0x20(%rbx), %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x432f5
movq 0x20(%rbx), %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x4136e
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x42f04
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x437cd
movl $0x4, %edi
callq 0x42575
movq %rax, %r12
movq 0x20(%rbx), %rax
movq %rax, 0x20(%r12)
jmp 0x420c9
movq 0x8(%rbx), %rdi
leaq 0x711a(%rip), %rsi      # 0x4915e
jmp 0x420bf
movq 0x8(%rbx), %rdi
leaq 0x7187(%rip), %rsi      # 0x491d8
jmp 0x420bf
movq 0x8(%rbx), %rdi
leaq 0x7135(%rip), %rsi      # 0x49193
jmp 0x420bf
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x4335f
movq %rbx, %rdi
callq 0x433b6
xorl %r12d, %r12d
jmp 0x420c9
movq %rbx, %rdi
movl $0x1, %esi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x43940
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x42d1e
movq 0x8(%rbx), %rdi
leaq 0x70f9(%rip), %rsi      # 0x491b8
xorl %r12d, %r12d
xorl %eax, %eax
callq 0x11a38
movq %r12, %rax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x10(%rbx), %rcx
cmpb $0x3, (%rcx)
jne 0x420e8
movq 0x60(%rcx), %rcx
movb $0x1, %al
cmpb $0x4, (%rcx)
je 0x420f7
movb 0x69(%rcx), %al
andb $0x40, %al
shrb $0x6, %al
cmpl $0x7b, %edi
jg 0x42127
leal -0x26(%rdi), %ecx
cmpl $0x7, %ecx
ja 0x4215d
leaq 0xd845(%rip), %rdx      # 0x4f950
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
leaq 0x7f60(%rip), %rcx      # 0x4a07b
leaq 0xe038(%rip), %r12      # 0x5015a
jmp 0x421ce
leal -0x10c(%rdi), %ecx
cmpl $0x7, %ecx
ja 0x4216b
leaq 0xd837(%rip), %rdx      # 0x4f970
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
movq 0x8(%rbx), %rdi
leaq 0xe012(%rip), %rsi      # 0x5015f
xorl %eax, %eax
callq 0x11a38
leaq 0x966d(%rip), %r12      # 0x4b7c8
jmp 0x421d4
cmpl $0x5e, %edi
jne 0x42170
leaq 0x96b3(%rip), %r12      # 0x4b81c
jmp 0x421d4
cmpl $0x7c, %edi
je 0x421a5
callq 0x21d3a
movq 0x8(%rbx), %rdi
leaq 0xe071(%rip), %rsi      # 0x501f1
movq %rax, %rdx
xorl %eax, %eax
callq 0x11cd8
leaq 0x9622(%rip), %r12      # 0x4b7b3
jmp 0x421d4
movq 0x8(%rbx), %rdi
leaq 0xe00c(%rip), %rsi      # 0x501aa
xorl %eax, %eax
callq 0x11a38
leaq 0x9647(%rip), %r12      # 0x4b7f3
jmp 0x421d4
leaq 0xde92(%rip), %r12      # 0x50047
jmp 0x421d4
leaq 0x9649(%rip), %r12      # 0x4b807
jmp 0x421d4
leaq 0xdf8f(%rip), %rcx      # 0x50156
leaq 0xdf84(%rip), %r12      # 0x50152
testb %al, %al
cmovneq %rcx, %r12
leaq 0x29bed(%rip), %r14     # 0x6bdc8
movq %r15, %rdi
movq %r14, %rsi
callq 0x429d7
movq %rax, %r15
movq %r13, %rdi
movq %r14, %rsi
callq 0x429d7
movq %rax, %r14
movq 0x10(%rbx), %rax
movl 0x50(%rax), %eax
addl $-0x8, %eax
roll $0x1d, %eax
cmpl $0x8, %eax
jae 0x42296
movl $0x8b, %ecx
btl %eax, %ecx
jae 0x42296
movl %eax, %eax
leaq 0xd7ac(%rip), %rcx      # 0x4f9cc
movslq (%rcx,%rax,4), %r8
addq %rcx, %r8
leaq 0x3cb1(%rip), %rdx      # 0x45edf
movq %rsp, %r13
movl $0x10, %esi
movq %r13, %rdi
movq %r12, %rcx
xorl %eax, %eax
callq 0xe120
movq %r13, %rdi
movq %r14, %rsi
movq %r15, %rdx
xorl %ecx, %ecx
callq 0x4259e
movq %r14, %rdi
callq 0x42a58
movq 0x10(%rbx), %rax
movl 0x50(%rax), %eax
leal 0x7(%rax), %edi
testl %eax, %eax
cmovnsl %eax, %edi
sarl $0x3, %edi
callq 0x427bd
movq %rax, %r12
leaq 0xdfbb(%rip), %rcx      # 0x50237
movq %r15, %rdi
movq %rax, %rsi
xorl %edx, %edx
callq 0x4263e
movq %r15, %rdi
callq 0x42a58
jmp 0x420c9
leaq 0x6bf4(%rip), %rdi      # 0x48e91
leaq 0xd798(%rip), %rsi      # 0x4fa3c
leaq 0xdf5c(%rip), %rcx      # 0x50207
movl $0x58a, %edx            # imm = 0x58A
callq 0xe140