#################################################################
#								#
# Copyright (c) 2001-2022 Fidelity National Information		#
# Services, Inc. and/or its subsidiaries. All rights reserved.	#
#								#
#	This source code contains the intellectual property	#
#	of its copyright holder(s), and is made available	#
#	under a license.  If you do not know the terms of	#
#	the license, please stop and do not read further.	#
#								#
#################################################################

	.sbttl	mval_def.si
#	PAGE	+
# -------------------------------------------
# mval_def.si
#
#	This is an include file for
#	SCO Unix 80386 masm assembler containing
#	the macros for mval-related assembly routines.
# -------------------------------------------

mval_v_nm		=	0
mval_v_int		=	1
mval_v_str		=	2
mval_v_num_approx	=	3
mval_v_canonical	=	4
mval_v_sym		=	5
mval_v_sublit		=	6
mval_v_retarg		=	7
mval_v_utflen		=	8
mval_v_aliascont	=	9

mval_m_nm		=	0x001
mval_m_int_without_nm	=	0x002
mval_m_int		=	0x003
mval_m_str		=	0x004
mval_m_num_approx	=	0x008
mval_m_canonical	=	0x010
mval_m_sym		=	0x020
mval_m_sublit		=	0x040
mval_m_retarg		=	0x080
mval_m_utflen		=	0x100
mval_m_aliascont	=	0x200
#
#	Length of mval in bytes
#
mval_byte_len		=	32
#
#	Offsets of type, exp, strlen, stradd, num in mval structure
#
mval_w_mvtype		=	0
mval_b_exp		=	2
mval_l_strlen		=	24
mval_a_straddr		=	28
#
#	Address offset of number in mval
#
mvalnm_offs		=	12
mval_l_m0		=	12
mval_l_m1		=	16
mval_esign_mask		=	0x080

MV_BIAS			=	1000		# 10**3
MANT_LO			=	100000000	# 10**8
MANT_HI			=	1000000000	# 10**9
INT_HI			=	1000000		# 10**6

#	Stringpool structure offsets
base			=	0
free			=	4
top			=	8

# mvals passed to these macros must be registers

	.sbttl	mval_def.si    mv_force_defined
# ---------------------------------------
#       mv_force_defined(mval, label)
# ---------------------------------------
.macro  mv_force_defined mval, label
        testw   $(mval_m_str+mval_m_nm),mval_w_mvtype(\mval)
        jne     \label
	pushl   \mval
        call    underr
        addl    $4,%esp
	movl	%eax, \mval
\label:
.endm

	.sbttl	mval_def.si    mv_force_defined_overwrite
# ---------------------------------------
#       mv_force_defined_overwrite(mval, label)
# ---------------------------------------
.macro  mv_force_defined_overwrite mval, label
        testw   $(mval_m_str+mval_m_nm),mval_w_mvtype(\mval)
        jne     \label
	pushl   \mval
        call    underr_overwrite
        addl    $4,%esp
\label:
.endm

	.sbttl	mval_def.si    mv_force_str
# ---------------------------------------
#	mv_force_str(mval, label)
# ---------------------------------------
.macro	mv_force_str	mval, label
	testw	$mval_m_str,mval_w_mvtype(\mval)
	jne	\label
	pushl	\mval
	call	n2s
	addl	$4,%esp
\label:
.endm

	.sbttl	mval_def.si    mv_force_num
# ---------------------------------------
#	mv_force_num(mval, label)
# ---------------------------------------
.macro	mv_force_num	mval, label
	testw	$mval_m_nm,mval_w_mvtype(\mval)
	jne	\label
	pushl	\mval
	call	s2n
	addl	$4,%esp
\label:
.endm

	.sbttl	mval_def.si    mv_force_str_if_num_approx
# ---------------------------------------
#	mv_force_str_if_num_approx(mval, label)
# ---------------------------------------
.macro	mv_force_str_if_num_approx	mval, label
	testw	$mval_m_num_approx,mval_w_mvtype(\mval)
	je	\label
	pushl	\mval
	call	n2s
	addl	$4,%esp
\label:
.endm

	.sbttl	mval_def.si    mv_i2mval
# ---------------------------------------
#	mv_i2mval(int, mval)
# ---------------------------------------
.macro	mv_i2mval	int, mval
	movw	$mval_m_int,mval_w_mvtype(\mval)
	movl	\int,%eax
	imull	$MV_BIAS,%eax,%eax
	movl	%eax,mval_l_m1(\mval)
.endm

	.sbttl	mval_def.si    mv_if_string
# ---------------------------------------
#	mv_if_string(mval,label)
# ---------------------------------------
.macro	mv_if_string	mval, label
	testw	$mval_m_str,mval_w_mvtype(\mval)
	jne	\label
.endm

	.sbttl	mval_def.si	mv_if_number
# ---------------------------------------
#	mv_if_number(mval,label)
# ---------------------------------------
.macro	mv_if_number	mval, label
	testw	$mval_m_nm,mval_w_mvtype(\mval)
	jne	\label
.endm

	.sbttl	mval_def.si    mv_if_int
# ---------------------------------------
#	mv_if_int(mval,label)
# ---------------------------------------
.macro	mv_if_int	mval, label
	testw	$mval_m_int_without_nm,mval_w_mvtype(\mval)
	jne	\label
.endm

	.sbttl	mval_def.si    mv_if_notstring
# ---------------------------------------
#	mv_if_notstring(mval,label)
# ---------------------------------------
.macro	mv_if_notstring	mval, label
	testw	$mval_m_str,mval_w_mvtype(\mval)
	je	\label
.endm

	.sbttl	mval_def.si    mv_if_notnumber
# ---------------------------------------
#	mv_if_notnumber(mval,label)
# ---------------------------------------
.macro	mv_if_notnumber	mval, label
	testw	$mval_m_nm,mval_w_mvtype(\mval)
	je	\label
.endm

	.sbttl	mval_def.si    mv_if_notint
# ---------------------------------------
#	mv_if_notint(mval,label)
# ---------------------------------------
.macro	mv_if_notint	mval, label
	testw	$mval_m_int_without_nm,mval_w_mvtype(\mval)
	je	\label
.endm

	.sbttl	mval_def.si    mv_if_defined
# ---------------------------------------
#	mv_if_defined(mval,label)
# ---------------------------------------
.macro	mv_if_defined	mval, label
	testw	$(mval_m_str+mval_m_nm),mval_w_mvtype(\mval)
	jne	\label
.endm

	.sbttl	mval_def.si    mv_if_notdefined
# ---------------------------------------
#	mv_if_notdefined(mval,label)
# ---------------------------------------
.macro	mv_if_notdefined mval, label
	testw	$(mval_m_str+mval_m_nm),mval_w_mvtype(\mval)
	je	\label
.endm

	.sbttl	mval_def.si    mv_if_canonical
# -------------------------------------------------------------
# WARNING:
# Following macro needs to be supplied with 2 extra labels that
# are used by local branch instructions, tmp_label1 and tmp_label2
# -------------------------------------------------------------
#	mv_if_canonical(mval,mainlabel, tmp_label1, tmp_label2)
# -------------------------------------------------------------
.macro	mv_if_canonical	mval, mainlabel, tmp_label1, tmp_label2
	testw	$mval_m_nm,mval_w_mvtype(\mval)
	je	\tmp_label1
	testw	$mval_m_num_approx,mval_w_mvtype(\mval)
	jne	\tmp_label2
	jmp	\mainlabel

\tmp_label1:
	pushl	\mval
	call	val_iscan
	addl	$4,%esp
	cmpl	$0,%eax
	jne	\mainlabel

\tmp_label2:
.endm
