Revision 19f329ad target-sparc/op.c
b/target-sparc/op.c | ||
---|---|---|
169 | 169 |
#include "fop_template.h" |
170 | 170 |
#endif |
171 | 171 |
|
172 |
#ifdef TARGET_SPARC64 |
|
173 |
#define XFLAG_SET(x) ((env->xcc&x)?1:0) |
|
174 |
#endif |
|
175 |
|
|
176 | 172 |
#define FLAG_SET(x) ((env->psr&x)?1:0) |
177 | 173 |
|
178 | 174 |
void OPPROTO op_add_T1_T0_cc(void) |
... | ... | |
857 | 853 |
} |
858 | 854 |
#endif |
859 | 855 |
|
860 |
void OPPROTO op_eval_ba(void) |
|
861 |
{ |
|
862 |
T2 = 1; |
|
863 |
} |
|
864 |
|
|
865 |
void OPPROTO op_eval_be(void) |
|
866 |
{ |
|
867 |
T2 = FLAG_SET(PSR_ZERO); |
|
868 |
} |
|
869 |
|
|
870 |
void OPPROTO op_eval_ble(void) |
|
871 |
{ |
|
872 |
target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF); |
|
873 |
|
|
874 |
T2 = Z | (N ^ V); |
|
875 |
} |
|
876 |
|
|
877 |
void OPPROTO op_eval_bl(void) |
|
878 |
{ |
|
879 |
target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF); |
|
880 |
|
|
881 |
T2 = N ^ V; |
|
882 |
} |
|
883 |
|
|
884 |
void OPPROTO op_eval_bleu(void) |
|
885 |
{ |
|
886 |
target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY); |
|
887 |
|
|
888 |
T2 = C | Z; |
|
889 |
} |
|
890 |
|
|
891 |
void OPPROTO op_eval_bcs(void) |
|
892 |
{ |
|
893 |
T2 = FLAG_SET(PSR_CARRY); |
|
894 |
} |
|
895 |
|
|
896 |
void OPPROTO op_eval_bvs(void) |
|
897 |
{ |
|
898 |
T2 = FLAG_SET(PSR_OVF); |
|
899 |
} |
|
900 |
|
|
901 |
void OPPROTO op_eval_bn(void) |
|
902 |
{ |
|
903 |
T2 = 0; |
|
904 |
} |
|
905 |
|
|
906 |
void OPPROTO op_eval_bneg(void) |
|
907 |
{ |
|
908 |
T2 = FLAG_SET(PSR_NEG); |
|
909 |
} |
|
910 |
|
|
911 |
void OPPROTO op_eval_bne(void) |
|
912 |
{ |
|
913 |
T2 = !FLAG_SET(PSR_ZERO); |
|
914 |
} |
|
915 |
|
|
916 |
void OPPROTO op_eval_bg(void) |
|
917 |
{ |
|
918 |
target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF); |
|
919 |
|
|
920 |
T2 = !(Z | (N ^ V)); |
|
921 |
} |
|
922 |
|
|
923 |
void OPPROTO op_eval_bge(void) |
|
924 |
{ |
|
925 |
target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF); |
|
926 |
|
|
927 |
T2 = !(N ^ V); |
|
928 |
} |
|
929 |
|
|
930 |
void OPPROTO op_eval_bgu(void) |
|
931 |
{ |
|
932 |
target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY); |
|
933 |
|
|
934 |
T2 = !(C | Z); |
|
935 |
} |
|
936 |
|
|
937 |
void OPPROTO op_eval_bcc(void) |
|
938 |
{ |
|
939 |
T2 = !FLAG_SET(PSR_CARRY); |
|
940 |
} |
|
941 |
|
|
942 |
void OPPROTO op_eval_bpos(void) |
|
943 |
{ |
|
944 |
T2 = !FLAG_SET(PSR_NEG); |
|
945 |
} |
|
946 |
|
|
947 |
void OPPROTO op_eval_bvc(void) |
|
948 |
{ |
|
949 |
T2 = !FLAG_SET(PSR_OVF); |
|
950 |
} |
|
951 |
|
|
952 |
#ifdef TARGET_SPARC64 |
|
953 |
void OPPROTO op_eval_xbe(void) |
|
954 |
{ |
|
955 |
T2 = XFLAG_SET(PSR_ZERO); |
|
956 |
} |
|
957 |
|
|
958 |
void OPPROTO op_eval_xble(void) |
|
959 |
{ |
|
960 |
target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF); |
|
961 |
|
|
962 |
T2 = Z | (N ^ V); |
|
963 |
} |
|
964 |
|
|
965 |
void OPPROTO op_eval_xbl(void) |
|
966 |
{ |
|
967 |
target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF); |
|
968 |
|
|
969 |
T2 = N ^ V; |
|
970 |
} |
|
971 |
|
|
972 |
void OPPROTO op_eval_xbleu(void) |
|
973 |
{ |
|
974 |
target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY); |
|
975 |
|
|
976 |
T2 = C | Z; |
|
977 |
} |
|
978 |
|
|
979 |
void OPPROTO op_eval_xbcs(void) |
|
980 |
{ |
|
981 |
T2 = XFLAG_SET(PSR_CARRY); |
|
982 |
} |
|
983 |
|
|
984 |
void OPPROTO op_eval_xbvs(void) |
|
985 |
{ |
|
986 |
T2 = XFLAG_SET(PSR_OVF); |
|
987 |
} |
|
988 |
|
|
989 |
void OPPROTO op_eval_xbneg(void) |
|
990 |
{ |
|
991 |
T2 = XFLAG_SET(PSR_NEG); |
|
992 |
} |
|
993 |
|
|
994 |
void OPPROTO op_eval_xbne(void) |
|
995 |
{ |
|
996 |
T2 = !XFLAG_SET(PSR_ZERO); |
|
997 |
} |
|
998 |
|
|
999 |
void OPPROTO op_eval_xbg(void) |
|
1000 |
{ |
|
1001 |
target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF); |
|
1002 |
|
|
1003 |
T2 = !(Z | (N ^ V)); |
|
1004 |
} |
|
1005 |
|
|
1006 |
void OPPROTO op_eval_xbge(void) |
|
1007 |
{ |
|
1008 |
target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF); |
|
1009 |
|
|
1010 |
T2 = !(N ^ V); |
|
1011 |
} |
|
1012 |
|
|
1013 |
void OPPROTO op_eval_xbgu(void) |
|
1014 |
{ |
|
1015 |
target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY); |
|
1016 |
|
|
1017 |
T2 = !(C | Z); |
|
1018 |
} |
|
1019 |
|
|
1020 |
void OPPROTO op_eval_xbcc(void) |
|
1021 |
{ |
|
1022 |
T2 = !XFLAG_SET(PSR_CARRY); |
|
1023 |
} |
|
1024 |
|
|
1025 |
void OPPROTO op_eval_xbpos(void) |
|
1026 |
{ |
|
1027 |
T2 = !XFLAG_SET(PSR_NEG); |
|
1028 |
} |
|
1029 |
|
|
1030 |
void OPPROTO op_eval_xbvc(void) |
|
1031 |
{ |
|
1032 |
T2 = !XFLAG_SET(PSR_OVF); |
|
1033 |
} |
|
1034 |
#endif |
|
1035 |
|
|
1036 |
#define FCC |
|
1037 |
#define FFLAG_SET(x) (env->fsr & x? 1: 0) |
|
1038 |
#include "fbranch_template.h" |
|
1039 |
|
|
1040 |
#ifdef TARGET_SPARC64 |
|
1041 |
#define FCC _fcc1 |
|
1042 |
#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 32))? 1: 0) |
|
1043 |
#include "fbranch_template.h" |
|
1044 |
#define FCC _fcc2 |
|
1045 |
#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 34))? 1: 0) |
|
1046 |
#include "fbranch_template.h" |
|
1047 |
#define FCC _fcc3 |
|
1048 |
#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 36))? 1: 0) |
|
1049 |
#include "fbranch_template.h" |
|
1050 |
#endif |
|
1051 |
|
|
1052 |
#ifdef TARGET_SPARC64 |
|
1053 |
void OPPROTO op_eval_brz(void) |
|
1054 |
{ |
|
1055 |
T2 = (T0 == 0); |
|
1056 |
} |
|
1057 |
|
|
1058 |
void OPPROTO op_eval_brnz(void) |
|
1059 |
{ |
|
1060 |
T2 = (T0 != 0); |
|
1061 |
} |
|
1062 |
|
|
1063 |
void OPPROTO op_eval_brlz(void) |
|
1064 |
{ |
|
1065 |
T2 = ((int64_t)T0 < 0); |
|
1066 |
} |
|
1067 |
|
|
1068 |
void OPPROTO op_eval_brlez(void) |
|
1069 |
{ |
|
1070 |
T2 = ((int64_t)T0 <= 0); |
|
1071 |
} |
|
1072 |
|
|
1073 |
void OPPROTO op_eval_brgz(void) |
|
1074 |
{ |
|
1075 |
T2 = ((int64_t)T0 > 0); |
|
1076 |
} |
|
1077 |
|
|
1078 |
void OPPROTO op_eval_brgez(void) |
|
1079 |
{ |
|
1080 |
T2 = ((int64_t)T0 >= 0); |
|
1081 |
} |
|
1082 |
#endif |
|
1083 |
|
|
1084 | 856 |
void OPPROTO op_jmp_label(void) |
1085 | 857 |
{ |
1086 | 858 |
GOTO_LABEL_PARAM(1); |
1087 | 859 |
} |
1088 | 860 |
|
1089 |
void OPPROTO op_jnz_T2_label(void) |
|
1090 |
{ |
|
1091 |
if (T2) |
|
1092 |
GOTO_LABEL_PARAM(1); |
|
1093 |
FORCE_RET(); |
|
1094 |
} |
|
1095 |
|
|
1096 |
void OPPROTO op_jz_T2_label(void) |
|
1097 |
{ |
|
1098 |
if (!T2) |
|
1099 |
GOTO_LABEL_PARAM(1); |
|
1100 |
FORCE_RET(); |
|
1101 |
} |
|
1102 |
|
|
1103 | 861 |
#define F_OP(name, p) void OPPROTO op_f##name##p(void) |
1104 | 862 |
|
1105 | 863 |
#if defined(CONFIG_USER_ONLY) |
... | ... | |
1310 | 1068 |
} |
1311 | 1069 |
#endif |
1312 | 1070 |
|
1313 |
void OPPROTO op_fmovs_cc(void) |
|
1314 |
{ |
|
1315 |
if (T2) |
|
1316 |
FT0 = FT1; |
|
1317 |
} |
|
1318 |
|
|
1319 |
void OPPROTO op_fmovd_cc(void) |
|
1320 |
{ |
|
1321 |
if (T2) |
|
1322 |
DT0 = DT1; |
|
1323 |
} |
|
1324 |
|
|
1325 |
#if defined(CONFIG_USER_ONLY) |
|
1326 |
void OPPROTO op_fmovq_cc(void) |
|
1327 |
{ |
|
1328 |
if (T2) |
|
1329 |
QT0 = QT1; |
|
1330 |
} |
|
1331 |
#endif |
|
1332 |
|
|
1333 | 1071 |
void OPPROTO op_flushw(void) |
1334 | 1072 |
{ |
1335 | 1073 |
if (env->cansave != NWINDOWS - 2) { |
Also available in: Unified diff