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