From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12830 invoked by alias); 11 Apr 2002 18:06:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 12807 invoked by uid 71); 11 Apr 2002 18:06:01 -0000 Resent-Date: 11 Apr 2002 18:06:01 -0000 Resent-Message-ID: <20020411180601.12806.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org, uhlik@arraycomm.com Resent-Reply-To: gcc-gnats@gcc.gnu.org, ted@arraycomm.com Received:(qmail 11781 invoked by uid 61); 11 Apr 2002 18:05:30 -0000 Message-Id:<20020411180530.11780.qmail@sources.redhat.com> Date: Thu, 11 Apr 2002 11:06:00 -0000 From: ted@arraycomm.com Reply-To: ted@arraycomm.com To: gcc-gnats@gcc.gnu.org Cc: uhlik@arraycomm.com X-Send-Pr-Version:gnatsweb-2.9.3 (1.1.1.1.2.31) X-GNATS-Notify:uhlik@arraycomm.com Subject: target/6260: gcc 3.04 -O4 thumb bug X-SW-Source: 2002-04/txt/msg00619.txt.bz2 List-Id: >Number: 6260 >Category: target >Synopsis: gcc 3.04 -O4 thumb bug >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: wrong-code >Submitter-Id: net >Arrival-Date: Thu Apr 11 11:06:00 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Ted Merrill, ArrayComm, Inc. >Release: gcc 3.04 >Organization: >Environment: gcc 3.04 with previous patch from Richard Earnshaw to fix a presumeably unrelated problem, running on Solaris. >Description: Hi Richard Thanks very much for your previous patch for 3.04 which fixed the problem we were having. Using 3.04 with that patch, my colleague Chris Uhlik bravely compiled some code with the -O4 option and found that previously working code entered an infinite loop. Attached are his comments and attached are the files (c input and assembler output). He simplified the c code (from preprocessor output) as much as possible but beyond a certain point the problem goes away... >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: text/plain; name="attach.txt" Content-Disposition: inline; filename="attach.txt" :::::::::::::: mail.txt :::::::::::::: >>From ted@arraycomm.com Thu Apr 11 10:58:27 2002 Date: Wed, 10 Apr 2002 15:05:55 -0700 (PDT) From: Ted Merrill To: rearnsha@arm.com, Richard.Earnshaw@arm.com Cc: Ted Merrill , Chris Uhlik Subject: gcc 3.04 -O4 thumb bug Hi Richard Thanks very much for your previous patch for 3.04 which fixed the problem we were having. Using 3.04 with that patch, my colleague Chris Uhlik bravely compiled some code with the -O4 option and found that previously working code entered an infinite loop. Below are his comments and attached are the files (c input and assembler output). He simplified the c code (from preprocessor output) as much as possible but beyond a certain point the problem goes away... Do you want to attempt a patch for this? If you prefer, i can submit this through the regular channels (instead?). Thanks -Ted Merrill ArrayComm, Inc. ---------- Forwarded message ---------- Date: Tue, 9 Apr 2002 13:53:36 -0700 From: Chris Uhlik To: ted@arraycomm.com Subject: bug report Even careful transformations of constant folding seem to change the output, so I haven't done things like replace "sizeof(unsigned long)" with 4. compile with thumb_cc -Wall -O4 -S bug1.c -o bug1.s [NOTE to Richard: thumb_cc is simply gcc 3.04 w/ your previous patch, configured for arm, and with -mthumb forced on. -Ted] Chris extern void logF(char *,int,char *); extern void BSInitZero(unsigned long *,int); extern void BSCopy(unsigned long *,unsigned long *); void ecc233Invert( const unsigned long *a, unsigned long *b) { unsigned long c[(1 + ((234) + (8*sizeof(unsigned long)) - 1) / (8*sizeof(unsigned long)))]; unsigned long u[(1 + ((234) + (8*sizeof(unsigned long)) - 1) / (8*sizeof(unsigned long)))]; unsigned long v[(1 + ((234) + (8*sizeof(unsigned long)) - 1) / (8*sizeof(unsigned long)))]; int u_msbIdx = 233; int v_msbIdx = 233; unsigned long xv, yv, xc, yc; int i, j, nWords; unsigned long *uu, *vv, *bb, *cc; int u_is_u = 1; if ( ((a)[0]) != 233 || ((b)[0]) != 233 ) { logF("c", -1, "ecc233Invert: streams not 233 bits long\n"); return; } for ( i = 1 ; i < (233+31)/(8*sizeof(unsigned long)) ; i++ ) if ( a[i] ) goto non_zero; if ( a[(233+31)/(8*sizeof(unsigned long))] & ((1<<(233%(8*sizeof(unsigned long))))-1) ) goto non_zero; logF("c", -1, "ecc233Invert: input must be non-zero\n"); return; non_zero: BSInitZero(b,234); /* temporarily 234, but 233 in the end */ b[1] = 1; BSInitZero(c,234); for ( i = 0 ; i < (1 + ((234) + (8*sizeof(unsigned long)) - 1) / (8*sizeof(unsigned long))) ; i++ ) u[i] = a[i]; BSInitZero(v,234); { long __l = (0)/(8*sizeof(unsigned long))+1; long __k = (0)%(8*sizeof(unsigned long)); if ( 1 ) { (v)[__l] |= (1LU<<__k); } else { (v)[__l] &= ~(1LU<<__k); }}; { long __l = (74)/(8*sizeof(unsigned long))+1; long __k = (74)%(8*sizeof(unsigned long)); if ( 1 ) { (v)[__l] |= (1LU<<__k); } else { (v)[__l] &= ~(1LU<<__k); }}; { long __l = (233)/(8*sizeof(unsigned long))+1; long __k = (233)%(8*sizeof(unsigned long)); if ( 1 ) { (v)[__l] |= (1LU<<__k); } else { (v)[__l] &= ~(1LU<<__k); }}; while ( 1 ) { if ( u_is_u ) { for ( ; (((u)[(u_msbIdx)/(8*sizeof(unsigned long))+1]>>((u_msbIdx)%(8*sizeof(unsigned long))))&1LU) == 0 ; u_msbIdx-- ) ; if ( u_msbIdx == 0 ) { /* answer is in b */ break; } for ( ; (((v)[(v_msbIdx)/(8*sizeof(unsigned long))+1]>>((v_msbIdx)%(8*sizeof(unsigned long))))&1LU) == 0 ; v_msbIdx-- ) ; j = u_msbIdx - v_msbIdx; if ( j < 0 ) { u_is_u = 0; j = -j; } } else { for ( ; (((v)[(v_msbIdx)/(8*sizeof(unsigned long))+1]>>((v_msbIdx)%(8*sizeof(unsigned long))))&1LU) == 0 ; v_msbIdx-- ) ; if ( v_msbIdx == 0 ) { BSCopy(c,b); break; } for ( ; (((u)[(u_msbIdx)/(8*sizeof(unsigned long))+1]>>((u_msbIdx)%(8*sizeof(unsigned long))))&1LU) == 0 ; u_msbIdx-- ) ; j = v_msbIdx - u_msbIdx; if ( j < 0 ) { u_is_u = 1; j = -j; } } if ( u_is_u ) { uu = u + 1; vv = v + 1; bb = b + 1; cc = c + 1; } else { uu = v + 1; vv = u + 1; bb = c + 1; cc = b + 1; } nWords = 8; uu += j >> 5; bb += j >> 5; nWords -= j >> 5; j &= 31; /* u = u + x^j v */ /* b = b + x^j c */ if ( j ) { for ( yc = yv = 0 , i = 0 ; i < nWords ; i++ ) { xv = *vv++; xc = *cc++; *uu++ ^= (xv << j) | (yv >> ((8*sizeof(unsigned long)) - j)); *bb++ ^= (xc << j) | (yc >> ((8*sizeof(unsigned long)) - j)); yv = xv; yc = xc; } } else { /* special case for j == 0 because C cannot specify 32bit shifts */ for ( yc = yv = 0 , i = 0 ; i < nWords ; i++ ) { asm("; bug near here"); xv = *vv++; xc = *cc++; *uu++ ^= xv; *bb++ ^= xc; yv = xv; yc = xc; } } } ((b)[0]) = 233; if ( (((b)[(233)/(8*sizeof(unsigned long))+1]>>((233)%(8*sizeof(unsigned long))))&1LU) ) { logF("c", -1, "ecc233Invert: output order exceeds 232\n"); } } /* Code produced for the final loop thumb_cc -Wall -O4 -S bug1.c -o bug1.s mov r2, #8 mov ip, r2 asr r5, r1, #5 mov r3, ip mov r2, #31 lsl r4, r5, #2 sub r3, r3, r5 nWords -= j >> 5 and r1, r1, r2 j &= 31 add r7, r7, r4 uu += j >> 5 add r0, r0, r4 bb += j >> 5 mov r9, r3 r9 is nWords (loop terminal value) cmp r1, #0 if ( j ) bne .L79 mov r5, #0 cmp r5, r9 i < nWords ? bge .L66 no, skip loop alltogether .L65: ; bug near here .code 16 ldr r6, [sp, #16] vv is r6 ldmia r6!, {r1} xv(aka r1) = *vv++ mov r1, r6 ; immediately overwrites r1, oops! *** str r1, [sp, #16] ldr r3, [sp, #12] ldmia r3!, {r6} xc(aka r6) = *cc++ mov r2, r3 str r2, [sp, #12] ldr r2, [r7] eor r2, r2, r1 r2 ^= xv(aka r1) stmia r7!, {r2} *uu++ = r2 ldr r1, [r0] r1 = *bb add r5, r5, #1 i++ eor r1, r1, r6 r1 ^= xc(aka r6) stmia r0!, {r1} *bb++ = r1 cmp r5, r9 i < nWords ? blt .L65 yes, go round again b .L66 *** It looks like, in his haste to put r6 back onto the stack, he overwrote r1 which he had just loaded... */ [ Part 2, "bug1.c" Text/PLAIN (Name: "bug1.c") 134 lines. ] [ Unable to print this part. ] [ Part 3, "bug1.s" Text/PLAIN (Name: "bug1.s") 146 lines. ] [ Unable to print this part. ] :::::::::::::: bug1.c :::::::::::::: extern void logF(char *,int,char *); extern void BSInitZero(unsigned long *,int); extern void BSCopy(unsigned long *,unsigned long *); void ecc233Invert( const unsigned long *a, unsigned long *b) { unsigned long c[(1 + ((234) + (8*sizeof(unsigned long)) - 1) / (8*sizeof(unsigned long)))]; unsigned long u[(1 + ((234) + (8*sizeof(unsigned long)) - 1) / (8*sizeof(unsigned long)))]; unsigned long v[(1 + ((234) + (8*sizeof(unsigned long)) - 1) / (8*sizeof(unsigned long)))]; int u_msbIdx = 233; int v_msbIdx = 233; unsigned long xv, yv, xc, yc; int i, j, nWords; unsigned long *uu, *vv, *bb, *cc; int u_is_u = 1; if ( ((a)[0]) != 233 || ((b)[0]) != 233 ) { logF("c", -1, "ecc233Invert: streams not 233 bits long\n"); return; } for ( i = 1 ; i < (233+31)/(8*sizeof(unsigned long)) ; i++ ) if ( a[i] ) goto non_zero; if ( a[(233+31)/(8*sizeof(unsigned long))] & ((1<<(233%(8*sizeof(unsigned long))))-1) ) goto non_zero; logF("c", -1, "ecc233Invert: input must be non-zero\n"); return; non_zero: BSInitZero(b,234); /* temporarily 234, but 233 in the end */ b[1] = 1; BSInitZero(c,234); for ( i = 0 ; i < (1 + ((234) + (8*sizeof(unsigned long)) - 1) / (8*sizeof(unsigned long))) ; i++ ) u[i] = a[i]; BSInitZero(v,234); { long __l = (0)/(8*sizeof(unsigned long))+1; long __k = (0)%(8*sizeof(unsigned long)); if ( 1 ) { (v)[__l] |= (1LU<<__k); } else { (v)[__l] &= ~(1LU<<__k); }}; { long __l = (74)/(8*sizeof(unsigned long))+1; long __k = (74)%(8*sizeof(unsigned long)); if ( 1 ) { (v)[__l] |= (1LU<<__k); } else { (v)[__l] &= ~(1LU<<__k); }}; { long __l = (233)/(8*sizeof(unsigned long))+1; long __k = (233)%(8*sizeof(unsigned long)); if ( 1 ) { (v)[__l] |= (1LU<<__k); } else { (v)[__l] &= ~(1LU<<__k); }}; while ( 1 ) { if ( u_is_u ) { for ( ; (((u)[(u_msbIdx)/(8*sizeof(unsigned long))+1]>>((u_msbIdx)%(8*sizeof(unsigned long))))&1LU) == 0 ; u_msbIdx-- ) ; if ( u_msbIdx == 0 ) { /* answer is in b */ break; } for ( ; (((v)[(v_msbIdx)/(8*sizeof(unsigned long))+1]>>((v_msbIdx)%(8*sizeof(unsigned long))))&1LU) == 0 ; v_msbIdx-- ) ; j = u_msbIdx - v_msbIdx; if ( j < 0 ) { u_is_u = 0; j = -j; } } else { for ( ; (((v)[(v_msbIdx)/(8*sizeof(unsigned long))+1]>>((v_msbIdx)%(8*sizeof(unsigned long))))&1LU) == 0 ; v_msbIdx-- ) ; if ( v_msbIdx == 0 ) { BSCopy(c,b); break; } for ( ; (((u)[(u_msbIdx)/(8*sizeof(unsigned long))+1]>>((u_msbIdx)%(8*sizeof(unsigned long))))&1LU) == 0 ; u_msbIdx-- ) ; j = v_msbIdx - u_msbIdx; if ( j < 0 ) { u_is_u = 1; j = -j; } } if ( u_is_u ) { uu = u + 1; vv = v + 1; bb = b + 1; cc = c + 1; } else { uu = v + 1; vv = u + 1; bb = c + 1; cc = b + 1; } nWords = 8; uu += j >> 5; bb += j >> 5; nWords -= j >> 5; j &= 31; /* u = u + x^j v */ /* b = b + x^j c */ if ( j ) { for ( yc = yv = 0 , i = 0 ; i < nWords ; i++ ) { xv = *vv++; xc = *cc++; *uu++ ^= (xv << j) | (yv >> ((8*sizeof(unsigned long)) - j)); *bb++ ^= (xc << j) | (yc >> ((8*sizeof(unsigned long)) - j)); yv = xv; yc = xc; } } else { /* special case for j == 0 because C cannot specify 32bit shifts */ for ( yc = yv = 0 , i = 0 ; i < nWords ; i++ ) { asm("; bug near here"); xv = *vv++; xc = *cc++; *uu++ ^= xv; *bb++ ^= xc; yv = xv; yc = xc; } } } ((b)[0]) = 233; if ( (((b)[(233)/(8*sizeof(unsigned long))+1]>>((233)%(8*sizeof(unsigned long))))&1LU) ) { logF("c", -1, "ecc233Invert: output order exceeds 232\n"); } } /* Code produced for the final loop thumb_cc -Wall -O4 -S bug1.c -o bug1.s mov r2, #8 mov ip, r2 asr r5, r1, #5 mov r3, ip mov r2, #31 lsl r4, r5, #2 sub r3, r3, r5 nWords -= j >> 5 and r1, r1, r2 j &= 31 add r7, r7, r4 uu += j >> 5 add r0, r0, r4 bb += j >> 5 mov r9, r3 r9 is nWords (loop terminal value) cmp r1, #0 if ( j ) bne .L79 mov r5, #0 cmp r5, r9 i < nWords ? bge .L66 no, skip loop alltogether .L65: ; bug near here .code 16 ldr r6, [sp, #16] vv is r6 ldmia r6!, {r1} xv(aka r1) = *vv++ mov r1, r6 ; immediately overwrites r1, oops! *** str r1, [sp, #16] ldr r3, [sp, #12] ldmia r3!, {r6} xc(aka r6) = *cc++ mov r2, r3 str r2, [sp, #12] ldr r2, [r7] eor r2, r2, r1 r2 ^= xv(aka r1) stmia r7!, {r2} *uu++ = r2 ldr r1, [r0] r1 = *bb add r5, r5, #1 i++ eor r1, r1, r6 r1 ^= xc(aka r6) stmia r0!, {r1} *bb++ = r1 cmp r5, r9 i < nWords ? blt .L65 yes, go round again b .L66 *** It looks like, in his haste to put r6 back onto the stack, he overwrote r1 which he had just loaded... # thumb_cc -v Reading specs from /s/wdsl/i/bin.sun5/arm.gcc/specs Configured with: /s/home/ted/tool.gcc/i/include/gcc-3.0.4/configure --host=sparc-sun-solaris2.5.1 --prefix=/s/home/ted/_tool/_gccarm/junk.i/sun5-arm --srcdir=/s/home/ted/tool.gcc/i/include/gcc-3.0.4 --target=arm-ecos-elf --enable-languages=c --with-headers=/s/home/ted/_tool/_gccarm/oo/include/arm.usr.include --with-libs=/s/home/ted/_tool/_gccarm/oo/lib.arm/arm.usr.lib : (reconfigured) /s/home/ted/tool.gcc/i/include/gcc-3.0.4/configure --host=sparc-sun-solaris2.5.1 --prefix=/s/home/ted/_tool/_gccarm/junk.i/sun5-arm --srcdir=/s/home/ted/tool.gcc/i/include/gcc-3.0.4 --target=arm-ecos-elf --enable-languages=c --with-headers=/s/home/ted/_tool/_gccarm/oo/include/arm.usr.include --with-libs=/s/home/ted/_tool/_gccarm/oo/lib.arm/arm.usr.lib Thread model: single gcc version 3.0.4 */ :::::::::::::: bug1.s :::::::::::::: @ Generated by gcc 3.0.4 for ARM/elf .file "bug1.c" .code 16 .section .rodata .align 2 .LC0: .ascii "c\000" .align 2 .LC2: .ascii "ecc233Invert: streams not 233 bits long\n\000" .align 2 .LC6: .ascii "ecc233Invert: output order exceeds 232\n\000" .align 2 .LC4: .ascii "ecc233Invert: input must be non-zero\n\000" .text .align 2 .global ecc233Invert .thumb_func .type ecc233Invert,function ecc233Invert: push {r4, r5, r6, r7, lr} mov r7, fp mov r6, sl mov r5, r9 mov r4, r8 push {r4, r5, r6, r7} sub sp, sp, #132 mov r4, r0 mov r0, #1 str r1, [sp, #20] str r0, [sp, #8] ldr r0, [r4] mov r1, #233 mov sl, r1 mov r8, r1 cmp r0, #233 beq .L74 .L3: mov r2, #1 neg r1, r2 ldr r0, .L83 ldr r2, .L83+4 .L82: bl logF .L1: add sp, sp, #132 pop {r3, r4, r5, r6} mov r8, r3 mov r9, r4 mov sl, r5 mov fp, r6 pop {r4, r5, r6, r7, pc} .L74: ldr r3, [sp, #20] ldr r2, [r3] cmp r2, #233 bne .L3 mov r5, #1 .L4: cmp r5, #7 bhi .LCB46 b .L10 @long jump .LCB46: ldr r1, [r4, #32] ldr r3, .L83+8 and r1, r1, r3 cmp r1, #0 bne .LCB52 b .L75 @long jump .LCB52: .L9: ldr r0, [sp, #20] mov r1, #234 bl BSInitZero ldr r2, [sp, #20] add r5, sp, #96 mov r1, #1 str r1, [r2, #4] mov r0, r5 mov r1, #234 bl BSInitZero add r0, sp, #60 mov r5, #0 mov r1, r0 mov r2, #0 .L16: ldr r0, [r2, r4] add r5, r5, #1 str r0, [r2, r1] add r2, r2, #4 cmp r5, #8 bls .L16 add r3, sp, #24 mov r0, r3 mov r1, #234 bl BSInitZero ldr r1, [sp, #28] mov r0, #1 orr r1, r1, r0 ldr r2, [sp, #36] str r1, [sp, #28] ldr r1, [sp, #56] lsl r4, r0, #10 lsl r3, r0, #9 orr r2, r2, r4 orr r1, r1, r3 add r4, sp, #60 str r2, [sp, #36] str r1, [sp, #56] str r4, [sp, #4] .L66: ldr r0, [sp, #8] cmp r0, #0 bne .LCB115 b .L26 @long jump .LCB115: mov r4, sl lsr r1, r4, #5 mov r2, sl mov r4, #31 and r2, r2, r4 lsl r3, r1, #2 ldr r4, [sp, #4] add r3, r3, #4 ldr r0, [r4, r3] lsr r0, r0, r2 mov r2, #1 and r0, r0, r2 cmp r0, #0 bne .LCB129 b .L76 @long jump .LCB129: .L69: mov r3, sl cmp r3, #0 bne .LCB133 b .L24 @long jump .LCB133: mov r4, r8 lsr r1, r4, #5 lsl r0, r1, #2 mov r4, #31 mov r2, r8 and r2, r2, r4 add r0, r0, #4 add r4, sp, #24 ldr r7, [r4, r0] mov r5, #1 lsr r7, r7, r2 and r7, r7, r5 cmp r7, #0 beq .L77 .L70: mov r3, sl mov r4, r8 sub r1, r3, r4 cmp r1, #0 blt .L78 .L39: ldr r4, [sp, #8] cmp r4, #0 beq .L52 ldr r0, [sp, #20] mov r4, sp mov r2, sp add r4, r4, #28 add r2, r2, #100 add r7, sp, #64 add r0, r0, #4 str r4, [sp, #16] str r2, [sp, #12] .L53: mov r2, #8 mov ip, r2 asr r5, r1, #5 mov r3, ip mov r2, #31 lsl r4, r5, #2 sub r3, r3, r5 and r1, r1, r2 add r7, r7, r4 add r0, r0, r4 mov r9, r3 cmp r1, #0 bne .L79 mov r5, #0 cmp r5, r9 bge .L66 .L65: ; bug near here .code 16 ldr r6, [sp, #16] ldmia r6!, {r1} mov r1, r6 str r1, [sp, #16] ldr r3, [sp, #12] ldmia r3!, {r6} mov r2, r3 str r2, [sp, #12] ldr r2, [r7] eor r2, r2, r1 stmia r7!, {r2} ldr r1, [r0] add r5, r5, #1 eor r1, r1, r6 stmia r0!, {r1} cmp r5, r9 blt .L65 b .L66 .L79: mov r2, #0 mov r5, #0 mov ip, r2 mov fp, r2 cmp r5, r9 bge .L66 mov r6, #32 sub r3, r6, r1 mov lr, r3 .L59: ldr r2, [sp, #16] ldmia r2!, {r4} mov r6, r2 str r4, [sp] ldr r2, [sp, #12] str r6, [sp, #16] ldmia r2!, {r6} mov r4, r2 ldr r2, [sp] str r4, [sp, #12] mov r3, lr mov r4, ip lsr r4, r4, r3 lsl r2, r2, r1 orr r2, r2, r4 ldr r4, [r7] eor r4, r4, r2 stmia r7!, {r4} mov r2, r6 mov r4, fp lsr r4, r4, r3 lsl r2, r2, r1 orr r2, r2, r4 ldr r4, [r0] eor r4, r4, r2 stmia r0!, {r4} ldr r4, [sp] add r5, r5, #1 mov ip, r4 mov fp, r6 cmp r5, r9 blt .L59 b .L66 .L52: mov r3, sp add r3, r3, #64 str r3, [sp, #16] ldr r3, [sp, #20] add r3, r3, #4 str r3, [sp, #12] add r7, sp, #28 add r0, sp, #100 b .L53 .L78: mov r0, #0 neg r1, r1 str r0, [sp, #8] b .L39 .L77: mov r1, r4 mov r0, #1 mov r4, #31 .L35: mov r5, #1 neg r3, r5 add r8, r8, r3 mov r2, r8 lsr r7, r2, #5 lsl r5, r7, #2 add r5, r5, #4 ldr r7, [r1, r5] and r2, r2, r4 lsr r7, r7, r2 and r7, r7, r0 cmp r7, #0 bne .L70 b .L35 .L24: ldr r0, [sp, #20] ldr r2, [r0, #32] mov r1, #233 str r1, [r0] lsr r0, r2, #9 mov r1, #1 and r0, r0, r1 cmp r0, #0 bne .LCB330 b .L1 @long jump .LCB330: mov r3, #1 ldr r0, .L83 neg r1, r3 ldr r2, .L83+12 bl logF b .L1 .L76: add r3, sp, #60 mov r1, r3 mov r4, #31 mov r0, #1 .L29: mov r3, #1 neg r2, r3 add sl, sl, r2 mov r2, sl lsr r3, r2, #5 lsl r3, r3, #2 add r3, r3, #4 ldr r3, [r1, r3] and r2, r2, r4 lsr r3, r3, r2 and r3, r3, r0 cmp r3, #0 beq .LCB367 b .L69 @long jump .LCB367: b .L29 .L26: mov r4, r8 lsr r1, r4, #5 lsl r3, r1, #2 mov r4, #31 mov r2, r8 and r2, r2, r4 add r3, r3, #4 add r4, sp, #24 ldr r0, [r4, r3] lsr r0, r0, r2 mov r2, #1 and r0, r0, r2 cmp r0, #0 beq .L80 .L71: mov r3, r8 cmp r3, #0 beq .L73 mov r4, sl lsr r2, r4, #5 lsl r0, r2, #2 ldr r1, [sp, #4] add r0, r0, #4 mov r2, sl mov r4, #31 ldr r7, [r1, r0] and r2, r2, r4 lsr r7, r7, r2 mov r5, #1 and r7, r7, r5 cmp r7, #0 beq .L81 .L72: mov r3, r8 mov r4, sl sub r1, r3, r4 cmp r1, #0 blt .LCB410 b .L39 @long jump .LCB410: mov r0, #1 str r0, [sp, #8] neg r1, r1 b .L39 .L81: add r3, sp, #60 mov r1, r3 mov r4, #31 mov r0, #1 .L48: mov r5, #1 neg r2, r5 add sl, sl, r2 mov r2, sl lsr r7, r2, #5 lsl r5, r7, #2 add r5, r5, #4 ldr r7, [r1, r5] and r2, r2, r4 lsr r7, r7, r2 and r7, r7, r0 cmp r7, #0 bne .L72 b .L48 .L73: add r1, sp, #96 mov r0, r1 ldr r1, [sp, #20] bl BSCopy b .L24 .L80: mov r1, r4 mov r0, #1 mov r4, #31 .L42: mov r2, #1 neg r3, r2 add r8, r8, r3 mov r2, r8 lsr r3, r2, #5 lsl r3, r3, #2 add r3, r3, #4 ldr r3, [r1, r3] and r2, r2, r4 lsr r3, r3, r2 and r3, r3, r0 cmp r3, #0 bne .L71 b .L42 .L75: mov r2, #1 neg r1, r2 ldr r0, .L83 ldr r2, .L83+16 b .L82 .L10: lsl r0, r5, #2 ldr r1, [r0, r4] cmp r1, #0 beq .LCB494 b .L9 @long jump .LCB494: add r5, r5, #1 b .L4 .L84: .align 2 .L83: .word .LC0 .word .LC2 .word 511 .word .LC6 .word .LC4 .Lfe1: .size ecc233Invert,.Lfe1-ecc233Invert