sparccpuid.S: some assembler is allergic to apostrophes in comments.
[openssl.git] / crypto / sparccpuid.S
index c17350fc89e0b656c098a58d58f75ffb10e93fc0..aa8b11efc97b2150a958b72f9d0b9d2b03976f6a 100644 (file)
@@ -34,7 +34,8 @@ OPENSSL_wipe_cpu:
        nop
        call    .PIC.zero.up
        mov     .zero-(.-4),%o0
-       ldd     [%o0],%f0
+       ld      [%o0],%f0
+       ld      [%o0],%f1
 
        subcc   %g0,1,%o0
        ! Following is V9 "rd %ccr,%o0" instruction. However! V8
@@ -166,6 +167,7 @@ walk_reg_wins:
 
 .global        OPENSSL_atomic_add
 .type  OPENSSL_atomic_add,#function
+.align 32
 OPENSSL_atomic_add:
 #ifndef ABI64
        subcc   %g0,1,%o2
@@ -177,7 +179,7 @@ OPENSSL_atomic_add:
        ba      .enter
        nop
 #ifdef __sun
-! Note that you don't have to link with libthread to call thr_yield,
+! Note that you do not have to link with libthread to call thr_yield,
 ! as libc provides a stub, which is overloaded the moment you link
 ! with *either* libpthread or libthread...
 #define        YIELD_CPU       thr_yield
@@ -213,27 +215,106 @@ OPENSSL_atomic_add:
        sra     %o0,%g0,%o0     ! we return signed int, remember?
 .size  OPENSSL_atomic_add,.-OPENSSL_atomic_add
 
-.global        OPENSSL_rdtsc
+.global        _sparcv9_rdtick
+.align 32
+_sparcv9_rdtick:
        subcc   %g0,1,%o0
        .word   0x91408000      !rd     %ccr,%o0
        cmp     %o0,0x99
-       bne     .notsc
+       bne     .notick
        xor     %o0,%o0,%o0
-       save    %sp,FRAME-16,%sp
-       mov     513,%o0         !SI_PLATFORM
-       add     %sp,BIAS+16,%o1
-       call    sysinfo
-       mov     256,%o2
+       .word   0x91410000      !rd     %tick,%o0
+       retl
+       .word   0x93323020      !srlx   %o2,32,%o1
+.notick:
+       retl
+       xor     %o1,%o1,%o1
+.type  _sparcv9_rdtick,#function
+.size  _sparcv9_rdtick,.-_sparcv9_rdtick
 
-       add     %sp,BIAS-16,%o1
-       ld      [%o1],%l0
-       ld      [%o1+4],%l1
-       ld      [%o1+8],%l2
-       mov     %lo('SUNW'),%l3
-       ret
-       restore
-.notsc:
+.global        OPENSSL_cleanse
+.align 32
+OPENSSL_cleanse:
+       cmp     %o1,14
+       nop
+#ifdef ABI64
+       bgu     %xcc,.Lot
+#else
+       bgu     .Lot
+#endif
+       cmp     %o1,0
+       bne     .Little
+       nop
+       retl
+       nop
+
+.Little:
+       stb     %g0,[%o0]
+       subcc   %o1,1,%o1
+       bnz     .Little
+       add     %o0,1,%o0
+       retl
+       nop
+.align 32
+.Lot:
+#ifndef ABI64
+       subcc   %g0,1,%g1
+       ! see above for explanation
+       .word   0x83408000      !rd     %ccr,%g1
+       cmp     %g1,0x99
+       bne     .v8lot
+       nop
+#endif
+
+.v9lot:        andcc   %o0,7,%g0
+       bz      .v9aligned
+       nop
+       stb     %g0,[%o0]
+       sub     %o1,1,%o1
+       ba      .v9lot
+       add     %o0,1,%o0
+.align 16,0x01000000
+.v9aligned:
+       .word   0xc0720000      !stx    %g0,[%o0]
+       sub     %o1,8,%o1
+       andcc   %o1,-8,%g0
+#ifdef ABI64
+       .word   0x126ffffd      !bnz    %xcc,.v9aligned
+#else
+       .word   0x124ffffd      !bnz    %icc,.v9aligned
+#endif
+       add     %o0,8,%o0
+
+       cmp     %o1,0
+       bne     .Little
+       nop
        retl
        nop
-.type  OPENSSL_rdtsc,#function
-.size  OPENSSL_rdtsc,.-OPENSSL_atomic_add
+#ifndef ABI64
+.v8lot:        andcc   %o0,3,%g0
+       bz      .v8aligned
+       nop
+       stb     %g0,[%o0]
+       sub     %o1,1,%o1
+       ba      .v8lot
+       add     %o0,1,%o0
+       nop
+.v8aligned:
+       st      %g0,[%o0]
+       sub     %o1,4,%o1
+       andcc   %o1,-4,%g0
+       bnz     .v8aligned
+       add     %o0,4,%o0
+
+       cmp     %o1,0
+       bne     .Little
+       nop
+       retl
+       nop
+#endif
+.type  OPENSSL_cleanse,#function
+.size  OPENSSL_cleanse,.-OPENSSL_cleanse
+
+.section       ".init",#alloc,#execinstr
+       call    OPENSSL_cpuid_setup
+       nop