gte: split arm code for pollux, generate flagless handlers
[pcsx_rearmed.git] / libpcsxcore / gte_arm.s
1 /*
2  * (C) GraÅžvydas "notaz" Ignotas, 2011
3  *
4  * This work is licensed under the terms of any of these licenses
5  * (at your option):
6  *  - GNU GPL, version 2 or later.
7  *  - GNU LGPL, version 2.1 or later.
8  * See the COPYING file in the top-level directory.
9  */
10
11 /* .equiv HAVE_ARMV7, 1 */
12
13 .text
14 .align 2
15
16 .macro sgnxt16 reg
17 .if HAVE_ARMV7
18     sxth        \reg, \reg
19 .else
20     lsl         \reg, \reg, #16
21     asr         \reg, \reg, #16
22 .endif
23 .endm
24
25
26 .global gteNCLIP_arm @ r0=CP2 (d,c),
27 gteNCLIP_arm:
28     push        {r4-r6,lr}
29
30     add         r1, r0, #4*12
31     ldmia       r1, {r1-r3}
32     mov         r4, r1, asr #16
33     mov         r5, r2, asr #16
34     mov         r6, r3, asr #16
35     sub         r12, r4, r5       @ 3: gteSY0 - gteSY1
36     sub         r5, r5, r6        @ 1: gteSY1 - gteSY2
37     sgnxt16     r1
38     smull       r1, r5, r1, r5    @ RdLo, RdHi
39     sub         r6, r4            @ 2: gteSY2 - gteSY0
40     sgnxt16     r2
41     smlal       r1, r5, r2, r6
42     mov         lr, #0            @ gteFLAG
43     sgnxt16     r3
44     smlal       r1, r5, r3, r12
45     mov         r6, #1<<31
46     orr         r6, #1<<15
47     movs        r2, r1, lsl #1
48     adc         r5, r5
49     cmp         r5, #0
50 .if HAVE_ARMV7
51     movtgt      lr, #((1<<31)|(1<<16))>>16
52 .else
53     movgt       lr, #(1<<31)
54     orrgt       lr, #(1<<16)
55 .endif
56     mvngt       r1, #1<<31        @ maxint
57     cmn         r5, #1
58     movmi       r1, #1<<31        @ minint
59     orrmi       lr, r6
60     str         r1, [r0, #4*24]
61     str         lr, [r0, #4*(32+31)] @ gteFLAG
62
63     pop         {r4-r6,pc}
64     .size       gteNCLIP_arm, .-gteNCLIP_arm
65
66
67 @ vim:filetype=armasm
68