2014-12-31 08:50:38 -05:00
|
|
|
//
|
|
|
|
// arch/x86_64/rsp/gcc/vch.s
|
|
|
|
//
|
2015-07-01 19:44:21 -04:00
|
|
|
// CEN64: Cycle-Accurate Nintendo 64 Emulator.
|
|
|
|
// Copyright (C) 2015, Tyler J. Stachecki.
|
2014-12-31 08:50:38 -05:00
|
|
|
//
|
|
|
|
// This file is subject to the terms and conditions defined in
|
|
|
|
// 'LICENSE', which is part of this source code package.
|
|
|
|
//
|
|
|
|
|
|
|
|
.include "rsp/gcc/defs.h"
|
|
|
|
|
|
|
|
.text
|
|
|
|
|
|
|
|
.ifdef __MINGW__
|
|
|
|
.globl RSP_VCH
|
|
|
|
.def RSP_VCH; .scl 2; .type 32; .endef
|
|
|
|
.seh_proc RSP_VCH
|
|
|
|
.ifndef __VECTORCALL__
|
|
|
|
RSP_VCH:
|
|
|
|
movdqa (%r8), %xmm0
|
|
|
|
movdqa (%r9), %xmm1
|
|
|
|
pxor %xmm2, %xmm2
|
|
|
|
.endif
|
|
|
|
.else
|
|
|
|
.global RSP_VCH
|
|
|
|
.type RSP_VCH, @function
|
|
|
|
RSP_VCH:
|
|
|
|
.endif
|
|
|
|
|
|
|
|
.ifdef __AVX__
|
|
|
|
vpxor %xmm0, %xmm1, vco_lo
|
|
|
|
psraw $0xF, vco_lo
|
|
|
|
vpxor %xmm0, vco_lo, %xmm3
|
|
|
|
psubw vco_lo, %xmm3
|
|
|
|
vpsubw %xmm3, %xmm1, %xmm4
|
|
|
|
psraw $0xF, %xmm0
|
2014-12-31 10:36:09 -05:00
|
|
|
vpcmpeqw %xmm4, %xmm2, acc_lo
|
2014-12-31 08:50:38 -05:00
|
|
|
|
|
|
|
# vce
|
|
|
|
vpcmpeqw vco_lo, %xmm4, vce
|
|
|
|
pand vco_lo, vce
|
|
|
|
|
|
|
|
# !eq
|
2014-12-31 10:36:09 -05:00
|
|
|
vpor acc_lo, vce, vco_hi
|
2014-12-31 08:50:38 -05:00
|
|
|
pcmpeqw %xmm2, vco_hi
|
|
|
|
|
|
|
|
# le/ge
|
|
|
|
pcmpgtw %xmm2, %xmm4
|
2014-12-31 10:36:09 -05:00
|
|
|
por %xmm4, acc_lo
|
|
|
|
vpblendvb vco_lo, %xmm0, acc_lo, vcc_hi
|
2014-12-31 08:50:38 -05:00
|
|
|
pcmpeqw %xmm2, %xmm4
|
|
|
|
vpblendvb vco_lo, %xmm4, %xmm0, vcc_lo
|
|
|
|
|
|
|
|
# vd
|
|
|
|
vpblendvb vco_lo, vcc_lo, vcc_hi, %xmm2
|
|
|
|
vpblendvb %xmm2, %xmm3, %xmm1, %xmm0
|
2014-12-31 10:36:09 -05:00
|
|
|
movdqa %xmm0, acc_lo
|
2014-12-31 08:50:38 -05:00
|
|
|
retq
|
|
|
|
|
|
|
|
.elseif __SSE4_1__ == 1
|
2014-12-31 10:36:09 -05:00
|
|
|
movdqa %xmm1, acc_lo
|
2014-12-31 08:50:38 -05:00
|
|
|
movdqa %xmm0, vcc_lo
|
|
|
|
movdqa %xmm0, %xmm3
|
|
|
|
pxor %xmm1, %xmm0
|
|
|
|
psraw $0xF, %xmm0
|
|
|
|
pxor %xmm0, %xmm3
|
|
|
|
psubw %xmm0, %xmm3
|
|
|
|
psubw %xmm3, %xmm1
|
|
|
|
pxor %xmm4, %xmm4
|
|
|
|
psraw $0xF, vcc_lo
|
|
|
|
pcmpeqw %xmm1, %xmm4
|
|
|
|
|
|
|
|
# vce
|
|
|
|
movdqa %xmm0, vce
|
|
|
|
pcmpeqw %xmm1, vce
|
|
|
|
pand %xmm1, vce
|
|
|
|
|
|
|
|
# !eq
|
|
|
|
movdqa vce, vco_hi
|
|
|
|
por %xmm4, vco_hi
|
|
|
|
pcmpeqw %xmm2, vco_hi
|
|
|
|
|
|
|
|
# le/ge
|
|
|
|
pcmpgtw %xmm2, %xmm1
|
|
|
|
por %xmm1, %xmm4
|
|
|
|
movdqa %xmm4, vcc_hi
|
|
|
|
pblendvb %xmm0, vcc_lo, vcc_hi
|
|
|
|
pcmpeqw %xmm2, %xmm1
|
|
|
|
pblendvb %xmm0, %xmm1, vcc_lo
|
|
|
|
|
|
|
|
# vd
|
|
|
|
movdqa %xmm0, vco_lo
|
|
|
|
pblendvb %xmm0, vcc_lo, %xmm4
|
|
|
|
movdqa %xmm4, %xmm0
|
2014-12-31 10:36:09 -05:00
|
|
|
pblendvb %xmm0, %xmm3, acc_lo
|
|
|
|
movdqa acc_lo, %xmm0
|
2014-12-31 08:50:38 -05:00
|
|
|
retq
|
|
|
|
|
|
|
|
.else
|
|
|
|
movdqa %xmm0, vco_lo
|
|
|
|
movdqa %xmm1, vce
|
|
|
|
pxor %xmm1, vco_lo
|
|
|
|
movdqa %xmm1, vco_hi
|
|
|
|
psraw $0xF, vco_lo
|
|
|
|
movdqa %xmm0, acc_lo
|
|
|
|
movdqa %xmm1, vcc_lo
|
|
|
|
pxor vco_lo, acc_lo
|
|
|
|
movdqa %xmm1, vcc_hi
|
|
|
|
pcmpeqw acc_lo, vce
|
|
|
|
pand vco_lo, vcc_lo
|
|
|
|
por vco_lo, vcc_hi
|
|
|
|
psubw vco_lo, acc_lo
|
|
|
|
pand vco_lo, vce
|
|
|
|
paddw %xmm0, vcc_lo
|
|
|
|
pcmpeqw acc_lo, vco_hi
|
|
|
|
pminsw %xmm0, vcc_hi
|
|
|
|
paddsw vco_lo, vcc_lo
|
|
|
|
por vce, vco_hi
|
|
|
|
psraw $0xF, vcc_lo
|
|
|
|
pcmpeqw %xmm0, vcc_hi
|
|
|
|
movdqa vcc_lo, %xmm3
|
|
|
|
pcmpeqw %xmm2, vco_hi
|
|
|
|
psubw vcc_hi, %xmm3
|
|
|
|
psubw %xmm1, acc_lo
|
|
|
|
pand vco_lo, %xmm3
|
|
|
|
paddw vcc_hi, %xmm3
|
|
|
|
pand %xmm3, acc_lo
|
|
|
|
paddw %xmm1, acc_lo
|
|
|
|
movdqa acc_lo, %xmm0
|
|
|
|
retq
|
|
|
|
.endif
|
|
|
|
|
|
|
|
.ifdef __MINGW__
|
|
|
|
.seh_endproc
|
|
|
|
.else
|
|
|
|
.size RSP_VCH,.-RSP_VCH
|
|
|
|
.endif
|
|
|
|
|