diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
index b2d5ebe471e2af85b928e377576af4bf6ee3c6d8..c3a0a12254405c034ad0cbd1c12137c5ebe61d76 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
@@ -521,8 +521,40 @@ public abstract class PromiseNode extends RNode {
             }
         }
 
-        @ExplodeLoop
         private int evaluateArguments(VirtualFrame frame, Object[] evaluatedArgs) {
+            if (evaluatedArgs.length <= 32) {
+                return evaluateArgumentsExplode(frame, evaluatedArgs);
+            }
+            return evaluateArgumentsLoop(frame, evaluatedArgs);
+        }
+
+        @ExplodeLoop
+        private int evaluateArgumentsExplode(VirtualFrame frame, Object[] evaluatedArgs) {
+            int size = 0;
+            boolean containsVarargs = false;
+            for (int i = 0; i < varargs.length; i++) {
+                Object argValue = varargs[i].execute(frame);
+                if (argsValueAndNamesProfile.profile(argValue instanceof RArgsValuesAndNames)) {
+                    containsVarargs = true;
+                    size += ((RArgsValuesAndNames) argValue).getLength();
+                    evaluatedArgs[i] = argValue;
+                } else {
+                    size++;
+                    evaluatedArgs[i] = promiseCheckHelper.checkEvaluate(frame, argValue);
+                }
+                if (evaluatedArgs[i] == null) {
+                    CompilerDirectives.transferToInterpreterAndInvalidate();
+                    throw RInternalError.shouldNotReachHere("evaluated argument must not be null");
+                }
+            }
+            if (containsVarargProfile.profile(containsVarargs)) {
+                return size;
+            } else {
+                return -1;
+            }
+        }
+
+        private int evaluateArgumentsLoop(VirtualFrame frame, Object[] evaluatedArgs) {
             int size = 0;
             boolean containsVarargs = false;
             for (int i = 0; i < varargs.length; i++) {