public void genSlideMoves(MoveList result, long p_start_bb, long p_dest_bb) {

    // Phase Zero
    // Create temp player piece bb
    temp_player_bb[0] = piece_bb[player + 0];
    temp_player_bb[1] = piece_bb[player + 2];
    temp_player_bb[2] = piece_bb[player + 4];
    temp_player_bb[3] = piece_bb[player + 6];
    temp_player_bb[4] = piece_bb[player + 8];
    temp_player_bb[5] = piece_bb[player + 10];

    // Phase 1
    // Determine all possible self captures on traps
    // Determine all traps where player suicide is possible
    player_suicide_bb = 0L;

    for (int i = 0; i <= 3; i++) {

      long ptest_bb = TOUCH_TRAP[i] & colour_bb[player];
      // if exactly one player piece touching trap
      if (((ptest_bb & (ptest_bb - 1)) == 0) && (ptest_bb != 0)) {

        // Add trap to player suicide bb
        player_suicide_bb |= TRAP[i];

        // If trap contains player piece
        // AND touching piece is member of p_start_bb
        if ((TRAP[i] & colour_bb[player]) != 0 && ((ptest_bb & p_start_bb) != 0)) {

          int trap_pt = getPieceType(TRAP[i], player);
          int player_pt = getPieceType(ptest_bb, player);

          // Need to remove piece from temp_player_bb
          temp_player_bb[player_pt >> 1] ^= ptest_bb;

          // RULE: if ptest_bb moves then piece_type on TRAP[i] is
          // captured.
          long dest_bb = touching_bb(ptest_bb,
            player_pt) & empty_bb & p_dest_bb;
          while (dest_bb != 0) {
            long lsb2_bb = dest_bb & -dest_bb;
            dest_bb ^= lsb2_bb; // Remove the piece

            // Record the move
            ArimaaMove move = result.getMove();
            move.clear();

            // Handles moving the piece
            move.piece_bb[player_pt] = ptest_bb | lsb2_bb;

            // Handles the captured piece, need to XOR in case
            // piece type is the same!
            move.piece_bb[trap_pt] ^= TRAP[i];

            // Record number of steps used
            move.steps = 1;

//            System.out.println("SLIDE DEBUG 1\n"+move);
          }
        }
      }
    }

    // Phase 2
    // Generate all remaining slide moves
    for (int pt = player, et = enemy; pt <= 11; pt += 2, et += 2) {

      // Get all unfrozen player pieces of type pt
      long temp_bb = temp_player_bb[pt >> 1] & p_start_bb;
      long unfrozen_sq_bb = touching_bb(colour_bb[player]) |
        ~touching_bb(stronger_enemy_bb[pt]);
      long unfrozen_pieces_bb = temp_bb & unfrozen_sq_bb;

      // Examine each player piece one at a time
      while (unfrozen_pieces_bb != 0) {
        long lsb_bb = unfrozen_pieces_bb & -unfrozen_pieces_bb;
        unfrozen_pieces_bb ^= lsb_bb; // Remove the piece

        // Get possible destination squares
        // Note special touching_bb to handle rabbit moves
        long temp_to_bb = touching_bb(lsb_bb, pt) & empty_bb & p_dest_bb;

        // Handle slide moves
        while (temp_to_bb != 0) {
          long lsb2_bb = temp_to_bb & -temp_to_bb;
          temp_to_bb ^= lsb2_bb; // Remove the piece

          // Record the move
          ArimaaMove move = result.getMove();
          move.clear();

          // Handles moving the piece
          move.piece_bb[pt] = lsb_bb | lsb2_bb;

          // Handles player suicide captures
          move.piece_bb[pt] ^= (lsb2_bb & player_suicide_bb);

          // Record number of steps used
          move.steps = 1;

//          System.out.println("SLIDE DEBUG 2\n"+move);

        }
      }
    }

  }