1848b8605Smrg 2848b8605Smrg/* 3848b8605Smrg * Mesa 3-D graphics library 4848b8605Smrg * 5848b8605Smrg * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 6848b8605Smrg * 7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 8848b8605Smrg * copy of this software and associated documentation files (the "Software"), 9848b8605Smrg * to deal in the Software without restriction, including without limitation 10848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the 12848b8605Smrg * Software is furnished to do so, subject to the following conditions: 13848b8605Smrg * 14848b8605Smrg * The above copyright notice and this permission notice shall be included 15848b8605Smrg * in all copies or substantial portions of the Software. 16848b8605Smrg * 17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE. 24848b8605Smrg */ 25848b8605Smrg 26848b8605Smrg/* 27848b8605Smrg * NOTE: Avoid using spaces in between '(' ')' and arguments, especially 28848b8605Smrg * with macros like CONST, LLBL that expand to CONCAT(...). Putting spaces 29848b8605Smrg * in there will break the build on some platforms. 30848b8605Smrg */ 31848b8605Smrg 32848b8605Smrg#include "assyntax.h" 33848b8605Smrg#include "matypes.h" 34848b8605Smrg#include "clip_args.h" 35848b8605Smrg 36848b8605Smrg#define SRC0 REGOFF(0, ESI) 37848b8605Smrg#define SRC1 REGOFF(4, ESI) 38848b8605Smrg#define SRC2 REGOFF(8, ESI) 39848b8605Smrg#define SRC3 REGOFF(12, ESI) 40848b8605Smrg#define DST0 REGOFF(0, EDI) 41848b8605Smrg#define DST1 REGOFF(4, EDI) 42848b8605Smrg#define DST2 REGOFF(8, EDI) 43848b8605Smrg#define DST3 REGOFF(12, EDI) 44848b8605Smrg#define MAT0 REGOFF(0, EDX) 45848b8605Smrg#define MAT1 REGOFF(4, EDX) 46848b8605Smrg#define MAT2 REGOFF(8, EDX) 47848b8605Smrg#define MAT3 REGOFF(12, EDX) 48848b8605Smrg 49848b8605Smrg 50848b8605Smrg/* 51848b8605Smrg * Table for clip test. 52848b8605Smrg * 53848b8605Smrg * bit6 = SRC3 < 0 54848b8605Smrg * bit5 = SRC2 < 0 55848b8605Smrg * bit4 = abs(S(2)) > abs(S(3)) 56848b8605Smrg * bit3 = SRC1 < 0 57848b8605Smrg * bit2 = abs(S(1)) > abs(S(3)) 58848b8605Smrg * bit1 = SRC0 < 0 59848b8605Smrg * bit0 = abs(S(0)) > abs(S(3)) 60848b8605Smrg */ 61848b8605Smrg 62848b8605Smrg SEG_DATA 63848b8605Smrg 64848b8605Smrgclip_table: 65848b8605Smrg D_BYTE 0x00, 0x01, 0x00, 0x02, 0x04, 0x05, 0x04, 0x06 66848b8605Smrg D_BYTE 0x00, 0x01, 0x00, 0x02, 0x08, 0x09, 0x08, 0x0a 67848b8605Smrg D_BYTE 0x20, 0x21, 0x20, 0x22, 0x24, 0x25, 0x24, 0x26 68848b8605Smrg D_BYTE 0x20, 0x21, 0x20, 0x22, 0x28, 0x29, 0x28, 0x2a 69848b8605Smrg D_BYTE 0x00, 0x01, 0x00, 0x02, 0x04, 0x05, 0x04, 0x06 70848b8605Smrg D_BYTE 0x00, 0x01, 0x00, 0x02, 0x08, 0x09, 0x08, 0x0a 71848b8605Smrg D_BYTE 0x10, 0x11, 0x10, 0x12, 0x14, 0x15, 0x14, 0x16 72848b8605Smrg D_BYTE 0x10, 0x11, 0x10, 0x12, 0x18, 0x19, 0x18, 0x1a 73848b8605Smrg D_BYTE 0x3f, 0x3d, 0x3f, 0x3e, 0x37, 0x35, 0x37, 0x36 74848b8605Smrg D_BYTE 0x3f, 0x3d, 0x3f, 0x3e, 0x3b, 0x39, 0x3b, 0x3a 75848b8605Smrg D_BYTE 0x2f, 0x2d, 0x2f, 0x2e, 0x27, 0x25, 0x27, 0x26 76848b8605Smrg D_BYTE 0x2f, 0x2d, 0x2f, 0x2e, 0x2b, 0x29, 0x2b, 0x2a 77848b8605Smrg D_BYTE 0x3f, 0x3d, 0x3f, 0x3e, 0x37, 0x35, 0x37, 0x36 78848b8605Smrg D_BYTE 0x3f, 0x3d, 0x3f, 0x3e, 0x3b, 0x39, 0x3b, 0x3a 79848b8605Smrg D_BYTE 0x1f, 0x1d, 0x1f, 0x1e, 0x17, 0x15, 0x17, 0x16 80848b8605Smrg D_BYTE 0x1f, 0x1d, 0x1f, 0x1e, 0x1b, 0x19, 0x1b, 0x1a 81848b8605Smrg 82848b8605Smrg 83848b8605Smrg SEG_TEXT 84848b8605Smrg 85848b8605Smrg/* 86848b8605Smrg * _mesa_x86_cliptest_points4 87848b8605Smrg * 88848b8605Smrg * AL: ormask 89848b8605Smrg * AH: andmask 90848b8605Smrg * EBX: temp0 91848b8605Smrg * ECX: temp1 92848b8605Smrg * EDX: clipmask[] 93848b8605Smrg * ESI: clip[] 94848b8605Smrg * EDI: proj[] 95848b8605Smrg * EBP: temp2 96848b8605Smrg */ 97848b8605Smrg 98848b8605Smrg#if defined(__ELF__) && defined(__PIC__) && defined(GNU_ASSEMBLER) && !defined(ELFPIC) 99848b8605Smrg#define ELFPIC 100848b8605Smrg#endif 101848b8605Smrg 102848b8605SmrgALIGNTEXT16 103848b8605SmrgGLOBL GLNAME( _mesa_x86_cliptest_points4 ) 104848b8605SmrgHIDDEN(_mesa_x86_cliptest_points4) 105848b8605SmrgGLNAME( _mesa_x86_cliptest_points4 ): 106848b8605Smrg 107848b8605Smrg#ifdef ELFPIC 108848b8605Smrg#define FRAME_OFFSET 20 109848b8605Smrg#else 110848b8605Smrg#define FRAME_OFFSET 16 111848b8605Smrg#endif 112848b8605Smrg PUSH_L( ESI ) 113848b8605Smrg PUSH_L( EDI ) 114848b8605Smrg PUSH_L( EBP ) 115848b8605Smrg PUSH_L( EBX ) 116848b8605Smrg 117848b8605Smrg#ifdef ELFPIC 118848b8605Smrg /* store pointer to clip_table on stack */ 119848b8605Smrg CALL( LLBL(ctp4_get_eip) ) 120848b8605Smrg ADD_L( CONST(_GLOBAL_OFFSET_TABLE_), EBX ) 121848b8605Smrg MOV_L( REGOFF(clip_table@GOT, EBX), EBX ) 122848b8605Smrg PUSH_L( EBX ) 123848b8605Smrg JMP( LLBL(ctp4_clip_table_ready) ) 124848b8605Smrg 125848b8605SmrgLLBL(ctp4_get_eip): 126848b8605Smrg /* store eip in ebx */ 127848b8605Smrg MOV_L( REGIND(ESP), EBX ) 128848b8605Smrg RET 129848b8605Smrg 130848b8605SmrgLLBL(ctp4_clip_table_ready): 131848b8605Smrg#endif 132848b8605Smrg 133848b8605Smrg MOV_L( ARG_SOURCE, ESI ) 134848b8605Smrg MOV_L( ARG_DEST, EDI ) 135848b8605Smrg 136848b8605Smrg MOV_L( ARG_CLIP, EDX ) 137848b8605Smrg MOV_L( ARG_OR, EBX ) 138848b8605Smrg 139848b8605Smrg MOV_L( ARG_AND, EBP ) 140848b8605Smrg MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) 141848b8605Smrg 142848b8605Smrg MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) 143848b8605Smrg MOV_L( REGOFF(V4F_START, ESI), ESI ) 144848b8605Smrg 145848b8605Smrg OR_L( CONST(VEC_SIZE_4), REGOFF(V4F_FLAGS, EDI) ) 146848b8605Smrg MOV_L( EAX, ARG_SOURCE ) /* put stride in ARG_SOURCE */ 147848b8605Smrg 148848b8605Smrg MOV_L( CONST(4), REGOFF(V4F_SIZE, EDI) ) 149848b8605Smrg MOV_L( ECX, REGOFF(V4F_COUNT, EDI) ) 150848b8605Smrg 151848b8605Smrg MOV_L( REGOFF(V4F_START, EDI), EDI ) 152848b8605Smrg ADD_L( EDX, ECX ) 153848b8605Smrg 154848b8605Smrg MOV_L( ECX, ARG_CLIP ) /* put clipmask + count in ARG_CLIP */ 155848b8605Smrg CMP_L( ECX, EDX ) 156848b8605Smrg 157848b8605Smrg MOV_B( REGIND(EBX), AL ) 158848b8605Smrg MOV_B( REGIND(EBP), AH ) 159848b8605Smrg 160848b8605Smrg JZ( LLBL(ctp4_finish) ) 161848b8605Smrg 162848b8605SmrgALIGNTEXT16 163848b8605SmrgLLBL(ctp4_top): 164848b8605Smrg 165848b8605Smrg FLD1 /* F3 */ 166848b8605Smrg FDIV_S( SRC3 ) /* GH: don't care about div-by-zero */ 167848b8605Smrg 168848b8605Smrg MOV_L( SRC3, EBP ) 169848b8605Smrg MOV_L( SRC2, EBX ) 170848b8605Smrg 171848b8605Smrg XOR_L( ECX, ECX ) 172848b8605Smrg ADD_L( EBP, EBP ) /* ebp = abs(S(3))*2 ; carry = sign of S(3) */ 173848b8605Smrg 174848b8605Smrg ADC_L( ECX, ECX ) 175848b8605Smrg ADD_L( EBX, EBX ) /* ebx = abs(S(2))*2 ; carry = sign of S(2) */ 176848b8605Smrg 177848b8605Smrg ADC_L( ECX, ECX ) 178848b8605Smrg CMP_L( EBX, EBP ) /* carry = abs(S(2))*2 > abs(S(3))*2 */ 179848b8605Smrg 180848b8605Smrg ADC_L( ECX, ECX ) 181848b8605Smrg MOV_L( SRC1, EBX ) 182848b8605Smrg 183848b8605Smrg ADD_L( EBX, EBX ) /* ebx = abs(S(1))*2 ; carry = sign of S(1) */ 184848b8605Smrg 185848b8605Smrg ADC_L( ECX, ECX ) 186848b8605Smrg CMP_L( EBX, EBP ) /* carry = abs(S(1))*2 > abs(S(3))*2 */ 187848b8605Smrg 188848b8605Smrg ADC_L( ECX, ECX ) 189848b8605Smrg MOV_L( SRC0, EBX ) 190848b8605Smrg 191848b8605Smrg ADD_L( EBX, EBX ) /* ebx = abs(S(0))*2 ; carry = sign of S(0) */ 192848b8605Smrg 193848b8605Smrg ADC_L( ECX, ECX ) 194848b8605Smrg CMP_L( EBX, EBP ) /* carry = abs(S(0))*2 > abs(S(3))*2 */ 195848b8605Smrg 196848b8605Smrg ADC_L( ECX, ECX ) 197848b8605Smrg 198848b8605Smrg#ifdef ELFPIC 199848b8605Smrg MOV_L( REGIND(ESP), EBP ) /* clip_table */ 200848b8605Smrg 201848b8605Smrg MOV_B( REGBI(EBP, ECX), CL ) 202848b8605Smrg#else 203848b8605Smrg MOV_B( REGOFF(clip_table,ECX), CL ) 204848b8605Smrg#endif 205848b8605Smrg 206848b8605Smrg OR_B( CL, AL ) 207848b8605Smrg AND_B( CL, AH ) 208848b8605Smrg 209848b8605Smrg TEST_B( CL, CL ) 210848b8605Smrg MOV_B( CL, REGIND(EDX) ) 211848b8605Smrg 212848b8605Smrg JZ( LLBL(ctp4_proj) ) 213848b8605Smrg 214848b8605SmrgLLBL(ctp4_noproj): 215848b8605Smrg 216848b8605Smrg FSTP( ST(0) ) /* */ 217848b8605Smrg 218848b8605Smrg MOV_L( CONST(0), DST0 ) 219848b8605Smrg MOV_L( CONST(0), DST1 ) 220848b8605Smrg MOV_L( CONST(0), DST2 ) 221848b8605Smrg MOV_L( CONST(0x3f800000), DST3 ) 222848b8605Smrg 223848b8605Smrg JMP( LLBL(ctp4_next) ) 224848b8605Smrg 225848b8605SmrgLLBL(ctp4_proj): 226848b8605Smrg 227848b8605Smrg FLD_S( SRC0 ) /* F0 F3 */ 228848b8605Smrg FMUL2( ST(1), ST0 ) 229848b8605Smrg 230848b8605Smrg FLD_S( SRC1 ) /* F1 F0 F3 */ 231848b8605Smrg FMUL2( ST(2), ST0 ) 232848b8605Smrg 233848b8605Smrg FLD_S( SRC2 ) /* F2 F1 F0 F3 */ 234848b8605Smrg FMUL2( ST(3), ST0 ) 235848b8605Smrg 236848b8605Smrg FXCH( ST(2) ) /* F0 F1 F2 F3 */ 237848b8605Smrg FSTP_S( DST0 ) /* F1 F2 F3 */ 238848b8605Smrg FSTP_S( DST1 ) /* F2 F3 */ 239848b8605Smrg FSTP_S( DST2 ) /* F3 */ 240848b8605Smrg FSTP_S( DST3 ) /* */ 241848b8605Smrg 242848b8605SmrgLLBL(ctp4_next): 243848b8605Smrg 244848b8605Smrg INC_L( EDX ) 245848b8605Smrg ADD_L( CONST(16), EDI ) 246848b8605Smrg 247848b8605Smrg ADD_L( ARG_SOURCE, ESI ) 248848b8605Smrg CMP_L( EDX, ARG_CLIP ) 249848b8605Smrg 250848b8605Smrg JNZ( LLBL(ctp4_top) ) 251848b8605Smrg 252848b8605Smrg MOV_L( ARG_OR, ECX ) 253848b8605Smrg MOV_L( ARG_AND, EDX ) 254848b8605Smrg 255848b8605Smrg MOV_B( AL, REGIND(ECX) ) 256848b8605Smrg MOV_B( AH, REGIND(EDX) ) 257848b8605Smrg 258848b8605SmrgLLBL(ctp4_finish): 259848b8605Smrg 260848b8605Smrg MOV_L( ARG_DEST, EAX ) 261848b8605Smrg#ifdef ELFPIC 262848b8605Smrg POP_L( ESI ) /* discard ptr to clip_table */ 263848b8605Smrg#endif 264848b8605Smrg POP_L( EBX ) 265848b8605Smrg POP_L( EBP ) 266848b8605Smrg POP_L( EDI ) 267848b8605Smrg POP_L( ESI ) 268848b8605Smrg 269848b8605Smrg RET 270848b8605Smrg 271848b8605Smrg 272848b8605Smrg 273848b8605Smrg 274848b8605Smrg 275848b8605Smrg 276848b8605Smrg 277848b8605SmrgALIGNTEXT16 278848b8605SmrgGLOBL GLNAME( _mesa_x86_cliptest_points4_np ) 279848b8605SmrgHIDDEN(_mesa_x86_cliptest_points4_np) 280848b8605SmrgGLNAME( _mesa_x86_cliptest_points4_np ): 281848b8605Smrg 282848b8605Smrg#ifdef ELFPIC 283848b8605Smrg#define FRAME_OFFSET 20 284848b8605Smrg#else 285848b8605Smrg#define FRAME_OFFSET 16 286848b8605Smrg#endif 287848b8605Smrg PUSH_L( ESI ) 288848b8605Smrg PUSH_L( EDI ) 289848b8605Smrg PUSH_L( EBP ) 290848b8605Smrg PUSH_L( EBX ) 291848b8605Smrg 292848b8605Smrg#ifdef ELFPIC 293848b8605Smrg /* store pointer to clip_table on stack */ 294848b8605Smrg CALL( LLBL(ctp4_np_get_eip) ) 295848b8605Smrg ADD_L( CONST(_GLOBAL_OFFSET_TABLE_), EBX ) 296848b8605Smrg MOV_L( REGOFF(clip_table@GOT, EBX), EBX ) 297848b8605Smrg PUSH_L( EBX ) 298848b8605Smrg JMP( LLBL(ctp4_np_clip_table_ready) ) 299848b8605Smrg 300848b8605SmrgLLBL(ctp4_np_get_eip): 301848b8605Smrg /* store eip in ebx */ 302848b8605Smrg MOV_L( REGIND(ESP), EBX ) 303848b8605Smrg RET 304848b8605Smrg 305848b8605SmrgLLBL(ctp4_np_clip_table_ready): 306848b8605Smrg#endif 307848b8605Smrg 308848b8605Smrg MOV_L( ARG_SOURCE, ESI ) 309848b8605Smrg /* slot */ 310848b8605Smrg 311848b8605Smrg MOV_L( ARG_CLIP, EDX ) 312848b8605Smrg MOV_L( ARG_OR, EBX ) 313848b8605Smrg 314848b8605Smrg MOV_L( ARG_AND, EBP ) 315848b8605Smrg MOV_L( REGOFF(V4F_STRIDE, ESI), EAX ) 316848b8605Smrg 317848b8605Smrg MOV_L( REGOFF(V4F_COUNT, ESI), ECX ) 318848b8605Smrg MOV_L( REGOFF(V4F_START, ESI), ESI ) 319848b8605Smrg 320848b8605Smrg MOV_L( EAX, ARG_DEST ) /* put stride in ARG_DEST */ 321848b8605Smrg ADD_L( EDX, ECX ) 322848b8605Smrg 323848b8605Smrg MOV_L( ECX, EDI ) /* put clipmask + count in EDI */ 324848b8605Smrg CMP_L( ECX, EDX ) 325848b8605Smrg 326848b8605Smrg MOV_B( REGIND(EBX), AL ) 327848b8605Smrg MOV_B( REGIND(EBP), AH ) 328848b8605Smrg 329848b8605Smrg JZ( LLBL(ctp4_np_finish) ) 330848b8605Smrg 331848b8605SmrgALIGNTEXT16 332848b8605SmrgLLBL(ctp4_np_top): 333848b8605Smrg 334848b8605Smrg MOV_L( SRC3, EBP ) 335848b8605Smrg MOV_L( SRC2, EBX ) 336848b8605Smrg 337848b8605Smrg XOR_L( ECX, ECX ) 338848b8605Smrg ADD_L( EBP, EBP ) /* ebp = abs(S(3))*2 ; carry = sign of S(3) */ 339848b8605Smrg 340848b8605Smrg ADC_L( ECX, ECX ) 341848b8605Smrg ADD_L( EBX, EBX ) /* ebx = abs(S(2))*2 ; carry = sign of S(2) */ 342848b8605Smrg 343848b8605Smrg ADC_L( ECX, ECX ) 344848b8605Smrg CMP_L( EBX, EBP ) /* carry = abs(S(2))*2 > abs(S(3))*2 */ 345848b8605Smrg 346848b8605Smrg ADC_L( ECX, ECX ) 347848b8605Smrg MOV_L( SRC1, EBX ) 348848b8605Smrg 349848b8605Smrg ADD_L( EBX, EBX ) /* ebx = abs(S(1))*2 ; carry = sign of S(1) */ 350848b8605Smrg 351848b8605Smrg ADC_L( ECX, ECX ) 352848b8605Smrg CMP_L( EBX, EBP ) /* carry = abs(S(1))*2 > abs(S(3))*2 */ 353848b8605Smrg 354848b8605Smrg ADC_L( ECX, ECX ) 355848b8605Smrg MOV_L( SRC0, EBX ) 356848b8605Smrg 357848b8605Smrg ADD_L( EBX, EBX ) /* ebx = abs(S(0))*2 ; carry = sign of S(0) */ 358848b8605Smrg 359848b8605Smrg ADC_L( ECX, ECX ) 360848b8605Smrg CMP_L( EBX, EBP ) /* carry = abs(S(0))*2 > abs(S(3))*2 */ 361848b8605Smrg 362848b8605Smrg ADC_L( ECX, ECX ) 363848b8605Smrg 364848b8605Smrg#ifdef ELFPIC 365848b8605Smrg MOV_L( REGIND(ESP), EBP ) /* clip_table */ 366848b8605Smrg 367848b8605Smrg MOV_B( REGBI(EBP, ECX), CL ) 368848b8605Smrg#else 369848b8605Smrg MOV_B( REGOFF(clip_table,ECX), CL ) 370848b8605Smrg#endif 371848b8605Smrg 372848b8605Smrg OR_B( CL, AL ) 373848b8605Smrg AND_B( CL, AH ) 374848b8605Smrg 375848b8605Smrg TEST_B( CL, CL ) 376848b8605Smrg MOV_B( CL, REGIND(EDX) ) 377848b8605Smrg 378848b8605Smrg INC_L( EDX ) 379848b8605Smrg /* slot */ 380848b8605Smrg 381848b8605Smrg ADD_L( ARG_DEST, ESI ) 382848b8605Smrg CMP_L( EDX, EDI ) 383848b8605Smrg 384848b8605Smrg JNZ( LLBL(ctp4_np_top) ) 385848b8605Smrg 386848b8605Smrg MOV_L( ARG_OR, ECX ) 387848b8605Smrg MOV_L( ARG_AND, EDX ) 388848b8605Smrg 389848b8605Smrg MOV_B( AL, REGIND(ECX) ) 390848b8605Smrg MOV_B( AH, REGIND(EDX) ) 391848b8605Smrg 392848b8605SmrgLLBL(ctp4_np_finish): 393848b8605Smrg 394848b8605Smrg MOV_L( ARG_SOURCE, EAX ) 395848b8605Smrg#ifdef ELFPIC 396848b8605Smrg POP_L( ESI ) /* discard ptr to clip_table */ 397848b8605Smrg#endif 398848b8605Smrg POP_L( EBX ) 399848b8605Smrg POP_L( EBP ) 400848b8605Smrg POP_L( EDI ) 401848b8605Smrg POP_L( ESI ) 402848b8605Smrg 403848b8605Smrg RET 404848b8605Smrg 405848b8605Smrg#if defined (__ELF__) && defined (__linux__) 406848b8605Smrg .section .note.GNU-stack,"",%progbits 407848b8605Smrg#endif 408