function signatures( dtypes ) {
	var casts;
	var out;
	var ch1;
	var ch2;
	var t1;
	var t2;
	var N;
	var s;
	var i;
	var j;

	N = dtypes.length;

	// Generate the list of signatures:
	out = [];
	for ( i = 0; i < N; i++ ) {
		t1 = dtypes[ i ];

		// Resolve single-letter dtype abbreviation:
		ch1 = dtypeChar( t1 );

		// Generate the input/output array signature:
		s = ch1+'_'+ch1; // e.g., d_d
		out.push( s );

		// Resolve the list of (mostly) safe casts for the input dtype:
		casts = mostlySafeCasts( t1 );

		// Remove the excluded dtypes:
		casts = filter( casts, EXCLUDE_DTYPES );

		// Generate signatures for allowed casts:
		for ( j = 0; j < casts.length; j++ ) {
			t2 = casts[ j ];
			if ( t2 === t1 ) {
				continue;
			}
			ch2 = dtypeChar( t2 );
			s = ch1+'_'+ch2;

			out.push( s ); // e.g., `b_i`
		}
	}
	// Append any special loops:
	for ( i = 0; i < SPECIAL_LOOPS.length; i++ ) {
		out.push( SPECIAL_LOOPS[ i ] );
	}
	return out.sort();
}
Generates a list of loop signatures from a list of data types.

@private
@param {StringArray} dtypes - list of data types
@returns {StringArray} list of loop signatures