C to Asm, Asm to c.ppt
C to Asm, Asm to c.ppt
◼ Programming model
◼ Assembly language
▪ Assembly code structure / Data Types
▪ Assembly instructions
◼ C/C++
▪ Data types
▪ Intrinsic functions
▪ Optimizations
▪ Software Pipelining
▪ Inline Assembly
▪ Calling Assembly functions
Programming model
◼ Fetch packet
◼ Loading constants:
MVK .S1 val1, A4 ;move low halfword
MVKH .S1 val1, A4 ;move high halfword
◼ Indirect Addressing Mode:
LDH .D2 *B2++, B7 ;load halfword B7←[B2], increment B2
|| LDH .D1 *A2++, A7 ; load halfword A7←[A2], increment A2
◼ Data types
◼ Intrinsic functions
◼ Inline assembly
◼ Linear assembly
◼ Calling assembly functions
◼ Code optimizations
◼ Software pipelining
Data types
◼
◼ char, signed char
▪ 8 bits ASCII
◼ unsigned char
▪ 8 bits ASCII
◼ Short
▪ 16 bits 2's complement
◼ unsigned short
▪ 16 bits binary
◼ int, signed int
▪ 32 bits 2's complement
◼ unsigned int
▪ 32 bits binary
◼ long, signed long
▪ 40 bits 2's complement
◼ unsigned long
▪ 40 bits binary
◼ Enum
Intrinsic functions
◼ Available C functions used to increase
efficiency
▪ int_mpy(): MPY instruction, multiplies 16 LSBs
▪ int_mpyh(): MPYH instruction, multiplies 16 MSBs
▪ int_mpylh(): MPYHL instruction, multiplies 16
LSBs with 16 MSBs
▪ int_mpyhl(): MPYHL instruction, multiplies 16
MSBs with 16 LSBs
Inline Assembly
.def _sumfunc
_sumfunc: MV .L1 A4,A1 ;n is loop counter
SUB .S1 A1,1,A1 ;decrement n
Unit C1, C9.. C2, C10… C3, C11.. C4, C12… C5, C13… C6, C14… C7, C15… C8, C16…
.D1 LDH
.D2 LDH
.M1 MPY
.L1 ADD
.L2 SUB
Unit
.S2 C1, C9.. C2, C10… C3,
B C11.. C4, C12… C5, C13… C6, C14… C7, C15… C8, C16…
Prolog Kernel
.L1 ADD
.S2 B B B B B B
Assembly Code
;cycle 1
MVK .L2 16,B1 ;loop count
|| ZERO .L1 A7 ;sum
|| LDH .D1 *A4++,A2 ;input in A2
|| LDH .D2 *B4++,B2 ;input in B2
;cycle 2
LDH .D1 *A4++,A2 ;input in A2
|| LDH .D2 *B4++,B2 ;input in B2
|| [B1] SUB .L2 B1,1,B1 ;decrement count
;cycle 3
LDH .D1 *A4++,A2 ;input in A2
|| LDH .D2 *B4++,B2 ;input in B2
|| [B1] SUB .L2 B1,1,B1 ;decrement
|| [B1] B .S2 LOOP
;cycle 4
LDH .D1 *A4++,A2 ;input in A2
|| LDH .D2 *B4++,B2 ;input in B2
|| [B1] SUB .L2 B1,1,B1 ;decrement
|| [B1] B .S2 LOOP
;cycle 5
LDH .D1 *A4++,A2 ;input in A2
|| LDH .D2 *B4++,B2 ;input in B2
|| [B1] SUB .L2 B1,1,B1 ;decrement
|| [B1] B .S2 LOOP
Assembly code
;cycle 6
LDH .D1 *A4++,A2 ;input in A2
|| LDH .D2 *B4++,B2 ;input in B2
|| [B1] SUB .L2 B1,1,B1 ;decrement
|| [B1] B .S2 LOOP
|| MPY .M1x A2,B2,A6
;cycle 7
LDH .D1 *A4++,A2 ;input in A2
|| LDH .D2 *B4++,B2 ;input in B2
|| [B1] SUB .L2 B1,1,B1 ;decrement
|| [B1] B .S2 LOOP
|| MPY .M1x A2,B2,A6
;cycles 8-21(loop kernel)
LOOP: LDH .D1 *A4++,A2 ;input in A2
|| LDH .D2 *B4++,B2 ;input in B2
|| [B1] SUB .L2 B1,1,B1 ;decrement
|| [B1] B .S2 LOOP
|| MPY .M1x A2,B2,A6 ;multiplication
|| ADD .L1 A6,A7,A7
;cycle 22 (epilog)
ADD .L1 A6,A7,A7 ;final sum
Example
◼ 16 interrupt sources
▪ 2 timer interrupts
▪ 4 external interrupts
▪ 4 McBSP interrupts
▪ 4 DMA interrupts
Loop program with interrupt
interrupt void c_int11 //ISR
{
int sample_data;
sample_data = input_sample(); //input data
output_sample(sample_data); //output data
}
void main()
{
comm_intr(); //init DSK, codec, McBSP
//enable INT11 and GIE
while(1); //infinite loop
}