void step3(int work_x[], int work_y[], int DATA_x[], int DATA_y[], int data_x[],
           int data_y[], int smem[], int reversed[], float sin_64[448],
           float cos_64[448], float sin_512[448], float cos_512[448]) {
  int tid, hi, lo, i, j, stride;
  stride = 64;
  for (tid = 0; tid < 64; tid++) {
    for (i = 0; i < 8; i++) {
      data_x[i] = DATA_x[tid * 8 + i];
    }
    hi = tid >> 3;
    lo = tid & 7;
    {
      data_x[0] = smem[0 * 8 + lo * 66 + hi];
      data_x[1] = smem[1 * 8 + lo * 66 + hi];
      data_x[2] = smem[2 * 8 + lo * 66 + hi];
      data_x[3] = smem[3 * 8 + lo * 66 + hi];
      data_x[4] = smem[4 * 8 + lo * 66 + hi];
      data_x[5] = smem[5 * 8 + lo * 66 + hi];
      data_x[6] = smem[6 * 8 + lo * 66 + hi];
      data_x[7] = smem[7 * 8 + lo * 66 + hi];
    };
    for (i = 0; i < 8; i++) {
      DATA_x[tid * 8 + i] = data_x[i];
    }
  }
}


x86 assembly (clang, -O0):
<step3>:
push   %rbp
mov    %rsp,%rbp
mov    0x38(%rbp),%rax
mov    0x30(%rbp),%rax
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movl   $0x40,-0x48(%rbp)
movl   $0x0,-0x34(%rbp)
cmpl   $0x40,-0x34(%rbp)
jge    12c2 <step3+0x1c2>
movl   $0x0,-0x40(%rbp)
cmpl   $0x8,-0x40(%rbp)
jge    1189 <step3+0x89>
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x3,%ecx
add    -0x40(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1153 <step3+0x53>
mov    -0x34(%rbp),%eax
sar    $0x3,%eax
mov    %eax,-0x38(%rbp)
mov    -0x34(%rbp),%eax
and    $0x7,%eax
mov    %eax,-0x3c(%rbp)
mov    0x10(%rbp),%rax
imul   $0x42,-0x3c(%rbp),%ecx
add    $0x0,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    0x10(%rbp),%rax
imul   $0x42,-0x3c(%rbp),%ecx
add    $0x8,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    0x10(%rbp),%rax
imul   $0x42,-0x3c(%rbp),%ecx
add    $0x10,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    0x10(%rbp),%rax
imul   $0x42,-0x3c(%rbp),%ecx
add    $0x18,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,0xc(%rax)
mov    0x10(%rbp),%rax
imul   $0x42,-0x3c(%rbp),%ecx
add    $0x20,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,0x10(%rax)
mov    0x10(%rbp),%rax
imul   $0x42,-0x3c(%rbp),%ecx
add    $0x28,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,0x14(%rax)
mov    0x10(%rbp),%rax
imul   $0x42,-0x3c(%rbp),%ecx
add    $0x30,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,0x18(%rax)
mov    0x10(%rbp),%rax
imul   $0x42,-0x3c(%rbp),%ecx
add    $0x38,%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,0x1c(%rax)
movl   $0x0,-0x40(%rbp)
cmpl   $0x8,-0x40(%rbp)
jge    12af <step3+0x1af>
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x3,%ecx
add    -0x40(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1279 <step3+0x179>
jmp    12b4 <step3+0x1b4>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1142 <step3+0x42>
pop    %rbp
ret

x86 assembly (clang, -O2):
<step3>:
mov    0x8(%rsp),%r9
add    $0x1c,%rdx
xor    %eax,%eax
nopl   0x0(%rax,%rax,1)
mov    -0x1c(%rdx),%esi
mov    %esi,(%r8)
mov    -0x18(%rdx),%esi
mov    %esi,0x4(%r8)
mov    -0x14(%rdx),%esi
mov    %esi,0x8(%r8)
mov    -0x10(%rdx),%esi
mov    %esi,0xc(%r8)
mov    -0xc(%rdx),%esi
mov    %esi,0x10(%r8)
mov    -0x8(%rdx),%esi
mov    %esi,0x14(%r8)
mov    -0x4(%rdx),%esi
mov    %esi,0x18(%r8)
mov    (%rdx),%esi
mov    %esi,0x1c(%r8)
mov    %eax,%esi
shr    $0x3,%esi
mov    %eax,%ecx
and    $0x7,%ecx
mov    %ecx,%edi
shl    $0x6,%edi
lea    (%rdi,%rcx,2),%ecx
add    %esi,%ecx
mov    (%r9,%rcx,4),%esi
mov    %esi,(%r8)
mov    0x20(%r9,%rcx,4),%edi
mov    %edi,0x4(%r8)
mov    0x40(%r9,%rcx,4),%edi
mov    %edi,0x8(%r8)
mov    0x60(%r9,%rcx,4),%edi
mov    %edi,0xc(%r8)
mov    0x80(%r9,%rcx,4),%edi
mov    %edi,0x10(%r8)
mov    0xa0(%r9,%rcx,4),%edi
mov    %edi,0x14(%r8)
mov    0xc0(%r9,%rcx,4),%edi
mov    %edi,0x18(%r8)
mov    0xe0(%r9,%rcx,4),%ecx
mov    %ecx,0x1c(%r8)
mov    %esi,-0x1c(%rdx)
mov    0x4(%r8),%ecx
mov    %ecx,-0x18(%rdx)
mov    0x8(%r8),%ecx
mov    %ecx,-0x14(%rdx)
mov    0xc(%r8),%ecx
mov    %ecx,-0x10(%rdx)
mov    0x10(%r8),%ecx
mov    %ecx,-0xc(%rdx)
mov    0x14(%r8),%ecx
mov    %ecx,-0x8(%rdx)
mov    0x18(%r8),%ecx
mov    %ecx,-0x4(%rdx)
mov    0x1c(%r8),%ecx
mov    %ecx,(%rdx)
add    $0x1,%rax
add    $0x20,%rdx
cmp    $0x40,%rax
jne    1110 <step3+0x10>
ret

LLVM IR (-O0):
define void @step3(i32* %0, i32* %1, i32* %2, i32* %3, i32* %4, i32* %5, i32* %6, i32* %7, float* %8, float* %9, float* %10, float* %11) {
%13 = alloca i32*
%14 = alloca i32*
%15 = alloca i32*
%16 = alloca i32*
%17 = alloca i32*
%18 = alloca i32*
%19 = alloca i32*
%20 = alloca i32*
%21 = alloca float*
%22 = alloca float*
%23 = alloca float*
%24 = alloca float*
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
%29 = alloca i32
%30 = alloca i32
store i32* %0, i32** %13
store i32* %1, i32** %14
store i32* %2, i32** %15
store i32* %3, i32** %16
store i32* %4, i32** %17
store i32* %5, i32** %18
store i32* %6, i32** %19
store i32* %7, i32** %20
store float* %8, float** %21
store float* %9, float** %22
store float* %10, float** %23
store float* %11, float** %24
store i32 64, i32* %30
store i32 0, i32* %25
br label %31
31: ; preds = %167, %12
%32 = load i32, i32* %25
%33 = icmp slt i32 %32, 64
br i1 %33, label %34, label %170
34: ; preds = %31
store i32 0, i32* %28
br label %35
35: ; preds = %51, %34
%36 = load i32, i32* %28
%37 = icmp slt i32 %36, 8
br i1 %37, label %38, label %54
38: ; preds = %35
%39 = load i32*, i32** %15
%40 = load i32, i32* %25
%41 = mul nsw i32 %40, 8
%42 = load i32, i32* %28
%43 = add nsw i32 %41, %42
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i32, i32* %39, i64 %44
%46 = load i32, i32* %45
%47 = load i32*, i32** %17
%48 = load i32, i32* %28
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i32, i32* %47, i64 %49
store i32 %46, i32* %50
br label %51
51: ; preds = %38
%52 = load i32, i32* %28
%53 = add nsw i32 %52, 1
store i32 %53, i32* %28
br label %35
54: ; preds = %35
%55 = load i32, i32* %25
%56 = ashr i32 %55, 3
store i32 %56, i32* %26
%57 = load i32, i32* %25
%58 = and i32 %57, 7
store i32 %58, i32* %27
%59 = load i32*, i32** %19
%60 = load i32, i32* %27
%61 = mul nsw i32 %60, 66
%62 = add nsw i32 0, %61
%63 = load i32, i32* %26
%64 = add nsw i32 %62, %63
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i32, i32* %59, i64 %65
%67 = load i32, i32* %66
%68 = load i32*, i32** %17
%69 = getelementptr inbounds i32, i32* %68, i64 0
store i32 %67, i32* %69
%70 = load i32*, i32** %19
%71 = load i32, i32* %27
%72 = mul nsw i32 %71, 66
%73 = add nsw i32 8, %72
%74 = load i32, i32* %26
%75 = add nsw i32 %73, %74
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds i32, i32* %70, i64 %76
%78 = load i32, i32* %77
%79 = load i32*, i32** %17
%80 = getelementptr inbounds i32, i32* %79, i64 1
store i32 %78, i32* %80
%81 = load i32*, i32** %19
%82 = load i32, i32* %27
%83 = mul nsw i32 %82, 66
%84 = add nsw i32 16, %83
%85 = load i32, i32* %26
%86 = add nsw i32 %84, %85
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds i32, i32* %81, i64 %87
%89 = load i32, i32* %88
%90 = load i32*, i32** %17
%91 = getelementptr inbounds i32, i32* %90, i64 2
store i32 %89, i32* %91
%92 = load i32*, i32** %19
%93 = load i32, i32* %27
%94 = mul nsw i32 %93, 66
%95 = add nsw i32 24, %94
%96 = load i32, i32* %26
%97 = add nsw i32 %95, %96
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i32, i32* %92, i64 %98
%100 = load i32, i32* %99
%101 = load i32*, i32** %17
%102 = getelementptr inbounds i32, i32* %101, i64 3
store i32 %100, i32* %102
%103 = load i32*, i32** %19
%104 = load i32, i32* %27
%105 = mul nsw i32 %104, 66
%106 = add nsw i32 32, %105
%107 = load i32, i32* %26
%108 = add nsw i32 %106, %107
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds i32, i32* %103, i64 %109
%111 = load i32, i32* %110
%112 = load i32*, i32** %17
%113 = getelementptr inbounds i32, i32* %112, i64 4
store i32 %111, i32* %113
%114 = load i32*, i32** %19
%115 = load i32, i32* %27
%116 = mul nsw i32 %115, 66
%117 = add nsw i32 40, %116
%118 = load i32, i32* %26
%119 = add nsw i32 %117, %118
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds i32, i32* %114, i64 %120
%122 = load i32, i32* %121
%123 = load i32*, i32** %17
%124 = getelementptr inbounds i32, i32* %123, i64 5
store i32 %122, i32* %124
%125 = load i32*, i32** %19
%126 = load i32, i32* %27
%127 = mul nsw i32 %126, 66
%128 = add nsw i32 48, %127
%129 = load i32, i32* %26
%130 = add nsw i32 %128, %129
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds i32, i32* %125, i64 %131
%133 = load i32, i32* %132
%134 = load i32*, i32** %17
%135 = getelementptr inbounds i32, i32* %134, i64 6
store i32 %133, i32* %135
%136 = load i32*, i32** %19
%137 = load i32, i32* %27
%138 = mul nsw i32 %137, 66
%139 = add nsw i32 56, %138
%140 = load i32, i32* %26
%141 = add nsw i32 %139, %140
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds i32, i32* %136, i64 %142
%144 = load i32, i32* %143
%145 = load i32*, i32** %17
%146 = getelementptr inbounds i32, i32* %145, i64 7
store i32 %144, i32* %146
store i32 0, i32* %28
br label %147
147: ; preds = %163, %54
%148 = load i32, i32* %28
%149 = icmp slt i32 %148, 8
br i1 %149, label %150, label %166
150: ; preds = %147
%151 = load i32*, i32** %17
%152 = load i32, i32* %28
%153 = sext i32 %152 to i64
%154 = getelementptr inbounds i32, i32* %151, i64 %153
%155 = load i32, i32* %154
%156 = load i32*, i32** %15
%157 = load i32, i32* %25
%158 = mul nsw i32 %157, 8
%159 = load i32, i32* %28
%160 = add nsw i32 %158, %159
%161 = sext i32 %160 to i64
%162 = getelementptr inbounds i32, i32* %156, i64 %161
store i32 %155, i32* %162
br label %163
163: ; preds = %150
%164 = load i32, i32* %28
%165 = add nsw i32 %164, 1
store i32 %165, i32* %28
br label %147
166: ; preds = %147
br label %167
167: ; preds = %166
%168 = load i32, i32* %25
%169 = add nsw i32 %168, 1
store i32 %169, i32* %25
br label %31
170: ; preds = %31
ret void
}

LLVM IR (-O2):
define void @step3(i32* nocapture readnone %0, i32* nocapture readnone %1, i32* nocapture %2, i32* nocapture readnone %3, i32* nocapture %4, i32* nocapture readnone %5, i32* nocapture %6, i32* nocapture readnone %7, float* nocapture readnone %8, float* nocapture readnone %9, float* nocapture readnone %10, float* nocapture readnone %11) {
%13 = getelementptr inbounds i32, i32* %4, i64 1
%14 = getelementptr inbounds i32, i32* %4, i64 2
%15 = getelementptr inbounds i32, i32* %4, i64 3
%16 = getelementptr inbounds i32, i32* %4, i64 4
%17 = getelementptr inbounds i32, i32* %4, i64 5
%18 = getelementptr inbounds i32, i32* %4, i64 6
%19 = getelementptr inbounds i32, i32* %4, i64 7
br label %20
20: ; preds = %12, %20
%21 = phi i64 [ 0, %12 ], [ %89, %20 ]
%22 = shl nsw i64 %21, 3
%23 = getelementptr inbounds i32, i32* %2, i64 %22
%24 = load i32, i32* %23
store i32 %24, i32* %4
%25 = or i64 %22, 1
%26 = getelementptr inbounds i32, i32* %2, i64 %25
%27 = load i32, i32* %26
store i32 %27, i32* %13
%28 = or i64 %22, 2
%29 = getelementptr inbounds i32, i32* %2, i64 %28
%30 = load i32, i32* %29
store i32 %30, i32* %14
%31 = or i64 %22, 3
%32 = getelementptr inbounds i32, i32* %2, i64 %31
%33 = load i32, i32* %32
store i32 %33, i32* %15
%34 = or i64 %22, 4
%35 = getelementptr inbounds i32, i32* %2, i64 %34
%36 = load i32, i32* %35
store i32 %36, i32* %16
%37 = or i64 %22, 5
%38 = getelementptr inbounds i32, i32* %2, i64 %37
%39 = load i32, i32* %38
store i32 %39, i32* %17
%40 = or i64 %22, 6
%41 = getelementptr inbounds i32, i32* %2, i64 %40
%42 = load i32, i32* %41
store i32 %42, i32* %18
%43 = or i64 %22, 7
%44 = getelementptr inbounds i32, i32* %2, i64 %43
%45 = load i32, i32* %44
store i32 %45, i32* %19
%46 = trunc i64 %21 to i32
%47 = lshr i32 %46, 3
%48 = and i32 %46, 7
%49 = mul nuw nsw i32 %48, 66
%50 = add nuw nsw i32 %49, %47
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds i32, i32* %6, i64 %51
%53 = load i32, i32* %52
store i32 %53, i32* %4
%54 = add nuw nsw i32 %50, 8
%55 = zext i32 %54 to i64
%56 = getelementptr inbounds i32, i32* %6, i64 %55
%57 = load i32, i32* %56
store i32 %57, i32* %13
%58 = add nuw nsw i32 %50, 16
%59 = zext i32 %58 to i64
%60 = getelementptr inbounds i32, i32* %6, i64 %59
%61 = load i32, i32* %60
store i32 %61, i32* %14
%62 = add nuw nsw i32 %50, 24
%63 = zext i32 %62 to i64
%64 = getelementptr inbounds i32, i32* %6, i64 %63
%65 = load i32, i32* %64
store i32 %65, i32* %15
%66 = add nuw nsw i32 %50, 32
%67 = zext i32 %66 to i64
%68 = getelementptr inbounds i32, i32* %6, i64 %67
%69 = load i32, i32* %68
store i32 %69, i32* %16
%70 = add nuw nsw i32 %50, 40
%71 = zext i32 %70 to i64
%72 = getelementptr inbounds i32, i32* %6, i64 %71
%73 = load i32, i32* %72
store i32 %73, i32* %17
%74 = add nuw nsw i32 %50, 48
%75 = zext i32 %74 to i64
%76 = getelementptr inbounds i32, i32* %6, i64 %75
%77 = load i32, i32* %76
store i32 %77, i32* %18
%78 = add nuw nsw i32 %50, 56
%79 = zext i32 %78 to i64
%80 = getelementptr inbounds i32, i32* %6, i64 %79
%81 = load i32, i32* %80
store i32 %81, i32* %19
store i32 %53, i32* %23
%82 = load i32, i32* %13
store i32 %82, i32* %26
%83 = load i32, i32* %14
store i32 %83, i32* %29
%84 = load i32, i32* %15
store i32 %84, i32* %32
%85 = load i32, i32* %16
store i32 %85, i32* %35
%86 = load i32, i32* %17
store i32 %86, i32* %38
%87 = load i32, i32* %18
store i32 %87, i32* %41
%88 = load i32, i32* %19
store i32 %88, i32* %44
%89 = add nuw nsw i64 %21, 1
%90 = icmp eq i64 %89, 64
br i1 %90, label %91, label %20
91: ; preds = %20
ret void
}