.sect .text

! Bounds check. Traps if the value is out of range.
!  Stack: ( value descriptor -- value )
!
! This ".rck" only works with 4-byte integers.  The name is ".rck" and
! not ".rck4" because many back ends only do rck with the word size.

.define .rck
.rck:
    lwz r3, 0 (sp)
    lwz r4, 4 (sp)
    addi sp, sp, 4 ! leave value on stack

    lwz r5, 0 (r3)
    cmpw r4, r5
    blt .trap_erange

    lwz r5, 4 (r3)
    cmpw r4, r5
    bgt .trap_erange

    blr

.trap_erange:
    li r3, 1       ! ERANGE = 1 in h/em_abs.h
    b .trp