Revision d4b0d468 target-sparc/op_helper.c
b/target-sparc/op_helper.c | ||
---|---|---|
902 | 902 |
} |
903 | 903 |
#endif |
904 | 904 |
|
905 |
static inline uint32_t get_C_sub_icc(target_ulong src1, target_ulong src2) |
|
906 |
{ |
|
907 |
uint32_t ret = 0; |
|
908 |
|
|
909 |
if ((src1 & 0xffffffffULL) < (src2 & 0xffffffffULL)) |
|
910 |
ret |= PSR_CARRY; |
|
911 |
return ret; |
|
912 |
} |
|
913 |
|
|
914 |
static inline uint32_t get_V_sub_icc(target_ulong dst, target_ulong src1, |
|
915 |
target_ulong src2) |
|
916 |
{ |
|
917 |
uint32_t ret = 0; |
|
918 |
|
|
919 |
if (((src1 ^ src2) & (src1 ^ dst)) & (1ULL << 31)) |
|
920 |
ret |= PSR_OVF; |
|
921 |
return ret; |
|
922 |
} |
|
923 |
|
|
924 |
static uint32_t compute_all_sub(void) |
|
925 |
{ |
|
926 |
uint32_t ret; |
|
927 |
|
|
928 |
ret = get_NZ_icc(CC_DST); |
|
929 |
ret |= get_C_sub_icc(CC_SRC, CC_SRC2); |
|
930 |
ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); |
|
931 |
return ret; |
|
932 |
} |
|
933 |
|
|
934 |
static uint32_t compute_C_sub(void) |
|
935 |
{ |
|
936 |
return get_C_sub_icc(CC_SRC, CC_SRC2); |
|
937 |
} |
|
938 |
|
|
939 |
#ifdef TARGET_SPARC64 |
|
940 |
static inline uint32_t get_C_sub_xcc(target_ulong src1, target_ulong src2) |
|
941 |
{ |
|
942 |
uint32_t ret = 0; |
|
943 |
|
|
944 |
if (src1 < src2) |
|
945 |
ret |= PSR_CARRY; |
|
946 |
return ret; |
|
947 |
} |
|
948 |
|
|
949 |
static inline uint32_t get_V_sub_xcc(target_ulong dst, target_ulong src1, |
|
950 |
target_ulong src2) |
|
951 |
{ |
|
952 |
uint32_t ret = 0; |
|
953 |
|
|
954 |
if (((src1 ^ src2) & (src1 ^ dst)) & (1ULL << 63)) |
|
955 |
ret |= PSR_OVF; |
|
956 |
return ret; |
|
957 |
} |
|
958 |
|
|
959 |
static uint32_t compute_all_sub_xcc(void) |
|
960 |
{ |
|
961 |
uint32_t ret; |
|
962 |
|
|
963 |
ret = get_NZ_xcc(CC_DST); |
|
964 |
ret |= get_C_sub_xcc(CC_SRC, CC_SRC2); |
|
965 |
ret |= get_V_sub_xcc(CC_DST, CC_SRC, CC_SRC2); |
|
966 |
return ret; |
|
967 |
} |
|
968 |
|
|
969 |
static uint32_t compute_C_sub_xcc(void) |
|
970 |
{ |
|
971 |
return get_C_sub_xcc(CC_SRC, CC_SRC2); |
|
972 |
} |
|
973 |
#endif |
|
974 |
|
|
905 | 975 |
static uint32_t compute_all_logic(void) |
906 | 976 |
{ |
907 | 977 |
return get_NZ_icc(CC_DST); |
... | ... | |
929 | 999 |
[CC_OP_FLAGS] = { compute_all_flags, compute_C_flags }, |
930 | 1000 |
[CC_OP_ADD] = { compute_all_add, compute_C_add }, |
931 | 1001 |
[CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, |
1002 |
[CC_OP_SUB] = { compute_all_sub, compute_C_sub }, |
|
932 | 1003 |
[CC_OP_LOGIC] = { compute_all_logic, compute_C_logic }, |
933 | 1004 |
}; |
934 | 1005 |
|
... | ... | |
938 | 1009 |
[CC_OP_FLAGS] = { compute_all_flags_xcc, compute_C_flags_xcc }, |
939 | 1010 |
[CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc }, |
940 | 1011 |
[CC_OP_ADDX] = { compute_all_addx_xcc, compute_C_addx_xcc }, |
1012 |
[CC_OP_SUB] = { compute_all_sub_xcc, compute_C_sub_xcc }, |
|
941 | 1013 |
[CC_OP_LOGIC] = { compute_all_logic_xcc, compute_C_logic }, |
942 | 1014 |
}; |
943 | 1015 |
#endif |
Also available in: Unified diff