gpu_neon: fix x86 build
[pcsx_rearmed.git] / libpcsxcore / gte_neon.s
index 22bde4e..38bf989 100644 (file)
@@ -1,10 +1,7 @@
 /*
  * (C) GraÅžvydas "notaz" Ignotas, 2011
  *
- * This work is licensed under the terms of any of these licenses
- * (at your option):
- *  - GNU GPL, version 2 or later.
- *  - GNU LGPL, version 2.1 or later.
+ * This work is licensed under the terms of GNU GPL version 2 or later.
  * See the COPYING file in the top-level directory.
  */
 
@@ -20,6 +17,8 @@ scratch:
 .text
 .align 2
 
+@ XXX: gteMAC calc shouldn't be saturating, but it is here
+
 @ approximate gteMAC|123 flags
 @ in: rr 123 as gteMAC|123
 @ trash: nothing
@@ -234,18 +233,19 @@ gteRTPS_neon:
     vadd.s64    d20, d7        @ | gteDQB + gteDQA * quotient
     vmovn.s32   d18, q9        @ fS|XY2 [s16]
 
-    vqshrn.s64  d20, q10, #12  @ | gteMAC0
+    vqmovn.s64  d20, q10       @ | gteMAC0
     add         r3, r0, #4*12
     vst1.32     d16, [r3]!     @ writeback fS|XY01
     vst1.32     d18[0], [r3]   @ ...2
     add         r3, r0, #4*24
+    vshr.s32    d21, d20, #12
     vst1.32     d20[0], [r3]   @ gteMAC0
 
     movs        r4, r4, lsr #17
     orrne       lr, #(1<<31)
     orrne       lr, #(1<<17)   @ limE
 
-    vmax.s32    d21, d20, d31
+    vmax.s32    d21, d31
     vmov.i32    d22, #0x1000
     vmin.s32    d21, d22
     add         r3, r0, #4*8
@@ -379,8 +379,8 @@ gteRTPT_neon:
     add         r3, r0, #4*16
     vst1.32     d14[0], [r3]   @ gteSZ0 = gteSZ3
     vdup.32     q13, d13[0]    @ |
-@   vrecps.f32  q12, q10, q11  @ step
-@   vmul.f32    q11, q12, q11  @ better inv
+    vrecps.f32  q12, q10, q11  @ step
+    vmul.f32    q11, q12, q11  @ better inv
     vmul.f32    q10, q13, q11  @ result
 .else
     vmovl.s32   q2, d4         @ || gteOF|XY [64]
@@ -464,14 +464,15 @@ gteRTPT_neon:
     vst1.32     d12, [r3]!     @ writeback fS|XY v=0,1
     vst1.32     d13[0], [r3]
 
-    vqshrn.s64  d26, q13, #12  @ | gteMAC0
+    vqmovn.s64  d26, q13       @ | gteMAC0
     vmovl.u16   q5, d10        @ expand gteIR|123 v=2
 
     vmov.i32    d13, #0x1000
-    vmax.s32    d12, d26, d30
+    vshr.s32    d12, d26, #12
 
     add         r3, r0, #4*24
     vst1.32     d26[0], [r3]!  @ gteMAC0
+    vmax.s32    d12, d30
     vst1.32     d8, [r3]!      @ gteMAC123 (last iteration)
     vst1.32     d9[0], [r3]
 
@@ -526,40 +527,20 @@ gteRTPT_neon:
 
 
 
-.global gteMVMVA_neon @ r0=CP2 (d,c), op
-gteMVMVA_neon:
-    push        {r4-r5,lr}
-
-    add         r12, r0, #4*32
-
-    ubfx        r2, r1, #15, #2 @ v
-
-    vmov.i32    q0, #0          @ d0,d1
-    vmov.i32    q1, #0          @ d2,d3
-    vmov.i32    q2, #0          @ d4,d5
-    cmp         r2, #3
-    addeq       r4, r0, #4*9
-    addne       r3, r0, r2, lsl #3
-    ldmeqia     r4, {r3-r5}
-    ldmneia     r3, {r4,r5}
-    pkhbteq     r4, r3, r4, lsl #16
+@ note: non-std calling convention used
+@ r0 = CP2 (d,c)  (must preserve)
+@ r1 = op
+@ r4,r5 = VXYZ(v) packed
+@ r6 = &MX11(mx)
+@ r7 = &CV1(cv)
+.global gteMVMVA_part_neon
+gteMVMVA_part_neon:
     uxth        r5, r5
     vmov.32     d8[0], r4
     vmov.32     d8[1], r5       @ VXYZ(v)
-    ubfx        r3, r1, #17, #2 @ mx
-    ubfx        r2, r1, #13, #2 @ cv
-    cmp         r3, #3
-    beq         0f              @ very rare case
-    add         r3, r12, r3, lsl #5
-    vldmia      r3, {d0-d2}     @ MXxy/gteR*  [16*9]
-0:
-    cmp         r2, #3
-    add         r3, r12, r2, lsl #5
-    beq         0f
-    add         r3, #4*5
-    vldmia      r3, {d4-d5}     @ CVx/gteTR*
+    vldmia      r6, {d0-d2}     @ MXxy/gteR*  [16*9]
+    vldmia      r7, {d4-d5}     @ CVx/gteTR*
 
-0:
     vmov.i32    q15, #0
     vext.16     d2, d1, d2, #2 @ xxx3 -> x321
     vext.16     d1, d0, d1, #3 @ xx32 -> x321
@@ -595,10 +576,17 @@ gteMVMVA_neon:
     add         r3, r0, #4*9
     vst1.32     d18, [r3]!
     vst1.32     d19[0], [r3]
+    bx          lr
+    .size       gteMVMVA_part_neon, .-gteMVMVA_part_neon
 
-    tst         r1, #1<<10     @ lm
-    mov         r2, #0
+
+@ get flags after gteMVMVA_part_neon operation
+.global gteMACtoIR_flags_neon @ r0=CP2 (d,c), r1=lm
+gteMACtoIR_flags_neon:
+    push        {r4,r5,lr}
+    tst         r1, r1         @ lm
     mov         lr, #0         @ gteFLAG
+    mov         r2, #0
     mov         r12, #15
     moveq       r2, #0x8000    @ adj
     moveq       r12, #16       @ shift
@@ -620,46 +608,9 @@ gteMVMVA_neon:
     orrne       lr, #(1<<22)   @ IR3/limB3
     str         lr, [r0, #4*(32+31)] @ gteFLAG
 
-    pop         {r4-r5,pc}
-    .size      gteMVMVA_neon, .-gteMVMVA_neon
-
+    pop         {r4,r5,pc}
+    .size       gteMACtoIR_flags_neon, .-gteMACtoIR_flags_neon
 
 
-@ the name is misnormer, this doesn't use NEON but oh well..
-.global gteNCLIP_neon @ r0=CP2 (d,c),
-gteNCLIP_neon:
-    push        {r4-r6,lr}
-
-    add         r1, r0, #4*12
-    ldmia       r1, {r1-r3}
-    mov         r4, r1, asr #16
-    mov         r5, r2, asr #16
-    mov         r6, r3, asr #16
-    sub         r12, r4, r5       @ 3: gteSY0 - gteSY1
-    sub         r5, r5, r6        @ 1: gteSY1 - gteSY2
-    sxth        r1, r1
-    smull       r1, r5, r1, r5    @ RdLo, RdHi
-    sub         r6, r4            @ 2: gteSY2 - gteSY0
-    sxth        r2, r2
-    smlal       r1, r5, r2, r6
-    mov         lr, #0            @ gteFLAG
-    sxth        r3, r3
-    smlal       r1, r5, r3, r12
-    mov         r6, #1<<31
-    orr         r6, #1<<15
-    movs        r2, r1, lsl #1
-    adc         r5, r5
-    cmp         r5, #0
-    movtgt      lr, #((1<<31)|(1<<16))>>16
-    mvngt       r1, #1<<31        @ maxint
-    cmn         r5, #1
-    movmi       r1, #1<<31        @ minint
-    orrmi       lr, r6
-    str         r1, [r0, #4*24]
-    str         lr, [r0, #4*(32+31)] @ gteFLAG
-
-    pop         {r4-r6,pc}
-    .size      gteNCLIP_neon, .-gteNCLIP_neon
-
 
 @ vim:filetype=armasm