Revision 4e273869
b/target-xtensa/helper.h | ||
---|---|---|
49 | 49 |
DEF_HELPER_3(itof, f32, env, i32, i32) |
50 | 50 |
DEF_HELPER_3(uitof, f32, env, i32, i32) |
51 | 51 |
|
52 |
DEF_HELPER_4(un_s, void, env, i32, f32, f32) |
|
53 |
DEF_HELPER_4(oeq_s, void, env, i32, f32, f32) |
|
54 |
DEF_HELPER_4(ueq_s, void, env, i32, f32, f32) |
|
55 |
DEF_HELPER_4(olt_s, void, env, i32, f32, f32) |
|
56 |
DEF_HELPER_4(ult_s, void, env, i32, f32, f32) |
|
57 |
DEF_HELPER_4(ole_s, void, env, i32, f32, f32) |
|
58 |
DEF_HELPER_4(ule_s, void, env, i32, f32, f32) |
|
59 |
|
|
52 | 60 |
#include "def-helper.h" |
b/target-xtensa/op_helper.c | ||
---|---|---|
858 | 858 |
return float32_scalbn(uint32_to_float32(v, &env->fp_status), |
859 | 859 |
(int32_t)scale, &env->fp_status); |
860 | 860 |
} |
861 |
|
|
862 |
static inline void set_br(CPUXtensaState *env, bool v, uint32_t br) |
|
863 |
{ |
|
864 |
if (v) { |
|
865 |
env->sregs[BR] |= br; |
|
866 |
} else { |
|
867 |
env->sregs[BR] &= ~br; |
|
868 |
} |
|
869 |
} |
|
870 |
|
|
871 |
void HELPER(un_s)(CPUXtensaState *env, uint32_t br, float32 a, float32 b) |
|
872 |
{ |
|
873 |
set_br(env, float32_unordered_quiet(a, b, &env->fp_status), br); |
|
874 |
} |
|
875 |
|
|
876 |
void HELPER(oeq_s)(CPUXtensaState *env, uint32_t br, float32 a, float32 b) |
|
877 |
{ |
|
878 |
set_br(env, float32_eq_quiet(a, b, &env->fp_status), br); |
|
879 |
} |
|
880 |
|
|
881 |
void HELPER(ueq_s)(CPUXtensaState *env, uint32_t br, float32 a, float32 b) |
|
882 |
{ |
|
883 |
int v = float32_compare_quiet(a, b, &env->fp_status); |
|
884 |
set_br(env, v == float_relation_equal || v == float_relation_unordered, br); |
|
885 |
} |
|
886 |
|
|
887 |
void HELPER(olt_s)(CPUXtensaState *env, uint32_t br, float32 a, float32 b) |
|
888 |
{ |
|
889 |
set_br(env, float32_lt_quiet(a, b, &env->fp_status), br); |
|
890 |
} |
|
891 |
|
|
892 |
void HELPER(ult_s)(CPUXtensaState *env, uint32_t br, float32 a, float32 b) |
|
893 |
{ |
|
894 |
int v = float32_compare_quiet(a, b, &env->fp_status); |
|
895 |
set_br(env, v == float_relation_less || v == float_relation_unordered, br); |
|
896 |
} |
|
897 |
|
|
898 |
void HELPER(ole_s)(CPUXtensaState *env, uint32_t br, float32 a, float32 b) |
|
899 |
{ |
|
900 |
set_br(env, float32_le_quiet(a, b, &env->fp_status), br); |
|
901 |
} |
|
902 |
|
|
903 |
void HELPER(ule_s)(CPUXtensaState *env, uint32_t br, float32 a, float32 b) |
|
904 |
{ |
|
905 |
int v = float32_compare_quiet(a, b, &env->fp_status); |
|
906 |
set_br(env, v != float_relation_greater, br); |
|
907 |
} |
b/target-xtensa/translate.c | ||
---|---|---|
2019 | 2019 |
|
2020 | 2020 |
case 11: /*FP1*/ |
2021 | 2021 |
HAS_OPTION(XTENSA_OPTION_FP_COPROCESSOR); |
2022 |
TBD(); |
|
2022 |
|
|
2023 |
#define gen_compare(rel, br, a, b) \ |
|
2024 |
do { \ |
|
2025 |
TCGv_i32 bit = tcg_const_i32(1 << br); \ |
|
2026 |
\ |
|
2027 |
gen_helper_##rel(cpu_env, bit, cpu_FR[a], cpu_FR[b]); \ |
|
2028 |
tcg_temp_free(bit); \ |
|
2029 |
} while (0) |
|
2030 |
|
|
2031 |
switch (OP2) { |
|
2032 |
case 1: /*UN.Sf*/ |
|
2033 |
gen_compare(un_s, RRR_R, RRR_S, RRR_T); |
|
2034 |
break; |
|
2035 |
|
|
2036 |
case 2: /*OEQ.Sf*/ |
|
2037 |
gen_compare(oeq_s, RRR_R, RRR_S, RRR_T); |
|
2038 |
break; |
|
2039 |
|
|
2040 |
case 3: /*UEQ.Sf*/ |
|
2041 |
gen_compare(ueq_s, RRR_R, RRR_S, RRR_T); |
|
2042 |
break; |
|
2043 |
|
|
2044 |
case 4: /*OLT.Sf*/ |
|
2045 |
gen_compare(olt_s, RRR_R, RRR_S, RRR_T); |
|
2046 |
break; |
|
2047 |
|
|
2048 |
case 5: /*ULT.Sf*/ |
|
2049 |
gen_compare(ult_s, RRR_R, RRR_S, RRR_T); |
|
2050 |
break; |
|
2051 |
|
|
2052 |
case 6: /*OLE.Sf*/ |
|
2053 |
gen_compare(ole_s, RRR_R, RRR_S, RRR_T); |
|
2054 |
break; |
|
2055 |
|
|
2056 |
case 7: /*ULE.Sf*/ |
|
2057 |
gen_compare(ule_s, RRR_R, RRR_S, RRR_T); |
|
2058 |
break; |
|
2059 |
|
|
2060 |
#undef gen_compare |
|
2061 |
|
|
2062 |
case 8: /*MOVEQZ.Sf*/ |
|
2063 |
case 9: /*MOVNEZ.Sf*/ |
|
2064 |
case 10: /*MOVLTZ.Sf*/ |
|
2065 |
case 11: /*MOVGEZ.Sf*/ |
|
2066 |
gen_window_check1(dc, RRR_T); |
|
2067 |
{ |
|
2068 |
static const TCGCond cond[] = { |
|
2069 |
TCG_COND_NE, |
|
2070 |
TCG_COND_EQ, |
|
2071 |
TCG_COND_GE, |
|
2072 |
TCG_COND_LT |
|
2073 |
}; |
|
2074 |
int label = gen_new_label(); |
|
2075 |
tcg_gen_brcondi_i32(cond[OP2 - 8], cpu_R[RRR_T], 0, label); |
|
2076 |
tcg_gen_mov_i32(cpu_FR[RRR_R], cpu_FR[RRR_S]); |
|
2077 |
gen_set_label(label); |
|
2078 |
} |
|
2079 |
break; |
|
2080 |
|
|
2081 |
case 12: /*MOVF.Sf*/ |
|
2082 |
case 13: /*MOVT.Sf*/ |
|
2083 |
HAS_OPTION(XTENSA_OPTION_BOOLEAN); |
|
2084 |
{ |
|
2085 |
int label = gen_new_label(); |
|
2086 |
TCGv_i32 tmp = tcg_temp_new_i32(); |
|
2087 |
|
|
2088 |
tcg_gen_andi_i32(tmp, cpu_SR[BR], 1 << RRR_T); |
|
2089 |
tcg_gen_brcondi_i32( |
|
2090 |
OP2 & 1 ? TCG_COND_EQ : TCG_COND_NE, |
|
2091 |
tmp, 0, label); |
|
2092 |
tcg_gen_mov_i32(cpu_FR[RRR_R], cpu_FR[RRR_S]); |
|
2093 |
gen_set_label(label); |
|
2094 |
tcg_temp_free(tmp); |
|
2095 |
} |
|
2096 |
break; |
|
2097 |
|
|
2098 |
default: /*reserved*/ |
|
2099 |
RESERVED(); |
|
2100 |
break; |
|
2101 |
} |
|
2023 | 2102 |
break; |
2024 | 2103 |
|
2025 | 2104 |
default: /*reserved*/ |
Also available in: Unified diff