gte: split arm code for pollux, generate flagless handlers
[pcsx_rearmed.git] / libpcsxcore / gte_neon.s
index 22bde4e..ab8c1b6 100644 (file)
@@ -20,6 +20,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 +236,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
@@ -464,14 +467,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]
 
@@ -625,41 +629,4 @@ gteMVMVA_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