;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold приведение значения типа int* к другим типам>
; <fold int>
macro castitoc {
movzx dsc0, wsc0
}
macro castitoe {
mov dword [rbx+ctxt$tm2], dsc0
fild dword [rbx+ctxt$tm2]
}
macro castitod {
vmovd xmm0, dsc0
vcvtsi2sd xmm0, xmm0, dsc0
}
macro castitof {
vmovd xmm0, dsc0
vcvtsi2ss xmm0, xmm0, dsc0
}
macro castitob {
movsx dsc0, bsc0
}
macro castitos {
movsx dsc0, wsc0
}
macro castitol {
movsxd qsc0, dsc0
}
macro castitob2 {
movzx dsc0, bsc0
vmovd xmm0, dsc0
}
macro castitob4 {
movzx dsc0, bsc0
vmovd xmm0, dsc0
}
macro castitob8 {
movzx dsc0, bsc0
vmovd xmm0, dsc0
}
macro castitos2 {
movzx dsc0, wsc0
vmovd xmm0, dsc0
}
macro castitos4 {
movzx dsc0, wsc0
vmovd xmm0, dsc0
}
macro castitos8 {
movzx dsc0, wsc0
vmovd xmm0, dsc0
}
macro castitoi2 {
vmovd xmm0, dsc0
}
macro castitoi4 {
vmovd xmm0, dsc0
}
macro castitoi8 {
vmovd xmm0, dsc0
}
; </fold>
; <fold int2>
macro casti2tod2 {
vcvtdq2pd xmm0, xmm0
}
macro casti2tof2 {
vcvtdq2ps xmm0, xmm0
}
macro casti2tob2 {
vpand xmm0, xmm0, [cons$int8.maskb]
vpackusdw xmm0, xmm0, [cons$zero]
vpackuswb xmm0, xmm0, [cons$zero]
}
macro casti2tos2 {
vpand xmm0, xmm0, [cons$int8.maskw]
vpackusdw xmm0, xmm0, [cons$zero]
}
macro casti2tol2 {
vpmovsxdq xmm0, xmm0
}
macro casti2toi {
vmovd dsc0, xmm0
}
macro casti2toi4 { }
macro casti2toi8 { }
; </fold>
; <fold int4>
macro casti4tod4 {
vcvtdq2pd ymm0, xmm0
}
macro casti4tof4 {
vcvtdq2ps xmm0, xmm0
}
macro casti4tob4 {
vpand xmm0, xmm0, [cons$int8.maskb]
vpackusdw xmm0, xmm0, [cons$zero]
vpackuswb xmm0, xmm0, [cons$zero]
}
macro casti4tos4 {
vpand xmm0, xmm0, [cons$int8.maskw]
vpackusdw xmm0, xmm0, [cons$zero]
}
macro casti4tol4 {
vpmovsxdq ymm0, xmm0
}
macro casti4toi {
vmovd dsc0, xmm0
}
macro casti4toi2 {
vpand xmm0, xmm0, [cons$int8.m1_0]
}
macro casti4toi8 { }
; </fold>
; <fold int8>
macro casti8tod8 {
vcvtdq2pd zmm0, ymm0
}
macro casti8tof8 {
vcvtdq2ps ymm0, ymm0
}
macro casti8tob8 {
vpand ymm0, ymm0, [cons$int8.maskb]
vextracti128 xmm1, ymm0, $01
vpackusdw xmm0, xmm0, xmm1
vpackuswb xmm0, xmm0, [cons$zero]
}
macro casti8tos8 {
vpand ymm0, ymm0, [cons$int8.maskw]
vextracti128 xmm1, ymm0, $01
vpackusdw xmm0, xmm0, xmm1
}
macro casti8tol8 {
vpmovsxdq zmm0, ymm0
}
macro casti8toi {
vmovd dsc0, xmm0
}
macro casti8toi2 {
vpand xmm0, xmm0, [cons$int8.m1_0]
}
macro casti8toi4 {
vmovdqa xmm0, xmm0
}
; </fold>
; </fold>