Generating rectify
Download
1 / 38

Generating “Rectify( )” - PowerPoint PPT Presentation


  • 71 Views
  • Uploaded on

Generating “Rectify( )”. Assembly code examples Part 1 of 3. Concepts. Concepts of C++ “stubs” Forcing the test to fail – test of test Generating valid “C++ code” to satisfy the tests Need for “name mangling” for overloaded functions

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Generating “Rectify( )” ' - roth-vincent


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Generating rectify

Generating “Rectify( )”

Assembly code examplesPart 1 of 3


Concepts
Concepts

  • Concepts of C++ “stubs”

  • Forcing the test to fail – test of test

  • Generating valid “C++ code” to satisfy the tests

  • Need for “name mangling” for overloaded functions

    • How do you find out the name mangled name so it can be used in assembly code

  • Learning just enough TigerSHARC assembly code to make things “work”

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Software am radio concept
Software “AM” radio concept

RF STAGE

Antenna

Pickup

AUDIO STAGE

Low passFilter+ amplifier

Low passFilter

Rectifier

Mixer

LocalOscillator

IF STAGE

Audio out

Most stages handled with high speed software

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Test driven development
Test Driven Development

Work with customer to check that the tests properly express what the customer wants done. Iterative process with customer “heavily involved” – “Agile” methodology.

CUSTOMER

DEVELOPER

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


E tdd test cpp files have four main components many error messages if not present
E-TDD Test.cpp files have four main components. Many error messages if not present

Include Files – cut-and-paste (always the same)

TEST_CONNECT (TestFileInfo)

TEST(testNAME, testTYPE)

NOTE: Tests execute from LAST in file to FIRST. As normally the LAST test is the most recently added test, this is good.

You test if new code works and then check (regression test) that you did not break anything

LINK_TEST(TestFileInfo, testTYPE)

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Now expand the customer tests to do what the customer has requested
Now expand the Customer Tests to do what the customer has requested

Problems to be fixed in Assignment 1

Add test for

If N <= 0, return NULL otherwise return the start of the output array

Tests are working by mistake as

We are not resetting the output array

to 0 between function calls

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Name mangled names can be seen from linker
Name mangled names can be seen from linker requested

C++ name as used The name mangled name generated by

in C++ code by the C++ compiler in response to function

overloading. These are the “assembly code”

names

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Next step write just enough code to satisfy the linker c stubs
Next step: Write just enough code to satisfy the linker – C++ stubs

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Write the assembly language stub
Write the assembly language stub C++ stubs

  • We lost control of the processors in the debug environment.

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Build the code incrementally to satisfy tests
Build the code incrementally to satisfy tests C++ stubs

See speed change now we

Are executing code – but why failures

Note what if N < = 0

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Note C++ stubs

Special marker

Compiler optimization

FLOATS 927  304 -- THREE FOLD

INTS 960  150 – SIX FOLD

Why the difference, and can we do better, and do we want to?

Note the failures – what are they

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Fix tests to only show failures
Fix Tests to only show “FAILURES C++ stubs

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Generate assembly code
Generate assembly code C++ stubs

  • Do the code in steps, attempting to satisfy one test at a time

  • Learn “the assembler” in steps

  • Get “some idea” of the issues we need to learn about as we go along

  • Just enough knowledge “to get things to work”

  • Worry about full details later

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


What we need to know based on experiences from other processors
What we need to know based on experiences from other processors

  • Can we return from an assembly language routine without crashing the processor?

  • Return a parameter from assembly language routine

    • (Is it same for ints and floats?)

  • Pass parameters into assembly language

    • (Is it same for ints and floats?)

  • Do IF THEN ELSE statements

  • Read and write values to memory

  • Read and write values in a loop

  • Do some mathematics on the values fetched from memory

    All this stuff is demonstrated by coding HalfWaveRectifyASM( )

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Write tests about passing values back from an assembly code routine
Write tests about passing values back from an assembly code routine

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


What we have learned
What we have learned routine

  • We passed the “very general” test

    • Managed to call and return from an assembly code and did not crash the system

  • We passed some specific tests in the test file “by accident”

  • CJMP – is the “way to return” from an assembly code function to “C++”

  • Instruction format is interesting

    nop; nop; nop;; ; separate instructions executed together

    CJMP (ABS);; ;; indicates the end of an “grouped” instruction

    CJMP must be like RTS – meaning there is a CJMP register (or memory location) storing the address to return to after this

    COMPARE TO BlackfinP0 = [FP + 4]; Place storing return address

    UNLINK;

    JUMP (P0);

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


More detailed look at the code
More detailed look at the code routine

As with 68K and Blackfin needs a .section

But name and format different

As with 68K need .align statement

Is the “4” in bytes (8 bits)or words (32 bits)

As with 68K need .globalto tell other code that this function

exists

Single semi-colons

Double semi-colons

Start function label

End function label

Used for

“profiling code”

Label format similar to 68K

Needs leading underscore and final colon

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Need to know
Need to know routine

  • How do we return “an integer pointer”

    • Need to look at “C++” manual for coding conventions

  • As with 68K, MIPS and Blackfin expect to have

    • Volatile registers – function variate registers, that DON’T need to be conserved when developing a function

    • Non-volatile, preserved registers – function invariate registers, that DO need to be conserved when developing a function

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Return registers
Return registers routine

  • There are many, depending on what you need to return

  • Here we need to use J8

  • Many registers available – need ability to control usage

    • J0 to J31 – registers (integers and pointers) (SISD mode)

    • XR0 to XR31 – registers (integers) (SISD mode)

    • XFR0 to XFR31 – registers (floats) (SISD mode)

  • Did I also mention

    • I0 to I31 – registers (integers and pointers) (SISD mode)

    • YR0 to YR31 , YFR0 to YFR31 (SIMD mode)

    • XYR, YXR and R registers (SIMD mode)

    • And also the MIMD modes

    • And the double registers and the quad registers …….

      #define return_pt_J8 J8 // J8 is a VOLATILE, NON-PRESERVED register

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Using j8 for returned int value
Using J8 for returned routineint * value

Now passing this test “by accidentShould be conditionally passing back NULL

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Conditional tests
Conditional tests routine

Need to code – returning a NULL or the starting address of the final array

int *HalfWaveRectifyRelease(int initial_array[ ], int final_array[ ], int N)

if ( N < 1) return_pt = NULL;

else /* after some calculations */

return_pt = &final[ 0];

Questions to ask the instruction manual

  • How are parameters passed to us?

  • On the stack (as with 68K) or in registers / stack (as with MIPS and Blackfin)? – answer turns out to be more like MIPS and Blackfin

  • How do you do an IF?

  • How do you do conditional jumps?

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Parameter passing
Parameter passing routine

  • Spaces for first four parameters ARE ALWAYS present on the stack (as with 68K)

  • But the first four parameters are passed in registers (J4, J5, J6 and J7 most of the time) (as with MIPS)

  • The parameters passed in registers are often then stored into the spaces on the stack (like the MIPS) for “safe keeping” when assembly code functions call assembly code functions

  • J4, J5, J6 and J7 are volatile, non-preserved registers

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Coding convention
Coding convention routine

// int *HalfWaveRectifyRelease(int initial_array[ ],

// int final_array[ ], int N)

#define initial_pt_inpar1 J4 incoming parameters

#define final_pt_inpar2 J5

#define N_J6_inpar3 J6

#define return_pt_J8 J8 return value

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Can we pass back the start of the final array
Can we pass back the start of the final array routine

Still passing tests byaccident and thestart of the array needs to be conditional returnvalue

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


What we need to know based on experiences from other processors1
What we need to know based on experiences from other processors

  • Can we return from an assembly language routine without crashing the processor?

  • Return a parameter from assembly language routine

    • (Is it same for ints and floats?)

  • Pass parameters into assembly language

    • (Is it same for ints and floats?)

  • Do IF THEN ELSE statements

  • Read and write values to memory

  • Read and write values in a loop

  • Do some mathematics on the values fetched from memory

    All this stuff is demonstrated by coding HalfWaveRectifyASM( )

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Doing an if n 1 jump type of instruction
Doing an IF (N < 1) JUMP type of instruction processors

  • 68K version

    CMP.L #1, D1 ; Performs subtraction (D1 – 1) and sets ; condition code flag

    BLT ELSE ; Branch if result of (D1 – 1) < 0 ; BLE is a branch if less than ; zero instruction NOT on whether D1 < 1

  • TigerSHARC version

    COMP(N_inpar3, 1);; // Perform N < 1 test

    IF JLT, JUMP ELSE;; // NOTE: Use of comma , and semi-colons ;;

  • Same possible error on BOTH processors

  • 68K -- which test BLE, BLT or BGT should be used?

  • TigerSHARC – which test JLE, JLT or NJLE should be used?

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Else is a tigersharc keyword should have guessed as editor turned in blue
ELSE is a TigerSHARC keyword processorsShould have guessed as editor turned in blue

ELSE is a KEYWORD

Fix that error first

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Why is else a keyword
Why is ELSE a keyword processors

FOUR PART ELSE INSTRUCTION IS LEGAL

IF JLT; ELSE, J1 = J2 + J3; // Conditional execution – if true ELSE, XR1 = XR2 + XR3; // Conditional – if true YFR1 = YFR2 + YFR3;; // Unconditional -- always

IF JLT; DO, J1 = J2 + J3; // Conditional execution -- if true DO, XR1 = XR2 + XR3; // Conditional -- if true YFR1 = YFR2 + YFR3;; // Unconditional -- always

Having this sort of format means that the instruction pipeline is not disrupted by jumps when we do IF statements

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Fix else keyword error
Fix ELSE keyword error processors

GREATER a keyword?

Not blue

Just change it to somethingelse rather than wasting time

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Label name is not the problem
Label name is not the problem processors

NOTE:

This is “C-like” syntax,

But it is not “C”

Statement must end in ;;

Not ;

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Should learn to read looking at wrong error click on error line
Should learn to read – looking at wrong error. Click on error line

Missing ;;

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Still not got the correct syntax
Still not got the correct syntax error line

Because of missing ;; (dual semicolons)

Processor thinks we want

return_pt = 0; JUMP END_IF; return_pt = INPAR3 ;;

Apparently such a complicated instruction IS LEGAL provided the jump is at the start of the multiple issue instruction

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Add dual semicolons everywhere worry about multiple issues later
Add dual-semicolons everywhere error lineWorry about “multiple issues” later

This dual semi-colon

Is so important that you

MUST code review for it all

the time or else you waste

so much time in the

Lab. Key in exams / quizzes

At last an error I know how to fix

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Well i thought i understood it
Well I thought I understood it !!! error line

  • Speed issue – JUMPS can’t be too close together.

  • Not normally a problem when “if” is larger

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Add a single instruction of 4 nops nop nop nop nop
Add a single instruction of 4 NOPs error linenop; nop; nop; nop;;

  • Fix the last error as part of Assignment 1

Fix the remaining error

in handling the IF THEN ELSE

as part of assignment 1

Worry about code efficiency later

(refactor) when all code working

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


What we need to know based on experiences from other processors2
What we need to know based on experiences from other processors

  • Can we return from an assembly language routine without crashing the processor?

  • Return a parameter from assembly language routine

    • (Is it same for ints and floats?)

  • Pass parameters into assembly language

    • (Is it same for ints and floats?)

  • Do IF THEN ELSE statements

  • Read and write values to memory

  • Read and write values in a loop

  • Do some mathematics on the values fetched from memory

    All this stuff is demonstrated by coding HalfWaveRectifyASM( )

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Assignment 1 code the following as a software loop follow 68k approach
Assignment 1 – code the following as a software loop – follow 68K approach

extern “C” int CalculateSum(void) {

int sum = 0;

for (int count = 0; count < 6; count++) {

sum = sum + count;

}

return sum;

}

extern “C” – means that this function is “C” compatible rather than “C++”.

  • No overloading (requiring name-mangling) permitted

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


Reminder software for loop becomes while loop with initial test
Reminder – software for-loop follow 68K approachbecomes “while loop” with initial test

extern “C” int CalculateSum(void) {

int sum = 0;

int count = 0;

while (count < 6) {

sum = sum + count;

count++;

}

return sum;

}

Do line by line translation

TigerSHARC assemble code 1, M. Smith, ECE, University of Calgary, Canada


ad