00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifdef ARITH_GE
00011 #define GE_ARG , void *gep
00012 #define DECLARE_GE uint32_t ge = 0
00013 #define SET_GE *(uint32_t *)gep = ge
00014 #else
00015 #define GE_ARG
00016 #define DECLARE_GE do{}while(0)
00017 #define SET_GE do{}while(0)
00018 #endif
00019
00020 #define RESULT(val, n, width) \
00021 res |= ((uint32_t)(glue(glue(uint,width),_t))(val)) << (n * width)
00022
00023 uint32_t HELPER(glue(PFX,add16))(uint32_t a, uint32_t b GE_ARG)
00024 {
00025 uint32_t res = 0;
00026 DECLARE_GE;
00027
00028 ADD16(a, b, 0);
00029 ADD16(a >> 16, b >> 16, 1);
00030 SET_GE;
00031 return res;
00032 }
00033
00034 uint32_t HELPER(glue(PFX,add8))(uint32_t a, uint32_t b GE_ARG)
00035 {
00036 uint32_t res = 0;
00037 DECLARE_GE;
00038
00039 ADD8(a, b, 0);
00040 ADD8(a >> 8, b >> 8, 1);
00041 ADD8(a >> 16, b >> 16, 2);
00042 ADD8(a >> 24, b >> 24, 3);
00043 SET_GE;
00044 return res;
00045 }
00046
00047 uint32_t HELPER(glue(PFX,sub16))(uint32_t a, uint32_t b GE_ARG)
00048 {
00049 uint32_t res = 0;
00050 DECLARE_GE;
00051
00052 SUB16(a, b, 0);
00053 SUB16(a >> 16, b >> 16, 1);
00054 SET_GE;
00055 return res;
00056 }
00057
00058 uint32_t HELPER(glue(PFX,sub8))(uint32_t a, uint32_t b GE_ARG)
00059 {
00060 uint32_t res = 0;
00061 DECLARE_GE;
00062
00063 SUB8(a, b, 0);
00064 SUB8(a >> 8, b >> 8, 1);
00065 SUB8(a >> 16, b >> 16, 2);
00066 SUB8(a >> 24, b >> 24, 3);
00067 SET_GE;
00068 return res;
00069 }
00070
00071 uint32_t HELPER(glue(PFX,subaddx))(uint32_t a, uint32_t b GE_ARG)
00072 {
00073 uint32_t res = 0;
00074 DECLARE_GE;
00075
00076 ADD16(a, b, 0);
00077 SUB16(a >> 16, b >> 16, 1);
00078 SET_GE;
00079 return res;
00080 }
00081
00082 uint32_t HELPER(glue(PFX,addsubx))(uint32_t a, uint32_t b GE_ARG)
00083 {
00084 uint32_t res = 0;
00085 DECLARE_GE;
00086
00087 SUB16(a, b, 0);
00088 ADD16(a >> 16, b >> 16, 1);
00089 SET_GE;
00090 return res;
00091 }
00092
00093 #undef GE_ARG
00094 #undef DECLARE_GE
00095 #undef SET_GE
00096 #undef RESULT
00097
00098 #undef ARITH_GE
00099 #undef PFX
00100 #undef ADD16
00101 #undef SUB16
00102 #undef ADD8
00103 #undef SUB8