Revision 3670669c target-arm/op.c
b/target-arm/op.c | ||
---|---|---|
59 | 59 |
res = T0; \ |
60 | 60 |
} \ |
61 | 61 |
\ |
62 |
void OPPROTO op_ ## sbc ## l_T0_T1(void) \ |
|
63 |
{ \ |
|
64 |
res = T0 - T1 + env->CF - 1; \ |
|
65 |
} \ |
|
66 |
\ |
|
67 | 62 |
void OPPROTO op_ ## sbc ## l_T0_T1_cc(void) \ |
68 | 63 |
{ \ |
69 | 64 |
unsigned int src1; \ |
... | ... | |
754 | 749 |
FT0s = vfp_itos(PARAM1); |
755 | 750 |
} |
756 | 751 |
|
757 |
/* Copy the most significant bit of T0 to all bits of T1. */ |
|
758 |
void OPPROTO op_signbit_T1_T0(void) |
|
759 |
{ |
|
760 |
T1 = (int32_t)T0 >> 31; |
|
761 |
} |
|
762 |
|
|
763 | 752 |
void OPPROTO op_movl_cp_T0(void) |
764 | 753 |
{ |
765 | 754 |
helper_set_cp(env, PARAM1, T0); |
... | ... | |
1026 | 1015 |
|
1027 | 1016 |
#include "op_addsub.h" |
1028 | 1017 |
|
1029 |
void OPPROTO op_pkhtb_T0_T1(void) |
|
1030 |
{ |
|
1031 |
T0 = (T0 & 0xffff0000) | (T1 & 0xffff); |
|
1032 |
} |
|
1033 |
|
|
1034 |
void OPPROTO op_pkhbt_T0_T1(void) |
|
1035 |
{ |
|
1036 |
T0 = (T0 & 0xffff) | (T1 & 0xffff0000); |
|
1037 |
} |
|
1038 |
|
|
1039 |
void OPPROTO op_rev16_T0(void) |
|
1040 |
{ |
|
1041 |
T0 = ((T0 & 0xff000000) >> 8) |
|
1042 |
| ((T0 & 0x00ff0000) << 8) |
|
1043 |
| ((T0 & 0x0000ff00) >> 8) |
|
1044 |
| ((T0 & 0x000000ff) << 8); |
|
1045 |
} |
|
1046 |
|
|
1047 |
void OPPROTO op_revsh_T0(void) |
|
1048 |
{ |
|
1049 |
T0 = (int16_t)( ((T0 & 0x0000ff00) >> 8) |
|
1050 |
| ((T0 & 0x000000ff) << 8)); |
|
1051 |
} |
|
1052 |
|
|
1053 |
void OPPROTO op_rbit_T0(void) |
|
1054 |
{ |
|
1055 |
T0 = ((T0 & 0xff000000) >> 24) |
|
1056 |
| ((T0 & 0x00ff0000) >> 8) |
|
1057 |
| ((T0 & 0x0000ff00) << 8) |
|
1058 |
| ((T0 & 0x000000ff) << 24); |
|
1059 |
T0 = ((T0 & 0xf0f0f0f0) >> 4) |
|
1060 |
| ((T0 & 0x0f0f0f0f) << 4); |
|
1061 |
T0 = ((T0 & 0x88888888) >> 3) |
|
1062 |
| ((T0 & 0x44444444) >> 1) |
|
1063 |
| ((T0 & 0x22222222) << 1) |
|
1064 |
| ((T0 & 0x11111111) << 3); |
|
1065 |
} |
|
1066 |
|
|
1067 |
/* Dual 16-bit signed multiply. */ |
|
1068 |
void OPPROTO op_mul_dual_T0_T1(void) |
|
1069 |
{ |
|
1070 |
int32_t low; |
|
1071 |
int32_t high; |
|
1072 |
low = (int32_t)(int16_t)T0 * (int32_t)(int16_t)T1; |
|
1073 |
high = (((int32_t)T0) >> 16) * (((int32_t)T1) >> 16); |
|
1074 |
T0 = low; |
|
1075 |
T1 = high; |
|
1076 |
} |
|
1077 |
|
|
1078 | 1018 |
void OPPROTO op_sel_T0_T1(void) |
1079 | 1019 |
{ |
1080 | 1020 |
uint32_t mask; |
... | ... | |
1094 | 1034 |
FORCE_RET(); |
1095 | 1035 |
} |
1096 | 1036 |
|
1097 |
void OPPROTO op_roundqd_T0_T1(void) |
|
1098 |
{ |
|
1099 |
T0 = T1 + ((uint32_t)T0 >> 31); |
|
1100 |
} |
|
1101 |
|
|
1102 | 1037 |
/* Signed saturation. */ |
1103 | 1038 |
static inline uint32_t do_ssat(int32_t val, int shift) |
1104 | 1039 |
{ |
... | ... | |
1191 | 1126 |
T0 = sum; |
1192 | 1127 |
} |
1193 | 1128 |
|
1194 |
/* Thumb-2 instructions. */ |
|
1195 |
|
|
1196 |
/* Insert T1 into T0. Result goes in T1. */ |
|
1197 |
void OPPROTO op_bfi_T1_T0(void) |
|
1198 |
{ |
|
1199 |
int shift = PARAM1; |
|
1200 |
uint32_t mask = PARAM2; |
|
1201 |
uint32_t bits; |
|
1202 |
|
|
1203 |
bits = (T1 << shift) & mask; |
|
1204 |
T1 = (T0 & ~mask) | bits; |
|
1205 |
} |
|
1206 |
|
|
1207 |
/* Unsigned bitfield extract. */ |
|
1208 |
void OPPROTO op_ubfx_T1(void) |
|
1209 |
{ |
|
1210 |
uint32_t shift = PARAM1; |
|
1211 |
uint32_t mask = PARAM2; |
|
1212 |
|
|
1213 |
T1 >>= shift; |
|
1214 |
T1 &= mask; |
|
1215 |
} |
|
1216 |
|
|
1217 |
/* Signed bitfield extract. */ |
|
1218 |
void OPPROTO op_sbfx_T1(void) |
|
1219 |
{ |
|
1220 |
uint32_t shift = PARAM1; |
|
1221 |
uint32_t width = PARAM2; |
|
1222 |
int32_t val; |
|
1223 |
|
|
1224 |
val = T1 << (32 - (shift + width)); |
|
1225 |
T1 = val >> (32 - width); |
|
1226 |
} |
|
1227 |
|
|
1228 |
void OPPROTO op_sdivl_T0_T1(void) |
|
1229 |
{ |
|
1230 |
int32_t num; |
|
1231 |
int32_t den; |
|
1232 |
num = T0; |
|
1233 |
den = T1; |
|
1234 |
if (den == 0) |
|
1235 |
T0 = 0; |
|
1236 |
else |
|
1237 |
T0 = num / den; |
|
1238 |
FORCE_RET(); |
|
1239 |
} |
|
1240 |
|
|
1241 |
void OPPROTO op_udivl_T0_T1(void) |
|
1242 |
{ |
|
1243 |
uint32_t num; |
|
1244 |
uint32_t den; |
|
1245 |
num = T0; |
|
1246 |
den = T1; |
|
1247 |
if (den == 0) |
|
1248 |
T0 = 0; |
|
1249 |
else |
|
1250 |
T0 = num / den; |
|
1251 |
FORCE_RET(); |
|
1252 |
} |
|
1253 |
|
|
1254 | 1129 |
void OPPROTO op_movl_T1_r13_banked(void) |
1255 | 1130 |
{ |
1256 | 1131 |
T1 = helper_get_r13_banked(env, PARAM1); |
Also available in: Unified diff