Skip to content

Commit ae05336

Browse files
committed
Use as_type instead of handle_convert for PPC sign extensions
1 parent 4ee07ea commit ae05336

File tree

4 files changed

+35
-38
lines changed

4 files changed

+35
-38
lines changed

m2c/arch_ppc.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
as_sintish,
6262
as_u32,
6363
as_uintish,
64+
as_type,
6465
)
6566
from .evaluate import (
6667
add_imm,
@@ -1238,8 +1239,8 @@ def eval_fn(s: NodeState, a: InstrArgs) -> None:
12381239
)
12391240
),
12401241
"srawi": lambda a: handle_sra(a),
1241-
"extsb": lambda a: handle_convert(a.reg(1), Type.s8(), Type.intish()),
1242-
"extsh": lambda a: handle_convert(a.reg(1), Type.s16(), Type.intish()),
1242+
"extsb": lambda a: as_type(a.reg(1), Type.s8(), silent=False),
1243+
"extsh": lambda a: as_type(a.reg(1), Type.s16(), silent=False),
12431244
"cntlzw": lambda a: UnaryOp(op="CLZ", expr=a.reg(1), type=Type.intish()),
12441245
# Load Immediate
12451246
"li": lambda a: a.full_imm(1),

tests/end_to_end/gcc-division/mwcc-o4p-out.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@ void test_s8(s8 c) {
1212

1313
sp8 = c;
1414
foo((u32) ((s8) (u8) sp8 / 2));
15-
foo((s8) (u8) sp8 / 3);
16-
foo((s8) (u8) sp8 / 5);
17-
foo((s8) (u8) sp8 / 7);
18-
foo((s8) (u8) sp8 / 10);
19-
foo((s8) (u8) sp8 / 100);
20-
foo((s8) (u8) sp8 / 255);
21-
foo((s8) (u8) sp8 % 2);
22-
foo((s8) (u8) sp8 % 3);
23-
foo((s8) (u8) sp8 % 5);
24-
foo((s8) (u8) sp8 % 7);
25-
foo((s8) (u8) sp8 % 10);
26-
foo((s8) (u8) sp8 % 100);
27-
foo((s8) (u8) sp8 % 255);
15+
foo(sp8 / 3);
16+
foo(sp8 / 5);
17+
foo(sp8 / 7);
18+
foo(sp8 / 10);
19+
foo(sp8 / 100);
20+
foo(sp8 / 255);
21+
foo(sp8 % 2);
22+
foo(sp8 % 3);
23+
foo(sp8 % 5);
24+
foo(sp8 % 7);
25+
foo(sp8 % 10);
26+
foo(sp8 % 100);
27+
foo(sp8 % 255);
2828
}
2929

3030
void test_s16(s16 h) {

tests/end_to_end/gcc-division/mwcc27-o4p-out.c

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,24 @@ void test(u32 a) {
99

1010
void test_s8(s8 c) {
1111
s8 sp8;
12-
s8 temp_r0;
13-
s8 temp_r3;
14-
u32 temp_r3_2;
12+
u32 temp_r3;
1513

1614
sp8 = c;
17-
temp_r3 = (s8) (u8) sp8;
18-
foo((u32) ((s32) (((u32) temp_r3 >> 0x1FU) + temp_r3) >> 1));
19-
foo((s8) (u8) sp8 / 3);
20-
foo((s8) (u8) sp8 / 5);
21-
foo((s8) (u8) sp8 / 7);
22-
foo((s8) (u8) sp8 / 10);
23-
foo((s8) (u8) sp8 / 100);
24-
foo((s8) (u8) sp8 / 255);
25-
temp_r0 = (s8) (u8) sp8;
26-
temp_r3_2 = (u32) temp_r0 >> 0x1FU;
27-
foo(((temp_r0 & 1) ^ temp_r3_2) - temp_r3_2);
28-
foo((s8) (u8) sp8 % 3);
29-
foo((s8) (u8) sp8 % 5);
30-
foo((s8) (u8) sp8 % 7);
31-
foo((s8) (u8) sp8 % 10);
32-
foo((s8) (u8) sp8 % 100);
33-
foo((s8) (u8) sp8 % 255);
15+
foo((u32) ((s32) (((u32) (s8) (u8) sp8 >> 0x1FU) + (s8) (u8) sp8) >> 1));
16+
foo(sp8 / 3);
17+
foo(sp8 / 5);
18+
foo(sp8 / 7);
19+
foo(sp8 / 10);
20+
foo(sp8 / 100);
21+
foo(sp8 / 255);
22+
temp_r3 = (u32) (s8) (u8) sp8 >> 0x1FU;
23+
foo((((s8) (u8) sp8 & 1) ^ temp_r3) - temp_r3);
24+
foo(sp8 % 3);
25+
foo(sp8 % 5);
26+
foo(sp8 % 7);
27+
foo(sp8 % 10);
28+
foo(sp8 % 100);
29+
foo(sp8 % 255);
3430
}
3531

3632
void test_s16(s16 h) {

tests/end_to_end/signed-conversion/mwcc-o4p-out.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ void test(s8 arg0) {
55
s8 temp_r6;
66

77
temp_r5 = arg0 * 2;
8-
glob = (s32) (s8) arg0;
8+
glob = (s32) arg0;
99
temp_r6 = arg0 * 3;
10-
glob = (s32) (s8) temp_r5;
11-
glob = (s32) (s8) temp_r6;
10+
glob = (s32) temp_r5;
11+
glob = (s32) temp_r6;
1212
glob = (s32) (s16) arg0;
1313
glob = (s32) (s16) temp_r5;
1414
glob = (s32) (s16) temp_r6;

0 commit comments

Comments
 (0)