Changeset 1975
- Timestamp:
- 03/25/12 11:23:24 (14 months ago)
- Files:
-
- 1 modified
-
trunk/lib/bitblock128.hpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/bitblock128.hpp
r1950 r1975 23 23 }; 24 24 25 static IDISA_ALWAYS_INLINE void adc(bitblock128_t x, bitblock128_t y, bitblock128_t & carry, bitblock128_t & sum); 26 static IDISA_ALWAYS_INLINE void sbb(bitblock128_t x, bitblock128_t y, bitblock128_t & borrow, bitblock128_t & difference); 27 static IDISA_ALWAYS_INLINE void advance_with_carry(bitblock128_t cursor, bitblock128_t & carry, bitblock128_t & rslt); 28 static IDISA_ALWAYS_INLINE bool bitblock_has_bit(bitblock128_t arg1); 29 static IDISA_ALWAYS_INLINE void signbitmask(bitblock128_t & v); 25 /* The type used to store a carry bit. */ 26 typedef bitblock128_t carry_t; 27 28 static IDISA_ALWAYS_INLINE bitblock128_t carry2bitblock(carry_t carry); 29 static IDISA_ALWAYS_INLINE carry_t bitblock2carry(bitblock128_t carry); 30 31 static IDISA_ALWAYS_INLINE void adc(bitblock128_t x, bitblock128_t y, carry_t & carry, bitblock128_t & sum); 32 static IDISA_ALWAYS_INLINE void sbb(bitblock128_t x, bitblock128_t y, carry_t & borrow, bitblock128_t & difference); 33 static IDISA_ALWAYS_INLINE void advance_with_carry(bitblock128_t cursor, carry_t & carry, bitblock128_t & rslt); 34 30 35 static IDISA_ALWAYS_INLINE bitblock128_t convert (uint64_t s); 31 36 static IDISA_ALWAYS_INLINE uint64_t convert (bitblock128_t v); 32 37 33 IDISA_ALWAYS_INLINE void adc(bitblock128_t x, bitblock128_t y, bitblock128_t & carry, bitblock128_t & sum) 38 static IDISA_ALWAYS_INLINE bitblock128_t carry2bitblock(carry_t carry) { return carry;} 39 static IDISA_ALWAYS_INLINE carry_t bitblock2carry(bitblock128_t carry) { return carry;} 40 41 IDISA_ALWAYS_INLINE void adc(bitblock128_t x, bitblock128_t y, carry_t & carry, bitblock128_t & sum) 34 42 { 35 43 bitblock128_t gen = simd_and(x, y); 36 44 bitblock128_t prop = simd_or(x, y); 37 bitblock128_t partial = simd128<64>::add(simd128<64>::add(x, y), carry );45 bitblock128_t partial = simd128<64>::add(simd128<64>::add(x, y), carry2bitblock(carry)); 38 46 bitblock128_t c1 = simd128<128>::slli<64>(simd128<64>::srli<63>(simd_or(gen, simd_andc(prop, partial)))); 39 47 sum = simd128<64>::add(c1, partial); 40 // carry = simd_and(hibitmask<bitblock128_t>(), simd_or(gen, simd_andc(prop, sum))); // TODO - set high bit carry via hibitmask 41 carry = simd128<128>::srli<127>(simd_or(gen, simd_andc(prop, sum))); // TODO - 48 carry = bitblock2carry(simd128<128>::srli<127>(simd_or(gen, simd_andc(prop, sum)))); 42 49 } 43 50 44 IDISA_ALWAYS_INLINE void sbb(bitblock128_t x, bitblock128_t y, bitblock128_t & borrow, bitblock128_t & difference)51 IDISA_ALWAYS_INLINE void sbb(bitblock128_t x, bitblock128_t y, carry_t & borrow, bitblock128_t & difference) 45 52 { 46 53 bitblock128_t gen = simd_andc(y, x); 47 54 bitblock128_t prop = simd_not(simd_xor(x, y)); 48 bitblock128_t partial = simd128<64>::sub(simd128<64>::sub(x, y), borrow);55 bitblock128_t partial = simd128<64>::sub(simd128<64>::sub(x, y), carry2bitblock(borrow)); 49 56 bitblock128_t b1 = simd128<128>::slli<64>(simd128<64>::srli<63>(simd_or(gen, simd_and(prop, partial)))); 50 57 difference = simd128<64>::sub(partial, b1); 51 // borrow = simd_and(hibitmask<bitblock128_t>, simd_or(gen, simd_and(prop, difference))); // TODO - set high bit carry via hibitmask 52 borrow = simd128<128>::srli<127>(simd_or(gen, simd_and(prop, difference))); 58 borrow = bitblock2carry(simd128<128>::srli<127>(simd_or(gen, simd_and(prop, difference)))); 53 59 } 54 60 55 IDISA_ALWAYS_INLINE void advance_with_carry(bitblock128_t cursor, bitblock128_t & carry, bitblock128_t & rslt)61 IDISA_ALWAYS_INLINE void advance_with_carry(bitblock128_t cursor, carry_t & carry, bitblock128_t & rslt) 56 62 { 57 63 bitblock128_t shift_out = simd128<64>::srli<63>(cursor); 58 bitblock128_t low_bits = esimd128<64>::mergel(shift_out, carry); 59 // carry = simd_and(hibitmask<bitblock128_t>, cursor); 60 carry = simd128<128>::srli<64>(shift_out); // carry - accumlated 127 shift right locical shift of cursor 64 bitblock128_t low_bits = esimd128<64>::mergel(shift_out, carry2bitblock(carry)); 65 carry = bitblock2carry(simd128<128>::srli<64>(shift_out)); 61 66 rslt = simd_or(simd128<64>::add(cursor, cursor), low_bits); 62 }63 64 IDISA_ALWAYS_INLINE void signbitmask(bitblock128_t & v)65 {66 v = simd128<128>::slli<127>(simd128<128>::constant<1>());67 67 } 68 68
