Skip to content

Commit 7be57de

Browse files
[NVPTX] Add missing isel patterns for 64-bit atomics
llvm-svn: 211933
1 parent ca7a4f1 commit 7be57de

File tree

2 files changed

+239
-0
lines changed

2 files changed

+239
-0
lines changed

llvm/lib/Target/NVPTX/NVPTXIntrinsics.td

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,12 +1057,24 @@ def atomic_load_max_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
10571057
(atomic_load_max_32 node:$a, node:$b)>;
10581058
def atomic_load_max_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
10591059
(atomic_load_max_32 node:$a, node:$b)>;
1060+
def atomic_load_max_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b)
1061+
, (atomic_load_max_64 node:$a, node:$b)>;
1062+
def atomic_load_max_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
1063+
(atomic_load_max_64 node:$a, node:$b)>;
1064+
def atomic_load_max_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
1065+
(atomic_load_max_64 node:$a, node:$b)>;
10601066
def atomic_load_umax_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
10611067
(atomic_load_umax_32 node:$a, node:$b)>;
10621068
def atomic_load_umax_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
10631069
(atomic_load_umax_32 node:$a, node:$b)>;
10641070
def atomic_load_umax_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
10651071
(atomic_load_umax_32 node:$a, node:$b)>;
1072+
def atomic_load_umax_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
1073+
(atomic_load_umax_64 node:$a, node:$b)>;
1074+
def atomic_load_umax_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
1075+
(atomic_load_umax_64 node:$a, node:$b)>;
1076+
def atomic_load_umax_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
1077+
(atomic_load_umax_64 node:$a, node:$b)>;
10661078

10671079
defm INT_PTX_ATOM_LOAD_MAX_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".s32",
10681080
".max", atomic_load_max_32_g, i32imm, imm, hasAtomRedG32>;
@@ -1072,6 +1084,14 @@ defm INT_PTX_ATOM_LOAD_MAX_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".s32", ".max",
10721084
atomic_load_max_32_gen, i32imm, imm, hasAtomRedGen32>;
10731085
defm INT_PTX_ATOM_LOAD_MAX_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global",
10741086
".s32", ".max", atomic_load_max_32_gen, i32imm, imm, useAtomRedG32forGen32>;
1087+
defm INT_PTX_ATOM_LOAD_MAX_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".s64",
1088+
".max", atomic_load_max_64_g, i64imm, imm, hasAtomRedG64>;
1089+
defm INT_PTX_ATOM_LOAD_MAX_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".s64",
1090+
".max", atomic_load_max_64_s, i64imm, imm, hasAtomRedS64>;
1091+
defm INT_PTX_ATOM_LOAD_MAX_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".s64", ".max",
1092+
atomic_load_max_64_gen, i64imm, imm, hasAtomRedGen64>;
1093+
defm INT_PTX_ATOM_LOAD_MAX_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global",
1094+
".s64", ".max", atomic_load_max_64_gen, i64imm, imm, useAtomRedG64forGen64>;
10751095
defm INT_PTX_ATOM_LOAD_UMAX_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32",
10761096
".max", atomic_load_umax_32_g, i32imm, imm, hasAtomRedG32>;
10771097
defm INT_PTX_ATOM_LOAD_UMAX_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32",
@@ -1080,6 +1100,14 @@ defm INT_PTX_ATOM_LOAD_UMAX_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".max",
10801100
atomic_load_umax_32_gen, i32imm, imm, hasAtomRedGen32>;
10811101
defm INT_PTX_ATOM_LOAD_UMAX_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global",
10821102
".u32", ".max", atomic_load_umax_32_gen, i32imm, imm, useAtomRedG32forGen32>;
1103+
defm INT_PTX_ATOM_LOAD_UMAX_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".u64",
1104+
".max", atomic_load_umax_64_g, i64imm, imm, hasAtomRedG64>;
1105+
defm INT_PTX_ATOM_LOAD_UMAX_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".u64",
1106+
".max", atomic_load_umax_64_s, i64imm, imm, hasAtomRedS64>;
1107+
defm INT_PTX_ATOM_LOAD_UMAX_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".u64", ".max",
1108+
atomic_load_umax_64_gen, i64imm, imm, hasAtomRedGen64>;
1109+
defm INT_PTX_ATOM_LOAD_UMAX_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global",
1110+
".u64", ".max", atomic_load_umax_64_gen, i64imm, imm, useAtomRedG64forGen64>;
10831111

10841112
// atom_min
10851113

@@ -1089,12 +1117,24 @@ def atomic_load_min_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
10891117
(atomic_load_min_32 node:$a, node:$b)>;
10901118
def atomic_load_min_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
10911119
(atomic_load_min_32 node:$a, node:$b)>;
1120+
def atomic_load_min_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
1121+
(atomic_load_min_64 node:$a, node:$b)>;
1122+
def atomic_load_min_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
1123+
(atomic_load_min_64 node:$a, node:$b)>;
1124+
def atomic_load_min_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
1125+
(atomic_load_min_64 node:$a, node:$b)>;
10921126
def atomic_load_umin_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
10931127
(atomic_load_umin_32 node:$a, node:$b)>;
10941128
def atomic_load_umin_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
10951129
(atomic_load_umin_32 node:$a, node:$b)>;
10961130
def atomic_load_umin_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
10971131
(atomic_load_umin_32 node:$a, node:$b)>;
1132+
def atomic_load_umin_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
1133+
(atomic_load_umin_64 node:$a, node:$b)>;
1134+
def atomic_load_umin_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
1135+
(atomic_load_umin_64 node:$a, node:$b)>;
1136+
def atomic_load_umin_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
1137+
(atomic_load_umin_64 node:$a, node:$b)>;
10981138

10991139
defm INT_PTX_ATOM_LOAD_MIN_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".s32",
11001140
".min", atomic_load_min_32_g, i32imm, imm, hasAtomRedG32>;
@@ -1104,6 +1144,14 @@ defm INT_PTX_ATOM_LOAD_MIN_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".s32", ".min",
11041144
atomic_load_min_32_gen, i32imm, imm, hasAtomRedGen32>;
11051145
defm INT_PTX_ATOM_LOAD_MIN_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global",
11061146
".s32", ".min", atomic_load_min_32_gen, i32imm, imm, useAtomRedG32forGen32>;
1147+
defm INT_PTX_ATOM_LOAD_MIN_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".s64",
1148+
".min", atomic_load_min_64_g, i64imm, imm, hasAtomRedG64>;
1149+
defm INT_PTX_ATOM_LOAD_MIN_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".s64",
1150+
".min", atomic_load_min_64_s, i64imm, imm, hasAtomRedS64>;
1151+
defm INT_PTX_ATOM_LOAD_MIN_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".s64", ".min",
1152+
atomic_load_min_64_gen, i64imm, imm, hasAtomRedGen64>;
1153+
defm INT_PTX_ATOM_LOAD_MIN_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global",
1154+
".s64", ".min", atomic_load_min_64_gen, i64imm, imm, useAtomRedG64forGen64>;
11071155
defm INT_PTX_ATOM_LOAD_UMIN_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32",
11081156
".min", atomic_load_umin_32_g, i32imm, imm, hasAtomRedG32>;
11091157
defm INT_PTX_ATOM_LOAD_UMIN_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32",
@@ -1112,6 +1160,14 @@ defm INT_PTX_ATOM_LOAD_UMIN_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".min",
11121160
atomic_load_umin_32_gen, i32imm, imm, hasAtomRedGen32>;
11131161
defm INT_PTX_ATOM_LOAD_UMIN_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global",
11141162
".u32", ".min", atomic_load_umin_32_gen, i32imm, imm, useAtomRedG32forGen32>;
1163+
defm INT_PTX_ATOM_LOAD_UMIN_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".u64",
1164+
".min", atomic_load_umin_64_g, i64imm, imm, hasAtomRedG64>;
1165+
defm INT_PTX_ATOM_LOAD_UMIN_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".u64",
1166+
".min", atomic_load_umin_64_s, i64imm, imm, hasAtomRedS64>;
1167+
defm INT_PTX_ATOM_LOAD_UMIN_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".u64", ".min",
1168+
atomic_load_umin_64_gen, i64imm, imm, hasAtomRedGen64>;
1169+
defm INT_PTX_ATOM_LOAD_UMIN_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global",
1170+
".u64", ".min", atomic_load_umin_64_gen, i64imm, imm, useAtomRedG64forGen64>;
11151171

11161172
// atom_inc atom_dec
11171173

@@ -1153,6 +1209,12 @@ def atomic_load_and_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
11531209
(atomic_load_and_32 node:$a, node:$b)>;
11541210
def atomic_load_and_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
11551211
(atomic_load_and_32 node:$a, node:$b)>;
1212+
def atomic_load_and_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
1213+
(atomic_load_and_64 node:$a, node:$b)>;
1214+
def atomic_load_and_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
1215+
(atomic_load_and_64 node:$a, node:$b)>;
1216+
def atomic_load_and_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
1217+
(atomic_load_and_64 node:$a, node:$b)>;
11561218

11571219
defm INT_PTX_ATOM_AND_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".and",
11581220
atomic_load_and_32_g, i32imm, imm, hasAtomRedG32>;
@@ -1162,6 +1224,14 @@ defm INT_PTX_ATOM_AND_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".and",
11621224
atomic_load_and_32_gen, i32imm, imm, hasAtomRedGen32>;
11631225
defm INT_PTX_ATOM_AND_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32",
11641226
".and", atomic_load_and_32_gen, i32imm, imm, useAtomRedG32forGen32>;
1227+
defm INT_PTX_ATOM_AND_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".b64", ".and",
1228+
atomic_load_and_64_g, i64imm, imm, hasAtomRedG64>;
1229+
defm INT_PTX_ATOM_AND_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".b64", ".and",
1230+
atomic_load_and_64_s, i64imm, imm, hasAtomRedS64>;
1231+
defm INT_PTX_ATOM_AND_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".b64", ".and",
1232+
atomic_load_and_64_gen, i64imm, imm, hasAtomRedGen64>;
1233+
defm INT_PTX_ATOM_AND_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".b64",
1234+
".and", atomic_load_and_64_gen, i64imm, imm, useAtomRedG64forGen64>;
11651235

11661236
// atom_or
11671237

@@ -1171,6 +1241,12 @@ def atomic_load_or_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
11711241
(atomic_load_or_32 node:$a, node:$b)>;
11721242
def atomic_load_or_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
11731243
(atomic_load_or_32 node:$a, node:$b)>;
1244+
def atomic_load_or_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
1245+
(atomic_load_or_64 node:$a, node:$b)>;
1246+
def atomic_load_or_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
1247+
(atomic_load_or_64 node:$a, node:$b)>;
1248+
def atomic_load_or_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
1249+
(atomic_load_or_64 node:$a, node:$b)>;
11741250

11751251
defm INT_PTX_ATOM_OR_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".or",
11761252
atomic_load_or_32_g, i32imm, imm, hasAtomRedG32>;
@@ -1180,6 +1256,14 @@ defm INT_PTX_ATOM_OR_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32",
11801256
".or", atomic_load_or_32_gen, i32imm, imm, useAtomRedG32forGen32>;
11811257
defm INT_PTX_ATOM_OR_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".or",
11821258
atomic_load_or_32_s, i32imm, imm, hasAtomRedS32>;
1259+
defm INT_PTX_ATOM_OR_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".b64", ".or",
1260+
atomic_load_or_64_g, i64imm, imm, hasAtomRedG64>;
1261+
defm INT_PTX_ATOM_OR_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".b64", ".or",
1262+
atomic_load_or_64_gen, i64imm, imm, hasAtomRedGen64>;
1263+
defm INT_PTX_ATOM_OR_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".b64",
1264+
".or", atomic_load_or_64_gen, i64imm, imm, useAtomRedG64forGen64>;
1265+
defm INT_PTX_ATOM_OR_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".b64", ".or",
1266+
atomic_load_or_64_s, i64imm, imm, hasAtomRedS64>;
11831267

11841268
// atom_xor
11851269

@@ -1189,6 +1273,12 @@ def atomic_load_xor_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
11891273
(atomic_load_xor_32 node:$a, node:$b)>;
11901274
def atomic_load_xor_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
11911275
(atomic_load_xor_32 node:$a, node:$b)>;
1276+
def atomic_load_xor_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
1277+
(atomic_load_xor_64 node:$a, node:$b)>;
1278+
def atomic_load_xor_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
1279+
(atomic_load_xor_64 node:$a, node:$b)>;
1280+
def atomic_load_xor_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
1281+
(atomic_load_xor_64 node:$a, node:$b)>;
11921282

11931283
defm INT_PTX_ATOM_XOR_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".xor",
11941284
atomic_load_xor_32_g, i32imm, imm, hasAtomRedG32>;
@@ -1198,6 +1288,14 @@ defm INT_PTX_ATOM_XOR_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".xor",
11981288
atomic_load_xor_32_gen, i32imm, imm, hasAtomRedGen32>;
11991289
defm INT_PTX_ATOM_XOR_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32",
12001290
".xor", atomic_load_xor_32_gen, i32imm, imm, useAtomRedG32forGen32>;
1291+
defm INT_PTX_ATOM_XOR_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".b64", ".xor",
1292+
atomic_load_xor_64_g, i64imm, imm, hasAtomRedG64>;
1293+
defm INT_PTX_ATOM_XOR_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".b64", ".xor",
1294+
atomic_load_xor_64_s, i64imm, imm, hasAtomRedS64>;
1295+
defm INT_PTX_ATOM_XOR_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".b64", ".xor",
1296+
atomic_load_xor_64_gen, i64imm, imm, hasAtomRedGen64>;
1297+
defm INT_PTX_ATOM_XOR_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".b64",
1298+
".xor", atomic_load_xor_64_gen, i64imm, imm, useAtomRedG64forGen64>;
12011299

12021300
// atom_cas
12031301

llvm/test/CodeGen/NVPTX/atomics.ll

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
2+
3+
4+
; CHECK: atom0
5+
define i32 @atom0(i32* %addr, i32 %val) {
6+
; CHECK: atom.add.u32
7+
%ret = atomicrmw add i32* %addr, i32 %val seq_cst
8+
ret i32 %ret
9+
}
10+
11+
; CHECK: atom1
12+
define i64 @atom1(i64* %addr, i64 %val) {
13+
; CHECK: atom.add.u64
14+
%ret = atomicrmw add i64* %addr, i64 %val seq_cst
15+
ret i64 %ret
16+
}
17+
18+
; CHECK: atom2
19+
define i32 @atom2(i32* %subr, i32 %val) {
20+
; CHECK: neg.s32
21+
; CHECK: atom.add.u32
22+
%ret = atomicrmw sub i32* %subr, i32 %val seq_cst
23+
ret i32 %ret
24+
}
25+
26+
; CHECK: atom3
27+
define i64 @atom3(i64* %subr, i64 %val) {
28+
; CHECK: neg.s64
29+
; CHECK: atom.add.u64
30+
%ret = atomicrmw sub i64* %subr, i64 %val seq_cst
31+
ret i64 %ret
32+
}
33+
34+
; CHECK: atom4
35+
define i32 @atom4(i32* %subr, i32 %val) {
36+
; CHECK: atom.and.b32
37+
%ret = atomicrmw and i32* %subr, i32 %val seq_cst
38+
ret i32 %ret
39+
}
40+
41+
; CHECK: atom5
42+
define i64 @atom5(i64* %subr, i64 %val) {
43+
; CHECK: atom.and.b64
44+
%ret = atomicrmw and i64* %subr, i64 %val seq_cst
45+
ret i64 %ret
46+
}
47+
48+
;; NAND not yet supported
49+
;define i32 @atom6(i32* %subr, i32 %val) {
50+
; %ret = atomicrmw nand i32* %subr, i32 %val seq_cst
51+
; ret i32 %ret
52+
;}
53+
54+
;define i64 @atom7(i64* %subr, i64 %val) {
55+
; %ret = atomicrmw nand i64* %subr, i64 %val seq_cst
56+
; ret i64 %ret
57+
;}
58+
59+
; CHECK: atom8
60+
define i32 @atom8(i32* %subr, i32 %val) {
61+
; CHECK: atom.or.b32
62+
%ret = atomicrmw or i32* %subr, i32 %val seq_cst
63+
ret i32 %ret
64+
}
65+
66+
; CHECK: atom9
67+
define i64 @atom9(i64* %subr, i64 %val) {
68+
; CHECK: atom.or.b64
69+
%ret = atomicrmw or i64* %subr, i64 %val seq_cst
70+
ret i64 %ret
71+
}
72+
73+
; CHECK: atom10
74+
define i32 @atom10(i32* %subr, i32 %val) {
75+
; CHECK: atom.xor.b32
76+
%ret = atomicrmw xor i32* %subr, i32 %val seq_cst
77+
ret i32 %ret
78+
}
79+
80+
; CHECK: atom11
81+
define i64 @atom11(i64* %subr, i64 %val) {
82+
; CHECK: atom.xor.b64
83+
%ret = atomicrmw xor i64* %subr, i64 %val seq_cst
84+
ret i64 %ret
85+
}
86+
87+
; CHECK: atom12
88+
define i32 @atom12(i32* %subr, i32 %val) {
89+
; CHECK: atom.max.s32
90+
%ret = atomicrmw max i32* %subr, i32 %val seq_cst
91+
ret i32 %ret
92+
}
93+
94+
; CHECK: atom13
95+
define i64 @atom13(i64* %subr, i64 %val) {
96+
; CHECK: atom.max.s64
97+
%ret = atomicrmw max i64* %subr, i64 %val seq_cst
98+
ret i64 %ret
99+
}
100+
101+
; CHECK: atom14
102+
define i32 @atom14(i32* %subr, i32 %val) {
103+
; CHECK: atom.min.s32
104+
%ret = atomicrmw min i32* %subr, i32 %val seq_cst
105+
ret i32 %ret
106+
}
107+
108+
; CHECK: atom15
109+
define i64 @atom15(i64* %subr, i64 %val) {
110+
; CHECK: atom.min.s64
111+
%ret = atomicrmw min i64* %subr, i64 %val seq_cst
112+
ret i64 %ret
113+
}
114+
115+
; CHECK: atom16
116+
define i32 @atom16(i32* %subr, i32 %val) {
117+
; CHECK: atom.max.u32
118+
%ret = atomicrmw umax i32* %subr, i32 %val seq_cst
119+
ret i32 %ret
120+
}
121+
122+
; CHECK: atom17
123+
define i64 @atom17(i64* %subr, i64 %val) {
124+
; CHECK: atom.max.u64
125+
%ret = atomicrmw umax i64* %subr, i64 %val seq_cst
126+
ret i64 %ret
127+
}
128+
129+
; CHECK: atom18
130+
define i32 @atom18(i32* %subr, i32 %val) {
131+
; CHECK: atom.min.u32
132+
%ret = atomicrmw umin i32* %subr, i32 %val seq_cst
133+
ret i32 %ret
134+
}
135+
136+
; CHECK: atom19
137+
define i64 @atom19(i64* %subr, i64 %val) {
138+
; CHECK: atom.min.u64
139+
%ret = atomicrmw umin i64* %subr, i64 %val seq_cst
140+
ret i64 %ret
141+
}

0 commit comments

Comments
 (0)