File:  [MW Coherent from dump] / coherent / b / bin / c / n1 / i386 / tables / assign.t
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:37 2019 UTC (7 years, 2 months ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

//////////
/ n1/i386/tables/assign.t
//////////

/////////
/
/ Assignment (=).
/ Longs, pointers, words, bytes, fields, doubles.
/ The '=' operator is a non-conversion operator for integer types and pointers.
/ There must be some special entries here to handle the cross type cases.
/
/////////

ASSIGN:

//////////
/
/ Simple integer assignment.
/
//////////

//////////
/ Longs and pointers.
//////////

/ Register dword = 0 or NULL.
%	PEFFECT
	DWORD		NONE	*	*	NONE
		REG|MMX		DWORD
		0|MMX		*
			[ZSUB]	[AL],[AL]

/ Register dword = dword.
%	PEFFECT
	DWORD		NONE	*	*	NONE
		REG|MMX		DWORD
		EASY|MMX	DWORD
/ Dword = register dword.
%	PEFFECT
	DWORD		NONE	*	*	NONE
		ADR|LV		DWORD
		REG|MMX		DWORD
			[ZMOV]	[AL],[AR]

/ Register dword = effective address.
%	PEFFECT
	DWORD		NONE	*	*	NONE
		REG|MMX		DWORD
		LEA|MMX		DWORD
			[ZLEA]	[AL],[NSE AR]

/ Integer or pointer = immediate.
%	PEFFECT
	DWORD		NONE	*	*	NONE
		ADR|LV		DWORD|SHORT
		IMM|MMX		DWORD
			[TL ZMOV]	[AL],[TL AR]

/ Dword = dword.
%	PEFFECT|PVALUE|P_SRT
	DWORD		ANYR	*	ANYR	TEMP
		ADR|LV		DWORD
		TREG		DWORD
			[ZMOV]	[AL],[AR]

//////////
/ Words.
//////////

/ Word = immediate word.
%	PEFFECT
	DWORD		NONE	*	*	NONE
		ADR|LV		WORD
		IMM|MMX		WORD
			[ZMOVW]	[AL],[AR]

/ Word = word.
%	PEFFECT|PVALUE|PREL|P_SRT
	LONG		ANYR	*	ANYR	TEMP
		ADR|LV		WORD
		TREG		WORD
		[IFV]	[TL ZMOVSX]	[R],[LO RR]
			[ZMOVW]		[AL],[LO R]
		[IFR]	[ZCMPW]		[LO R],[CONST 0]
		[IFR]	[REL0]		[LAB]

//////////
/ Bytes.
//////////

/ Byte = immediate byte.
%	PEFFECT
	LONG		NONE	*	*	NONE
		ADR|LV		BYTE
		IMM|MMX		BYTE
			[ZMOVB]	[AL], [AR]

/ Byte = byte.
%	PEFFECT|PVALUE|PREL|P_SRT|PBYTE
	LONG		ANYR	*	ANYR	TEMP
		ADR|LV		BYTE
		TREG		BYTE
		[IFV]	[TL ZMOVSX]	[R],[LO LO RR]
			[ZMOVB]		[AL],[LO LO R]
		[IFR]	[ZCMPB]		[LO LO R],[CONST 0]
		[IFR]	[REL0]		[LAB]

//////////
/
/ Mixed type assignment.
/
//////////

/ Dword = short.
%	PEFFECT|PVALUE|P_SRT|PBYTE
	DWORD		ANYR	*	ANYR	TEMP
		ADR|LV		DWORD
		TREG		SHORT
			[TR ZMOVSX]	[R],[TR RR]
			[ZMOV]		[AL],[R]

/ Short = long or pointer.
%	PEFFECT|PVALUE|P_SRT|PBYTE
	LONG		ANYR	*	ANYR	TEMP
		ADR|LV		SHORT
		TREG		DWORD
			[TL ZMOV]	[AL],[TL AR]
		[IFV]	[TL ZMOVSX]	[R], [TL AR]

/////////
/
/ Field assignment.
/ The right operand has been preshifted and masked,
/ just like the right side of an '|=' or '^=' operation.
/ All you do is clear the junk and OR it in.
/ In value context, unsigned result must be masked;
/ signed result mask is unnecessary because of sign-extend shifts.
/
/////////

/ Immediate to signed field.
%	PEFFECT|PVALUE
	FS32		ANYR	*	*	TEMP
		ADR|LV		FLD
		IMM|MMX		LONG
			[TL ZAND]	[AL],[TL CMASK]		/ clear
			[TL ZOR]	[AL],[TL AR]		/ store
		[IFV]	[TL ZMOVZX]	[R],[AL]		/ fetch

/ Immediate to unsigned field.
%	PEFFECT|PVALUE
	FU32		ANYR	*	*	TEMP
		ADR|LV		FLD
		IMM|MMX		LONG
			[TL ZAND]	[AL],[TL CMASK]		/ clear
			[TL ZOR]	[AL],[TL AR]		/ store
		[IFV]	[TL ZMOVZX]	[R],[AL]		/ fetch
		[IFV]	[ZAND]		[R],[EMASK]		/ mask

/ Signed field.
%	PEFFECT|PVALUE|P_SRT|PBYTE
	FS32		ANYR	*	ANYR	TEMP
		ADR|LV		FLD
		TREG		LONG
			[TL ZAND]	[AL],[TL CMASK]
			[TL ZOR]	[AL],[TL R]
		[IFV]	[TL ZMOVSX]	[R],[AL]

/ Unsigned field.
%	PEFFECT|PVALUE|P_SRT|PBYTE
	FU32		ANYR	*	ANYR	TEMP
		ADR|LV		FLD
		TREG		LONG
			[TL ZAND]	[AL],[TL CMASK]
			[TL ZOR]	[AL],[TL R]
		[IFV]	[TL ZMOVSX]	[R],[AL]
		[IFV]	[ZAND]		[R],[EMASK]

//////////
/ Floating point.
//////////

/ DECVAX and IEEE software floating point assignment.
/ Zero and immediates are special.
/ Floats are different for DECVAX and IEEE. 

/ Double = 0.
%	PEFFECT|PIEEE|PDECVAX
	FF64		EAX	*	*	NONE
		ADR|LV		FF64
		0|MMX		*
			[ZSUB]	[R],[R]
			[ZMOV]	[HI AL],[R]
			[ZMOV]	[LO AL],[R]

/ Double = constant.
%	PEFFECT|PIEEE|PDECVAX
	FF64		NONE	*	*	NONE
		ADR|LV		FF64
		IMM|MMX		FF64
			[ZMOV]	[HI AL],[HI AR]
			[ZMOV]	[LO AL],[LO AR]

/ Double = double.
%	PEFFECT|PVALUE|P_SRT|PIEEE|PDECVAX
	FF64		EDXEAX	*	EDXEAX	EDXEAX
		ADR|LV		FF64
		TREG		FF64
			[ZMOV]	[HI AL],[HI R]
			[ZMOV]	[LO AL],[LO R]

/ Assignment to 32-bit floats.
/ Float = 0.
%	PEFFECT|PDECVAX|PIEEE
	FF64		EAX	*	*	NONE
		ADR|LV		FF32
		0|MMX		*
			[ZSUB]	[R],[R]
			[ZMOV]	[AL],[R]

/ Float = constant, DECVAX.
%	PEFFECT|PDECVAX
	FF64		NONE	*	*	NONE
		ADR|LV		FF32
		IMM|MMX		FF64
			[ZMOV]	[AL],[LO AR]

/ Float = constant, IEEE.
%	PEFFECT|PVALUE|PDECVAX
	FF64		EDXEAX	*	*	TEMP
		ADR|LV		FF32
		IMM|MMX		FF64
			[ZMOV]	[HI R], [HI AR]
			[ZMOV]	[LO R], [LO AR]
			[ZCALL]	[GID _fdcvt]
			[ZMOV]	[AL],[LO R]
		[IFV]	[ZCALL]	[GID _dfcvt]

/ Float = double or float, DECVAX.
%	PEFFECT|PVALUE|P_SRT|PDECVAX
	FF64		EDXEAX	*	EDXEAX	EDXEAX
		ADR|LV		FF32
		TREG		FLOAT
			[ZMOV]	[AL],[HI R]

/ Float = double or float, IEEE.
%	PEFFECT|PVALUE|P_SRT|PIEEE
	FF64		EDXEAX	*	EDXEAX	EDXEAX
		ADR|LV		FF32
		TREG		FLOAT
			[ZCALL]	[GID _fdcvt]
			[ZMOV]	[AL],[LO R]
		[IFV]	[ZCALL]	[GID _dfcvt]

/ Hardware coprocessor (NDP) floating point.
/ Pop the NDP stack on assignment for effect.
%	PEFFECT|P_SRT|PNDP
	FF64		FPAC	*	FPAC	NONE
		ADR|LV		FLOAT
		TREG		FLOAT
			[TL ZFSTPD]	[AL]

/ Leave the value on the NDP stack on assignment for value.
%	PVALUE|P_SRT|PNDP
	FF64		FPAC	*	FPAC	FPAC
		ADR|LV		FLOAT
		TREG		FLOAT
			[TL ZFSTD]	[AL]

//////////
/ end of n1/i386/tables/assign.t
//////////

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.