Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
697d95cc
Commit
697d95cc
authored
Dec 02, 2013
by
Robert Yates
Committed by
Wayne Stambaugh
Dec 02, 2013
Browse files
Options
Browse Files
Download
Plain Diff
Boost::Context support for ARM platform.
parents
4a297e78
838d5957
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
187 additions
and
232 deletions
+187
-232
gpu_manager.cpp
common/gal/opengl/gpu_manager.cpp
+2
-3
profile.h
common/profile.h
+0
-147
fcontext.s
common/system/fcontext.s
+4
-0
jump_arm_aapcs_elf_gas.S
common/system/jump_arm_aapcs_elf_gas.S
+76
-0
make_arm_aapcs_elf_gas.S
common/system/make_arm_aapcs_elf_gas.S
+79
-0
view.cpp
common/view/view.cpp
+2
-2
profile.h
include/profile.h
+16
-72
pns_shove.cpp
pcbnew/router/pns_shove.cpp
+8
-8
No files found.
common/gal/opengl/gpu_manager.cpp
View file @
697d95cc
...
...
@@ -189,7 +189,7 @@ void GPU_CACHED_MANAGER::uploadToGpu()
{
#ifdef __WXDEBUG__
prof_counter
totalTime
;
prof_start
(
&
totalTime
,
false
);
prof_start
(
&
totalTime
);
#endif
/* __WXDEBUG__ */
if
(
!
m_buffersInitialized
)
...
...
@@ -214,8 +214,7 @@ void GPU_CACHED_MANAGER::uploadToGpu()
#ifdef __WXDEBUG__
prof_end
(
&
totalTime
);
wxLogDebug
(
wxT
(
"Uploading %d vertices to GPU / %.1f ms"
),
bufferSize
,
(
double
)
totalTime
.
value
/
1000.0
);
wxLogDebug
(
wxT
(
"Uploading %d vertices to GPU / %.1f ms"
),
bufferSize
,
totalTime
.
msecs
()
);
#endif
/* __WXDEBUG__ */
}
...
...
common/profile.h
deleted
100644 → 0
View file @
4a297e78
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file profile.h:
* @brief Simple profiling functions for measuring code execution time.
*/
#ifndef __TPROFILE_H
#define __TPROFILE_H
#include <sys/time.h>
#include <stdint.h>
/**
* Function rdtsc
* Returns processor's time-stamp counter. Main purpose is precise time measuring of code
* execution time.
* @return unsigned long long - Value of time-stamp counter.
*/
#if defined(__i386__)
static
__inline__
unsigned
long
long
rdtsc
()
{
unsigned
long
long
int
x
;
__asm__
volatile
(
".byte 0x0f, 0x31"
:
"=A"
(
x
)
);
return
x
;
}
#elif defined(__x86_64__)
static
__inline__
unsigned
long
long
rdtsc
()
{
unsigned
hi
,
lo
;
__asm__
__volatile__
(
"rdtsc"
:
"=a"
(
lo
),
"=d"
(
hi
)
);
return
(
(
unsigned
long
long
)
lo
)
|
(
(
(
unsigned
long
long
)
hi
)
<<
32
);
}
#elif defined(__powerpc__)
static
__inline__
unsigned
long
long
rdtsc
()
{
unsigned
long
long
int
result
=
0
;
unsigned
long
int
upper
,
lower
,
tmp
;
__asm__
volatile
(
"0:
\n
"
"
\t
mftbu %0
\n
"
"
\t
mftb %1
\n
"
"
\t
mftbu %2
\n
"
"
\t
cmpw %2,%0
\n
"
"
\t
bne 0b
\n
"
:
"=r"
(
upper
),
"=r"
(
lower
),
"=r"
(
tmp
)
);
result
=
upper
;
result
=
result
<<
32
;
result
=
result
|
lower
;
return
result
;
}
#endif
/* __powerpc__ */
// Fixme: OS X version
/**
* Function get_tics
* Returns the number of microseconds that have elapsed since the system was started.
* @return uint64_t Number of microseconds.
*/
static
inline
uint64_t
get_tics
()
{
struct
timeval
tv
;
gettimeofday
(
&
tv
,
NULL
);
return
(
uint64_t
)
tv
.
tv_sec
*
1000000ULL
+
(
uint64_t
)
tv
.
tv_usec
;
}
/**
* Structure for storing data related to profiling counters.
*/
struct
prof_counter
{
uint64_t
value
;
/// Stored timer value
bool
use_rdtsc
;
/// Method of time measuring (rdtsc or tics)
};
/**
* Function prof_start
* Begins code execution time counting for a given profiling counter.
* @param cnt is the counter which should be started.
* @param use_rdtsc tells if processor's time-stamp counter should be used for time counting.
* Otherwise is system tics method will be used. IMPORTANT: time-stamp counter should not
* be used on multicore machines executing threaded code.
*/
static
inline
void
prof_start
(
prof_counter
*
cnt
,
bool
use_rdtsc
)
{
cnt
->
use_rdtsc
=
use_rdtsc
;
if
(
use_rdtsc
)
{
cnt
->
value
=
rdtsc
();
}
else
{
cnt
->
value
=
get_tics
();
}
}
/**
* Function prof_stop
* Ends code execution time counting for a given profiling counter.
* @param cnt is the counter which should be stopped.
*/
static
inline
void
prof_end
(
prof_counter
*
cnt
)
{
if
(
cnt
->
use_rdtsc
)
cnt
->
value
=
rdtsc
()
-
cnt
->
value
;
else
cnt
->
value
=
get_tics
()
-
cnt
->
value
;
}
#endif
common/system/fcontext.s
View file @
697d95cc
...
...
@@ -33,6 +33,10 @@
#include "jump_x86_64_sysv_elf_gas.S"
#include "make_x86_64_sysv_elf_gas.S"
#elif __arm__
#include "jump_arm_aapcs_elf_gas.S"
#include "make_arm_aapcs_elf_gas.S"
#else
#error "Missing make_fcontext & jump_fcontext routines for this architecture"
#endif
...
...
common/system/jump_arm_aapcs_elf_gas.S
0 → 100644
View file @
697d95cc
/*
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
*/
/*******************************************************************
* *
* ------------------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | *
* ------------------------------------------------------------- *
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| 0x20| 0x24| *
* ------------------------------------------------------------- *
* | v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 | sp | lr | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 10 | | *
* ------------------------------------------------------------- *
* | 0x28| | *
* ------------------------------------------------------------- *
* | pc | | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 11 | 12 | | *
* ------------------------------------------------------------- *
* | 0x2c| 0x30| | *
* ------------------------------------------------------------- *
* | sp | size| | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | *
* ------------------------------------------------------------- *
* | 0x34| 0x38|0x3c| 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58 | *
* ------------------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | s24 | s25 | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 23 | 24 | 25 | 26 | 27 | 28 | | *
* ------------------------------------------------------------- *
* | 0x5c| 0x60| 0x64| 0x68| 0x6c| 0x70| | *
* ------------------------------------------------------------- *
* | s26 | s27 | s28 | s29 | s30 | s31 | | *
* ------------------------------------------------------------- *
* *
* *****************************************************************/
.text
.globl jump_fcontext
.align 2
.type jump_fcontext,%function
jump_fcontext:
stmia a1, {v1-v8,sp-lr} @ save V1-V8,SP-LR
str lr, [a1,#40] @ save LR as PC
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
cmp a4, #0 @ test if fpu env should be preserved
beq 1f
mov a4, a1
add a4, #52
vstmia a4, {d8-d15} @ save S16-S31
mov a4, a2
add a4, #52
vldmia a4, {d8-d15} @ restore S16-S31
1:
#endif
mov a1, a3 @ use third arg as return value after jump
@ and as first arg in context function
ldmia a2, {v1-v8,sp-pc} @ restore v1-V8,SP-PC
.size jump_fcontext,.-jump_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
common/system/make_arm_aapcs_elf_gas.S
0 → 100644
View file @
697d95cc
/*
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
*/
/*******************************************************************
* *
* ------------------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | *
* ------------------------------------------------------------- *
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| 0x20| 0x24| *
* ------------------------------------------------------------- *
* | v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 | sp | lr | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 10 | | *
* ------------------------------------------------------------- *
* | 0x28| | *
* ------------------------------------------------------------- *
* | pc | | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 11 | 12 | | *
* ------------------------------------------------------------- *
* | 0x2c| 0x30| | *
* ------------------------------------------------------------- *
* | sp | size| | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | *
* ------------------------------------------------------------- *
* | 0x34| 0x38|0x3c| 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58 | *
* ------------------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | s24 | s25 | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 23 | 24 | 25 | 26 | 27 | 28 | | *
* ------------------------------------------------------------- *
* | 0x5c| 0x60| 0x64| 0x68| 0x6c| 0x70| | *
* ------------------------------------------------------------- *
* | s26 | s27 | s28 | s29 | s30 | s31 | | *
* ------------------------------------------------------------- *
* *
* *****************************************************************/
.text
.globl make_fcontext
.align 2
.type make_fcontext,%function
make_fcontext:
mov a4, a1 @ save address of context stack (base) A4
sub a1, a1, #116 @ reserve space for fcontext_t at top of context stack
@ shift address in A1 to lower 16 byte boundary
@ == pointer to fcontext_t and address of context stack
bic a1, a1, #15
str a4, [a1,#44] @ save address of context stack (base) in fcontext_t
str a2, [a1,#48] @ save context stack size in fcontext_t
str a3, [a1,#40] @ save address of context function in fcontext_t
str a1, [a1,#32] @ save address in A4 as stack pointer for context function
adr a2, finish @ compute abs address of label finish
str a2, [a1,#36] @ save address of finish as return address for context function
@ entered after context function returns
bx lr
finish:
@ SP points to same addras SP on entry of context function
mov a1, #0 @ exit code is zero
bl _exit@PLT @ exit application
.size make_fcontext,.-make_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
common/view/view.cpp
View file @
697d95cc
...
...
@@ -971,7 +971,7 @@ void VIEW::RecacheAllItems( bool aImmediately )
#ifdef __WXDEBUG__
prof_counter
totalRealTime
;
prof_start
(
&
totalRealTime
,
false
);
prof_start
(
&
totalRealTime
);
#endif
/* __WXDEBUG__ */
for
(
LAYER_MAP_ITER
i
=
m_layers
.
begin
();
i
!=
m_layers
.
end
();
++
i
)
...
...
@@ -992,7 +992,7 @@ void VIEW::RecacheAllItems( bool aImmediately )
prof_end
(
&
totalRealTime
);
wxLogDebug
(
wxT
(
"RecacheAllItems::immediately: %u %.1f ms"
),
aImmediately
,
(
double
)
totalRealTime
.
value
/
1000.0
);
aImmediately
,
totalRealTime
.
msecs
()
);
#endif
/* __WXDEBUG__ */
}
...
...
include/profile.h
View file @
697d95cc
...
...
@@ -31,60 +31,9 @@
#define __TPROFILE_H
#include <sys/time.h>
#include <string>
#include <stdint.h>
/**
* Function rdtsc
* Returns processor's time-stamp counter. Main purpose is precise time measuring of code
* execution time.
* @return unsigned long long - Value of time-stamp counter.
*/
#if defined(__i386__)
static
__inline__
unsigned
long
long
rdtsc
()
{
unsigned
long
long
int
x
;
__asm__
volatile
(
".byte 0x0f, 0x31"
:
"=A"
(
x
)
);
return
x
;
}
#elif defined(__x86_64__)
static
__inline__
unsigned
long
long
rdtsc
()
{
unsigned
hi
,
lo
;
__asm__
__volatile__
(
"rdtsc"
:
"=a"
(
lo
),
"=d"
(
hi
)
);
return
(
(
unsigned
long
long
)
lo
)
|
(
(
(
unsigned
long
long
)
hi
)
<<
32
);
}
#elif defined(__powerpc__)
static
__inline__
unsigned
long
long
rdtsc
()
{
unsigned
long
long
int
result
=
0
;
unsigned
long
int
upper
,
lower
,
tmp
;
__asm__
volatile
(
"0:
\n
"
"
\t
mftbu %0
\n
"
"
\t
mftb %1
\n
"
"
\t
mftbu %2
\n
"
"
\t
cmpw %2,%0
\n
"
"
\t
bne 0b
\n
"
:
"=r"
(
upper
),
"=r"
(
lower
),
"=r"
(
tmp
)
);
result
=
upper
;
result
=
result
<<
32
;
result
=
result
|
lower
;
return
result
;
}
#endif
/* __powerpc__ */
// Fixme: OS X version
/**
* Function get_tics
* Returns the number of microseconds that have elapsed since the system was started.
...
...
@@ -98,14 +47,22 @@ static inline uint64_t get_tics()
return
(
uint64_t
)
tv
.
tv_sec
*
1000000ULL
+
(
uint64_t
)
tv
.
tv_usec
;
}
/**
* Structure for storing data related to profiling counters.
*/
struct
prof_counter
{
uint64_t
value
;
/// Stored timer value
bool
use_rdtsc
;
/// Method of time measuring (rdtsc or tics)
uint64_t
start
,
end
;
// Stored timer value
uint64_t
usecs
()
const
{
return
end
-
start
;
}
float
msecs
()
const
{
return
(
end
-
start
)
/
1000
.
0
;
}
};
/**
...
...
@@ -116,32 +73,19 @@ struct prof_counter
* Otherwise is system tics method will be used. IMPORTANT: time-stamp counter should not
* be used on multicore machines executing threaded code.
*/
static
inline
void
prof_start
(
prof_counter
*
cnt
,
bool
use_rdtsc
)
static
inline
void
prof_start
(
prof_counter
*
aCnt
)
{
cnt
->
use_rdtsc
=
use_rdtsc
;
if
(
use_rdtsc
)
{
cnt
->
value
=
rdtsc
();
}
else
{
cnt
->
value
=
get_tics
();
}
aCnt
->
start
=
get_tics
();
}
/**
* Function prof_stop
* Ends code execution time counting for a given profiling counter.
* @param cnt is the counter which should be stopped.
*/
static
inline
void
prof_end
(
prof_counter
*
c
nt
)
static
inline
void
prof_end
(
prof_counter
*
aC
nt
)
{
if
(
cnt
->
use_rdtsc
)
cnt
->
value
=
rdtsc
()
-
cnt
->
value
;
else
cnt
->
value
=
get_tics
()
-
cnt
->
value
;
aCnt
->
end
=
get_tics
();
}
#endif
pcbnew/router/pns_shove.cpp
View file @
697d95cc
...
...
@@ -343,11 +343,11 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
PNS_LINE
*
currentLine
=
lineStack
.
top
();
prof_start
(
&
totalRealTime
,
false
);
prof_start
(
&
totalRealTime
);
nearest
=
node
->
NearestObstacle
(
currentLine
,
PNS_ITEM
::
ANY
);
prof_end
(
&
totalRealTime
);
TRACE
(
2
,
"t-nearestObstacle %lld us"
,
(
totalRealTime
.
value
)
);
TRACE
(
2
,
"t-nearestObstacle %lld us"
,
totalRealTime
.
usecs
(
)
);
if
(
!
nearest
)
{
...
...
@@ -362,7 +362,7 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
TRACE
(
1
,
"Iter %d optimize-line [range %d-%d, total %d]"
,
iter
%
r_start
%
r_end
%
original
->
GetCLine
().
PointCount
()
);
// lastWalkSolid = NULL;
prof_start
(
&
totalRealTime
,
false
);
prof_start
(
&
totalRealTime
);
if
(
optimizer
.
Optimize
(
original
,
&
optimized
)
)
{
...
...
@@ -376,7 +376,7 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
prof_end
(
&
totalRealTime
);
TRACE
(
2
,
"t-optimizeObstacle %lld us"
,
(
totalRealTime
.
value
)
);
TRACE
(
2
,
"t-optimizeObstacle %lld us"
,
totalRealTime
.
usecs
(
)
);
}
lineStack
.
pop
();
...
...
@@ -393,12 +393,12 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
PNS_LINE
*
collidingLine
=
node
->
AssembleLine
(
pseg
);
PNS_LINE
*
shovedLine
=
collidingLine
->
CloneProperties
();
prof_start
(
&
totalRealTime
,
false
);
prof_start
(
&
totalRealTime
);
ShoveStatus
st
=
shoveSingleLine
(
node
,
currentLine
,
collidingLine
,
*
pseg
,
shovedLine
);
prof_end
(
&
totalRealTime
);
TRACE
(
2
,
"t-shoveSingle %lld us"
,
(
totalRealTime
.
value
)
);
TRACE
(
2
,
"t-shoveSingle %lld us"
,
totalRealTime
.
usecs
(
)
);
if
(
st
==
SH_OK
)
{
...
...
@@ -441,11 +441,11 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
walkaround
.
SetSolidsOnly
(
true
);
walkaround
.
SetSingleDirection
(
true
);
prof_start
(
&
totalRealTime
,
false
);
prof_start
(
&
totalRealTime
);
walkaround
.
Route
(
*
currentLine
,
*
walkaroundLine
,
false
);
prof_end
(
&
totalRealTime
);
TRACE
(
2
,
"t-walkSolid %lld us"
,
(
totalRealTime
.
value
)
);
TRACE
(
2
,
"t-walkSolid %lld us"
,
totalRealTime
.
usecs
(
)
);
node
->
Replace
(
currentLine
,
walkaroundLine
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment