/* This file is part of GNU epsilon, a functional language implementation

Copyright (C) 2003 Luca Saiu

GNU epsilon is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2, or (at your
option) any later version.

GNU epsilon is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with epsilon; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */


/* Code for the s_ltes instruction */

const integer_t size_of_undertop = ((integer_t*)UNDERTOP)[0];
const integer_t size_of_top = ((integer_t*)top)[0];
integer_t minimum_size;
integer_t i;

/* Set minimum_size to the minimum of the lengths: */
minimum_size = size_of_undertop;
if(size_of_top < minimum_size)
  minimum_size = size_of_top;

for(i = 1; i <= minimum_size; i++)
  if( ((integer_t*)UNDERTOP)[i] < ((integer_t*)top)[i] ){
    top = (word_t)1; /* UNDERTOP <s top */
    break;
  } else if( ((integer_t*)UNDERTOP)[i] > ((integer_t*)top)[i] ){
    top = (word_t)0; /* UNDERTOP >s top */
    break;
  }
  /* else do nothing: iterate again */

if(i > minimum_size){ /* strings are equal up to and including minimum_size. */
  if(size_of_undertop == size_of_top)
    top = (word_t)1; /* UNDERTOP =s top */
  else if(size_of_undertop < size_of_top)
    top = (word_t)1; /* UNDERTOP <s top */
  else /* size_of_undertop > size_of_top */
    top = (word_t)0; /* UNDERTOP >s top */
}

/* We already put the result into top: now decrease the stack pointer: */
undertop_stack_pointer--;
