         HalfRadix2CooleyTukey_2(input, in_stride, in_count, _real, _imag)
     case 2:
         HalfRadix2CooleyTukey_4(input, in_stride, in_count, _real, _imag, out_stride)
+    case 3:
+        HalfRadix2CooleyTukey_8(input, in_stride, in_count, _real, _imag, out_stride)
         
     default:
         let length = 1 << level

        InverseRadix2CooleyTukey_2(input, in_stride, in_count, _real, _imag, out_stride)
    case 2:
        InverseRadix2CooleyTukey_4(input, in_stride, in_count, _real, _imag, out_stride)
        
    default:
        let length = 1 << level

    _imag.pointee = d - b
}
@_transparent
private func HalfRadix2CooleyTukey_8<T: BinaryFloatingPoint>(_ input: UnsafePointer<T>, _ in_stride: Int, _ in_count: Int, _ _real: UnsafeMutablePointer<T>, _ _imag: UnsafeMutablePointer<T>, _ out_stride: Int) {
    
    var input = input
    var _real = _real
    var _imag = _imag
    
    if in_count == 0 {
        _real.pointee = 0
        _imag.pointee = 0
        _real += out_stride
        _imag += out_stride
        _real.pointee = 0
        _imag.pointee = 0
        _real += out_stride
        _imag += out_stride
        _real.pointee = 0
        _imag.pointee = 0
        _real += out_stride
        _imag += out_stride
        _real.pointee = 0
        _imag.pointee = 0
        return
    }
    
    let a1 = input.pointee
    input += in_stride
    
    let e1 = in_count > 1 ? input.pointee : 0
    input += in_stride
    
    let c1 = in_count > 2 ? input.pointee : 0
    input += in_stride
    
    let g1 = in_count > 3 ? input.pointee : 0
    input += in_stride
    
    let b1 = in_count > 4 ? input.pointee : 0
    input += in_stride
    
    let f1 = in_count > 5 ? input.pointee : 0
    input += in_stride
    
    let d1 = in_count > 6 ? input.pointee : 0
    input += in_stride
    
    let h1 = in_count > 7 ? input.pointee : 0
    
    let a3 = a1 + b1
    let b3 = a1 - b1
    let c3 = c1 + d1
    let d3 = c1 - d1
    let e3 = e1 + f1
    let f3 = e1 - f1
    let g3 = g1 + h1
    let h3 = g1 - h1
    
    let a5 = a3 + c3
    let c5 = a3 - c3
    let e5 = e3 + g3
    let g5 = e3 - g3
    
    let M_SQRT1_2 = 0.7071067811865475244008443621048490392848359376884740 as T
    
    let i = M_SQRT1_2 * (f3 - h3)
    let j = M_SQRT1_2 * (f3 + h3)
    
    _real.pointee = a5 + e5
    _imag.pointee = a5 - e5
    _real += out_stride
    _imag += out_stride
    
    _real.pointee = b3 + i
    _imag.pointee = -d3 - j
    _real += out_stride
    _imag += out_stride
    
    _real.pointee = c5
    _imag.pointee = -g5
    _real += out_stride
    _imag += out_stride
    
    _real.pointee = b3 - i
    _imag.pointee = d3 - j
    _real += out_stride
    _imag += out_stride
}

@_transparent
private func HalfInverseRadix2CooleyTukey_2<T: FloatingPoint>(_ real: UnsafePointer<T>, _ imag: UnsafePointer<T>, _ in_count: Int, _ output: UnsafeMutablePointer<T>, _ out_stride: Int) {
    
    var output = output
