This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/18065] New: wrong built-in functions selected
- From: "schlie at comcast dot net" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 19 Oct 2004 20:22:18 -0000
- Subject: [Bug c/18065] New: wrong built-in functions selected
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
Overall, the major problem is that the lhs operand object type, or most
optimal compatible type in the case of immedite operands, is not being
used to correcly select builtin functions; which is fairly important for
a compiler for 8-bit target to get right; where (u)divmod(q/h)i4 signed and
unsigned 8 and 16 bit builtin verions of the / and % functions corespondingly.
(This bug is independant of bug #10733, which doesn't actually seem
as a bug to me, unless the divmod built-in functions are coded incorrectly,
implies the use of divmodhi4 16 bit signed builtin; just as t1% = 30 implies
the use of the udivmodqi4 unsigned 8-bit builtin.
per ref: <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10733> )
The following main.c and main.lss file listings demonstrate the failure:
// main.c
//
// inspecting code using avr-gcc 3.4.3 & buinutils 2.15.x as of 10/16/04 snapshots:
int main( void ){
volatile signed char s;
volatile unsigned char u;
//
// Overall, the major problem is that the lhs operand object type, or most
// optimal compatible type in the case of immedite operands, is not being
// used to correcly select builtin functions; which is fairly important for
// a compiler for 8-bit target to get right; where (u)divmod(q/h)i4 signed and
// unsigned 8 and 16 bit builtin verions of the / and % functions corespondingly.
//
// (This bug is independant of bug #10733, which doesn't actually seem
// as a bug to me, unless the divmod built-in functions are coded incorrectly,
// as in t1 = (t1 + 40) % 30; the (t1 + 40) sub-exp returns an int, which then
// implies the use of divmodhi4 16 bit signed builtin; just as t1% = 30 implies
// the use of the udivmodqi4 unsigned 8-bit builtin.
// per ref: <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10733> )
char ss = s % s ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
char su = s % u ; //<__divmodhi4> correct.
char us = u % s ; //<__divmodhi4> correct.
char uu = u % u ; //<__udivmodqi4> correct.
// although optminally selecting the builtin's for rhs immediate's:
char sn = s % -3 ; //<__divmodqi4> correct.
char sp = s % +3 ; //<__divmodqi4> correct.
char un = u % -3 ; //<__divmodhi4> correct.
char up = u % +3 ; //<__udivmodqi4> correct.
// it never recognizes any opportunites for lhs immeidate's ?:
char ns = -3 % s ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
char ps = +3 % s ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
char nu = -3 % u ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
char pu = +3 % u ; //<__divmodhi4> wrong, should be 8-bit unsigned <__udivmodqi4>
// but does optimally select based on expicitly cast immediate values:
char uc = u % ( char)-3 ; //<__udivmodqi4> correct, :: unsigned char
char ux = u % ( signed char)-3 ; //<__divmodhi4> correct.
char uy = u % (unsigned char)-3 ; //<__udivmodqi4> correct.
char cu = ( char)-3 % u ; //<__udivmodqi4> correct, :: unsigned char
char xu = ( signed char)-3 % u ; //<__divmodhi4> correct.
char yu = (unsigned char)-3 % u ; //<__udivmodqi4> correct.
char sc = s % ( char)-3 ; //<__divmodhi4> correct, :: unsigned char
char sx = s % ( signed char)-3 ; //<__divmodqi4> correct.
char sy = s % (unsigned char)-3 ; //<__divmodhi4> correct.
char cs = ( char)-3 % s ; //<__divmodhi4> correct, :: unsigned char
char xs = ( signed char)-3 % s ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
char ys = (unsigned char)-3 % s ; //<__divmodhi4> correct.
return ss + su + us + uu +
sn + sp + un + up +
ns + ps + nu + pu +
uc + ux + uy + cu + xu + yu +
sc + sx + sy + cs + xs + ys ;
}
/*
main.lss file listing:
--begin--
main.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000000 00800100 0000034e 000003e2 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 0000034e 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 00000000 00800100 0000034e 000003e2 2**0
ALLOC
3 .noinit 00000000 00800100 00800100 000003e2 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 000003e2 2**0
CONTENTS
5 .stab 00000600 00000000 00000000 000003e4 2**2
CONTENTS, READONLY, DEBUGGING
6 .stabstr 000004c6 00000000 00000000 000009e4 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 46 00 jmp 0x8c
4: 0c 94 61 00 jmp 0xc2
8: 0c 94 61 00 jmp 0xc2
c: 0c 94 61 00 jmp 0xc2
10: 0c 94 61 00 jmp 0xc2
14: 0c 94 61 00 jmp 0xc2
18: 0c 94 61 00 jmp 0xc2
1c: 0c 94 61 00 jmp 0xc2
20: 0c 94 61 00 jmp 0xc2
24: 0c 94 61 00 jmp 0xc2
28: 0c 94 61 00 jmp 0xc2
2c: 0c 94 61 00 jmp 0xc2
30: 0c 94 61 00 jmp 0xc2
34: 0c 94 61 00 jmp 0xc2
38: 0c 94 61 00 jmp 0xc2
3c: 0c 94 61 00 jmp 0xc2
40: 0c 94 61 00 jmp 0xc2
44: 0c 94 61 00 jmp 0xc2
48: 0c 94 61 00 jmp 0xc2
4c: 0c 94 61 00 jmp 0xc2
50: 0c 94 61 00 jmp 0xc2
54: 0c 94 61 00 jmp 0xc2
58: 0c 94 61 00 jmp 0xc2
5c: 0c 94 61 00 jmp 0xc2
60: 0c 94 61 00 jmp 0xc2
64: 0c 94 61 00 jmp 0xc2
68: 0c 94 61 00 jmp 0xc2
6c: 0c 94 61 00 jmp 0xc2
70: 0c 94 61 00 jmp 0xc2
74: 0c 94 61 00 jmp 0xc2
78: 0c 94 61 00 jmp 0xc2
7c: 0c 94 61 00 jmp 0xc2
80: 0c 94 61 00 jmp 0xc2
84: 0c 94 61 00 jmp 0xc2
88: 0c 94 61 00 jmp 0xc2
0000008c <__ctors_end>:
8c: 11 24 eor r1, r1
8e: 1f be out 0x3f, r1 ; 63
90: cf ef ldi r28, 0xFF ; 255
92: d0 e1 ldi r29, 0x10 ; 16
94: de bf out 0x3e, r29 ; 62
96: cd bf out 0x3d, r28 ; 61
00000098 <__do_copy_data>:
98: 11 e0 ldi r17, 0x01 ; 1
9a: a0 e0 ldi r26, 0x00 ; 0
9c: b1 e0 ldi r27, 0x01 ; 1
9e: ee e4 ldi r30, 0x4E ; 78
a0: f3 e0 ldi r31, 0x03 ; 3
a2: 02 c0 rjmp .+4 ; 0xa8
000000a4 <.do_copy_data_loop>:
a4: 05 90 lpm r0, Z+
a6: 0d 92 st X+, r0
000000a8 <.do_copy_data_start>:
a8: a0 30 cpi r26, 0x00 ; 0
aa: b1 07 cpc r27, r17
ac: d9 f7 brne .-10 ; 0xa4
000000ae <__do_clear_bss>:
ae: 11 e0 ldi r17, 0x01 ; 1
b0: a0 e0 ldi r26, 0x00 ; 0
b2: b1 e0 ldi r27, 0x01 ; 1
b4: 01 c0 rjmp .+2 ; 0xb8
000000b6 <.do_clear_bss_loop>:
b6: 1d 92 st X+, r1
000000b8 <.do_clear_bss_start>:
b8: a0 30 cpi r26, 0x00 ; 0
ba: b1 07 cpc r27, r17
bc: e1 f7 brne .-8 ; 0xb6
be: 0c 94 63 00 jmp 0xc6
000000c2 <__bad_interrupt>:
c2: 0c 94 00 00 jmp 0x0
000000c6 <main>:
// inspecting code using avr-gcc 3.4.3 & buinutils 2.15.x as of 10/16/04 snapshots:
int main( void ){
c6: c5 ef ldi r28, 0xF5 ; 245
c8: d0 e1 ldi r29, 0x10 ; 16
ca: de bf out 0x3e, r29 ; 62
cc: cd bf out 0x3d, r28 ; 61
volatile signed char s;
volatile unsigned char u;
//
// Overall, the major problem is that the lhs operand object type, or most
// optimal compatible type in the case of immedite operands, is not being
// used to correcly select builtin functions; which is fairly important for
// a compiler for 8-bit target to get right; where (u)divmod(q/h)i4 signed and
// unsigned 8 and 16 bit builtin verions of the / and % functions corespondingly.
//
// (this bug is independant of bug #10733, which doesn't actually seem
// as a bug to me, as in t1 = (t1 + 40) % 30; the (t1 + 40) sub-exp
// returns an int, which then implies the use of divmodhi4 16 bit signed
// builtin; just as t1% = 30 implies the use of the udivmodqi4 unsigned 8-bit
// builtin. ref: <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10733> )
char ss = s % s ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
ce: 99 81 ldd r25, Y+1 ; 0x01
d0: 89 81 ldd r24, Y+1 ; 0x01
d2: 28 2f mov r18, r24
d4: 33 27 eor r19, r19
d6: 27 fd sbrc r18, 7
d8: 30 95 com r19
da: 89 2f mov r24, r25
dc: 99 27 eor r25, r25
de: 87 fd sbrc r24, 7
e0: 90 95 com r25
e2: b9 01 movw r22, r18
e4: 0e 94 7f 01 call 0x2fe
e8: 8b 83 std Y+3, r24 ; 0x03
char su = s % u ; //<__divmodhi4> correct.
ea: 99 81 ldd r25, Y+1 ; 0x01
ec: 8a 81 ldd r24, Y+2 ; 0x02
ee: 28 2f mov r18, r24
f0: 33 27 eor r19, r19
f2: 89 2f mov r24, r25
f4: 99 27 eor r25, r25
f6: 87 fd sbrc r24, 7
f8: 90 95 com r25
fa: b9 01 movw r22, r18
fc: 0e 94 7f 01 call 0x2fe
100: 8c 83 std Y+4, r24 ; 0x04
char us = u % s ; //<__divmodhi4> correct.
102: 9a 81 ldd r25, Y+2 ; 0x02
104: 89 81 ldd r24, Y+1 ; 0x01
106: 28 2f mov r18, r24
108: 33 27 eor r19, r19
10a: 27 fd sbrc r18, 7
10c: 30 95 com r19
10e: 89 2f mov r24, r25
110: 99 27 eor r25, r25
112: b9 01 movw r22, r18
114: 0e 94 7f 01 call 0x2fe
118: 8d 83 std Y+5, r24 ; 0x05
char uu = u % u ; //<__udivmodqi4> correct.
11a: 8a 81 ldd r24, Y+2 ; 0x02
11c: 9a 81 ldd r25, Y+2 ; 0x02
11e: 69 2f mov r22, r25
120: 0e 94 66 01 call 0x2cc
124: 9e 83 std Y+6, r25 ; 0x06
// although optminally selecting the builtin's for rhs immediate's:
char sn = s % -3 ; //<__divmodqi4> correct.
126: 89 81 ldd r24, Y+1 ; 0x01
128: 93 e0 ldi r25, 0x03 ; 3
12a: f9 2e mov r15, r25
12c: 6f 2d mov r22, r15
12e: 0e 94 72 01 call 0x2e4
132: 9f 83 std Y+7, r25 ; 0x07
char sp = s % +3 ; //<__divmodqi4> correct.
134: 89 81 ldd r24, Y+1 ; 0x01
136: 6f 2d mov r22, r15
138: 0e 94 72 01 call 0x2e4
13c: 98 87 std Y+8, r25 ; 0x08
char un = u % -3 ; //<__divmodhi4> correct.
13e: 8a 81 ldd r24, Y+2 ; 0x02
140: e3 e0 ldi r30, 0x03 ; 3
142: f0 e0 ldi r31, 0x00 ; 0
144: 99 27 eor r25, r25
146: bf 01 movw r22, r30
148: 0e 94 7f 01 call 0x2fe
14c: 89 87 std Y+9, r24 ; 0x09
char up = u % +3 ; //<__udivmodqi4> correct.
14e: 8a 81 ldd r24, Y+2 ; 0x02
150: 6f 2d mov r22, r15
152: 0e 94 66 01 call 0x2cc
156: 9a 87 std Y+10, r25 ; 0x0a
// it never recognizes any opportunites for lhs immeidate's ?:
char ns = -3 % s ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
158: 89 81 ldd r24, Y+1 ; 0x01
15a: 28 2f mov r18, r24
15c: 33 27 eor r19, r19
15e: 27 fd sbrc r18, 7
160: 30 95 com r19
162: 0d ef ldi r16, 0xFD ; 253
164: 1f ef ldi r17, 0xFF ; 255
166: c8 01 movw r24, r16
168: b9 01 movw r22, r18
16a: 0e 94 7f 01 call 0x2fe
16e: 28 2e mov r2, r24
char ps = +3 % s ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
170: 89 81 ldd r24, Y+1 ; 0x01
172: 28 2f mov r18, r24
174: 33 27 eor r19, r19
176: 27 fd sbrc r18, 7
178: 30 95 com r19
17a: cf 01 movw r24, r30
17c: b9 01 movw r22, r18
17e: 0e 94 7f 01 call 0x2fe
182: 38 2e mov r3, r24
char nu = -3 % u ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
184: 8a 81 ldd r24, Y+2 ; 0x02
186: 28 2f mov r18, r24
188: 33 27 eor r19, r19
18a: c8 01 movw r24, r16
18c: b9 01 movw r22, r18
18e: 0e 94 7f 01 call 0x2fe
192: 48 2e mov r4, r24
char pu = +3 % u ; //<__divmodhi4> wrong, should be 8-bit unsigned <__udivmodqi4>
194: 8a 81 ldd r24, Y+2 ; 0x02
196: 28 2f mov r18, r24
198: 33 27 eor r19, r19
19a: cf 01 movw r24, r30
19c: b9 01 movw r22, r18
19e: 0e 94 7f 01 call 0x2fe
1a2: 58 2e mov r5, r24
// but does optimally select based on expicitly cast immediate values:
char uc = u % ( char)-3 ; //<__udivmodqi4> correct, :: unsigned char
1a4: 8a 81 ldd r24, Y+2 ; 0x02
1a6: 4d ef ldi r20, 0xFD ; 253
1a8: 64 2f mov r22, r20
1aa: 0e 94 66 01 call 0x2cc
1ae: 69 2e mov r6, r25
char ux = u % ( signed char)-3 ; //<__divmodhi4> correct.
1b0: 8a 81 ldd r24, Y+2 ; 0x02
1b2: 99 27 eor r25, r25
1b4: bf 01 movw r22, r30
1b6: 0e 94 7f 01 call 0x2fe
1ba: 78 2e mov r7, r24
char uy = u % (unsigned char)-3 ; //<__udivmodqi4> correct.
1bc: 8a 81 ldd r24, Y+2 ; 0x02
1be: 64 2f mov r22, r20
1c0: 0e 94 66 01 call 0x2cc
1c4: 89 2e mov r8, r25
char cu = ( char)-3 % u ; //<__udivmodqi4> correct, :: unsigned char
1c6: 9a 81 ldd r25, Y+2 ; 0x02
1c8: 84 2f mov r24, r20
1ca: 69 2f mov r22, r25
1cc: 0e 94 66 01 call 0x2cc
1d0: 99 2e mov r9, r25
char xu = ( signed char)-3 % u ; //<__divmodhi4> correct.
1d2: 8a 81 ldd r24, Y+2 ; 0x02
1d4: 28 2f mov r18, r24
1d6: 33 27 eor r19, r19
1d8: c8 01 movw r24, r16
1da: b9 01 movw r22, r18
1dc: 0e 94 7f 01 call 0x2fe
1e0: a8 2e mov r10, r24
char yu = (unsigned char)-3 % u ; //<__udivmodqi4> correct.
1e2: 9a 81 ldd r25, Y+2 ; 0x02
1e4: 84 2f mov r24, r20
1e6: 69 2f mov r22, r25
1e8: 0e 94 66 01 call 0x2cc
1ec: b9 2e mov r11, r25
char sc = s % ( char)-3 ; //<__divmodhi4> correct, :: unsigned char
1ee: 89 81 ldd r24, Y+1 ; 0x01
1f0: ed ef ldi r30, 0xFD ; 253
1f2: f0 e0 ldi r31, 0x00 ; 0
1f4: 99 27 eor r25, r25
1f6: 87 fd sbrc r24, 7
1f8: 90 95 com r25
1fa: bf 01 movw r22, r30
1fc: 0e 94 7f 01 call 0x2fe
200: c8 2e mov r12, r24
char sx = s % ( signed char)-3 ; //<__divmodqi4> correct.
202: 89 81 ldd r24, Y+1 ; 0x01
204: 6f 2d mov r22, r15
206: 0e 94 72 01 call 0x2e4
20a: d9 2e mov r13, r25
char sy = s % (unsigned char)-3 ; //<__divmodhi4> correct.
20c: 89 81 ldd r24, Y+1 ; 0x01
20e: 99 27 eor r25, r25
210: 87 fd sbrc r24, 7
212: 90 95 com r25
214: bf 01 movw r22, r30
216: 0e 94 7f 01 call 0x2fe
21a: e8 2e mov r14, r24
char cs = ( char)-3 % s ; //<__divmodhi4> correct, :: unsigned char
21c: 89 81 ldd r24, Y+1 ; 0x01
21e: 28 2f mov r18, r24
220: 33 27 eor r19, r19
222: 27 fd sbrc r18, 7
224: 30 95 com r19
226: cf 01 movw r24, r30
228: b9 01 movw r22, r18
22a: 0e 94 7f 01 call 0x2fe
22e: f8 2e mov r15, r24
char xs = ( signed char)-3 % s ; //<__divmodhi4> wrong, should be 8-bit <__divmodqi4>
230: 89 81 ldd r24, Y+1 ; 0x01
232: 28 2f mov r18, r24
234: 33 27 eor r19, r19
236: 27 fd sbrc r18, 7
238: 30 95 com r19
23a: c8 01 movw r24, r16
23c: b9 01 movw r22, r18
23e: 0e 94 7f 01 call 0x2fe
242: 48 2f mov r20, r24
char ys = (unsigned char)-3 % s ; //<__divmodhi4> correct.
244: 89 81 ldd r24, Y+1 ; 0x01
246: 28 2f mov r18, r24
248: 33 27 eor r19, r19
24a: 27 fd sbrc r18, 7
24c: 30 95 com r19
24e: cf 01 movw r24, r30
250: b9 01 movw r22, r18
252: 0e 94 7f 01 call 0x2fe
return ss + su + us + uu +
256: 6b 81 ldd r22, Y+3 ; 0x03
258: 9c 81 ldd r25, Y+4 ; 0x04
25a: 69 0f add r22, r25
25c: 71 2d mov r23, r1
25e: 71 1d adc r23, r1
260: 9b 01 movw r18, r22
262: 6d 81 ldd r22, Y+5 ; 0x05
264: 26 0f add r18, r22
266: 31 1d adc r19, r1
268: 7e 81 ldd r23, Y+6 ; 0x06
26a: 27 0f add r18, r23
26c: 31 1d adc r19, r1
26e: 9f 81 ldd r25, Y+7 ; 0x07
270: 29 0f add r18, r25
272: 31 1d adc r19, r1
274: 68 85 ldd r22, Y+8 ; 0x08
276: 26 0f add r18, r22
278: 31 1d adc r19, r1
27a: 79 85 ldd r23, Y+9 ; 0x09
27c: 27 0f add r18, r23
27e: 31 1d adc r19, r1
280: 9a 85 ldd r25, Y+10 ; 0x0a
282: 29 0f add r18, r25
284: 31 1d adc r19, r1
286: 22 0d add r18, r2
288: 31 1d adc r19, r1
28a: 23 0d add r18, r3
28c: 31 1d adc r19, r1
28e: 24 0d add r18, r4
290: 31 1d adc r19, r1
292: 25 0d add r18, r5
294: 31 1d adc r19, r1
296: 26 0d add r18, r6
298: 31 1d adc r19, r1
29a: 27 0d add r18, r7
29c: 31 1d adc r19, r1
29e: 28 0d add r18, r8
2a0: 31 1d adc r19, r1
2a2: 29 0d add r18, r9
2a4: 31 1d adc r19, r1
2a6: 2a 0d add r18, r10
2a8: 31 1d adc r19, r1
2aa: 2b 0d add r18, r11
2ac: 31 1d adc r19, r1
2ae: 2c 0d add r18, r12
2b0: 31 1d adc r19, r1
2b2: 2d 0d add r18, r13
2b4: 31 1d adc r19, r1
2b6: 2e 0d add r18, r14
2b8: 31 1d adc r19, r1
2ba: 2f 0d add r18, r15
2bc: 31 1d adc r19, r1
2be: 24 0f add r18, r20
2c0: 31 1d adc r19, r1
sn + sp + un + up +
ns + ps + nu + pu +
uc + ux + uy + cu + xu + yu +
sc + sx + sy + cs + xs + ys ;
}
2c2: 28 0f add r18, r24
2c4: 31 1d adc r19, r1
2c6: c9 01 movw r24, r18
2c8: 0c 94 a6 01 jmp 0x34c
000002cc <__udivmodqi4>:
2cc: 99 1b sub r25, r25
2ce: 79 e0 ldi r23, 0x09 ; 9
2d0: 04 c0 rjmp .+8 ; 0x2da
000002d2 <__udivmodqi4_loop>:
2d2: 99 1f adc r25, r25
2d4: 96 17 cp r25, r22
2d6: 08 f0 brcs .+2 ; 0x2da
2d8: 96 1b sub r25, r22
000002da <__udivmodqi4_ep>:
2da: 88 1f adc r24, r24
2dc: 7a 95 dec r23
2de: c9 f7 brne .-14 ; 0x2d2
2e0: 80 95 com r24
2e2: 08 95 ret
000002e4 <__divmodqi4>:
2e4: 87 fb bst r24, 7
2e6: 08 2e mov r0, r24
2e8: 06 26 eor r0, r22
2ea: 87 fd sbrc r24, 7
2ec: 81 95 neg r24
2ee: 67 fd sbrc r22, 7
2f0: 61 95 neg r22
2f2: ec df rcall .-40 ; 0x2cc
2f4: 0e f4 brtc .+2 ; 0x2f8
2f6: 91 95 neg r25
000002f8 <__divmodqi4_1>:
2f8: 07 fc sbrc r0, 7
2fa: 81 95 neg r24
000002fc <__divmodqi4_exit>:
2fc: 08 95 ret
000002fe <__divmodhi4>:
2fe: 97 fb bst r25, 7
300: 09 2e mov r0, r25
302: 07 26 eor r0, r23
304: 0a d0 rcall .+20 ; 0x31a
306: 77 fd sbrc r23, 7
308: 04 d0 rcall .+8 ; 0x312
30a: 0c d0 rcall .+24 ; 0x324
30c: 06 d0 rcall .+12 ; 0x31a
30e: 00 20 and r0, r0
310: 1a f4 brpl .+6 ; 0x318
00000312 <__divmodhi4_neg2>:
312: 70 95 com r23
314: 61 95 neg r22
316: 7f 4f sbci r23, 0xFF ; 255
00000318 <__divmodhi4_exit>:
318: 08 95 ret
0000031a <__divmodhi4_neg1>:
31a: f6 f7 brtc .-4 ; 0x318
31c: 90 95 com r25
31e: 81 95 neg r24
320: 9f 4f sbci r25, 0xFF ; 255
322: 08 95 ret
00000324 <__udivmodhi4>:
324: aa 1b sub r26, r26
326: bb 1b sub r27, r27
328: 51 e1 ldi r21, 0x11 ; 17
32a: 07 c0 rjmp .+14 ; 0x33a
0000032c <__udivmodhi4_loop>:
32c: aa 1f adc r26, r26
32e: bb 1f adc r27, r27
330: a6 17 cp r26, r22
332: b7 07 cpc r27, r23
334: 10 f0 brcs .+4 ; 0x33a
336: a6 1b sub r26, r22
338: b7 0b sbc r27, r23
0000033a <__udivmodhi4_ep>:
33a: 88 1f adc r24, r24
33c: 99 1f adc r25, r25
33e: 5a 95 dec r21
340: a9 f7 brne .-22 ; 0x32c
342: 80 95 com r24
344: 90 95 com r25
346: bc 01 movw r22, r24
348: cd 01 movw r24, r26
34a: 08 95 ret
0000034c <_exit>:
34c: ff cf rjmp .-2 ; 0x34c
---end---
makefile file listing:
--begin--
# Hey Emacs, this is a -*- makefile -*-
#
# WinAVR Sample makefile written by Eric B. Weddington, JË?rg Wunsch, et al.
# Released to the Public Domain
# Please read the make user manual!
#
# Additional material for this makefile was submitted by:
# Tim Henigan
# Peter Fleury
# Reiner Patommel
# Sander Pool
# Frederik Rouleau
# Markus Pfaff
#
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB).
#
# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio
# 4.07 or greater).
#
# make program = Download the hex file to the device, using avrdude. Please
# customize the avrdude settings below first!
#
# make filename.s = Just compile filename.c into the assembler code only
#
# To rebuild project do "make clean" then "make all".
#
# MCU name
MCU = atmega64
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
# Target file name (without extension).
TARGET = main
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c
# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC =
# Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s
# Debugging format.
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
#DEBUG = dwarf-2
DEBUG =
# List any extra directories to look for include files here.
# Each directory must be seperated by a space.
EXTRAINCDIRS = /usr/local/avr/include
# Compiler flag to set the C Standard level.
# c89 - "ANSI" C
# gnu89 - c89 plus GCC extensions
# c99 - ISO C99 standard (not yet fully implemented)
# gnu99 - c99 plus GCC extensions
CSTANDARD = -std=gnu99
# Place -D or -U options here
CDEFS =
# Place -I options here
CINCS =
# Compiler flags.
# -g*: generate debugging information
# -O*: optimization level
# -f...: tuning, see GCC manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -adhlns...: create assembler listing
CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS) $(CINCS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -Wall -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)
# Assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
#Additional libraries.
# Minimalistic printf version
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB =
# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
SCANF_LIB =
MATH_LIB = -lm
# External memory options
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# used for variables (.data/.bss) and heap (malloc()).
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# only used for heap (malloc()).
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
EXTMEMOPTS =
# Linker flags.
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
# Programming support using avrdude. Settings and variables.
# Programming hardware: alf avr910 avrisp bascom bsd
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
#
# Type: avrdude -c ?
# to get a full listing.
#
AVRDUDE_PROGRAMMER = stk500
# com1 = serial port. Use lpt1 to connect to parallel port.
AVRDUDE_PORT = com1 # programmer connected to serial device
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE_COUNTER = -y
# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
#AVRDUDE_NO_VERIFY = -V
# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_VERBOSE = -v -v
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
# ---------------------------------------------------------------------------
# Define directories, if needed.
#DIRAVR = c:/winavr
#DIRAVRBIN = $(DIRAVR)/bin
#DIRAVRUTILS = $(DIRAVR)/utils/bin
#DIRINC = .
#DIRLIB = $(DIRAVR)/avr/lib
# Define programs and commands.
SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
COPY = cp
# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
# Compiler flags to generate dependency files.
GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
# Default target.
all: begin gccversion sizebefore build sizeafter finished end
build: elf hex eep lss sym
elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym
# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@echo
@echo $(MSG_BEGIN)
finished:
@echo $(MSG_ERRORS_NONE)
end:
@echo $(MSG_END)
@echo
# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf
sizebefore:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
sizeafter:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi
# Display compiler version information.
gccversion :
@$(CC) --version
# Program the device.
#program: $(TARGET).hex $(TARGET).eep
# $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) #$(AVRDUDE_WRITE_EEPROM)
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
@echo
@echo $(MSG_FLASH) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
# Create extended listing file from ELF output file.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@
# Create a symbol table from ELF output file.
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
$(NM) -n $< > $@
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
# Compile: create object files from C source files.
%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@
# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@
# Assemble: create object files from assembler source files.
%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@
# Target: clean project.
clean: begin clean_list finished end
clean_list :
@echo
@echo $(MSG_CLEANING)
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).a90
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lnk
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
$(REMOVE) .dep/*
# Include the dependency files.
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list
#clean clean_list program
---end---
*/
--
Summary: wrong built-in functions selected
Product: gcc
Version: 3.4.3
Status: UNCONFIRMED
Severity: critical
Priority: P1
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: schlie at comcast dot net
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: powerpc-apple-darwin7.5.0
GCC host triplet: powerpc-apple-darwin7.5.0
GCC target triplet: avr-unknown-none
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18065