// File: /workspace/github_c_makefile_star2_O2/AK6DN[P]dec-utilities-for-pdp/palbart/palbart.c
// Function: getDublExpr
WORD32 getDublExpr()
{
  WORD32 dublvalue;

  delimiter = line[lexterm];
  if( line[lexstart] == '-' )
  {
    nextLexBlank();
    dublvalue = evalDubl( 0 );
    nextLexeme();
    /* Test for any value greater than 23 bits in length.                     */
    if( (unsigned long int)dublvalue > 040000000L )
    {
      errorMessage( &dubl_overflow, lexstart );
      dublvalue = 0;
    }
    dublvalue = -dublvalue;
  }
  else
  {
    dublvalue = evalDubl( 0 );
    nextLexeme();
    /* Test for any value greater than 23 bits in length.                     */
    if( (unsigned long int)dublvalue > 037777777L )
    {
      errorMessage( &dubl_overflow, lexstart );
      dublvalue = 0;
    }
  }

  if( is_blank( delimiter ))
  {
    return( dublvalue );
  }

  /* 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 ))
    {
      errorMessage( &illegal_expression, lexstart );
      moveToEndOfLine();
      dublvalue = 0;
      return( dublvalue );
    }

    switch( line[lexstart] )
    {
    case '+':                   /* add                                        */
    case '-':                   /* subtract                                   */
    case '^':                   /* multiply                                   */
    case '%':                   /* divide                                     */
    case '&':                   /* and                                        */
    case '!':                   /* or                                         */
      errorMessage( &illegal_expression, lexstart );
      moveToEndOfLine();
      dublvalue = 0;
      break;

    default:
      if( isend( line[lexstart] ))
      {
        return( dublvalue );
      }

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

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

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movslq 0x8313(%rip), %rax      # 0xd80c
leaq 0x8280(%rip), %r15      # 0xd780
movb (%rax,%r15), %al
movb %al, 0x8306(%rip)       # 0xd810
movslq 0x82f3(%rip), %rax      # 0xd804
cmpb $0x2d, (%rax,%r15)
jne 0x554e
callq 0x415b
xorl %edi, %edi
callq 0x562b
movq %rax, %rbx
callq 0x3907
cmpq $0x800001, %rbx         # imm = 0x800001
jb 0x5549
movl 0x82c9(%rip), %esi      # 0xd804
leaq 0x5cc6(%rip), %rdi      # 0xb208
callq 0x52fe
xorl %ebx, %ebx
negq %rbx
jmp 0x557a
xorl %edi, %edi
callq 0x562b
movq %rax, %rbx
callq 0x3907
cmpq $0x800000, %rbx         # imm = 0x800000
jb 0x557a
movl 0x8298(%rip), %esi      # 0xd804
leaq 0x5c95(%rip), %rdi      # 0xb208
callq 0x52fe
xorl %ebx, %ebx
movzbl 0x828f(%rip), %eax      # 0xd810
movabsq $0x4000000100001200, %r12 # imm = 0x4000000100001200
cmpq $0x3e, %rax
ja 0x55a9
btq %rax, %r12
jae 0x55a9
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x5b88(%rip), %r14      # 0xb138
movabsq $0x286200000000, %r13   # imm = 0x286200000000
movabsq $0x800800000000401, %rbp # imm = 0x800800000000401
cmpb $0x3e, %al
ja 0x55d1
movzbl %al, %eax
btq %rax, %r12
jb 0x560d
movslq 0x822c(%rip), %rsi      # 0xd804
movzbl (%rsi,%r15), %eax
cmpq $0x3b, %rax
ja 0x5606
btq %rax, %r13
jae 0x5600
movq %r14, %rdi
callq 0x52fe
callq 0x5380
movb 0x8214(%rip), %al       # 0xd810
xorl %ebx, %ebx
jmp 0x55c4
btq %rax, %rbp
jb 0x5597
cmpl $0x5e, %eax
je 0x55e9
jmp 0x5613
movl 0x81f1(%rip), %esi      # 0xd804
leaq 0x5b1e(%rip), %rdi      # 0xb138
callq 0x52fe
callq 0x5380
xorl %ebx, %ebx
jmp 0x5597