Skip to content

Commit c6b1739

Browse files
committed
Add more standard c lib llvm intrinsics.
1 parent 5a282ec commit c6b1739

File tree

5 files changed

+478
-1
lines changed

5 files changed

+478
-1
lines changed

src/librustc/middle/trans/base.rs

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2369,6 +2369,67 @@ fn declare_intrinsics(llmod: ModuleRef) -> HashMap<~str, ValueRef> {
23692369
let frameaddress = decl_cdecl_fn(llmod, ~"llvm.frameaddress",
23702370
T_fn(T_frameaddress_args,
23712371
T_ptr(T_i8())));
2372+
let sqrtf32 = decl_cdecl_fn(llmod, ~"llvm.sqrt.f32",
2373+
T_fn(~[T_f32()], T_f32()));
2374+
let sqrtf64 = decl_cdecl_fn(llmod, ~"llvm.sqrt.f64",
2375+
T_fn(~[T_f64()], T_f64()));
2376+
let powif32 = decl_cdecl_fn(llmod, ~"llvm.powi.f32",
2377+
T_fn(~[T_f32(), T_i32()], T_f32()));
2378+
let powif64 = decl_cdecl_fn(llmod, ~"llvm.powi.f64",
2379+
T_fn(~[T_f64(), T_i32()], T_f64()));
2380+
let sinf32 = decl_cdecl_fn(llmod, ~"llvm.sin.f32",
2381+
T_fn(~[T_f32()], T_f32()));
2382+
let sinf64 = decl_cdecl_fn(llmod, ~"llvm.sin.f64",
2383+
T_fn(~[T_f64()], T_f64()));
2384+
let cosf32 = decl_cdecl_fn(llmod, ~"llvm.cos.f32",
2385+
T_fn(~[T_f32()], T_f32()));
2386+
let cosf64 = decl_cdecl_fn(llmod, ~"llvm.cos.f64",
2387+
T_fn(~[T_f64()], T_f64()));
2388+
let powf32 = decl_cdecl_fn(llmod, ~"llvm.pow.f32",
2389+
T_fn(~[T_f32(), T_f32()], T_f32()));
2390+
let powf64 = decl_cdecl_fn(llmod, ~"llvm.pow.f64",
2391+
T_fn(~[T_f64(), T_f64()], T_f64()));
2392+
let expf32 = decl_cdecl_fn(llmod, ~"llvm.exp.f32",
2393+
T_fn(~[T_f32()], T_f32()));
2394+
let expf64 = decl_cdecl_fn(llmod, ~"llvm.exp.f64",
2395+
T_fn(~[T_f64()], T_f64()));
2396+
let exp2f32 = decl_cdecl_fn(llmod, ~"llvm.exp2.f32",
2397+
T_fn(~[T_f32()], T_f32()));
2398+
let exp2f64 = decl_cdecl_fn(llmod, ~"llvm.exp2.f64",
2399+
T_fn(~[T_f64()], T_f64()));
2400+
let logf32 = decl_cdecl_fn(llmod, ~"llvm.log.f32",
2401+
T_fn(~[T_f32()], T_f32()));
2402+
let logf64 = decl_cdecl_fn(llmod, ~"llvm.log.f64",
2403+
T_fn(~[T_f64()], T_f64()));
2404+
let log10f32 = decl_cdecl_fn(llmod, ~"llvm.log10.f32",
2405+
T_fn(~[T_f32()], T_f32()));
2406+
let log10f64 = decl_cdecl_fn(llmod, ~"llvm.log10.f64",
2407+
T_fn(~[T_f64()], T_f64()));
2408+
let log2f32 = decl_cdecl_fn(llmod, ~"llvm.log2.f32",
2409+
T_fn(~[T_f32()], T_f32()));
2410+
let log2f64 = decl_cdecl_fn(llmod, ~"llvm.log2.f64",
2411+
T_fn(~[T_f64()], T_f64()));
2412+
let fmaf32 = decl_cdecl_fn(llmod, ~"llvm.fma.f32",
2413+
T_fn(~[T_f32(), T_f32(), T_f32()], T_f32()));
2414+
let fmaf64 = decl_cdecl_fn(llmod, ~"llvm.fma.f64",
2415+
T_fn(~[T_f64(), T_f64(), T_f64()], T_f64()));
2416+
let fabsf32 = decl_cdecl_fn(llmod, ~"llvm.fabs.f32",
2417+
T_fn(~[T_f32()], T_f32()));
2418+
let fabsf64 = decl_cdecl_fn(llmod, ~"llvm.fabs.f64",
2419+
T_fn(~[T_f64()], T_f64()));
2420+
let floorf32 = decl_cdecl_fn(llmod, ~"llvm.floor.f32",
2421+
T_fn(~[T_f32()], T_f32()));
2422+
let floorf64 = decl_cdecl_fn(llmod, ~"llvm.floor.f64",
2423+
T_fn(~[T_f64()], T_f64()));
2424+
let ceilf32 = decl_cdecl_fn(llmod, ~"llvm.ceil.f32",
2425+
T_fn(~[T_f32()], T_f32()));
2426+
let ceilf64 = decl_cdecl_fn(llmod, ~"llvm.ceil.f64",
2427+
T_fn(~[T_f64()], T_f64()));
2428+
let truncf32 = decl_cdecl_fn(llmod, ~"llvm.trunc.f32",
2429+
T_fn(~[T_f32()], T_f32()));
2430+
let truncf64 = decl_cdecl_fn(llmod, ~"llvm.trunc.f64",
2431+
T_fn(~[T_f64()], T_f64()));
2432+
23722433
let intrinsics = HashMap();
23732434
intrinsics.insert(~"llvm.gcroot", gcroot);
23742435
intrinsics.insert(~"llvm.gcread", gcread);
@@ -2378,6 +2439,37 @@ fn declare_intrinsics(llmod: ModuleRef) -> HashMap<~str, ValueRef> {
23782439
intrinsics.insert(~"llvm.memset.p0i8.i64", memset64);
23792440
intrinsics.insert(~"llvm.trap", trap);
23802441
intrinsics.insert(~"llvm.frameaddress", frameaddress);
2442+
intrinsics.insert(~"llvm.sqrt.f32", sqrtf32);
2443+
intrinsics.insert(~"llvm.sqrt.f64", sqrtf64);
2444+
intrinsics.insert(~"llvm.powi.f32", powif32);
2445+
intrinsics.insert(~"llvm.powi.f64", powif64);
2446+
intrinsics.insert(~"llvm.sin.f32", sinf32);
2447+
intrinsics.insert(~"llvm.sin.f64", sinf64);
2448+
intrinsics.insert(~"llvm.cos.f32", cosf32);
2449+
intrinsics.insert(~"llvm.cos.f64", cosf64);
2450+
intrinsics.insert(~"llvm.pow.f32", powf32);
2451+
intrinsics.insert(~"llvm.pow.f64", powf64);
2452+
intrinsics.insert(~"llvm.exp.f32", expf32);
2453+
intrinsics.insert(~"llvm.exp.f64", expf64);
2454+
intrinsics.insert(~"llvm.exp2.f32", exp2f32);
2455+
intrinsics.insert(~"llvm.exp2.f64", exp2f64);
2456+
intrinsics.insert(~"llvm.log.f32", logf32);
2457+
intrinsics.insert(~"llvm.log.f64", logf64);
2458+
intrinsics.insert(~"llvm.log10.f32", log10f32);
2459+
intrinsics.insert(~"llvm.log10.f64", log10f64);
2460+
intrinsics.insert(~"llvm.log2.f32", log2f32);
2461+
intrinsics.insert(~"llvm.log2.f64", log2f64);
2462+
intrinsics.insert(~"llvm.fma.f32", fmaf32);
2463+
intrinsics.insert(~"llvm.fma.f64", fmaf64);
2464+
intrinsics.insert(~"llvm.fabs.f32", fabsf32);
2465+
intrinsics.insert(~"llvm.fabs.f64", fabsf64);
2466+
intrinsics.insert(~"llvm.floor.f32", floorf32);
2467+
intrinsics.insert(~"llvm.floor.f64", floorf64);
2468+
intrinsics.insert(~"llvm.ceil.f32", ceilf32);
2469+
intrinsics.insert(~"llvm.ceil.f64", ceilf64);
2470+
intrinsics.insert(~"llvm.trunc.f32", truncf32);
2471+
intrinsics.insert(~"llvm.trunc.f64", truncf64);
2472+
23812473
return intrinsics;
23822474
}
23832475

src/librustc/middle/trans/foreign.rs

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

src/librustc/middle/trans/type_use.rs

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

111+
~"sqrtf32" | ~"sqrtf64" | ~"powif32" | ~"powif64" |
112+
~"sinf32" | ~"sinf64" | ~"cosf32" | ~"cosf64" |
113+
~"powf32" | ~"powf64" | ~"expf32" | ~"expf64" |
114+
~"exp2f32" | ~"exp2f64" | ~"logf32" | ~"logf64" |
115+
~"log10f32"| ~"log10f64"| ~"log2f32" | ~"log2f64" |
116+
~"fmaf32" | ~"fmaf64" | ~"fabsf32" | ~"fabsf64" |
117+
~"floorf32"| ~"floorf64"| ~"ceilf32" | ~"ceilf64" |
118+
~"truncf32"| ~"truncf64" => 0,
119+
111120
// would be cool to make these an enum instead of strings!
112121
_ => fail ~"unknown intrinsic in type_use"
113122
};

0 commit comments

Comments
 (0)