1; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 <%s | FileCheck -check-prefix=CHECK-P9 %s 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 <%s | FileCheck -check-prefix=CHECK-P8 %s 3 4; As the constant could be represented as float, a float is 5; loaded from constant pool. 6define double @doubleConstant1() { 7 ret double 1.400000e+01 8 9; CHECK-LABEL: doubleConstant1: 10; CHECK-P9: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 11; CHECK-P9: lfs {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) 12; CHECK-P8: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 13; CHECK-P8: lfs {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) 14} 15 16; As the constant couldn't be represented as float, a double is 17; loaded from constant pool. 18define double @doubleConstant2() { 19 ret double 2.408904e+01 20 21; CHECK-LABEL: doubleConstant2: 22; CHECK-P9: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 23; CHECK-P9: lfd {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) 24; CHECK-P8: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 25; CHECK-P8: lfd {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) 26} 27 28@FArr = hidden local_unnamed_addr global [10 x float] zeroinitializer, align 4 29 30define float @floatConstantArray() local_unnamed_addr { 31 %1 = load float, float* getelementptr inbounds ([10 x float], [10 x float]* @FArr, i64 0, i64 3), align 4 32 %2 = fadd float %1, 0x400B333340000000 33 ret float %2 34 35; CHECK-LABEL: floatConstantArray 36; CHECK-P9: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha+[[REG2:[0-9]+]] 37; CHECK-P9: lfs {{[0-9]+}}, [[VAR]]@toc@l+[[REG2]]([[REG1]]) 38; CHECK-P8: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 39; CHECK-P8: addi [[REG2:[0-9]+]], [[REG1]], [[VAR]]@toc@l 40; CHECK-P8: lfs {{[0-9]+}}, 12([[REG2]]) 41} 42 43define float @floatConstant() { 44 ret float 0x400470A3E0000000 45 46; CHECK-LABEL: floatConstant: 47; CHECK-P9: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 48; CHECK-P9: lfs {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) 49; CHECK-P8: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 50; CHECK-P8: lfs {{[0-9]+}}, [[VAR]]@toc@l([[REG1]]) 51} 52 53; llvm put the hidden globals into the TOC table. 54; TODO - do some analysis and decide which globals could be put into TOC. 55@d = hidden local_unnamed_addr global [200 x double] zeroinitializer, align 8 56 57define double @doubleConstantArray() { 58 %1 = load double, double* getelementptr inbounds ([200 x double], [200 x double]* @d, i64 0, i64 3), align 8 59 %2 = fadd double %1, 6.880000e+00 60 ret double %2 61 62; CHECK-LABEL: doubleConstantArray 63; CHECK-P9: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha+[[REG2:[0-9]+]] 64; CHECK-P9: lfd {{[0-9]+}}, [[VAR]]@toc@l+[[REG2]]([[REG1]]) 65; CHECK-P8: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 66; CHECK-P8: addi [[REG2:[0-9]+]], [[REG1]], [[VAR]]@toc@l 67; CHECK-P8: lfd {{[0-9]+}}, 24([[REG2]]) 68} 69 70@arr = hidden local_unnamed_addr global [20000 x double] zeroinitializer, align 8 71 72define double @doubleLargeConstantArray() { 73 %1 = load double, double* getelementptr inbounds ([20000 x double], [20000 x double]* @arr, i64 0, i64 4096), align 8 74 %2 = fadd double %1, 6.880000e+00 75 ret double %2 76 77; Access an element with an offset that doesn't fit in the displacement field of LFD. 78; CHECK-LABEL: doubleLargeConstantArray 79; CHECK-P9: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 80; CHECK-P9: li [[REG2:[0-9]+]], 0 81; CHECK-P9: addi [[REG3:[0-9]+]], [[REG1]], [[VAR:[a-z0-9A-Z_.]+]]@toc@l 82; CHECK-P9: ori [[REG4:[0-9]+]], [[REG2]], 32768 83; CHECK-P9: lfdx {{[0-9]+}}, [[REG3]], [[REG4]] 84; CHECK-P8: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 85; CHECK-P8: li [[REG2:[0-9]+]], 0 86; CHECK-P8: addi [[REG3:[0-9]+]], [[REG1]], [[VAR:[a-z0-9A-Z_.]+]]@toc@l 87; CHECK-P8: ori [[REG4:[0-9]+]], [[REG2]], 32768 88; CHECK-P8: lfdx {{[0-9]+}}, [[REG3]], [[REG4]] 89} 90 91@vec_arr = global [10 x <4 x i32>] zeroinitializer, align 16 92 93define <4 x i32> @vectorArray() #0 { 94entry: 95 %0 = load <4 x i32>, <4 x i32>* getelementptr inbounds ([10 x <4 x i32>], [10 x <4 x i32>]* @vec_arr, i64 0, i64 2), align 16 96 ret <4 x i32> %0 97 98; CHECK-LABEL: vectorArray 99; CHECK-P9: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 100; CHECK-P9: ld [[REG2:[0-9]+]], [[VAR]]@toc@l([[REG1]]) 101; CHECK-P9: lxv {{[0-9]+}}, 32([[REG2]]) 102; CHECK-P8: addis [[REG1:[0-9]+]], 2, [[VAR:[a-z0-9A-Z_.]+]]@toc@ha 103; CHECK-P8: ld [[REG2:[0-9]+]], [[VAR]]@toc@l([[REG1]]) 104; CHECK-P8: addi [[REG3:[0-9]+]], [[REG2]], 32 105; CHECK-P8: lvx {{[0-9]+}}, 0, [[REG3]] 106} 107