Skip to content

Commit af7f2a4

Browse files
committed
---
yaml --- r: 37823 b: refs/heads/try c: 01cd53b h: refs/heads/master i: 37821: 7ebccbb 37819: 5d52fef 37815: 11c6f05 37807: 01d9a22 37791: b4083c2 37759: 23dcae7 v: v3
1 parent ea5d1b1 commit af7f2a4

File tree

6 files changed

+477
-2
lines changed

6 files changed

+477
-2
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 09bb07bed9166105ea961a42b5fff7739ae0d2e9
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: eb8fd119c65c67f3b1b8268cc7341c22d39b7b61
5-
refs/heads/try: c0d3b291d55122d319ddc28010675afdaab73dfc
5+
refs/heads/try: 01cd53baf0ea241b17132e857ba356b9b9a14908
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: a810c03263670238bccd64cabb12a23a46e3a278

branches/try/src/librustc/middle/trans/base.rs

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,6 +2380,67 @@ fn declare_intrinsics(llmod: ModuleRef) -> HashMap<~str, ValueRef> {
23802380
let frameaddress = decl_cdecl_fn(llmod, ~"llvm.frameaddress",
23812381
T_fn(T_frameaddress_args,
23822382
T_ptr(T_i8())));
2383+
let sqrtf32 = decl_cdecl_fn(llmod, ~"llvm.sqrt.f32",
2384+
T_fn(~[T_f32()], T_f32()));
2385+
let sqrtf64 = decl_cdecl_fn(llmod, ~"llvm.sqrt.f64",
2386+
T_fn(~[T_f64()], T_f64()));
2387+
let powif32 = decl_cdecl_fn(llmod, ~"llvm.powi.f32",
2388+
T_fn(~[T_f32(), T_i32()], T_f32()));
2389+
let powif64 = decl_cdecl_fn(llmod, ~"llvm.powi.f64",
2390+
T_fn(~[T_f64(), T_i32()], T_f64()));
2391+
let sinf32 = decl_cdecl_fn(llmod, ~"llvm.sin.f32",
2392+
T_fn(~[T_f32()], T_f32()));
2393+
let sinf64 = decl_cdecl_fn(llmod, ~"llvm.sin.f64",
2394+
T_fn(~[T_f64()], T_f64()));
2395+
let cosf32 = decl_cdecl_fn(llmod, ~"llvm.cos.f32",
2396+
T_fn(~[T_f32()], T_f32()));
2397+
let cosf64 = decl_cdecl_fn(llmod, ~"llvm.cos.f64",
2398+
T_fn(~[T_f64()], T_f64()));
2399+
let powf32 = decl_cdecl_fn(llmod, ~"llvm.pow.f32",
2400+
T_fn(~[T_f32(), T_f32()], T_f32()));
2401+
let powf64 = decl_cdecl_fn(llmod, ~"llvm.pow.f64",
2402+
T_fn(~[T_f64(), T_f64()], T_f64()));
2403+
let expf32 = decl_cdecl_fn(llmod, ~"llvm.exp.f32",
2404+
T_fn(~[T_f32()], T_f32()));
2405+
let expf64 = decl_cdecl_fn(llmod, ~"llvm.exp.f64",
2406+
T_fn(~[T_f64()], T_f64()));
2407+
let exp2f32 = decl_cdecl_fn(llmod, ~"llvm.exp2.f32",
2408+
T_fn(~[T_f32()], T_f32()));
2409+
let exp2f64 = decl_cdecl_fn(llmod, ~"llvm.exp2.f64",
2410+
T_fn(~[T_f64()], T_f64()));
2411+
let logf32 = decl_cdecl_fn(llmod, ~"llvm.log.f32",
2412+
T_fn(~[T_f32()], T_f32()));
2413+
let logf64 = decl_cdecl_fn(llmod, ~"llvm.log.f64",
2414+
T_fn(~[T_f64()], T_f64()));
2415+
let log10f32 = decl_cdecl_fn(llmod, ~"llvm.log10.f32",
2416+
T_fn(~[T_f32()], T_f32()));
2417+
let log10f64 = decl_cdecl_fn(llmod, ~"llvm.log10.f64",
2418+
T_fn(~[T_f64()], T_f64()));
2419+
let log2f32 = decl_cdecl_fn(llmod, ~"llvm.log2.f32",
2420+
T_fn(~[T_f32()], T_f32()));
2421+
let log2f64 = decl_cdecl_fn(llmod, ~"llvm.log2.f64",
2422+
T_fn(~[T_f64()], T_f64()));
2423+
let fmaf32 = decl_cdecl_fn(llmod, ~"llvm.fma.f32",
2424+
T_fn(~[T_f32(), T_f32(), T_f32()], T_f32()));
2425+
let fmaf64 = decl_cdecl_fn(llmod, ~"llvm.fma.f64",
2426+
T_fn(~[T_f64(), T_f64(), T_f64()], T_f64()));
2427+
let fabsf32 = decl_cdecl_fn(llmod, ~"llvm.fabs.f32",
2428+
T_fn(~[T_f32()], T_f32()));
2429+
let fabsf64 = decl_cdecl_fn(llmod, ~"llvm.fabs.f64",
2430+
T_fn(~[T_f64()], T_f64()));
2431+
let floorf32 = decl_cdecl_fn(llmod, ~"llvm.floor.f32",
2432+
T_fn(~[T_f32()], T_f32()));
2433+
let floorf64 = decl_cdecl_fn(llmod, ~"llvm.floor.f64",
2434+
T_fn(~[T_f64()], T_f64()));
2435+
let ceilf32 = decl_cdecl_fn(llmod, ~"llvm.ceil.f32",
2436+
T_fn(~[T_f32()], T_f32()));
2437+
let ceilf64 = decl_cdecl_fn(llmod, ~"llvm.ceil.f64",
2438+
T_fn(~[T_f64()], T_f64()));
2439+
let truncf32 = decl_cdecl_fn(llmod, ~"llvm.trunc.f32",
2440+
T_fn(~[T_f32()], T_f32()));
2441+
let truncf64 = decl_cdecl_fn(llmod, ~"llvm.trunc.f64",
2442+
T_fn(~[T_f64()], T_f64()));
2443+
23832444
let intrinsics = HashMap();
23842445
intrinsics.insert(~"llvm.gcroot", gcroot);
23852446
intrinsics.insert(~"llvm.gcread", gcread);
@@ -2389,6 +2450,37 @@ fn declare_intrinsics(llmod: ModuleRef) -> HashMap<~str, ValueRef> {
23892450
intrinsics.insert(~"llvm.memset.p0i8.i64", memset64);
23902451
intrinsics.insert(~"llvm.trap", trap);
23912452
intrinsics.insert(~"llvm.frameaddress", frameaddress);
2453+
intrinsics.insert(~"llvm.sqrt.f32", sqrtf32);
2454+
intrinsics.insert(~"llvm.sqrt.f64", sqrtf64);
2455+
intrinsics.insert(~"llvm.powi.f32", powif32);
2456+
intrinsics.insert(~"llvm.powi.f64", powif64);
2457+
intrinsics.insert(~"llvm.sin.f32", sinf32);
2458+
intrinsics.insert(~"llvm.sin.f64", sinf64);
2459+
intrinsics.insert(~"llvm.cos.f32", cosf32);
2460+
intrinsics.insert(~"llvm.cos.f64", cosf64);
2461+
intrinsics.insert(~"llvm.pow.f32", powf32);
2462+
intrinsics.insert(~"llvm.pow.f64", powf64);
2463+
intrinsics.insert(~"llvm.exp.f32", expf32);
2464+
intrinsics.insert(~"llvm.exp.f64", expf64);
2465+
intrinsics.insert(~"llvm.exp2.f32", exp2f32);
2466+
intrinsics.insert(~"llvm.exp2.f64", exp2f64);
2467+
intrinsics.insert(~"llvm.log.f32", logf32);
2468+
intrinsics.insert(~"llvm.log.f64", logf64);
2469+
intrinsics.insert(~"llvm.log10.f32", log10f32);
2470+
intrinsics.insert(~"llvm.log10.f64", log10f64);
2471+
intrinsics.insert(~"llvm.log2.f32", log2f32);
2472+
intrinsics.insert(~"llvm.log2.f64", log2f64);
2473+
intrinsics.insert(~"llvm.fma.f32", fmaf32);
2474+
intrinsics.insert(~"llvm.fma.f64", fmaf64);
2475+
intrinsics.insert(~"llvm.fabs.f32", fabsf32);
2476+
intrinsics.insert(~"llvm.fabs.f64", fabsf64);
2477+
intrinsics.insert(~"llvm.floor.f32", floorf32);
2478+
intrinsics.insert(~"llvm.floor.f64", floorf64);
2479+
intrinsics.insert(~"llvm.ceil.f32", ceilf32);
2480+
intrinsics.insert(~"llvm.ceil.f64", ceilf64);
2481+
intrinsics.insert(~"llvm.trunc.f32", truncf32);
2482+
intrinsics.insert(~"llvm.trunc.f64", truncf64);
2483+
23922484
return intrinsics;
23932485
}
23942486

branches/try/src/librustc/middle/trans/foreign.rs

Lines changed: 159 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,7 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::foreign_item,
982982
let llcast = PointerCast(bcx, llcast, T_ptr(T_i8()));
983983
call_memcpy(bcx, llretptr, llcast, llsize_of(ccx, lltp_ty));
984984
}
985-
}
985+
}
986986
~"addr_of" => {
987987
Store(bcx, get_param(decl, first_real_arg), fcx.llretptr);
988988
}
@@ -1033,6 +1033,164 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::foreign_item,
10331033
T_ptr(T_nil()));
10341034
Store(bcx, morestack_addr, fcx.llretptr);
10351035
}
1036+
~"sqrtf32" => {
1037+
let x = get_param(decl, first_real_arg);
1038+
let sqrtf = ccx.intrinsics.get(~"llvm.sqrt.f32");
1039+
Store(bcx, Call(bcx, sqrtf, ~[x]), fcx.llretptr);
1040+
}
1041+
~"sqrtf64" => {
1042+
let x = get_param(decl, first_real_arg);
1043+
let sqrtf = ccx.intrinsics.get(~"llvm.sqrt.f64");
1044+
Store(bcx, Call(bcx, sqrtf, ~[x]), fcx.llretptr);
1045+
}
1046+
~"powif32" => {
1047+
let a = get_param(decl, first_real_arg);
1048+
let x = get_param(decl, first_real_arg + 1u);
1049+
let powif = ccx.intrinsics.get(~"llvm.powi.f32");
1050+
Store(bcx, Call(bcx, powif, ~[a, x]), fcx.llretptr);
1051+
}
1052+
~"powif64" => {
1053+
let a = get_param(decl, first_real_arg);
1054+
let x = get_param(decl, first_real_arg + 1u);
1055+
let powif = ccx.intrinsics.get(~"llvm.powi.f64");
1056+
Store(bcx, Call(bcx, powif, ~[a, x]), fcx.llretptr);
1057+
}
1058+
~"sinf32" => {
1059+
let x = get_param(decl, first_real_arg);
1060+
let sinf = ccx.intrinsics.get(~"llvm.sin.f32");
1061+
Store(bcx, Call(bcx, sinf, ~[x]), fcx.llretptr);
1062+
}
1063+
~"sinf64" => {
1064+
let x = get_param(decl, first_real_arg);
1065+
let sinf = ccx.intrinsics.get(~"llvm.sin.f64");
1066+
Store(bcx, Call(bcx, sinf, ~[x]), fcx.llretptr);
1067+
}
1068+
~"cosf32" => {
1069+
let x = get_param(decl, first_real_arg);
1070+
let cosf = ccx.intrinsics.get(~"llvm.cos.f32");
1071+
Store(bcx, Call(bcx, cosf, ~[x]), fcx.llretptr);
1072+
}
1073+
~"cosf64" => {
1074+
let x = get_param(decl, first_real_arg);
1075+
let cosf = ccx.intrinsics.get(~"llvm.cos.f64");
1076+
Store(bcx, Call(bcx, cosf, ~[x]), fcx.llretptr);
1077+
}
1078+
~"powf32" => {
1079+
let a = get_param(decl, first_real_arg);
1080+
let x = get_param(decl, first_real_arg + 1u);
1081+
let powf = ccx.intrinsics.get(~"llvm.pow.f32");
1082+
Store(bcx, Call(bcx, powf, ~[a, x]), fcx.llretptr);
1083+
}
1084+
~"powf64" => {
1085+
let a = get_param(decl, first_real_arg);
1086+
let x = get_param(decl, first_real_arg + 1u);
1087+
let powf = ccx.intrinsics.get(~"llvm.pow.f64");
1088+
Store(bcx, Call(bcx, powf, ~[a, x]), fcx.llretptr);
1089+
}
1090+
~"expf32" => {
1091+
let x = get_param(decl, first_real_arg);
1092+
let expf = ccx.intrinsics.get(~"llvm.exp.f32");
1093+
Store(bcx, Call(bcx, expf, ~[x]), fcx.llretptr);
1094+
}
1095+
~"expf64" => {
1096+
let x = get_param(decl, first_real_arg);
1097+
let expf = ccx.intrinsics.get(~"llvm.exp.f64");
1098+
Store(bcx, Call(bcx, expf, ~[x]), fcx.llretptr);
1099+
}
1100+
~"exp2f32" => {
1101+
let x = get_param(decl, first_real_arg);
1102+
let exp2f = ccx.intrinsics.get(~"llvm.exp2.f32");
1103+
Store(bcx, Call(bcx, exp2f, ~[x]), fcx.llretptr);
1104+
}
1105+
~"exp2f64" => {
1106+
let x = get_param(decl, first_real_arg);
1107+
let exp2f = ccx.intrinsics.get(~"llvm.exp2.f64");
1108+
Store(bcx, Call(bcx, exp2f, ~[x]), fcx.llretptr);
1109+
}
1110+
~"logf32" => {
1111+
let x = get_param(decl, first_real_arg);
1112+
let logf = ccx.intrinsics.get(~"llvm.log.f32");
1113+
Store(bcx, Call(bcx, logf, ~[x]), fcx.llretptr);
1114+
}
1115+
~"logf64" => {
1116+
let x = get_param(decl, first_real_arg);
1117+
let logf = ccx.intrinsics.get(~"llvm.log.f64");
1118+
Store(bcx, Call(bcx, logf, ~[x]), fcx.llretptr);
1119+
}
1120+
~"log10f32" => {
1121+
let x = get_param(decl, first_real_arg);
1122+
let log10f = ccx.intrinsics.get(~"llvm.log10.f32");
1123+
Store(bcx, Call(bcx, log10f, ~[x]), fcx.llretptr);
1124+
}
1125+
~"log10f64" => {
1126+
let x = get_param(decl, first_real_arg);
1127+
let log10f = ccx.intrinsics.get(~"llvm.log10.f64");
1128+
Store(bcx, Call(bcx, log10f, ~[x]), fcx.llretptr);
1129+
}
1130+
~"log2f32" => {
1131+
let x = get_param(decl, first_real_arg);
1132+
let log2f = ccx.intrinsics.get(~"llvm.log2.f32");
1133+
Store(bcx, Call(bcx, log2f, ~[x]), fcx.llretptr);
1134+
}
1135+
~"log2f64" => {
1136+
let x = get_param(decl, first_real_arg);
1137+
let log2f = ccx.intrinsics.get(~"llvm.log2.f64");
1138+
Store(bcx, Call(bcx, log2f, ~[x]), fcx.llretptr);
1139+
}
1140+
~"fmaf32" => {
1141+
let a = get_param(decl, first_real_arg);
1142+
let b = get_param(decl, first_real_arg + 1u);
1143+
let c = get_param(decl, first_real_arg + 2u);
1144+
let fmaf = ccx.intrinsics.get(~"llvm.fma.f32");
1145+
Store(bcx, Call(bcx, fmaf, ~[a, b, c]), fcx.llretptr);
1146+
}
1147+
~"fmaf64" => {
1148+
let a = get_param(decl, first_real_arg);
1149+
let b = get_param(decl, first_real_arg + 1u);
1150+
let c = get_param(decl, first_real_arg + 2u);
1151+
let fmaf = ccx.intrinsics.get(~"llvm.fma.f64");
1152+
Store(bcx, Call(bcx, fmaf, ~[a, b, c]), fcx.llretptr);
1153+
}
1154+
~"fabsf32" => {
1155+
let x = get_param(decl, first_real_arg);
1156+
let fabsf = ccx.intrinsics.get(~"llvm.fabs.f32");
1157+
Store(bcx, Call(bcx, fabsf, ~[x]), fcx.llretptr);
1158+
}
1159+
~"fabsf64" => {
1160+
let x = get_param(decl, first_real_arg);
1161+
let fabsf = ccx.intrinsics.get(~"llvm.fabs.f64");
1162+
Store(bcx, Call(bcx, fabsf, ~[x]), fcx.llretptr);
1163+
}
1164+
~"floorf32" => {
1165+
let x = get_param(decl, first_real_arg);
1166+
let floorf = ccx.intrinsics.get(~"llvm.floor.f32");
1167+
Store(bcx, Call(bcx, floorf, ~[x]), fcx.llretptr);
1168+
}
1169+
~"floorf64" => {
1170+
let x = get_param(decl, first_real_arg);
1171+
let floorf = ccx.intrinsics.get(~"llvm.floor.f64");
1172+
Store(bcx, Call(bcx, floorf, ~[x]), fcx.llretptr);
1173+
}
1174+
~"ceilf32" => {
1175+
let x = get_param(decl, first_real_arg);
1176+
let ceilf = ccx.intrinsics.get(~"llvm.ceil.f32");
1177+
Store(bcx, Call(bcx, ceilf, ~[x]), fcx.llretptr);
1178+
}
1179+
~"ceilf64" => {
1180+
let x = get_param(decl, first_real_arg);
1181+
let ceilf = ccx.intrinsics.get(~"llvm.ceil.f64");
1182+
Store(bcx, Call(bcx, ceilf, ~[x]), fcx.llretptr);
1183+
}
1184+
~"truncf32" => {
1185+
let x = get_param(decl, first_real_arg);
1186+
let truncf = ccx.intrinsics.get(~"llvm.trunc.f32");
1187+
Store(bcx, Call(bcx, truncf, ~[x]), fcx.llretptr);
1188+
}
1189+
~"truncf64" => {
1190+
let x = get_param(decl, first_real_arg);
1191+
let truncf = ccx.intrinsics.get(~"llvm.trunc.f64");
1192+
Store(bcx, Call(bcx, truncf, ~[x]), fcx.llretptr);
1193+
}
10361194
_ => {
10371195
// Could we make this an enum rather than a string? does it get
10381196
// checked earlier?

branches/try/src/librustc/middle/trans/type_use.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,15 @@ fn type_uses_for(ccx: @crate_ctxt, fn_id: def_id, n_tps: uint)
118118
~"visit_tydesc" | ~"forget" | ~"addr_of" |
119119
~"frame_address" | ~"morestack_addr" => 0,
120120

121+
~"sqrtf32" | ~"sqrtf64" | ~"powif32" | ~"powif64" |
122+
~"sinf32" | ~"sinf64" | ~"cosf32" | ~"cosf64" |
123+
~"powf32" | ~"powf64" | ~"expf32" | ~"expf64" |
124+
~"exp2f32" | ~"exp2f64" | ~"logf32" | ~"logf64" |
125+
~"log10f32"| ~"log10f64"| ~"log2f32" | ~"log2f64" |
126+
~"fmaf32" | ~"fmaf64" | ~"fabsf32" | ~"fabsf64" |
127+
~"floorf32"| ~"floorf64"| ~"ceilf32" | ~"ceilf64" |
128+
~"truncf32"| ~"truncf64" => 0,
129+
121130
// would be cool to make these an enum instead of strings!
122131
_ => fail ~"unknown intrinsic in type_use"
123132
};

0 commit comments

Comments
 (0)