Циклы и условия — это для того, чтобы язык был полным по Тьюрингу (т.е. был — на бесконечной памяти, разумеется — эквивалентен машине Тьюринга). На языке процессора циклы и условия выглядят совсем не так (там, по сути, куча GOTO и IF GOTO), но машинный код тоже полон по Тьюрингу.
Впрочем, есть вещи, которые поддерживаются языком именно потому, что процессор их поддерживает. Обычно хватает поддержки на уровне библиотек: атомарные операции, аппаратное шифрование… Но есть и вещи, вошедшие в собственно язык. Вот несколько штук.
• Нуль-терминированные строки, насколько мне известно, включили в Си потому, что на том PDP это было быстро.
• Большинство языков, деля с остатком отрицательные числа, говорят, что округление идёт к нулю (знак остатка = знаку делимого) — потому что так работает большинство процессоров.
• Модель памяти Java говорит: нет невесть откуда взявшихся значений (другими словами, если мы считали 1234 — значит, до этого кто-то его туда записал), за исключением не-volatile long и double. На 16-битный процессор многопоточную Яву ставить бессмысленно, а 32-битный — это уже дело.
Вызовы функций — с ними всё наоборот. Как только выяснилось, что это хорошая штука, для них сделали аппаратную поддержку. А так — для вызова функций (в удобоваримом для компилятора виде, с хорошо стандартизованными соглашениями вызова) хватает косвенной адресации и пары лишних регистров.