Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
70d388f1
Commit
70d388f1
authored
Oct 24, 2006
by
Christian Würdig
Browse files
fixed some dependencies
fixed Div/Mod mapper
parent
31b42d94
Changes
1
Hide whitespace changes
Inline
Side-by-side
ir/be/ia32/ia32_intrinsics.c
View file @
70d388f1
...
...
@@ -132,12 +132,12 @@ static int map_Shl(ir_node *call, void *ctx) {
ir_node
*
l_res
,
*
h_res
;
/* h_res = SHLD a_h, a_l, cnt */
l
_res
=
new_rd_ia32_l_ShlD
(
dbg
,
irg
,
block
,
a_h
,
a_l
,
cnt
,
l_res_mode
);
h
_res
=
new_rd_ia32_l_ShlD
(
dbg
,
irg
,
block
,
a_h
,
a_l
,
cnt
,
l_res_mode
);
/* l_res = SHL a_l, cnt */
h
_res
=
new_rd_ia32_l_Shl
(
dbg
,
irg
,
block
,
a_l
,
cnt
,
h_res_mode
);
l
_res
=
new_rd_ia32_l_Shl
(
dbg
,
irg
,
block
,
a_l
,
cnt
,
h_res_mode
);
add_irn_dep
(
h
_res
,
l
_res
);
add_irn_dep
(
l
_res
,
h
_res
);
resolve_call
(
call
,
l_res
,
h_res
,
irg
,
block
);
return
1
;
...
...
@@ -311,10 +311,15 @@ static int map_Abs(ir_node *call, void *ctx) {
return
1
;
}
typedef
enum
{
IA32_INTRINSIC_DIV
,
IA32_INTRINSIC_MOD
,
}
ia32_intrinsic_divmod_t
;
/**
* Maps a Div/Mod (a_l, a_h, b_l, b_h)
*/
static
int
DivMod_mapper
(
ir_node
*
call
,
void
*
ctx
,
i
nt
need_mod
)
{
static
int
DivMod_mapper
(
ir_node
*
call
,
void
*
ctx
,
i
a32_intrinsic_divmod_t
dmtp
)
{
ia32_intrinsic_env_t
*
env
=
ctx
;
ir_graph
*
irg
=
current_ir_graph
;
dbg_info
*
dbg
=
get_irn_dbg_info
(
call
);
...
...
@@ -405,13 +410,15 @@ static int DivMod_mapper(ir_node *call, void *ctx, int need_mod) {
mem
=
new_r_Sync
(
irg
,
block
,
2
,
op_mem
);
/* perform division */
fres
=
new_rd_ia32_l_vfdiv
(
dbg
,
irg
,
block
,
fa
,
fb
,
mode_D
);
if
(
need_mod
)
{
/* we need modulo: mod = a - b * res */
fres
=
new_rd_ia32_l_vfmul
(
dbg
,
irg
,
block
,
fb
,
fres
,
mode_D
);
fres
=
new_rd_ia32_l_vfsub
(
dbg
,
irg
,
block
,
fa
,
fres
,
mode_D
);
switch
(
dmtp
)
{
case
IA32_INTRINSIC_DIV
:
fres
=
new_rd_ia32_l_vfdiv
(
dbg
,
irg
,
block
,
fa
,
fb
,
mode_D
);
break
;
case
IA32_INTRINSIC_MOD
:
fres
=
new_rd_ia32_l_vfprem
(
dbg
,
irg
,
block
,
fa
,
fb
,
mode_D
);
break
;
default:
assert
(
0
);
}
/* store back result, we use ent_a here */
...
...
@@ -443,11 +450,11 @@ static int DivMod_mapper(ir_node *call, void *ctx, int need_mod) {
}
static
int
map_Div
(
ir_node
*
call
,
void
*
ctx
)
{
return
DivMod_mapper
(
call
,
ctx
,
0
);
return
DivMod_mapper
(
call
,
ctx
,
IA32_INTRINSIC_DIV
);
}
static
int
map_Mod
(
ir_node
*
call
,
void
*
ctx
)
{
return
DivMod_mapper
(
call
,
ctx
,
1
);
return
DivMod_mapper
(
call
,
ctx
,
IA32_INTRINSIC_MOD
);
}
/**
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new 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