;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold avt.lang.Short8 (natives)>
method avt.lang.Short8$max$short8$short8$, \
value0, short8, \
value1, short8 ; returns short8 <fold >
menter
lverify value0, TAG_SHORT8
lverify value1, TAG_SHORT8
vmovdqa xmm0, [.value0]
vpmaxsw xmm0, xmm0, [.value1]
call inst$s8push
mleavex
eleave
; </fold>
method avt.lang.Short8$maxUnsigned$short8$short8$, \
value0, short8, \
value1, short8 ; returns short8 <fold >
menter
lverify value0, TAG_SHORT8
lverify value1, TAG_SHORT8
vmovdqa xmm0, [.value0]
vpmaxuw xmm0, xmm0, [.value1]
call inst$s8push
mleavex
eleave
; </fold>
method avt.lang.Short8$min$short8$short8$, \
value0, short8, \
value1, short8 ; returns short8 <fold >
menter
lverify value0, TAG_SHORT8
lverify value1, TAG_SHORT8
vmovdqa xmm0, [.value0]
vpminsw xmm0, xmm0, [.value1]
call inst$s8push
mleavex
eleave
; </fold>
method avt.lang.Short8$minUnsigned$short8$short8$, \
value0, short8, \
value1, short8 ; returns short8 <fold >
menter
lverify value0, TAG_SHORT8
lverify value1, TAG_SHORT8
vmovdqa xmm0, [.value0]
vpminuw xmm0, xmm0, [.value1]
call inst$s8push
mleavex
eleave
; </fold>
method avt.lang.Short8$rotateLeft$short8$int$, \
value, short8, \
bits, int ; returns short8 <fold >
menter
lverify value, TAG_SHORT8
lverify bits, TAG_INT
mov r1d, [.bits]
and r1d, $0f
mov r2d, $10
sub r2d, r1d
vmovdqa xmm3, [.value]
vmovd xmm2, r2d
vmovd xmm1, r1d
vpsllw xmm0, xmm3, xmm1
vpsrlw xmm3, xmm3, xmm2
vpor xmm0, xmm0, xmm3
call inst$s8push
mleavex
eleave
; </fold>
method avt.lang.Short8$rotateRight$short8$int$, \
value, short8, \
bits, int ; returns short8 <fold >
menter
lverify value, TAG_SHORT8
lverify bits, TAG_INT
mov r1d, [.bits]
and r1d, $0f
mov r2d, $10
sub r2d, r1d
vmovdqa xmm3, [.value]
vmovd xmm2, r2d
vmovd xmm1, r1d
vpsrlw xmm0, xmm3, xmm1
vpsllw xmm3, xmm3, xmm2
vpor xmm0, xmm0, xmm3
call inst$s8push
mleavex
eleave
; </fold>
method avt.lang.Short8$high$short8$, \
value, short8 ; returns short4 <fold >
menter
lverify value, TAG_SHORT8
s4load [.value+$08]
mleavex
eleave
; </fold>
method avt.lang.Short8$create$short4$short4$, \
value0, short4, \
value1, short4 ; returns short8 <fold >
menter
lverify value0, TAG_SHORT4
lverify value1, TAG_SHORT4
sload [.value0+$00]
sload [.value0+$02]
sload [.value0+$04]
sload [.value0+$06]
sload [.value1+$00]
sload [.value1+$02]
sload [.value1+$04]
sload [.value1+$06]
newvectors8
mleavex
eleave
; </fold>
method avt.lang.Short8$create$short2$short2$short2$short2$, \
value0, short2, \
value1, short2, \
value2, short2, \
value3, short2 ; returns short8 <fold >
menter
lverify value0, TAG_SHORT2
lverify value1, TAG_SHORT2
lverify value2, TAG_SHORT2
lverify value3, TAG_SHORT2
sload [.value0+$00]
sload [.value0+$02]
sload [.value1+$00]
sload [.value1+$02]
sload [.value2+$00]
sload [.value2+$02]
sload [.value3+$00]
sload [.value3+$02]
newvectors8
mleavex
eleave
; </fold>
method avt.lang.Short8$setElement$short8$int$short$, \
value, short8, \
index, int, \
element, short ; returns short8 <fold >
menter
lverify value, TAG_SHORT8
lverify index, TAG_INT
lverify element, TAG_INT
mov r0d, [.index]
cmp r0d, $00
jl .L.000
cmp r0d, $08
jl .L.001
.L.000: call inst$throwVectorIndexOutOfBoundsException
.L.001: mov r1d, [.element]
mov word[.value+r0*2], r1w
s8load [.value]
mleavex
eleave
; </fold>
method avt.lang.Short8$toInt4Bits$short8$, \
value, short8 ; returns int4 <fold >
menter
lverify value, TAG_SHORT8
i4load [.value]
mleavex
eleave
; </fold>
method avt.lang.Short8$toLong2Bits$short8$, \
value, short8 ; returns long2 <fold >
menter
lverify value, TAG_SHORT8
l2load [.value]
mleavex
eleave
; </fold>
; </fold>