Do not use linkonce_odr linkage in .ll files. This prevented them
[lldb.git] / libclc / generic / lib / integer / sub_sat_impl.ll
1 declare {i8, i1} @llvm.ssub.with.overflow.i8(i8, i8)
2 declare {i8, i1} @llvm.usub.with.overflow.i8(i8, i8)
3
4 define i8 @__clc_sub_sat_impl_s8(i8 %x, i8 %y) nounwind readnone alwaysinline {
5   %call = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 %x, i8 %y)
6   %res = extractvalue {i8, i1} %call, 0
7   %over = extractvalue {i8, i1} %call, 1
8   %x.msb = ashr i8 %x, 7
9   %x.limit = xor i8 %x.msb, 127
10   %sat = select i1 %over, i8 %x.limit, i8 %res
11   ret i8 %sat
12 }
13
14 define i8 @__clc_sub_sat_impl_u8(i8 %x, i8 %y) nounwind readnone alwaysinline {
15   %call = call {i8, i1} @llvm.usub.with.overflow.i8(i8 %x, i8 %y)
16   %res = extractvalue {i8, i1} %call, 0
17   %over = extractvalue {i8, i1} %call, 1
18   %sat = select i1 %over, i8 0, i8 %res
19   ret i8 %sat
20 }
21
22 declare {i16, i1} @llvm.ssub.with.overflow.i16(i16, i16)
23 declare {i16, i1} @llvm.usub.with.overflow.i16(i16, i16)
24
25 define i16 @__clc_sub_sat_impl_s16(i16 %x, i16 %y) nounwind readnone alwaysinline {
26   %call = call {i16, i1} @llvm.ssub.with.overflow.i16(i16 %x, i16 %y)
27   %res = extractvalue {i16, i1} %call, 0
28   %over = extractvalue {i16, i1} %call, 1
29   %x.msb = ashr i16 %x, 15
30   %x.limit = xor i16 %x.msb, 32767
31   %sat = select i1 %over, i16 %x.limit, i16 %res
32   ret i16 %sat
33 }
34
35 define i16 @__clc_sub_sat_impl_u16(i16 %x, i16 %y) nounwind readnone alwaysinline {
36   %call = call {i16, i1} @llvm.usub.with.overflow.i16(i16 %x, i16 %y)
37   %res = extractvalue {i16, i1} %call, 0
38   %over = extractvalue {i16, i1} %call, 1
39   %sat = select i1 %over, i16 0, i16 %res
40   ret i16 %sat
41 }
42
43 declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32)
44 declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32)
45
46 define i32 @__clc_sub_sat_impl_s32(i32 %x, i32 %y) nounwind readnone alwaysinline {
47   %call = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %x, i32 %y)
48   %res = extractvalue {i32, i1} %call, 0
49   %over = extractvalue {i32, i1} %call, 1
50   %x.msb = ashr i32 %x, 31
51   %x.limit = xor i32 %x.msb, 2147483647
52   %sat = select i1 %over, i32 %x.limit, i32 %res
53   ret i32 %sat
54 }
55
56 define i32 @__clc_sub_sat_impl_u32(i32 %x, i32 %y) nounwind readnone alwaysinline {
57   %call = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %x, i32 %y)
58   %res = extractvalue {i32, i1} %call, 0
59   %over = extractvalue {i32, i1} %call, 1
60   %sat = select i1 %over, i32 0, i32 %res
61   ret i32 %sat
62 }
63
64 declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64)
65 declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64)
66
67 define i64 @__clc_sub_sat_impl_s64(i64 %x, i64 %y) nounwind readnone alwaysinline {
68   %call = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %x, i64 %y)
69   %res = extractvalue {i64, i1} %call, 0
70   %over = extractvalue {i64, i1} %call, 1
71   %x.msb = ashr i64 %x, 63
72   %x.limit = xor i64 %x.msb, 9223372036854775807
73   %sat = select i1 %over, i64 %x.limit, i64 %res
74   ret i64 %sat
75 }
76
77 define i64 @__clc_sub_sat_impl_u64(i64 %x, i64 %y) nounwind readnone alwaysinline {
78   %call = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %x, i64 %y)
79   %res = extractvalue {i64, i1} %call, 0
80   %over = extractvalue {i64, i1} %call, 1
81   %sat = select i1 %over, i64 0, i64 %res
82   ret i64 %sat
83 }