Skip to content

Commit cdae185

Browse files
committed
Implement SHA-1 x86 vendor intrinsics
1 parent 82d0891 commit cdae185

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

src/intrinsics/llvm_x86.rs

+116
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,122 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
10671067
);
10681068
}
10691069

1070+
"llvm.x86.sha1rnds4" => {
1071+
// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sha1rnds4_epu32&ig_expand=5877
1072+
intrinsic_args!(fx, args => (a, b, _func); intrinsic);
1073+
1074+
let a = a.load_scalar(fx);
1075+
let b = b.load_scalar(fx);
1076+
1077+
let func = if let Some(func) =
1078+
crate::constant::mir_operand_get_const_val(fx, &args[2].node)
1079+
{
1080+
func
1081+
} else {
1082+
fx.tcx
1083+
.dcx()
1084+
.span_fatal(span, "Func argument for `_mm_sha1rnds4_epu32` is not a constant");
1085+
};
1086+
1087+
let func = func.try_to_u8().unwrap_or_else(|_| panic!("kind not scalar: {:?}", func));
1088+
1089+
codegen_inline_asm_inner(
1090+
fx,
1091+
&[InlineAsmTemplatePiece::String(format!("sha1rnds4 xmm1, xmm2, {func}"))],
1092+
&[
1093+
CInlineAsmOperand::InOut {
1094+
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
1095+
_late: true,
1096+
in_value: a,
1097+
out_place: Some(ret),
1098+
},
1099+
CInlineAsmOperand::In {
1100+
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm2)),
1101+
value: b,
1102+
},
1103+
],
1104+
InlineAsmOptions::NOSTACK | InlineAsmOptions::PURE | InlineAsmOptions::NOMEM,
1105+
);
1106+
}
1107+
1108+
"llvm.x86.sha1msg1" => {
1109+
// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sha1msg1_epu32&ig_expand=5874
1110+
intrinsic_args!(fx, args => (a, b); intrinsic);
1111+
1112+
let a = a.load_scalar(fx);
1113+
let b = b.load_scalar(fx);
1114+
1115+
codegen_inline_asm_inner(
1116+
fx,
1117+
&[InlineAsmTemplatePiece::String("sha1msg1 xmm1, xmm2".to_string())],
1118+
&[
1119+
CInlineAsmOperand::InOut {
1120+
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
1121+
_late: true,
1122+
in_value: a,
1123+
out_place: Some(ret),
1124+
},
1125+
CInlineAsmOperand::In {
1126+
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm2)),
1127+
value: b,
1128+
},
1129+
],
1130+
InlineAsmOptions::NOSTACK | InlineAsmOptions::PURE | InlineAsmOptions::NOMEM,
1131+
);
1132+
}
1133+
1134+
"llvm.x86.sha1msg2" => {
1135+
// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sha1msg2_epu32&ig_expand=5875
1136+
intrinsic_args!(fx, args => (a, b); intrinsic);
1137+
1138+
let a = a.load_scalar(fx);
1139+
let b = b.load_scalar(fx);
1140+
1141+
codegen_inline_asm_inner(
1142+
fx,
1143+
&[InlineAsmTemplatePiece::String("sha1msg2 xmm1, xmm2".to_string())],
1144+
&[
1145+
CInlineAsmOperand::InOut {
1146+
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
1147+
_late: true,
1148+
in_value: a,
1149+
out_place: Some(ret),
1150+
},
1151+
CInlineAsmOperand::In {
1152+
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm2)),
1153+
value: b,
1154+
},
1155+
],
1156+
InlineAsmOptions::NOSTACK | InlineAsmOptions::PURE | InlineAsmOptions::NOMEM,
1157+
);
1158+
}
1159+
1160+
"llvm.x86.sha1nexte" => {
1161+
// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sha1nexte_epu32&ig_expand=5876
1162+
intrinsic_args!(fx, args => (a, b); intrinsic);
1163+
1164+
let a = a.load_scalar(fx);
1165+
let b = b.load_scalar(fx);
1166+
1167+
codegen_inline_asm_inner(
1168+
fx,
1169+
&[InlineAsmTemplatePiece::String("sha1nexte xmm1, xmm2".to_string())],
1170+
&[
1171+
CInlineAsmOperand::InOut {
1172+
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
1173+
_late: true,
1174+
in_value: a,
1175+
out_place: Some(ret),
1176+
},
1177+
CInlineAsmOperand::In {
1178+
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm2)),
1179+
value: b,
1180+
},
1181+
],
1182+
InlineAsmOptions::NOSTACK | InlineAsmOptions::PURE | InlineAsmOptions::NOMEM,
1183+
);
1184+
}
1185+
10701186
"llvm.x86.sha256rnds2" => {
10711187
// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sha256rnds2_epu32&ig_expand=5977
10721188
intrinsic_args!(fx, args => (a, b, k); intrinsic);

0 commit comments

Comments
 (0)