------- Comment #2 from raj dot khem at gmail dot com 2010-05-27 07:12 ------- here is diff of two assembly outputs
$ diff copypage-v4wb.s copypage-v4wb.no-ipa-sra.S -u --- copypage-v4wb.s 2010-05-27 00:11:03.130607878 -0700 +++ copypage-v4wb.no-ipa-sra.S 2010-05-27 00:10:54.790615578 -0700 @@ -120,19 +120,30 @@ v4wb_copy_user_highpage: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 - stmfd sp!, {r4, lr} - mov r1, sp - bic r4, r1, #8128 + stmfd sp!, {r4, r5, r6, lr} + mov ip, sp + bic r4, ip, #8128 bic r4, r4, #63 - ldr r1, [r4, #4] - add r1, r1, #1 - str r1, [r4, #4] - ldr r1, [r4, #4] - add r1, r1, #1 - str r1, [r4, #4] - ldr r1, [r3, #0] - ldr r1, [r1, #332] - tst r1, #1 + ldr ip, [r4, #4] + add ip, ip, #1 + str ip, [r4, #4] + ldr ip, .L8 + ldr lr, [r4, #4] + ldr r6, [ip, #0] + add lr, lr, #1 + rsb r6, r6, r0 + mov r6, r6, asr #5 + mov r6, r6, asl #12 + add r6, r6, #-1073741824 + str lr, [r4, #4] + ldr r5, [ip, #0] + ldr r0, [r3, #0] + rsb r5, r5, r1 + ldr r0, [r0, #332] + mov r5, r5, asr #5 + mov r5, r5, asl #12 + tst r0, #1 + add r5, r5, #-1073741824 beq .L6 bic r2, r2, #4080 bic r0, r2, #15 @@ -140,6 +151,8 @@ ldr r2, [r3, #20] bl arm926_flush_user_cache_range .L6: + mov r0, r6 + mov r1, r5 bl v4wb_copy_user_page ldr r3, [r4, #4] sub r3, r3, #1 @@ -147,7 +160,11 @@ ldr r3, [r4, #4] sub r3, r3, #1 str r3, [r4, #4] - ldmfd sp!, {r4, pc} + ldmfd sp!, {r4, r5, r6, pc} +.L9: + .align 2 +.L8: + .word mem_map .size v4wb_copy_user_highpage, .-v4wb_copy_user_highpage .global v4wb_user_fns .section .init.data,"aw",%progbits -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44290