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;
outer:
  for (tid = 0; tid < 64; tid++) {
  load:
    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];
    };
  store:
    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    12c7 <step3+0x1c7>
jmp    1151 <step3+0x51>
movl   $0x0,-0x40(%rbp)
cmpl   $0x8,-0x40(%rbp)
jge    118e <step3+0x8e>
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    1158 <step3+0x58>
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    12b4 <step3+0x1b4>
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    127e <step3+0x17e>
jmp    12b9 <step3+0x1b9>
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
br label %31
31: ; preds = %12
store i32 0, i32* %25
br label %32
32: ; preds = %170, %31
%33 = load i32, i32* %25
%34 = icmp slt i32 %33, 64
br i1 %34, label %35, label %173
35: ; preds = %32
br label %36
36: ; preds = %35
store i32 0, i32* %28
br label %37
37: ; preds = %53, %36
%38 = load i32, i32* %28
%39 = icmp slt i32 %38, 8
br i1 %39, label %40, label %56
40: ; preds = %37
%41 = load i32*, i32** %15
%42 = load i32, i32* %25
%43 = mul nsw i32 %42, 8
%44 = load i32, i32* %28
%45 = add nsw i32 %43, %44
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i32, i32* %41, i64 %46
%48 = load i32, i32* %47
%49 = load i32*, i32** %17
%50 = load i32, i32* %28
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i32, i32* %49, i64 %51
store i32 %48, i32* %52
br label %53
53: ; preds = %40
%54 = load i32, i32* %28
%55 = add nsw i32 %54, 1
store i32 %55, i32* %28
br label %37
56: ; preds = %37
%57 = load i32, i32* %25
%58 = ashr i32 %57, 3
store i32 %58, i32* %26
%59 = load i32, i32* %25
%60 = and i32 %59, 7
store i32 %60, i32* %27
%61 = load i32*, i32** %19
%62 = load i32, i32* %27
%63 = mul nsw i32 %62, 66
%64 = add nsw i32 0, %63
%65 = load i32, i32* %26
%66 = add nsw i32 %64, %65
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i32, i32* %61, i64 %67
%69 = load i32, i32* %68
%70 = load i32*, i32** %17
%71 = getelementptr inbounds i32, i32* %70, i64 0
store i32 %69, i32* %71
%72 = load i32*, i32** %19
%73 = load i32, i32* %27
%74 = mul nsw i32 %73, 66
%75 = add nsw i32 8, %74
%76 = load i32, i32* %26
%77 = add nsw i32 %75, %76
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds i32, i32* %72, i64 %78
%80 = load i32, i32* %79
%81 = load i32*, i32** %17
%82 = getelementptr inbounds i32, i32* %81, i64 1
store i32 %80, i32* %82
%83 = load i32*, i32** %19
%84 = load i32, i32* %27
%85 = mul nsw i32 %84, 66
%86 = add nsw i32 16, %85
%87 = load i32, i32* %26
%88 = add nsw i32 %86, %87
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds i32, i32* %83, i64 %89
%91 = load i32, i32* %90
%92 = load i32*, i32** %17
%93 = getelementptr inbounds i32, i32* %92, i64 2
store i32 %91, i32* %93
%94 = load i32*, i32** %19
%95 = load i32, i32* %27
%96 = mul nsw i32 %95, 66
%97 = add nsw i32 24, %96
%98 = load i32, i32* %26
%99 = add nsw i32 %97, %98
%100 = sext i32 %99 to i64
%101 = getelementptr inbounds i32, i32* %94, i64 %100
%102 = load i32, i32* %101
%103 = load i32*, i32** %17
%104 = getelementptr inbounds i32, i32* %103, i64 3
store i32 %102, i32* %104
%105 = load i32*, i32** %19
%106 = load i32, i32* %27
%107 = mul nsw i32 %106, 66
%108 = add nsw i32 32, %107
%109 = load i32, i32* %26
%110 = add nsw i32 %108, %109
%111 = sext i32 %110 to i64
%112 = getelementptr inbounds i32, i32* %105, i64 %111
%113 = load i32, i32* %112
%114 = load i32*, i32** %17
%115 = getelementptr inbounds i32, i32* %114, i64 4
store i32 %113, i32* %115
%116 = load i32*, i32** %19
%117 = load i32, i32* %27
%118 = mul nsw i32 %117, 66
%119 = add nsw i32 40, %118
%120 = load i32, i32* %26
%121 = add nsw i32 %119, %120
%122 = sext i32 %121 to i64
%123 = getelementptr inbounds i32, i32* %116, i64 %122
%124 = load i32, i32* %123
%125 = load i32*, i32** %17
%126 = getelementptr inbounds i32, i32* %125, i64 5
store i32 %124, i32* %126
%127 = load i32*, i32** %19
%128 = load i32, i32* %27
%129 = mul nsw i32 %128, 66
%130 = add nsw i32 48, %129
%131 = load i32, i32* %26
%132 = add nsw i32 %130, %131
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds i32, i32* %127, i64 %133
%135 = load i32, i32* %134
%136 = load i32*, i32** %17
%137 = getelementptr inbounds i32, i32* %136, i64 6
store i32 %135, i32* %137
%138 = load i32*, i32** %19
%139 = load i32, i32* %27
%140 = mul nsw i32 %139, 66
%141 = add nsw i32 56, %140
%142 = load i32, i32* %26
%143 = add nsw i32 %141, %142
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i32, i32* %138, i64 %144
%146 = load i32, i32* %145
%147 = load i32*, i32** %17
%148 = getelementptr inbounds i32, i32* %147, i64 7
store i32 %146, i32* %148
br label %149
149: ; preds = %56
store i32 0, i32* %28
br label %150
150: ; preds = %166, %149
%151 = load i32, i32* %28
%152 = icmp slt i32 %151, 8
br i1 %152, label %153, label %169
153: ; preds = %150
%154 = load i32*, i32** %17
%155 = load i32, i32* %28
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds i32, i32* %154, i64 %156
%158 = load i32, i32* %157
%159 = load i32*, i32** %15
%160 = load i32, i32* %25
%161 = mul nsw i32 %160, 8
%162 = load i32, i32* %28
%163 = add nsw i32 %161, %162
%164 = sext i32 %163 to i64
%165 = getelementptr inbounds i32, i32* %159, i64 %164
store i32 %158, i32* %165
br label %166
166: ; preds = %153
%167 = load i32, i32* %28
%168 = add nsw i32 %167, 1
store i32 %168, i32* %28
br label %150
169: ; preds = %150
br label %170
170: ; preds = %169
%171 = load i32, i32* %25
%172 = add nsw i32 %171, 1
store i32 %172, i32* %25
br label %32
173: ; preds = %32
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
}