X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fgte_neon.s;h=38bf9898f1b962945949bc5d5629c69635a0fe09;hp=22bde4e72bad35964661b3016562b5fd3d9fe5dd;hb=b78edec75aea5e9015e11dd71f7736d7e92b347b;hpb=17ed0d696a7a3649cc41dcf182e162c85002b33a diff --git a/libpcsxcore/gte_neon.s b/libpcsxcore/gte_neon.s index 22bde4e7..38bf9898 100644 --- a/libpcsxcore/gte_neon.s +++ b/libpcsxcore/gte_neon.s @@ -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