public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/23980] New: Bad assembly output in Thumb mode with -O2
@ 2005-09-20 16:15 czimman at bloomberg dot com
  2005-09-20 16:18 ` [Bug target/23980] " pinskia at gcc dot gnu dot org
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: czimman at bloomberg dot com @ 2005-09-20 16:15 UTC (permalink / raw)
  To: gcc-bugs

Note, this problem only happens with -thumb and -O2 (eg. nothing, -O, -O1 and -
O3 work fine).

Here's the original snippet of code:

int 
mmcsd_read(void * dst, void * src, unsigned int len)
{
    int return_val = NETI_OK;
    int i = 0;

    cyg_mutex_lock(&mmcsd.mutex);
    
    if(!mmcsd.card_initialized) {
	cyg_mutex_unlock(&mmcsd.mutex);
	NETI_DEBUG_PRINT_CONT("mmcsd_read(buf, 0x%x, %d) returnign error\n",
(unsigned int) src, len);
	return NETI_MMCSD_CARD_UNINITIALIZED;
    }
     
    MMCSD_REG_SET_BIT(MMCSD_INT_MASK, MMCSD_INT_MASK_AUTO_CARD_DETECT);

    disconnect_card_detect_pullup();
  
    if(!len) {
	cyg_mutex_unlock(&mmcsd.mutex);

	NETI_DEBUG_PRINT_CONT("mmcsd_read(buf, 0x%x, %d) returning len = 0\n",
(unsigned int) src, len);
	
	return NETI_OK;
    }
    if((((unsigned int)src)/MMCSD_BLOCK_LENGTH + len/MMCSD_BLOCK_LENGTH) > 
mmcsd.device_size) {
	cyg_mutex_unlock(&mmcsd.mutex);
	
	NETI_DEBUG_PRINT_CONT("mmcsd_read(buf, 0x%x, %d) returnign error\n",
(unsigned int) src, len);
   
	return NETI_MMCSD_INVALID_CARD_ADDRESS;
    }
    
    if(len % MMCSD_BLOCK_LENGTH) {
	cyg_mutex_unlock(&mmcsd.mutex);
	
	NETI_DEBUG_PRINT_CONT("mmcsd_read(buf, 0x%x, %d) returnign error\n",
(unsigned int) src, len);
	
	return NETI_MMCSD_INVALID_CARD_ADDRESS;
    }
    
    if(((unsigned int)src) % MMCSD_BLOCK_LENGTH) {
	cyg_mutex_unlock(&mmcsd.mutex);
	
	NETI_DEBUG_PRINT_CONT("mmcsd_read(buf, 0x%x, %d) returnign error\n",
(unsigned int) src, len);
	
	return NETI_MMCSD_INVALID_CARD_ADDRESS;
    }

    if((return_val = mmcsd_dma_read_blks(dst, (unsigned int) src, 
len/MMCSD_BLOCK_LENGTH)) != NETI_OK) {
	cyg_mutex_unlock(&mmcsd.mutex);
	
	NETI_DEBUG_PRINT_CONT("mmcsd_read(buf, 0x%x, %d) returnign error\n",
(unsigned int) src, len);
   
	return return_val;
    }
    
    connect_card_detect_pullup();   
    MMCSD_REG_CLEAR_BIT(MMCSD_INT_MASK,
			MMCSD_INT_MASK_AUTO_CARD_DETECT);
    
    cyg_mutex_unlock(&mmcsd.mutex);
   
    return return_val;
}

Here's the output from;

arm-elf-gcc -S -Wall -Wa,--gstabs -g -O2 -mcpu=arm920t ... -o mmcsd.s -c mmcsd.c

mmcsd_read:
.LFB59:
	.loc 1 1953 0
	push	{r4, r5, r6, r7, lr}
.LCFI33:
	mov	r7, fp
	mov	r6, sl
	mov	r5, r9
	mov	r4, r8
	push	{r4, r5, r6, r7}
.LCFI34:
	.loc 1 1957 0
	ldr	r4, .L623
	.loc 1 1953 0
	mov	fp, r0
	.loc 1 1957 0
	mov	r0, r4
	.loc 1 1953 0
	mov	r7, r2
	mov	r6, r1
	.loc 1 1957 0
	bl	cyg_mutex_lock
	.loc 1 1960 0
	mov	r2, #116
	neg	r2, r2
	add	r2, r2, r4
	ldr	r3, [r2, #112]
	mov	r8, r2
	cmp	r3, #0
	bne	.LCB2871
	b	.L615	@long jump
.LCB2871:
.LBB133:
	.loc 1 1972 0
	ldr	r3, .L623+4
.LBE133:
	mov	r1, #64
	ldr	r2, [r3]
	orr	r2, r2, r1
	str	r2, [r3]
	.loc 1 1975 0
	bl	disconnect_card_detect_pullup
	.loc 1 1977 0
	cmp	r7, #0
	beq	.L616
	.loc 1 1984 0
	lsr	r3, r7, #9
	mov	r5, r8
	mov	sl, r3
	lsr	r2, r6, #9
	ldr	r3, [r5, #68]
	add	r2, r2, sl
	cmp	r2, r3
	bls	.LCB2893
	b	.L611	@long jump
.LCB2893:
	.loc 1 1992 0
	ldr	r3, .L623+8
	tst	r7, r3
	beq	.LCB2898
	b	.L611	@long jump
.LCB2898:
	.loc 1 2000 0
	tst	r6, r3
	beq	.LCB2902
	b	.L611	@long jump
.LCB2902:
.LBB134:
.LBB135:
	.loc 1 1376 0
	ldr	r3, [r5, #92]
	cmp	r3, #0
	bne	.L583
	mov	r4, #23
.L610:
.LBE135:
.LBE134:
	.loc 1 2010 0
	ldr	r0, .L623
	bl	cyg_mutex_unlock
	.loc 1 2012 0
	ldr	r0, .L623+12
	mov	r1, r6
	mov	r2, r7
	bl	printf
	.loc 1 2014 0
	mov	r0, r4
.L573:
	.loc 1 2040 0
	@ sp needed for prologue
	pop	{r3, r4, r5, r6}
	mov	r8, r3
	mov	r9, r4
	mov	sl, r5
	mov	fp, r6
	pop	{r4, r5, r6, r7}
	pop	{r1}
	bx	r1
.L616:
	.loc 1 1978 0
	mov	r0, r4
	bl	cyg_mutex_unlock
	.loc 1 1980 0
	ldr	r0, .L623+16
	mov	r1, r6
	mov	r2, #0
	bl	printf
	.loc 1 2039 0
	mov	r0, #0
	b	.L573
.L583:
.LBB136:
.LBB137:
	.loc 1 1379 0
	mov	r0, #128
	lsl	r0, r0, #2
	mov	r1, sl
	bl	mmcsd_setup_transfer
	cmp	r0, #0
	mov	r9, r0
	beq	.L617
.L602:
	.loc 1 1503 0
	mov	r4, r9
.LBE137:
.LBE136:
	.loc 1 1371 0
	cmp	r4, #0
	bne	.L610
	.loc 1 2031 0
	bl	connect_card_detect_pullup
.LBB138:
	.loc 1 2032 0
	ldr	r3, .L623+4
.LBE138:
	mov	r1, #64
	ldr	r2, [r3]
	.loc 1 2035 0
	ldr	r0, .L623
	.loc 1 2032 0
	bic	r2, r2, r1
	str	r2, [r3]
	.loc 1 2035 0
	bl	cyg_mutex_unlock
	.loc 1 2039 0
	mov	r0, #0
	b	.L573
.L617:
.LBB139:
.LBB140:
	.loc 1 1383 0
	mov	r1, #1
	ldr	r0, [r5, #56]
	bl	dma_channel_set_operation
	.loc 1 1386 0
	ldr	r1, .L623+20
	mov	r2, #0
	ldr	r0, [r5, #56]
	bl	dma_channel_set_source_addr
	.loc 1 1389 0
	mov	r1, fp
	mov	r2, #1
	ldr	r0, [r5, #56]
	bl	dma_channel_set_dest_addr
	.loc 1 1392 0
	mov	r2, sl
	ldr	r0, [r5, #56]
	lsl	r1, r2, #9
	bl	dma_channel_set_count_reg
	.loc 1 1394 0
	ldr	r3, [r5, #84]
	cmp	r3, #0
	bne	.L618
	.loc 1 1421 0
	mov	r2, r8
	ldr	r0, [r2, #56]
	mov	r1, #16
	bl	dma_channel_set_burst_length
	.loc 1 1424 0
	mov	r3, sl
	cmp	r3, #1
	beq	.L619
	.loc 1 1436 0
	lsl	r2, r6, #16
	mov	r0, #18
	lsr	r1, r6, #16
	lsr	r2, r2, #16
	mov	r3, #9
	bl	mmcsd_send_cmd_wait_resp
	cmp	r0, #0
	mov	r9, r0
	bne	.L602
.L591:
	.loc 1 1451 0
	ldr	r2, .L623+4
	mov	r3, #2
	neg	r3, r3
	str	r3, [r2]
	.loc 1 1458 0
	bl	dma_cache_sync
	.loc 1 1462 0
	ldr	r4, .L623+24
	ldr	r1, .L623+28
	ldr	r0, [r4, #56]
	bl	dma_channel_set_control_register
	.loc 1 1474 0
	mov	r0, r4
	add	r0, r0, #60
	bl	cyg_semaphore_wait
	.loc 1 1479 0
	bl	dma_cache_sync
	.loc 1 1484 0
	mov	r0, r4
	add	r0, r0, #48
	bl	cyg_semaphore_wait
	.loc 1 1489 0
	ldr	r3, .L623+32
	ldr	r1, [r3]
	mov	r3, #47
	tst	r1, r3
	bne	.L600
	lsl	r2, r1, #20
	bmi	.L599
.L600:
	.loc 1 1491 0
	ldr	r3, .L623+36
	ldr	r3, [r3]
	cmp	r3, #0
	bne	.L620
	mov	r4, #24
	b	.L610
.L615:
.LBE140:
.LBE139:
	.loc 1 1961 0
	mov	r0, r4
	bl	cyg_mutex_unlock
	.loc 1 1962 0
	ldr	r0, .L623+12
	mov	r1, r6
	mov	r2, r7
	bl	printf
	.loc 1 1963 0
	mov	r0, #27
	b	.L573
.L618:
.LBB141:
.LBB142:
	.loc 1 1396 0
	ldr	r0, [r5, #56]
	mov	r1, #0
	bl	dma_channel_set_burst_length
	.loc 1 1398 0
	mov	r3, sl
	cmp	r3, #1
	beq	.L621
	.loc 1 1409 0
	lsl	r2, r6, #16
	mov	r0, #18
.L613:
	ldr	r3, .L623+40
	lsr	r1, r6, #16
	lsr	r2, r2, #16
.L614:
	.loc 1 1426 0
	bl	mmcsd_send_cmd_wait_resp
	cmp	r0, #0
	mov	r9, r0
	beq	.L591
	b	.L602
.L620:
	.loc 1 1491 0
	ldr	r0, .L623+44
	bl	printf
	mov	r4, #24
	b	.L610
.L611:
.LBE142:
.LBE141:
	.loc 1 2001 0
	mov	r0, r4
	bl	cyg_mutex_unlock
	.loc 1 2003 0
	ldr	r0, .L623+12
	mov	r1, r6
	mov	r2, r7
	bl	printf
	.loc 1 2005 0
	mov	r0, #26
	b	.L573
.L621:
.LBB143:
.LBB144:
	.loc 1 1399 0
	lsl	r2, r6, #16
	mov	r0, #17
	b	.L613
.L619:
	.loc 1 1426 0
	lsl	r2, r6, #16
	mov	r0, #17
	lsr	r1, r6, #16
	lsr	r2, r2, #16
	mov	r3, #9
	b	.L614
.L599:
	.loc 1 1496 0
	mov	r3, sl
	cmp	r3, #1
	bhi	.LCB3173
	b	.L602	@long jump
.LCB3173:
	.loc 1 1497 0
	mov	r0, #12
	mov	r1, #0
	mov	r2, #0
	mov	r3, #1
	bl	mmcsd_send_cmd_wait_resp
	cmp	r0, #0
	mov	r9, r0
	beq	.LCB3181
	b	.L622	@long jump
.LCB3181:
	b	.L602
.L624:
	.align	2
.L623:
	.word	mmcsd+116
	.word	-1610530780
	.word	511
	.word	.LC105
	.word	.LC107
	.word	2179128
	.word	mmcsd
	.word	2089
	.word	mmcsd_status_reg
	.word	neti_debug
	.word	521
	.word	.LC101
.LBE144:
.LBE143:
.LFE59:
	.size	mmcsd_read, .-mmcsd_read
	.section	.text.mmcsd_erase,"ax",%progbits
	.align	2
	.global	mmcsd_erase
	.code 16
	.thumb_func
	.type	mmcsd_erase, %function

-- 
           Summary: Bad assembly output in Thumb mode with -O2
           Product: gcc
           Version: 3.4.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: czimman at bloomberg dot com
                CC: gcc-bugs at gcc dot gnu dot org
  GCC host triplet: i386-unknown-linux
GCC target triplet: arm-elf-gcc


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23980


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2005-09-30  9:21 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-09-20 16:15 [Bug c/23980] New: Bad assembly output in Thumb mode with -O2 czimman at bloomberg dot com
2005-09-20 16:18 ` [Bug target/23980] " pinskia at gcc dot gnu dot org
2005-09-20 16:21 ` pinskia at gcc dot gnu dot org
2005-09-20 17:25 ` czimman at bloomberg dot com
2005-09-30  9:21 ` rearnsha at gcc dot gnu dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).