| ... |
... |
@@ -2904,6 +2904,8 @@ run_BCO: |
|
2904
|
2904
|
NEXT_INSTRUCTION; \
|
|
2905
|
2905
|
}
|
|
2906
|
2906
|
|
|
|
2907
|
+#define TYPE_IS_SIGNED(ty) ((ty)-1 < (ty)1)
|
|
|
2908
|
+
|
|
2907
|
2909
|
// op :: ty -> ty -> ty
|
|
2908
|
2910
|
#define SIZED_BIN_OP(op,ty) \
|
|
2909
|
2911
|
{ \
|
| ... |
... |
@@ -2911,8 +2913,12 @@ run_BCO: |
|
2911
|
2913
|
ty r = ((ty) ReadSpW64(0)) op ((ty) ReadSpW64(1)); \
|
|
2912
|
2914
|
Sp_addW64(1); \
|
|
2913
|
2915
|
SpW64(0) = (StgWord64) r; \
|
|
|
2916
|
+ } else if (TYPE_IS_SIGNED(ty)) { \
|
|
|
2917
|
+ ty r = ((StgInt)(ty)ReadSpW(0)) op ((StgInt)(ty)ReadSpW(1)); \
|
|
|
2918
|
+ Sp_addW(1); \
|
|
|
2919
|
+ SpW(0) = (StgWord) r; \
|
|
2914
|
2920
|
} else { \
|
|
2915
|
|
- ty r = ((ty) ReadSpW(0)) op ((ty) ReadSpW(1)); \
|
|
|
2921
|
+ ty r = ((StgWord)(ty)ReadSpW(0)) op ((StgWord)(ty)ReadSpW(1)); \
|
|
2916
|
2922
|
Sp_addW(1); \
|
|
2917
|
2923
|
SpW(0) = (StgWord) r; \
|
|
2918
|
2924
|
}; \
|
| ... |
... |
@@ -2949,12 +2955,12 @@ run_BCO: |
|
2949
|
2955
|
NEXT_INSTRUCTION; \
|
|
2950
|
2956
|
}
|
|
2951
|
2957
|
|
|
2952
|
|
- INSTRUCTION(bci_OP_ADD_64): SIZED_BIN_OP(+, StgInt64)
|
|
2953
|
|
- INSTRUCTION(bci_OP_SUB_64): SIZED_BIN_OP(-, StgInt64)
|
|
2954
|
|
- INSTRUCTION(bci_OP_AND_64): SIZED_BIN_OP(&, StgInt64)
|
|
2955
|
|
- INSTRUCTION(bci_OP_XOR_64): SIZED_BIN_OP(^, StgInt64)
|
|
2956
|
|
- INSTRUCTION(bci_OP_OR_64): SIZED_BIN_OP(|, StgInt64)
|
|
2957
|
|
- INSTRUCTION(bci_OP_MUL_64): SIZED_BIN_OP(*, StgInt64)
|
|
|
2958
|
+ INSTRUCTION(bci_OP_ADD_64): SIZED_BIN_OP(+, StgWord64)
|
|
|
2959
|
+ INSTRUCTION(bci_OP_SUB_64): SIZED_BIN_OP(-, StgWord64)
|
|
|
2960
|
+ INSTRUCTION(bci_OP_AND_64): SIZED_BIN_OP(&, StgWord64)
|
|
|
2961
|
+ INSTRUCTION(bci_OP_XOR_64): SIZED_BIN_OP(^, StgWord64)
|
|
|
2962
|
+ INSTRUCTION(bci_OP_OR_64): SIZED_BIN_OP(|, StgWord64)
|
|
|
2963
|
+ INSTRUCTION(bci_OP_MUL_64): SIZED_BIN_OP(*, StgWord64)
|
|
2958
|
2964
|
INSTRUCTION(bci_OP_SHL_64): SIZED_BIN_OP_TY_INT(<<, StgWord64)
|
|
2959
|
2965
|
INSTRUCTION(bci_OP_LSR_64): SIZED_BIN_OP_TY_INT(>>, StgWord64)
|
|
2960
|
2966
|
INSTRUCTION(bci_OP_ASR_64): SIZED_BIN_OP_TY_INT(>>, StgInt64)
|
| ... |
... |
@@ -2972,15 +2978,15 @@ run_BCO: |
|
2972
|
2978
|
INSTRUCTION(bci_OP_S_LE_64): SIZED_BIN_OP_TY_TY_INT(<=, StgInt64)
|
|
2973
|
2979
|
|
|
2974
|
2980
|
INSTRUCTION(bci_OP_NOT_64): UN_SIZED_OP(~, StgWord64)
|
|
2975
|
|
- INSTRUCTION(bci_OP_NEG_64): UN_SIZED_OP(-, StgInt64)
|
|
|
2981
|
+ INSTRUCTION(bci_OP_NEG_64): UN_SIZED_OP(-, StgWord64)
|
|
2976
|
2982
|
|
|
2977
|
2983
|
|
|
2978
|
|
- INSTRUCTION(bci_OP_ADD_32): SIZED_BIN_OP(+, StgInt32)
|
|
2979
|
|
- INSTRUCTION(bci_OP_SUB_32): SIZED_BIN_OP(-, StgInt32)
|
|
2980
|
|
- INSTRUCTION(bci_OP_AND_32): SIZED_BIN_OP(&, StgInt32)
|
|
2981
|
|
- INSTRUCTION(bci_OP_XOR_32): SIZED_BIN_OP(^, StgInt32)
|
|
2982
|
|
- INSTRUCTION(bci_OP_OR_32): SIZED_BIN_OP(|, StgInt32)
|
|
2983
|
|
- INSTRUCTION(bci_OP_MUL_32): SIZED_BIN_OP(*, StgInt32)
|
|
|
2984
|
+ INSTRUCTION(bci_OP_ADD_32): SIZED_BIN_OP(+, StgWord32)
|
|
|
2985
|
+ INSTRUCTION(bci_OP_SUB_32): SIZED_BIN_OP(-, StgWord32)
|
|
|
2986
|
+ INSTRUCTION(bci_OP_AND_32): SIZED_BIN_OP(&, StgWord32)
|
|
|
2987
|
+ INSTRUCTION(bci_OP_XOR_32): SIZED_BIN_OP(^, StgWord32)
|
|
|
2988
|
+ INSTRUCTION(bci_OP_OR_32): SIZED_BIN_OP(|, StgWord32)
|
|
|
2989
|
+ INSTRUCTION(bci_OP_MUL_32): SIZED_BIN_OP(*, StgWord32)
|
|
2984
|
2990
|
INSTRUCTION(bci_OP_SHL_32): SIZED_BIN_OP_TY_INT(<<, StgWord32)
|
|
2985
|
2991
|
INSTRUCTION(bci_OP_LSR_32): SIZED_BIN_OP_TY_INT(>>, StgWord32)
|
|
2986
|
2992
|
INSTRUCTION(bci_OP_ASR_32): SIZED_BIN_OP_TY_INT(>>, StgInt32)
|
| ... |
... |
@@ -2998,15 +3004,15 @@ run_BCO: |
|
2998
|
3004
|
INSTRUCTION(bci_OP_S_LE_32): SIZED_BIN_OP_TY_TY_INT(<=, StgInt32)
|
|
2999
|
3005
|
|
|
3000
|
3006
|
INSTRUCTION(bci_OP_NOT_32): UN_SIZED_OP(~, StgWord32)
|
|
3001
|
|
- INSTRUCTION(bci_OP_NEG_32): UN_SIZED_OP(-, StgInt32)
|
|
|
3007
|
+ INSTRUCTION(bci_OP_NEG_32): UN_SIZED_OP(-, StgWord32)
|
|
3002
|
3008
|
|
|
3003
|
3009
|
|
|
3004
|
|
- INSTRUCTION(bci_OP_ADD_16): SIZED_BIN_OP(+, StgInt16)
|
|
3005
|
|
- INSTRUCTION(bci_OP_SUB_16): SIZED_BIN_OP(-, StgInt16)
|
|
3006
|
|
- INSTRUCTION(bci_OP_AND_16): SIZED_BIN_OP(&, StgInt16)
|
|
3007
|
|
- INSTRUCTION(bci_OP_XOR_16): SIZED_BIN_OP(^, StgInt16)
|
|
3008
|
|
- INSTRUCTION(bci_OP_OR_16): SIZED_BIN_OP(|, StgInt16)
|
|
3009
|
|
- INSTRUCTION(bci_OP_MUL_16): SIZED_BIN_OP(*, StgInt16)
|
|
|
3010
|
+ INSTRUCTION(bci_OP_ADD_16): SIZED_BIN_OP(+, StgWord16)
|
|
|
3011
|
+ INSTRUCTION(bci_OP_SUB_16): SIZED_BIN_OP(-, StgWord16)
|
|
|
3012
|
+ INSTRUCTION(bci_OP_AND_16): SIZED_BIN_OP(&, StgWord16)
|
|
|
3013
|
+ INSTRUCTION(bci_OP_XOR_16): SIZED_BIN_OP(^, StgWord16)
|
|
|
3014
|
+ INSTRUCTION(bci_OP_OR_16): SIZED_BIN_OP(|, StgWord16)
|
|
|
3015
|
+ INSTRUCTION(bci_OP_MUL_16): SIZED_BIN_OP(*, StgWord16)
|
|
3010
|
3016
|
INSTRUCTION(bci_OP_SHL_16): SIZED_BIN_OP_TY_INT(<<, StgWord16)
|
|
3011
|
3017
|
INSTRUCTION(bci_OP_LSR_16): SIZED_BIN_OP_TY_INT(>>, StgWord16)
|
|
3012
|
3018
|
INSTRUCTION(bci_OP_ASR_16): SIZED_BIN_OP_TY_INT(>>, StgInt16)
|
| ... |
... |
@@ -3024,15 +3030,15 @@ run_BCO: |
|
3024
|
3030
|
INSTRUCTION(bci_OP_S_LE_16): SIZED_BIN_OP(<=, StgInt16)
|
|
3025
|
3031
|
|
|
3026
|
3032
|
INSTRUCTION(bci_OP_NOT_16): UN_SIZED_OP(~, StgWord16)
|
|
3027
|
|
- INSTRUCTION(bci_OP_NEG_16): UN_SIZED_OP(-, StgInt16)
|
|
|
3033
|
+ INSTRUCTION(bci_OP_NEG_16): UN_SIZED_OP(-, StgWord16)
|
|
3028
|
3034
|
|
|
3029
|
3035
|
|
|
3030
|
|
- INSTRUCTION(bci_OP_ADD_08): SIZED_BIN_OP(+, StgInt8)
|
|
3031
|
|
- INSTRUCTION(bci_OP_SUB_08): SIZED_BIN_OP(-, StgInt8)
|
|
3032
|
|
- INSTRUCTION(bci_OP_AND_08): SIZED_BIN_OP(&, StgInt8)
|
|
3033
|
|
- INSTRUCTION(bci_OP_XOR_08): SIZED_BIN_OP(^, StgInt8)
|
|
3034
|
|
- INSTRUCTION(bci_OP_OR_08): SIZED_BIN_OP(|, StgInt8)
|
|
3035
|
|
- INSTRUCTION(bci_OP_MUL_08): SIZED_BIN_OP(*, StgInt8)
|
|
|
3036
|
+ INSTRUCTION(bci_OP_ADD_08): SIZED_BIN_OP(+, StgWord8)
|
|
|
3037
|
+ INSTRUCTION(bci_OP_SUB_08): SIZED_BIN_OP(-, StgWord8)
|
|
|
3038
|
+ INSTRUCTION(bci_OP_AND_08): SIZED_BIN_OP(&, StgWord8)
|
|
|
3039
|
+ INSTRUCTION(bci_OP_XOR_08): SIZED_BIN_OP(^, StgWord8)
|
|
|
3040
|
+ INSTRUCTION(bci_OP_OR_08): SIZED_BIN_OP(|, StgWord8)
|
|
|
3041
|
+ INSTRUCTION(bci_OP_MUL_08): SIZED_BIN_OP(*, StgWord8)
|
|
3036
|
3042
|
INSTRUCTION(bci_OP_SHL_08): SIZED_BIN_OP_TY_INT(<<, StgWord8)
|
|
3037
|
3043
|
INSTRUCTION(bci_OP_LSR_08): SIZED_BIN_OP_TY_INT(>>, StgWord8)
|
|
3038
|
3044
|
INSTRUCTION(bci_OP_ASR_08): SIZED_BIN_OP_TY_INT(>>, StgInt8)
|
| ... |
... |
@@ -3050,7 +3056,7 @@ run_BCO: |
|
3050
|
3056
|
INSTRUCTION(bci_OP_S_LE_08): SIZED_BIN_OP_TY_TY_INT(<=, StgInt8)
|
|
3051
|
3057
|
|
|
3052
|
3058
|
INSTRUCTION(bci_OP_NOT_08): UN_SIZED_OP(~, StgWord8)
|
|
3053
|
|
- INSTRUCTION(bci_OP_NEG_08): UN_SIZED_OP(-, StgInt8)
|
|
|
3059
|
+ INSTRUCTION(bci_OP_NEG_08): UN_SIZED_OP(-, StgWord8)
|
|
3054
|
3060
|
|
|
3055
|
3061
|
INSTRUCTION(bci_OP_INDEX_ADDR_64):
|
|
3056
|
3062
|
{
|