From: Jos v.d.V. <jo...@us...> - 2014-12-10 12:27:16
|
Update of /cvsroot/win32forth/win32forth/src In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv14845 Modified Files: 486ASM.F 586ASMCM.f ASMMAC.F Log Message: Jos extending for SIMD Index: ASMMAC.F =================================================================== RCS file: /cvsroot/win32forth/win32forth/src/ASMMAC.F,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ASMMAC.F 21 Dec 2004 00:19:07 -0000 1.1 --- ASMMAC.F 10 Dec 2014 12:27:11 -0000 1.2 *************** *** 109,111 **** macro: st(6), st(6) , ;m macro: st(7), st(7) , ;m ! --- 109,118 ---- macro: st(6), st(6) , ;m macro: st(7), st(7) , ;m ! macro: xmm0, xmm0 , ;m ! macro: xmm1, xmm1 , ;m ! macro: xmm2, xmm2 , ;m ! macro: xmm3, xmm3 , ;m ! macro: xmm4, xmm4 , ;m ! macro: xmm5, xmm5 , ;m ! macro: xmm6, xmm6 , ;m ! macro: xmm7, xmm7 , ;m Index: 586ASMCM.f =================================================================== RCS file: /cvsroot/win32forth/win32forth/src/586ASMCM.f,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** 586ASMCM.f 18 Nov 2011 14:19:06 -0000 1.3 --- 586ASMCM.f 10 Dec 2014 12:27:11 -0000 1.4 *************** *** 3,10 **** \ Also floating-point extensions for P6 or better gah only forth also assembler also asm-hidden definitions also assembler ! in-hidden ( cmovcc instructions ) : cmovcc-compile ( compile CMOVcc instructions ) --- 3,12 ---- \ Also floating-point extensions for P6 or better gah + only forth also assembler also asm-hidden definitions also assembler ! in-hidden in-system ! ( cmovcc instructions ) : cmovcc-compile ( compile CMOVcc instructions ) *************** *** 13,17 **** --- 15,45 ---- compile-fields ; + : xmm-compile ( param -- | x \ param -- | x \ x \ param -- ) + $0F code-c, (xmm-compile) ; + + : dxmm-compile ( param -- | x \ param -- | x \ x \ param -- ) + $66 code-c, xmm-compile ; + + : pre-xmm-compile ( param -- | x \ param -- | x \ x \ param -- ) + $F3 code-c, xmm-compile ; + + : pre-dxmm-compil1 ( param -- | x \ param -- | x \ x \ param -- ) + $F2 code-c, $0F code-c, mmxreg generic-entry2 mmx-dir? + if 1 or + endif + xmm/mmx-prefix data-@ 2 = + if xmm-dir? + if 1 or + endif + endif + ?noimmed code-c, compile-fields + ; + + : pre-dxmm-compile ( param -- | x \ param -- | x \ x \ param -- ) + $F2 code-c, xmm-compile ; + in-asm + dup-warning-off + 0x47 ' cmovcc-compile opcode cmova 0x43 ' cmovcc-compile opcode cmovae *************** *** 60,64 **** --- 88,201 ---- 0xc0df ' fmisc-compile opcode ffreep + dup-warning-on + + \ xmm instructions + $10 ' xmm-compile opcode movups + $10 ' dxmm-compile opcode movupd + $10 ' pre-xmm-compile opcode movss + dup-warning-off + $10 ' pre-dxmm-compil1 opcode movsd + dup-warning-on + $14 ' xmm-compile opcode unpcklps + $14 ' dxmm-compile opcode unpcklpd + $15 ' xmm-compile opcode unpckhps + $15 ' dxmm-compile opcode unpckhpd + + $28 ' xmm-compile opcode movaps + $28 ' dxmm-compile opcode movapd + $2A ' xmm-compile opcode cvtpi2ps + $2A ' dxmm-compile opcode cvtpi2pd + $2A ' pre-xmm-compile opcode cvtsi2ss + $2A ' pre-dxmm-compile opcode cvtsi2sd + $2C ' xmm-compile opcode cvttps2pi + $2C ' dxmm-compile opcode cvttpd2pi + $2C ' pre-xmm-compile opcode cvttss2si + $2C ' pre-dxmm-compile opcode cvttsd2si + + $2D ' xmm-compile opcode cvtps2pi + $2D ' dxmm-compile opcode cvtpd2pi + $2D ' pre-xmm-compile opcode cvtss2si + $2D ' pre-dxmm-compile opcode cvtsd2si + + $E6 ' pre-xmm-compile opcode cvtdq2pd + $E6 ' pre-dxmm-compile opcode cvtpd2dq + + $2E ' xmm-compile opcode ucomiss + $2E ' dxmm-compile opcode ucomisd + + $2F ' xmm-compile opcode comiss + $2F ' dxmm-compile opcode comisd + + $C2 ' xmm-compile opcode cmpps + $C2 ' dxmm-compile opcode cmppd + $C2 ' pre-xmm-compile opcode cmpss + $C2 ' pre-dxmm-compile opcode xcmpsd + + $C6 ' xmm-compile opcode shufps + $C6 ' dxmm-compile opcode shufpd + + $50 ' xmm-compile opcode movmskps + $50 ' dxmm-compile opcode movmskpd + + $51 ' xmm-compile opcode sqrtps + $51 ' dxmm-compile opcode sqrtpd + $51 ' pre-xmm-compile opcode sqrtss + $51 ' pre-dxmm-compile opcode sqrtsd + + $52 ' xmm-compile opcode rsqrtps + $52 ' dxmm-compile opcode rsqrtpd + $52 ' pre-xmm-compile opcode rsqrtss + $52 ' pre-dxmm-compile opcode rsqrtsd + + $53 ' xmm-compile opcode rcpps + $53 ' dxmm-compile opcode rcppd + $53 ' pre-xmm-compile opcode rcpss + $53 ' pre-dxmm-compile opcode rcpds + + $54 ' xmm-compile opcode andps + $54 ' dxmm-compile opcode andpd + $55 ' xmm-compile opcode andnps + $55 ' dxmm-compile opcode andnpd + $56 ' xmm-compile opcode orps + $56 ' dxmm-compile opcode orpd + $57 ' xmm-compile opcode xorps + $57 ' dxmm-compile opcode xorpd + + $58 ' xmm-compile opcode addps + $58 ' dxmm-compile opcode addpd + $58 ' pre-xmm-compile opcode addss + $58 ' pre-dxmm-compile opcode addsd + + $59 ' xmm-compile opcode mulps + $59 ' dxmm-compile opcode mulpd + $59 ' pre-xmm-compile opcode mulss + $59 ' pre-dxmm-compile opcode mulsd + + $5B ' dxmm-compile opcode cvttpd2dq + + $5C ' xmm-compile opcode subps + $5C ' dxmm-compile opcode subpd + $5C ' pre-xmm-compile opcode subss + $5C ' pre-dxmm-compile opcode subsd + + $5D ' xmm-compile opcode minps + $5D ' dxmm-compile opcode minpd + $5D ' pre-xmm-compile opcode minss + $5D ' pre-dxmm-compile opcode minsd + + $5E ' xmm-compile opcode divps + $5E ' dxmm-compile opcode divpd + $5E ' pre-xmm-compile opcode divss + $5E ' pre-dxmm-compile opcode divsd + + $5F ' xmm-compile opcode maxps + $5F ' dxmm-compile opcode maxpd + $5F ' pre-xmm-compile opcode maxss + $5F ' pre-dxmm-compile opcode maxsd + + in-previous only forth definitions + + \s Index: 486ASM.F =================================================================== RCS file: /cvsroot/win32forth/win32forth/src/486ASM.F,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** 486ASM.F 19 Apr 2011 20:30:03 -0000 1.10 --- 486ASM.F 10 Dec 2014 12:27:11 -0000 1.11 *************** *** 24,29 **** --- 24,32 ---- \ added CMOVcc, aliased Jcc LOOPcc SETcc \ simplified cell/ 8* 8/ 16*+ 16/mod + \ Jos: December 10th, 2014 Prepared for the use of MMX and XMM registers. + \ See also 586asmcm.f ( declare the vocabularies needed ) + only forth definitions ( vocabulary assembler ) also assembler definitions vocabulary asm-hidden also asm-hidden definitions also assembler *************** *** 343,346 **** --- 346,354 ---- 9 constant treg ( a test register ) 0a constant freg ( a floating point register ) + \ $0B constant offs ( offset; relative or absolute address ) \ reserved, not in use + \ $0C constant moffs ( memory offset; relative or absolute address ) \ reserved not in use + $0D constant mmxreg ( an MMX or 3D-Now! register ) + $0E constant xmmreg ( an XMM register ) + ( encode and decode register representations ) *************** *** 391,394 **** --- 399,419 ---- 32bit unknown register 6 asm-op esi 32bit unknown register 7 asm-op edi + + 32bit unknown mmxreg 0 asm-op mm0 + 32bit unknown mmxreg 1 asm-op mm1 + 32bit unknown mmxreg 2 asm-op mm2 + 32bit unknown mmxreg 3 asm-op mm3 + 32bit unknown mmxreg 4 asm-op mm4 + 32bit unknown mmxreg 5 asm-op mm5 + 32bit unknown mmxreg 6 asm-op mm6 + 32bit unknown mmxreg 7 asm-op mm7 + 32bit unknown xmmreg 0 asm-op xmm0 + 32bit unknown xmmreg 1 asm-op xmm1 + 32bit unknown xmmreg 2 asm-op xmm2 + 32bit unknown xmmreg 3 asm-op xmm3 + 32bit unknown xmmreg 4 asm-op xmm4 + 32bit unknown xmmreg 5 asm-op xmm5 + 32bit unknown xmmreg 6 asm-op xmm6 + 32bit unknown xmmreg 7 asm-op xmm7 unknown 16bit indirect 0 asm-op [bx+si] unknown 16bit indirect 1 asm-op [bx+di] *************** *** 501,504 **** --- 526,530 ---- variable s-i-b ( the working area for the s-i-b byte ) variable addmode ( addressing mode flags ) + variable xmm/mmx-prefix \ xmm (2) or mmx (1) or neither (0) regs used ) : reset-vars ( store 0 into all instruction coding variables ) *************** *** 507,511 **** 0 sp-save data-! 0 offset-sv data-! 0 immed-sv data-! 0 dt-size data-! 0 ad-size data-! 0 rtype data-! 0 maxtype data-! 0 mod-r/m data-! ! 0 s-i-b data-! 0 addmode data-! ; : reset-for-next-instr ( store a 0 into intermediate coding variables ) --- 533,537 ---- 0 sp-save data-! 0 offset-sv data-! 0 immed-sv data-! 0 dt-size data-! 0 ad-size data-! 0 rtype data-! 0 maxtype data-! 0 mod-r/m data-! ! 0 s-i-b data-! 0 addmode data-! 0 xmm/mmx-prefix data-! ; : reset-for-next-instr ( store a 0 into intermediate coding variables ) *************** *** 515,530 **** ( set/reset mode bits ) ! 1 constant immed-bit ( flag an immediate operand ) ! 2 constant direct-bit ( flag the direction ) ! 4 constant mod-r/m-bit ( flag that we've started the mod-r/m ) ! 8 constant s-i-b-bit ( flag the beginning of s-i-b creation ) ! 10 constant full-off-bit ( flag a full offset ) ! 20 constant based-bit ( flag that we've seen a base ) ! 40 constant offset-bit ( flag an offset ) ! 80 constant short-bit ( flag short ) ! 100 constant near-bit ( flag near ) ! 200 constant far-bit ( flag far ) ! 400 constant do-1op-bit ( flag we've been through do-1op once ) ! 800 constant maybe-offset-bit ( flag that maybe we've got an offset ) immed-bit direct-bit or --- 541,559 ---- ( set/reset mode bits ) ! 1 constant immed-bit ( flag an immediate operand ) ! 2 constant direct-bit ( flag the direction ) ! 4 constant mod-r/m-bit ( flag that we've started the mod-r/m ) ! 8 constant s-i-b-bit ( flag the beginning of s-i-b creation ) ! 10 constant full-off-bit ( flag a full offset ) ! 20 constant based-bit ( flag that we've seen a base ) ! 40 constant offset-bit ( flag an offset ) ! 80 constant short-bit ( flag short ) ! 100 constant near-bit ( flag near ) ! 200 constant far-bit ( flag far ) ! 400 constant do-1op-bit ( flag we've been through do-1op once ) ! 800 constant maybe-offset-bit ( flag that maybe we've got an offset ) ! 1000 constant mmx-dir-bit ( flag the direction in case of MMX register(s) ! 2000 constant xmm-dir-bit ( flag the direction in case of XMM register(s) ! immed-bit direct-bit or *************** *** 539,542 **** --- 568,573 ---- do-1op-bit or maybe-offset-bit or + mmx-dir-bit or + xmm-dir-bit or constant mode-mask ( all mode bits set ) *************** *** 574,577 **** --- 605,627 ---- ( -- ) direct-bit 0mode-bit! ; + : mmxreg,r/m ( addressing mode is mmx-register, register/memory ) + ( -- ) + mmx-dir-bit 1mode-bit! ; + : r/m,mmxreg ( addressing mode is register/memory, mmx-register ) + ( -- ) + mmx-dir-bit 0mode-bit! ; + : xmmreg,r/m ( addressing mode is xmm-register, register/memory ) + ( -- ) + xmm-dir-bit 1mode-bit! ; + : r/m,xmmreg ( addressing mode is register/memory, xmm-register ) + ( -- ) + xmm-dir-bit 0mode-bit! ; + : mmx-dir? ( is the destination an mmx-register? ) + ( -- flag ) + mmx-dir-bit mode-bit@ ; + : xmm-dir? ( is the destination an xmm-register? ) + ( -- flag ) + xmm-dir-bit mode-bit@ ; + : direction? ( is the destination a register? ) ( -- flag ) *************** *** 984,988 **** ( -- flag ) maxtype data-@ dup register > swap freg < and ; ! : special-register? ( is this a special register? ) ( -- flag ) rtype data-@ dup register > swap freg < and ; --- 1034,1038 ---- ( -- flag ) maxtype data-@ dup register > swap freg < and ; ! : special-register? ( is this a special register? MMX/XMM registers are NOT special ) ( -- flag ) rtype data-@ dup register > swap freg < and ; *************** *** 1012,1019 **** special-register? rtype data-@ sreg <> and if 8* ! else ( either a general or segment register ) c0+ then has-mod-r/m r/m,reg then mod-r/m data-! ; : do-immed ( do an immediate addressing mode operand ) ( x \ 0 -- ) --- 1062,1087 ---- special-register? rtype data-@ sreg <> and if 8* ! else ( either a general MMX/XMM, or segment register ) c0+ then has-mod-r/m r/m,reg then mod-r/m data-! ; + : do-mmxreg ( do any register addressing mode translation ) + ( reg \ type -- ) + do-1op-exed? if + r/m,mmxreg + else + mmxreg,r/m + then + do-reg + 1 xmm/mmx-prefix data-@ or xmm/mmx-prefix data-! ; + : do-xmmreg ( do any register addressing mode translation ) + ( reg \ type -- ) + do-1op-exed? if + r/m,xmmreg + else + xmmreg,r/m + then + do-reg + 2 xmm/mmx-prefix data-@ or xmm/mmx-prefix data-! ; : do-immed ( do an immediate addressing mode operand ) ( x \ 0 -- ) *************** *** 1071,1075 **** rtype data-@ ?dup if based over = index rot = or 0= ?badcombine then based rtype! do-based ! endof ( must be a register type ) do-reg dup ( so endcase has ) ( something to discard ) endcase ; : save-offset ( save the offset, if it's present ) --- 1139,1147 ---- rtype data-@ ?dup if based over = index rot = or 0= ?badcombine then based rtype! do-based ! endof mmxreg of \ added for mmx regs ! register do-mmxreg ! endof xmmreg of \ added for xmm regs ! register do-xmmreg ! endof ( must be a register type ) do-reg dup ( so endcase has ) ( something to discard ) endcase ; : save-offset ( save the offset, if it's present ) *************** *** 1715,1718 **** --- 1787,1803 ---- endcase ; + : (xmm-compile) ( param -- | x \ param -- | x \ x \ param -- ) + mmxreg generic-entry2 mmx-dir? + if $10 or + endif + xmm/mmx-prefix data-@ 2 = + if xmm-dir? + if $11 or + endif + endif + ?noimmed code-c, compile-fields + ; + + ( the instructions ) in-asm *************** *** 2056,2059 **** --- 2141,2145 ---- 06 ' group1-compile opcode xor + ( create code definitions ) in-hidden *************** *** 2152,2153 **** --- 2238,2240 ---- only forth definitions base ! + \s |