Instruction level parallelism in Prolog: Analysis and architectural support