// File: /workspace/github_c_makefile_star2_O1/AK6DN[P]dec-utilities-for-pdp/macro8x/macro8x.c
// Function: getExpr
SYM_T *getExpr()
{
  delimiter = line[lexterm];

  if( line[lexstart] == '-' )
  {
    nextLexBlank();
    sym_getexpr = *(eval());
    sym_getexpr.val = ( - sym_getexpr.val );
  }
  else
  {
    sym_getexpr = *(eval());
  }


  if( is_blank( delimiter ))
  {
    return( &sym_getexpr );
  }

  /* Here we assume the current lexeme is the operator separating the         */
  /* previous operator from the next, if any.                                 */
  while( TRUE )
  {
    /* assert line[lexstart] == delimiter                                     */
    if( is_blank( delimiter ))
    {
      return( &sym_getexpr );
    }

    switch( line[lexstart] )
    {
    case '+':                   /* add                                        */
      nextLexBlank();           /* skip over the operator                     */
      sym_getexpr.val += (eval())->val;
      break;

    case '-':                   /* subtract                                   */
      nextLexBlank();           /* skip over the operator                     */
      sym_getexpr.val -= (eval())->val;
      break;

    case '^':                   /* multiply                                   */
      nextLexBlank();           /* skip over the operator                     */
      sym_getexpr.val *= (eval())->val;
      break;

    case '%':                   /* divide                                     */
      nextLexBlank();           /* skip over the operator                     */
      sym_getexpr.val /= (eval())->val;
      break;

    case '&':                   /* and                                        */
      nextLexBlank();           /* skip over the operator                     */
      sym_getexpr.val &= (eval())->val;
      break;

    case '!':                   /* or                                         */
      nextLexBlank();           /* skip over the operator                     */
      sym_getexpr.val |= (eval())->val;
      break;

    default:
      if( is_end( line[lexstart] ))
      {
        return( &sym_getexpr );
      }

      switch( line[lexstart] )
      {
      case '/':
      case ';':
      case ')':
      case ']':
      case '<':
      case ':':
      case ',':
        break;

      case '=':
        errorMessage( &illegal_equals, lexstart );
        moveToEndOfLine();
        sym_getexpr.val = 0;
        break;

      default:
        errorMessage( &illegal_expression, lexstart );
        moveToEndOfLine();
        sym_getexpr.val = 0;
        break;
      }
      return( &sym_getexpr );
    }
  } /* end while                                                              */
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq 0x14022(%rip), %rax     # 0x17c18
leaq 0x13c23(%rip), %rbx     # 0x17820
movb (%rax,%rbx), %al
movb %al, 0x1401a(%rip)      # 0x17c20
movq 0x13ffb(%rip), %rax     # 0x17c08
cmpb $0x2d, (%rax,%rbx)
jne 0x3c46
callq 0x43c9
callq 0x57ed
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x7f9d(%rip)     # 0xbbc8
movups %xmm0, 0x7f86(%rip)     # 0xbbb8
movq 0x20(%rax), %rax
movq %rax, 0x7f9b(%rip)      # 0xbbd8
negq 0x7f84(%rip)            # 0xbbc8
jmp 0x3c6b
callq 0x57ed
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm0, 0x7f5f(%rip)     # 0xbbb8
movups %xmm1, 0x7f68(%rip)     # 0xbbc8
movq 0x20(%rax), %rax
movq %rax, 0x7f6d(%rip)      # 0xbbd8
movzbl 0x13fae(%rip), %eax     # 0x17c20
movabsq $0x4000000100001200, %r14 # imm = 0x4000000100001200
cmpq $0x3e, %rax
ja 0x3c95
btq %rax, %r14
jae 0x3c95
leaq 0x7f29(%rip), %rax      # 0xbbb8
popq %rbx
popq %r14
popq %r15
retq
leaq 0x33a4(%rip), %r15      # 0x7040
movzbl 0x13f7d(%rip), %eax     # 0x17c20
cmpq $0x3e, %rax
ja 0x3caf
btq %rax, %r14
jb 0x3c88
movq 0x13f52(%rip), %rsi     # 0x17c08
movzbl (%rsi,%rbx), %eax
cmpl $0x5c, %eax
jg 0x3cf1
leal -0x21(%rax), %ecx
cmpl $0x1c, %ecx
ja 0x3d89
movslq (%r15,%rcx,4), %rax
addq %r15, %rax
jmpq *%rax
callq 0x43c9
callq 0x57ed
movq %rax, %rcx
movq 0x7ee0(%rip), %rax      # 0xbbc8
orq 0x10(%rcx), %rax
jmp 0x3d7d
cmpl $0x5e, %eax
jne 0x3d9c
callq 0x43c9
callq 0x57ed
movq %rax, %rcx
movq 0x7eba(%rip), %rax      # 0xbbc8
imulq 0x10(%rcx), %rax
jmp 0x3d7d
callq 0x43c9
callq 0x57ed
movq %rax, %rcx
movq 0x7e9f(%rip), %rax      # 0xbbc8
subq 0x10(%rcx), %rax
jmp 0x3d7d
callq 0x43c9
callq 0x57ed
movq %rax, %rcx
movq 0x7e85(%rip), %rax      # 0xbbc8
cqto
idivq 0x10(%rcx)
jmp 0x3d7d
callq 0x43c9
callq 0x57ed
movq %rax, %rcx
movq 0x7e69(%rip), %rax      # 0xbbc8
andq 0x10(%rcx), %rax
jmp 0x3d7d
callq 0x43c9
callq 0x57ed
movq %rax, %rcx
movq 0x7e4f(%rip), %rax      # 0xbbc8
addq 0x10(%rcx), %rax
movq %rax, 0x7e44(%rip)      # 0xbbc8
jmp 0x3c9c
testl %eax, %eax
je 0x3c88
cmpl $0xa, %eax
je 0x3c88
jmp 0x3da5
cmpl $0x5d, %eax
je 0x3c88
leaq 0x7c04(%rip), %rdi      # 0xb9b0
callq 0x5bd7
movq 0x13e78(%rip), %rax     # 0x17c30
movzbl (%rax,%rbx), %ecx
testl %ecx, %ecx
je 0x3dfd
cmpl $0xa, %ecx
je 0x3dfd
incq %rax
movq %rax, 0x13e61(%rip)     # 0x17c30
jmp 0x3db8
leaq 0x7c28(%rip), %rdi      # 0xba00
callq 0x5bd7
movq 0x13e4c(%rip), %rax     # 0x17c30
movzbl (%rax,%rbx), %ecx
testl %ecx, %ecx
je 0x3dfd
cmpl $0xa, %ecx
je 0x3dfd
incq %rax
movq %rax, 0x13e35(%rip)     # 0x17c30
jmp 0x3de4
movq %rax, 0x13e04(%rip)     # 0x17c08
movq %rax, 0x13e0d(%rip)     # 0x17c18
movq %rax, 0x13e16(%rip)     # 0x17c28
movq $0x0, 0x7dab(%rip) # 0xbbc8
jmp 0x3c88