+ lc_bndr <- newLocalVar FSLIT("lc") intTy
+ (varg : vbndrs, larg : lbndrs, (vbody, lbody))
+ <- vectBndrsIn (arg : cenv_vars info)
+ (vectExpr (Var lc_bndr) body)
+
+ venv_bndr <- newLocalVar FSLIT("env") vty
+ lenv_bndr <- newLocalVar FSLIT("env") lty
+
+ let vcase = bind_venv (Var venv_bndr) vbody vbndrs
+ lcase <- bind_lenv (Var lenv_bndr) lbody lc_bndr lbndrs
+ return (mkLams [venv_bndr, varg] vcase, mkLams [lenv_bndr, larg] lcase)
+ where
+ vty = cenv_vty info
+ lty = cenv_lty info
+
+ arity = length (cenv_vars info)
+
+ bind_venv venv vbody [] = vbody
+ bind_venv venv vbody [vbndr] = Let (NonRec vbndr venv) vbody
+ bind_venv venv vbody vbndrs
+ = Case venv (mkWildId vty) (exprType vbody)
+ [(DataAlt (tupleCon Boxed arity), vbndrs, vbody)]
+
+ bind_lenv lenv lbody lc_bndr [lbndr]
+ = do
+ lengthPA <- builtin lengthPAVar
+ return . Let (NonRec lbndr lenv)
+ $ Case (mkApps (Var lengthPA) [Type vty, (Var lbndr)])
+ lc_bndr
+ intTy
+ [(DEFAULT, [], lbody)]
+
+ bind_lenv lenv lbody lc_bndr lbndrs
+ = return
+ $ Case (unwrapFamInstScrut (cenv_repr_tycon info)
+ (cenv_repr_tyargs info)
+ lenv)
+ (mkWildId lty)
+ (exprType lbody)
+ [(DataAlt (cenv_repr_datacon info), lc_bndr : lbndrs, lbody)]
+
+vectTyAppExpr :: CoreExpr -> CoreExprWithFVs -> [Type] -> VM (CoreExpr, CoreExpr)
+vectTyAppExpr lc (_, AnnVar v) tys = vectPolyVar lc v tys
+vectTyAppExpr lc e tys = pprPanic "vectTyAppExpr" (ppr $ deAnnotate e)
+
+-- ----------------------------------------------------------------------------
+-- Types