// File: /workspace/github_c_makefile_star2_O3/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 0x40fe6
movq %rdi, %rbx
movq 0x10(%rdi), %rsi
testq %rsi, %rsi
je 0x40e06
movzbl (%rbx), %eax
xorl %r12d, %r12d
decl %eax
cmpl $0x1b, %eax
ja 0x41031
leaq 0xdb82(%rip), %rcx      # 0x4e870
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x20(%rbx), %rdi
callq 0x40caf
movq %rax, %r14
movq 0x28(%rbx), %rdi
callq 0x40caf
movq %rax, %r15
movl 0x4(%rbx), %edi
cmpl $0x2f, %edi
je 0x40d20
cmpl $0x25, %edi
jne 0x41043
movl $0x4, %edi
callq 0x414f4
movq %rax, %r12
leaq 0xe4a2(%rip), %rdi      # 0x4f1d6
xorl %eax, %eax
callq 0x4189d
leaq 0x28c0e(%rip), %rdi     # 0x69950
movl $0x1, %esi
callq 0x41a77
movq $0x2, 0x8(%r12)
leaq 0x28aa4(%rip), %r13     # 0x69800
movq %r12, %rdi
movq %r13, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x415bd
movq 0x10(%rbx), %rax
movl 0x50(%rax), %eax
leal 0x7(%rax), %edi
testl %eax, %eax
cmovnsl %eax, %edi
sarl $0x3, %edi
callq 0x41736
movq %rax, %r12
leaq 0x28a44(%rip), %rbp     # 0x697d0
movq %r14, %rdi
movq %rbp, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x415bd
leaq 0x29026(%rip), %rsi     # 0x69dc8
movq %r15, %rdi
callq 0x41958
movq %rax, %r14
leaq 0x8247(%rip), %rdi      # 0x48ffb
movq %rax, %rsi
movq %rbp, %rdx
xorl %ecx, %ecx
callq 0x4151d
movq 0x10(%r14), %rax
movl 0x10(%rax), %edi
callq 0x419d9
cmpl $0x25, 0x4(%rbx)
cmoveq %r13, %rbp
movq %rbp, %rdi
movq %r12, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x415bd
movq 0x28b75(%rip), %rax     # 0x69960
movl 0x10(%rax), %edi
callq 0x419d9
leaq 0xe3e9(%rip), %rdi      # 0x4f1e3
xorl %eax, %eax
callq 0x4189d
jmp 0x41031
movl 0x8(%rbx), %edi
shrl $0x6, %edi
andl $0x3fff, %edi           # imm = 0x3FFF
callq 0x21b04
movq 0x8(%rbx), %rcx
movq %rcx, %rdx
shrq $0x20, %rdx
andl $0x7fffffff, %edx       # imm = 0x7FFFFFFF
shrl $0x16, %ecx
leaq 0x72b2(%rip), %rdi      # 0x480e4
xorl %r12d, %r12d
movq %rax, %rsi
xorl %eax, %eax
callq 0xe110
jmp 0x41031
movq 0x8(%rbx), %rdi
leaq 0x72ab(%rip), %rsi      # 0x480fa
jmp 0x41027
movq 0x28(%rbx), %rdi
callq 0x40caf
movq %rax, %r12
movq 0x20(%rbx), %r14
movq 0x28(%rbx), %rax
movq 0x10(%rax), %rdx
movl 0x50(%r14), %r15d
cmpl %r15d, 0x50(%rdx)
jge 0x41031
leaq 0x2894f(%rip), %rbx     # 0x697d0
leaq 0xe3ed(%rip), %rcx      # 0x4f275
movq %r12, %rdi
movq %rbx, %rsi
callq 0x415bd
leal 0x7(%r15), %edi
testl %r15d, %r15d
cmovnsl %r15d, %edi
sarl $0x3, %edi
callq 0x41736
movq %rax, %r12
leaq 0xe3d3(%rip), %rcx      # 0x4f283
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x415bd
jmp 0x41031
movq 0x8(%rbx), %rdi
leaq 0xe0dd(%rip), %rsi      # 0x4efab
jmp 0x41027
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x4251c
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x41f06
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x420fb
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x426a9
movq 0x20(%rbx), %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x42270
movq 0x20(%rbx), %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x402b1
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x41e77
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x42759
movl $0x4, %edi
callq 0x414f4
movq %rax, %r12
movq 0x20(%rbx), %rax
movq %rax, 0x20(%r12)
jmp 0x41031
movq 0x8(%rbx), %rdi
leaq 0x7173(%rip), %rsi      # 0x4811e
jmp 0x41027
movq 0x8(%rbx), %rdi
leaq 0x71e0(%rip), %rsi      # 0x48198
jmp 0x41027
movq 0x8(%rbx), %rdi
leaq 0x718e(%rip), %rsi      # 0x48153
jmp 0x41027
movq 0x28(%rbx), %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x422df
movq %rbx, %rdi
callq 0x42335
xorl %r12d, %r12d
jmp 0x41031
movq %rbx, %rdi
movl $0x1, %esi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x428d1
movq %rbx, %rdi
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x41ca1
movq 0x8(%rbx), %rdi
leaq 0x7151(%rip), %rsi      # 0x48178
xorl %r12d, %r12d
xorl %eax, %eax
callq 0x11a90
movq %r12, %rax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0x10(%rbx), %rcx
movzbl (%rcx), %edx
cmpl $0x3, %edx
jne 0x41056
movq 0x60(%rcx), %rcx
movzbl (%rcx), %edx
movb $0x1, %al
cmpl $0x4, %edx
je 0x41065
movb 0x69(%rcx), %al
andb $0x40, %al
shrb $0x6, %al
cmpl $0x7b, %edi
jg 0x41095
leal -0x26(%rdi), %ecx
cmpl $0x7, %ecx
ja 0x410cb
leaq 0xd867(%rip), %rdx      # 0x4e8e0
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
leaq 0x7fb2(%rip), %rcx      # 0x4903b
leaq 0xe05a(%rip), %r12      # 0x4f0ea
jmp 0x4113c
leal -0x10c(%rdi), %ecx
cmpl $0x7, %ecx
ja 0x410d9
leaq 0xd859(%rip), %rdx      # 0x4e900
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
movq 0x8(%rbx), %rdi
leaq 0xe034(%rip), %rsi      # 0x4f0ef
xorl %eax, %eax
callq 0x11a90
leaq 0x96bf(%rip), %r12      # 0x4a788
jmp 0x41142
cmpl $0x5e, %edi
jne 0x410de
leaq 0x9705(%rip), %r12      # 0x4a7dc
jmp 0x41142
cmpl $0x7c, %edi
je 0x41113
callq 0x21b6a
movq 0x8(%rbx), %rdi
leaq 0xe093(%rip), %rsi      # 0x4f181
movq %rax, %rdx
xorl %eax, %eax
callq 0x11d30
leaq 0x9674(%rip), %r12      # 0x4a773
jmp 0x41142
movq 0x8(%rbx), %rdi
leaq 0xe02e(%rip), %rsi      # 0x4f13a
xorl %eax, %eax
callq 0x11a90
leaq 0x9699(%rip), %r12      # 0x4a7b3
jmp 0x41142
leaq 0xdeb4(%rip), %r12      # 0x4efd7
jmp 0x41142
leaq 0x969b(%rip), %r12      # 0x4a7c7
jmp 0x41142
leaq 0xdfb1(%rip), %rcx      # 0x4f0e6
leaq 0xdfa6(%rip), %r12      # 0x4f0e2
testb %al, %al
cmovneq %rcx, %r12
leaq 0x28c7f(%rip), %r13     # 0x69dc8
movq %r15, %rdi
movq %r13, %rsi
callq 0x41958
movq %rax, %r15
movq %r14, %rdi
movq %r13, %rsi
callq 0x41958
movq %rax, %r14
movq 0x10(%rbx), %rax
movl 0x50(%rax), %eax
addl $-0x8, %eax
roll $0x1d, %eax
cmpl $0x8, %eax
jae 0x41210
movl $0x8b, %ecx
btl %eax, %ecx
jae 0x41210
movl %eax, %eax
leaq 0xd7ca(%rip), %rcx      # 0x4e95c
movslq (%rcx,%rax,4), %r8
addq %rcx, %r8
leaq 0x3d33(%rip), %rdx      # 0x44ed3
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 0x4151d
movq 0x10(%r14), %rax
movl 0x10(%rax), %edi
callq 0x419d9
movq 0x10(%rbx), %rax
movl 0x50(%rax), %eax
leal 0x7(%rax), %edi
testl %eax, %eax
cmovnsl %eax, %edi
sarl $0x3, %edi
callq 0x41736
movq %rax, %r12
leaq 0xdfd5(%rip), %rcx      # 0x4f1c7
movq %r15, %rdi
movq %rax, %rsi
xorl %edx, %edx
callq 0x415bd
movq 0x10(%r15), %rax
movl 0x10(%rax), %edi
callq 0x419d9
jmp 0x41031
leaq 0x6c2e(%rip), %rdi      # 0x47e45
leaq 0xd7ae(%rip), %rsi      # 0x4e9cc
leaq 0xdf72(%rip), %rcx      # 0x4f197
movl $0x58a, %edx            # imm = 0x58A
callq 0xe140