Annotation of OpenXM_contrib/pari-2.2/src/kernel/sparcv8/level0_sparcv8_super.S, Revision 1.1
1.1 ! noro 1: /* $Id: level0_sparcv8_super.S,v 1.2 2000/11/03 21:00:27 karim Exp $
! 2:
! 3: Copyright (C) 2000 The PARI group.
! 4:
! 5: This file is part of the PARI/GP package.
! 6:
! 7: PARI/GP is free software; you can redistribute it and/or modify it under the
! 8: terms of the GNU General Public License as published by the Free Software
! 9: Foundation. It is distributed in the hope that it will be useful, but WITHOUT
! 10: ANY WARRANTY WHATSOEVER.
! 11:
! 12: Check the License for details. You should have received a copy of it, along
! 13: with the package; see the file 'COPYING'. If not, write to the Free Software
! 14: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
! 15:
! 16: /* This file defines some "level 0" kernel functions for SPARC V8 */
! 17: /* These are optimised for SuperSparc */
! 18: /* The following symbols are defined in this file : */
! 19: /* divll bfffo (& tabshi) */
! 20: /* But divll have to use hiremainder, so it is different when */
! 21: /* hiremainder is inline or not */
! 22: /* If libpari.so is compiled with gcc, you should compile all */
! 23: /* files with gcc */
! 24:
! 25: #if defined(sun) || defined(NeXT)
! 26: # ifdef __STDC__
! 27: # define C(entrypoint) _##entrypoint
! 28: # else
! 29: # define C(entrypoint) _/**/entrypoint
! 30: # endif
! 31: #elif defined(linux)
! 32: # define C(entrypoint) entrypoint
! 33: #endif
! 34: #if defined(sun) || defined(linux)
! 35: # define GLOBL .global
! 36: #elif defined(NeXT)
! 37: # define GLOBL .globl
! 38: #endif
! 39:
! 40: #if defined(sun) || defined(linux)
! 41: .seg "data"
! 42: .align 4
! 43: C(tabshi): .word 4,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0
! 44:
! 45: .seg "text"
! 46: #elif defined(NeXT)
! 47: .data
! 48: .align 3
! 49: C(tabshi):
! 50: .long 4
! 51: .long 3
! 52: .long 2
! 53: .long 2
! 54: .long 1
! 55: .long 1
! 56: .long 1
! 57: .long 1
! 58: .long 0
! 59: .long 0
! 60: .long 0
! 61: .long 0
! 62: .long 0
! 63: .long 0
! 64: .long 0
! 65: .long 0
! 66:
! 67: .text
! 68: .align 2
! 69: #endif
! 70: GLOBL C(bfffo),C(divll)
! 71:
! 72: C(bfffo): sethi %hi(65535),%o2
! 73: or %o2,%lo(65535),%o2
! 74: cmp %o0,%o2
! 75: bleu 1f
! 76: mov 28,%o1
! 77: mov 12,%o1
! 78: srl %o0,16,%o0
! 79: 1: cmp %o0,255
! 80: bleu 2f
! 81: cmp %o0,15
! 82: add %o1,-8,%o1
! 83: srl %o0,8,%o0
! 84: cmp %o0,15
! 85: 2: bleu 3f
! 86: sethi %hi(C(tabshi)),%o2
! 87: add %o1,-4,%o1
! 88: srl %o0,4,%o0
! 89: 3: or %o2,%lo(C(tabshi)),%o2
! 90: sll %o0,2,%o3
! 91: ld [%o3+%o2],%o0
! 92: retl
! 93: add %o1,%o0,%o0
! 94:
! 95: #ifdef __GNUC__
! 96: #define SAVE_HI(X) mov X,%g5
! 97: #define LOAD_HI(X) mov %g5,X
! 98: #define LOAD_Hi(X)
! 99: #else
! 100: #define SAVE_HI(X) st X,[%o4+%lo(C(hiremainder))]
! 101: #define LOAD_HI(X) sethi %hi(C(hiremainder)),%o4
! 102: #define LOAD_Hi(X) ld [%o4+%lo(C(hiremainder))],X
! 103: #endif
! 104:
! 105: C(divll): LOAD_HI(%o2)
! 106: LOAD_Hi(%o2)
! 107: sethi %hi(0xfff00000),%o5
! 108: andcc %o5,%o2,%g0
! 109: bnz,a C(divlllong)
! 110: subcc %o2,%o1,%g0
! 111: wr %o2,%g0,%y
! 112: mov %o0,%o3
! 113: nop
! 114: nop
! 115: udivcc %o0,%o1,%o0
! 116: bvc 1f
! 117: umul %o0,%o1,%o5
! 118: mov 0x2f,%o0
! 119: call C(pari_err),1
! 120: nop
! 121: 1: subcc %o3,%o5,%o2
! 122: retl
! 123: SAVE_HI(%o2)
! 124:
! 125: #define SS0(label) \
! 126: addx %o2,%o2,%o2;\
! 127: subcc %o2,%o1,%o3;\
! 128: bcc label;\
! 129: addxcc %o0,%o0,%o0
! 130:
! 131: #define SS1(label) \
! 132: addx %o3,%o3,%o3;\
! 133: subcc %o3,%o1,%o2;\
! 134: bcc label;\
! 135: addxcc %o0,%o0,%o0
! 136:
! 137:
! 138: C(divlllong):
! 139: blu 1f
! 140: addcc %o1,%o1,%g0
! 141: mov 0x2f,%o0
! 142: call C(pari_err),1
! 143: nop
! 144: 1: bcc Lsmalldiv
! 145: andcc %o1,1,%g0
! 146: be Levendiv
! 147: srl %o1,1,%o1
! 148: add %o1,1,%o1
! 149: subcc %o2,%o1,%o3
! 150: bcc Lb01
! 151: addxcc %o0,%o0,%o0
! 152: La01: SS0(Lb02)
! 153: La02: SS0(Lb03)
! 154: La03: SS0(Lb04)
! 155: La04: SS0(Lb05)
! 156: La05: SS0(Lb06)
! 157: La06: SS0(Lb07)
! 158: La07: SS0(Lb08)
! 159: La08: SS0(Lb09)
! 160: La09: SS0(Lb10)
! 161: La10: SS0(Lb11)
! 162: La11: SS0(Lb12)
! 163: La12: SS0(Lb13)
! 164: La13: SS0(Lb14)
! 165: La14: SS0(Lb15)
! 166: La15: SS0(Lb16)
! 167: La16: SS0(Lb17)
! 168: La17: SS0(Lb18)
! 169: La18: SS0(Lb19)
! 170: La19: SS0(Lb20)
! 171: La20: SS0(Lb21)
! 172: La21: SS0(Lb22)
! 173: La22: SS0(Lb23)
! 174: La23: SS0(Lb24)
! 175: La24: SS0(Lb25)
! 176: La25: SS0(Lb26)
! 177: La26: SS0(Lb27)
! 178: La27: SS0(Lb28)
! 179: La28: SS0(Lb29)
! 180: La29: SS0(Lb30)
! 181: La30: SS0(Lb31)
! 182: La31: SS0(Lb32)
! 183: La32: addx %o2,%o2,%o2
! 184: xor %o0,-1,%o0
! 185: add %o1,%o1,%o1
! 186: sub %o1,1,%o1
! 187: addcc %o0,%o2,%o2
! 188: bcc 1f
! 189: subcc %o2,%o1,%o3
! 190: subcc %o3,%o1,%o2
! 191: bcs 2f
! 192: add %o0,1,%o0
! 193: add %o0,1,%o0
! 194: 3: retl
! 195: SAVE_HI(%o2)
! 196: 1: bcs 3b
! 197: nop
! 198: add %o0,1,%o0
! 199: 2: retl
! 200: SAVE_HI(%o3)
! 201:
! 202: Lb01: SS1(La02)
! 203: Lb02: SS1(La03)
! 204: Lb03: SS1(La04)
! 205: Lb04: SS1(La05)
! 206: Lb05: SS1(La06)
! 207: Lb06: SS1(La07)
! 208: Lb07: SS1(La08)
! 209: Lb08: SS1(La09)
! 210: Lb09: SS1(La10)
! 211: Lb10: SS1(La11)
! 212: Lb11: SS1(La12)
! 213: Lb12: SS1(La13)
! 214: Lb13: SS1(La14)
! 215: Lb14: SS1(La15)
! 216: Lb15: SS1(La16)
! 217: Lb16: SS1(La17)
! 218: Lb17: SS1(La18)
! 219: Lb18: SS1(La19)
! 220: Lb19: SS1(La20)
! 221: Lb20: SS1(La21)
! 222: Lb21: SS1(La22)
! 223: Lb22: SS1(La23)
! 224: Lb23: SS1(La24)
! 225: Lb24: SS1(La25)
! 226: Lb25: SS1(La26)
! 227: Lb26: SS1(La27)
! 228: Lb27: SS1(La28)
! 229: Lb28: SS1(La29)
! 230: Lb29: SS1(La30)
! 231: Lb30: SS1(La31)
! 232: Lb31: SS1(La32)
! 233: Lb32: addx %o3,%o3,%o2
! 234: xor %o0,-1,%o0
! 235: add %o1,%o1,%o1
! 236: sub %o1,1,%o1
! 237: addcc %o0,%o2,%o2
! 238: bcc 1f
! 239: subcc %o2,%o1,%o3
! 240: subcc %o3,%o1,%o2
! 241: bcs 2f
! 242: add %o0,1,%o0
! 243: add %o0,1,%o0
! 244: 3: retl
! 245: SAVE_HI(%o2)
! 246: 1: bcs 3b
! 247: nop
! 248: add %o0,1,%o0
! 249: 2: retl
! 250: SAVE_HI(%o3)
! 251:
! 252: Lsmalldiv:
! 253: addcc %o0,%o0,%o0
! 254: Lc00: SS0(Ld01)
! 255: Lc01: SS0(Ld02)
! 256: Lc02: SS0(Ld03)
! 257: Lc03: SS0(Ld04)
! 258: Lc04: SS0(Ld05)
! 259: Lc05: SS0(Ld06)
! 260: Lc06: SS0(Ld07)
! 261: Lc07: SS0(Ld08)
! 262: Lc08: SS0(Ld09)
! 263: Lc09: SS0(Ld10)
! 264: Lc10: SS0(Ld11)
! 265: Lc11: SS0(Ld12)
! 266: Lc12: SS0(Ld13)
! 267: Lc13: SS0(Ld14)
! 268: Lc14: SS0(Ld15)
! 269: Lc15: SS0(Ld16)
! 270: Lc16: SS0(Ld17)
! 271: Lc17: SS0(Ld18)
! 272: Lc18: SS0(Ld19)
! 273: Lc19: SS0(Ld20)
! 274: Lc20: SS0(Ld21)
! 275: Lc21: SS0(Ld22)
! 276: Lc22: SS0(Ld23)
! 277: Lc23: SS0(Ld24)
! 278: Lc24: SS0(Ld25)
! 279: Lc25: SS0(Ld26)
! 280: Lc26: SS0(Ld27)
! 281: Lc27: SS0(Ld28)
! 282: Lc28: SS0(Ld29)
! 283: Lc29: SS0(Ld30)
! 284: Lc30: SS0(Ld31)
! 285: Lc31: SS0(Ld32)
! 286: Lc32: xor %o0,-1,%o0
! 287: retl
! 288: SAVE_HI(%o2)
! 289:
! 290: Ld01: SS1(Lc02)
! 291: Ld02: SS1(Lc03)
! 292: Ld03: SS1(Lc04)
! 293: Ld04: SS1(Lc05)
! 294: Ld05: SS1(Lc06)
! 295: Ld06: SS1(Lc07)
! 296: Ld07: SS1(Lc08)
! 297: Ld08: SS1(Lc09)
! 298: Ld09: SS1(Lc10)
! 299: Ld10: SS1(Lc11)
! 300: Ld11: SS1(Lc12)
! 301: Ld12: SS1(Lc13)
! 302: Ld13: SS1(Lc14)
! 303: Ld14: SS1(Lc15)
! 304: Ld15: SS1(Lc16)
! 305: Ld16: SS1(Lc17)
! 306: Ld17: SS1(Lc18)
! 307: Ld18: SS1(Lc19)
! 308: Ld19: SS1(Lc20)
! 309: Ld20: SS1(Lc21)
! 310: Ld21: SS1(Lc22)
! 311: Ld22: SS1(Lc23)
! 312: Ld23: SS1(Lc24)
! 313: Ld24: SS1(Lc25)
! 314: Ld25: SS1(Lc26)
! 315: Ld26: SS1(Lc27)
! 316: Ld27: SS1(Lc28)
! 317: Ld28: SS1(Lc29)
! 318: Ld29: SS1(Lc30)
! 319: Ld30: SS1(Lc31)
! 320: Ld31: SS1(Lc32)
! 321: Ld32: xor %o0,-1,%o0
! 322: retl
! 323: SAVE_HI(%o3)
! 324:
! 325: Levendiv:
! 326: subcc %o2,%o1,%o3
! 327: bcc Lf01
! 328: addxcc %o0,%o0,%o0
! 329: Le01: SS0(Lf02)
! 330: Le02: SS0(Lf03)
! 331: Le03: SS0(Lf04)
! 332: Le04: SS0(Lf05)
! 333: Le05: SS0(Lf06)
! 334: Le06: SS0(Lf07)
! 335: Le07: SS0(Lf08)
! 336: Le08: SS0(Lf09)
! 337: Le09: SS0(Lf10)
! 338: Le10: SS0(Lf11)
! 339: Le11: SS0(Lf12)
! 340: Le12: SS0(Lf13)
! 341: Le13: SS0(Lf14)
! 342: Le14: SS0(Lf15)
! 343: Le15: SS0(Lf16)
! 344: Le16: SS0(Lf17)
! 345: Le17: SS0(Lf18)
! 346: Le18: SS0(Lf19)
! 347: Le19: SS0(Lf20)
! 348: Le20: SS0(Lf21)
! 349: Le21: SS0(Lf22)
! 350: Le22: SS0(Lf23)
! 351: Le23: SS0(Lf24)
! 352: Le24: SS0(Lf25)
! 353: Le25: SS0(Lf26)
! 354: Le26: SS0(Lf27)
! 355: Le27: SS0(Lf28)
! 356: Le28: SS0(Lf29)
! 357: Le29: SS0(Lf30)
! 358: Le30: SS0(Lf31)
! 359: Le31: SS0(Lf32)
! 360: Le32: addx %o2,%o2,%o2
! 361: xor %o0,-1,%o0
! 362: retl
! 363: SAVE_HI(%o2)
! 364:
! 365: Lf01: SS1(Le02)
! 366: Lf02: SS1(Le03)
! 367: Lf03: SS1(Le04)
! 368: Lf04: SS1(Le05)
! 369: Lf05: SS1(Le06)
! 370: Lf06: SS1(Le07)
! 371: Lf07: SS1(Le08)
! 372: Lf08: SS1(Le09)
! 373: Lf09: SS1(Le10)
! 374: Lf10: SS1(Le11)
! 375: Lf11: SS1(Le12)
! 376: Lf12: SS1(Le13)
! 377: Lf13: SS1(Le14)
! 378: Lf14: SS1(Le15)
! 379: Lf15: SS1(Le16)
! 380: Lf16: SS1(Le17)
! 381: Lf17: SS1(Le18)
! 382: Lf18: SS1(Le19)
! 383: Lf19: SS1(Le20)
! 384: Lf20: SS1(Le21)
! 385: Lf21: SS1(Le22)
! 386: Lf22: SS1(Le23)
! 387: Lf23: SS1(Le24)
! 388: Lf24: SS1(Le25)
! 389: Lf25: SS1(Le26)
! 390: Lf26: SS1(Le27)
! 391: Lf27: SS1(Le28)
! 392: Lf28: SS1(Le29)
! 393: Lf29: SS1(Le30)
! 394: Lf30: SS1(Le31)
! 395: Lf31: SS1(Le32)
! 396: Lf32: addx %o3,%o3,%o3
! 397: xor %o0,-1,%o0
! 398: retl
! 399: SAVE_HI(%o3)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>