brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.7 KiB · c0ff785 Raw
600 lines · c
1// RUN: %clang_cc1 -triple arm64-windows -Wno-implicit-function-declaration -fms-compatibility -emit-llvm -o - %s \2// RUN:    | FileCheck %s --check-prefix=CHECK-MSVC --check-prefix=CHECK-MSCOMPAT3 4// RUN: not %clang_cc1 -triple arm64-linux -Werror -S -o /dev/null %s 2>&1 \5// RUN:    | FileCheck %s -check-prefix CHECK-LINUX6 7// RUN: %clang_cc1 -triple arm64-darwin -Wno-implicit-function-declaration -fms-compatibility -emit-llvm -o - -DARM64_DARWIN %s \8// RUN:    | FileCheck %s -check-prefix CHECK-MSCOMPAT9 10// For some reason '_InterlockedAdd` on arm64-darwin takes an 'int*' rather than a 'long*'.11#ifdef ARM64_DARWIN12typedef int int32_t;13#else14typedef long int32_t;15#endif16 17long test_InterlockedAdd(int32_t volatile *Addend, long Value) {18  return _InterlockedAdd(Addend, Value);19}20 21long test_InterlockedAdd_constant(int32_t volatile *Addend) {22  return _InterlockedAdd(Addend, -1);23}24 25// CHECK-LABEL: define {{.*}} i32 @test_InterlockedAdd(ptr %Addend, i32 %Value) {{.*}} {26// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add ptr %1, i32 %2 seq_cst, align 427// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i32 %[[OLDVAL:[0-9]+]], %228// CHECK-MSVC: ret i32 %[[NEWVAL:[0-9]+]]29// CHECK-LINUX: error: call to undeclared function '_InterlockedAdd'30 31long test_InterlockedAdd_acq(int32_t volatile *Addend, long Value) {32  return _InterlockedAdd_acq(Addend, Value);33}34 35// CHECK-LABEL: define {{.*}} i32 @test_InterlockedAdd_acq(ptr %Addend, i32 %Value) {{.*}} {36// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add ptr %1, i32 %2 acquire, align 437// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i32 %[[OLDVAL:[0-9]+]], %238// CHECK-MSVC: ret i32 %[[NEWVAL:[0-9]+]]39// CHECK-LINUX: error: call to undeclared function '_InterlockedAdd_acq'40 41long test_InterlockedAdd_nf(int32_t volatile *Addend, long Value) {42  return _InterlockedAdd_nf(Addend, Value);43}44 45// CHECK-LABEL: define {{.*}} i32 @test_InterlockedAdd_nf(ptr %Addend, i32 %Value) {{.*}} {46// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add ptr %1, i32 %2 monotonic, align 447// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i32 %[[OLDVAL:[0-9]+]], %248// CHECK-MSVC: ret i32 %[[NEWVAL:[0-9]+]]49// CHECK-LINUX: error: call to undeclared function '_InterlockedAdd_nf'50 51long test_InterlockedAdd_rel(int32_t volatile *Addend, long Value) {52  return _InterlockedAdd_rel(Addend, Value);53}54 55// CHECK-LABEL: define {{.*}} i32 @test_InterlockedAdd_rel(ptr %Addend, i32 %Value) {{.*}} {56// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add ptr %1, i32 %2 release, align 457// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i32 %[[OLDVAL:[0-9]+]], %258// CHECK-MSVC: ret i32 %[[NEWVAL:[0-9]+]]59// CHECK-LINUX: error: call to undeclared function '_InterlockedAdd_rel'60 61__int64 test_InterlockedAdd64(__int64 volatile *Addend, __int64 Value) {62  return _InterlockedAdd64(Addend, Value);63}64 65__int64 test_InterlockedAdd64_constant(__int64 volatile *Addend) {66  return _InterlockedAdd64(Addend, -1);67}68 69// CHECK-LABEL: define {{.*}} i64 @test_InterlockedAdd64(ptr %Addend, i64 %Value) {{.*}} {70// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add ptr %1, i64 %2 seq_cst, align 871// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i64 %[[OLDVAL:[0-9]+]], %272// CHECK-MSVC: ret i64 %[[NEWVAL:[0-9]+]]73// CHECK-LINUX: error: call to undeclared function '_InterlockedAdd64'74 75__int64 test_InterlockedAdd64_acq(__int64 volatile *Addend, __int64 Value) {76  return _InterlockedAdd64_acq(Addend, Value);77}78 79// CHECK-LABEL: define {{.*}} i64 @test_InterlockedAdd64_acq(ptr %Addend, i64 %Value) {{.*}} {80// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add ptr %1, i64 %2 acquire, align 881// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i64 %[[OLDVAL:[0-9]+]], %282// CHECK-MSVC: ret i64 %[[NEWVAL:[0-9]+]]83// CHECK-LINUX: error: call to undeclared function '_InterlockedAdd64_acq'84 85__int64 test_InterlockedAdd64_nf(__int64 volatile *Addend, __int64 Value) {86  return _InterlockedAdd64_nf(Addend, Value);87}88 89// CHECK-LABEL: define {{.*}} i64 @test_InterlockedAdd64_nf(ptr %Addend, i64 %Value) {{.*}} {90// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add ptr %1, i64 %2 monotonic, align 891// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i64 %[[OLDVAL:[0-9]+]], %292// CHECK-MSVC: ret i64 %[[NEWVAL:[0-9]+]]93// CHECK-LINUX: error: call to undeclared function '_InterlockedAdd64_nf'94 95__int64 test_InterlockedAdd64_rel(__int64 volatile *Addend, __int64 Value) {96  return _InterlockedAdd64_rel(Addend, Value);97}98 99// CHECK-LABEL: define {{.*}} i64 @test_InterlockedAdd64_rel(ptr %Addend, i64 %Value) {{.*}} {100// CHECK-MSVC: %[[OLDVAL:[0-9]+]] = atomicrmw add ptr %1, i64 %2 release, align 8101// CHECK-MSVC: %[[NEWVAL:[0-9]+]] = add i64 %[[OLDVAL:[0-9]+]], %2102// CHECK-MSVC: ret i64 %[[NEWVAL:[0-9]+]]103// CHECK-LINUX: error: call to undeclared function '_InterlockedAdd64_rel'104 105void check_ReadWriteBarrier(void) {106  _ReadWriteBarrier();107}108 109// CHECK-MSVC: fence syncscope("singlethread")110// CHECK-LINUX: error: call to undeclared function '_ReadWriteBarrier'111 112long long check_mulh(long long a, long long b) {113  return __mulh(a, b);114}115 116// CHECK-MSVC: %[[ARG1:.*]] = sext i64 {{.*}} to i128117// CHECK-MSVC: %[[ARG2:.*]] = sext i64 {{.*}} to i128118// CHECK-MSVC: %[[PROD:.*]] = mul nsw i128 %[[ARG1]], %[[ARG2]]119// CHECK-MSVC: %[[HIGH:.*]] = ashr i128 %[[PROD]], 64120// CHECK-MSVC: %[[RES:.*]] = trunc i128 %[[HIGH]] to i64121// CHECK-LINUX: error: call to undeclared function '__mulh'122 123unsigned long long check_umulh(unsigned long long a, unsigned long long b) {124  return __umulh(a, b);125}126 127// CHECK-MSVC: %[[ARG1:.*]] = zext i64 {{.*}} to i128128// CHECK-MSVC: %[[ARG2:.*]] = zext i64 {{.*}} to i128129// CHECK-MSVC: %[[PROD:.*]] = mul nuw i128 %[[ARG1]], %[[ARG2]]130// CHECK-MSVC: %[[HIGH:.*]] = lshr i128 %[[PROD]], 64131// CHECK-MSVC: %[[RES:.*]] = trunc i128 %[[HIGH]] to i64132// CHECK-LINUX: error: call to undeclared function '__umulh'133 134void check__break() {135  __break(0);136}137 138// CHECK-MSVC: call void @llvm.aarch64.break(i32 0)139// CHECK-LINUX: error: call to undeclared function '__break'140 141void check__hlt() {142  __hlt(0);143  __hlt(1, 2, 3, 4, 5);144  int x = __hlt(0);145}146 147// CHECK-MSVC: call void @llvm.aarch64.hlt(i32 0)148// CHECK-LINUX: error: call to undeclared function '__hlt'149 150unsigned __int64 check__getReg(void) {151  unsigned volatile __int64 reg;152  reg = __getReg(18);153  reg = __getReg(31);154  return reg;155}156 157// CHECK-MSCOMPAT: call i64 @llvm.read_register.i64(metadata ![[MD2:.*]])158// CHECK-MSCOMPAT: call i64 @llvm.read_register.i64(metadata ![[MD3:.*]])159 160#ifdef __LP64__161#define LONG __int32162#else163#define LONG long164#endif165 166#ifdef __LP64__167void check__writex18byte(unsigned char data, unsigned LONG offset) {168#else169void check__writex18byte(unsigned LONG offset, unsigned char data) {170#endif171  __writex18byte(offset, data);172}173 174// CHECK-MSCOMPAT: %[[DATA_ADDR:.*]] = alloca i8, align 1175// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4176// CHECK-MSCOMPAT: store i8 %data, ptr %[[DATA_ADDR]], align 1177// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4178// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4179// CHECK-MSCOMPAT: %[[DATA:.*]] = load i8, ptr %[[DATA_ADDR]], align 1180// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])181// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr182// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64183// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]184// CHECK-MSCOMPAT: store i8 %[[DATA]], ptr %[[PTR]], align 1185 186#ifdef __LP64__187void check__writex18word(unsigned short data, unsigned LONG offset) {188#else189void check__writex18word(unsigned LONG offset, unsigned short data) {190#endif191  __writex18word(offset, data);192}193 194// CHECK-MSCOMPAT: %[[DATA_ADDR:.*]] = alloca i16, align 2195// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4196// CHECK-MSCOMPAT: store i16 %data, ptr %[[DATA_ADDR]], align 2197// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4198// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4199// CHECK-MSCOMPAT: %[[DATA:.*]] = load i16, ptr %[[DATA_ADDR]], align 2200// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])201// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr202// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64203// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]204// CHECK-MSCOMPAT: store i16 %[[DATA]], ptr %[[PTR]], align 1205 206#ifdef __LP64__207void check__writex18dword(unsigned LONG data, unsigned LONG offset) {208#else209void check__writex18dword(unsigned LONG offset, unsigned LONG data) {210#endif211  __writex18dword(offset, data);212}213 214// CHECK-MSCOMPAT: %[[DATA_ADDR:.*]] = alloca i32, align 4215// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4216// CHECK-MSCOMPAT: store i32 %data, ptr %[[DATA_ADDR]], align 4217// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4218// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4219// CHECK-MSCOMPAT: %[[DATA:.*]] = load i32, ptr %[[DATA_ADDR]], align 4220// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])221// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr222// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64223// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]224// CHECK-MSCOMPAT: store i32 %[[DATA]], ptr %[[PTR]], align 1225 226#ifdef __LP64__227void check__writex18qword(unsigned __int64 data, unsigned LONG offset) {228#else229void check__writex18qword(unsigned LONG offset, unsigned __int64 data) {230#endif231  __writex18qword(offset, data);232}233 234// CHECK-MSCOMPAT: %[[DATA_ADDR:.*]] = alloca i64, align 8235// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4236// CHECK-MSCOMPAT: store i64 %data, ptr %[[DATA_ADDR]], align 8237// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4238// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4239// CHECK-MSCOMPAT: %[[DATA:.*]] = load i64, ptr %[[DATA_ADDR]], align 8240// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])241// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr242// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64243// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]244// CHECK-MSCOMPAT: store i64 %[[DATA]], ptr %[[PTR]], align 1245 246unsigned char check__readx18byte(unsigned LONG offset) {247  return __readx18byte(offset);248}249 250// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4251// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4252// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4253// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])254// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr255// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64256// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]257// CHECK-MSCOMPAT: %[[RETVAL:.*]] = load i8, ptr %[[PTR]], align 1258// CHECK-MSCOMPAT: ret i8 %[[RETVAL]]259 260unsigned short check__readx18word(unsigned LONG offset) {261  return __readx18word(offset);262}263 264// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4265// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4266// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4267// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])268// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr269// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64270// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]271// CHECK-MSCOMPAT: %[[RETVAL:.*]] = load i16, ptr %[[PTR]], align 1272// CHECK-MSCOMPAT: ret i16 %[[RETVAL]]273 274unsigned LONG check__readx18dword(unsigned LONG offset) {275  return __readx18dword(offset);276}277 278// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4279// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4280// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4281// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])282// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr283// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64284// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]285// CHECK-MSCOMPAT: %[[RETVAL:.*]] = load i32, ptr %[[PTR]], align 1286// CHECK-MSCOMPAT: ret i32 %[[RETVAL]]287 288unsigned __int64 check__readx18qword(unsigned LONG offset) {289  return __readx18qword(offset);290}291 292// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4293// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4294// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4295// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])296// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr297// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64298// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]299// CHECK-MSCOMPAT: %[[RETVAL:.*]] = load i64, ptr %[[PTR]], align 1300// CHECK-MSCOMPAT: ret i64 %[[RETVAL]]301 302#ifdef __LP64__303void check__addx18byte(unsigned char data, unsigned LONG offset) {304#else305void check__addx18byte(unsigned LONG offset, unsigned char data) {306#endif307  __addx18byte(offset, data);308}309 310// CHECK-MSCOMPAT: %[[DATA_ADDR:.*]] = alloca i8, align 1311// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4312// CHECK-MSCOMPAT: store i8 %data, ptr %[[DATA_ADDR]], align 1313// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4314// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4315// CHECK-MSCOMPAT: %[[DATA:.*]] = load i8, ptr %[[DATA_ADDR]], align 1316// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])317// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr318// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64319// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]320// CHECK-MSCOMPAT: %[[ORIG_VAL:.*]] = load i8, ptr %[[PTR]], align 1321// CHECK-MSCOMPAT: %[[SUM:.*]] = add i8 %[[ORIG_VAL]], %[[DATA]]322// CHECK-MSCOMPAT: store i8 %[[SUM]], ptr %[[PTR]], align 1323 324#ifdef __LP64__325void check__addx18word(unsigned short data, unsigned LONG offset) {326#else327void check__addx18word(unsigned LONG offset, unsigned short data) {328#endif329  __addx18word(offset, data);330}331 332// CHECK-MSCOMPAT: %[[DATA_ADDR:.*]] = alloca i16, align 2333// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4334// CHECK-MSCOMPAT: store i16 %data, ptr %[[DATA_ADDR]], align 2335// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4336// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4337// CHECK-MSCOMPAT: %[[DATA:.*]] = load i16, ptr %[[DATA_ADDR]], align 2338// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])339// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr340// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64341// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]342// CHECK-MSCOMPAT: %[[ORIG_VAL:.*]] = load i16, ptr %[[PTR]], align 1343// CHECK-MSCOMPAT: %[[SUM:.*]] = add i16 %[[ORIG_VAL]], %[[DATA]]344// CHECK-MSCOMPAT: store i16 %[[SUM]], ptr %[[PTR]], align 1345 346#ifdef __LP64__347void check__addx18dword(unsigned LONG data, unsigned LONG offset) {348#else349void check__addx18dword(unsigned LONG offset, unsigned LONG data) {350#endif351  __addx18dword(offset, data);352}353 354// CHECK-MSCOMPAT: %[[DATA_ADDR:.*]] = alloca i32, align 4355// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4356// CHECK-MSCOMPAT: store i32 %data, ptr %[[DATA_ADDR]], align 4357// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4358// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4359// CHECK-MSCOMPAT: %[[DATA:.*]] = load i32, ptr %[[DATA_ADDR]], align 4360// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])361// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr362// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64363// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]364// CHECK-MSCOMPAT: %[[ORIG_VAL:.*]] = load i32, ptr %[[PTR]], align 1365// CHECK-MSCOMPAT: %[[SUM:.*]] = add i32 %[[ORIG_VAL]], %[[DATA]]366// CHECK-MSCOMPAT: store i32 %[[SUM]], ptr %[[PTR]], align 1367 368#ifdef __LP64__369void check__addx18qword(unsigned __int64 data, unsigned LONG offset) {370#else371void check__addx18qword(unsigned LONG offset, unsigned __int64 data) {372#endif373  __addx18qword(offset, data);374}375 376// CHECK-MSCOMPAT: %[[DATA_ADDR:.*]] = alloca i64, align 8377// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4378// CHECK-MSCOMPAT: store i64 %data, ptr %[[DATA_ADDR]], align 8379// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4380// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4381// CHECK-MSCOMPAT: %[[DATA:.*]] = load i64, ptr %[[DATA_ADDR]], align 8382// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])383// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr384// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64385// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]386// CHECK-MSCOMPAT: %[[ORIG_VAL:.*]] = load i64, ptr %[[PTR]], align 1387// CHECK-MSCOMPAT: %[[SUM:.*]] = add i64 %[[ORIG_VAL]], %[[DATA]]388// CHECK-MSCOMPAT: store i64 %[[SUM]], ptr %[[PTR]], align 1389 390void check__incx18byte(unsigned LONG offset) {391  __incx18byte(offset);392}393 394// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4395// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4396// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4397// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])398// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr399// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64400// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]401// CHECK-MSCOMPAT: %[[ORIG_VAL:.*]] = load i8, ptr %[[PTR]], align 1402// CHECK-MSCOMPAT: %[[SUM:.*]] = add i8 %[[ORIG_VAL]], 1403// CHECK-MSCOMPAT: store i8 %[[SUM]], ptr %[[PTR]], align 1404 405void check__incx18word(unsigned LONG offset) {406  __incx18word(offset);407}408 409// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4410// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4411// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4412// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])413// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr414// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64415// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]416// CHECK-MSCOMPAT: %[[ORIG_VAL:.*]] = load i16, ptr %[[PTR]], align 1417// CHECK-MSCOMPAT: %[[SUM:.*]] = add i16 %[[ORIG_VAL]], 1418// CHECK-MSCOMPAT: store i16 %[[SUM]], ptr %[[PTR]], align 1419 420void check__incx18dword(unsigned LONG offset) {421  __incx18dword(offset);422}423 424// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4425// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4426// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4427// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])428// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr429// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64430// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]431// CHECK-MSCOMPAT: %[[ORIG_VAL:.*]] = load i32, ptr %[[PTR]], align 1432// CHECK-MSCOMPAT: %[[SUM:.*]] = add i32 %[[ORIG_VAL]], 1433// CHECK-MSCOMPAT: store i32 %[[SUM]], ptr %[[PTR]], align 1434 435void check__incx18qword(unsigned LONG offset) {436  __incx18qword(offset);437}438 439// CHECK-MSCOMPAT: %[[OFFSET_ADDR:.*]] = alloca i32, align 4440// CHECK-MSCOMPAT: store i32 %offset, ptr %[[OFFSET_ADDR]], align 4441// CHECK-MSCOMPAT: %[[OFFSET:.*]] = load i32, ptr %[[OFFSET_ADDR]], align 4442// CHECK-MSCOMPAT: %[[X18:.*]] = call i64 @llvm.read_register.i64(metadata ![[MD2]])443// CHECK-MSCOMPAT: %[[X18_AS_PTR:.*]] = inttoptr i64 %[[X18]] to ptr444// CHECK-MSCOMPAT: %[[ZEXT_OFFSET:.*]] = zext i32 %[[OFFSET]] to i64445// CHECK-MSCOMPAT: %[[PTR:.*]] = getelementptr i8, ptr %[[X18_AS_PTR]], i64 %[[ZEXT_OFFSET]]446// CHECK-MSCOMPAT: %[[ORIG_VAL:.*]] = load i64, ptr %[[PTR]], align 1447// CHECK-MSCOMPAT: %[[SUM:.*]] = add i64 %[[ORIG_VAL]], 1448// CHECK-MSCOMPAT: store i64 %[[SUM]], ptr %[[PTR]], align 1449 450double check__CopyDoubleFromInt64(__int64 arg1) {451  return _CopyDoubleFromInt64(arg1);452}453 454// CHECK-MSCOMPAT: %[[ARG:.*]].addr = alloca i64, align 8455// CHECK-MSCOMPAT: store i64 %[[ARG]], ptr %[[ARG]].addr, align 8456// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i64, ptr %[[ARG]].addr, align 8457// CHECK-MSCOMPAT: %[[VAR1:.*]] = bitcast i64 %[[VAR0]] to double458// CHECK-MSCOMPAT: ret double %[[VAR1]]459// CHECK-LINUX: error: call to undeclared function '_CopyDoubleFromInt64'460 461float check__CopyFloatFromInt32(__int32 arg1) {462  return _CopyFloatFromInt32(arg1);463}464 465// CHECK-MSCOMPAT: %[[ARG:.*]].addr = alloca i32, align 4466// CHECK-MSCOMPAT: store i32 %[[ARG]], ptr %[[ARG]].addr, align 4467// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i32, ptr %[[ARG]].addr, align 4468// CHECK-MSCOMPAT: %[[VAR1:.*]] = bitcast i32 %[[VAR0]] to float469// CHECK-MSCOMPAT: ret float %[[VAR1]]470// CHECK-LINUX: error: call to undeclared function '_CopyFloatFromInt32'471 472__int32 check__CopyInt32FromFloat(float arg1) {473  return _CopyInt32FromFloat(arg1);474}475 476// CHECK-MSCOMPAT: %[[ARG:.*]].addr = alloca float, align 4477// CHECK-MSCOMPAT: store float %[[ARG]], ptr %[[ARG]].addr, align 4478// CHECK-MSCOMPAT: %[[VAR0:.*]] = load float, ptr %[[ARG]].addr, align 4479// CHECK-MSCOMPAT: %[[VAR1:.*]] = bitcast float %[[VAR0]] to i32480// CHECK-MSCOMPAT: ret i32 %[[VAR1]]481// CHECK-LINUX: error: call to undeclared function '_CopyInt32FromFloat'482 483__int64 check__CopyInt64FromDouble(double arg1) {484  return _CopyInt64FromDouble(arg1);485}486 487// CHECK-MSCOMPAT: %[[ARG:.*]].addr = alloca double, align 8488// CHECK-MSCOMPAT: store double %[[ARG]], ptr %[[ARG]].addr, align 8489// CHECK-MSCOMPAT: %[[VAR0:.*]] = load double, ptr %[[ARG]].addr, align 8490// CHECK-MSCOMPAT: %[[VAR1:.*]] = bitcast double %[[VAR0]] to i64491// CHECK-MSCOMPAT: ret i64 %[[VAR1]]492// CHECK-LINUX: error: call to undeclared function '_CopyInt64FromDouble'493 494unsigned int check__CountLeadingOnes(unsigned LONG arg1) {495  return _CountLeadingOnes(arg1);496}497 498// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca i32, align 4499// CHECK-MSCOMPAT: store i32 %[[ARG1]], ptr %[[ARG1]].addr, align 4500// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i32, ptr %[[ARG1]].addr, align 4501// CHECK-MSCOMPAT: %[[VAR1:.*]] = xor i32 %[[VAR0]], -1502// CHECK-MSCOMPAT: %[[VAR2:.*]] = call i32 @llvm.ctlz.i32(i32 %1, i1 false)503// CHECK-MSCOMPAT: ret i32 %[[VAR2]]504// CHECK-LINUX: error: call to undeclared function '_CountLeadingOnes'505 506unsigned int check__CountLeadingOnes64(unsigned __int64 arg1) {507  return _CountLeadingOnes64(arg1);508}509 510// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca i64, align 8511// CHECK-MSCOMPAT: store i64 %[[ARG1]], ptr %[[ARG1]].addr, align 8512// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i64, ptr %[[ARG1]].addr, align 8513// CHECK-MSCOMPAT: %[[VAR1:.*]] = xor i64 %[[VAR0]], -1514// CHECK-MSCOMPAT: %[[VAR2:.*]] = call i64 @llvm.ctlz.i64(i64 %1, i1 false)515// CHECK-MSCOMPAT: %[[VAR3:.*]] = trunc i64 %2 to i32516// CHECK-MSCOMPAT: ret i32 %[[VAR3]]517// CHECK-LINUX: error: call to undeclared function '_CountLeadingOnes64'518 519unsigned int check__CountLeadingSigns(__int32 arg1) {520  return _CountLeadingSigns(arg1);521}522 523// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca i32, align 4524// CHECK-MSCOMPAT: store i32 %[[ARG1]], ptr %[[ARG1]].addr, align 4525// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i32, ptr %[[ARG1]].addr, align 4526// CHECK-MSCOMPAT: %[[CLS:.*]] = call i32 @llvm.aarch64.cls(i32 %[[VAR0]])527// CHECK-MSCOMPAT: ret i32 %[[CLS]]528// CHECK-LINUX: error: call to undeclared function '_CountLeadingSigns'529 530unsigned int check__CountLeadingSigns64(__int64 arg1) {531  return _CountLeadingSigns64(arg1);532}533 534// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca i64, align 8535// CHECK-MSCOMPAT: store i64 %[[ARG1]], ptr %[[ARG1]].addr, align 8536// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i64, ptr %[[ARG1]].addr, align 8537// CHECK-MSCOMPAT: %[[CLS:.*]] = call i32 @llvm.aarch64.cls64(i64 %[[VAR0]])538// CHECK-MSCOMPAT: ret i32 %[[CLS]]539// CHECK-LINUX: error: call to undeclared function '_CountLeadingSigns64'540 541unsigned int check__CountLeadingZeros(__int32 arg1) {542  return _CountLeadingZeros(arg1);543}544 545// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca i32, align 4546// CHECK-MSCOMPAT: store i32 %[[ARG1]], ptr %[[ARG1]].addr, align 4547// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i32, ptr %[[ARG1]].addr, align 4548// CHECK-MSCOMPAT: %[[VAR1:.*]] = call i32 @llvm.ctlz.i32(i32 %[[VAR0]], i1 false)549// CHECK-MSCOMPAT: ret i32 %[[VAR1]]550// CHECK-LINUX: error: call to undeclared function '_CountLeadingZeros'551 552unsigned int check__CountLeadingZeros64(__int64 arg1) {553  return _CountLeadingZeros64(arg1);554}555 556// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca i64, align 8557// CHECK-MSCOMPAT: store i64 %[[ARG1]], ptr %[[ARG1]].addr, align 8558// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i64, ptr %[[ARG1]].addr, align 8559// CHECK-MSCOMPAT: %[[VAR1:.*]] = call i64 @llvm.ctlz.i64(i64 %[[VAR0]], i1 false)560// CHECK-MSCOMPAT: %[[VAR2:.*]] = trunc i64 %[[VAR1]] to i32561// CHECK-MSCOMPAT: ret i32 %[[VAR2]]562// CHECK-LINUX: error: call to undeclared function '_CountLeadingZeros64'563 564unsigned int check_CountOneBits(unsigned LONG arg1) {565  return _CountOneBits(arg1);566}567 568// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca i32, align 4569// CHECK-MSCOMPAT: store i32 %[[ARG1]], ptr %[[ARG1]].addr, align 4570// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i32, ptr %[[ARG1]].addr, align 4571// CHECK-MSCOMPAT: %[[VAR1:.*]] = call i32 @llvm.ctpop.i32(i32 %0)572// CHECK-MSCOMPAT: ret i32 %[[VAR1]]573// CHECK-LINUX: error: call to undeclared function '_CountOneBits'574 575unsigned int check_CountOneBits64(unsigned __int64 arg1) {576  return _CountOneBits64(arg1);577}578 579// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca i64, align 8580// CHECK-MSCOMPAT: store i64 %[[ARG1]], ptr %[[ARG1]].addr, align 8581// CHECK-MSCOMPAT: %[[VAR0:.*]] = load i64, ptr %[[ARG1]].addr, align 8582// CHECK-MSCOMPAT: %[[VAR1:.*]] = call i64 @llvm.ctpop.i64(i64 %0)583// CHECK-MSCOMPAT: %[[VAR2:.*]] = trunc i64 %1 to i32584// CHECK-MSCOMPAT: ret i32 %[[VAR2]]585// CHECK-LINUX: error: call to undeclared function '_CountOneBits64'586 587void check__prefetch(void *arg1) {588  return __prefetch(arg1);589}590 591// CHECK-MSCOMPAT: %[[ARG1:.*]].addr = alloca ptr, align 8592// CHECK-MSCOMPAT: store ptr %[[ARG1]], ptr %[[ARG1]].addr, align 8593// CHECK-MSCOMPAT: %[[VAR0:.*]] = load ptr, ptr %[[ARG1]].addr, align 8594// CHECK-MSCOMPAT: call void @llvm.prefetch.p0(ptr %[[VAR0]], i32 0, i32 3, i32 1)595// CHECK-MSCOMPAT: ret void596 597 598// CHECK-MSCOMPAT: ![[MD2]] = !{!"x18"}599// CHECK-MSCOMPAT: ![[MD3]] = !{!"sp"}600