// File: tomfunkhouser[P]gaps/pkgs/jpeg/jdmarker.c
// Function: get_sof
LOCAL(jboolean)
get_sof (j_decompress_ptr cinfo, jboolean is_prog, jboolean is_arith)
/* Process a SOFn marker */
{
  INT32 length;
  int c, ci;
  jpeg_component_info * compptr;
  INPUT_VARS(cinfo);

  cinfo->progressive_mode = is_prog;
  cinfo->arith_code = is_arith;

  INPUT_2BYTES(cinfo, length, return FALSE);

  INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);
  INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE);
  INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE);
  INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);

  length -= 8;

  TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
	   (int) cinfo->image_width, (int) cinfo->image_height,
	   cinfo->num_components);

  if (cinfo->marker->saw_SOF)
    ERREXIT(cinfo, JERR_SOF_DUPLICATE);

  /* We don't support files in which the image height is initially specified */
  /* as 0 and is later redefined by DNL.  As long as we have to check that,  */
  /* might as well have a general sanity check. */
  if (cinfo->image_height <= 0 || cinfo->image_width <= 0
      || cinfo->num_components <= 0)
    ERREXIT(cinfo, JERR_EMPTY_IMAGE);

  if (length != (cinfo->num_components * 3))
    ERREXIT(cinfo, JERR_BAD_LENGTH);

  if (cinfo->comp_info == NULL)	/* do only once, even if suspend */
    cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
			((j_common_ptr) cinfo, JPOOL_IMAGE,
			 cinfo->num_components * SIZEOF(jpeg_component_info));
  
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
       ci++, compptr++) {
    compptr->component_index = ci;
    INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
    INPUT_BYTE(cinfo, c, return FALSE);
    compptr->h_samp_factor = (c >> 4) & 15;
    compptr->v_samp_factor = (c     ) & 15;
    INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);

    TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
	     compptr->component_id, compptr->h_samp_factor,
	     compptr->v_samp_factor, compptr->quant_tbl_no);
  }

  cinfo->marker->saw_SOF = TRUE;

  INPUT_SYNC(cinfo);
  return TRUE;
}

// Assembly:
subq $0x58, %rsp
movq %rdi, 0x48(%rsp)
movl %esi, 0x44(%rsp)
movl %edx, 0x40(%rsp)
movq 0x48(%rsp), %rax
movq 0x28(%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movl 0x44(%rsp), %ecx
movq 0x48(%rsp), %rax
movl %ecx, 0x138(%rax)
movl 0x40(%rsp), %ecx
movq 0x48(%rsp), %rax
movl %ecx, 0x13c(%rax)
cmpq $0x0, 0x10(%rsp)
jne 0xe6ddd
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe6dc2
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %eax
shll $0x8, %eax
movl %eax, %eax
movq %rax, 0x38(%rsp)
cmpq $0x0, 0x10(%rsp)
jne 0xe6e4e
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe6e33
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %eax
addq 0x38(%rsp), %rax
movq %rax, 0x38(%rsp)
jmp 0xe6e7c
cmpq $0x0, 0x10(%rsp)
jne 0xe6ec1
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe6ea6
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %ecx
movq 0x48(%rsp), %rax
movl %ecx, 0x128(%rax)
jmp 0xe6ef0
cmpq $0x0, 0x10(%rsp)
jne 0xe6f35
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe6f1a
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %ecx
shll $0x8, %ecx
movq 0x48(%rsp), %rax
movl %ecx, 0x34(%rax)
cmpq $0x0, 0x10(%rsp)
jne 0xe6fa7
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe6f8c
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %ecx
movq 0x48(%rsp), %rax
addl 0x34(%rax), %ecx
movl %ecx, 0x34(%rax)
jmp 0xe6fd6
cmpq $0x0, 0x10(%rsp)
jne 0xe701b
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe7000
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %ecx
shll $0x8, %ecx
movq 0x48(%rsp), %rax
movl %ecx, 0x30(%rax)
cmpq $0x0, 0x10(%rsp)
jne 0xe708d
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe7072
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %ecx
movq 0x48(%rsp), %rax
addl 0x30(%rax), %ecx
movl %ecx, 0x30(%rax)
jmp 0xe70bc
cmpq $0x0, 0x10(%rsp)
jne 0xe7101
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe70e6
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %ecx
movq 0x48(%rsp), %rax
movl %ecx, 0x38(%rax)
movq 0x38(%rsp), %rax
subq $0x8, %rax
movq %rax, 0x38(%rsp)
movq 0x48(%rsp), %rax
movq (%rax), %rax
addq $0x2c, %rax
movq %rax, 0x8(%rsp)
movq 0x48(%rsp), %rax
movl 0x21c(%rax), %ecx
movq 0x8(%rsp), %rax
movl %ecx, (%rax)
movq 0x48(%rsp), %rax
movl 0x30(%rax), %ecx
movq 0x8(%rsp), %rax
movl %ecx, 0x4(%rax)
movq 0x48(%rsp), %rax
movl 0x34(%rax), %ecx
movq 0x8(%rsp), %rax
movl %ecx, 0x8(%rax)
movq 0x48(%rsp), %rax
movl 0x38(%rax), %ecx
movq 0x8(%rsp), %rax
movl %ecx, 0xc(%rax)
movq 0x48(%rsp), %rax
movq (%rax), %rax
movl $0x64, 0x28(%rax)
movq 0x48(%rsp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq 0x48(%rsp), %rdi
movl $0x1, %esi
callq *%rax
movq 0x48(%rsp), %rax
movq 0x248(%rax), %rax
cmpl $0x0, 0x1c(%rax)
je 0xe71e6
movq 0x48(%rsp), %rax
movq (%rax), %rax
movl $0x3a, 0x28(%rax)
movq 0x48(%rsp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
movq 0x48(%rsp), %rax
cmpl $0x0, 0x34(%rax)
jbe 0xe7207
movq 0x48(%rsp), %rax
cmpl $0x0, 0x30(%rax)
jbe 0xe7207
movq 0x48(%rsp), %rax
cmpl $0x0, 0x38(%rax)
jg 0xe7228
movq 0x48(%rsp), %rax
movq (%rax), %rax
movl $0x20, 0x28(%rax)
movq 0x48(%rsp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
movq 0x38(%rsp), %rax
movq 0x48(%rsp), %rcx
imull $0x3, 0x38(%rcx), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
je 0xe725f
movq 0x48(%rsp), %rax
movq (%rax), %rax
movl $0xb, 0x28(%rax)
movq 0x48(%rsp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
movq 0x48(%rsp), %rax
cmpq $0x0, 0x130(%rax)
jne 0xe72a2
movq 0x48(%rsp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x48(%rsp), %rdi
movq 0x48(%rsp), %rcx
movslq 0x38(%rcx), %rcx
imulq $0x60, %rcx, %rdx
movl $0x1, %esi
callq *%rax
movq %rax, %rcx
movq 0x48(%rsp), %rax
movq %rcx, 0x130(%rax)
movl $0x0, 0x30(%rsp)
movq 0x48(%rsp), %rax
movq 0x130(%rax), %rax
movq %rax, 0x28(%rsp)
movl 0x30(%rsp), %eax
movq 0x48(%rsp), %rcx
cmpl 0x38(%rcx), %eax
jge 0xe74d7
movl 0x30(%rsp), %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x4(%rax)
cmpq $0x0, 0x10(%rsp)
jne 0xe731e
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe7303
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %ecx
movq 0x28(%rsp), %rax
movl %ecx, (%rax)
jmp 0xe7349
cmpq $0x0, 0x10(%rsp)
jne 0xe738e
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe7373
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %eax
movl %eax, 0x34(%rsp)
movl 0x34(%rsp), %ecx
sarl $0x4, %ecx
andl $0xf, %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x8(%rax)
movl 0x34(%rsp), %ecx
andl $0xf, %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0xc(%rax)
cmpq $0x0, 0x10(%rsp)
jne 0xe741a
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x48(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe73ff
movl $0x0, 0x54(%rsp)
jmp 0xe750d
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x18(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x18(%rsp)
movzbl (%rax), %ecx
movq 0x28(%rsp), %rax
movl %ecx, 0x10(%rax)
jmp 0xe7446
movq 0x48(%rsp), %rax
movq (%rax), %rax
addq $0x2c, %rax
movq %rax, (%rsp)
movq 0x28(%rsp), %rax
movl (%rax), %ecx
movq (%rsp), %rax
movl %ecx, (%rax)
movq 0x28(%rsp), %rax
movl 0x8(%rax), %ecx
movq (%rsp), %rax
movl %ecx, 0x4(%rax)
movq 0x28(%rsp), %rax
movl 0xc(%rax), %ecx
movq (%rsp), %rax
movl %ecx, 0x8(%rax)
movq 0x28(%rsp), %rax
movl 0x10(%rax), %ecx
movq (%rsp), %rax
movl %ecx, 0xc(%rax)
movq 0x48(%rsp), %rax
movq (%rax), %rax
movl $0x65, 0x28(%rax)
movq 0x48(%rsp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq 0x48(%rsp), %rdi
movl $0x1, %esi
callq *%rax
jmp 0xe74b9
movl 0x30(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x30(%rsp)
movq 0x28(%rsp), %rax
addq $0x60, %rax
movq %rax, 0x28(%rsp)
jmp 0xe72bb
movq 0x48(%rsp), %rax
movq 0x248(%rax), %rax
movl $0x1, 0x1c(%rax)
movq 0x18(%rsp), %rcx
movq 0x20(%rsp), %rax
movq %rcx, (%rax)
movq 0x10(%rsp), %rcx
movq 0x20(%rsp), %rax
movq %rcx, 0x8(%rax)
movl $0x1, 0x54(%rsp)
movl 0x54(%rsp), %eax
addq $0x58, %rsp
retq
nopw %cs:(%rax,%rax)