Skip to content

Commit 736b682

Browse files
rmalmainaurelf
authored andcommitted
Added symbolic handling for movcond.
Added helper for 10 and 11 arguments. Updated test cases.
1 parent bbd9bff commit 736b682

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+210
-25
lines changed

accel/tcg/tcg-runtime-sym.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,77 @@ void *HELPER(sym_setcond_i64)(CPUArchState *env,
592592
env, arg1, arg1_expr, arg2, arg2_expr, comparison_operator, is_taken, 64);
593593
}
594594

595+
static void *sym_movcond_internal(CPUArchState *env,
596+
uint64_t c1, void *c1_expr,
597+
uint64_t c2, void *c2_expr,
598+
uint64_t v1, void *v1_expr,
599+
uint64_t v2, void *v2_expr,
600+
int32_t comparison_operator,
601+
uint64_t is_taken, uint8_t result_bits)
602+
{
603+
if (c1_expr == NULL && c2_expr == NULL && v1_expr == NULL && v2_expr == NULL) {
604+
return NULL;
605+
}
606+
607+
if (c1_expr == NULL) {
608+
c1_expr = _sym_build_integer(c1, _sym_bits_helper(c2_expr));
609+
}
610+
611+
if (c2_expr == NULL) {
612+
c2_expr = _sym_build_integer(c2, _sym_bits_helper(c1_expr));
613+
}
614+
615+
if (v1_expr == NULL) {
616+
v1_expr = _sym_build_integer(v1, _sym_bits_helper(c1_expr));
617+
}
618+
619+
if (v2_expr == NULL) {
620+
v2_expr = _sym_build_integer(v2, _sym_bits_helper(c1_expr));
621+
}
622+
623+
assert(_sym_bits_helper(c1_expr) == result_bits);
624+
assert(_sym_bits_helper(c2_expr) == result_bits);
625+
assert(_sym_bits_helper(v1_expr) == result_bits);
626+
assert(_sym_bits_helper(v2_expr) == result_bits);
627+
628+
void *condition_symbol = build_and_push_path_constraint(env, c1_expr, c2_expr, comparison_operator, is_taken);
629+
630+
void *condition_ext = _sym_build_sext(_sym_build_bool_to_bit(condition_symbol),
631+
result_bits - 1);
632+
633+
assert(_sym_bits_helper(condition_ext) == result_bits);
634+
635+
void *v1_masked = _sym_build_and(v1_expr, condition_ext);
636+
void *v2_masked = _sym_build_and(v2_expr, condition_ext);
637+
638+
return _sym_build_xor(v1_masked, v2_masked);
639+
}
640+
641+
void *HELPER(sym_movcond_i32)(CPUArchState *env,
642+
uint32_t c1, void *c1_expr,
643+
uint32_t c2, void *c2_expr,
644+
uint32_t v1, void *v1_expr,
645+
uint32_t v2, void *v2_expr,
646+
int32_t comparison_operator,
647+
uint32_t is_taken)
648+
{
649+
return sym_movcond_internal(
650+
env, c1, c1_expr, c2, c2_expr,v1, v1_expr, v2, v2_expr, comparison_operator, is_taken, 32);
651+
}
652+
653+
void *HELPER(sym_movcond_i64)(CPUArchState *env,
654+
uint64_t c1, void *c1_expr,
655+
uint64_t c2, void *c2_expr,
656+
uint64_t v1, void *v1_expr,
657+
uint64_t v2, void *v2_expr,
658+
int32_t comparison_operator,
659+
uint64_t is_taken)
660+
{
661+
return sym_movcond_internal(
662+
env, c1, c1_expr, c2, c2_expr,v1, v1_expr, v2, v2_expr, comparison_operator, is_taken, 64);
663+
}
664+
665+
595666
void HELPER(sym_notify_call)(uint64_t return_address)
596667
{
597668
_sym_notify_call(return_address);

accel/tcg/tcg-runtime-sym.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ DEF_HELPER_FLAGS_6(sym_deposit_i64, TCG_CALL_NO_RWG_SE, ptr, i64, ptr, i64, ptr,
114114
/* Conditionals */
115115
DEF_HELPER_FLAGS_7(sym_setcond_i32, TCG_CALL_NO_RWG, ptr, env, i32, ptr, i32, ptr, s32, i32)
116116
DEF_HELPER_FLAGS_7(sym_setcond_i64, TCG_CALL_NO_RWG, ptr, env, i64, ptr, i64, ptr, s32, i64)
117+
DEF_HELPER_FLAGS_11(sym_movcond_i32, TCG_CALL_NO_RWG, ptr, env, i32, ptr, i32, ptr, i32, ptr, i32, ptr, s32, i32)
118+
DEF_HELPER_FLAGS_11(sym_movcond_i64, TCG_CALL_NO_RWG, ptr, env, i64, ptr, i64, ptr, i64, ptr, i64, ptr, s32, i64)
117119

118120
/* Context tracking */
119121
DEF_HELPER_FLAGS_1(sym_notify_call, TCG_CALL_NO_RWG, void, i64)

include/exec/helper-gen.h.inc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,38 @@ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
118118
dh_arg(t7, 7), dh_arg(t8, 8), dh_arg(t9, 9)); \
119119
}
120120

121+
#define DEF_HELPER_FLAGS_10(name, flags, ret, t1, t2, t3, t4, t5, t6, t7, \
122+
t8, t9, t10) \
123+
extern TCGHelperInfo glue(helper_info_, name); \
124+
static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
125+
dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \
126+
dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6), \
127+
dh_arg_decl(t7, 7), dh_arg_decl(t8, 8), dh_arg_decl(t9, 9), \
128+
dh_arg_decl(t10, 10)) \
129+
{ \
130+
tcg_gen_call10(&glue(helper_info_, name), dh_retvar(ret), \
131+
dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \
132+
dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6), \
133+
dh_arg(t7, 7), dh_arg(t8, 8), dh_arg(t9, 9), \
134+
dh_arg(t10, 10)); \
135+
}
136+
137+
#define DEF_HELPER_FLAGS_11(name, flags, ret, t1, t2, t3, t4, t5, t6, t7, \
138+
t8, t9, t10, t11) \
139+
extern TCGHelperInfo glue(helper_info_, name); \
140+
static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
141+
dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \
142+
dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6), \
143+
dh_arg_decl(t7, 7), dh_arg_decl(t8, 8), dh_arg_decl(t9, 9), \
144+
dh_arg_decl(t10, 10), dh_arg_decl(t11, 11)) \
145+
{ \
146+
tcg_gen_call11(&glue(helper_info_, name), dh_retvar(ret), \
147+
dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \
148+
dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6), \
149+
dh_arg(t7, 7), dh_arg(t8, 8), dh_arg(t9, 9), \
150+
dh_arg(t10, 10), dh_arg(t11, 11)); \
151+
}
152+
121153
#include HELPER_H
122154

123155
#undef DEF_HELPER_FLAGS_0
@@ -130,3 +162,5 @@ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
130162
#undef DEF_HELPER_FLAGS_7
131163
#undef DEF_HELPER_FLAGS_8
132164
#undef DEF_HELPER_FLAGS_9
165+
#undef DEF_HELPER_FLAGS_10
166+
#undef DEF_HELPER_FLAGS_11

include/exec/helper-head.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
#define dh_typecode_f64 dh_typecode_i64
9797
#define dh_typecode_cptr dh_typecode_ptr
9898
#define dh_typecode_env dh_typecode_ptr
99-
#define dh_typecode(t) dh_typecode_##t
99+
#define dh_typecode(t) ((unsigned long long) dh_typecode_##t)
100100

101101
#define dh_callflag_i32 0
102102
#define dh_callflag_i64 0

include/exec/helper-info.c.inc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,30 @@
105105
| dh_typemask(T8, 8) | dh_typemask(T9, 9) \
106106
};
107107

108+
#define DEF_HELPER_FLAGS_10(NAME, FLAGS, RET, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) \
109+
TCGHelperInfo glue(helper_info_, NAME) = { \
110+
.func = HELPER(NAME), .name = str(NAME), \
111+
.flags = FLAGS | dh_callflag(RET), \
112+
.typemask = dh_typemask(RET, 0) | dh_typemask(T1, 1) \
113+
| dh_typemask(T2, 2) | dh_typemask(T3, 3) \
114+
| dh_typemask(T4, 4) | dh_typemask(T5, 5) \
115+
| dh_typemask(T6, 6) | dh_typemask(T7, 7) \
116+
| dh_typemask(T8, 8) | dh_typemask(T9, 9) \
117+
| dh_typemask(T10, 10) \
118+
};
119+
120+
#define DEF_HELPER_FLAGS_11(NAME, FLAGS, RET, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) \
121+
TCGHelperInfo glue(helper_info_, NAME) = { \
122+
.func = HELPER(NAME), .name = str(NAME), \
123+
.flags = FLAGS | dh_callflag(RET), \
124+
.typemask = dh_typemask(RET, 0) | dh_typemask(T1, 1) \
125+
| dh_typemask(T2, 2) | dh_typemask(T3, 3) \
126+
| dh_typemask(T4, 4) | dh_typemask(T5, 5) \
127+
| dh_typemask(T6, 6) | dh_typemask(T7, 7) \
128+
| dh_typemask(T8, 8) | dh_typemask(T9, 9) \
129+
| dh_typemask(T10, 10) | dh_typemask(T11, 11) \
130+
};
131+
108132

109133
#include HELPER_H
110134

@@ -119,3 +143,5 @@
119143
#undef DEF_HELPER_FLAGS_7
120144
#undef DEF_HELPER_FLAGS_8
121145
#undef DEF_HELPER_FLAGS_9
146+
#undef DEF_HELPER_FLAGS_10
147+
#undef DEF_HELPER_FLAGS_11

include/exec/helper-proto.h.inc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
6363
dh_ctype(t7), dh_ctype(t8), dh_ctype(t9)) \
6464
DEF_HELPER_ATTR;
6565

66+
#define DEF_HELPER_FLAGS_10(name, flags, ret, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10) \
67+
dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
68+
dh_ctype(t4), dh_ctype(t5), dh_ctype(t6), \
69+
dh_ctype(t7), dh_ctype(t8), dh_ctype(t9), \
70+
dh_ctype(t10)) DEF_HELPER_ATTR;
71+
72+
#define DEF_HELPER_FLAGS_11(name, flags, ret, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) \
73+
dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
74+
dh_ctype(t4), dh_ctype(t5), dh_ctype(t6), \
75+
dh_ctype(t7), dh_ctype(t8), dh_ctype(t9), \
76+
dh_ctype(t10), dh_ctype(t11)) DEF_HELPER_ATTR;
77+
6678
#define IN_HELPER_PROTO
6779

6880
#include HELPER_H
@@ -79,4 +91,6 @@ dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
7991
#undef DEF_HELPER_FLAGS_7
8092
#undef DEF_HELPER_FLAGS_8
8193
#undef DEF_HELPER_FLAGS_9
94+
#undef DEF_HELPER_FLAGS_10
95+
#undef DEF_HELPER_FLAGS_11
8296
#undef DEF_HELPER_ATTR

include/tcg/helper-info.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct TCGHelperInfo {
5151
uintptr_t init;
5252
#endif
5353

54-
unsigned typemask : 32;
54+
unsigned long long typemask : 64;
5555
unsigned flags : 8;
5656
unsigned nr_in : 8;
5757
unsigned nr_out : 8;

include/tcg/tcg.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,10 @@ void tcg_gen_call8(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
918918
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *);
919919
void tcg_gen_call9(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
920920
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *);
921+
void tcg_gen_call10(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
922+
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *);
923+
void tcg_gen_call11(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
924+
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *);
921925

922926
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs);
923927
void tcg_op_remove(TCGContext *s, TCGOp *op);

tcg/tcg-op-ldst.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ void tcg_gen_qemu_st_i64_chk(TCGv_i64 val, TCGTemp *addr, TCGArg idx,
467467
* if (tcg_use_softmmu) {
468468
* return false;
469469
* }
470-
*
470+
*
471471
* /\*
472472
* * For user-only, two 64-bit operations may well be smaller than a call.
473473
* * Determine if that would be legal for the requested atomicity.

tcg/tcg-op.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,14 @@ void tcg_gen_movcond_i32(TCGCond cond, TCGv_i32 ret, TCGv_i32 c1,
13321332
tcg_temp_free_i64(c1_tmp);
13331333
tcg_temp_free_i64(c2_tmp);
13341334

1335+
gen_helper_sym_movcond_i32(
1336+
tcgv_i32_expr(ret), tcg_env,
1337+
c1, tcgv_i32_expr(c1),
1338+
c2, tcgv_i32_expr(c2),
1339+
v1, tcgv_i32_expr(v1),
1340+
v2, tcgv_i32_expr(v2),
1341+
tcg_constant_i32(cond),
1342+
ret);
13351343
tcg_gen_op6i_i32(INDEX_op_movcond_i32, ret, c1, c2, v1, v2, cond);
13361344
}
13371345
}
@@ -3313,6 +3321,14 @@ void tcg_gen_movcond_i64(TCGCond cond, TCGv_i64 ret, TCGv_i64 c1,
33133321
} else if (cond == TCG_COND_NEVER) {
33143322
tcg_gen_mov_i64(ret, v2);
33153323
} else if (TCG_TARGET_REG_BITS == 64) {
3324+
gen_helper_sym_movcond_i64(
3325+
tcgv_i64_expr(ret), tcg_env,
3326+
c1, tcgv_i64_expr(c1),
3327+
c2, tcgv_i64_expr(c2),
3328+
v1, tcgv_i64_expr(v1),
3329+
v2, tcgv_i64_expr(v2),
3330+
tcg_constant_i32(cond),
3331+
ret);
33163332
tcg_gen_op6i_i64(INDEX_op_movcond_i64, ret, c1, c2, v1, v2, cond);
33173333
} else {
33183334
TCGv_i32 t0 = tcg_temp_ebb_new_i32();

0 commit comments

Comments
 (0)