// File: tomfunkhouser[P]gaps/pkgs/jpeg/jdmarker.c
// Function: get_sos
LOCAL(jboolean)
get_sos (j_decompress_ptr cinfo)
/* Process a SOS marker */
{
  INT32 length;
  int i, ci, n, c, cc;
  jpeg_component_info * compptr;
  INPUT_VARS(cinfo);

  if (! cinfo->marker->saw_SOF)
    ERREXIT(cinfo, JERR_SOS_NO_SOF);

  INPUT_2BYTES(cinfo, length, return FALSE);

  INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */

  TRACEMS1(cinfo, 1, JTRC_SOS, n);

  if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)
    ERREXIT(cinfo, JERR_BAD_LENGTH);

  cinfo->comps_in_scan = n;

  /* Collect the component-spec parameters */

  for (i = 0; i < n; i++) {
    INPUT_BYTE(cinfo, cc, return FALSE);
    INPUT_BYTE(cinfo, c, return FALSE);
    
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
	 ci++, compptr++) {
      if (cc == compptr->component_id)
	goto id_found;
    }

    ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);

  id_found:

    cinfo->cur_comp_info[i] = compptr;
    compptr->dc_tbl_no = (c >> 4) & 15;
    compptr->ac_tbl_no = (c     ) & 15;
    
    TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
	     compptr->dc_tbl_no, compptr->ac_tbl_no);
  }

  /* Collect the additional scan parameters Ss, Se, Ah/Al. */
  INPUT_BYTE(cinfo, c, return FALSE);
  cinfo->Ss = c;
  INPUT_BYTE(cinfo, c, return FALSE);
  cinfo->Se = c;
  INPUT_BYTE(cinfo, c, return FALSE);
  cinfo->Ah = (c >> 4) & 15;
  cinfo->Al = (c     ) & 15;

  TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
	   cinfo->Ah, cinfo->Al);

  /* Prepare to scan data & restart markers */
  cinfo->marker->next_restart_num = 0;

  /* Count another SOS marker */
  cinfo->input_scan_number++;

  INPUT_SYNC(cinfo);
  return TRUE;
}

// Assembly:
subq $0x68, %rsp
movq %rdi, 0x58(%rsp)
movq 0x58(%rsp), %rax
movq 0x28(%rax), %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x58(%rsp), %rax
movq 0x248(%rax), %rax
cmpl $0x0, 0x1c(%rax)
jne 0xe7585
movq 0x58(%rsp), %rax
movq (%rax), %rax
movl $0x3e, 0x28(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
jmp 0xe7587
cmpq $0x0, 0x18(%rsp)
jne 0xe75cc
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe75b1
movl $0x0, 0x64(%rsp)
jmp 0xe7bd5
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rsp)
movzbl (%rax), %eax
shll $0x8, %eax
movl %eax, %eax
movq %rax, 0x50(%rsp)
cmpq $0x0, 0x18(%rsp)
jne 0xe763d
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe7622
movl $0x0, 0x64(%rsp)
jmp 0xe7bd5
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rsp)
movzbl (%rax), %eax
addq 0x50(%rsp), %rax
movq %rax, 0x50(%rsp)
jmp 0xe766b
cmpq $0x0, 0x18(%rsp)
jne 0xe76b0
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe7695
movl $0x0, 0x64(%rsp)
jmp 0xe7bd5
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rsp)
movzbl (%rax), %eax
movl %eax, 0x44(%rsp)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movl $0x67, 0x28(%rax)
movl 0x44(%rsp), %ecx
movq 0x58(%rsp), %rax
movq (%rax), %rax
movl %ecx, 0x2c(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq 0x58(%rsp), %rdi
movl $0x1, %esi
callq *%rax
movq 0x50(%rsp), %rax
movl 0x44(%rsp), %ecx
shll %ecx
addl $0x6, %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
jne 0xe7730
cmpl $0x1, 0x44(%rsp)
jl 0xe7730
cmpl $0x4, 0x44(%rsp)
jle 0xe7751
movq 0x58(%rsp), %rax
movq (%rax), %rax
movl $0xb, 0x28(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
movl 0x44(%rsp), %ecx
movq 0x58(%rsp), %rax
movl %ecx, 0x1b0(%rax)
movl $0x0, 0x4c(%rsp)
movl 0x4c(%rsp), %eax
cmpl 0x44(%rsp), %eax
jge 0xe7980
jmp 0xe7778
cmpq $0x0, 0x18(%rsp)
jne 0xe77bd
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe77a2
movl $0x0, 0x64(%rsp)
jmp 0xe7bd5
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rsp)
movzbl (%rax), %eax
movl %eax, 0x3c(%rsp)
jmp 0xe77e5
cmpq $0x0, 0x18(%rsp)
jne 0xe782a
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe780f
movl $0x0, 0x64(%rsp)
jmp 0xe7bd5
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rsp)
movzbl (%rax), %eax
movl %eax, 0x40(%rsp)
movl $0x0, 0x48(%rsp)
movq 0x58(%rsp), %rax
movq 0x130(%rax), %rax
movq %rax, 0x30(%rsp)
movl 0x48(%rsp), %eax
movq 0x58(%rsp), %rcx
cmpl 0x38(%rcx), %eax
jge 0xe78a3
movl 0x3c(%rsp), %eax
movq 0x30(%rsp), %rcx
cmpl (%rcx), %eax
jne 0xe7886
jmp 0xe78d3
jmp 0xe7888
movl 0x48(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x48(%rsp)
movq 0x30(%rsp), %rax
addq $0x60, %rax
movq %rax, 0x30(%rsp)
jmp 0xe7869
movq 0x58(%rsp), %rax
movq (%rax), %rax
movl $0x5, 0x28(%rax)
movl 0x3c(%rsp), %ecx
movq 0x58(%rsp), %rax
movq (%rax), %rax
movl %ecx, 0x2c(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
movq 0x30(%rsp), %rdx
movq 0x58(%rsp), %rax
movslq 0x4c(%rsp), %rcx
movq %rdx, 0x1b8(%rax,%rcx,8)
movl 0x40(%rsp), %ecx
sarl $0x4, %ecx
andl $0xf, %ecx
movq 0x30(%rsp), %rax
movl %ecx, 0x14(%rax)
movl 0x40(%rsp), %ecx
andl $0xf, %ecx
movq 0x30(%rsp), %rax
movl %ecx, 0x18(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
addq $0x2c, %rax
movq %rax, 0x10(%rsp)
movl 0x3c(%rsp), %ecx
movq 0x10(%rsp), %rax
movl %ecx, (%rax)
movq 0x30(%rsp), %rax
movl 0x14(%rax), %ecx
movq 0x10(%rsp), %rax
movl %ecx, 0x4(%rax)
movq 0x30(%rsp), %rax
movl 0x18(%rax), %ecx
movq 0x10(%rsp), %rax
movl %ecx, 0x8(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movl $0x68, 0x28(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq 0x58(%rsp), %rdi
movl $0x1, %esi
callq *%rax
jmp 0xe7970
movl 0x4c(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x4c(%rsp)
jmp 0xe7768
jmp 0xe7982
cmpq $0x0, 0x18(%rsp)
jne 0xe79c7
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe79ac
movl $0x0, 0x64(%rsp)
jmp 0xe7bd5
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rsp)
movzbl (%rax), %eax
movl %eax, 0x40(%rsp)
movl 0x40(%rsp), %ecx
movq 0x58(%rsp), %rax
movl %ecx, 0x20c(%rax)
cmpq $0x0, 0x18(%rsp)
jne 0xe7a41
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe7a26
movl $0x0, 0x64(%rsp)
jmp 0xe7bd5
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rsp)
movzbl (%rax), %eax
movl %eax, 0x40(%rsp)
movl 0x40(%rsp), %ecx
movq 0x58(%rsp), %rax
movl %ecx, 0x210(%rax)
cmpq $0x0, 0x18(%rsp)
jne 0xe7abb
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x58(%rsp), %rdi
callq *%rax
cmpl $0x0, %eax
jne 0xe7aa0
movl $0x0, 0x64(%rsp)
jmp 0xe7bd5
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
addq $-0x1, %rax
movq %rax, 0x18(%rsp)
movq 0x20(%rsp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, 0x20(%rsp)
movzbl (%rax), %eax
movl %eax, 0x40(%rsp)
movl 0x40(%rsp), %ecx
sarl $0x4, %ecx
andl $0xf, %ecx
movq 0x58(%rsp), %rax
movl %ecx, 0x214(%rax)
movl 0x40(%rsp), %ecx
andl $0xf, %ecx
movq 0x58(%rsp), %rax
movl %ecx, 0x218(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
addq $0x2c, %rax
movq %rax, 0x8(%rsp)
movq 0x58(%rsp), %rax
movl 0x20c(%rax), %ecx
movq 0x8(%rsp), %rax
movl %ecx, (%rax)
movq 0x58(%rsp), %rax
movl 0x210(%rax), %ecx
movq 0x8(%rsp), %rax
movl %ecx, 0x4(%rax)
movq 0x58(%rsp), %rax
movl 0x214(%rax), %ecx
movq 0x8(%rsp), %rax
movl %ecx, 0x8(%rax)
movq 0x58(%rsp), %rax
movl 0x218(%rax), %ecx
movq 0x8(%rsp), %rax
movl %ecx, 0xc(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movl $0x69, 0x28(%rax)
movq 0x58(%rsp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq 0x58(%rsp), %rdi
movl $0x1, %esi
callq *%rax
movq 0x58(%rsp), %rax
movq 0x248(%rax), %rax
movl $0x0, 0x20(%rax)
movq 0x58(%rsp), %rax
movl 0xac(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0xac(%rax)
movq 0x20(%rsp), %rcx
movq 0x28(%rsp), %rax
movq %rcx, (%rax)
movq 0x18(%rsp), %rcx
movq 0x28(%rsp), %rax
movq %rcx, 0x8(%rax)
movl $0x1, 0x64(%rsp)
movl 0x64(%rsp), %eax
addq $0x68, %rsp
retq
nop