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