Skip to content

Commit c13d260

Browse files
committed
Adds trunc and sign_ext opcodes
1 parent 2d8053f commit c13d260

File tree

10 files changed

+242
-27
lines changed

10 files changed

+242
-27
lines changed

src/arm-codegen.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ void update_elf_offset(ph2_ir_t *ph2_ir)
119119
case OP_return:
120120
elf_offset += 24;
121121
return;
122+
case OP_trunc:
123+
elf_offset += 4;
124+
return;
125+
case OP_sign_ext:
126+
elf_offset += 4;
127+
return;
122128
default:
123129
printf("Unknown opcode\n");
124130
abort();
@@ -421,6 +427,22 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
421427
emit(__mov_i(__NE, rd, 0));
422428
emit(__mov_i(__EQ, rd, 1));
423429
return;
430+
case OP_trunc:
431+
if (rm == 1) {
432+
rm = 0xFF;
433+
} else if (rm == 4) {
434+
rm = 0xFFFFFFFF;
435+
} else {
436+
printf("Unsupported truncation operation with target size %d\n",
437+
rm);
438+
abort();
439+
}
440+
441+
emit(__and_i(__AL, rd, rn, rm));
442+
return;
443+
case OP_sign_ext:
444+
emit(__sxtb(__AL, rd, rn, 0));
445+
return;
424446
default:
425447
printf("Unknown opcode\n");
426448
abort();

src/arm.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,11 @@ int __sub_r(arm_cond_t cond, arm_reg rd, arm_reg rs, arm_reg ro)
251251
return __mov(cond, 0, arm_sub, 0, rs, rd, ro);
252252
}
253253

254+
int __and_i(arm_cond_t cond, arm_reg rd, arm_reg rs, int imm)
255+
{
256+
return __mov(cond, 1, arm_and, 0, rs, rd, imm);
257+
}
258+
254259
int __zero(int rd)
255260
{
256261
return __mov_i(__AL, rd, 0);
@@ -349,3 +354,14 @@ int __teq(arm_reg rd)
349354
{
350355
return __mov(__AL, 1, arm_teq, 1, rd, 0, 0);
351356
}
357+
358+
int __sxtb(arm_cond_t cond, arm_reg rd, arm_reg rm, int rotation)
359+
{
360+
if (rotation != 0 && rotation != 8 && rotation != 16 && rotation != 24) {
361+
printf("SXTB rotation must be 0, 8, 16, or 24\n");
362+
abort();
363+
}
364+
365+
return arm_encode(cond, 106, 0xF, rd,
366+
rm | ((rotation >> 3) << 10) | (0x7 << 4));
367+
}

src/defs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,10 @@ typedef enum {
248248
OP_bit_not,
249249
OP_negate,
250250

251+
/* data type conversion */
252+
OP_trunc,
253+
OP_sign_ext,
254+
251255
/* entry point of the state machine */
252256
OP_start
253257
} opcode_t;

src/globals.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,18 @@ hashmap_t *FUNC_MAP;
3939
hashmap_t *ALIASES_MAP;
4040
hashmap_t *CONSTANTS_MAP;
4141

42+
/* Types */
43+
4244
type_t *TYPES;
4345
int types_idx = 0;
4446

47+
type_t *TY_void;
48+
type_t *TY_char;
49+
type_t *TY_bool;
50+
type_t *TY_int;
51+
52+
/* Arenas */
53+
4554
arena_t *INSN_ARENA;
4655

4756
/* BLOCK_ARENA is responsible for block_t / var_t allocation */
@@ -1242,6 +1251,16 @@ void dump_bb_insn(func_t *func, basic_block_t *bb, bool *at_func_start)
12421251
printf("%%%s = lshift %%%s, %%%s", rd->var_name, rs1->var_name,
12431252
rs2->var_name);
12441253
break;
1254+
case OP_trunc:
1255+
print_indent(1);
1256+
printf("%%%s = trunc %%%s, %d", rd->var_name, rs1->var_name,
1257+
insn->sz);
1258+
break;
1259+
case OP_sign_ext:
1260+
print_indent(1);
1261+
printf("%%%s = sign_ext %%%s, %d", rd->var_name, rs1->var_name,
1262+
insn->sz);
1263+
break;
12451264
default:
12461265
printf("<Unsupported opcode: %d>", insn->opcode);
12471266
break;

0 commit comments

Comments
 (0)