Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
aa83491d
Commit
aa83491d
authored
Apr 19, 2008
by
Michael Beck
Browse files
- added alignment_label_max_skip
[r19338]
parent
964aebaa
Changes
3
Hide whitespace changes
Inline
Side-by-side
ir/be/ia32/ia32_architecture.c
View file @
aa83491d
...
...
@@ -41,7 +41,7 @@ ia32_code_gen_config_t ia32_cg_config;
* CPU architectures and features.
*/
enum
cpu_arch_features
{
arch_generic
=
0x00000001
,
/**< no specific architecture */
arch_generic
32
=
0x00000001
,
/**< no specific architecture */
arch_i386
=
0x00000002
,
/**< i386 architecture */
arch_i486
=
0x00000004
,
/**< i486 architecture */
...
...
@@ -80,7 +80,7 @@ enum cpu_arch_features {
* CPU's.
*/
enum
cpu_support
{
cpu_generic
=
arch_generic
,
cpu_generic
=
arch_generic
32
,
/* intel CPU's */
cpu_i386
=
arch_i386
,
...
...
@@ -205,13 +205,14 @@ static const lc_opt_table_entry_t ia32_architecture_options[] = {
};
typedef
struct
insn_const
{
int
add_cost
;
/**< cost of an add instruction */
int
lea_cost
;
/**< cost of a lea instruction */
int
const_shf_cost
;
/**< cost of a constant shift instruction */
int
cost_mul_start
;
/**< starting cost of a multiply instruction */
int
cost_mul_bit
;
/**< cost of multiply for every set bit */
unsigned
function_alignment
;
/**< logarithm for alignment of function labels */
unsigned
label_alignment
;
/**< logarithm for alignment of loops labels */
int
add_cost
;
/**< cost of an add instruction */
int
lea_cost
;
/**< cost of a lea instruction */
int
const_shf_cost
;
/**< cost of a constant shift instruction */
int
cost_mul_start
;
/**< starting cost of a multiply instruction */
int
cost_mul_bit
;
/**< cost of multiply for every set bit */
unsigned
function_alignment
;
/**< logarithm for alignment of function labels */
unsigned
label_alignment
;
/**< logarithm for alignment of loops labels */
unsigned
label_alignment_max_skip
;
/**< maximum skip for alignment of loops labels */
}
insn_const
;
/* costs for the i386 */
...
...
@@ -223,6 +224,7 @@ static const insn_const i386_cost = {
1
,
/* cost of multiply for every set bit */
2
,
/* logarithm for alignment of function labels */
2
,
/* logarithm for alignment of loops labels */
3
,
/* maximum skip for alignment of loops labels */
};
/* costs for the i486 */
...
...
@@ -234,6 +236,7 @@ static const insn_const i486_cost = {
1
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
15
,
/* maximum skip for alignment of loops labels */
};
/* costs for the Pentium */
...
...
@@ -245,6 +248,7 @@ static const insn_const pentium_cost = {
0
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
7
,
/* maximum skip for alignment of loops labels */
};
/* costs for the Pentium Pro */
...
...
@@ -256,6 +260,7 @@ static const insn_const pentiumpro_cost = {
0
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
10
,
/* maximum skip for alignment of loops labels */
};
/* costs for the K6 */
...
...
@@ -267,6 +272,7 @@ static const insn_const k6_cost = {
0
,
/* cost of multiply for every set bit */
5
,
/* logarithm for alignment of function labels */
5
,
/* logarithm for alignment of loops labels */
7
,
/* maximum skip for alignment of loops labels */
};
/* costs for the Geode */
...
...
@@ -278,6 +284,7 @@ static const insn_const geode_cost = {
0
,
/* cost of multiply for every set bit */
0
,
/* logarithm for alignment of function labels */
0
,
/* logarithm for alignment of loops labels */
0
,
/* maximum skip for alignment of loops labels */
};
/* costs for the Athlon */
...
...
@@ -289,6 +296,7 @@ static const insn_const athlon_cost = {
0
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
7
,
/* maximum skip for alignment of loops labels */
};
/* costs for the Opteron/K8/K10 */
...
...
@@ -300,6 +308,7 @@ static const insn_const k8_cost = {
0
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
7
,
/* maximum skip for alignment of loops labels */
};
/* costs for the K10 */
...
...
@@ -311,6 +320,7 @@ static const insn_const k10_cost = {
0
,
/* cost of multiply for every set bit */
5
,
/* logarithm for alignment of function labels */
5
,
/* logarithm for alignment of loops labels */
7
,
/* maximum skip for alignment of loops labels */
};
/* costs for the Pentium 4 */
...
...
@@ -322,6 +332,7 @@ static const insn_const netburst_cost = {
0
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
7
,
/* maximum skip for alignment of loops labels */
};
/* costs for the Nocona and Core */
...
...
@@ -333,6 +344,7 @@ static const insn_const nocona_cost = {
0
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
7
,
/* maximum skip for alignment of loops labels */
};
/* costs for the Core2 */
...
...
@@ -344,10 +356,11 @@ static const insn_const core2_cost = {
0
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
10
,
/* maximum skip for alignment of loops labels */
};
/* costs for the generic */
static
const
insn_const
generic_cost
=
{
/* costs for the generic
32
*/
static
const
insn_const
generic
32
_cost
=
{
1
,
/* cost of an add instruction */
2
,
/* cost of a lea instruction */
1
,
/* cost of a constant shift instruction */
...
...
@@ -355,9 +368,10 @@ static const insn_const generic_cost = {
0
,
/* cost of multiply for every set bit */
4
,
/* logarithm for alignment of function labels */
4
,
/* logarithm for alignment of loops labels */
7
,
/* maximum skip for alignment of loops labels */
};
static
const
insn_const
*
arch_costs
=
&
generic_cost
;
static
const
insn_const
*
arch_costs
=
&
generic
32
_cost
;
static
void
set_arch_costs
(
void
)
{
...
...
@@ -398,9 +412,9 @@ static void set_arch_costs(void)
case
arch_k10
:
arch_costs
=
&
k10_cost
;
break
;
case
0
:
case
arch_generic32
:
default:
arch_costs
=
&
generic_cost
;
arch_costs
=
&
generic
32
_cost
;
}
}
...
...
@@ -459,24 +473,25 @@ void ia32_setup_cg_config(void)
ia32_cg_config
.
use_fucomi
=
FLAGS
(
arch
,
arch_feature_p6_insn
);
ia32_cg_config
.
use_cmov
=
FLAGS
(
arch
,
arch_feature_p6_insn
);
ia32_cg_config
.
use_modeD_moves
=
FLAGS
(
opt_arch
,
arch_athlon_plus
|
arch_geode
|
arch_ppro
|
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
);
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
32
);
ia32_cg_config
.
use_add_esp_4
=
FLAGS
(
opt_arch
,
arch_geode
|
arch_athlon_plus
|
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
);
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
32
);
ia32_cg_config
.
use_add_esp_8
=
FLAGS
(
opt_arch
,
arch_geode
|
arch_athlon_plus
|
arch_i386
|
arch_i486
|
arch_ppro
|
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
);
arch_nocona
|
arch_core2
|
arch_generic
32
);
ia32_cg_config
.
use_sub_esp_4
=
FLAGS
(
opt_arch
,
arch_athlon_plus
|
arch_ppro
|
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
);
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
32
);
ia32_cg_config
.
use_sub_esp_8
=
FLAGS
(
opt_arch
,
arch_athlon_plus
|
arch_i386
|
arch_i486
|
arch_ppro
|
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
);
arch_ppro
|
arch_netburst
|
arch_nocona
|
arch_core2
|
arch_generic
32
);
ia32_cg_config
.
use_imul_mem_imm32
=
!
FLAGS
(
opt_arch
,
arch_k8
|
arch_k10
);
ia32_cg_config
.
use_mov_0
=
FLAGS
(
opt_arch
,
arch_k6
);
ia32_cg_config
.
use_pad_return
=
FLAGS
(
opt_arch
,
arch_athlon_plus
|
cpu_core2
|
arch_generic
);
ia32_cg_config
.
use_pad_return
=
FLAGS
(
opt_arch
,
arch_athlon_plus
|
cpu_core2
|
arch_generic
32
);
ia32_cg_config
.
optimize_cc
=
opt_cc
;
ia32_cg_config
.
use_unsafe_floatconv
=
opt_unsafe_floatconv
;
ia32_cg_config
.
function_alignment
=
arch_costs
->
function_alignment
;
ia32_cg_config
.
label_alignment
=
arch_costs
->
label_alignment
;
ia32_cg_config
.
function_alignment
=
arch_costs
->
function_alignment
;
ia32_cg_config
.
label_alignment
=
arch_costs
->
label_alignment
;
ia32_cg_config
.
label_alignment_max_skip
=
arch_costs
->
label_alignment_max_skip
;
if
(
opt_arch
&
(
arch_i386
|
arch_i486
))
{
ia32_cg_config
.
label_alignment_factor
=
0
;
...
...
ir/be/ia32/ia32_architecture.h
View file @
aa83491d
...
...
@@ -74,6 +74,8 @@ typedef struct {
unsigned
function_alignment
;
/** alignment for labels (which are expected to be frequent jump targets) */
unsigned
label_alignment
;
/** maximum skip alignment for labels (which are expected to be frequent jump targets) */
unsigned
label_alignment_max_skip
;
/** if a blocks execfreq is factor higher than it's predecessor then align
* the blocks label (0 switches off label alignment) */
double
label_alignment_factor
;
...
...
ir/be/ia32/ia32_emitter.c
View file @
aa83491d
...
...
@@ -1933,12 +1933,12 @@ static void ia32_emit_alignment(unsigned align, unsigned skip)
static
void
ia32_emit_align_label
(
void
)
{
unsigned
align
=
ia32_cg_config
.
label_alignment
;
unsigned
maximum_skip
=
(
1
<<
align
)
-
1
;
unsigned
maximum_skip
=
ia32_cg_config
.
label_alignment_max_skip
;
ia32_emit_alignment
(
align
,
maximum_skip
);
}
/**
* Test wether a block should be aligned.
* Test w
h
ether a block should be aligned.
* For cpus in the P4/Athlon class it is useful to align jump labels to
* 16 bytes. However we should only do that if the alignment nops before the
* label aren't executed more often than we have jumps to the label.
...
...
Write
Preview
Supports
Markdown
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