;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold avt.lang.Long8 (natives)>
method avt.lang.Long8$max$long8$long8$, \
value0, long8, \
value1, long8 ; returns long8 <fold >
menter
lverify value0, TAG_LONG8
lverify value1, TAG_LONG8
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vpmaxsq zmm0, zmm0, zmm1
call inst$l8push
mleavez
eleave
; </fold>
method avt.lang.Long8$maxUnsigned$long8$long8$, \
value0, long8, \
value1, long8 ; returns long8 <fold >
menter
lverify value0, TAG_LONG8
lverify value1, TAG_LONG8
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vpmaxuq zmm0, zmm0, zmm1
call inst$l8push
mleavez
eleave
; </fold>
method avt.lang.Long8$min$long8$long8$, \
value0, long8, \
value1, long8 ; returns long8 <fold >
menter
lverify value0, TAG_LONG8
lverify value1, TAG_LONG8
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vpminsq zmm0, zmm0, zmm1
call inst$l8push
mleavez
eleave
; </fold>
method avt.lang.Long8$minUnsigned$long8$long8$, \
value0, long8, \
value1, long8 ; returns long8 <fold >
menter
lverify value0, TAG_LONG8
lverify value1, TAG_LONG8
vmovdqu64 zmm0, [.value0]
vmovdqu64 zmm1, [.value1]
vpmaxuq zmm0, zmm0, zmm1
call inst$l8push
mleavez
eleave
; </fold>
method avt.lang.Long8$rotateLeft$long8$int$, \
value, long8, \
bits, int ; returns long8 <fold >
menter
lverify value, TAG_LONG8
lverify bits, TAG_INT
mov r1d, [.bits]
and r1d, $3f
mov r2d, $40
sub r2d, r1d
vmovdqu64 zmm3, [.value]
vmovd xmm2, r2d
vmovd xmm1, r1d
vpsllq zmm0, zmm3, xmm1
vpsrlq zmm3, zmm3, xmm2
vporq zmm0, zmm0, zmm3
call inst$l8push
mleavez
eleave
; </fold>
method avt.lang.Long8$rotateRight$long8$int$, \
value, long8, \
bits, int ; returns long8 <fold >
menter
lverify value, TAG_LONG8
lverify bits, TAG_INT
mov r1d, [.bits]
and r1d, $3f
mov r2d, $40
sub r2d, r1d
vmovdqu64 zmm3, [.value]
vmovd xmm2, r2d
vmovd xmm1, r1d
vpsrlq zmm0, zmm3, xmm1
vpsllq zmm3, zmm3, xmm2
vporq zmm0, zmm0, zmm3
call inst$l8push
mleavez
eleave
; </fold>
method avt.lang.Long8$high$long8$, \
value, long8 ; returns long4 <fold >
menter
lverify value, TAG_LONG8
l4load [.value+$20]
mleavey
eleave
; </fold>
method avt.lang.Long8$create$long4$long4$, \
value0, long4, \
value1, long4 ; returns long8 <fold >
menter
lverify value0, TAG_LONG4
lverify value1, TAG_LONG4
lload [.value0+$00]
lload [.value0+$08]
lload [.value0+$10]
lload [.value0+$18]
lload [.value1+$00]
lload [.value1+$08]
lload [.value1+$10]
lload [.value1+$18]
newvectorl8
mleavez
eleave
; </fold>
method avt.lang.Long8$create$long2$long2$long2$long2$, \
value0, long2, \
value1, long2, \
value2, long2, \
value3, long2 ; returns long8 <fold >
menter
lverify value0, TAG_LONG2
lverify value1, TAG_LONG2
lverify value2, TAG_LONG2
lverify value3, TAG_LONG2
lload [.value0+$00]
lload [.value0+$08]
lload [.value1+$00]
lload [.value1+$08]
lload [.value2+$00]
lload [.value2+$08]
lload [.value3+$00]
lload [.value3+$08]
newvectorl8
mleavez
eleave
; </fold>
method avt.lang.Long8$setElement$long8$int$long$, \
value, long8, \
index, int, \
element, long ; returns long8 <fold >
menter
lverify value, TAG_LONG8
lverify index, TAG_INT
lverify element, TAG_LONG
mov r0d, [.index]
cmp r0d, $00
jl .L.000
cmp r0d, $08
jl .L.001
.L.000: call inst$throwVectorIndexOutOfBoundsException
.L.001: mov r1, [.element]
mov qword[.value+r0*8], r1
l8load [.value]
mleavez
eleave
; </fold>
method avt.lang.Long8$toDouble8Bits$long8$, \
value, long8 ; returns double8 <fold >
menter
lverify value, TAG_LONG8
d8load [.value]
mleavez
eleave
; </fold>
; </fold>