;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold чтение элементов векторов>
; <fold приватные макросы — должны использоваться только этим текстом исходного кода>
macro _chkvi2 {
local .L.0000
cmp r00d, $02
jb .L.0000
_throw VectorIndexOutOfBoundsException
.L.0000:
}
macro _chkvi4 {
local .L.0000
cmp r00d, $04
jb .L.0000
_throw VectorIndexOutOfBoundsException
.L.0000:
}
macro _chkvi8 {
local .L.0000
cmp r00d, $08
jb .L.0000
_throw VectorIndexOutOfBoundsException
.L.0000:
}
; </fold>
; <fold вектор на стаке, индекс на аккумуляторе, результат на аккумуляторе>
macro rdved2 {
_chkvi2
vmovq xmm0, [rsp+r00*8+$00]
__pop $01
}
macro rdved4 {
_chkvi4
vmovq xmm0, [rsp+r00*8+$00]
__cltag_y $00
__pop $02
}
macro rdved8 {
_chkvi8
vmovq xmm0, [rsp+r00*8+$00]
__cltag_z $00
__pop $04
}
macro rdvef2 {
_chkvi2
vmovd xmm0, [rsp+r00*4+$00]
__pop $01
}
macro rdvef4 {
_chkvi4
vmovd xmm0, [rsp+r00*4+$00]
__pop $01
}
macro rdvef8 {
_chkvi8
vmovd xmm0, [rsp+r00*4+$00]
__cltag_y $00
__pop $02
}
macro rdveb2 {
_chkvi2
movsx dsc0, byte [rsp+r00*1+$00]
__pop $01
}
macro rdveb4 {
_chkvi4
movsx dsc0, byte [rsp+r00*1+$00]
__pop $01
}
macro rdveb8 {
_chkvi8
movsx dsc0, byte [rsp+r00*1+$00]
__pop $01
}
macro rdves2 {
_chkvi2
movsx dsc0, word [rsp+r00*2+$00]
__pop $01
}
macro rdves4 {
_chkvi4
movsx dsc0, word [rsp+r00*2+$00]
__pop $01
}
macro rdves8 {
_chkvi8
movsx dsc0, word [rsp+r00*2+$00]
__pop $01
}
macro rdvei2 {
_chkvi2
mov dsc0, [rsp+r00*4+$00]
__pop $01
}
macro rdvei4 {
_chkvi4
mov dsc0, [rsp+r00*4+$00]
__pop $01
}
macro rdvei8 {
_chkvi8
mov dsc0, [rsp+r00*4+$00]
__cltag_y $00
__pop $02
}
macro rdvel2 {
_chkvi2
mov qsc0, [rsp+r00*8+$00]
__pop $01
}
macro rdvel4 {
_chkvi4
mov qsc0, [rsp+r00*8+$00]
__cltag_y $00
__pop $02
}
macro rdvel8 {
_chkvi8
mov qsc0, [rsp+r00*8+$00]
__cltag_z $00
__pop $04
}
; </fold>
; <fold вектор на стаке, индекс на аккумуляторе, результат на стаке>
macro rdved2_p {
_chkvi2
vmovq xmm0, [rsp+r00*8+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro rdved4_p {
_chkvi4
vmovq xmm0, [rsp+r00*8+$00]
__cltag_y $00
__pop $01
vmovdqa xword [rsp+$00], xmm0
}
macro rdved8_p {
_chkvi8
vmovq xmm0, [rsp+r00*8+$00]
__cltag_z $00
__pop $03
vmovdqa xword [rsp+$00], xmm0
}
macro rdvef2_p {
_chkvi2
vmovd xmm0, [rsp+r00*4+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro rdvef4_p {
_chkvi4
vmovd xmm0, [rsp+r00*4+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro rdvef8_p {
_chkvi8
vmovd xmm0, [rsp+r00*4+$00]
__cltag_y $00
__pop $01
vmovdqa xword [rsp+$00], xmm0
}
macro rdveb2_p {
_chkvi2
movsx dsc0, byte [rsp+r00*1+$00]
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
macro rdveb4_p {
_chkvi4
movsx dsc0, byte [rsp+r00*1+$00]
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
macro rdveb8_p {
_chkvi8
movsx dsc0, byte [rsp+r00*1+$00]
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
macro rdves2_p {
_chkvi2
movsx dsc0, word [rsp+r00*2+$00]
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
macro rdves4_p {
_chkvi4
movsx dsc0, word [rsp+r00*2+$00]
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
macro rdves8_p {
_chkvi8
movsx dsc0, word [rsp+r00*2+$00]
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
macro rdvei2_p {
_chkvi2
vmovd xmm0, [rsp+r00*4+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro rdvei4_p {
_chkvi4
vmovd xmm0, [rsp+r00*4+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro rdvei8_p {
_chkvi8
vmovd xmm0, [rsp+r00*4+$00]
__cltag_y $00
__pop $01
vmovdqa xword [rsp+$00], xmm0
}
macro rdvel2_p {
_chkvi2
vmovq xmm0, [rsp+r00*8+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro rdvel4_p {
_chkvi4
vmovq xmm0, [rsp+r00*8+$00]
__cltag_y $00
__pop $01
vmovdqa xword [rsp+$00], xmm0
}
macro rdvel8_p {
_chkvi8
vmovq xmm0, [rsp+r00*8+$00]
__cltag_z $00
__pop $03
vmovdqa xword [rsp+$00], xmm0
}
; </fold>
; <fold вектор на аккумуляторе, индекс в непосредственном операнде, результат на аккумуляторе>
macro rdved2_c immediate* {
rdvel2_c immediate
vmovq xmm0, qsc0
}
macro rdved4_c immediate* {
rdvel4_c immediate
vmovq xmm0, qsc0
}
macro rdved8_c immediate* {
rdvel8_c immediate
vmovq xmm0, qsc0
}
macro rdvef2_c immediate* {
rdvei2_c immediate
vmovd xmm0, dsc0
}
macro rdvef4_c immediate* {
rdvei4_c immediate
vmovd xmm0, dsc0
}
macro rdvef8_c immediate* {
rdvei8_c immediate
vmovd xmm0, dsc0
}
macro rdveb2_c immediate* {
vpextrb dsc0, xmm0, immediate
movsx dsc0, bsc0
}
macro rdveb4_c immediate* {
vpextrb dsc0, xmm0, immediate
movsx dsc0, bsc0
}
macro rdveb8_c immediate* {
vpextrb dsc0, xmm0, immediate
movsx dsc0, bsc0
}
macro rdves2_c immediate* {
vpextrw dsc0, xmm0, immediate
movsx dsc0, wsc0
}
macro rdves4_c immediate* {
vpextrw dsc0, xmm0, immediate
movsx dsc0, wsc0
}
macro rdves8_c immediate* {
vpextrw dsc0, xmm0, immediate
movsx dsc0, wsc0
}
macro rdvei2_c immediate* {
vpextrd dsc0, xmm0, immediate
}
macro rdvei4_c immediate* {
vpextrd dsc0, xmm0, immediate
}
macro rdvei8_c immediate* {
if(((immediate) and 4) <> 0)
vextracti128 xmm0, ymm0, $01
end if
vpextrd dsc0, xmm0, (immediate) and 3
}
macro rdvel2_c immediate* {
vpextrq qsc0, xmm0, immediate
}
macro rdvel4_c immediate* {
if(((immediate) and 2) <> 0)
vextracti128 xmm0, ymm0, $01
end if
vpextrq qsc0, xmm0, (immediate) and 1
}
macro rdvel8_c immediate* {
if(((immediate) and 6) <> 0)
vextracti64x2 xmm0, zmm0, ((immediate) and 7) shr 1
end if
vpextrq qsc0, xmm0, (immediate) and 1
}
; </fold>
; </fold>