1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-apple-ios -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; The main purpose of this test is to find out whether copyPhysReg can deal with 4*9880d681SAndroid Build Coastguard Worker; the memmove-like situation arising in tuples, where an early copy can clobber 5*9880d681SAndroid Build Coastguard Worker; the value needed by a later one if the tuples overlap. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; We use dummy inline asm to force LLVM to generate a COPY between the registers 8*9880d681SAndroid Build Coastguard Worker; we want by clobbering all the others. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine void @test_D1D2_from_D0D1(i8* %addr) #0 { 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D1D2_from_D0D1: 12*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v2, v1 13*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v1, v0 14*9880d681SAndroid Build Coastguard Workerentry: 15*9880d681SAndroid Build Coastguard Worker %addr_v8i8 = bitcast i8* %addr to <8 x i8>* 16*9880d681SAndroid Build Coastguard Worker %vec = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>* %addr_v8i8) 17*9880d681SAndroid Build Coastguard Worker %vec0 = extractvalue { <8 x i8>, <8 x i8> } %vec, 0 18*9880d681SAndroid Build Coastguard Worker %vec1 = extractvalue { <8 x i8>, <8 x i8> } %vec, 1 19*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 20*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr) 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v0},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 23*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr) 24*9880d681SAndroid Build Coastguard Worker ret void 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine void @test_D0D1_from_D1D2(i8* %addr) #0 { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D0D1_from_D1D2: 29*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v0, v1 30*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v1, v2 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker %addr_v8i8 = bitcast i8* %addr to <8 x i8>* 33*9880d681SAndroid Build Coastguard Worker %vec = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>* %addr_v8i8) 34*9880d681SAndroid Build Coastguard Worker %vec0 = extractvalue { <8 x i8>, <8 x i8> } %vec, 0 35*9880d681SAndroid Build Coastguard Worker %vec1 = extractvalue { <8 x i8>, <8 x i8> } %vec, 1 36*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v0},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 37*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr) 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 40*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr) 41*9880d681SAndroid Build Coastguard Worker ret void 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine void @test_D0D1_from_D31D0(i8* %addr) #0 { 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D0D1_from_D31D0: 46*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v1, v0 47*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v0, v31 48*9880d681SAndroid Build Coastguard Workerentry: 49*9880d681SAndroid Build Coastguard Worker %addr_v8i8 = bitcast i8* %addr to <8 x i8>* 50*9880d681SAndroid Build Coastguard Worker %vec = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>* %addr_v8i8) 51*9880d681SAndroid Build Coastguard Worker %vec0 = extractvalue { <8 x i8>, <8 x i8> } %vec, 0 52*9880d681SAndroid Build Coastguard Worker %vec1 = extractvalue { <8 x i8>, <8 x i8> } %vec, 1 53*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30}"() 54*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr) 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 57*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr) 58*9880d681SAndroid Build Coastguard Worker ret void 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine void @test_D31D0_from_D0D1(i8* %addr) #0 { 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D31D0_from_D0D1: 63*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v31, v0 64*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v0, v1 65*9880d681SAndroid Build Coastguard Workerentry: 66*9880d681SAndroid Build Coastguard Worker %addr_v8i8 = bitcast i8* %addr to <8 x i8>* 67*9880d681SAndroid Build Coastguard Worker %vec = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>* %addr_v8i8) 68*9880d681SAndroid Build Coastguard Worker %vec0 = extractvalue { <8 x i8>, <8 x i8> } %vec, 0 69*9880d681SAndroid Build Coastguard Worker %vec1 = extractvalue { <8 x i8>, <8 x i8> } %vec, 1 70*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 71*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr) 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30}"() 74*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr) 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine void @test_D2D3D4_from_D0D1D2(i8* %addr) #0 { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D2D3D4_from_D0D1D2: 80*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v4, v2 81*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v3, v1 82*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v2, v0 83*9880d681SAndroid Build Coastguard Workerentry: 84*9880d681SAndroid Build Coastguard Worker %addr_v8i8 = bitcast i8* %addr to <8 x i8>* 85*9880d681SAndroid Build Coastguard Worker %vec = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0v8i8(<8 x i8>* %addr_v8i8) 86*9880d681SAndroid Build Coastguard Worker %vec0 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vec, 0 87*9880d681SAndroid Build Coastguard Worker %vec1 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vec, 1 88*9880d681SAndroid Build Coastguard Worker %vec2 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vec, 2 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 91*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st3.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, i8* %addr) 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v0},~{v1},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 94*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st3.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, i8* %addr) 95*9880d681SAndroid Build Coastguard Worker ret void 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine void @test_Q0Q1Q2_from_Q1Q2Q3(i8* %addr) #0 { 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_Q0Q1Q2_from_Q1Q2Q3: 100*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v0, v1 101*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v1, v2 102*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v2, v3 103*9880d681SAndroid Build Coastguard Workerentry: 104*9880d681SAndroid Build Coastguard Worker %addr_v16i8 = bitcast i8* %addr to <16 x i8>* 105*9880d681SAndroid Build Coastguard Worker %vec = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0v16i8(<16 x i8>* %addr_v16i8) 106*9880d681SAndroid Build Coastguard Worker %vec0 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vec, 0 107*9880d681SAndroid Build Coastguard Worker %vec1 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vec, 1 108*9880d681SAndroid Build Coastguard Worker %vec2 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vec, 2 109*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v0},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 110*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st3.v16i8.p0i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, i8* %addr) 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 113*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st3.v16i8.p0i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, i8* %addr) 114*9880d681SAndroid Build Coastguard Worker ret void 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine void @test_Q1Q2Q3Q4_from_Q30Q31Q0Q1(i8* %addr) #0 { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_Q1Q2Q3Q4_from_Q30Q31Q0Q1: 119*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v4, v1 120*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v3, v0 121*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v2, v31 122*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v1, v30 123*9880d681SAndroid Build Coastguard Worker %addr_v16i8 = bitcast i8* %addr to <16 x i8>* 124*9880d681SAndroid Build Coastguard Worker %vec = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0v16i8(<16 x i8>* %addr_v16i8) 125*9880d681SAndroid Build Coastguard Worker %vec0 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vec, 0 126*9880d681SAndroid Build Coastguard Worker %vec1 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vec, 1 127*9880d681SAndroid Build Coastguard Worker %vec2 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vec, 2 128*9880d681SAndroid Build Coastguard Worker %vec3 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vec, 3 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29}"() 131*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st4.v16i8.p0i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, i8* %addr) 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "~{v0},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() 134*9880d681SAndroid Build Coastguard Worker tail call void @llvm.aarch64.neon.st4.v16i8.p0i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, i8* %addr) 135*9880d681SAndroid Build Coastguard Worker ret void 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdeclare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>*) 139*9880d681SAndroid Build Coastguard Workerdeclare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0v8i8(<8 x i8>*) 140*9880d681SAndroid Build Coastguard Workerdeclare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0v16i8(<16 x i8>*) 141*9880d681SAndroid Build Coastguard Workerdeclare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0v16i8(<16 x i8>*) 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8>, <8 x i8>, i8*) 144*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st3.v8i8.p0i8(<8 x i8>, <8 x i8>, <8 x i8>, i8*) 145*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st3.v16i8.p0i8(<16 x i8>, <16 x i8>, <16 x i8>, i8*) 146*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st4.v16i8.p0i8(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i8*) 147