Hi Guys,
Seems like a stupid question, but I'm facing a strange problem: The
sub.w opcode doesn't seem to subtract like expected. The C-code (see
below) works fine, but when I express the same thing in asm, it doesn't
work, the results are completely wrong. May it be that I have to test
the operands of the subtraction for their respective sign and then need
to add/sub accordingly??? All variables are 16-bit signed integers.
Following C lines should be expressed in assembler:
1 | x_n_re[b_index] = x_n_re[a_index]-resultMulReCos+resultMulImSin;
|
2 | x_n_re[a_index] = x_n_re[a_index]+resultMulReCos-resultMulImSin;
|
3 | x_n_im[b_index] = x_n_im[a_index]-resultMulReSin-resultMulImCos;
|
4 | x_n_im[a_index] = x_n_im[a_index]+resultMulReSin+resultMulImCos;
|
which looks like this when I write it in asm:
(a_index and b_index are passed as array indices[3] and indices[2] to
the asm-function (indices[0] -> w0), &x_n_re[0] and &x_n_im[0] are
passed as array into w2)
w1,w3,w4,w7 are being loaded with the (correct) values of ReCos, ImCos,
ReSin and ImSin before this.
1 | mov.w [w0+0x4], w12 ; b_index -> w12
|
2 | sl w12,#1,w12 ; b_index *= 2 for 16-bit increment
|
3 |
|
4 | mov.w [w0+0x6], w9 ; a_index -> w9
|
5 | sl w9,#1,w9 ; a_index *= 2 for 16-bit increment
|
6 |
|
7 | mov.w [w2], w5 ; &x_n_re[0] -> w5
|
8 | mov.w [w5+w9], w8 ; x_n_re[a_index] -> w8
|
9 |
|
10 | add w1,w4,w6 ; ReCos+ImSin
|
11 | sub w8,w6,w6 ; w6=x_n_re[a_index]-recos+imsin
|
12 | mov w6,[w5+w12] ; x_n_re[b_index]=w6-recos+imsin
|
13 |
|
14 | sub w1,w4,w6 ; ReCos-ImSin
|
15 | add w8,w6,w6 ; w6 = x_n_re[a_index]+recos-imsin
|
16 | mov w6, [w5+w9] ; x_n_re[a_index]=w6+recos-imsin
|
17 |
|
18 | mov.w [w2+0x2], w5 ; &x_n_im[0] -> w5
|
19 | mov.w [w5+w9], w8 ; x_n_im[a_index] -> w8
|
20 |
|
21 | sub w7,w3,w6 ; w6=ReSin-ImCos
|
22 | sub w8,w6,w6 ; w6=x_n_im[a_index]-resin-imcos
|
23 | mov w6, [w5+w9] ; x_n_im[b_index]=w6-resin-imcos
|
24 |
|
25 | add w7,w3,w6 ; w6=ReSin+ImCos
|
26 | add w8,w6,w6 ; w6=x_n_im[a_index]+resin+imcos
|
27 | mov w6, [w5+w9] ; x_n_im[a_index]=w6+resin+imcos
|
Am I missing something?
Thanks a lot!